Parcourir la source

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner-admin into dev

Xiao_123 il y a 1 semaine
Parent
commit
c30b80cbe2

+ 2 - 1
src/components/Dialog/src/Dialog.vue

@@ -8,6 +8,7 @@ const slots = useSlots()
 const props = defineProps({
   modelValue: propTypes.bool.def(false),
   title: propTypes.string.def('Dialog'),
+  modalClose: propTypes.bool.def(true),
   fullscreen: propTypes.bool.def(true),
   width: propTypes.oneOfType([String, Number]).def('40%'),
   scroll: propTypes.bool.def(false), // 是否开启滚动条。如果是的话,按照 maxHeight 设置最大高度
@@ -60,7 +61,7 @@ const dialogStyle = computed(() => {
 <template>
   <ElDialog
     v-bind="getBindValue"
-    :close-on-click-modal="true"
+    :close-on-click-modal="modalClose"
     :fullscreen="isFullscreen"
     :width="width"
     destroy-on-close

+ 20 - 13
src/views/menduner/system/person/details/components/expExtend.vue

@@ -40,8 +40,8 @@ import { timesTampChange, getTimeDifferenceInChinese } from '@/utils/transform/d
 import { formatName } from '@/utils'
 
 const props = defineProps({
-  userId: [String, Number],
-  data: Array,
+  userId: [String, Number], // 通过userId调用接口查询工作经验列表
+  data: Array, // 传入工作经验列表
   defaultShowAll: Boolean // 展示所有工作经验
 })
 
@@ -53,28 +53,35 @@ const queryParams = reactive({
 const expandAll = ref(props.defaultShowAll) // 展开/折叠
 const foldNum = ref(2) // 折叠时展示个数-1
 
-const list = ref(props.data || [])
+const deal = (list) => {
+  const arr = list.map(exp => {
+    exp.startTimeStr = exp.startTime ? timesTampChange(exp.startTime, 'Y-M') : '未填写工作时间'
+    exp.endTimeStr = exp.startTime ? exp.endTime ? timesTampChange(exp.endTime, 'Y-M') : '至今' : ''
+    exp.year = exp.endTimeStr ? getTimeDifferenceInChinese(exp.startTime, exp.endTime) : ''
+    // 未填写工作经验相关内容,不展示
+    exp.show = (exp.startTimeStr !== '未填写工作时间') || Boolean(exp.enterpriseName) || Boolean(exp.positionName)
+    return exp
+  }).filter(i => i.show)
+  return arr
+}
+
+const list = ref(props.data?.length ? deal(props.data) : [])
 const total = ref(props.data?.length || 0)
 const loading = ref(false)
-const getList = async () => {
+const getExpList = async () => {
   if (!queryParams.userId) return
+
   loading.value = true
   try {
     const data = await PersonInfoApi.getPersonExpPage(queryParams)
-    list.value = data.list?.length ? data.list.map(exp => {
-      exp.startTimeStr = exp.startTime ? timesTampChange(exp.startTime, 'Y-M') : '未填写工作时间'
-      exp.endTimeStr = exp.startTime ? exp.endTime ? timesTampChange(exp.endTime, 'Y-M') : '至今' : ''
-      exp.year = exp.endTimeStr ? getTimeDifferenceInChinese(exp.startTime, exp.endTime) : ''
-      // 未填写工作经验内容,不展示
-      exp.show = Boolean(exp.year) || Boolean(exp.enterpriseName) || Boolean(exp.positionName)
-      return exp
-    }) : []
+    list.value = data.list?.length ? deal(data.list) : []
+    
     total.value = data.total
   } finally {
     loading.value = false
   }
 }
-getList()
+getExpList()
 </script>
 <style lang="scss" scoped>
 .exp {

+ 1 - 0
src/views/menduner/system/talentMap/maintenance/gather/components/personCard.vue

@@ -29,6 +29,7 @@
       </div>
     </div>
     <!-- 工作经验 -->
+    <!-- <expExtend :data="info?.workExpList" /> -->
     <expExtend :user-id="info?.userId" />
     <div class="button">
       <el-button type="success" plain @click="personClick">{{ props.detailButTxt || '加入人才地图' }}</el-button>

+ 125 - 45
src/views/menduner/system/talentMap/maintenance/gather/components/search.vue

@@ -9,24 +9,97 @@
       label-width="68px"
     >
       <el-form-item label="姓名" prop="name">
-        <el-input v-model="queryParams.name" placeholder="请输入姓名" clearable @keyup.enter="handleQuery" class="!w-130px" />
+        <el-input v-model="queryParams.name" placeholder="请输入" clearable @keyup.enter="handleQuery" class="!w-160px" />
       </el-form-item>
       <el-form-item label="联系电话" prop="phone">
-        <el-input v-model="queryParams.phone" placeholder="请输入联系电话" clearable @keyup.enter="handleQuery" class="!w-130px" />
+        <el-input v-model="queryParams.phone" placeholder="请输入" clearable @keyup.enter="handleQuery" class="!w-160px" />
       </el-form-item>
+      <el-form-item label="酒店品牌" prop="brand">
+        <el-input v-model="queryParams.brand" placeholder="请输入" clearable @keyup.enter="handleQuery" class="!w-160px" />
+      </el-form-item>
+      <el-form-item label="最高学历" prop="eduType">
+        <el-select
+          v-model="queryParams.eduType"
+          placeholder="请选择"
+          clearable
+          class="!w-160px"
+        >
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.MENDUNER_EDUCATION_TYPE)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="工作经验" prop="expType">
+        <el-select
+          v-model="queryParams.expType"
+          placeholder="请选择"
+          clearable
+          class="!w-160px"
+        >
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.MENDUNER_EXP_TYPE)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="所在城市" prop="areaIds">
+        <el-cascader
+          v-model="queryParams.areaIds" 
+          :options="areaTreeData" 
+          :props="{ label: 'name', value: 'id', multiple: true, emitPath: false, checkStrictly: true  }"
+          collapse-tags
+          collapse-tags-tooltip
+          class="!w-160px"
+        />
+      </el-form-item>
+      <el-form-item label="意向城市" prop="workAreaIds">
+        <el-cascader
+          v-model="queryParams.workAreaIds" 
+          :options="areaTreeData" 
+          :props="{ label: 'name', value: 'id', multiple: true, emitPath: false, checkStrictly: true  }"
+          collapse-tags
+          collapse-tags-tooltip
+          class="!w-160px"
+        />
+      </el-form-item>
+      <el-form-item label="意向职位" prop="positionIds">
+        <el-select
+          v-model="queryParams.positionIds"
+          placeholder="请选择"
+          clearable
+          multiple
+          collapse-tags
+          collapse-tags-tooltip
+          class="!w-160px"
+        >
+          <el-option
+            v-for="dict in positionTreeData"
+            :key="dict?.id"
+            :label="dict?.nameCn"
+            :value="dict?.id"
+          />
+        </el-select>
+      </el-form-item>
+
       <el-form-item>
-        <el-button @click="handleQuery" type="primary"><Icon icon="ep:search" /> 搜索</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button @click="handleQuery" :loading="loading" type="primary"><Icon icon="ep:search" /> 搜索</el-button>
+        <el-button @click="resetQuery" :loading="loading"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
 
-  <div v-if="paramsVerify && !list?.length" class="tip">
-    <div>{{ tipContent }}</div>
-  </div>
   <!-- 列表 -->
-  <ContentWrap>
-    <div class="listBox" v-loading="loading">
+  <ContentWrap v-loading="loading">
+    <div class="listBox">
+      <div v-if="!loading && !list?.length" class="tip" style="line-height: 200px;">
+        <div v-if="paramsBool">未查到任何数据,请更换查询条件后再试!</div>
+        <div v-else>请输入查询条件!</div>
+      </div>
       <personCard
         v-for="item of list"
         :key="item.id"
@@ -37,32 +110,7 @@
     </div>
   </ContentWrap>
 
-  <ContentWrap>
-    <!-- <el-table v-loading="loading" :data="list" :stripe="true">
-      <el-table-column label="姓名" align="center" prop="person.name" fixed="left" />
-      <el-table-column label="联系电话" align="center" prop="user.phone" width="120px" />
-      <el-table-column label="求职状态" align="center" prop="person.jobStatus" width="130px">
-        <template #default="scope">
-          <dict-tag v-if="scope.row.person?.jobStatus" :type="DICT_TYPE.MENDUNER_JOB_SEEK_STATUS" :value="scope.row.person?.jobStatus" />
-        </template>
-      </el-table-column>
-      <el-table-column label="学历" align="center" prop="person.eduType">
-        <template #default="scope">
-          <dict-tag v-if="scope.row.person?.eduType" :type="DICT_TYPE.MENDUNER_EDUCATION_TYPE" :value="scope.row.person?.eduType" />
-        </template>
-      </el-table-column>
-      <el-table-column label="工作经验" align="center" prop="person.expType">
-        <template #default="scope">
-          <dict-tag v-if="scope.row.person?.expType" :type="DICT_TYPE.MENDUNER_EXP_TYPE" :value="scope.row.person?.expType" />
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" fixed="right" min-width="60">
-        <template #default="scope">
-          <el-button link type="primary" @click="handleDetail(scope.row)">{{ detailButTxt || '详情'}}</el-button>
-        </template>
-      </el-table-column>
-    </el-table> -->
-    <!-- 分页 -->
+  <ContentWrap v-if="total">
     <Pagination
       :total="total"
       layout="total, prev, pager, next"
@@ -79,11 +127,11 @@ import { TalentMap } from '@/api/menduner/system/talentMap'
 import { PersonInfoApi } from '@/api/menduner/system/person'
 import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
 import personCard from './personCard.vue'
+import { getDict } from '@/hooks/web/useDictionaries'
 
 const emit = defineEmits(['detail'])
 const props = defineProps({
-  detailButTxt: String,
-  paramsVerify: Boolean,
+  paramsVerify: Boolean, // 查询条件必传
   searchName: String
 })
 const message = useMessage() // 消息弹窗
@@ -96,36 +144,68 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 5,
   name: '',
-  phone: undefined
+  phone: undefined,
+  brand: '',
+  eduType: undefined,
+  expType: undefined,
+  areaIds: [],
+  workAreaIds: [],
+  positionIds: [],
 })
 const queryFormRef = ref() // 搜索的表单
 
+// 地区列表
+const areaTreeData = ref([])
+const getDictData = async () => {
+  const { data } = await getDict('areaTreeData', {}, 'areaTreeData')
+  const obj = data.find(e => e.name === '中国')
+  const list = obj?.children ? obj.children.map(e =>{
+    // 市辖区直接显示区
+    const municipality = e.children && e.children.length && e.children[0].name === '市辖区'
+    if (municipality && e.children[0].children?.length) e.children = e.children[0].children
+    return e
+  }) : []
+  areaTreeData.value = list.length ? list : []
+}
+getDictData()
+const positionTreeData = ref([])
+const getPositionTreeData = async () => {
+  const { data } = await getDict('positionTreeData', {}, 'positionTreeData')
+  positionTreeData.value = data || []
+}
+getPositionTreeData()
+
 /** 查询列表 */
 const getList = async () => {
+  // if (loading.value) return message.warning('请勿频繁操作 !')
   loading.value = true
   try {
     const data = await PersonInfoApi.getPersonInfoPage(queryParams)
     list.value = data?.list.map(e => {
       return {
         ...e.person,
-        // Boolean(exp.year) || Boolean(exp.enterpriseName) || Boolean(exp.positionName)
-        // workExpList: e.work ? [e.work] : []
+        workExpList: e.work ? [e.work] : []
       }
     }) || []
     total.value = data?.total || 0
+  } catch (error) {
+    console.log('打印->error', error)
+    list.value = []
+    total.value = 0
   } finally {
     loading.value = false
   }
 }
 
-const tipContent = '输入人才姓名、电话查询后可使用门墩儿人才库数据填充表单!'
+const paramsBool = ref(false) // 是否存在筛选条件
 /** 搜索按钮操作 */
 const handleQuery = () => {
+  const obj = { pageNo: null, pageSize: null, ...queryParams }
+  paramsBool.value = Object.values(obj).some(value => value !== undefined && value !== null && value !== '' && value.length)
+
+  if (props.paramsVerify && !paramsBool.value) return message.warning('请输入查询条件后再查询 !')
+
   queryParams.pageNo = 1
-  if (props.paramsVerify && !queryParams.name && !queryParams.phone) {
-    message.warning('请输入后查询 !')
-    return
-  }
   getList()
 }
 

+ 8 - 8
src/views/menduner/system/talentMap/maintenance/gather/index.vue

@@ -66,7 +66,7 @@
     </Dialog>
 
     <!-- 人员搜索 -->
-    <Dialog :title="radioObject.menduner" v-model="openSearch" width="1200" @close="openSearch = false">
+    <Dialog :title="radioObject.menduner" v-model="openSearch" :modalClose="false" width="1200" @close="openSearch = false">
       <Search @detail="handleDetail" />
     </Dialog>
 
@@ -80,7 +80,7 @@
             v-model:file-list="fileList"
             :action="uploadUrl"
             :auto-upload="false"
-            :data="data"
+            :data="fileData"
             :limit="1"
             :on-change="handleChange"
             :on-error="submitFormError"
@@ -131,16 +131,16 @@
     </Dialog>
 
     <!-- 解析回显 -->
-    <Dialog :title="radioObject[radioValue]" v-model="dialog_analysisInfo" width="90%" @close="dialog_analysisInfo = false">
+    <Dialog :title="radioObject[radioValue]" v-model="dialog_analysisInfo" :modalClose="false" width="90%" @close="dialog_analysisInfo = false">
       <div class="analysisInfoBox">
         <div class="analysisFile" :style="{'width': showFormPage || tagList?.length > 0 ? '50%' :'100%'}">
           <!-- 门墩儿人才库 -->
           <template v-if="radioValue === 'menduner'">
             <el-tabs v-model="activeName" type="border-card">
               <el-tab-pane label="基本信息" name="info">
-                <el-card shadow="never" class="m-b-20px">
+                <el-card shadow="never">
                   <Info :id="id" :user-id="userId" />
-                  <expExtend :user-id="userId" defaultShowAll />
+                  <expExtend :user-id="userId" defaultShowAll class="m-t-20px" />
                 </el-card>
               </el-tab-pane>
 
@@ -507,10 +507,10 @@ const handleAnalysis = async () => {
 const fileUrl = ref('') // https://minio.menduner.com/dev/person/229988673960153088/attachment/ee3eb21f45e13ede3557a03d18585ed80c5b4212ac5634e3436e309afaa8fe6a.pdf
 const uploadRef = ref()
 const fileList = ref([])
-const data = ref({ path: '' })
+const fileData = ref({ path: '' })
 // 文件上传
 const handleChange = async (file) => {
-  data.value.path = file.name
+  fileData.value.path = file.name
   unref(uploadRef)?.submit()
   if (!fileList.value.length) return
 
@@ -545,7 +545,7 @@ const handleText = () => {
 const handleResetUpload = async () => {
   await message.confirm('是否确定重新上传简历?确定后将清空当前信息')
   fileUrl.value = ''
-  data.value.path = ''
+  fileData.value.path = ''
   fileList.value = []
   resumeAnalysisToForm('reset') // 简历解析
 }