Browse Source

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

zhengnaiwen_citu 10 tháng trước cách đây
mục cha
commit
052c5c3862

+ 1 - 2
src/components/Enterprise/details.vue

@@ -107,8 +107,7 @@ const getDetails = async () => {
   if (!props.id) return
   const data = await getEnterpriseDetails({ id: props.id })
   // 成立日期
-  const time = timesTampChange(data.business.establishmentTime)
-  data.business.establishmentTime = time.slice(0, 10)
+  data.business.establishmentTime = timesTampChange(data.business.establishmentTime, 'Y-M-D')
 
   info.value = { ...data, ...dealDictObjData({}, data.enterprise) }
   getCollectionStatus(props.id)

+ 2 - 2
src/store/user.js

@@ -100,8 +100,8 @@ export const useUserStore = defineStore('user',
       },
       // 字典对应中文
       async getFieldText (data) {
-        if (data.birthday && data.birthday !== 0) data.birthdayText = timesTampChange(data.birthday).slice(0, 10) // 出生日期
-        if (data.firstWorkTime && data.firstWorkTime !== 0) data.firstWorkTimeText = timesTampChange(data.firstWorkTime).slice(0, 10) // 首次工作时间
+        if (data.birthday && data.birthday !== 0) data.birthdayText = timesTampChange(data.birthday, 'Y-M-D') // 出生日期
+        if (data.firstWorkTime && data.firstWorkTime !== 0) data.firstWorkTimeText = timesTampChange(data.firstWorkTime, 'Y-M-D') // 首次工作时间
         if (data.areaId && data.areaId !== 0) await getBaseInfoDictOfName(0, data, data.areaId, 'areaName') // 现居住地text
         if (data.eduType && data.eduType !== 0) await getBaseInfoDictOfName(1, data, data.eduType, 'eduTypeText') // 学历
         if (data.expType && data.expType !== 0) await getBaseInfoDictOfName(2, data, data.expType, 'expTypeText') // 工作经验

+ 12 - 2
src/views/recruit/enterprise/elite/components/table.vue

@@ -22,6 +22,10 @@
           <span class="defaultLink ml-3">{{ item?.person?.name }}</span>
         </div>
       </template>
+      <template v-slot:item.status="{ item }">
+        <span v-if="tab === 0">{{ item.status && item.status === '0' ? '未查看' : '已查看' }}</span>
+        <span v-else>{{ item.status ? props.statusList.find(i => i.value === item.status).label : '' }}</span>
+      </template>
       <template v-slot:item.actions="{ item }">
         <div v-if="tab === 0">
           <v-btn color="primary" variant="text" @click="handlePreviewResume(item)">查看附件</v-btn>
@@ -76,11 +80,11 @@ const headers = ref([
   { title: '工作经验', key: 'person.expName', sortable: false },
   { title: '最高学历', key: 'person.eduName', sortable: false },
   { title: '岗位薪资', key: 'job', value: item => `${item.job.payFrom}-${item.job.payTo}/${item.job.payName}`, sortable: false },
-  { title: '状态', key: 'status', sortable: false, value: item => item.status ? props.statusList.find(i => i.value === item.status).label : '' },
+  { title: '状态', key: 'status', sortable: false },
   { title: '操作', value: 'actions', sortable: false }
 ])
 const unfit = { title: '类型', key: 'unfitType', sortable: false, value: item => item.type === '0' ? '简历不合适' : '面试不合适' }
-const delivery = { title: '类型', key: 'deliveryType', sortable: false, value: item => item.status === '0' ? '新投递' : '已查看' }
+const delivery = { title: '类型', key: 'deliveryType', sortable: false, value: item => item.type === '0' ? '普通职位' : '赏金职位' }
 
 const list = [0, 4]
 watch(
@@ -92,6 +96,12 @@ watch(
       const index = headers.value.indexOf(item => item.key === val === 0 ? 'deliveryType' : 'unfitType')
       if (index !== -1) headers.value.splice(index, 1)
     }
+  // 不合适不需要展示状态
+    if (val === 4) {
+      const obj = headers.value.find(e => e.key === 'status')
+      const i = headers.value.indexOf(obj)
+      if (i !== -1) headers.value.splice(i, 1)
+    }
   },
   { immediate: true }
 )

+ 16 - 5
src/views/recruit/enterprise/interview/components/item.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="listItem d-flex align-center pa-3 mb-3" v-for="(item, index) in items" :key="'item_' + index">
     <div class="d-flex align-center">
-      <div class="mr-5 font-size-16" style="color: orange; width: 96px;">{{ timesTampChange(item.time) }}</div>
+      <div class="mr-5 font-size-16" style="color: orange; width: 96px;">{{ timesTampChange(item.time, 'Y-M-D h:m') }}</div>
       <v-avatar class="mr-2" size=40 :image="item?.person?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
       <div class="d-flex flex-column mr-3" style="width: 110px;">
         <span class="ellipsis mb-1">{{ item?.person?.name }}</span>
@@ -29,13 +29,15 @@
         </span>
       </div>
       <!-- 面试状态: '待接受'/'已取消' -->
-      <div :style="{ 'color': item.status !== '98' ? 'orange' :'var(--color-999)'}">
+      <div :style="{ 'color': colorData[item.status] }">
         <v-icon size="30">mdi mdi-circle-small</v-icon>
         <span>{{ statusList.find(e => e.value === item.status)?.label }}</span>
       </div>
       <div>
         <span v-if="editStatus.indexOf(item.status) !== -1" class="font-size-15 color-primary" @click="handleActionClick('edit', item)">修改面试</span>
         <span v-if="againStatus.indexOf(item.status) !== -1" class="font-size-15 color-primary" @click="handleActionClick('edit', item)">重新邀约</span>
+        <span v-if="item.status === '2'" class="font-size-15 color-primary" @click="handleActionClick('completed', item)">完成面试</span>
+        <span v-if="item.status === '3'" class="font-size-15 color-primary" @click="handleActionClick('feedback', item)">填写反馈</span>
         <v-menu v-if="actionItems(item.status).length">
           <template v-slot:activator="{ props }">
             <v-icon v-bind="props" class="mx-3" size="20" color="primary">mdi-dots-horizontal</v-icon>
@@ -100,6 +102,16 @@ const actions = ref([
   { title: '填写反馈', value: 'feedback' },
   { title: '爽约', value: 'attended' }
 ])
+const colorData = {
+  '0': 'orange',
+  '1': 'green',
+  '2': 'green',
+  '3': 'var(--v-primary-base)',
+  '4': 'var(--color-999)',
+  '5': 'var(--v-error-base)',
+  '98': 'var(--v-error-base)',
+  '99': 'var(--color-999)'
+}
 // 邀请
 const itemData = ref({})
 const showInvite = ref(false)
@@ -126,9 +138,8 @@ const textItems2 = ref({
 
 const obj = {
   '0': [1],
-  '1': [1],
-  '2': [0],
-  '3': [2]
+  '1': [1, 3],
+  '2': [3]
 }
 const actionItems = (status) => {
   const type = obj[status]

+ 1 - 1
src/views/recruit/enterprise/interview/index.vue

@@ -40,7 +40,7 @@
       <div>
         <div class="d-flex justify-space-between px-5">
           <div v-if="selectDateValue">
-            <span>{{ timesTampChange(selectDateValue).slice(0, 10) }}</span>
+            <span>{{ timesTampChange(selectDateValue, 'Y-M-D') }}</span>
             <span class="ml-2" style="cursor: pointer;" @click="handleClear">{{ $t('common.cleanUp') }}</span>
           </div>
           <div v-else class="color-999">{{ $t('interview.noDateSelected') }}</div>

+ 1 - 1
src/views/recruit/enterprise/positionManagement/components/item.vue

@@ -47,7 +47,7 @@
         </div>
       </div>
       <div class="bottom pa-5 d-flex justify-space-between align-center">
-        <div>{{ $t('position.refreshTime') }} :{{ timesTampChange(val.updateTime).slice(0, 10) }} {{ val.expireDay && Number(val.expireDay) >= 1 ? `(${ val.expireDay }天后到期)` : '' }}</div>
+        <div>{{ $t('position.refreshTime') }} :{{ timesTampChange(val.updateTime, 'Y-M-D') }} {{ val.expireDay && Number(val.expireDay) >= 1 ? `(${ val.expireDay }天后到期)` : '' }}</div>
         <div class="d-flex">
           <div class="ml-10 d-flex">
             <div v-if="tab === 1">

+ 36 - 14
src/views/recruit/enterprise/statistics/components/overview.vue

@@ -1,7 +1,14 @@
 <template>
   <div class="overview my-5">
     <div class="overview-item pa-5 color-666" v-for="(val, i) in overview" :key="i">
-      <div>{{ val.title }}</div>
+      <div class="d-flex">
+        <div>{{ val.title }}</div>
+        <v-tooltip :text="val.desc" location="top">
+          <template v-slot:activator="{ props }">
+            <span v-bind="props" class="mdi mdi-information-outline ml-1"></span>
+          </template>
+        </v-tooltip>
+      </div>
       <div class="overview-item-value my-3">{{ val.value }}</div>
       <div class="font-size-14">
         环比
@@ -19,14 +26,13 @@ import * as echarts from 'echarts'
 
 // 数据概况
 const overview = ref([
-  { title: '职位浏览量', value: 86, desc: '' },
-  { title: '收到简历量', value: 12, desc: '' },
-  { title: '查看收到简历', value: 0, desc: '' },
-  { title: '已处理简历', value: 4, desc: '' },
-  { title: '主动联系我的人', value: 0, desc: '' },
-  { title: '我主动联系的人', value: 5, desc: '' },
-  // { title: '交换电话微信', value: 2, desc: '' },
-  { title: '面试数量', value: 0, desc: '' }
+  { title: '职位浏览量', value: 86, desc: '指全部职位被候选人查看的人数总和' },
+  { title: '收到简历量', value: 12, desc: '指全部职位收到简历的总数' },
+  { title: '查看收到简历', value: 0, desc: '指查看候选人主动发送的简历数量' },
+  { title: '已处理简历', value: 4, desc: '指招聘方标记"通过筛选"与"不合适"的简历数' },
+  { title: '主动联系我的人', value: 0, desc: '指候选人主动发起沟通的人数' },
+  { title: '我主动联系的人', value: 5, desc: '指候选人主动发起沟通的人数' },
+  { title: '面试数量', value: 0, desc: '面试人数的总数' }
 ])
 
 onMounted(() => {
@@ -127,13 +133,16 @@ onMounted(() => {
 <style scoped lang="scss">
 .overview {
   display: flex;
-  flex-wrap: wrap;
-  width: 100%;
+  // flex-wrap: wrap;
+  // width: 100%;
+  overflow-x: auto;
 }
 .overview-item {
-  width: calc((100% - 84px) / 8);
-  min-width: calc((100% - 84px) / 8);
-  max-width: calc((100% - 84px) / 8);
+  // width: calc((100% - 84px) / 8);
+  // min-width: calc((100% - 84px) / 8);
+  // max-width: calc((100% - 84px) / 8);
+  width: 180px;
+  min-width: 180px;
   margin: 0 12px 12px 0;
   height: 175px;
   border-radius: 12px;
@@ -149,4 +158,17 @@ onMounted(() => {
   font-weight: 700;
   font-size: 44px;
 }
+::-webkit-scrollbar {
+  width: 10px;
+  height: 6px;
+  // display: none;
+}
+::-webkit-scrollbar-thumb, .temporaryAdd ::-webkit-scrollbar-thumb, .details_edit ::-webkit-scrollbar-thumb {
+  // 滚动条-颜色
+  background: #c3c3c379;
+}
+::-webkit-scrollbar-track, .temporaryAdd ::-webkit-scrollbar-track, .details_edit ::-webkit-scrollbar-track {
+  // 滚动条-底色
+  background: #e5e5e58f;
+}
 </style>

+ 2 - 2
src/views/recruit/enterprise/talentPool/components/details/baseInfo.vue

@@ -43,7 +43,7 @@
           </div>
           <div>
             <span class="mdi mdi-cake-variant-outline"></span>
-            <span>{{ timesTampChange(info?.birthday).slice(0, 10) }}</span>
+            <span>{{ timesTampChange(info?.birthday, 'Y-M-D') }}</span>
           </div>
           <div>
             <span class="mdi mdi-account-heart"></span>
@@ -51,7 +51,7 @@
           </div>
           <div>
             <span>{{ $t('resume.firstWorkTime') }}:</span>
-            <span>{{ timesTampChange(info?.firstWorkTime).slice(0, 10) }}</span>
+            <span>{{ timesTampChange(info?.firstWorkTime, 'Y-M-D') }}</span>
           </div>
         </div>
       </div>

+ 2 - 2
src/views/recruit/enterprise/talentPool/components/details/educationExp.vue

@@ -9,9 +9,9 @@
           <div>
             <span style="font-size: 16px;">{{ item.schoolName }}</span>
             <span class="color6 font15 ml-5">
-              <span>{{ timesTampChange(item.startTime).slice(0, 10) }}</span>
+              <span>{{ timesTampChange(item.startTime, 'Y-M-D') }}</span>
               <span class="mx-1">至</span>
-              <span>{{ timesTampChange(item.endTime).slice(0, 10) }}</span>
+              <span>{{ timesTampChange(item.endTime, 'Y-M-D') }}</span>
             </span>
           </div>
           <div v-if="item.active">

+ 2 - 2
src/views/recruit/enterprise/talentPool/components/details/projectExperience.vue

@@ -5,9 +5,9 @@
         <div>
           <span style="font-size: 16px">{{ k.name }}</span>
           <span class="label-title ml-5">
-            <span>{{ timesTampChange(k.startTime).slice(0, 7) }}</span>
+            <span>{{ timesTampChange(k.startTime, 'Y-M') }}</span>
             <span class="mx-1">至</span>
-            <span>{{ timesTampChange(k.endTime).slice(0, 7) }}</span>
+            <span>{{ timesTampChange(k.endTime, 'Y-M') }}</span>
           </span>
         </div>
       </div>

+ 2 - 2
src/views/recruit/enterprise/talentPool/components/details/trainingExperience.vue

@@ -5,9 +5,9 @@
         <div>
           <span style="font-size: 16px;">{{ k.orgName }}</span>
           <span class="label-title ml-5">
-            <span>{{ timesTampChange(k.startTime).slice(0, 7) }}</span>
+            <span>{{ timesTampChange(k.startTime, 'Y-M') }}</span>
             <span class="mx-1">至</span>
-            <span>{{ timesTampChange(k.endTime).slice(0, 7) }}</span>
+            <span>{{ timesTampChange(k.endTime, 'Y-M') }}</span>
           </span>
         </div>
       </div>

+ 2 - 2
src/views/recruit/enterprise/talentPool/components/details/workExperience.vue

@@ -10,9 +10,9 @@
           <div>
             <span>{{ item.enterpriseName }}</span>
             <span class="color6 font15 ml-5">
-              <span>{{ timesTampChange(item.startTime).slice(0, 10) }}</span>
+              <span>{{ timesTampChange(item.startTime, 'Y-M-D') }}</span>
               <span class="mx-1">至</span>
-              <span>{{ timesTampChange(item.endTime).slice(0, 10) }}</span>
+              <span>{{ timesTampChange(item.endTime, 'Y-M-D') }}</span>
             </span>
             <span class="color6 font15 ml-5">{{ item.positionName }}</span>
           </div>

+ 1 - 1
src/views/recruit/personal/PersonalCenter/components/interview/item.vue

@@ -36,7 +36,7 @@
           </div>
         </div>
         <div class="font-size-14 color-666" style="width: 322px;">
-          <div>面试时间:{{ timesTampChange(val.time).slice(0, 16) }}</div>
+          <div>面试时间:{{ timesTampChange(val.time, 'Y-M-D h:m') }}</div>
           <div class="mt-3 ellipsis" style="max-width: 322px;">面试地点:{{ val.address }}</div>
         </div>
       </div>

+ 1 - 1
src/views/recruit/personal/remuse/components/basicInfo.vue

@@ -396,7 +396,7 @@ items.value.options.forEach((e, index) => {
   const infoExist = baseInfo.value && Object.keys(baseInfo.value).length
   if (infoExist && baseInfo.value[e.key]) e.value = baseInfo.value[e.key]
   // 日期相关
-  if (e.type === 'datepicker') e.value = timesTampChange(e.value).slice(0, 10)
+  if (e.type === 'datepicker') e.value = timesTampChange(e.value, 'Y-M-D')
   // 所在城市回显
   // if (infoExist && e.nameKey) e[e.nameKey] = baseInfo.value[e.nameKey]
   if (infoExist && e.key === 'areaId' && baseInfo.value[e.key]) {

+ 3 - 3
src/views/recruit/personal/remuse/components/educationExp.vue

@@ -25,9 +25,9 @@
           <div>
             <span style="font-size: 18px; font-weight: bold;">{{ item.schoolName }}</span>
             <span class="color6 font15 ml-5">
-              <span>{{ timesTampChange(item.startTime).slice(0, 7) }}</span>
+              <span>{{ timesTampChange(item.startTime, 'Y-M') }}</span>
               <span class="mx-1">至</span>
-              <span>{{ timesTampChange(item.endTime).slice(0, 7) }}</span>
+              <span>{{ timesTampChange(item.endTime, 'Y-M') }}</span>
             </span>
           </div>
           <div v-if="item.active">
@@ -217,7 +217,7 @@ const handle = (item) => {
         // if (item[e.key] && item[e.itemTextName]) { e.search(item[e.itemTextName], '触发下拉框内容'); e.value = item[e.key] }
         // else { e.value = item[e.itemTextName]; e[e.itemTextName] = item[e.itemTextName] }
       }
-      else if (e.type === 'datepicker') e.value = timesTampChange(item[e.key]).slice(0, 7)
+      else if (e.type === 'datepicker') e.value = timesTampChange(item[e.key], 'Y-M')
       else if (item[e.key]) e.value = item[e.key]
     })
   } else { // 新增

+ 2 - 2
src/views/recruit/personal/remuse/components/projectExperience.vue

@@ -23,9 +23,9 @@
         <div>
           <span style="font-size: 18px; font-weight: bold;">{{ k.name }}</span>
           <span class="label-title ml-5">
-            <span>{{ timesTampChange(k.startTime).slice(0, 7) }}</span>
+            <span>{{ timesTampChange(k.startTime, 'Y-M') }}</span>
             <span class="mx-1">至</span>
-            <span>{{ timesTampChange(k.endTime).slice(0, 7) }}</span>
+            <span>{{ timesTampChange(k.endTime, 'Y-M') }}</span>
           </span>
         </div>
       </div>

+ 2 - 2
src/views/recruit/personal/remuse/components/trainingExperience.vue

@@ -23,9 +23,9 @@
             <div>
               <span style="font-size: 18px; font-weight: bold;">{{ k.orgName }}</span>
               <span class="label-title ml-5">
-                <span>{{ timesTampChange(k.startTime).slice(0, 7) }}</span>
+                <span>{{ timesTampChange(k.startTime, 'Y-M') }}</span>
                 <span class="mx-1">至</span>
-                <span>{{ timesTampChange(k.endTime).slice(0, 7) }}</span>
+                <span>{{ timesTampChange(k.endTime, 'Y-M') }}</span>
               </span>
             </div>
           </div>

+ 3 - 3
src/views/recruit/personal/remuse/components/workExperience.vue

@@ -25,9 +25,9 @@
           <div>
             <span style="font-size: 18px; font-weight: bold;">{{ item.enterpriseName }}</span>
             <span class="color6 font15 ml-5">
-              <span>{{ timesTampChange(item.startTime).slice(0, 7) }}</span>
+              <span>{{ timesTampChange(item.startTime, 'Y-M') }}</span>
               <span class="mx-1">至</span>
-              <span>{{ timesTampChange(item.endTime).slice(0, 7) }}</span>
+              <span>{{ timesTampChange(item.endTime, 'Y-M') }}</span>
             </span>
           </div>
           <div v-if="item.active">
@@ -184,7 +184,7 @@ const handle = (item) => {
       if (e.canBeInputted) { // 特殊处理可输入下拉框
         dealCanBeInputtedValueAndLabel(e, item)
       }
-      else if (e.type === 'datepicker') e.value = timesTampChange(item[e.key]).slice(0, 7)
+      else if (e.type === 'datepicker') e.value = timesTampChange(item[e.key], 'Y-M')
       else if (item[e.key]) e.value = item[e.key]
     })
   } else { // 新增