Bläddra i källkod

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

lifanagju_citu 10 månader sedan
förälder
incheckning
a02c0ec3a5

+ 2 - 2
src/api/publicRecruitment/index.js

@@ -3,14 +3,14 @@ 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'
+    url: '/app-api/menduner/system/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',
+    url: '/app-api/menduner/system/job-cv-rel/page',
     params
   })
 }

+ 8 - 0
src/api/recruit/enterprise/system/group/index.js

@@ -0,0 +1,8 @@
+import request from '@/config/axios'
+
+// 企业树形
+export const getEnterpriseTree = async () => {
+  return await request.get({
+    url: '/app-admin-api/menduner/system/enterprise/get/tree'
+  })
+}

+ 1 - 1
src/api/recruit/personal/shareJob/index.js

@@ -3,7 +3,7 @@ import request from '@/config/axios'
 // 众聘-投递简历
 export const hireJobCvDelivery = async (data) => {
   return await request.post({
-    url: '/app-api/menduner/system/hire-job-cv-rel/send',
+    url: '/app-api/menduner/system/job-cv-rel/hire/recommend/send',
     data
   })
 }

+ 5 - 5
src/api/recruit/public/delivery/index.js

@@ -3,7 +3,7 @@ import request from '@/config/axios'
 // 获取投递分页列表
 export const getHireJobCvPage = async (params) => {
   return await request.get({
-    url: '/app-admin-api/menduner/system/hire-job-cv-rel/page',
+    url: '/app-admin-api/menduner/system/person-cv/hire/page',
     params
   })
 }
@@ -18,27 +18,27 @@ export const getHireJobCvRelRecommendList = async () => {
 // 结算
 export const hireJobCvRelSettlement = async (id) => {
   return await request.post({
-    url: `/app-admin-api/menduner/system/hire-job-cv-rel/settlement?id=${id}`
+    url: `/app-admin-api/menduner/system/person-cv/settlement?id=${id}`
   })
 }
 
 // 入职
 export const hireJobCvRelEntry = async (ids) => {
   return await request.post({
-    url: `/app-admin-api/menduner/system/hire-job-cv-rel/entry?ids=${ids}`
+    url: `/app-admin-api/menduner/system/person-cv/entry?ids=${ids}`
   })
 }
 
 // 淘汰、不合适
 export const hireJobCvRelEliminate = async (ids) => {
   return await request.post({
-    url: `/app-admin-api/menduner/system/hire-job-cv-rel/eliminate?ids=${ids}`
+    url: `/app-admin-api/menduner/system/person-cv/eliminate?ids=${ids}`
   })
 }
 
 // 记录查看简历附件
 export const hireJobCvRelLook = async (id) => {
   return await request.post({
-    url: `/app-admin-api/menduner/system/hire-job-cv-rel/look?id=${id}`
+    url: `/app-admin-api/menduner/system/person-cv/look?id=${id}`
   })
 }

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

@@ -16,7 +16,7 @@
           <!-- <a target="_blank" href="/recruit/enterprise/purchasePackage" class="cursor-pointer mr-5" style="font-size: 15px;color: #FB8C00;line-height: 40px;">{{ $t('vipPackage.purchasePackage') }}</a> -->
           <div class="d-flex align-center cursor-pointer" @click="handleEnterpriseClick">
             <v-img @click="enterpriseClick(2)" rounded width="40" height="40" :src="baseInfo?.logoUrl || 'https://minio.citupro.com/dev/menduner/7.png'" ></v-img>
-            <span @click="enterpriseClick(1)" class="ml-3">{{ baseInfo?.enterpriseName || $t('sys.tourist') }}</span>
+            <span @click="enterpriseClick(1)" class="ml-3">{{ baseInfo?.enterpriseAnotherName || $t('sys.tourist') }}</span>
           </div>
           <div class="line"></div>
           <div class="d-flex align-center ml-6">

+ 4 - 4
src/layout/personal/navBar.vue

@@ -37,11 +37,11 @@
           
           <!-- 头像用户名 -->
           <div class="d-flex align-center" v-if="getToken()">
-            <!-- <a target="_blank" href="/mall/purchasePackage" class="cursor-pointer mr-5" style="color: #FB8C00;">{{ $t('vipPackage.purchasePackage') }}</a> -->
-            <span class="cursor-pointer" @click="router.push({ path: '/recruit/personal/TaskCenter' })">{{ $t('sys.signIn') }}</span>
-            <span class="cursor-pointer mx-5">{{ $t('sys.news') }}</span>
             <span>{{t('resume.accountWithdrawal')}}:{{ userAccount?.balance || 0 }}{{t('unit.rmb')}}</span>
-            <span class="ml-5">{{t('resume.goldCoins')}}:{{ userAccount?.point || 0 }}{{t('unit.ge')}}</span>
+            <span class="mr-10 ml-5">{{t('resume.goldCoins')}}:{{ userAccount?.point || 0 }}{{t('unit.ge')}}</span>
+
+            <span class="cursor-pointer" @click="router.push({ path: '/recruit/personal/TaskCenter' })">{{ $t('sys.signIn') }}</span>
+            <span class="cursor-pointer ml-5">{{ $t('sys.news') }}</span>
             <v-menu open-on-hover>
               <template v-slot:activator="{ props }">
                 <div class="d-flex ml-5 pl-2 align-center cursor-pointer" v-bind="props" @click="handleToPersonalCenter">

+ 3 - 1
src/plugins/vuetify.js

@@ -10,6 +10,7 @@ import 'vuetify/styles'
 // import * as components from 'vuetify/components'
 import * as directives from 'vuetify/directives'
 import { VDateInput } from 'vuetify/labs/VDateInput'
+import { VTreeview } from 'vuetify/labs/VTreeview'
 
 // Composables
 import { createVuetify } from 'vuetify'
@@ -30,7 +31,8 @@ const myCustomLightTheme = {
 // https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides
 export default createVuetify({
   components: {
-    VDateInput
+    VDateInput,
+    VTreeview
   },
   directives,
   theme: {

+ 8 - 0
src/router/modules/components/recruit/enterprise.js

@@ -227,6 +227,14 @@ const enterprise = [
       isAdmin: true // 企业管理员菜单
     },
     children: [
+      {
+        path: '/recruit/enterprise/systemManagement/groupAccount',
+        meta: {
+          title: '集团账户',
+          enName: 'Group Account '
+        },
+        component: () => import('@/views/recruit/enterprise/systemManagement/groupAccount/index.vue')
+      },
       {
         path: '/recruit/enterprise/systemManagement/userManagement',
         meta: {

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

@@ -35,6 +35,7 @@ const headers = [
   { 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 && item?.job?.hirePrice > 0 ? item.job.hirePrice : '', sortable: false },
+  { title: '金币', key: 'hirePoint', value: item => item?.job?.hirePoint && item?.job?.hirePoint > 0 ? item.job.hirePoint : '', sortable: false },
   { title: '推荐时间', key: 'createTime', value: item => timesTampChange(item.createTime), sortable: false },
 ]
 

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

@@ -30,7 +30,7 @@
       </template>
       <!-- 已报名:查看简历,已邀约:不合适,已发offer:入职,已入职:结算 -->
       <template v-slot:item.actions="{ item }">
-        <v-btn v-if="tab === '0' && item.url" color="primary" variant="text" @click="handlePreviewResume(item)">查看简历</v-btn>
+        <v-btn v-if="tab === '0' && item.url" color="primary" variant="text" @click="handlePreviewResume(item)">查看附件</v-btn>
         <v-btn v-if="tab === '2'" color="primary" variant="text" @click="handleAction('', 0, item)">不合适</v-btn>
         <v-btn v-if="tab === '1'" color="primary" variant="text" @click="handleAction('', 1, item)">入职</v-btn>
         <v-btn v-if="tab === '4'" color="primary" variant="text" @click="handleSettlement(item)">结算</v-btn>
@@ -51,9 +51,10 @@ import { useUserStore } from '@/store/user'
 const { t } = useI18n()
 const userStore = useUserStore()
 const emit = defineEmits(['refresh'])
-defineProps({
+const props = defineProps({
   tab: String,
-  items: Array
+  items: Array,
+  tabList: Array
 })
 const badgeColor = computed(() => (item) => {
   return (item.person && item.person.sex) ? (item.person.sex === '1' ? '#1867c0' : 'error') : 'error'
@@ -71,6 +72,8 @@ 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: 'recommendPerson', value: item => item?.recommendPerson?.name, sortable: false },
+  { title: '进度', key: 'status', sortable: false, value: item => props.tabList.find(e => e.value === item.status).label },
   { title: '结果反馈', key: '', sortable: false },
   { title: '操作', value: 'actions' }
 ])

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

@@ -9,7 +9,7 @@
 
     <v-window v-model="query.status" class="mt-1">
       <v-window-item v-for="k in tabList" :value="k.value" :key="k.value">
-        <TablePage :items="items" :tab="k.value" @refresh="getList"></TablePage>
+        <TablePage :items="items" :tab="k.value" :tabList="tabList" @refresh="getList"></TablePage>
         <CtPagination
           v-if="total > 0"
           :total="total"

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

@@ -0,0 +1,116 @@
+<template>
+  <v-card class="card-box d-flex pa-3" height="80vh">
+    <v-row no-gutters justify="space-between">
+      <v-col cols="3">
+        <v-treeview
+          :items="treeData"
+          activatable
+          color="primary"
+          item-value="id"
+          mandatory
+          item-title="anotherName"
+          open-all
+          :opened="treeData"
+          open-strategy="single"
+          @update:activated="handleClick"
+          @update:opened="handleClick"
+        ></v-treeview>
+      </v-col>
+
+      <v-divider vertical></v-divider>
+
+      <v-col class="ml-10">
+        <TextInput v-model="query.name" :item="textItem" @change="getUserList"></TextInput>
+        <v-data-table
+          :loading="loading"
+          color="#00897B"
+          :items="tableData"
+          :headers="headers"
+        >
+          <template #bottom>
+            <CtPagination
+              v-if="total > 0"
+              :total="total"
+              :page="query.pageNo"
+              :limit="query.pageSize"
+              @handleChange="handleChangePage"
+            ></CtPagination>
+          </template>
+        </v-data-table>
+      </v-col>
+    </v-row>
+  </v-card>
+</template>
+
+<script setup>
+defineOptions({ name: 'group-account'})
+import { ref } from 'vue'
+import { useI18n } from '@/hooks/web/useI18n'
+import { getEnterpriseUserList } from '@/api/recruit/enterprise/system/user'
+import { getEnterpriseTree } from '@/api/recruit/enterprise/system/group'
+
+const { t } = useI18n()
+const total = ref(0)
+const loading = ref(false)
+const query = ref({
+  pageSize: 10,
+  pageNo: 1,
+  enterpriseId: '',
+  name: null
+})
+const tableData = ref([])
+const treeData = ref([])
+const headers = [
+  { title: t('login.username'), key: 'name', sortable: false },
+  { title: t('enterprise.userManagement.affiliatedEnterprise'), key: 'enterpriseAnotherName', sortable: false },
+  { title: t('enterprise.userManagement.post'), key: 'post.nameCn', sortable: false },
+  { title: t('enterprise.userManagement.phone'), key: 'phone', sortable: false }
+]
+const textItem = ref({
+  type: 'text',
+  value: null,
+  width: 250,
+  clearable: true,
+  label: '请输入用户名称搜索'
+})
+
+// 获取用户列表
+const getUserList = async () => {
+  loading.value = true
+  try {
+    const { list, total: number } = await getEnterpriseUserList(query.value)
+    tableData.value = list
+    total.value = number
+  } finally {
+    loading.value = false
+  }
+}
+
+// 获取树形列表
+const getTreeData = async () => {
+  const data = await getEnterpriseTree()
+  if (!data) return
+  treeData.value = [data]
+  query.value.enterpriseId = data.id
+  // 获取用户列表
+  getUserList()
+}
+getTreeData()
+
+// 分页
+const handleChangePage = (e) => {
+  query.value.pageNo = e
+  getUserList()
+}
+
+// 树形click
+const handleClick = (e) => {
+  if (!e.length) return
+  query.value.enterpriseId = e[0]
+  getUserList()
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

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

@@ -14,9 +14,6 @@
       item-value="id"
     >
       <template #bottom></template>
-      <template v-slot:item.postId="{ item }">
-        {{ postList.length ? postList.find(e => e.id === item.postId)?.nameCn : '' }}
-      </template>
       <template v-slot:item.actions="{ item }">
         <v-btn color="primary" variant="text" @click="handleBinding(item)">{{ $t('enterprise.userManagement.jobBinding') }}</v-btn>
         <v-btn v-if="item.status === '1' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 0, item)">{{ $t('enterprise.userManagement.enable') }}</v-btn>
@@ -60,8 +57,8 @@ const query = ref({
 const postList = ref([])
 const headers = [
   { title: t('login.username'), key: 'name' },
-  { title: t('enterprise.userManagement.affiliatedEnterprise'), key: 'enterpriseName' },
-  { title: t('enterprise.userManagement.post'), key: 'postId' },
+  { title: t('enterprise.userManagement.affiliatedEnterprise'), key: 'enterpriseAnotherName' },
+  { title: t('enterprise.userManagement.post'), key: 'post.nameCn' },
   { 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'), sortable: false },

+ 1 - 1
src/views/recruit/personal/position/components/details.vue

@@ -271,7 +271,7 @@ const handleSubmit = async (val) =>{
   if (!selectResume.value) return Snackbar.warning(t('resume.selectResumeToSubmit'))
   const obj = resumeList.value.find(e => e.id === selectResume.value)
   if (!obj) return Snackbar.warning(t('resume.selectedResumeNotExist'))
-  await jobCvRelSend({ jobId: id, title: obj.title, url: obj.url })
+  await jobCvRelSend({ jobId: id, title: obj.title, url: obj.url, type: info.value.hire ? 1 : 0 })
   setTimeout(() => {
     Snackbar.success(t('resume.deliverySuccess'))
   }, 3000)

+ 2 - 1
src/views/recruit/personal/shareJob/components/handleDeliveryCom.vue

@@ -92,6 +92,7 @@ const inspectionProcess = async () => {
     const keyArr = ['name', 'phone', 'jobStatus', 'expType', 'eduType'] // 必填人才信息
     const baseInfoReady = keyArr.every(e => info[e] && info[e] !== 0) // 校验必填人才信息
     if (!baseInfoReady) {
+      Snackbar.warning('请先完善个人基本信息')
       nextTick(() => { baseInfoCompleteDialog.value = true })
       return
     }
@@ -126,7 +127,7 @@ const handleSubmit = async (val) =>{
 
   // 区分普通职位跟众聘职位投递
   if (props.hire) await hireJobCvDelivery({ jobId: props.jobId, recommendUserId: props.userId, url: obj.url })
-  else await jobCvRelSend({ jobId: props.jobId, title: obj.title, url: obj.url })
+  else await jobCvRelSend({ jobId: props.jobId, title: obj.title, url: obj.url, type: props.hire ? 1 : 0 })
 
   // setTimeout(() => {
     Snackbar.success(t('resume.deliverySuccess'))

+ 1 - 1
src/views/recruit/personal/shareJob/index.vue

@@ -61,7 +61,7 @@
           </div>
         </div>
         <div class="text-center my-10">
-          <v-btn class="mr-2 radius button-item" color="success" variant="outlined" target="_blank" to="/recruit/personal/position">{{ $t('position.moreBtn') }}</v-btn>
+          <v-btn v-if="!isMobile" class="mr-2 radius button-item" color="success" variant="outlined" target="_blank" to="/recruit/personal/position">{{ $t('position.moreBtn') }}</v-btn>
           <v-btn class="radius button-item" color="primary" :disabled="delivery" @click="sendResumeProcessVerify">{{ delivery ? $t('position.delivered') : $t('position.submitResume') }}</v-btn>
         </div>
       </div>