Jelajahi Sumber

企业找人:搜索条件调整,招聘会职位列表展示调整

Xiao_123 1 bulan lalu
induk
melakukan
97bf471cfe

+ 15 - 14
src/views/recruit/enterprise/jobFair/components/jobItem.vue

@@ -39,14 +39,17 @@
           <div v-else></div>
           <!-- 进行中的招聘会方可操作 -->
           <div class="d-flex justify-end bottom-item" v-if="status">
-            <span class="cursor-pointer actions" @click="handleEdit(val)">编辑</span>
-            <span class="lines"></span>
-            <span class="cursor-pointer actions" @click="handleRemove(val)">移出招聘会</span>
+            <span v-if="tab === '0'">
+              <span class="cursor-pointer actions" @click="handleEdit(val)">编辑</span>
+              <span class="lines"></span>
+              <span class="cursor-pointer actions" @click="handleAction(0, val.id)">关闭</span>
+            </span>
+            <span v-else class="cursor-pointer actions" @click="handleAction(1, val.id)">激活</span>
           </div>
         </div>
       </div>
     </div>
-    <div v-else class="empty-text">暂无数据,去发布职位看看吧~</div>
+    <div v-else class="empty-text">暂无数据</div>
   </div>
 
   <Loading :visible="loading"></Loading>
@@ -59,14 +62,15 @@ import { useRouter, useRoute } from 'vue-router'
 import { timesTampChange } from '@/utils/date'
 import Snackbar from '@/plugins/snackbar'
 import { getEnterprisePubJobTypePermission } from '@/api/recruit/enterprise/position'
-import { quitJobFairPosition } from '@/api/recruit/enterprise/jobFair'
 import Confirm from '@/plugins/confirm'
 import { formatName } from '@/utils/getText'
 import { getUserAvatar } from '@/utils/avatar'
+import { closeJobAdvertised, enableJobAdvertised } from '@/api/position'
 
 const emit = defineEmits(['refresh'])
 defineProps({
   items: Array,
+  tab: String,
   status: Boolean // 招聘会状态
 })
 
@@ -81,19 +85,16 @@ const handleEdit = async (val) => {
   router.push(`/recruit/enterprise/jobFair/details/${route.params.id}/edit?id=${val.id}`)
 }
 
-
-const handleRemove = ({ id }) => {
-  Confirm('系统提示', '是否确认将此职位移出招聘会?').then(async () => {
+// 关闭、激活职位
+const handleAction = (type, id) => {
+  Confirm('系统提示', `是否确认${type === 0 ? '关闭' : '激活'}此职位?`).then(async () => {
+    const api = type === 0 ? closeJobAdvertised : enableJobAdvertised
     try {
-      await quitJobFairPosition({
-        jobFairId: route.params.id,
-        jobId: id
-      })
-      Snackbar.success('移出成功')
+      await api(id)
+      Snackbar.success(`${type === 0 ? '关闭' : '激活'}成功`)
       emit('refresh')
     } catch {}
   })
-  
 }
 
 // 查看职位投递简历

+ 60 - 14
src/views/recruit/enterprise/jobFair/details.vue

@@ -27,7 +27,7 @@
           :style="`color: ${jobFairInfo?.backgroundColour || 'var(--v-primary-base)'}`"
           @click="handleJoin"
           prepend-icon="mdi-check-circle-outline"
-        >克隆普通职位加入招聘会</v-btn>
+        >克隆已有职位加入招聘会</v-btn>
         <v-btn
           color="#fff"
           v-if="jobFairInfo?.contentImg"
@@ -37,7 +37,20 @@
         >我的分享海报</v-btn>
       </div>
       <div v-if="jobListLoading" class="centerText color-777">加载中...</div>
-      <JobItem v-else :items="jobList" :status="jobFairInfo?.status === '0'" @refresh="getJobList"></JobItem>
+      <div v-else>
+        <v-tabs v-model="tab" align-tabs="start" class="mb-3" color="primary" bg-color="#fff" @update:model-value="handleChangeTab">
+          <v-tab value="0">招聘中</v-tab>
+          <v-tab value="1">已关闭</v-tab>
+        </v-tabs>
+        <JobItem :items="jobList" :status="jobFairInfo?.status === '0'" :tab="tab" @refresh="getJobList"></JobItem>
+        <CtPagination
+          v-if="tab === '1' && pageTotal"
+          :total="pageTotal"
+          :page="pageInfo.pageNo"
+          :limit="pageInfo.pageSize"
+          @handleChange="changePage"
+        ></CtPagination>
+      </div>
 
       <v-navigation-drawer v-model="showDrawer" location="right" temporary width="600">
         <Loading :visible="positionLoading" :contained="true"></Loading>
@@ -67,20 +80,28 @@
             <div>
               <div class="position" style="padding: 10px 20px;">
                 <div class="d-flex align-center justify-space-between">
-                  <span class="position-name" v-ellipse-tooltip>{{ formatName(val.name) }}</span>
+                  <div v-ellipse-tooltip style="flex: 1;">
+                    <svg-icon v-if="val.jobFairId" class="mr-1" name="jobFair" size="20"></svg-icon>
+                    <span class="font-size-19 color-333">{{ formatName(val.name) }}</span>
+                  </div>
+                  <div v-if="val.status === '1'" class="color-error font-size-13 text-end" style="width: 60px;">已关闭</div>
                 </div>
-                <div :class="['mt-3', 'other-info', 'ellipsis']">
+                <div class="mt-1 font-size-13 color-666 ellipsis">
                   <span>{{ val.areaName ? val.area?.str : '全国' }}</span>
                   <span class="lines" v-if="val.eduName"></span>
                   <span>{{ val.eduName }}</span>
                   <span class="lines"></span>
                   <span>{{ val.expName }}</span>
                   <span class="lines"></span>
-                  <span v-if="!val.payFrom && !val.payTo">面议</span>
-                  <span v-else>{{ val.payFrom ? val.payFrom + '-' : '' }}{{ val.payTo }}{{ val.payName ? '/' + val.payName : '' }}</span>
+                  <span>
+                    {{ !val.payFrom && !val.payTo ? '面议' : val.payFrom ? (val.payFrom + '-' + val.payTo + (val.payName ? '/' + val.payName : '')) : '' }}
+                  </span>
                   <span class="lines" v-if="val.positionName"></span>
                   <span>{{ val.positionName }}</span>
                 </div>
+                <div v-if="val.jobFairName" v-ellipse-tooltip class="font-size-13 color-primary mt-1" style="max-width: 100%;">
+                  招聘会:{{ val.jobFairName }}
+                </div>
               </div>
               <div
                 class="d-flex align-center"
@@ -159,6 +180,7 @@ const positionLoading = ref(false)
 const positionPageInfo = ref({
   pageSize: 10,
   pageNo: 1,
+  hire: false
 })
 const positionSearch = ref('')
 
@@ -171,19 +193,48 @@ const logoUrl = ref(entBaseInfo.value.logoUrl)
 const previewSrc  = ref('')
 const positionList = ref([])
 
+const tab = ref('0')
+
 // 职位列表
+const pageTotal = ref(0)
+const pageInfo = ref({
+  pageSize: 10,
+  pageNo: 1
+})
 const jobListLoading = ref(true)
 const getJobList = async (type) => {
+  const api = tab.value === '0' ? getJobFairPosition : getJobAdvertisedList
+  const query = tab.value === '0' ? id : {
+    ...pageInfo.value,
+    status: '1',
+    jobFairId: id,
+    hire: false
+  }
   try {
-    const data = await getJobFairPosition(id)
-    if (!data || !data.length) return jobList.value = []
-    jobList.value = dealDictArrayData([], data)
+    const data = await api(query)
+
+    const arr = tab.value === '0' ? data : data.list
+    if (!arr || !arr.length) return jobList.value = []
+
+    jobList.value = dealDictArrayData([], arr)
+    if (tab.value === '1') pageTotal.value = data.total
+
     if (type === '刷新') Snackbar.success('刷新成功')
   } finally {
     jobListLoading.value = false
   }
 }
 
+const changePage = (val) => {
+  pageInfo.value.pageNo = val
+  getJobList()
+}
+
+const handleChangeTab = () => {
+  jobList.value = []
+  getJobList()
+}
+
 // 新增招聘会职位
 const handleAdd = async () => {
   const data = await getEnterprisePubJobTypePermission()
@@ -272,11 +323,6 @@ const handleShare = () => {
   position: relative;
   border: 1px solid #e5e6eb;
 }
-.position-name {
-  max-width: 100%;
-  color: var(--color-333);
-  font-size: 19px;
-}
 .position {
   width: 100%;
   position: relative;

+ 0 - 1
src/views/recruit/enterprise/positionManagement/components/item.vue

@@ -21,7 +21,6 @@
           </div>
           <div class="d-flex align-center" :class="{'cursor-pointer': tab === 1, 'ml-15': tab === 1}" @click="handleDetail(val)">
             <span class="position-name" v-ellipse-tooltip>{{ formatName(val.name) }}</span>
-            <svg-icon v-if="val.jobFairIds?.length" name="jobFair" class="ml-1" size="25"></svg-icon>
           </div>
           <div :class="['mt-3', 'other-info', 'ellipsis', {'ml-10': tab === 1}]">
             <span>{{ !val.areaId ? '全国' : val.area?.str }}</span>

+ 15 - 15
src/views/recruit/enterprise/positionManagement/index.vue

@@ -73,22 +73,29 @@
           <div v-for="val in positionItems" :key="val.id" class="itemBox mb-3">
             <div>
               <div class="position" style="padding: 10px 20px;">
-                <div class="d-flex align-center">
-                  <svg-icon v-if="val.jobFairIds?.length" class="mr-1" name="jobFair" size="20"></svg-icon>
-                  <span class="position-name" v-ellipse-tooltip>{{ formatName(val.name) }}</span>
+                <div class="d-flex align-center justify-space-between">
+                  <div v-ellipse-tooltip style="flex: 1;">
+                    <svg-icon v-if="val.jobFairId" class="mr-1" name="jobFair" size="20"></svg-icon>
+                    <span class="color-333" style="">{{ formatName(val.name) }}</span>
+                  </div>
+                  <div v-if="val.status === '1'" class="color-error font-size-13 text-end" style="width: 60px;">已关闭</div>
                 </div>
-                <div :class="['mt-1', 'other-info', 'ellipsis']">
+                <div class="mt-1 font-size-13 color-666 ellipsis">
                   <span>{{ val.areaName ? val.area?.str : '全国' }}</span>
                   <span class="lines" v-if="val.eduName"></span>
                   <span>{{ val.eduName }}</span>
                   <span class="lines"></span>
                   <span>{{ val.expName }}</span>
                   <span class="lines"></span>
-                  <span v-if="!val.payFrom && !val.payTo">面议</span>
-                  <span v-else>{{ val.payFrom ? val.payFrom + '-' : '' }}{{ val.payTo }}{{ val.payName ? '/' + val.payName : '' }}</span>
+                  <span>
+                    {{ !val.payFrom && !val.payTo ? '面议' : val.payFrom ? (val.payFrom + '-' + val.payTo + (val.payName ? '/' + val.payName : '')) : '' }}
+                  </span>
                   <span class="lines" v-if="val.positionName"></span>
                   <span>{{ val.positionName }}</span>
                 </div>
+                <div v-if="val.jobFairName" v-ellipse-tooltip class="font-size-13 color-primary mt-1" style="max-width: 100%;">
+                  招聘会:{{ val.jobFairName }}
+                </div>
               </div>
               <div
                 class="d-flex align-center"
@@ -291,7 +298,8 @@ const positionLoading = ref(false)
 const positionSearch = ref('')
 const positionPageInfo = ref({
   pageNo: 1,
-  pageSize: 10
+  pageSize: 10,
+  hire: false
 })
 const getList = async () => {
   positionLoading.value = true
@@ -336,10 +344,6 @@ const handleTo = (val) => {
   position: relative;
   border: 1px solid #e5e6eb;
 }
-.position-name {
-  color: var(--color-333);
-  font-size: 16px;
-}
 .position {
   position: relative;
   .item-select {
@@ -356,10 +360,6 @@ const handleTo = (val) => {
   background-color: #e0e0e0;
   margin: 0 10px;
 }
-.other-info {
-  font-size: 13px;
-  color: var(--color-666);
-}
 .bottom {
   position: absolute;
   bottom: 0;

+ 45 - 11
src/views/recruit/enterprise/search/retrieval/index.vue

@@ -1,17 +1,50 @@
 <template>
   <div>
-    <div class="d-flex justify-center mt-4 mb-6">
-      <TextInput v-model="queryParams.content" :item="textItem" @enter="handleConfirm" @appendInnerClick="handleConfirm(false)"></TextInput>
-    </div>
-    <div>
+    <div class="mt-5">
       <div class="font-size-15 d-flex align-center color-666">
-        <span :class="queryParams.positionIds?.length ? 'color-primary' : 'color-777'">职位类型:</span>
-        <cascade v-model="queryParams.positionIds" :item="positionItems" @change="val => handleSearch('positionIds', val)" style="width: 300px;"></cascade>
-        <span class="ml-10" :class="queryParams.areaIds?.length ? 'color-primary' : 'color-777'">地区:</span>
+        <span style="margin-right: 22px;">关键字</span>
+        <TextInput v-model="queryParams.content" :item="textItem"></TextInput>
+        <span class="ml-10">酒店品牌</span>
+        <div style="width: 292px;" class="ml-2">
+          <v-text-field
+            v-model="queryParams.brand"
+            variant="outlined"
+            clearable
+            hide-details
+            color="primary"
+            label="酒店品牌"
+            placeholder="请输入酒店品牌"
+            density="compact"
+          ></v-text-field>
+        </div>
+      </div>
+      <div class="font-size-15 d-flex align-center color-666 my-5">
+        <span :class="queryParams.areaIds?.length ? 'color-primary' : 'color-777'">所在城市</span>
         <cascade v-model="queryParams.areaIds" :item="selectItems" @change="val => handleSearch('areaIds', val)" style="width: 300px;"></cascade>
+        <span class="ml-10" :class="queryParams.workAreaIds?.length ? 'color-primary' : 'color-777'">工作城市</span>
+        <cascade v-model="queryParams.workAreaIds" :item="selectItems" @change="val => handleSearch('workAreaIds', val)" style="width: 300px;"></cascade>
+      </div>
+      <div class="font-size-15 d-flex align-center color-666">
+        <span :class="queryParams.positionIds?.length ? 'color-primary' : 'color-777'">职位类型</span>
+        <cascade v-model="queryParams.positionIds" :item="positionItems" @change="val => handleSearch('positionIds', val)" style="width: 300px;"></cascade>
       </div>
-      <CommonPage :isClear="clear" @clear="clear = false" labelActiveColor class="my-3" dictType="menduner_education_type" title="最高学历" @select="val => handleSearch('eduType', val)"></CommonPage>
-      <CommonPage :isClear="clear" @clear="clear = false" labelActiveColor dictType="menduner_exp_type" title="工作经验" @select="val => handleSearch('expType', val)"></CommonPage>
+      <CommonPage
+        :isClear="clear"
+        @clear="clear = false"
+        labelActiveColor
+        class="my-3"
+        dictType="menduner_education_type"
+        title="最高学历"
+        @select="val => handleSearch('eduType', val)"
+      ></CommonPage>
+      <CommonPage
+        :isClear="clear"
+        @clear="clear = false"
+        labelActiveColor
+        dictType="menduner_exp_type"
+        title="工作经验"
+        @select="val => handleSearch('expType', val)"
+      ></CommonPage>
       <v-divider class="mt-1 mb-3"></v-divider>
       <div>
       </div>
@@ -126,12 +159,11 @@ import { formatName } from '@/utils/getText'
 const formLoading = ref(false)
 const textItem = ref({
   type: 'text',
-  width: 600,
+  width: 292,
   value: '',
   label: '输入关键字',
   clearable: true,
   hideDetails: true,
-  appendInnerIcon: 'mdi-magnify',
   placeholder: '请输入'
 })
 const query = ref({
@@ -143,6 +175,8 @@ const queryParams = ref({
   positionIds: [],
   areaIds: [],
   positionIds: [],
+  workAreaIds: [],
+  brand: '',
   expType: '',
   eduType: ''
 })