Procházet zdrojové kódy

职位管理:显示已投递简历数

Xiao_123 před 6 měsíci
rodič
revize
386d49ff77

+ 9 - 1
src/api/recruit/personal/myWallet.js

@@ -19,7 +19,15 @@ export const setWalletRecharge = async (data) => {
 // 获得钱包充值记录分页
 export const getUserWalletRechargePage = async (params) => {
   return await request.get({
-    url: 'app-api/pay/wallet-recharge/page',
+    url: '/app-api/pay/wallet-recharge/page',
     params
   })
 }
+
+// 余额明细
+export const getUserBalanceDetails = async (params) => {
+  return await request.get({
+    url: '/app-api/pay/wallet-transaction/page',
+    params
+  })
+}

+ 24 - 7
src/views/recruit/enterprise/hirePosition/components/item.vue

@@ -21,12 +21,15 @@
             <span>{{ val.positionName }}</span>
           </div>
           <div v-if="val?.hire" class="mt-2">
-            <v-chip v-if="val?.hirePrice && val.hirePrice > 0" class="mr-3" label color="primary" size="small">M豆:{{ val.hirePrice / 100 }}个</v-chip>
+            <v-chip v-if="val?.hirePrice && val.hirePrice > 0" class="mr-3" label color="primary" size="small">M豆:{{ commissionCalculation(val.hirePrice / 100, 1) }}个</v-chip>
           </div>
         </div>
-        <div class="d-flex align-center">
-          <v-chip v-if="(val.status-0) === 99" color="warning" label>职位待发布,支付后成功后自动发布</v-chip>
-          <v-chip v-if="val.status === '1' && tab === 2" color="error" class="cursor-pointer" label  style="text-decoration: underline;"  @click="toPay(val)">职位已关闭,点击激活职位</v-chip>
+        <div v-if="tab !== 0" class="text-center color-primary d-flex flex-column justify-center cursor-pointer" @click="handleToResume(val)">
+          <div class="font-weight-bold font-size-18">{{ val.count || 0 }}</div>
+          <div class="font-size-14">已投递简历</div>
+        </div>
+        <div v-if="(val.status-0) === 99" class="d-flex align-center">
+          <v-chip color="warning" label>职位待发布,支付后成功后自动发布</v-chip>
         </div>
       </div>
       <div class="bottom pa-5 d-flex justify-space-between align-center">
@@ -38,11 +41,14 @@
           </span>
         </div>
         <div class="d-flex align-center">
+          <span v-if="val.status === '1' && tab === 2" class="cursor-pointer actions" @click="toPay(val)">职位已关闭,点击激活职位</span>
           <span v-if="(val.status-0) === 99" class="cursor-pointer color-primary" @click="toPay(val)">去支付</span>
           <span v-if="(val.status - 0) !== 99 && val.status !== '1' && tab === 1" class="cursor-pointer actions" @click="handleAction(0, val)">{{ $t('common.close') }}</span>
           <span v-if="(val.status - 0) !== 99 && val.status !== '1' && tab === 1" class="lines"></span>
-          <span v-if="tab === 1" class="cursor-pointer" @click="handleEdit(val)">编辑</span>
-          <span v-if="tab === 3" class="cursor-pointer" @click="handleUpdateExpireTime(val)">修改到期时间</span>
+          <span v-if="tab === 1" class="cursor-pointer actions" @click="handleEdit(val)">编辑</span>
+          <!-- <span v-if="tab === 3" class="cursor-pointer actions" @click="handleUpdateExpireTime(val)">修改到期时间</span> -->
+          <span class="lines" v-if="tab !== 3"></span>
+          <span class="cursor-pointer actions" @click="handleDetail(val)">详情</span> 
         </div>
       </div>
     </div>
@@ -65,7 +71,7 @@
 </template>
 
 <script setup>
-// import { commissionCalculation } from '@/utils/position'
+import { commissionCalculation } from '@/utils/position'
 defineOptions({ name: 'enterprise-position-item'})
 import { ref } from 'vue'
 import { useRouter } from 'vue-router'
@@ -168,6 +174,17 @@ const handleSubmit = async () => {
   showExpire.value = false
   emit('refresh')
 }
+
+// 职位详情
+const handleDetail = async (val) => {
+  if (!val.id) return
+  window.open(`/recruit/enterprise/position/details?id=${val.id}`)
+}
+
+// 查看职位投递简历
+const handleToResume = (val) => {
+  router.push(`/recruit/enterprise/resume?id=${val.id}&hire=1`)
+}
 </script>
 
 <style scoped lang="scss">

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

@@ -36,8 +36,12 @@
             <span>{{ val.positionName }}</span>
           </div>
         </div>
-        <div class="d-flex align-center">
-          <v-chip v-if="(val.status-0) === 99" color="warning" label>职位待发布,支付后成功后自动发布</v-chip>
+        <div v-if="tab !== 0" class="text-center color-primary d-flex flex-column justify-center cursor-pointer" @click="handleToResume(val)">
+          <div class="font-weight-bold font-size-18">{{ val.count || 0 }}</div>
+          <div class="font-size-14">已投递简历</div>
+        </div>
+        <div v-if="(val.status-0) === 99" class="d-flex align-center">
+          <v-chip color="warning" label>职位待发布,支付后成功后自动发布</v-chip>
         </div>
       </div>
       <div class="bottom pa-5 d-flex justify-space-between align-center">
@@ -57,9 +61,9 @@
               <span class="lines"></span>
               <span class="cursor-pointer actions" @click="handleEdit(val)">{{ $t('common.edit') }}</span>
             </div>
-            <div v-if="tab === 3" class="cursor-pointer actions" @click="handleUpdateExpireTime(val)">修改到期时间</div>
+            <!-- <div v-if="tab === 3" class="cursor-pointer actions" @click="handleUpdateExpireTime(val)">修改到期时间</div> -->
             <span v-if="(val.status-0) === 99" class="cursor-pointer color-primary" @click="toPay(val)">去支付</span>
-            <span class="lines" v-if="tab !== 2"></span>
+            <span class="lines" v-if="tab !== 2 && tab !== 3"></span>
             <span v-if="tab === 2" class="cursor-pointer actions" @click="handleAction(1, '', val, val)">激活</span>
             <span class="lines" v-if="tab === 2"></span>
             <span class="cursor-pointer actions" @click="handleDetail(val)">详情</span>  
@@ -268,6 +272,11 @@ const handleDetail = async (val) => {
   if (!val.id) return
   window.open(`/recruit/enterprise/position/details?id=${val.id}`)
 }
+
+// 查看职位投递简历
+const handleToResume = (val) => {
+  router.push(`/recruit/enterprise/resume?id=${val.id}`)
+}
 </script>
 
 <style scoped lang="scss">

+ 27 - 14
src/views/recruit/enterprise/resume/components/screen.vue

@@ -40,7 +40,9 @@ import CommonStyle from './commonStyle.vue'
 
 const emit = defineEmits(['search', 'reset', 'select', 'change'])
 const props = defineProps({
-  tab: Number
+  tab: Number,
+  jobId: String,
+  hire: String
 })
 
 const selected = ref()
@@ -52,7 +54,6 @@ const list = ref([
     defaultTitle: '应聘岗位',
     key: 'jobId',
     selected: [],
-    api: getJobAdvertised,
     items: []
   },
   {
@@ -81,6 +82,18 @@ const list = ref([
   }
 ])
 
+const getJobList = async (k) => {
+  const data = await getJobAdvertised()
+  if (!data.length) return
+  const list = dealDictArrayData([], data)
+  k.items = list.map(e => {
+    const salary = e.payFrom && e.payTo ? `${e.payFrom}-${e.payTo}${e.payName ? '/' + e.payName : ''}` : '面议'
+    return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${salary}`, value: e.id }
+  })
+  return k.items
+}
+
+
 // 获取字典数据
 list.value.forEach(k => {
   if (k.dictTypeName) {
@@ -88,18 +101,7 @@ list.value.forEach(k => {
       data = data?.length && data || []
       k.items = data
     })
-  }
-  if (k.api) {
-    k.api({}).then(data => {
-      if (data.length) {
-        const list = dealDictArrayData([], data)
-        k.items = list.map(e => {
-          const salary = e.payFrom && e.payTo ? `${e.payFrom}-${e.payTo}${e.payName ? '/' + e.payName : ''}` : '面议'
-          return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${salary}`, value: e.id }
-        })
-      }
-    })
-  }
+  } else getJobList(k)
 })
 
 // 单击
@@ -110,6 +112,17 @@ const handleClick = (item, val) => {
   emit('search', { key: val.key, value: obj ? '' : item.value })
 }
 
+if (props.jobId) {
+  const job = list.value.find(e => e.key === 'jobId')
+  getJobList(job).then(data => {
+    const id = data.find(e => e.value === props.jobId)
+    handleClick(id, job)
+  })
+  if (props.hire) {
+    bounty.value = props.hire === '1' ? true : false
+  }
+}
+
 // 重置
 const handleReset = () => {
   list.value.map(e => {

+ 14 - 2
src/views/recruit/enterprise/resume/index.vue

@@ -7,7 +7,15 @@
       </v-tabs>
       <TextInput v-model="textItems.value" :item="textItems" @appendInnerClick="handleSearch" @enter="handleSearch"></TextInput>
     </div>
-    <Screen :tab="tab" @search="handleScreen" @reset="handleScreenReset" @select="handleSelect" @change="handleChangeBounty"></Screen>
+    <Screen
+     :tab="tab" 
+     :jobId="router.currentRoute.value?.query?.id" 
+     :hire="router.currentRoute.value?.query?.hire"
+      @search="handleScreen"
+      @reset="handleScreenReset"
+      @select="handleSelect"
+      @change="handleChangeBounty"
+    ></Screen>
 
     <v-window v-model="tab" class="mt-1">
       <v-window-item v-for="k in tabList" :value="k.value" :key="k.value">
@@ -28,7 +36,9 @@ import { getInterviewInvitePage } from '@/api/recruit/enterprise/interview'
 import TablePage from './components/table.vue'
 import Screen from './components/screen.vue'
 import { timesTampChange } from '@/utils/date'
+import { useRouter } from 'vue-router'
 
+const router = useRouter()
 const total = ref(0)
 const query = ref({
   pageNo: 1,
@@ -85,7 +95,8 @@ const getList = async () => {
     return obj
   })
 }
-getList()
+// 没有带id时一进来才刷新,带id由组件传值刷新
+if (!router.currentRoute.value?.query?.id) getList()
 
 // 分页
 const handleChangePage = (i) => {
@@ -105,6 +116,7 @@ const handleSearch = () => {
 const handleScreen = ({ value, key }) => {
   if (value) query.value[key] = value
   else delete query.value[key]
+  if (router.currentRoute.value?.query?.hire) query.value.hire = true
   getList()
 }
 

+ 16 - 7
src/views/recruit/personal/PersonalCenter/wallet/myBalance/index.vue

@@ -22,7 +22,7 @@
     <div class="mt-3 white-bgc pa-3 pt-3">
       <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa" @update:model-value="handleChangeTab">
         <v-tab value="rechargeDetails">{{ $t('points.rechargeDetails') }}</v-tab>
-        <!-- <v-tab :value="otherHeader">otherHeader</v-tab> -->
+        <v-tab value="balanceDetails">余额明细</v-tab>
       </v-tabs>
       <CtTable
         class="mt-3"
@@ -47,7 +47,7 @@ defineOptions({name: 'myWallet-myBalance-index'})
 import { ref } from 'vue'
 import { timesTampChange } from '@/utils/date'
 import { FenYuanTransform } from '@/utils/position'
-import { getUserWalletRechargePage } from '@/api/recruit/personal/myWallet.js'
+import { getUserWalletRechargePage, getUserBalanceDetails } from '@/api/recruit/personal/myWallet.js'
 import { useUserStore } from '@/store/user'
 
 const tab = ref('rechargeDetails')
@@ -66,6 +66,12 @@ const query = ref({
 })
 const dataList = ref([])
 
+const formatToFraction = (num) => {
+  if (typeof num === 'undefined') return '0.00'
+  const parsedNumber = typeof num === 'string' ? parseFloat(num) : num
+  return (parsedNumber / 100.0).toFixed(2)
+}
+
 const headerList = {
   rechargeDetails: [
     { title: '充值金额', key: 'payPrice', value: item =>  FenYuanTransform(item.payPrice) + '元', sortable: false },
@@ -73,13 +79,18 @@ const headerList = {
     { title: '支付订单编号', key: 'payOrderId', sortable: false },
     { title: '交易时间', key: 'payTime', value: item =>  timesTampChange(item.payTime), sortable: false },
   ],
-  // otherHeader: []
+  balanceDetails: [
+    { title: '交易类型', key: 'title', sortable: false },
+    { title: '交易金额', key: 'price', sortable: false, value: item => formatToFraction(item.price) + '元' },
+    { title: '交易后余额', key: 'balance', sortable: false, value: item => item.balance / 100 + '元' },
+    { title: '交易时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false }
+  ]
 }
 
-
 // 积分、签到明细
 const getData = async () => {
-  const res = await getUserWalletRechargePage(query.value)
+  const api = tab.value === 'rechargeDetails' ? getUserWalletRechargePage : getUserBalanceDetails
+  const res = await api(query.value)
   dataList.value = res.list
   total.value = res.total
 }
@@ -108,8 +119,6 @@ const handleRecharge = () => {
   padding: 10px 0;
   border-radius: 10px;
   background-color: var(--default-bgc);
-  // background-color: var(--color-f3);
-  // font-family: 宋体, SimSun;
 }
 .item-title {
   font-size: 20px;