浏览代码

强制填写个人信息

lifanagju_citu 6 月之前
父节点
当前提交
dd3a568946

+ 6 - 1
src/hooks/web/useDictionaries.js

@@ -13,6 +13,7 @@ import {
 // const DICT_CITY_API = {
 // const DICT_CITY_API = {
 //   menduner_exp_type: getDictData
 //   menduner_exp_type: getDictData
 // }
 // }
+import { getSecondNodes } from '@/utils/dealData'
 
 
 // const setDict = (type, val, cacheTime = 7200) => {
 // const setDict = (type, val, cacheTime = 7200) => {
 const setDict = (type, val) => {
 const setDict = (type, val) => {
@@ -25,6 +26,9 @@ const setDict = (type, val) => {
       return e
       return e
     }) : []
     }) : []
   }
   }
+  if (type === 'positionSecondData') {
+    val = getSecondNodes(val)
+  }
   // 一小时过期
   // 一小时过期
   const currentTime = new Date()
   const currentTime = new Date()
   currentTime.setTime(currentTime.getTime() + 3600 * 1000)
   currentTime.setTime(currentTime.getTime() + 3600 * 1000)
@@ -58,7 +62,8 @@ export const getDict = (type, params, apiType = 'dict') => {
         skillList: getSkillList,
         skillList: getSkillList,
         areaList: getAreaListData,
         areaList: getAreaListData,
         areaMap: getAreaMapData,
         areaMap: getAreaMapData,
-        positionData: getPositionData
+        positionData: getPositionData,
+        positionSecondData: getPositionTreeData
       }
       }
       apiFn[apiType](query).then(data => {
       apiFn[apiType](query).then(data => {
         // setDict(type, data, Date.now())
         // setDict(type, data, Date.now())

+ 2 - 2
src/permission.js

@@ -5,7 +5,7 @@ import { getToken, getIsEnterprise } from '@/utils/auth'
 import { useDictStore } from '@/store/dict'
 import { useDictStore } from '@/store/dict'
 import { useUserStore } from '@/store/user'
 import { useUserStore } from '@/store/user'
 import Confirm from '@/plugins/confirm'
 import Confirm from '@/plugins/confirm'
-// import necessaryInfo from '@/plugins/necessaryInfo'
+import necessaryInfo from '@/plugins/necessaryInfo'
 
 
 const { start, done } = useNProgress()
 const { start, done } = useNProgress()
 // loginType:1.enterprise: 企业路由
 // loginType:1.enterprise: 企业路由
@@ -27,7 +27,7 @@ router.beforeEach(async (to, from, next) => {
     // 强制修改密码
     // 强制修改密码
     if (localStorage.getItem('entUpdatePassword') === 'needChange') fullScreen('entUpdatePassword')
     if (localStorage.getItem('entUpdatePassword') === 'needChange') fullScreen('entUpdatePassword')
     // 强制填写个人信息
     // 强制填写个人信息
-    // else if (localStorage.getItem('necessaryInfoReady') !== 'ready' && tokenIndex === 2) necessaryInfo('necessaryInfoDialog')
+    else if (localStorage.getItem('necessaryInfoReady') !== 'ready' && tokenIndex === 2) necessaryInfo('necessaryInfoDialog')
     // 企业信息完成度提示
     // 企业信息完成度提示
     else if (localStorage.getItem('checkEnterpriseBaseInfoFalseHref')) {
     else if (localStorage.getItem('checkEnterpriseBaseInfoFalseHref')) {
       const href = localStorage.getItem('checkEnterpriseBaseInfoFalseHref')
       const href = localStorage.getItem('checkEnterpriseBaseInfoFalseHref')

+ 59 - 29
src/plugins/necessaryInfo/components/infoForm.vue

@@ -23,24 +23,22 @@ const formPageRef = ref()
 let query = reactive({})
 let query = reactive({})
 
 
 // 企业名称下拉列表
 // 企业名称下拉列表
-const enterpriseNameInput = ref('')
+let enterpriseName = ''
+// const enterpriseNameInput = ref('')
 const getEnterpriseData = async (name) => {
 const getEnterpriseData = async (name) => {
   const item = items.value.options.find(e => e.key === 'enterpriseId')
   const item = items.value.options.find(e => e.key === 'enterpriseId')
   if (!item) return
   if (!item) return
-  if (item.items?.length && (enterpriseNameInput.value === name)) return // 防抖
-  item[item.itemTextName] = enterpriseNameInput.value = name
+  if (item.items?.length && (enterpriseName === name)) return // 防抖
+  // item[item.itemTextName] = 
+  enterpriseName = name
   if (name === null || name === '') { item.items = [] }
   if (name === null || name === '') { item.items = [] }
   else {
   else {
     const data = await enterpriseSearchByName({ name })
     const data = await enterpriseSearchByName({ name })
     item.items = data
     item.items = data
   }
   }
 }
 }
-const positionSearch = (name) => {
-  const item = items.value.options.find(e => e.key === 'positionId')
-  if (!item) return
-  item[item.itemTextName] = name
-}
 
 
+let positionName = ''
 const items = ref({
 const items = ref({
   options: [
   options: [
     {
     {
@@ -79,6 +77,10 @@ const items = ref({
       label: '常用邮箱',
       label: '常用邮箱',
       outlined: true,
       outlined: true,
       rules: [
       rules: [
+        value => {
+          if (value) return true
+          return '请输入联系邮箱'
+        },
         value => {
         value => {
           if (value && !checkEmail(value)) return '请输入正确的电子邮箱'
           if (value && !checkEmail(value)) return '请输入正确的电子邮箱'
           return true
           return true
@@ -127,26 +129,25 @@ const items = ref({
       itemTextName: 'positionName',
       itemTextName: 'positionName',
       itemText: 'nameCn',
       itemText: 'nameCn',
       itemValue: 'id',
       itemValue: 'id',
+      dictTypeName: 'positionSecondData',
       // rules: [v => !!v || '任职职位名称(没有可填“暂无”)'],
       // rules: [v => !!v || '任职职位名称(没有可填“暂无”)'],
-      search: val => positionSearch(val),
+      search: val => positionName = val,
+      items: []
+    },
+    {
+      type: 'autocomplete',
+      key: 'interestedPositionList',
+      value: null,
+      default: null,
+      label: '意向职位 *',
+      outlined: true,
+      itemText: 'nameCn',
+      itemValue: 'id',
+      multiple: true,
+      dictTypeName: 'positionSecondData',
+      rules: [v => !!v || '请选择意向职位'],
       items: []
       items: []
     },
     },
-    // {
-    //   type: 'autocomplete',
-    //   key: 'interestedPositionList',
-    //   value: null,
-    //   default: null,
-    //   label: '意向职位 *',
-    //   outlined: true,
-    //   clearable: true,
-    //   multiple: true,
-    //   canBeInputted: true, //
-    //   itemText: 'nameCn',
-    //   itemValue: 'id',
-    //   dictTypeName: 'positionData',
-    //   rules: [v => !!v || '意向职位'],
-    //   items: []
-    // },
     {
     {
       type: 'autocomplete',
       type: 'autocomplete',
       key: 'jobStatus',
       key: 'jobStatus',
@@ -186,14 +187,16 @@ const items = ref({
       rules: [v => !!v || '请选择最高学历'],
       rules: [v => !!v || '请选择最高学历'],
       items: []
       items: []
     },
     },
+    //   label: '学制类型 *', menduner_education_system_type
   ]
   ]
 })
 })
 
 
 // 获取字典内容
 // 获取字典内容
-const getDictData = async (dictTypeName) => {
-  const item = items.value.options.find(e => e.dictTypeName === dictTypeName)
+const getDictData = async (dictTypeName, key) => {
+  const item = items.value.options.find(e => e.key === key)
   if (item) {
   if (item) {
-    const { data } = await getDict(dictTypeName)
+    const apiFn = dictTypeName === 'positionSecondData' ? 'positionSecondData' : null
+    const { data } = await getDict(dictTypeName, {}, apiFn)
     item.items = data
     item.items = data
     // console.log(dictTypeName, '字典内容', data)
     // console.log(dictTypeName, '字典内容', data)
   }
   }
@@ -202,13 +205,39 @@ const getDictData = async (dictTypeName) => {
 const userInfo = ref(localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : {})
 const userInfo = ref(localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : {})
 const baseInfo = ref(localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {})
 const baseInfo = ref(localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {})
 items.value.options.forEach((e) => {
 items.value.options.forEach((e) => {
-  if (e.dictTypeName) getDictData(e.dictTypeName) // 查字典set options
+  if (e.dictTypeName) getDictData(e.dictTypeName, e.key) // 查字典set options
   if (baseInfo.value && baseInfo.value[e.key]) e.value = baseInfo.value[e.key] // 人才信息回显
   if (baseInfo.value && baseInfo.value[e.key]) e.value = baseInfo.value[e.key] // 人才信息回显
   if (userInfo.value && userInfo.value[e.key]) e.value = userInfo.value[e.key] // 人才信息回显
   if (userInfo.value && userInfo.value[e.key]) e.value = userInfo.value[e.key] // 人才信息回显
   if (e.key === 'sex' && e.value === '0') e.value = e.default
   if (e.key === 'sex' && e.value === '0') e.value = e.default
   if (setInfo.value[e.key]) e.value = setInfo.value[e.key]
   if (setInfo.value[e.key]) e.value = setInfo.value[e.key]
 })
 })
 
 
+// const getName = (obj, key) => {
+//   const item = items.value.options.find(e => e.key === key)
+//   if (!item && !item.value) return
+//   const select = item.items.find(e => item.value === e[item.itemValue || 'value'])
+//   if (select) {
+//     obj[item.itemTextName] = select[item.itemText || 'label']
+//   }
+// }
+
+const dealQuery = () => {
+  query.positionName = positionName
+  if (query.positionId === positionName) delete query.positionId  // 有选中id传id和name,否者只传name
+  query.enterpriseName = enterpriseName
+  if (query.enterpriseId === enterpriseName) delete query.enterpriseId  // 有选中id传id和name,否者只传name
+  //
+  if (query.interestedPositionList?.length) {
+    query.interestedList = query.interestedPositionList.map(e => { return {positionId: e} })
+  }
+  query.workExpList = [{
+    enterpriseId: query.enterpriseId,
+    enterpriseName: query.enterpriseName,
+    positionId: query.positionId,
+    positionName: query.positionName,
+  }]
+}
+
 const getQuery = async () => {
 const getQuery = async () => {
   const { valid } = await formPageRef.value.formRef.validate()
   const { valid } = await formPageRef.value.formRef.validate()
   if (!valid) return false
   if (!valid) return false
@@ -218,6 +247,7 @@ const getQuery = async () => {
     obj[e.key] = e.value
     obj[e.key] = e.value
   })
   })
   query = Object.assign(query, obj)
   query = Object.assign(query, obj)
+  dealQuery()
   return query
   return query
 }
 }
 
 

+ 2 - 1
src/plugins/necessaryInfo/components/necessaryInfoDialog.vue

@@ -27,7 +27,7 @@ import { useRouter } from 'vue-router'; const router = useRouter()
 import Confirm from '@/plugins/confirm'
 import Confirm from '@/plugins/confirm'
 import { onMounted, ref } from 'vue'
 import { onMounted, ref } from 'vue'
 import { getToken } from '@/utils/auth'
 import { getToken } from '@/utils/auth'
-// import Snackbar from '@/plugins/snackbar'
+import Snackbar from '@/plugins/snackbar'
 
 
 const props = defineProps({
 const props = defineProps({
   // title: String,
   // title: String,
@@ -63,6 +63,7 @@ const simpleInfoSubmit = async () => {
     const obj = await formRef.value.getQuery()
     const obj = await formRef.value.getQuery()
     if (!obj) return
     if (!obj) return
     await savePersonSimpleInfo(obj)
     await savePersonSimpleInfo(obj)
+    Snackbar.success('保存成功')
     // const info = localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
     // const info = localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
     // localStorage.setItem('baseInfo', JSON.stringify({ ...info, ...obj }))
     // localStorage.setItem('baseInfo', JSON.stringify({ ...info, ...obj }))
     // localStorage.setItem('necessaryInfoReady', 'ready') //
     // localStorage.setItem('necessaryInfoReady', 'ready') //

+ 15 - 15
src/utils/check.js

@@ -1,18 +1,18 @@
 // 校验是否完善人才必填信息
 // 校验是否完善人才必填信息
 export const checkPersonBaseInfo = (baseInfo) => {
 export const checkPersonBaseInfo = (baseInfo) => {
-  return true // return true关闭弹窗
-  // const info = baseInfo ? baseInfo : localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
-  // if (!info || !Object.keys(info).length) return false
-  // const keyArr = [ // 必填项目
-  //   'name',
-  //   'sex',
-  //   'phone',
-  //   'email',
-  //   'birthday',
-  //   'jobStatus',
-  //   'expType',
-  //   'eduType'
-  // ]
-  // const necessaryInfoReady = keyArr.every(e => info[e] && info[e] !== 0)
-  // return necessaryInfoReady
+  const info = baseInfo ? baseInfo : localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
+  if (!info || !Object.keys(info).length) return false
+  const keyArr = [ // 必填项目
+    'name',
+    'sex',
+    'phone',
+    'email',
+    'birthday',
+    'jobStatus',
+    'expType',
+    'eduType'
+  ]
+  const necessaryInfoReady = keyArr.every(e => info[e] && info[e] !== 0)
+  return necessaryInfoReady
+  // return true // return true关闭弹窗
 }
 }

+ 28 - 0
src/utils/dealData.js

@@ -0,0 +1,28 @@
+// 获取所有的叶子节点
+export const  getLeafNodes = (tree) => {
+  const leafNodes = []
+  function traverse(node) {
+    if (!node.children || node.children.length === 0) {
+      leafNodes.push(node)
+    } else {
+      for (let child of node.children) {
+        traverse(child)
+      }
+    }
+  }
+  // 开始遍历
+  if (!tree?.length) return []
+  for (let rootNode of tree) {
+    traverse(rootNode)
+  }
+  return leafNodes
+}
+
+// 获取所有二级节点
+export const  getSecondNodes = (tree) => {
+  let nodes = []
+  for (const rootNode of tree) {
+    if (rootNode.children?.length) nodes = [...nodes, ...rootNode.children]
+  }
+  return nodes
+}

+ 2 - 2
src/views/recruit/personal/PersonalCenter/resume/online/components/jobIntention.vue

@@ -19,8 +19,8 @@
             <div v-if="!k.payFrom && !k.payTo">面议</div>
             <div v-if="!k.payFrom && !k.payTo">面议</div>
             <div v-else>{{k.payFrom ? k.payFrom + '-' : ''}}{{k.payTo}}</div>
             <div v-else>{{k.payFrom ? k.payFrom + '-' : ''}}{{k.payTo}}</div>
             <div class="line">|</div>
             <div class="line">|</div>
-            <div class="grey-text text-box">{{ k.industry && k.industry.length ? k.industry.map(e => e.nameCn).join('、') : '' }}</div>
-            <div class="line" v-if="k.industry.length && k.jobTypeName">|</div>
+            <div class="grey-text text-box">{{ k.industry && k.industry?.length ? k.industry.map(e => e.nameCn).join('、') : '' }}</div>
+            <div class="line" v-if="k.industry?.length && k.jobTypeName">|</div>
             <div class="grey-text">{{ k.jobTypeName }}</div>
             <div class="grey-text">{{ k.jobTypeName }}</div>
             <div class="line" v-if="k.jobTypeName && k.workArea">|</div>
             <div class="line" v-if="k.jobTypeName && k.workArea">|</div>
             <div class="grey-text ellipsis" style="max-width: 160px;">
             <div class="grey-text ellipsis" style="max-width: 160px;">