Xiao_123 před 10 měsíci
rodič
revize
b1604727bf

+ 3 - 2
src/api/recruit/enterprise/personnel/index.js

@@ -8,9 +8,10 @@ export const personJobCvLook = async (id) => {
 }
 
 // 招聘端-牛人管理-加入不合适
-export const joinEliminate = async (ids) => {
+export const joinEliminate = async (data) => {
   return await request.post({
-    url: `/app-admin-api/menduner/system/person-cv/eliminate?ids=${ids}`
+    url: '/app-admin-api/menduner/system/person-cv/unfit/eliminate',
+    data
   })
 }
 

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

@@ -12,12 +12,14 @@
           </div>
         </div>
         
-        <div class="d-flex user-nav">
+        <div class="d-flex user-nav align-center">
           <div class="d-flex align-center cursor-pointer">
             <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?.enterpriseAnotherName || $t('sys.tourist') }}</span>
           </div>
           <div class="line"></div>
+          <div class="ml-3 cursor-pointer" @click="handleLogout">我要求职</div>
+          <div class="line"></div>
           <div class="d-flex align-center ml-6">
             <div class="cursor-pointer" @click="router.push({ path: '/recruit/enterprise/memberCenter/myPoints' })">{{ $t('enterprise.account.accountBalances') }}:{{ enterpriseUserAccount?.balance || 0 }}元</div>
             <div class="ml-5 cursor-pointer" @click="router.push({ path: '/recruit/enterprise/memberCenter/myPoints' })">{{ $t('enterprise.account.remainingPoints') }}:{{ enterpriseUserAccount?.point || 0 }}点</div>
@@ -48,7 +50,7 @@
           </div>
 
           <!-- 语言切换 -->
-          <v-menu>
+          <!-- <v-menu>
             <template v-slot:activator="{ props }">
               <v-btn
                 class="ml-3"
@@ -70,7 +72,7 @@
                 <v-list-item-title>{{ item.name }}</v-list-item-title>
               </v-list-item>
             </v-list>
-          </v-menu>
+          </v-menu> -->
 
           <v-btn size="small" icon="mdi-bell-outline"></v-btn>
         </div>
@@ -124,7 +126,7 @@ const menuList = ref([
   { title: t('enterprise.personalInformationSettings'), icon: 'mdi-account-cog', change: () => router.push({ path: '/recruit/enterprise/informationSettings' }) },
   { title: t('setting.switchToOtherCompany'), icon: 'mdi-home-switch', hidden: enterpriseList.value?.length < 2, change: () => handleSwitchToAnotherEnterprise },
   { title: t('enterprise.registeringNewEnterprise'), icon: 'mdi-home-plus-outline', change: () => handleRegisteringNewEnterprise },
-  { title: t('setting.switchToJobSeeker'), icon: 'mdi-swap-horizontal', change: handleLogout },
+  // { title: t('setting.switchToJobSeeker'), icon: 'mdi-swap-horizontal', change: handleLogout },
   { title: t('setting.logOut'), icon: 'mdi-logout', change: handleLogout }
 ])
 const items = computed(() => {
@@ -231,7 +233,7 @@ getEnterpriseListData()
 }
 .line {
   width: 1px;
-  height: 25px;
+  height: 20px;
   background-color: #fff;
   margin: 0 10px;
   margin: 8px 0 0 29px;

+ 11 - 9
src/layout/personal/navBar.vue

@@ -33,17 +33,18 @@
           
           <!-- 头像用户名 -->
           <div class="d-flex align-center" v-if="getToken()">
-            <span class="cursor-pointer" @click="router.push({ path: '/recruit/personal/myWallet' })">{{t('resume.accountWithdrawal')}}:{{ userAccount?.balance || 0 }}{{t('unit.rmb')}}</span>
-            <span class="mr-5 ml-5 cursor-pointer" @click="router.push({ path: '/recruit/personal/myWallet' })">{{t('resume.goldCoins')}}:{{ userAccount?.point || 0 }}{{t('unit.ge')}}</span>
+            <span class="cursor-pointer mr-5" @click="changeLoginType">我要招聘</span>
+            <span class="cursor-pointer" @click="router.push({ path: '/recruit/personal/myWallet' })">{{t('resume.accountWithdrawal')}}:{{ userAccount?.balance || 0 }}</span>
+            <span class="mr-3 ml-3 cursor-pointer" @click="router.push({ path: '/recruit/personal/myWallet' })">{{t('resume.goldCoins')}}:{{ userAccount?.point || 0 }}</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">
+                <div class="d-flex ml-3 align-center cursor-pointer" v-bind="props" @click="handleToPersonalCenter">
                   <v-avatar>
                     <v-img alt="John" :src="baseInfo?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-img>
                   </v-avatar>
-                  <div class="ml-2">{{ baseInfo?.name || $t('sys.tourist') }}</div>
+                  <div class="ml-3">{{ baseInfo?.name || $t('sys.tourist') }}</div>
                 </div>
               </template>
 
@@ -59,7 +60,7 @@
           </div>
 
           <!-- 语言切换 -->
-          <v-menu>
+          <!-- <v-menu>
             <template v-slot:activator="{ props }">
               <v-btn
                 class="ml-3"
@@ -81,10 +82,11 @@
                 <v-list-item-title>{{ item.name }}</v-list-item-title>
               </v-list-item>
             </v-list>
-          </v-menu>
+          </v-menu> -->
           <div class="d-flex align-center" v-if="getToken()">
-            <span class="cursor-pointer mx-5" @click="router.push({ path: '/recruit/personal/TaskCenter' })">{{ $t('sys.signIn') }}</span>
-            <span class="cursor-pointer" @click="router.push({ path: '/recruit/personal/message' })">{{ $t('sys.news') }}</span>
+            <!-- <span class="cursor-pointer mx-5" @click="router.push({ path: '/recruit/personal/TaskCenter' })">{{ $t('sys.signIn') }}</span> -->
+            <!-- <span class="cursor-pointer" @click="router.push({ path: '/recruit/personal/message' })">{{ $t('sys.news') }}</span> -->
+            <v-btn class="ml-1" size="small" icon="mdi-bell-outline" @click="router.push({ path: '/recruit/personal/message' })"></v-btn>
           </div>
         </div>
         
@@ -178,7 +180,7 @@ const items = ref([
   { title: t('vipPackage.purchasePackage'), icon: 'mdi-gift-outline', change: () => router.push({ path: '/recruit/personal/purchasePackage' }) },
   { title: t('resume.onlineResume'), icon: 'mdi-list-box-outline', change: () => router.push({ path: '/recruit/personal/resume' }) },
   { title: t('setting.accountSettings'), icon: 'mdi-cog-outline', change: () => router.push({ path: '/recruit/personal/accountSettings/accountBinding' }) },
-  { title: t('setting.switchToRecruit'), icon: 'mdi-swap-horizontal', change: changeLoginType },
+  // { title: t('setting.switchToRecruit'), icon: 'mdi-swap-horizontal', change: changeLoginType },
   { title: t('publicRecruitment.bountyRewards'), icon: 'mdi-google-circles-extended', change: () => router.push({ path: '/publicRecruitment' }) },
   { title: t('points.wallet'), icon: ' mdi-database-outline', change: () => router.push({ path: '/recruit/personal/myWallet' }) },
   { title: t('taskCenter.taskCenter'), icon: 'mdi-calendar-check-outline', change: () => router.push({ path: '/recruit/personal/TaskCenter' }) },

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

@@ -28,7 +28,7 @@ import CommonStyle from './commonStyle.vue'
 
 const emit = defineEmits(['search', 'reset'])
 const props = defineProps({
-  tab: String
+  tab: Number
 })
 
 const list = ref([

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

@@ -1,8 +1,7 @@
 <template>
   <div>
     <div class="text-end">
-      <v-btn v-if="tab === '0'" color="primary" :disabled="selected.length ? false : true" variant="tonal" @click="handleAction('all', 0)">不合适</v-btn>
-      <v-btn v-if="tab === '1'" color="primary" :disabled="selected.length ? false : true" variant="tonal" @click="handleAction('all', 1)">入职</v-btn>
+      <v-btn v-if="tab === 1" color="primary" :disabled="selected.length ? false : true" variant="tonal" @click="handleAction('all', 0)">入职</v-btn>
     </div>
     <v-data-table
       class="mt-3"
@@ -29,13 +28,13 @@
         </div>
       </template>
       <template v-slot:item.actions="{ item }">
-        <div v-if="tab === '0'">
+        <div v-if="tab === 0">
           <v-btn color="primary" variant="text" @click="handlePreviewResume(item)">查看简历</v-btn>
-          <v-btn color="primary" variant="text" @click="handleAction('', 0, item)">不合适</v-btn>
         </div>
-        <div v-if="tab === '1'">
+        <v-btn v-if="tab === 0 || tab === 1" color="primary" variant="text" @click="handleEliminate(item)">不合适</v-btn>
+        <div v-if="tab === 1">
           <v-btn color="primary" variant="text" @click="handleInterviewInvite(item)">邀请面试</v-btn>
-          <v-btn color="primary" variant="text" @click="handleAction('', 1, item)">入职</v-btn>
+          <v-btn color="primary" variant="text" @click="handleAction('', 0, item)">入职</v-btn>
         </div>
       </template>
     </v-data-table>
@@ -52,8 +51,8 @@ import Snackbar from '@/plugins/snackbar'
 
 const { t } = useI18n()
 const emit = defineEmits(['refresh'])
-defineProps({
-  tab: String,
+const props = defineProps({
+  tab: Number,
   items: Array
 })
 const badgeColor = computed(() => (item) => {
@@ -82,11 +81,10 @@ const handleToPersonDetail = ({ userId, id }) => {
 }
 
 const apiList = [
-  joinEliminate, // 不合适
   personEntryByEnterprise // 入职
 ]
 
-// 不合适、入职
+// 入职
 const handleAction = async (type, index, item) => {
   const ids = type ? selected.value : [item?.id]
   if (!ids) return
@@ -95,6 +93,19 @@ const handleAction = async (type, index, item) => {
   emit('refresh')
 }
 
+// 不合适
+const handleEliminate = async (item) => {
+  if (!item.id || !item?.job?.id) return
+  const query = {
+    bizId: item.id,
+    jobId: item.job.id,
+    type: props.tab === 0 ? '0' : '1' // 投递简历0 已邀约1
+  }
+  await joinEliminate(query)
+  Snackbar.success(t('common.operationSuccessful'))
+  emit('refresh')
+}
+
 // 查看简历
 const handlePreviewResume = async ({ url, id }) => {
   if (!url || !id) return

+ 14 - 14
src/views/recruit/enterprise/personnelManagement/index.vue

@@ -28,8 +28,8 @@
 defineOptions({ name: 'enterprise-personnelManagement-management'})
 import { ref } from 'vue'
 import { getPersonCvPage } from '@/api/enterprise'
-import { getDict } from '@/hooks/web/useDictionaries'
 import { dealDictObjData } from '@/utils/position'
+import { getInterviewInvitePage } from '@/api/recruit/enterprise/interview'
 import TablePage from './components/table.vue'
 import Screen from './components/screen.vue'
 
@@ -37,11 +37,17 @@ const total = ref(0)
 const query = ref({
   pageNo: 1,
   pageSize: 10,
-  status: 0,
+  status: null,
   type: 0
 })
-const tab = ref('0')
-const tabList = ref([])
+const tab = ref(0)
+const tabList = ref([
+  { label: '投递简历', value: 0, api: getPersonCvPage, status: null },
+  { label: '已邀约', value: 1, api: getInterviewInvitePage, status: '0' },
+  { label: '已发offer', value: 2, api: getInterviewInvitePage, status: '1' },
+  { label: '已入职', value: 3, api: getInterviewInvitePage, status: '2' },
+  { label: '不合适', value: 4 },
+])
 const textItems = ref({
   type: 'text',
   value: '',
@@ -51,19 +57,13 @@ const textItems = ref({
   appendInnerIcon: 'mdi-magnify'
 })
 
-// 获取tab列表项
-const getTabData = () => {
-  getDict('menduner_job_cv_status').then(({ data }) => {
-    data = data?.length && data || []
-    tabList.value = data
-  })
-}
-getTabData()
-
 // 获取牛人列表
 const items = ref([])
 const getList = async () => {
-  const { list, total: number } = await getPersonCvPage(query.value)
+  if (tab.value === 4) return
+  const api = tabList.value[tab.value].api
+  query.value.status = tab.value === 0 ? null : tabList.value[tab.value].status
+  const { list, total: number } = await api(query.value)
   if (!list.length) {
     items.value = []
     total.value = 0

+ 40 - 45
src/views/recruit/personal/message/components/chatting.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="chatting">
+  <div class="chatting d-flex flex-column">
     <div class="top-info">
       <div class="user-info d-flex align-center">
         <p class="d-flex align-center float-left">
@@ -15,8 +15,8 @@
         <span class="color-333">广州</span>
       </div>
     </div>
-    <div class="chat-record mt-3">
-      <div class="message-box" @scroll="handleScroll" ref="chatRef">
+    <div class="mt-3 message-box" @scroll="handleScroll" ref="chatRef">
+      <div>
         <div v-for="(val, i) in items" :key="i" :id="val.id">
           <div class="time-box">{{ val.time }}</div>
           <div :class="['message-view_item', val.userId === myUserId ? 'is-self' : 'is-other']">
@@ -168,56 +168,51 @@ const handleScroll = (e) => {
     }
   }
 }
-.chat-record {
-  
-  padding-bottom: 30px;
-  .message-box {
-    height: 525px;
-    padding: 0 30px 20px;
-    overflow-y: auto;
-    .time-box {
-      user-select: none;
-      position: relative;
-      top: 8px;
-      margin: 20px 0;
-      max-height: 20px;
-      text-align: center;
-      font-weight: 400;
-      font-size: 12px;
-      color: var(--color-time-divider);
-    }
-    .message-view_item {
-      display: flex;
-      flex-direction: row;
-      align-items: center;
-      margin: 8px 0;
-      position: relative;
-      .message-text {
-        background-color: #f0f2f5;
-        border-radius: 6px;
-        max-width: 85%;
-        padding: 10px;
-      }
+.message-box {
+  flex: 1;
+  padding: 0 30px 30px;
+  overflow-y: auto;
+  .time-box {
+    user-select: none;
+    position: relative;
+    top: 8px;
+    margin: 20px 0;
+    max-height: 20px;
+    text-align: center;
+    font-weight: 400;
+    font-size: 12px;
+    color: var(--color-time-divider);
+  }
+  .message-view_item {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    margin: 8px 0;
+    position: relative;
+    .message-text {
+      background-color: #f0f2f5;
+      border-radius: 6px;
+      max-width: 85%;
+      padding: 10px;
     }
-    .is-self {
-      flex-direction: row-reverse;
-      display: flex;
-      .message-text {
-        margin-right: 10px;
-      }
+  }
+  .is-self {
+    flex-direction: row-reverse;
+    display: flex;
+    .message-text {
+      margin-right: 10px;
     }
-    .is-other {
-      .message-text {
-        margin-left: 10px;
-      }
+  }
+  .is-other {
+    .message-text {
+      margin-left: 10px;
     }
   }
 }
 .bottom-info {
-  position: absolute;
-  bottom: 0;
   width: 100%;
   height: 160px;
+  background-color: #fff;
 }
 input {
   outline: none;