Xiao_123 vor 10 Monaten
Ursprung
Commit
5ca071e48d

+ 0 - 1
components.d.ts

@@ -10,7 +10,6 @@ declare module 'vue' {
     AreaSelect: typeof import('./src/components/AreaSelect/index.vue')['default']
     Autocomplete: typeof import('./src/components/FormUI/autocomplete/index.vue')['default']
     Checkbox: typeof import('./src/components/FormUI/checkbox/index.vue')['default']
-    CitySelect: typeof import('./src/components/FormUI/citySelect/index.vue')['default']
     Combobox: typeof import('./src/components/FormUI/combobox/index.vue')['default']
     ComboboxZhAndEn: typeof import('./src/components/FormUI/comboboxZhAndEn/index.vue')['default']
     copy: typeof import('./src/components/CtForm/index copy.vue')['default']

+ 25 - 0
src/api/recruit/enterprise/interview/index.js

@@ -0,0 +1,25 @@
+import request from '@/config/axios'
+
+// 获取当前企业用户的面试信息分页
+export const getInterviewInvitePage = async (params) => {
+  return await request.get({
+    url: '/app-admin-api/menduner/system/interview-invite/page',
+    params
+  })
+}
+
+// 面试-保存、重新邀约
+export const saveInterviewInvite = async (data) => {
+  return await request.post({
+    url: '/app-admin-api/menduner/system/interview-invite/save',
+    data
+  })
+}
+
+// 取消面试
+export const cancelInterviewInvite = async (data) => {
+  return await request.post({
+    url: '/app-admin-api/menduner/system/interview-invite/cancellation',
+    data
+  })
+}

+ 1 - 1
src/hooks/web/useDictionaries.js

@@ -21,7 +21,7 @@ const setDict = (type, val, cacheTime = 7200) => {
 
 export const getDict = (type, params, apiType = 'dict') => {
     if (!type) {
-      console.error('type不存在', type, params, apiType)
+      // console.error('type不存在', type, params, apiType)
       return []
     }
     return new Promise((resolve) => {

+ 5 - 5
src/store/dict.js

@@ -6,12 +6,12 @@ const list = [
   { type: 'areaTreeData', apiFn: 'areaTreeData' },
   { type: 'positionTreeData', apiFn: 'positionTreeData' },
   { type: 'positionData', params: {}, apiFn: 'positionData' },
-  { type: 'menduenr_industry_type', params: {}, apiFn: 'industryList' },
-  { type: 'menduenr_area_type', params: {}, apiFn: 'areaList' },
-  { type: 'menduenr_education_type' },
-  { type: 'menduenr_exp_type' },
+  { type: 'menduner_industry_type', params: {}, apiFn: 'industryList' },
+  { type: 'menduner_area_type', params: {}, apiFn: 'areaList' },
+  { type: 'menduner_education_type' },
+  { type: 'menduner_exp_type' },
   { type: 'system_user_sex' },
-  { type: 'menduenr_job_type' },
+  { type: 'menduner_job_type' },
   { type: 'menduner_job_status' },
   { type: 'menduner_marital_status' },
   { type: 'menduner_pay_unit' },

+ 2 - 1
src/store/user.js

@@ -152,7 +152,8 @@ export const useUserStore = defineStore('user',
     }
    },
   {
-    persist: true
+    persist: true,
+    devtools: true
   }
 )
 

+ 37 - 0
src/utils/date.js

@@ -16,4 +16,41 @@ export const timesTampChange = (timestamp) => {
 export const getTimeStamp = (str) => {
   const date = new Date(str)
   return date.getTime()
+}
+
+// 传入一个时间戳返回这个日期的最早时间点以及最晚时间点 输出:[1721232000000, 1721318399999]
+export const getDayBounds = (timestamp) => {
+  const date = new Date(timestamp)
+  date.setHours(0, 0, 0, 0)
+  const startOfDay = date.getTime()
+  const endOfDay = new Date(timestamp)
+  endOfDay.setHours(23, 59, 59, 999)
+  if (endOfDay.getDate() !== date.getDate()) {
+    endOfDay.setDate(endOfDay.getDate() - 1)
+    endOfDay.setHours(23, 59, 59, 999)
+  }
+  // 返回包含最早和最晚时间点的时间戳的数组
+  return [startOfDay, endOfDay.getTime()]
+}
+
+// 传入 Wed May 01 2024 00:00:00 GMT+0800 (中国标准时间) 输出 [2024-07-18 00:00:00, 2024-07-18 23:59:59]
+export const getStartAndEndOfDay = (dateString) => {
+  const date = new Date(dateString + ' UTC')
+  if (isNaN(date.getTime())) {
+    throw new Error('Invalid date string')
+  }
+
+  const startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate())
+  const endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
+
+  function formatDate(dateObj) {
+    let month = ('0' + (dateObj.getMonth() + 1)).slice(-2)
+    let day = ('0' + dateObj.getDate()).slice(-2)
+    let hours = ('0' + dateObj.getHours()).slice(-2)
+    let minutes = ('0' + dateObj.getMinutes()).slice(-2)
+    let seconds = ('0' + dateObj.getSeconds()).slice(-2)
+    return dateObj.getFullYear() + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+  }
+
+  return [formatDate(startDate), formatDate(endDate)]
 }

+ 106 - 0
src/views/recruit/enterprise/interview/components/invite.vue

@@ -0,0 +1,106 @@
+<template>
+  <CtForm ref="CtFormRef" :items="formItems" style="height: 420px;">
+    <template #time="{ item }">
+      <VueDatePicker 
+        v-model="item.value"
+        placeholder="面试时间 *"
+        class="mb-4"
+        model-type="timestamp"
+        :text-input="{ format: 'MM.dd.yyyy HH:mm' }" />
+    </template>
+  </CtForm>
+</template>
+
+<script setup>
+defineOptions({ name: 'formPage'})
+import { ref } from 'vue'
+
+const props = defineProps({
+  itemData: {
+    type: Object,
+    default: () => {}
+  },
+  position: {
+    type: Array,
+    default: () => []
+  }
+})
+
+const CtFormRef = ref()
+const formItems = ref({
+  options: [
+    {
+      slotName: 'time',
+      key: 'time',
+      value: ref(),
+      rules: [v => !!v || '请选择面试时间'],
+    },
+    {
+      type: 'autocomplete',
+      key: 'jobId',
+      value: null,
+      label: '招聘职位 *',
+      outlined: true,
+      clearable: false,
+      itemText: 'label',
+      itemValue: 'value',
+      rules: [v => !!v || '请选择招聘职位'],
+      items: props.position
+    },
+    {
+      type: 'text',
+      key: 'address',
+      value: '',
+      label: '面试地点 *',
+      rules: [v => !!v || '请输入面试地点'],
+    },
+    {
+      type: 'text',
+      key: 'invitePhone',
+      value: null,
+      label: '联系电话 *',
+      outlined: true,
+      rules: [v => !!v || '请填写联系电话']
+    },
+    {
+      type: 'textarea',
+      key: 'remark',
+      value: '',
+      label: '备注事项',
+      counter: 140,
+      rules: [
+        value => {
+          if (value?.length <= 140) return true
+          return '请输入备注事项,最多140字'
+        }
+      ]
+    }
+  ]
+})
+
+if (Object.keys(props.itemData).length) {
+  formItems.value.options.forEach(item => {
+    item.value = props.itemData[item.key]
+  })
+}
+
+const getQuery = () => {
+  const obj = {}
+  formItems.value.options.forEach(item => {
+    obj[item.key] = item.value
+  })
+  obj.type = 1
+  obj.id = props.itemData.id
+  obj.userId = props.itemData.userId
+  return obj
+}
+
+defineExpose({
+  CtFormRef,
+  getQuery
+})
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 243 - 115
src/views/recruit/enterprise/interview/index.vue

@@ -4,38 +4,36 @@
     <div class="d-flex justify-space-between">
       <div class="d-flex mb-3">
         <!-- 职位 -->
-        <v-select 
-          v-model="positionValue" 
+        <v-autocomplete 
+          v-model="query.jobId" 
           :items="positionItems" 
           density="compact" 
           variant="outlined" 
           item-title="label" 
-          item-value="value" 
-          hide-details 
+          item-value="value"
+          clearable
+          hide-details
+          label="职位"
           color="primary"
-          style="width: 150px;"
+          style="width: 300px;"
           class="mr-3"
-          @update:model-value="handlePositionChange"
-        ></v-select>
-        <!-- 状态 -->
+        ></v-autocomplete>
         <v-select 
-          v-model="stateValue" 
-          :items="stateItems" 
+          v-model="query.status" 
+          :items="statusList" 
           density="compact" 
           variant="outlined" 
           item-title="label" 
-          item-value="value" 
-          hide-details 
+          item-value="value"
+          clearable
+          hide-details
+          label="面试状态"
           color="primary"
-          style="width: 150px;"
-          @update:model-value="handleStateChange"
+          style="width: 300px;"
         ></v-select>
+        <v-btn color="primary" class="half-button ml-3" @click="handleSearch">查 询</v-btn>
+        <v-btn class="half-button ml-3" variant="outlined" color="primary" @click="handleReset">重 置</v-btn>
       </div>
-      <!-- <div class="mr-3 mb-3 px-2 py-1" style="background-color: var(--color-999); color: #fff; border-radius: 5px;">
-        <v-icon size="30">mdi mdi-view-list-outline</v-icon>
-        <v-icon size="30">mdi mdi-circle-small</v-icon>
-      </div> -->
-      <div></div>
     </div>
     <v-divider class="mb-3"></v-divider>
     <div class="d-flex">
@@ -43,136 +41,266 @@
         <div class="d-flex justify-space-between px-5">
           <div v-if="selectDateValue">
             <span>{{ timesTampChange(selectDateValue).slice(0, 10) }}</span>
-            <span class="ml-2" style="cursor: pointer;" @click="selectDateValue = null">{{ $t('common.cleanUp') }}</span>
+            <span class="ml-2" style="cursor: pointer;" @click="handleClear">{{ $t('common.cleanUp') }}</span>
           </div>
-          <div v-else class="color999">{{ $t('interview.noDateSelected') }}</div>
+          <div v-else class="color-999">{{ $t('interview.noDateSelected') }}</div>
           <v-btn color="primary" variant="text" size="small" @click="selectDateValue = new Date()">{{ $t('interview.today') }}</v-btn>
         </div>
         <v-date-picker
           v-model="selectDateValue"
           color="primary"
-          show-adjacent-months
           :hide-header="true"
-          @update:modelValue="handleCurrentChange"
+          @update:modelValue="handleChangeDate"
           class="mr-3"
-        ></v-date-picker>
+        >
+        </v-date-picker>
       </div>
       <v-divider style="height: auto;" class="mr-5" vertical></v-divider>
       <div style="flex: 1;overflow: hidden;">
-        <div
-          class="listItem d-flex align-center justify-space-between pa-3 mb-3"
-          style="width: 100%;min-width: 900px;overflow: auto;height: 76px;border: 1px solid #e5e6eb;border-radius: 5px;"
-          v-for="(item, index) in dataList" :key="'item_' + index"
-        >
-          <div class="d-flex align-center">
-            <span class="mr-2">{{ item.date }}</span>
-            <span class="mr-5 fz16" style="color: orange;">{{ item.time }}</span>
-            <v-avatar class="mr-2" size=50 :image="item?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
-            <div class="d-flex flex-column mr-3" style="width: 110px;">
-              <span class="ellipsis mb-1">{{ item?.name }}</span>
-              <span class="ellipsis" style="color: var(--color-999);">{{ item?.job }}</span>
+        <div v-if="items.length">
+          <div
+            class="listItem d-flex align-center justify-space-between pa-3 mb-3"
+            v-for="(item, index) in items" :key="'item_' + index"
+          >
+            <div class="d-flex align-center">
+              <span class="mr-5 font-size-16" style="color: orange;">{{ timesTampChange(item.time) }}</span>
+              <v-avatar class="mr-2" size=40 :image="item?.person?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
+              <div class="d-flex flex-column mr-3" style="width: 110px;">
+                <span class="ellipsis mb-1">{{ item?.person?.name }}</span>
+                <span class="ellipsis" style="color: var(--color-999);">{{ item?.job?.name }}</span>
+              </div>
             </div>
-            <span style="min-width: 100px;">离职-随时到岗</span>
-          </div>
-          <span style="min-width: 120px;text-align: center;">
-            <v-icon v-if="item?.phone" class="mx-1" size="20" color="primary">mdi-phone-outline</v-icon>
-            <span>{{ item?.phone || '-' }}</span>
-          </span>
-          <!-- 面试类型: 线下面试 -->
-          <span v-if="item.interviewType === 1">
-            <v-icon class="mx-3" size="20" color="primary">mdi-account-multiple-outline</v-icon>
-            <span>{{ $t('interview.offlineInterview') }}</span>
-          </span>
-          <!-- 面试类型: 线上面试 -->
-          <span class="d-flex" v-else>
-            <v-icon class="mx-3 mt-2" size="20" color="primary">mdi mdi-video-account</v-icon>
-            <span class="d-flex flex-column">
-              <span>{{ $t('interview.onlineInterview') }}</span>
-              <span style="color: var(--color-999);">腾讯会议</span>
+            <span style="min-width: 80px;text-align: center;">
+              <v-icon v-if="item?.phone" class="mx-1" size="20" color="primary">mdi-phone-outline</v-icon>
+              <span>{{ item?.phone || '-' }}</span>
+            </span>
+            <!-- 面试类型: 线下面试 -->
+            <span v-if="item.type === '1'">
+              <v-icon class="mx-3" size="20" color="primary">mdi-account-multiple-outline</v-icon>
+              <span>{{ $t('interview.offlineInterview') }}</span>
             </span>
-          </span>
-          <!-- 面试状态: '待接受'/'已取消' -->
-           <span :style="{ 'color': item.interviewStatus ? 'orange' :'var(--color-999)'}">
-            <v-icon size="30">mdi mdi-circle-small</v-icon>
-            <span>{{ $t(item.interviewStatus ? 'interview.waitingForAcceptance' :'interview.canceled') }}</span>
-           </span>
-          <span>
-            <span class="fz15 primaryColor">{{ item.interviewStatus ? '修改面试' :'重新邀请' }}</span>
-            <v-icon class="mx-3" size="20" color="primary">mdi-dots-horizontal</v-icon>
-          </span>
+            <!-- 面试类型: 线上面试 -->
+            <span class="d-flex" v-else>
+              <v-icon class="mx-3 mt-2" size="20" color="primary">mdi mdi-video-account</v-icon>
+              <span class="d-flex flex-column">
+                <span>{{ $t('interview.onlineInterview') }}</span>
+                <span style="color: var(--color-999);">腾讯会议</span>
+              </span>
+            </span>
+            <!-- 面试状态: '待接受'/'已取消' -->
+            <span :style="{ 'color': item.status !== '99' ? 'orange' :'var(--color-999)'}">
+              <v-icon size="30">mdi mdi-circle-small</v-icon>
+              <span>{{ statusList.find(e => e.value === item.status)?.label }}</span>
+            </span>
+            <span>
+              <span v-if="editStatus.indexOf(item.status)" class="font-size-15 color-primary" @click="handleActionClick(2, item)">修改面试</span>
+              <v-menu>
+                <template v-slot:activator="{ props }">
+                  <v-icon v-bind="props" class="mx-3" size="20" color="primary">mdi-dots-horizontal</v-icon>
+                </template>
+                <v-list>
+                  <v-list-item
+                    v-for="(k, index) in actionItems"
+                    :key="index"
+                    :value="index"
+                    color="primary"
+                    @click="handleActionClick(k.value, item)"
+                  >
+                    <v-list-item-title>{{ k.title }}</v-list-item-title>
+                  </v-list-item>
+                </v-list>
+              </v-menu>
+            </span>
+          </div>
+          <CtPagination
+            v-if="total > 0"
+            :total="total"
+            :page="query.pageNo"
+            :limit="query.pageSize"
+            @handleChange="handleChangePage"
+          ></CtPagination>
         </div>
+        <Empty v-else :elevation="false"></Empty>
       </div>
     </div>
   </v-card>
+
+  <!-- 修改面试 -->
+  <CtDialog :visible="showInvite" :widthType="2" titleClass="text-h6" title="面试邀请" @close="handleClose" @submit="handleSubmit">
+    <InvitePage v-if="showInvite" ref="inviteRef" :itemData="itemData" :position="positionItems"></InvitePage>
+  </CtDialog>
+
+  <CtDialog :visible="cancelInvite" :widthType="2" titleClass="text-h6" title="取消面试" @close="handleCancelClose" @submit="handleCancelSubmit">
+    <TextInput v-model="cancelQuery.reason" :item="textItems"></TextInput>
+  </CtDialog>
 </template>
 
 <script setup>
-import { timesTampChange } from '@/utils/date'
-import { ref } from 'vue'
 defineOptions({ name: 'enterprise-interview'})
+import { ref } from 'vue'
+import { getInterviewInvitePage, saveInterviewInvite, cancelInterviewInvite } from '@/api/recruit/enterprise/interview'
+import InvitePage from './components/invite.vue'
+import { getDict } from '@/hooks/web/useDictionaries'
+import Snackbar from '@/plugins/snackbar'
+import { getJobAdvertised } from '@/api/enterprise'
+import { dealDictArrayData } from '@/utils/position'
+import { timesTampChange, getStartAndEndOfDay } from '@/utils/date'
 
-const dataList = ref([
-  {
-    avatar: 'http://menduner.citupro.com:6868/admin-api/infra/file/24/get/241e594d4473872eabb312673f42241a2e9598298cb7d9d791cc9c8cb65fb058.jpg',
-    name: '王瑶',
-    job: '软件测试',
-    phone: '18406571583',
-    date: '2024-06-14',
-    time: '11:00',
-    interviewType: 1,
-    interviewStatus: 1,
-  },
-  {
-    name: '黄小姐',
-    job: '软件测试-实习岗位',
-    phone: '',
-    date: '2024-06-14',
-    time: '15:00',
-    interviewType: 2,
-    interviewStatus: 0,
-  },
+const cancelInvite = ref(false)
+const showInvite = ref(false)
+const inviteRef = ref()
+const items = ref([])
+const cancelQuery = ref({
+  id: null,
+  reason: null
+})
+const editStatus = ['99', '1', '0']
+const statusList = ref()
+const itemData = ref({})
+// 状态
+const actionItems = ref([
+  // { title: '沟通', value: 1 },
+  // { title: '修改面试', value: 2 },
+  { title: '取消面试', value: 3 },
+  // { title: '面试记录', value: 4 }
 ])
+const total = ref(0)
+const query = ref({
+  pageSize: 10,
+  pageNo: 1,
+  status: null,
+  jobId: null,
+  time: []
+})
+const textItems = ref({
+  type: 'text',
+  label: '取消原因 *',
+  clearable: true
+})
+
+// 状态字典
+const getStatusList = async () => {
+  const { data } = await getDict('menduner_interview_invite_status')
+  statusList.value = data
+}
+getStatusList()
+
+// 列表
+const getData = async () => {
+  const { list, total: number } = await getInterviewInvitePage(query.value)
+  items.value = list
+  total.value = number
+}
+getData()
+
+// 分页
+const handleChangePage = (e) => {
+  query.value.pageNo = e
+  getData()
+}
 
-const selectDateValue = ref(null) // new Date(); new Date('2018-03-02')
-const handleCurrentChange = (val, val1) => {
-  console.log('1', val, val1)
+// 日期选择
+const selectDateValue = ref(null)
+const handleChangeDate = () => {
+  const time = getStartAndEndOfDay(selectDateValue.value)
+  if (!time || !time.length) return delete query.value.time
+  query.value.time = time
+  query.value.pageNo = 1
+  getData()
+}
+// 清除
+const handleClear = () => {
+  query.value.pageNo = 1
+  selectDateValue.value = null
+  delete query.value.time 
+  getData()
+}
+
+const handleSearch = () => {
+  query.value.pageNo = 1
+  getData()
+}
+
+const handleReset = () => {
+  query.value = {
+    pageSize: 10,
+    pageNo: 1,
+    status: null,
+    jobId: null,
+    time: []
+  }
+  selectDateValue.value = null
+  getData()
 }
 
 // 职位
-const positionValue = ref('0')
-const positionItems = ref([
-  { label: '全部职位', value: '0' },
-  { label: '软件测试(10-11K)', value: '1' },
-])
-const handlePositionChange = (val) => {
-  console.log('1', val)
+const positionItems = ref([])
+const getPositionList = async () => {
+  const data = await getJobAdvertised({ hire: false })
+  if (!data.length) return
+  const list = dealDictArrayData([], data)
+  positionItems.value = list.map(e => {
+    return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${e.payFrom}-${e.payTo}/${e.payName}`, value: e.id }
+  })
 }
-// 状态
-const stateValue = ref('0')
-const stateItems = ref([
-  { label: '全部状态', value: '0' },
-  { label: '待接受', value: '1' },
-  { label: '待面试', value: '1' },
-  { label: '即将面试', value: '1' },
-  { label: '面试时间到', value: '1' },
-  { label: '已完成', value: '1' },
-  { label: '待反馈', value: '1' },
-  { label: '已反馈', value: '1' },
-])
-const handleStateChange = (val) => {
-  console.log('1', val)
+getPositionList()
+
+// 操作按钮
+const handleActionClick = (value, item) => {
+  // 修改
+  if (value === 2) {
+    itemData.value = item
+    showInvite.value = true
+  }
+  // 取消
+  if (value === 3) {
+    cancelQuery.value.id = item.id
+    cancelInvite.value = true
+  }
+}
+
+// 修改面试
+const handleClose = () => {
+  itemData.value = {}
+  showInvite.value = false
+}
+
+const handleSubmit = async () => {
+  const query = inviteRef.value.getQuery()
+  if (!Object.keys(query).length) return
+  await saveInterviewInvite(query)
+  Snackbar.success('操作成功')
+  handleClose()
+  getData()
+}
+
+// 取消面试
+const handleCancelClose = () => {
+  cancelInvite.value = false
+  cancelQuery.value = {
+    id: null,
+    reason: null
+  }
+}
+
+const handleCancelSubmit = async () => {
+  if (!cancelQuery.value.reason) return Snackbar.warning('请填写取消原因')
+  await cancelInterviewInvite(cancelQuery.value)
+  Snackbar.success('操作成功')
+  handleCancelClose()
+  getData()
 }
 </script>
 
 <style scoped lang="scss">
-.fz14 { font-size: 14px; }
-.fz15 { font-size: 15px; }
-.fz16 { font-size: 16px; }
-.color666 { color: var(--color-666); }
-.color999 { color: var(--color-999); }
-.primaryColor { color: var(--v-primary-base); }
 .listItem {
   cursor: pointer;
+  width: 100%;
+  min-width: 600px;
+  overflow: auto;
+  height: 76px;
+  border: 1px solid #e5e6eb;
+  border-radius: 5px;
   
   &:hover {
     background-color: var(--color-f8);

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

@@ -79,7 +79,7 @@ list.value.forEach(k => {
       if (data.length) {
         const list = dealDictArrayData([], data)
         k.items = list.map(e => {
-          return { label: `${e.name}_${e.areaName} ${e.payFrom}-${e.payTo}/${e.payName}`, value: e.id }
+          return { label: `${e.name}${e.areaName ? '_' + e.areaName : ''} ${e.payFrom}-${e.payTo}/${e.payName}`, value: e.id }
         })
       }
     })

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

@@ -34,6 +34,7 @@
           <v-btn color="primary" variant="text" @click="handleAction('', 0, item)">不合适</v-btn>
         </div>
         <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>
         </div>
       </template>
@@ -100,6 +101,10 @@ const handlePreviewResume = async ({ url, id }) => {
   await personJobCvLook(id)
   previewFile(url)
 }
+
+const handleInterviewInvite = (item) => {
+  console.log(item, 'item')
+}
 </script>
 
 <style scoped lang="scss">

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

@@ -17,7 +17,7 @@
       </v-timeline>
       <div class="text-center mb">
         <v-btn class="half-button mr-3" color="primary" variant="outlined" @click="handleCancel">{{ $t('common.cancel') }}</v-btn>
-        <v-btn class="half-button" color="primary" @click="recharge = true">{{ $t('common.release') }}</v-btn>
+        <v-btn class="half-button" color="primary" @click="handleSave">{{ $t('common.release') }}</v-btn>
       </div>
     </v-card>
 

+ 10 - 12
src/views/recruit/enterprise/positionManagement/components/baseInfo.vue

@@ -8,7 +8,7 @@
         </span>
       </template>
       <template #ratio>
-        <div class="color-666 mb-3">
+        <div class="font-size-13 mb-3" style="color: red;">
           众聘岗位分配比例:平台占比{{ ratio.headhuntRate }}%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 推荐人占比{{ ratio.recommendRate }}%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投递人占比{{ ratio.cvRate }}%
         </div>
       </template>
@@ -91,10 +91,6 @@ const handleChangePublic = (val) => {
   })
 }
 
-const handleBlur = (item, val) => {
-  console.log(item, val, 'blur')
-}
-
 const formPageRef = ref()
 let query = reactive({})
 
@@ -131,12 +127,19 @@ const items = ref({
       hide: true,
       disabled: false,
       noParam: true,
+      hideDetails: true,
       items: [
         { label: '赏金', value: true },
         { label: '积分', value: false }
       ],
       change: handleChangeHireType
     },
+    {
+      slotName: 'ratio',
+      noParam: true,
+      show: true,
+      hide: true
+    },
     {
       type: 'number',
       key: 'hirePrice',
@@ -154,8 +157,7 @@ const items = ref({
           if (value >= 1) return true
           return '赏金金额不得小于1'
         }
-      ],
-      blur: handleBlur
+      ]
     },
     {
       type: 'number',
@@ -177,11 +179,7 @@ const items = ref({
         }
       ]
     },
-    {
-      slotName: 'ratio',
-      noParam: true,
-      hide: false
-    },
+    
     {
       type: 'text',
       key: 'name',