瀏覽代碼

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

zhengnaiwen_citu 5 月之前
父節點
當前提交
2d0e655820

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

@@ -8,7 +8,7 @@
             <v-img :src="item?.enterprise.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" alt="" width="77" height="77" style="border-radius: 4px;"/>
           </div>
           <div class="company-info cursor-pointer">
-            <h3>{{ item.enterprise.anotherName }}</h3>
+            <h3>{{ item.enterprise.anotherName || item.enterprise.name }}</h3>
             <p>
               {{ item?.enterprise.scaleName }}
               <span class="septal-line" v-if="item.enterprise.industryName"></span>
@@ -24,14 +24,14 @@
           <li class="company-job-item" v-for="(k, i) in item.jobList" :key="i" :class="{'company-job-item-hover': k.active}" @mouseenter="k.active = true" @mouseleave="k.active = false" @click="handleClickPosition(k)">
             <div class="job-info" @mouseenter="k.active = true" @mouseleave="k.active = false" @click="handleClickPosition(k)">
               <div class="mb-2 d-flex">
-                <p :class="['name', 'cursor-pointer', {'default-active': k.active }]">{{ k.name }}</p>
+                <p :class="['name', 'cursor-pointer', {'default-active': k.active }]" :style="{'max-width': !k.payFrom && !k.payTo ? '290px' : '200px'}">{{ k.name }}</p>
                 <span v-if="!k.payFrom && !k.payTo" class="salary">面议</span>
                 <span v-else class="salary">{{ k.payFrom ? k.payFrom + '-' : '' }}{{ k.payTo }}{{ k.payName ? '/' + k.payName : '' }}</span>
               </div>
               <div style="height: 24px; overflow: hidden; color: #808080;">
                 <span v-for="(j, index) in desc" :key="index">
                   <span v-if="k[j.value] || (j.value === 'areaName' && !k.areaId)" class="mr-1 font-size-13">{{ (j.value === 'areaName' && !k.areaId) ? '全国' : k[j.value] }}</span>
-                  <span v-if="index !== desc.length - 1 && (k[desc[index + 1].value] || (j.value === 'areaName' && !k.areaId))" class="septal-line ml-1"></span>
+                  <span v-if="k[j.value] && index !== desc.length - 1 && (k[desc[index + 1].value] || (j.value === 'areaName' && !k.areaId))" class="septal-line ml-1"></span>
                 </span>
                 <span class="font-size-13 float-right">{{ timesTampChange(k.updateTime, 'Y-M-D') }}</span>
               </div>
@@ -179,7 +179,7 @@ ul li {
 }
 .name {
   position: relative;
-  max-width: 200px;
+  // max-width: 200px;
   line-height: 22px;
   font-weight: 700;
   color: #404040;

+ 3 - 5
src/components/Position/similarPositions.vue

@@ -2,7 +2,7 @@
   <div class="position-box">
     <h4 class="mb-3">{{ $t('position.similarPosition') }}</h4>
     <div v-for="(item, index) in props.list" :key="index" class="mb-2 cursor-pointer" @click="handlePosition(item)">
-      <p class="recruit-name">{{ item.name }}</p>
+      <p class="recruit-name" :style="{'max-width': !item.payFrom && !item.payTo ? '230px' : '140px'}">{{ item.name }}</p>
       <span v-if="!item.payFrom && !item.payTo" class="recruit-salary">面议</span>
       <span v-else class="recruit-salary">{{ item.payFrom ? item.payFrom + '-' : '' }}{{ item.payTo }}{{ item.payName ? '/' + item.payName :'' }}</span>
       <div :class="['enterprise', {'border-bottom-dashed': index !== list.length - 1}]">
@@ -37,10 +37,8 @@ const handlePosition = (item) => {
   padding: 20px 15px;
 }
 .recruit-name {
-  width: 95px;
   font-weight: 500;
   display: inline-block;
-  max-width: 95px;
   vertical-align: middle;
   white-space: nowrap;
   text-overflow: ellipsis;
@@ -62,9 +60,9 @@ const handlePosition = (item) => {
   margin-top: 8px;
 }
 .enterprise-name {
-  width: 120px;
+  width: 150px;
   display: inline-block;
-  max-width: 120px;
+  max-width: 150px;
   vertical-align: middle;
   white-space: nowrap;
   text-overflow: ellipsis;

+ 1 - 5
src/layout/company/navBar.vue

@@ -21,7 +21,7 @@
           <div class="d-flex align-center px-3 border-right cursor-pointer commonHover" @click="router.push('/recruit/enterprise/membershipPackage?key=1')">
             <div>剩余M豆:{{ enterpriseUserAccount?.balance ? enterpriseUserAccount?.balance / 100 : 0 }}个</div>
           </div>
-          <!-- <svg-icon @click="handleToVip" name="vip" size="30" class="cursor-pointer ml-3"></svg-icon> -->
+          <svg-icon v-if="baseInfo?.vipFlag" name="vip" size="30" class="ml-3"></svg-icon>
           
           <!-- 头像用户名 -->
           <div class="d-flex align-center" v-if="showBall">
@@ -109,10 +109,6 @@ onMounted(() => {
   }
 })
 
-// const handleToVip = () => {
-//   router.push({ path: '/recruit/enterprise/membershipPackage' })
-// }
-
 const handleLogoClick = () => { window.open('/recruitHome') } // 点击logo
 
 const enterpriseClick = (tabKey = 1) => {

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

@@ -112,6 +112,57 @@ const enterprise = [
       }
     ]
   },
+  {
+    path: '/recruit/enterprise/jobFair',
+    component: Layout,
+    name: 'jobFair',
+    meta: {
+      title: '招聘会',
+      enName: 'Job Fair',
+      icon: 'mdi-account-filter-outline'
+    },
+    children: [
+      {
+        path: '/recruit/enterprise/jobFair',
+        show: true,
+        meta: {
+          title: '招聘会',
+          enName: 'Job Fair'
+        },
+        component: () => import('@/views/recruit/enterprise/jobFair/index.vue')
+      },
+      {
+        path: '/recruit/enterprise/jobFair/details/:id',
+        show: true,
+        meta: {
+          title: '招聘会详情',
+          enName: 'Job Fair Details'
+        },
+        component: () => import('@/views/recruit/enterprise/jobFair/detailsBox.vue'),
+        children: [
+          {
+            path: '/recruit/enterprise/jobFair/details/:id',
+            show: true,
+            meta: {
+              title: '招聘会详情',
+              enName: 'Job Fair Details'
+            },
+            component: () => import('@/views/recruit/enterprise/jobFair/details.vue'),
+          },
+          {
+            path: '/recruit/enterprise/jobFair/details/:id/edit',
+            show: true,
+            meta: {
+              title: '职位编辑',
+              enName: 'Job Fair Edit'
+            },
+            component: () => import('@/views/recruit/enterprise/jobFair/editJob.vue')
+          }
+        ]
+      },
+      
+    ]
+  },
   {
     path: '/recruit/enterprise/talentPool',
     component: Layout,
@@ -303,57 +354,6 @@ const enterprise = [
       }
     ]
   },
-  {
-    path: '/recruit/enterprise/jobFair',
-    component: Layout,
-    name: 'jobFair',
-    meta: {
-      title: '招聘会',
-      enName: 'Job Fair',
-      icon: 'mdi-account-filter-outline'
-    },
-    children: [
-      {
-        path: '/recruit/enterprise/jobFair',
-        show: true,
-        meta: {
-          title: '招聘会',
-          enName: 'Job Fair'
-        },
-        component: () => import('@/views/recruit/enterprise/jobFair/index.vue')
-      },
-      {
-        path: '/recruit/enterprise/jobFair/details/:id',
-        show: true,
-        meta: {
-          title: '招聘会详情',
-          enName: 'Job Fair Details'
-        },
-        component: () => import('@/views/recruit/enterprise/jobFair/detailsBox.vue'),
-        children: [
-          {
-            path: '/recruit/enterprise/jobFair/details/:id',
-            show: true,
-            meta: {
-              title: '招聘会详情',
-              enName: 'Job Fair Details'
-            },
-            component: () => import('@/views/recruit/enterprise/jobFair/details.vue'),
-          },
-          {
-            path: '/recruit/enterprise/jobFair/details/:id/edit',
-            show: true,
-            meta: {
-              title: '职位编辑',
-              enName: 'Job Fair Edit'
-            },
-            component: () => import('@/views/recruit/enterprise/jobFair/editJob.vue')
-          }
-        ]
-      },
-      
-    ]
-  },
   {
     path: '/recruit/enterprise/membershipPackage',
     component: Layout,

+ 0 - 1
src/store/user.js

@@ -209,7 +209,6 @@ export const useUserStore = defineStore('user',
       async checkEnterpriseBaseInfo () {
         try {
           const data = await getEnterpriseBaseInfo()
-          console.log('获取《企业基本信息》:', data)
           if (data?.first !== false && data?.first !== 'false') {  // 首次登录才提示,不为false都属于首次登录
             localStorage.setItem('checkEnterpriseBaseInfoFalseHref', '/recruit/enterprise/entInfoSetting')
           }

+ 1 - 1
src/version.js

@@ -1,2 +1,2 @@
 // 版本号
-export const vue_version = 'v24.12.10.0948'
+export const vue_version = 'v24.12.10.1751'

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

@@ -18,12 +18,16 @@
         <span class="ml-2" style="color: #000000DE;">{{ item?.sendPerson?.name }}</span>
       </div>
     </template>
+    <template #hirePrice="{ item }">
+      {{ commissionCalculation(item?.job?.hirePrice / 100, 1) }}元
+    </template>
   </CtTable>
 </template>
 
 <script setup>
 defineOptions({ name: 'myPublicRecruitment-table-page'})
 import { timesTampChange } from '@/utils/date'
+import { commissionCalculation } from '@/utils/position'
 
 const emit = defineEmits(['page'])
 defineProps({
@@ -37,6 +41,7 @@ const headers = [
   { title: '牛人', value: 'sendPerson.name', key: 'name', sortable: false },
   { title: '应聘公司', key: 'enterprise.anotherName', sortable: false },
   { title: '应聘职位', key: 'job', value: item => item?.job?.name, sortable: false },
+  { title: '赏金', key: 'hirePrice', sortable: false },
   { title: '岗位薪资', key: 'salary', value: item => item?.job?.payFrom && item?.job?.payTo ? `${item?.job?.payFrom ? item?.job?.payFrom + '-' : ''}${item?.job?.payTo}` : '面议', sortable: false },
   { title: '推荐时间', key: 'createTime', value: item => timesTampChange(item.createTime), sortable: false },
 ]

+ 1 - 1
src/views/recruit/enterprise/jobFair/detailsBox.vue

@@ -14,7 +14,7 @@ const route = useRoute()
 
 const getMsg = async () => {
   const res = await getJobFair(route.params.id)
-  route.matched[1].meta.title = res.title.split('<p>').join('')
+  route.matched[1].meta.title = res.title.replace(/<\/?p[^>]*>/gi, '')
   system.setBreadcrumbs(route.matched, route.fullPath)
 }
 getMsg()

+ 3 - 4
src/views/recruit/enterprise/jobFair/editJob.vue

@@ -1,5 +1,5 @@
 <template>
-  <add :after-add="afterAdd" :valid="validate">
+  <add :after-add="afterAdd" :valid="validate" :isFair="true">
     <template #timeline>
       <v-timeline-item
           dot-color="light-blue darken-1"
@@ -16,7 +16,7 @@
 
 <script setup>
 defineOptions({ name: 'editJob' })
-import { ref, watch, computed } from 'vue'
+import { ref } from 'vue'
 import {  useRoute, useRouter } from 'vue-router'
 import CtForm from '@/components/CtForm'
 import Add from '@/views/recruit/enterprise/positionManagement/components/add.vue'
@@ -158,9 +158,8 @@ const afterAdd = async (jobId) => {
     Snackbar.success(t('common.publishSuccessMsg'))
     router.push(`/recruit/enterprise/jobFair/details/${route.params.id}`)
   } catch (error) {
-    console.log(error)
     console.error(error)
-    Snackbar.error(t('sys.api.operationFailed'))
+    Snackbar.error(error)
   }
 }
 </script>

+ 4 - 1
src/views/recruit/enterprise/jobFair/index.vue

@@ -1,15 +1,17 @@
 <template>
-  <v-card class="card-box pa-5 ">
+  <v-card v-if="list.length" class="card-box pa-5 ">
     <v-card v-for="(k, i) in list" :key="i" class="elevation-3">
       <img :src="k.pcHeadImg" style="width: 100%; height: 300px;">
       <div class="pa-5">
         <div class="color-primary font-weight-bold font-size-18 mb-1" v-html="k.title"></div>
+        <div class="color-666 mt-3">活动时间:{{ timesTampChange(k.startTime, 'Y-M-D') }}至{{ timesTampChange(k.endTime, 'Y-M-D') }}</div>
         <div class="text-end">
           <v-btn color="primary" variant="outlined" @click.stop="handleBlockEnterprise(k.id)">立即加入</v-btn>
         </div>
       </div>
     </v-card>
   </v-card>
+  <Empty v-else />
 </template>
 
 <script setup>
@@ -19,6 +21,7 @@ import { useRouter } from 'vue-router'
 import { getJobFairList } from '@/api/recruit/enterprise/jobFair'
 import { getCheckJobFairPermission } from '@/api/recruit/enterprise/jobFair'
 import Snackbar from '@/plugins/snackbar'
+import { timesTampChange } from '@/utils/date'
 
 const router = useRouter()
 const list = ref([])

+ 1 - 1
src/views/recruit/enterprise/jobFair/job/item.vue

@@ -2,7 +2,7 @@
   <div>
     <div v-if="items.length">
       <div v-for="val in items" :key="val.id" class="itemBox mb-3" style="height: 134px;">
-        <div class="d-flex justify-space-between cursor-pointer" style="padding: 10px 20px;" @click="handleEdit(val)">
+        <div class="d-flex justify-space-between cursor-pointer" style="padding: 10px 20px;">
           <div class="position">
             <div class="d-flex align-center">
               <span class="position-name">{{ val.name }}</span>

+ 16 - 4
src/views/recruit/enterprise/membershipPackage/dynamic/package.vue

@@ -23,6 +23,8 @@
     </v-slide-group-item>
   </v-slide-group>
 
+  <div v-if="!Object.keys(select).length" class="color-warning text-center mt-15 font-size-20">请选择要购买的套餐</div>
+
   <div v-if="payType && payQrCodeTxt" id="codeBox" class="code pa-5 resume-box">
     <div class="resume-header">
       <div class="resume-title">扫码支付</div>
@@ -82,7 +84,8 @@ import { useI18n } from '@/hooks/web/useI18n'; const { t } = useI18n()
 
 const current = ref()
 const select = ref({})
-const model = ref(0)
+const model = ref()
+const isMounted = ref(false)
 
 // 套餐列表
 const list = ref([])
@@ -90,7 +93,7 @@ const getPackageList = async () => {
   const data = await getEnterprisePackageList()
   list.value = data
   list.value.push({ id:'custom' })
-  select.value = data[0]
+  // select.value = data[0]
 }
 
 const showCustom = ref(false)
@@ -135,6 +138,7 @@ const payTypeChange = (val) => {
 }
 const timer = ref(null)
 onUnmounted(() => {
+  isMounted.value = false
   if (timer.value) clearInterval(timer.value); timer.value = null
 })
 
@@ -194,6 +198,13 @@ const paySubmit = async () => {
     }
     const res = await payOrderSubmit(params)
     if (!showCustom.value) payQrCodeTxt.value = res?.displayContent || '' // 生成二维码内容
+
+     // 离开当前页面后不执行
+    if (!isMounted.value) {
+      if (timer.value) clearInterval(timer.value); timer.value = null
+      return
+    }
+
     initIntervalFun()
     if (timer.value) clearInterval(timer.value); timer.value = null
     timer.value = setInterval(() => { payStatus() }, 1000) // 轮巡查询用户是否支付
@@ -220,8 +231,8 @@ const getCodeList = async () => {
           if (!payType.value) {
             // 默认值赋值(暂时只支持扫码)
             const bool = qrCodePay.includes(code)
-            // if (bool) payType.value = code
-            if (bool) payTypeChange(code)
+            if (bool) payType.value = code
+            // if (bool) payTypeChange(code)
           }
           payTypeList.value.push(item)
         }
@@ -231,6 +242,7 @@ const getCodeList = async () => {
 }
 
 nextTick(async () => {
+  isMounted.value = true
   await getPackageList()
   await getCodeList()
 })

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

@@ -54,6 +54,7 @@ import { createTradeOrder } from '@/api/position'
 const props = defineProps({
   afterAdd: Function,
   valid: Function,
+  isFair: Boolean
 })
 
 const { t } = useI18n()
@@ -117,7 +118,7 @@ const handleSave = async () => {
 const saveEmit = async () => {
   loading.value = true
   try {
-    const res = await saveJobAdvertised(submitParams)
+    const res = await saveJobAdvertised({ ...submitParams, fair: props.isFair ? true : false }) // fair:是否为招聘会职位编辑-必填
     // status:99为待支付职位,弹窗支付
     if (submitParams?.status && submitParams?.status === '99') {
       loading.value = true

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

@@ -46,15 +46,15 @@
         >
           <template #name="{ item }">
             <div class="d-flex align-center">
-              <v-badge
+              <!-- <v-badge
                 v-if="(item?.sex === '1' || item?.sex === '2') && showBadge"
                 bordered
                 offset-y="6"
                 :color="badgeColor(item)"
                 :icon="badgeIcon(item)">
                 <v-avatar size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
-              </v-badge>
-              <v-avatar v-else size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
+              </v-badge> -->
+              <v-avatar size="40" :image="getUserAvatar(item.avatar, item.sex)"></v-avatar>
               <span class="ml-3">{{ item?.name }}</span>
             </div>
           </template>
@@ -141,13 +141,13 @@ const textItem = ref({
   clearable: true,
   label: '请输入用户名称搜索'
 })
-const badgeColor = computed(() => (item) => {
-  return (item && item.sex) ? (item.sex === '1' ? '#1867c0' : 'error') : 'error'
-})
+// const badgeColor = computed(() => (item) => {
+//   return (item && item.sex) ? (item.sex === '1' ? '#1867c0' : 'error') : 'error'
+// })
 
-const badgeIcon = computed(() => (item) => {
-  return (item && item.sex) ? (item.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
-})
+// const badgeIcon = computed(() => (item) => {
+//   return (item && item.sex) ? (item.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
+// })
 
 // 获取用户列表
 const getUserList = async () => {
@@ -266,10 +266,10 @@ const formItems = ref({
     }
   ]
 })
-getDict('menduner_sex').then(({ data }) => {
-  data = data?.length && data || []
-  formItems.value.options.find(e => e.key === 'sex').items = data
-})
+// getDict('menduner_sex').then(({ data }) => {
+//   data = data?.length && data || []
+//   formItems.value.options.find(e => e.key === 'sex').items = data
+// })
 
 
 // 编辑员工信息
@@ -336,7 +336,7 @@ const handleSubmit = async () => {
     id: editId.value
   } 
   formItems.value.options.forEach(e => { obj[e.key] = e.value })
-  if (!obj.sex || obj.sex === '0') return Snackbar.warning('请选择员工性别')
+  // if (!obj.sex || obj.sex === '0') return Snackbar.warning('请选择员工性别')
   await updateGroupUserAccount(obj)
   showEdit.value = false
   editId.value = null