Xiao_123 10 månader sedan
förälder
incheckning
24845876a3

+ 16 - 0
src/api/publicRecruitment/index.js

@@ -0,0 +1,16 @@
+import request from '@/config/axios'
+
+// 获取推荐职位投递状态数量
+export const getHireJobCvRelCount = async () => {
+  return await request.get({
+    url: '/app-api/menduner/system/hire-job-cv-rel/get/commend/count'
+  })
+}
+
+// 获取推荐邀请投递的职位信息
+export const getHireJobCvRelPage = async (params) => {
+  return await request.get({
+    url: '/app-api/menduner/system/hire-job-cv-rel/page',
+    params
+  })
+}

+ 7 - 0
src/api/recruit/enterprise/system/post/index.js

@@ -36,4 +36,11 @@ export const deleteEnterprisePost = async (id) => {
   return await request.delete({
     url: `/app-admin-api/menduner/system/enterprise-post/delete?id=${id}`
   })
+}
+
+// 效验岗位下是否绑定用户
+export const checkPost = async (postId) => {
+  return await request.get({
+    url: `/app-admin-api/menduner/system/user/check/post?postId=${postId}`
+  })
 }

+ 8 - 8
src/router/modules/enterprise.js

@@ -170,14 +170,14 @@ const enterprise = [
         },
         component: () => import('@/views/recruit/enterprise/publicRecruitmentManagement/deliver')
       },
-      {
-        path: '/recruit/enterprise/publicRecruitmentManagement/commission',
-        meta: {
-          title: '佣金比例',
-          enName: 'Commission rate'
-        },
-        component: () => import('@/views/recruit/enterprise/publicRecruitmentManagement/commission')
-      }
+      // {
+      //   path: '/recruit/enterprise/publicRecruitmentManagement/commission',
+      //   meta: {
+      //     title: '佣金比例',
+      //     enName: 'Commission rate'
+      //   },
+      //   component: () => import('@/views/recruit/enterprise/publicRecruitmentManagement/commission')
+      // }
     ]
   },
   {

+ 1 - 1
src/views/integral/pointsManagement/components/integralTable.vue

@@ -23,7 +23,7 @@ const headers = [
   { title: '来源', key: 'description' },
   { title: '积分数', key: 'point' },
   { title: '总积分数', key: 'totalPoint' },
-  { title: '获得时间', key: 'createTime', value: item =>  timesTampChange(item.createTime) }
+  { title: '获得时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false }
 ]
 </script>
 

+ 1 - 1
src/views/integral/pointsManagement/components/signInTable.vue

@@ -24,7 +24,7 @@ const { t } = useI18n()
 const headers = [
   { title: t('taskCenter.signInDays'), key: 'day' },
   { title: t('taskCenter.points'), key: 'point' },
-  { title: t('taskCenter.createTime'), key: 'createTime', value: item => timesTampChange(item.createTime)}
+  { title: t('taskCenter.createTime'), key: 'createTime', value: item => timesTampChange(item.createTime), sortable: false }
 ]
 </script>
 

+ 7 - 8
src/views/publicRecruitment/components/table.vue

@@ -11,7 +11,7 @@
     <template #bottom></template>
     <template v-slot:item.name="{ item }">
       <div class="d-flex align-center cursor-pointer" >
-        <v-avatar size="40" :image="item.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
+        <v-avatar size="40" :image="item?.recommendPerson?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
         <span class="ml-2" style="color: #000000DE;">{{ item?.name }}</span>
       </div>
     </template>
@@ -21,22 +21,21 @@
 <script setup>
 defineOptions({ name: 'myPublicRecruitment-table-page'})
 import { ref } from 'vue'
+import { timesTampChange } from '@/utils/date'
 
-// const emit = defineEmits(['refresh'])
 defineProps({
   tab: String,
   items: Array
 })
 
-
 const selected = ref([])
 const headers = [
   { title: '牛人', value: 'name' },
-  { title: '应聘公司', value: '应聘公司' },
-  { title: '应聘职位', key: '应聘职位' },
-  { title: '岗位薪资', key: '岗位薪资' },
-  { title: '赏金', value: '赏金' },
-  { title: '推荐进度', key: '推荐进度' },
+  { title: '应聘公司', key: 'enterpriseName', value: item => item?.enterprise?.name, sortable: false },
+  { title: '应聘职位', key: 'job', value: item => item?.job?.name, sortable: false },
+  { title: '岗位薪资', key: 'salary', value: item => `${item?.job?.payFrom}-${item?.job?.payTo}`, sortable: false },
+  { title: '赏金', key: 'hirePrice', value: item => item?.job.hirePrice, sortable: false },
+  { title: '推荐时间', key: 'createTime', value: item => timesTampChange(item.createTime), sortable: false },
 ]
 
 </script>

+ 4 - 4
src/views/publicRecruitment/index.vue

@@ -3,15 +3,15 @@
   <div class="default-width py-3">
     <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#fff" @update:model-value="getPositionList">
       <v-tab :value="1">{{ $t('publicRecruitment.myRecommendation') }}</v-tab>
-      <v-tab :value="2">{{ $t('publicRecruitment.withdrawalRecords') }}</v-tab>
+      <!-- <v-tab :value="2">{{ $t('publicRecruitment.withdrawalRecords') }}</v-tab> -->
     </v-tabs>
     <div class="mt-3">
       <div v-if="tab === 1">
         <myRecommendation></myRecommendation>
       </div>
-      <div v-if="tab === 2" class="pa-3 white-bgc" style="border-radius: 5px;">
-        <!-- <myRegistration></myRegistration> -->
-      </div>
+      <!-- <div v-if="tab === 2" class="pa-3 white-bgc" style="border-radius: 5px;">
+        <myRegistration></myRegistration>
+      </div> -->
     </div>
   </div>
 </template>

+ 66 - 38
src/views/publicRecruitment/myRecommendation.vue

@@ -5,14 +5,21 @@
       <div style="width: 100%;">
         <!-- 统计 -->
         <div class="statisticsBox">
-          <div class="statisticsBox-item" :class="{'act': index === active}" v-for="(item, index) in statisticsList" :key="item.name" @click="statisticsClick(item, index)">
-            <div style="font-size: 18px; color: var(--color-333); font-weight: bold;">{{ statistics[item.name] || '0' }}</div>
+          <div class="statisticsBox-item" :class="{'act': index === active}" v-for="(item, index) in statisticsList" :key="item.value" @click="handleStatisticsItem(item, index)">
+            <div style="font-size: 18px; color: var(--color-333); font-weight: bold;">{{ item.count }}</div>
             <div style="font-size: 13px; color: var(--color-666);">{{ item.label }}</div>
           </div>
         </div>
         <div class="topTip">推荐好友入职得赏金</div>
         <!-- 数据 -->
-        <TablePage :items="dataList"></TablePage>
+        <TablePage :items="items"></TablePage>
+        <CtPagination
+          v-if="total > 0"
+          :total="total"
+          :page="query.pageNo"
+          :limit="query.pageSize"
+          @handleChange="handleChangePage"
+        ></CtPagination>
       </div>
     </div>
     <!-- 滚动区域 -->
@@ -23,49 +30,70 @@
 </template>
 
 <script setup>
+defineOptions({name: 'defineOptions-name'})
+import { ref } from 'vue'
+import { getDict } from '@/hooks/web/useDictionaries'
+import { getHireJobCvRelCount, getHireJobCvRelPage } from '@/api/publicRecruitment'
 import TablePage from './components/table.vue'
 import bountyDisplay from './components/bountyDisplay.vue'
-import { ref } from 'vue'
-defineOptions({name: 'defineOptions-name'})
+
+const active = ref(0)
+
 // 数据统计
-const statistics = ref({ statisticsA: '3', statisticsB: '7', statisticsC: '5', statisticsD: '2', statisticsE: '1' })
-const statisticsList = ref([
-  { count: '', label: '已报名', name: 'statisticsA' },
-  { count: '', label: '已过筛', name: 'statisticsB' },
-  { count: '', label: '已过面', name: 'statisticsC' },
-  { count: '', label: '已入职', name: 'statisticsD' },
-  { count: '', label: '已结算', name: 'statisticsE' }
-])
+const statisticsList = ref([])
+const getData = async () => {
+  const data = await getHireJobCvRelCount()
+  if (!data || !data.length) return
+  statisticsList.value.forEach(e => {
+    const obj = data.find(k => k.key === e.value)
+    if (!obj) return
+    e.count = obj.value
+  })
+}
 
-const avatarList = [
-  'https://img0.baidu.com/it/u=230622178,1565949306&fm=253&fmt=auto&app=138&f=JPEG?w=449&h=300',
-  'https://img0.baidu.com/it/u=1401084042,2724457850&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=726',
-  'https://q7.itc.cn/q_70/images03/20240423/6d236fae5c8f44ed9b60d977f32debb7.jpeg',
-  'https://q1.itc.cn/q_70/images03/20240609/1c1be14298be4dbe978e55bde6e958b0.jpeg',
-  'https://q4.itc.cn/q_70/images03/20240528/298d4abda5e4469d98fa77e7cde46525.jpeg',
-  'https://q5.itc.cn/q_70/images03/20240520/ceb0d77d1be24eea8cd3826994eac1c1.jpeg',
-  'https://img1.baidu.com/it/u=3995643348,1848098846&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=800',
-]
-const dataList = ref([])
-const dataItem = {
-  name: '用户',
-  应聘公司: '门墩儿科技',
-  应聘职位: '酒店前台',
-  岗位薪资: '8000-10000/月',
-  推荐进度: '已报名',
-  赏金: '100积分',
+// 列表
+const items = ref([])
+const total = ref(0)
+const query = ref({
+  pageSize: 10,
+  pageNo: 1,
+  status: null
+})
+const getTableList = async () => {
+  const res = await getHireJobCvRelPage(query.value)
+  items.value = res.list
+  total.value = res.total
 }
-const active = ref(0)
-const statisticsClick = (item, index) => {
+
+// 状态
+const getStatusData = () => {
+  getDict('menduner_hire_job_cv_status').then(({ data }) => {
+    data = data?.length && data || []
+    statisticsList.value = data.map(e => {
+      return { ...e, count: 0 }
+    })
+    query.value.status = data[0].value
+    getData()
+    getTableList()
+  })
+}
+getStatusData()
+
+// 分页
+const handleChangePage = (e) => {
+  query.value.pageNo = e
+  getTableList()
+}
+
+// 钻取
+const handleStatisticsItem = (item, index) => {
   active.value = index
-  const count = statistics.value[item.name] ? statistics.value[item.name] - 0 : 0
-  dataList.value = []
-  for (let i = 0; i < count; i++) {
-    dataList.value.push({ ...dataItem, avatar: avatarList[i], name: dataItem.name+(i+1) })
-  }
+  query.value.pageNo = 1
+  query.value.status = item.value
+  getTableList()
 }
-statisticsClick(statisticsList.value[0], 0)
 </script>
+
 <style lang="scss" scoped>
 .topTip {
   color: var(--color-999);

+ 1 - 1
src/views/recruit/enterprise/memberCenter/myPoints/components/integralTable.vue

@@ -23,7 +23,7 @@ const headers = [
   { title: '来源', key: 'description' },
   { title: '积分数', key: 'point' },
   { title: '总积分数', key: 'totalPoint' },
-  { title: '获得时间', key: 'createTime', value: item =>  timesTampChange(item.createTime) },
+  { title: '获得时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false },
 ]
 
 </script>

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

@@ -70,7 +70,7 @@ const headers = ref([
   { title: '求职状态', key: 'person.jobStatusName' },
   { title: '工作经验', key: 'person.expName' },
   { title: '最高学历', key: 'person.eduName' },
-  { title: '岗位薪资', key: 'job', value: item => `${item.job.payFrom}-${item.job.payTo}/${item.job.payName}`},
+  { title: '岗位薪资', key: 'job', value: item => `${item.job.payFrom}-${item.job.payTo}/${item.job.payName}`, sortable: false },
   { title: '操作', value: 'actions' }
 ])
 

+ 1 - 1
src/views/recruit/enterprise/publicRecruitmentManagement/deliver/components/table.vue

@@ -69,7 +69,7 @@ const headers = ref([
   { title: '求职状态', key: 'person.jobStatusName' },
   { title: '工作经验', key: 'person.expName' },
   { title: '最高学历', key: 'person.eduName' },
-  { title: '岗位薪资', key: 'job', value: item => `${item.job.payFrom}-${item.job.payTo}/${item.job.payName}`},
+  { title: '岗位薪资', key: 'job', value: item => `${item.job.payFrom}-${item.job.payTo}/${item.job.payName}`, sortable: false },
   { title: '结果反馈', key: '' },
   { title: '操作', value: 'actions' }
 ])

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

@@ -31,7 +31,7 @@ import { ref } from 'vue'
 import { useRouter } from 'vue-router'
 import { timesTampChange } from '@/utils/date'
 import { useI18n } from '@/hooks/web/useI18n'
-import { getEnterprisePostPage, deleteEnterprisePost } from '@/api/recruit/enterprise/system/post'
+import { getEnterprisePostPage, deleteEnterprisePost, checkPost } from '@/api/recruit/enterprise/system/post'
 import Confirm from '@/plugins/confirm'
 import Snackbar from '@/plugins/snackbar'
 
@@ -49,9 +49,9 @@ const headers = [
   { title: '英文名称', key: 'nameEn' },
   { title: '岗位缩写', key: 'code' },
   { title: '显示顺序', key: 'sort' },
-  { title: '状态', key: 'status', value: item => item.status === '1' ? '停用' : '正常'},
+  { title: '状态', key: 'status', value: item => item.status === '1' ? '停用' : '正常', sortable: false },
   { title: '备注', key: 'remark' },
-  { title: '更新时间', key: 'updateTime', value: item => timesTampChange(item.updateTime)},
+  { title: '更新时间', key: 'updateTime', value: item => timesTampChange(item.updateTime), sortable: false },
   { title: t('common.actions'), key: 'actions' }
 ]
 
@@ -76,7 +76,9 @@ const handleEdit = (item) => {
   router.push(`/recruit/enterprise/systemManagement/postManagement/edit?id=${item.id}`)
 }
 
-const handleDelete = ({ id }) => {
+const handleDelete = async ({ id }) => {
+  const check = await checkPost(id)
+  if (check) return Snackbar.warning('查询到该岗位有绑定用户,请先到用户管理里面修改后再试')
   Confirm(t('common.confirmTitle'), '是否确认删除此项内容?').then(async () => {
     await deleteEnterprisePost(id)
     Snackbar.success(t('common.delMsg'))

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

@@ -64,8 +64,8 @@ const headers = [
   { title: t('enterprise.userManagement.post'), key: 'postId' },
   { title: t('enterprise.userManagement.phone'), key: 'phone' },
   { title: t('enterprise.userManagement.email'), key: 'email' },
-  { title: t('enterprise.userManagement.accountType'), key: 'userType', value: item => item.userType === '1' ? t('enterprise.userManagement.administrators') : t('enterprise.userManagement.regularUser')},
-  { title: t('enterprise.userManagement.lastLoginTime'), key: 'loginDate', value: item => timesTampChange(item.loginDate) },
+  { title: t('enterprise.userManagement.accountType'), key: 'userType', value: item => item.userType === '1' ? t('enterprise.userManagement.administrators') : t('enterprise.userManagement.regularUser'), sortable: false },
+  { title: t('enterprise.userManagement.lastLoginTime'), key: 'loginDate', value: item => timesTampChange(item.loginDate), sortable: false },
   { title: t('common.actions'), key: 'actions' }
 ]
 const formItems = ref({