Browse Source

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

lifanagju_citu 7 months ago
parent
commit
a4e4d18cb2
35 changed files with 218 additions and 135 deletions
  1. 7 3
      src/components/AreaSelect/index.vue
  2. 1 1
      src/components/CtTable/index.vue
  3. 1 1
      src/components/Enterprise/hotPromoted.vue
  4. 2 2
      src/components/personalRecharge/index.vue
  5. 1 0
      src/config/axios/service.js
  6. 8 8
      src/views/about/index.vue
  7. 9 7
      src/views/headhunting/components/content.vue
  8. 1 0
      src/views/mall/components/table.vue
  9. 1 0
      src/views/mall/purchasePackage/index.vue
  10. 1 0
      src/views/publicRecruitment/components/integralTable.vue
  11. 1 0
      src/views/publicRecruitment/components/table.vue
  12. 4 2
      src/views/recruit/enterprise/hirePosition/components/item.vue
  13. 10 8
      src/views/recruit/enterprise/hirePosition/components/jobRequirements.vue
  14. 3 1
      src/views/recruit/enterprise/interviewManagement/components/invite.vue
  15. 3 1
      src/views/recruit/enterprise/personnelManagement/components/invite.vue
  16. 1 0
      src/views/recruit/enterprise/personnelManagement/components/table.vue
  17. 4 1
      src/views/recruit/enterprise/positionManagement/components/item.vue
  18. 13 11
      src/views/recruit/enterprise/positionManagement/components/jobRequirements.vue
  19. 3 1
      src/views/recruit/enterprise/resume/components/invite.vue
  20. 10 10
      src/views/recruit/enterprise/resume/components/table.vue
  21. 15 15
      src/views/recruit/enterprise/search/recommend/index.vue
  22. 12 12
      src/views/recruit/enterprise/search/retrieval/index.vue
  23. 1 0
      src/views/recruit/enterprise/systemManagement/groupAccount/components/record.vue
  24. 1 1
      src/views/recruit/enterprise/systemManagement/postManagement/index.vue
  25. 2 2
      src/views/recruit/enterprise/systemManagement/postManagement/save.vue
  26. 1 0
      src/views/recruit/enterprise/systemManagement/userManagement/index.vue
  27. 2 1
      src/views/recruit/enterprise/talentMap/index.vue
  28. 35 17
      src/views/recruit/enterprise/talentPool/components/details.vue
  29. 2 5
      src/views/recruit/enterprise/talentPool/index.vue
  30. 35 8
      src/views/recruit/enterprise/talentRecommendation/components/filter.vue
  31. 8 7
      src/views/recruit/enterprise/talentRecommendation/index.vue
  32. 2 2
      src/views/recruit/enterprise/tradingOrder/components/pointsAndBalance.vue
  33. 4 2
      src/views/recruit/personal/home/components/advertisement/index.vue
  34. 12 6
      src/views/recruit/personal/home/index.vue
  35. 2 0
      src/views/recruit/personal/shareJob/form/simpleInfo.vue

+ 7 - 3
src/components/AreaSelect/index.vue

@@ -13,7 +13,7 @@
           @click:close="handleClick(k)"
         >{{ k.name }}</v-chip>
       </div>
-      <div class="rightCard">
+      <div class="rightCard" :style="{'width': isMobile ? '100%' : '786px', 'height': isMobile ? '300px' : '384px'}">
         <div v-for="item in items" :key="item.id">
           <div class="rowItem d-flex">
             <div class="categoryName2">{{ item.name }}</div>
@@ -55,6 +55,10 @@ const props = defineProps({
   currentData: {
     type: Array,
     default: () => []
+  },
+  isMobile: {
+    type: Boolean,
+    default: false
   }
 })
 
@@ -102,8 +106,8 @@ const handleClick = (val) => {
 .card { border-radius: 12px; }
 .rightCard {
   position: relative;
-  height: 384px;
-  width: 786px;
+  // height: 384px;
+  // width: 786px;
   margin: 4px 0;
   padding: 0 16px;
   overflow-y: auto;

+ 1 - 1
src/components/CtTable/index.vue

@@ -116,7 +116,7 @@ defineProps({
   },
   noDataText: {
     type: String,
-    default: 'No data available'
+    default: '暂无数据'
   },
   showSelect: {
     type: Boolean,

+ 1 - 1
src/components/Enterprise/hotPromoted.vue

@@ -115,7 +115,7 @@ const handleMoreEnterprise = (item) => {
 .company-info {
   float: left;
   margin-left: 16px;
-  width: 282px;
+  width: 262px;
 }
 .company-info-top {
   display: flex;

+ 2 - 2
src/components/personalRecharge/index.vue

@@ -31,10 +31,10 @@
               <input
                 v-model="inputValue" 
                 type="text"
-                class="custom-input-num"
+                class="custom-input-num mr-1"
                 :placeholder="item.placeholder"
                 :style="{'color': current === (index + 1) ? '#ff4747' : '#000'}" 
-              >
+              >
             </span>
             <span v-else>¥{{ FenYuanTransform(item.payPrice) }}</span>
           </div>

+ 1 - 0
src/config/axios/service.js

@@ -250,6 +250,7 @@ const handleAuthorized = () => {
 
   // const path = router.currentRoute.value.fullPath
   // const hasRecommendedPath = path.includes('/recruit/enterprise/talentRecommendation')
+  // console.log(hasRecommendedPath, router.currentRoute.value, '登录过期')
 
   if (!isReLogin.show) {
     // 人才推荐页面不需要弹窗提示

+ 8 - 8
src/views/about/index.vue

@@ -15,7 +15,7 @@
       </div>
       <div class="py-15">
         <v-divider></v-divider>
-        <h1 class="title mt-15">学术和行业之声</h1>
+        <h1 class="title mt-15">门墩儿合伙人</h1>
         <div class="mt-10">
           <div v-for="(val, i) in introduce" :key="i" :style="{'text-align': i % 2 === 0 ? 'left' : 'right'}" class="py-15 bole-item">
             <div class="left">
@@ -106,13 +106,13 @@ const introduce = [
     avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%879.png',
     desc: '找到对的门,认识对的人. 门墩儿,比酒店人更懂酒店人,从这里开启不同的圈层,打开职业生涯你不敢想象的可能!'
   },
-  {
-    name: 'Henry Sun 孙伟杰',
-    job: '创始人',
-    company: 'Mentor共享教室',
-    avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%8710.png',
-    desc: 'What a day and milestone for Chinese hospitality industry! Congratulations to Simon and his team on providing this great platform to hoteliers, where we will no longer feel alone when building our careers. Knowing someone experienced and knowledgeable is there for us, our fellow hoteliers, is fantastic and extremely helpful. Go Menduner!'
-  }
+  // {
+  //   name: 'Henry Sun 孙伟杰',
+  //   job: '创始人',
+  //   company: 'Mentor共享教室',
+  //   avatar: 'https://minio.citupro.com/dev/menduner/home/about/%E5%9B%BE%E7%89%8710.png',
+  //   desc: 'What a day and milestone for Chinese hospitality industry! Congratulations to Simon and his team on providing this great platform to hoteliers, where we will no longer feel alone when building our careers. Knowing someone experienced and knowledgeable is there for us, our fellow hoteliers, is fantastic and extremely helpful. Go Menduner!'
+  // }
 ]
 </script>
 

+ 9 - 7
src/views/headhunting/components/content.vue

@@ -89,16 +89,18 @@
         <div class="left">
           <h2>欢迎关注,了解门墩儿的新动态。</h2>
           <p class="mt-3" style="font-size: .9rem;">门墩儿在所有主流社交媒体都有账号。欢迎关注我们,以便了解关于发展趋势和领导力问题的最新见解。</p>
-          <div class="social-contact mt-5">
-            <p class="mb-2">联系方式</p>
-            <p>猎头顾问: 姚嘉庆 Julia</p>
-            <p>邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱:Julia.yao@menduner.com</p>
-            <p>手&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机:18501626969</p>
-            <div class="mt-5 text-center">
+          <div class="d-flex align-center social-contact mt-5 justify-space-between">
+            <div>
+              <p class="mb-2">联系方式</p>
+              <p>猎头顾问: 姚嘉庆 Julia</p>
+              <p>邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱:Julia.yao@menduner.com</p>
+              <p>手&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机:18501626969</p>
+            </div>
+            <div class="text-center">
               <div style="width: 120px; height: 120px; margin: auto;">
                 <v-img class="ml-2" cover aspect-ratio="1/1" src="https://minio.citupro.com/dev/menduner/official-account-code4.jpg" width="120" height="120"></v-img>
               </div>
-              <span class="tips-text ml-6">关注门墩儿微信公众号</span>
+              <div class="tips-text ml-4">门墩儿公众号</div>
             </div>
           </div>
         </div>

+ 1 - 0
src/views/mall/components/table.vue

@@ -7,6 +7,7 @@
     hover
     height="60vh"
     item-value="id"
+    no-data-text="暂无数据"
   >
     <template #bottom></template>
   </v-data-table>

+ 1 - 0
src/views/mall/purchasePackage/index.vue

@@ -28,6 +28,7 @@
       <v-data-table
         :items="!type ? personalItems : enterpriseItems"
         :headers="headers"
+        no-data-text="暂无数据"
       > 
         <template v-slot:[`item.equity`]="{ item }">
           <span class="font-weight-bold font-size-14">{{ item.equity }}</span>

+ 1 - 0
src/views/publicRecruitment/components/integralTable.vue

@@ -7,6 +7,7 @@
     hover
     height="60vh"
     item-value="id"
+    no-data-text="暂无数据"
   >
     <template #bottom></template>
   </v-data-table>

+ 1 - 0
src/views/publicRecruitment/components/table.vue

@@ -6,6 +6,7 @@
     :headers="headers"
     hover
     item-value="id"
+    no-data-text="暂无数据"
   >
     <template #bottom></template>
     <template v-slot:item.name="{ item }">

+ 4 - 2
src/views/recruit/enterprise/hirePosition/components/item.vue

@@ -32,11 +32,13 @@
       <div class="bottom pa-5 d-flex justify-space-between align-center">
         <div>
           {{ $t('position.refreshTime') }} :{{ timesTampChange(val.updateTime, 'Y-M-D') }}
-          <span v-if="val.expireDay && Number(val.expireDay) > 0">({{ val.expireDay }}天后到期)</span>
+          <span v-if="val.expireTime">
+            <span class="septal-line"></span>
+            到期时间:{{ timesTampChange(val.expireTime, 'Y-M-D') }}
+          </span>
         </div>
         <div class="d-flex align-center">
           <span v-if="(val.status-0) === 99" class="cursor-pointer color-primary" @click="toPay(val)">去支付</span>
-          <span v-if="(val.status-0) === 99" class="lines"></span>
           <span v-if="(val.status - 0) !== 99 && val.status !== '1'" class="cursor-pointer actions" @click="handleAction(0, val)">{{ $t('common.close') }}</span>
           <span v-if="(val.status - 0) !== 99 && val.status !== '1'" class="lines"></span>
           <span v-if="tab === 1" class="cursor-pointer" @click="handleEdit(val)">编辑</span>

+ 10 - 8
src/views/recruit/enterprise/hirePosition/components/jobRequirements.vue

@@ -83,13 +83,13 @@ const items = ref({
       type: 'autocomplete',
       key: 'eduType',
       value: null,
-      label: '最高学历 *',
+      label: '要求学历 *',
       itemText: 'label',
       itemValue: 'value',
       col: 4,
       flexStyle: 'mx-3',
       dictTypeName: 'menduner_education_type',
-      rules: [v => !!v || '请选择最高学历'],
+      rules: [v => !!v || '请选择要求学历'],
       items: []
     },
     {
@@ -121,8 +121,9 @@ const items = ref({
           return '数额不得小于1'
         },
         value => {
-          if (value < items.value.options.find(e => e.key === 'payTo').value) return true
-          return '不得大于最高薪资'
+          const payTo = items.value.options.find(e => e.key === 'payTo').value
+          if (Number(value) < payTo ? Number(payTo) : 0) return true
+          return '应低于最高薪资'
         }
       ]
     },
@@ -144,8 +145,9 @@ const items = ref({
           return '数额不得小于1'
         },
         value => {
-          if (value > items.value.options.find(e => e.key === 'payFrom').value) return true
-          return '不得小于最高薪资'
+          const payFrom = items.value.options.find(e => e.key === 'payFrom').value
+          if (Number(value) > payFrom ? Number(payFrom) : 0) return true
+          return '应高于最低薪资'
         }
       ]
     },
@@ -153,12 +155,12 @@ const items = ref({
       type: 'autocomplete',
       key: 'payUnit',
       value: null,
-      label: '薪酬单位 *',
+      label: '计薪时段 *',
       itemText: 'label',
       itemValue: 'value',
       col: 4,
       dictTypeName: 'menduner_pay_unit',
-      rules: [v => !!v || '请选择薪酬单位'],
+      rules: [v => !!v || '请选择计薪时段'],
       items: []
     },
     {

+ 3 - 1
src/views/recruit/enterprise/interviewManagement/components/invite.vue

@@ -34,7 +34,9 @@ const props = defineProps({
 
 // 过去的日期不可选
 const disabledDates = (date) => {
-  return date.getTime() < new Date().getTime()
+  const currentDate = new Date()
+  currentDate.setDate(currentDate.getDate() - 1)
+  return date.getTime() < currentDate.getTime()
 }
 
 const CtFormRef = ref()

+ 3 - 1
src/views/recruit/enterprise/personnelManagement/components/invite.vue

@@ -30,7 +30,9 @@ const props = defineProps({
 
 // 过去的日期不可选
 const disabledDates = (date) => {
-  return date.getTime() < new Date().getTime()
+  const currentDate = new Date()
+  currentDate.setDate(currentDate.getDate() - 1)
+  return date.getTime() < currentDate.getTime()
 }
 
 const CtFormRef = ref()

+ 1 - 0
src/views/recruit/enterprise/personnelManagement/components/table.vue

@@ -7,6 +7,7 @@
       hover
       :disable-sort="true"
       height="60vh"
+      no-data-text="暂无数据"
       item-value="id"
     >
       <template #bottom></template>

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

@@ -46,7 +46,10 @@
       <div class="bottom pa-5 d-flex justify-space-between align-center">
         <div>
           {{ $t('position.refreshTime') }} :{{ timesTampChange(val.updateTime, 'Y-M-D') }}
-          <span v-if="val.expireDay && Number(val.expireDay) > 0">({{ val.expireDay }}天后到期)</span>
+          <span v-if="val.expireTime">
+            <span class="septal-line"></span>
+            到期时间:{{ timesTampChange(val.expireTime, 'Y-M-D') }}
+          </span>
         </div>
         <div class="d-flex">
           <div class="ml-10 d-flex">

+ 13 - 11
src/views/recruit/enterprise/positionManagement/components/jobRequirements.vue

@@ -83,13 +83,13 @@ const items = ref({
       type: 'autocomplete',
       key: 'eduType',
       value: null,
-      label: '最高学历 *',
+      label: '学历要求 *',
       itemText: 'label',
       itemValue: 'value',
       col: 4,
       flexStyle: 'mx-3',
       dictTypeName: 'menduner_education_type',
-      rules: [v => !!v || '请选择最高学历'],
+      rules: [v => !!v || '请选择学历要求'],
       items: []
     },
     {
@@ -105,7 +105,7 @@ const items = ref({
       items: []
     },
     {
-      type: 'text',
+      type: 'number',
       key: 'payFrom',
       value: '',
       col: 4,
@@ -121,15 +121,16 @@ const items = ref({
           return '数额不得小于1'
         },
         value => {
-          if (value < items.value.options.find(e => e.key === 'payTo').value) return true
-          return '不得大于最高薪资'
+          const payTo = items.value.options.find(e => e.key === 'payTo').value
+          if (Number(value) < payTo ? Number(payTo) : 0) return true
+          return '应低于最高薪资'
         }
       ]
     },
     {
-      type: 'text',
+      type: 'number',
       key: 'payTo',
-      value: '10',
+      value: '',
       col: 4,
       label: '最高薪资 *',
       flexStyle: 'mx-3',
@@ -144,8 +145,9 @@ const items = ref({
           return '数额不得小于1'
         },
         value => {
-          if (value > items.value.options.find(e => e.key === 'payFrom').value) return true
-          return '不得小于最高薪资'
+          const payFrom = items.value.options.find(e => e.key === 'payFrom').value
+          if (Number(value) > payFrom ? Number(payFrom) : 0) return true
+          return '应高于最低薪资'
         }
       ]
     },
@@ -153,12 +155,12 @@ const items = ref({
       type: 'autocomplete',
       key: 'payUnit',
       value: null,
-      label: '薪酬单位 *',
+      label: '计薪时段 *',
       itemText: 'label',
       itemValue: 'value',
       col: 4,
       dictTypeName: 'menduner_pay_unit',
-      rules: [v => !!v || '请选择薪酬单位'],
+      rules: [v => !!v || '请选择计薪时段'],
       items: []
     },
     {

+ 3 - 1
src/views/recruit/enterprise/resume/components/invite.vue

@@ -32,7 +32,9 @@ const props = defineProps({
 
 // 过去的日期不可选
 const disabledDates = (date) => {
-  return date.getTime() < new Date().getTime()
+  const currentDate = new Date()
+  currentDate.setDate(currentDate.getDate() - 1)
+  return date.getTime() < currentDate.getTime()
 }
 
 const CtFormRef = ref()

+ 10 - 10
src/views/recruit/enterprise/resume/components/table.vue

@@ -8,6 +8,7 @@
       :disable-sort="true"
       height="60vh"
       item-value="id"
+      no-data-text="暂无数据"
     >
       <template #bottom></template>
       <template v-slot:[`item.name`]="{ item }">
@@ -93,20 +94,18 @@ const headers = ref([
   { 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.type === '0' ? '普通职位' : '赏金职位' }
+const unfit = { title: '类型', key: 'unfitType', sortable: false, value: item => item.type && item.type === '0' ? '简历不适合' : '面试不适合' }
+const delivery = { title: '类型', key: 'deliveryType', sortable: false, value: item => item?.job?.hire ? '赏金职位' : '普通职位' }
 
-const list = [0, 4]
 watch(
   () => props.tab,
   (val) => {
-    if (list.indexOf(val) !== -1) {
-      headers.value.splice(-1, 0, val === 0 ? delivery : unfit)
-    } else {
-      const index = headers.value.indexOf(item => item.key === val === 0 ? 'deliveryType' : 'unfitType')
-      if (index !== -1) headers.value.splice(index, 1)
-    }
-  // 不合适不需要展示状态
+    const obj = val !== 4 ? delivery : unfit
+    const index = headers.value.indexOf(obj)
+    if (index === -1) headers.value.splice(-1, 0, obj)
+    else headers.value.splice(index, 1)
+
+    // 不合适不需要展示状态
     if (val === 4) {
       const obj = headers.value.find(e => e.key === 'status')
       const i = headers.value.indexOf(obj)
@@ -164,6 +163,7 @@ const handleCancelEliminate = async (item) => {
 const handlePreviewResume = async ({ url, id }) => {
   if (!url || !id) return
   await personJobCvLook(id)
+  emit('refresh')
   previewFile(url)
 }
 

+ 15 - 15
src/views/recruit/enterprise/search/recommend/index.vue

@@ -30,9 +30,9 @@
           <span class="defaultLink ml-3 mt-2">{{ item?.name }}</span>
         </div>
       </template>
-      <template #actions="{ item }">
+      <!-- <template #actions="{ item }">
         <v-btn color="primary" variant="text" @click="handleCommunicate(item)">立即沟通</v-btn>
-      </template>
+      </template> -->
     </CtTable>
   </div>
 </template>
@@ -42,20 +42,20 @@ defineOptions({ name: 'searchRecommend' })
 import { ref, computed } from 'vue'
 import { getPersonRecommendPage, getJobAdvertised } from '@/api/enterprise'
 import { timesTampChange } from '@/utils/date'
-import { talkToUser, defaultTextEnt } from '@/hooks/web/useIM'
-import { useRouter } from 'vue-router'
+// import { talkToUser, defaultTextEnt } from '@/hooks/web/useIM'
+// import { useRouter } from 'vue-router'
 import { dealDictArrayData } from '@/utils/position'
 import { getUserAvatar } from '@/utils/avatar'
 
-const router = useRouter()
+// const router = useRouter()
 const query = ref({
   pageNo: 1,
   pageSize: 10,
   jobId: null
 })
 const selectItems = ref({
-  label: '推荐的职位',
-  placeholder: '请选择要进行推荐的职位',
+  label: '已发布职位',
+  placeholder: '请选择已发布职位',
   clearable: true,
   width: 600,
   items: []
@@ -72,7 +72,7 @@ const headers = ref([
   { title: '户籍地', key: 'regName', sortable: false },
   { title: '婚姻状况', key: 'maritalStatusName', sortable: false },
   { title: '首次工作时间', key: 'firstWorkTime', sortable: false, value: item => timesTampChange(item.firstWorkTime, 'Y-M-D') },
-  { title: '操作', key: 'actions', sortable: false }
+  // { title: '操作', key: 'actions', sortable: false }
 ])
 
 // 职位列表
@@ -103,7 +103,7 @@ const getData = async () => {
     loading.value = false
   }
 }
-getData()
+// getData()
 
 // 推荐
 const handleChange = () => {
@@ -118,12 +118,12 @@ const handleChangePage = (e) =>{
 }
 
 // 立即沟通
-const handleCommunicate = async (item) => {
-  const userId = item.userId
-  await talkToUser({userId, text: defaultTextEnt})
-  let url = `/recruit/enterprise/chatTools?id=${userId}`
-  router.push(url)
-}
+// const handleCommunicate = async (item) => {
+//   const userId = item.userId
+//   await talkToUser({userId, text: defaultTextEnt})
+//   let url = `/recruit/enterprise/chatTools?id=${userId}`
+//   router.push(url)
+// }
 
 // 人才详情
 const handleToPersonDetail = ({ userId, id }) => {

+ 12 - 12
src/views/recruit/enterprise/search/retrieval/index.vue

@@ -50,9 +50,9 @@
           <span class="defaultLink ml-3 mt-2">{{ item?.name }}</span>
         </div>
       </template>
-      <template #actions="{ item }">
+      <!-- <template #actions="{ item }">
         <v-btn color="primary" variant="text" @click="handleCommunicate(item)">立即沟通</v-btn>
-      </template>
+      </template> -->
     </CtTable>
   </div>
 </template>
@@ -67,10 +67,10 @@ import { getPersonSearchPage } from '@/api/enterprise.js'
 import { dealDictArrayData } from '@/utils/position'
 import { timesTampChange } from '@/utils/date'
 import { getUserAvatar } from '@/utils/avatar'
-import { talkToUser, defaultTextEnt } from '@/hooks/web/useIM'
-import { useRouter } from 'vue-router'
+// import { talkToUser, defaultTextEnt } from '@/hooks/web/useIM'
+// import { useRouter } from 'vue-router'
 
-const router = useRouter()
+// const router = useRouter()
 const textItem = ref({
   type: 'text',
   width: 600,
@@ -103,7 +103,7 @@ const headers = ref([
   { title: '首次工作时间', key: 'firstWorkTime', sortable: false, value: item => timesTampChange(item.firstWorkTime, 'Y-M-D') },
   // { title: '联系电话', key: 'phone', sortable: false },
   // { title: '常用邮箱', key: 'email', sortable: false },
-  { title: '操作', key: 'actions', sortable: false }
+  // { title: '操作', key: 'actions', sortable: false }
 ])
 
 const getData = async () => {
@@ -151,12 +151,12 @@ const handleClear = () => {
 }
 
 // 立即沟通
-const handleCommunicate = async (item) => {
-  const userId = item.userId
-  await talkToUser({userId, text: defaultTextEnt})
-  let url = `/recruit/enterprise/chatTools?id=${userId}`
-  router.push(url)
-}
+// const handleCommunicate = async (item) => {
+//   const userId = item.userId
+//   await talkToUser({userId, text: defaultTextEnt})
+//   let url = `/recruit/enterprise/chatTools?id=${userId}`
+//   router.push(url)
+// }
 
 // 人才详情
 const handleToPersonDetail = ({ userId, id }) => {

+ 1 - 0
src/views/recruit/enterprise/systemManagement/groupAccount/components/record.vue

@@ -6,6 +6,7 @@
       color="#00897B"
       :items="tableData"
       :headers="headers"
+      no-data-text="暂无数据"
     >
       <template #bottom>
         <CtPagination

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

@@ -41,7 +41,7 @@ const headers = [
   { title: '岗位名称', key: 'nameCn', sortable: false },
   { title: '英文名称', key: 'nameEn', sortable: false },
   { title: '岗位缩写', key: 'code', sortable: false },
-  { title: '显示顺序', key: 'sort', sortable: false },
+  { title: '岗位级别', key: 'sort', sortable: false },
   { title: '状态', key: 'status', value: item => item.status === '1' ? '停用' : '正常', sortable: false },
   { title: '备注', key: 'remark', sortable: false },
   { title: '更新时间', key: 'updateTime', value: item => timesTampChange(item.updateTime), sortable: false },

+ 2 - 2
src/views/recruit/enterprise/systemManagement/postManagement/save.vue

@@ -58,8 +58,8 @@ const items = ref({
       type: 'number',
       key: 'sort',
       value: null,
-      label: '显示顺序 *',
-      rules: [v => !!v || '请填写显示顺序']
+      label: '岗位级别 *',
+      rules: [v => !!v || '请填写岗位级别']
     },
     {
       type: 'text',

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

@@ -11,6 +11,7 @@
       hide-default-header
       height="70vh"
       item-value="id"
+      no-data-text="暂无数据"
     >
       <template #bottom></template>
       <template v-slot:item.actions="{ item }">

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

@@ -57,8 +57,9 @@
       hover
       :disable-sort="true"
       :loading="loading"
-      loading-text="Loading... Please wait"
+      loading-text="加载中..."
       item-value="id"
+      no-data-text="暂无数据"
     >
       <template #bottom></template>
       <template v-slot:[`item.name`]="{ item }">

+ 35 - 17
src/views/recruit/enterprise/talentPool/components/details.vue

@@ -39,25 +39,20 @@
         <span class="mr-6">{{ $t('resume.educationExp') }}</span>
         <educationExp style="flex: 1;" :data="cvData.eduList"></educationExp>
       </div>
-      <!-- 附件简历 -->
-      <!-- <div class="d-flex mt-8">
-        <span class="mr-6">{{ $t('resume.attachmentResume') }}</span>
-        <attachmentResume style="flex: 1;"></attachmentResume>
-      </div> -->
     </div>
-    <!-- <div class="operate pa-3">
+    <div class="operate pa-3">
       <v-list>
-        <v-list-subheader class="title">简历助手</v-list-subheader>
+        <v-list-subheader class="title">操作</v-list-subheader>
         <v-list-item
-          v-for="(item, i) in operateItems" :key="'简历助手' + i"
+          v-for="(item, i) in operateItems" :key="'操作' + i"
           color="primary"
           :prepend-icon="item.icon"
           :title="item.text"
-          @click="{}"
+          @click="handleCommunicate(item)"
         >
         </v-list-item>
       </v-list>
-    </div> -->
+    </div>
   </div>
 </template>
 
@@ -73,17 +68,20 @@ import educationExp from './details/educationExp.vue'
 // import attachmentResume from './details/attachmentResume.vue'
 import { getPersonCvDetail } from '@/api/enterprise'
 import { ref } from 'vue'
+import { talkToUser, defaultTextEnt } from '@/hooks/web/useIM'
 import { useRouter, useRoute } from 'vue-router'
+import { getJobAdvertisedList } from '@/api/position'
+import Snackbar from '@/plugins/snackbar'
 
 const route = useRoute()
 const router = useRouter()
-// const operateItems = [
-//   { text: '邀请面试', icon: 'mdi-account-check' },
-//   { text: '不合适', icon: 'mdi-close-circle-outline' },
-//   { text: '发起对话', icon: 'mdi-chat-processing-outline' },
-//   { text: '加入人才库', icon: 'mdi-tab-plus' },
-//   { text: '操作记录', icon: 'mdi-clock-edit-outline' },
-// ]
+const operateItems = [
+  // { text: '邀请面试', icon: 'mdi-account-check' },
+  // { text: '不合适', icon: 'mdi-close-circle-outline' },
+  { text: '立即沟通', icon: 'mdi-chat-processing-outline' },
+  // { text: '加入人才库', icon: 'mdi-tab-plus' },
+  // { text: '操作记录', icon: 'mdi-clock-edit-outline' },
+]
 
 // 获取人才详情
 const cvData = ref({})
@@ -96,6 +94,26 @@ const getCvDetail = async () => {
 }
 getCvDetail()
 
+// 职位列表
+const jobNum = ref(0)
+const getJobList = async () => {
+  const { total } = await getJobAdvertisedList({ pageNo: 1, pageSize: 10, hasExpiredData: false, status: 0 })
+  jobNum.value = total
+}
+getJobList()
+
+// 立即沟通
+const handleCommunicate = async (item) => {
+  if (item.text !== '立即沟通') return
+  // 企业必须有招聘中的职位才能发起沟通
+  if (jobNum.value === 0) return Snackbar.warning('请先发布职位')
+  const userId = cvData.value.person.userId
+  if (!userId) return
+  await talkToUser({userId, text: defaultTextEnt})
+  let url = `/recruit/enterprise/chatTools?id=${userId}`
+  router.push(url)
+}
+
 </script>
 <style lang="scss" scoped>
 .operate {

+ 2 - 5
src/views/recruit/enterprise/talentPool/index.vue

@@ -4,7 +4,6 @@
       <div></div>
       <v-btn color="primary" prependIcon="mdi-filter-multiple-outline" class="half-button" variant="tonal" @click="openDrawer">筛选</v-btn>
     </div>
-    <div v-if="dataList?.length" class="mt-3">
       <v-data-table
         class="mt-3"
         :items="dataList"
@@ -12,6 +11,7 @@
         hover
         :disable-sort="true"
         item-value="id"
+        no-data-text="暂无数据"
       >
         <template #bottom></template>
         <template v-slot:[`item.name`]="{ item }">
@@ -35,17 +35,15 @@
         </template>
         <template v-slot:[`item.actions`]="{ item }">
           <v-btn color="primary" variant="text" @click="handleRemove(item)">移除</v-btn>
-          <v-btn color="primary" variant="text" @click="talentPoolDetails(item)">人才详情</v-btn>
         </template>
       </v-data-table>
       <CtPagination
+        v-if="total > 0"
         :total="total"
         :page="pageInfo.pageNo"
         :limit="pageInfo.pageSize"
         @handleChange="handleChangePage"
       ></CtPagination>
-    </div>
-    <Empty v-else :message="tipsText" :elevation="false" class="mt-15"></Empty>
 
     <v-navigation-drawer v-model="screen" location="right" absolute temporary width="700">
       <FilterPage
@@ -76,7 +74,6 @@ let query = {}
 const screen = ref(false)
 const dataList = ref([])
 // dataList.value = [] // 暂定无数据展示
-const tipsText = ref('暂无数据')
 const total = ref(2)
 const pageInfo = reactive({ pageNo: 1, pageSize: 10 })
 

+ 35 - 8
src/views/recruit/enterprise/talentRecommendation/components/filter.vue

@@ -1,18 +1,32 @@
 <template>
-  <div style="max-height: 80vh; overflow-y: auto;">
+  <div style="max-height: 80vh;">
     <div class="d-flex align-center mt-5">
       <TextInput v-model="textItem.value" :item="textItem" @appendInnerClick="handleSearch"></TextInput>
       <span class="pl-6 color-666" style="width: 60px; min-width: 60px;" @click="emit('close')">取消</span>
     </div>
     <v-divider class="my-3"></v-divider>
+    <!-- 地区 -->
+    <!-- <div>
+      <div class="mb-2 font-size-20">地区</div>
+      <div class="color-666">
+        <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs" :close-on-content-click="false">
+          <template v-slot:activator="{  props }">
+            <div>
+              <v-chip v-for="k in areaSelect" :key="k.id" class="mr-3 mb-1" closable label size="small" @click:close="handleAreaClear(k)">{{ k.name }}</v-chip>
+              <v-btn icon="mdi-plus" v-bind="props" variant="outlined" size="x-small"></v-btn>
+            </div>
+          </template>
+          <AreaSelect :isMobile="true" :select="areaSelectData" :currentData="areaSelect" :limit="false" showSelect @handleClick="handleArea"></AreaSelect>
+        </v-menu>
+      </div>
+    </div> -->
     <!-- 职位 -->
-    <div class="mb-3">
+    <div class="my-3">
       <div class="mb-2 font-size-20">职位</div>
       <div class="d-flex font-size-14 flex-wrap">
         <div v-for="val in items" :key="val.id" class="mr-2 tag mb-2" :class="{'active': val.active}" @click="handleFirst(val)">{{ val.nameCn }}</div>
       </div>
-      <div v-if="children.length" class="mx-3" style="border-top: 1px dashed #ccc;"></div>
-      <div v-if="children.length" class="mt-5 font-size-14 d-flex flex-wrap triangle-container pa-3">
+      <div v-if="children.length" class="mt-1 font-size-14 d-flex flex-wrap triangle-container pa-3">
         <div 
           v-for="k in children" 
           :key="k.id" 
@@ -25,7 +39,7 @@
     <!-- 最高学历、工作经验 -->
     <div v-for="val in list" :key="val.key" class="mb-3">
       <div class="mb-2 font-size-20">{{ val.title }}</div>
-      <v-chip-group v-model="val.value" selected-class="text-primary" mandatory @update:modelValue="e => val.value = e" class="flex-wrap">
+      <v-chip-group v-model="val.value" selected-class="text-primary" mandatory @update:modelValue="e => val.value = e" class="flex-wrap color-666">
         <v-chip v-for="val in val.items" :key="val.id" :text="val.label" :value="val.value" label filter></v-chip>
       </v-chip-group>
     </div>
@@ -91,7 +105,6 @@ getDict('positionTreeData', {}, 'positionTreeData').then(({ data }) => {
     return e
   })
 })
-
 const children = ref([])
 const handleFirst = (val) => {
   if (val.active) {
@@ -104,12 +117,10 @@ const handleFirst = (val) => {
   val.active = !val.active
   children.value = val.children || []
 }
-
 const handleSearch = () => {
   query.value.content = textItem.value.value
   emit('search', query.value)
 }
-
 const select = ref([])
 const handleSecond = (val) => {
   const index = select.value.findIndex(e => e.id === val.id)
@@ -120,6 +131,19 @@ const handleSecond = (val) => {
   // emit('select', select.value)
 }
 
+// 地区
+// const areaSelect = ref([])
+// const areaSelectData = ref([])
+// const handleArea = (list, arr) => {
+//   areaSelectData.value = list
+//   areaSelect.value = arr
+// }
+// const handleAreaClear = (k) => {
+//   areaSelectData.value = areaSelectData.value.filter(item => item !== k.id)
+//   const index = areaSelect.value.findIndex(item => item.id === k.id)
+//   if (index !== -1) areaSelect.value.splice(index, 1)
+// }
+
 // 重置
 const handleReset = () => {
   query.value = {
@@ -129,6 +153,8 @@ const handleReset = () => {
     expType: '',
     eduType: ''
   }
+  // areaSelectData.value = []
+  // areaSelect.value = []
   select.value = []
   list.value.forEach(e => e.value = -1)
   items.value.forEach(e => e.active = false)
@@ -136,6 +162,7 @@ const handleReset = () => {
 }
 const handleConfirm = () => {
   query.value.content = textItem.value.value
+  // query.value.areaIds = areaSelectData.value
   query.value.positionIds = select.value.map(e => e.id)
   list.value.forEach(e => query.value[e.key] = e.value === -1 ? '' : e.value)
   emit('search', query.value)

+ 8 - 7
src/views/recruit/enterprise/talentRecommendation/index.vue

@@ -2,7 +2,7 @@
   <div>
     <div v-if="!getToken(1)" class="login-content">
       <div class="login-content-box pa-10">
-        <div class="login-content-box-title text-center mt-4">请登录您的企业账号</div>
+        <div class="login-content-box-title text-center mt-4">请登录您的企业账号</div>
         <passwordFrom class="mt-10" ref="passRef" placeholder="请输入企业邮箱" :validEmail="true"></passwordFrom>
         <v-btn :loading="loading" color="primary" class="white--text mt-5" min-width="340" @click="handleLogin">登录</v-btn>
       </div>
@@ -34,7 +34,7 @@
             <div class="bg-box" v-if="index !== items.length - 1"></div>
           </div>
         </div>
-        <Empty v-else :elevation="false" message="暂无数据,请更换搜索条件后再试"></Empty>
+        <Empty v-else :elevation="false" message="暂无数据"></Empty>
       </v-card>
     </div>
 
@@ -54,7 +54,7 @@ import passwordFrom from '@/views/login/components/passwordPage.vue'
 import Snackbar from '@/plugins/snackbar'
 import { useUserStore } from '@/store/user'
 import { passwordLogin } from '@/api/common'
-import { getPersonRecommendPage, getJobAdvertised, getPersonSearchPage } from '@/api/enterprise'
+import { getJobAdvertised, getPersonSearchPage } from '@/api/enterprise'
 import { dealDictArrayData } from '@/utils/position'
 import { getUserAvatar } from '@/utils/avatar'
 import { useRouter } from 'vue-router'
@@ -81,7 +81,7 @@ const textItem = ref({
   type: 'text',
   width: 600,
   value: '',
-  label: '输入关键词搜索',
+  label: '输入关键词搜索',
   clearable: false,
   readonly: true,
   appendInnerIcon: 'mdi-magnify'
@@ -122,7 +122,7 @@ const getData = async (isEmpty) => {
     loading.value = false
   }
 }
-if (getToken(1)) getData()
+// if (getToken(1)) getData()
 
 // 底部加载
 const handleScroll = (e) => {
@@ -149,7 +149,7 @@ const handleLogin = async () => {
     const data = await passwordLogin({ ...passRef.value.loginData, account: passRef.value.loginData.phone })
     await useUserStore().changeRole({ ...data, type: 'emailLogin', noJump: true })
     await getJobList()
-    await getData()
+    // await getData()
   } catch (err) {
     Snackbar.warning(err.msg)
   } finally {
@@ -167,11 +167,12 @@ const handleDetail = ({ userId, id }) => {
 const filterRef = ref()
 const screen = ref(false)
 const openDrawer = () => {
+  if (!getToken(1)) return
   screen.value = true
 }
 
 const handleSearch = (val) => {
-  console.log(val, 'search')
+  // console.log(val, 'search')
   screen.value = false
   textItem.value.value = val.content
   query.value.pageNo = 1

+ 2 - 2
src/views/recruit/enterprise/tradingOrder/components/pointsAndBalance.vue

@@ -20,9 +20,9 @@
               <input
                 v-model="inputValue" 
                 type="text"
-                class="custom-input-num"
+                class="custom-input-num mr-1"
                 :placeholder="item.placeholder"
-              >
+              >
             </span>
             <span class="font28" v-else>¥{{ FenYuanTransform(item.payPrice) }}</span>
           </div>  

+ 4 - 2
src/views/recruit/personal/home/components/advertisement/index.vue

@@ -9,7 +9,7 @@
     </div>
 
     <div no-gutters class="mt-5 d-flex flex-wrap" style="width: 100%;">
-      <v-card v-for="(k, i) in list" :key="i" class="col-item" @click="handleOpen">
+      <v-card v-for="(k, i) in list" :key="i" class="col-item" @click="handleOpen(i)">
         <v-img :src="k.url"/>
       </v-card>
     </div>
@@ -25,7 +25,9 @@ const list = [
   { url: 'https://minio.citupro.com/dev/menduner/preferredGroup/Yifei.jpg' }
 ]
 
-const handleOpen = () => {
+const handleOpen = (index) => {
+  // 目前只有洲际有集团展示页面
+  if (index !== 1) return
   const id = 1
   window.open(`/recruit/personal/advertisement/introduce/${id}`)
 }

+ 12 - 6
src/views/recruit/personal/home/index.vue

@@ -6,12 +6,12 @@
       <headSearch @handleSearch="handleSearch"></headSearch>
     </div>
     <hotJobs></hotJobs>
-    <div class="advertise ml-3">
+    <div class="advertise">
       <div class="advertise-title">广告</div>
       <img class="advertise-img cursor-pointer" :src="advertiseUrl" @click="handleOpenAdvertise">
     </div>
-    <div class="default-width content-box">
-      <homeJobTypeCard></homeJobTypeCard>
+    <div class="common-width">
+      <homeJobTypeCard class="content-box"></homeJobTypeCard>
       <advertisementPage class="my-3"></advertisementPage>
       <hotPromotedPositions></hotPromotedPositions>
       <PopularEnterprises class="mt-10"></PopularEnterprises>
@@ -80,8 +80,8 @@ const handleOpenAdvertise = () => {
   position: sticky;
   top: 128px;
   z-index: 999;
-  width: 180px; 
-  height: 360px;
+  width: 120px; 
+  height: 310px;
   &-title {
     color: #000;
     font-size: 14px;
@@ -98,7 +98,7 @@ const handleOpenAdvertise = () => {
   }
 }
 .content-box {
-  margin-top: -360px;
+  margin-top: -310px;
 }
 .banner {
   width: 100%;
@@ -106,4 +106,10 @@ const handleOpenAdvertise = () => {
   background: url("@/assets/headerBg.jpg") no-repeat;
   background-size: contain;
 }
+.common-width {
+  width: 1160px;
+  max-width: 1160px;
+  min-width: 1160px;
+  margin: 0 auto;
+}
 </style>

+ 2 - 0
src/views/recruit/personal/shareJob/form/simpleInfo.vue

@@ -82,8 +82,10 @@ const getDictData = async (dictTypeName) => {
   }
 }
 
+const userInfo = ref(localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : {})
 items.value.options.forEach((e) => {
   if (e.dictTypeName) getDictData(e.dictTypeName) // 查字典set options
+  e.value = userInfo.value[e.key] // 回显
   // formItems回显
   // const infoExist = baseInfo.value && Object.keys(baseInfo.value).length
   // if (infoExist && baseInfo.value[e.key]) e.value = baseInfo.value[e.key]