Xiao_123 преди 10 месеца
родител
ревизия
141c089894

+ 5 - 0
src/permission.js

@@ -2,6 +2,7 @@ import router from './router'
 import { useNProgress } from '@/hooks/web/useNProgress'
 import { useTitle } from '@/hooks/web/useTitle'
 import { getToken, getEnterpriseToken, removeToken } from '@/utils/auth'
+import { useDictStore } from '@/store/dict'
 
 const { start, done } = useNProgress()
 // 路由不重定向白名单
@@ -32,6 +33,10 @@ router.beforeEach(async (to, from, next) => {
       if (getEnterpriseToken()) next({ path: '/enterprise' }) // 已登录企业
       else next({ path: '/recruitHome' }) // 已登录个人账号
     } else {
+      // 获取字典信息
+      const dictStore = useDictStore()
+      dictStore.getDictTypeData()
+      
       const type = localStorage.getItem('loginType')
       // 判断企业路由和个人路由,防止互串
       if (!type) { removeToken(); next(`/login?redirect=${to.fullPath}`) }

+ 8 - 8
src/router/modules/components/recruit/enterprise.js

@@ -235,14 +235,14 @@ const enterprise = [
         },
         component: () => import('@/views/recruit/enterprise/systemManagement/groupAccount/index.vue')
       },
-      {
-        path: '/recruit/enterprise/systemManagement/userManagement',
-        meta: {
-          title: '用户管理',
-          enName: 'User Management '
-        },
-        component: () => import('@/views/recruit/enterprise/systemManagement/userManagement/index.vue')
-      },
+      // {
+      //   path: '/recruit/enterprise/systemManagement/userManagement',
+      //   meta: {
+      //     title: '用户管理',
+      //     enName: 'User Management '
+      //   },
+      //   component: () => import('@/views/recruit/enterprise/systemManagement/userManagement/index.vue')
+      // },
       {
         path: '/recruit/enterprise/systemManagement/postManagement',
         meta: {

+ 46 - 0
src/store/dict.js

@@ -0,0 +1,46 @@
+import { defineStore } from 'pinia'
+import { getDict } from '@/hooks/web/useDictionaries'
+
+const list = [
+  { type: 'industryTreeData', apiFn: 'industryTreeData' },
+  { type: 'areaTreeData', apiFn: 'areaTreeData' },
+  { type: 'positionTreeData', apiFn: 'positionTreeData' },
+  { type: 'positionData', params: {}, apiFn: 'positionData' },
+  { type: 'menduenr_industry_type', params: {}, apiFn: 'industryList' },
+  { type: 'menduenr_area_type', params: {}, apiFn: 'areaList' },
+  { type: 'menduenr_education_type' },
+  { type: 'menduenr_exp_type' },
+  { type: 'system_user_sex' },
+  { type: 'menduenr_job_type' },
+  { type: 'menduner_job_status' },
+  { type: 'menduner_marital_status' },
+  { type: 'menduner_pay_unit' },
+  { type: 'menduner_financing_status' },
+  { type: 'menduner_scale' },
+  { type: 'menduner_hire_job_cv_status' },
+  { type: 'menduner_education_system_type' },
+  { type: 'menduner_skill_level' },
+  { type: 'menduner_enterprise_type' },
+  { type: 'menduner_pay_scope' }
+]
+
+export const useDictStore = defineStore('dict',
+  {
+    state: () => ({
+      isSetDict: false
+    }),
+    actions: {
+      getDictTypeData () {
+        if (this.isSetDict) return
+        this.isSetDict = true
+        list.forEach(e => {
+          getDict(e.type, e.params || null, e.apiFn)
+        })
+      }
+    }
+   },
+  {
+    persist: true
+  }
+)
+

+ 2 - 1
src/views/recruit/enterprise/personnelManagement/index.vue

@@ -37,7 +37,8 @@ const total = ref(0)
 const query = ref({
   pageNo: 1,
   pageSize: 10,
-  status: 0
+  status: 0,
+  type: 0
 })
 const tab = ref('0')
 const tabList = ref([])

+ 93 - 8
src/views/recruit/enterprise/systemManagement/groupAccount/index.vue

@@ -1,16 +1,14 @@
 <template>
   <v-card class="card-box d-flex pa-3" height="80vh">
     <v-row no-gutters justify="space-between">
-      <v-col cols="3">
+      <v-col cols="2">
         <v-treeview
           :items="treeData"
           activatable
           color="primary"
           item-value="id"
-          mandatory
           item-title="anotherName"
           open-all
-          :opened="treeData"
           open-strategy="single"
           @update:activated="handleClick"
           @update:opened="handleClick"
@@ -27,6 +25,11 @@
           :items="tableData"
           :headers="headers"
         >
+          <template v-slot:item.actions="{ item }">
+            <v-btn color="primary" variant="text" @click="handleBinding(item)">{{ $t('enterprise.userManagement.jobBinding') }}</v-btn>
+            <v-btn v-if="item.status === '1' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 0, item)">{{ $t('enterprise.userManagement.enable') }}</v-btn>
+            <v-btn v-if="item.status === '0' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 1, item)">{{ $t('enterprise.userManagement.disable') }}</v-btn>
+          </template>
           <template #bottom>
             <CtPagination
               v-if="total > 0"
@@ -40,14 +43,22 @@
       </v-col>
     </v-row>
   </v-card>
+
+  <CtDialog :visible="show" :widthType="2" titleClass="text-h6" :title="$t('enterprise.userManagement.selectBinding')" @close="handleClose" @submit="handleSubmit">
+    <CtForm ref="formPageRef" :items="formItems"></CtForm>
+  </CtDialog>
 </template>
 
 <script setup>
 defineOptions({ name: 'group-account'})
 import { ref } from 'vue'
 import { useI18n } from '@/hooks/web/useI18n'
-import { getEnterpriseUserList } from '@/api/recruit/enterprise/system/user'
+import { timesTampChange } from '@/utils/date'
+import { getEnterprisePostPage } from '@/api/recruit/enterprise/system/post'
 import { getEnterpriseTree } from '@/api/recruit/enterprise/system/group'
+import { getEnterpriseUserList, systemUserEnable, systemUserDisable, systemUserBindingPost } from '@/api/recruit/enterprise/system/user'
+import Confirm from '@/plugins/confirm'
+import Snackbar from '@/plugins/snackbar'
 
 const { t } = useI18n()
 const total = ref(0)
@@ -61,10 +72,14 @@ const query = ref({
 const tableData = ref([])
 const treeData = ref([])
 const headers = [
-  { title: t('login.username'), key: 'name', sortable: false },
-  { title: t('enterprise.userManagement.affiliatedEnterprise'), key: 'enterpriseAnotherName', sortable: false },
-  { title: t('enterprise.userManagement.post'), key: 'post.nameCn', sortable: false },
-  { title: t('enterprise.userManagement.phone'), key: 'phone', sortable: false }
+  { title: t('login.username'), key: 'name' },
+  { title: t('enterprise.userManagement.affiliatedEnterprise'), key: 'enterpriseAnotherName' },
+  { title: t('enterprise.userManagement.post'), key: 'post.nameCn' },
+  { title: t('enterprise.userManagement.phone'), key: 'phone' },
+  { title: t('enterprise.userManagement.email'), key: 'email' },
+  { title: t('enterprise.userManagement.accountType'), key: 'userType', value: item => item.userType === '1' ? t('enterprise.userManagement.administrators') : t('enterprise.userManagement.regularUser'), sortable: false },
+  { title: t('enterprise.userManagement.lastLoginTime'), key: 'loginDate', value: item => timesTampChange(item.loginDate), sortable: false },
+  { title: t('common.actions'), key: 'actions' }
 ]
 const textItem = ref({
   type: 'text',
@@ -74,6 +89,26 @@ const textItem = ref({
   label: '请输入用户名称搜索'
 })
 
+const show = ref(false)
+const formPageRef = ref()
+const bindQuery = ref({})
+const postList = ref([])
+const formItems = ref({
+  options: [
+    {
+      type: 'autocomplete',
+      key: 'postId',
+      value: null,
+      label: '岗位 *',
+      noAttach: false,
+      itemText: 'nameCn',
+      itemValue: 'id',
+      rules: [v => !!v || '请选择要绑定的岗位'],
+      items: []
+    }
+  ]
+})
+
 // 获取用户列表
 const getUserList = async () => {
   loading.value = true
@@ -109,6 +144,56 @@ const handleClick = (e) => {
   query.value.enterpriseId = e[0]
   getUserList()
 }
+
+const getPostList = async () => {
+  const res = await getEnterprisePostPage({ pageNo: 1, pageSize: 100 })
+  postList.value = res.list
+}
+getPostList()
+
+const apiList = [
+  { api: systemUserEnable, desc: t('enterprise.userManagement.enableAccount') }, 
+  { api: systemUserDisable, desc: t('enterprise.userManagement.disableAccount') }
+]
+
+// 启用、禁用账户
+const handleAction = (type, index, item) => {
+  const ids = [item.id]
+  Confirm(t('common.confirmTitle'), apiList[index].desc).then(async () => {
+    await apiList[index].api(ids)
+    Snackbar.success(t('common.operationSuccessful'))
+    query.value.pageNo = 1
+    getUserList()
+  })
+}
+
+// 绑定岗位
+const handleBinding = async (item) => {
+  if (!postList.value.length) {
+    Snackbar.warning(t('enterprise.userManagement.postNodataToAdd'))
+    return
+  }
+  bindQuery.value.id = item.id
+  const obj = formItems.value.options.find(e => e.key === 'postId')
+  obj.items = postList.value
+  obj.value = item.postId
+  show.value = true
+}
+
+const handleClose = () => {
+  show.value = false
+  query.value = {}
+}
+
+const handleSubmit = async () => {
+  const { valid } = await formPageRef.value.formRef.validate()
+  if (!valid) return
+  const postId = formItems.value.options.find(e => e.key === 'postId').value
+  await systemUserBindingPost(bindQuery.value.id, postId)
+  Snackbar.success(t('common.operationSuccessful'))
+  handleClose()
+  getUserList()
+}
 </script>
 
 <style scoped lang="scss">

+ 0 - 1
src/views/recruit/enterprise/systemManagement/userManagement/index.vue

@@ -8,7 +8,6 @@
       v-model="selected"
       :headers="headers"
       :items="items"
-      show-select
       hide-default-header
       height="70vh"
       item-value="id"