Browse Source

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

lifanagju_citu 2 months ago
parent
commit
68ee233a06

+ 20 - 0
src/api/menduner/system/jobFair/manage/index.ts

@@ -81,5 +81,25 @@ export const JobFairManageApi = {
   // 用户投递的简历情况
     getUserJobCvRel: async (params) => {
     return await request.get({ url: `/menduner/system/job-fair/analysis/user/job/cv-rel`, params })
+  },
+
+  // 招聘会门票设置
+  updateTicketSettings: async (data: any) => {
+    return await request.post({ url: `/menduner/system/job-fair/update/admission`, data })
+  },
+
+  // 购买门票企业分页
+  getBuyTicketEnterprise: async (params) => {
+    return await request.get({ url: `/menduner/system/job-fair/admission/page`, params })
+  },
+
+  // 开启招聘会门票权益
+  enableTicketRights: async (id) => {
+    return await request.post({ url: `/menduner/system/job-fair/admission/enable?id=${id}` })
+  },
+
+  // 关闭招聘会门票权益
+  disableTicketRights: async (id) => {
+    return await request.post({ url: `/menduner/system/job-fair/admission/disable?id=${id}` })
   }
 }

+ 5 - 2
src/components/Card/src/CardTitle.vue

@@ -7,17 +7,20 @@ defineProps({
   title: {
     type: String,
     required: true
+  },
+  fontSize: {
+    type: [Number, String],
+    default: 14
   }
 })
 </script>
 
 <template>
-  <span class="card-title">{{ title }}</span>
+  <span class="card-title" :style="{'font-size': fontSize + 'px'}">{{ title }}</span>
 </template>
 
 <style scoped lang="scss">
 .card-title {
-  font-size: 14px;
   font-weight: 600;
 
   &::before {

+ 9 - 6
src/views/menduner/system/jobFair/manage/JobFairManageForm.vue

@@ -55,6 +55,12 @@
       <el-form-item label="结束时间" prop="endTime">
         <el-date-picker v-model="formData.endTime" type="date" value-format="x" placeholder="选择结束时间" />
       </el-form-item>
+      <!-- <el-form-item label="简历投递次数" prop="cvRelNum">
+        <div>
+          <el-input-number v-model="formData.cvRelNum" :min="1" :step="1" />
+          <p>不填则默认为1次</p>
+        </div>
+      </el-form-item> -->
       <el-form-item label="状态" prop="status">
         <el-radio-group v-model="formData.status">
           <el-radio
@@ -135,11 +141,10 @@ const formData = ref({
   endTime: undefined,
   shareImg: undefined,
   contentImg: undefined,
+  // cvRelNum: undefined,
   status: '0',
   category: '0',
-  tag: [
-    { title: '', value: [] }
-  ]
+  tag: []
 })
 const formRules = reactive({
   backgroundColour: [{ required: true, message: '招聘会背景颜色不能为空', trigger: 'change' }],
@@ -276,9 +281,7 @@ const resetForm = () => {
     contentImg: undefined,
     status: '0',
     category: '0',
-    tag: [
-      { title: '', value: [] }
-    ]
+    tag: []
   }
   formRef.value?.resetFields()
 }

+ 91 - 0
src/views/menduner/system/jobFair/manage/TicketSettings.vue

@@ -0,0 +1,91 @@
+<template>
+  <Dialog title="招聘会门票设置" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="130px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="门票金额" prop="admissionPrice">
+        <el-input-number v-model="formData.admissionPrice" :precision="2" :min="0.01" :step="100" />
+				<span class="mx-10px">元</span>
+				<Icon @click="formData.admissionPrice = null" class="cursor-pointer" :size="25" icon="ep:circle-close-filled" /> 
+      </el-form-item>
+      <el-form-item label="可发布职位数量" prop="allowedJobNum">
+        <el-input-number v-model="formData.allowedJobNum" :min="0" :step="10" />
+				<span class="mx-10px">个</span>
+				<Icon @click="formData.allowedJobNum = null" class="cursor-pointer" :size="25" icon="ep:circle-close-filled" /> 
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+defineOptions({ name: 'JobFairManageTicketSettings' })
+import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
+
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formData = ref({
+  id: undefined,
+  admissionPrice: undefined,
+  allowedJobNum: undefined
+})
+const formRules = reactive({
+  // admissionPrice: [{ required: true, message: '门票金额不能为空', trigger: 'change' }],
+  // allowedJobNum: [{ required: true, message: '企业可发布职位不能为空', trigger: 'change' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (data: Object) => {
+  dialogVisible.value = true
+  resetForm()
+	formData.value = data || {}
+	if (formData.value.admissionPrice > 0) formData.value.admissionPrice = formData.value.admissionPrice / 100
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+
+	const { id, admissionPrice, allowedJobNum } = formData.value
+	const params = {
+		id,
+		admissionPrice: admissionPrice > 0 ? (admissionPrice * 100) : null,
+		allowedJobNum
+	}
+
+  // 提交请求
+  formLoading.value = true
+  try {
+    await JobFairManageApi.updateTicketSettings(params)
+    message.success('设置成功')
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    admissionPrice: undefined,
+    allowedJobNum: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 80 - 22
src/views/menduner/system/jobFair/manage/details/index.vue

@@ -1,7 +1,7 @@
 <template>
   <ContentWrap>
     <!-- 搜索工作栏 -->
-    <CardTitle :title="jobFairInfo.title?.replace(/<\/?p[^>]*>/gi, '')" />
+    <CardTitle fontSize="16" :title="jobFairInfo.title?.replace(/<\/?p[^>]*>/gi, '')" />
     <el-form
       class="-mb-15px m-t-20px"
       :model="queryParams"
@@ -16,7 +16,6 @@
       <el-form-item>
         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
-        <el-button type="primary" plain @click="handleAdd"><Icon icon="ep:plus" class="mr-5px" /> 新增</el-button>
         <el-button type="primary" :loading="exportLoading" plain @click="handleExport"><Icon icon="ep:download" class="mr-5px" /> 参加招聘会职位列表导出</el-button>
         <el-button type="primary" :loading="exportDeliveryLoading" plain @click="handleExportDelivery"><Icon icon="ep:download" class="mr-5px" /> 招聘会职位投递情况导出</el-button>
       </el-form-item>
@@ -25,25 +24,51 @@
 
   <!-- 列表 -->
   <ContentWrap>
-    <el-table v-loading="loading" :data="list" :stripe="true">
-      <el-table-column label="企业全称" align="center" prop="name">
-        <template #default="scope">{{ formatName(scope.row.enterprise.name) }}</template>
-      </el-table-column>
-      <el-table-column label="企业别称" align="center" prop="anotherName">
-        <template #default="scope">{{ formatName(scope.row.enterprise.anotherName) }}</template>
-      </el-table-column>
-      <el-table-column label="操作" align="center">
-        <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="handleRemoveWhiteList(formatName(scope.row.enterprise.anotherName || scope.row.enterprise.name), scope.row.enterpriseId)"
-          >
-            移出白名单
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
+    <el-tabs v-model="activeName" @tab-change="handleClick">
+      <el-tab-pane label="白名单" name="whiteList">
+        <div class="text-right">
+          <el-button type="primary" plain @click="handleAdd"><Icon icon="ep:plus" class="mr-5px" /> 新增</el-button>
+        </div>
+        <el-table v-loading="loading" :data="list" :stripe="true">
+          <el-table-column label="企业全称" align="center" prop="name">
+            <template #default="scope">{{ formatName(scope.row.enterprise.name) }}</template>
+          </el-table-column>
+          <el-table-column label="企业别称" align="center" prop="anotherName">
+            <template #default="scope">{{ formatName(scope.row.enterprise.anotherName) }}</template>
+          </el-table-column>
+          <el-table-column label="操作" align="center">
+            <template #default="scope">
+              <el-button
+                link
+                type="primary"
+                @click="handleRemoveWhiteList(formatName(scope.row.enterprise.anotherName || scope.row.enterprise.name), scope.row.enterpriseId)"
+              >
+                移出白名单
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="购买门票企业" name="ticketEntList">
+        <el-table v-loading="loading" :data="list" :stripe="true">
+          <el-table-column label="企业全称" align="center" prop="name">
+            <template #default="scope">{{ formatName(scope.row.enterprise.name) }}</template>
+          </el-table-column>
+          <el-table-column label="企业别称" align="center" prop="anotherName">
+            <template #default="scope">{{ formatName(scope.row.enterprise.anotherName) }}</template>
+          </el-table-column>
+          <el-table-column label="操作" align="center">
+            <template #default="scope">
+              <el-button v-if="scope.row.status === '1'" link type="primary" @click="handleEnableRights(formatName(scope.row.enterprise.anotherName || scope.row.enterprise.name), scope.row.id)">
+                开启权益
+              </el-button>
+              <el-button v-if="scope.row.status === '0'" link type="danger" @click="handleDisableRights(formatName(scope.row.enterprise.anotherName || scope.row.enterprise.name), scope.row.id)">禁用权益</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
+    
     <Pagination
       :total="total"
       v-model:page="queryParams.pageNo"
@@ -70,6 +95,7 @@ defineOptions({ name: 'JobFairDetails' })
 
 const message = useMessage() // 消息弹窗
 
+const activeName = ref('whiteList')
 const loading = ref(true) // 列表的加载中
 const list = ref([]) // 列表的数据
 const total = ref(0)
@@ -83,8 +109,9 @@ const queryParams = ref({
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
+  const api = activeName.value === 'whiteList' ? JobFairWhiteApi.getJobFairWhiteList : JobFairManageApi.getBuyTicketEnterprise
   try {
-    const data = await JobFairWhiteApi.getJobFairWhiteList(queryParams.value)
+    const data = await api(queryParams.value)
     total.value = data.total
     list.value = data.list
   } finally {
@@ -92,6 +119,13 @@ const getList = async () => {
   }
 }
 
+const handleClick = () => {
+  total.value = 0
+  list.value = []
+  queryParams.value.pageNo = 1
+  getList()
+}
+
 /* 查询招聘会详情 */
 const jobFairInfo = ref({})
 const getJobFairDetail = async () => {
@@ -102,6 +136,8 @@ const getJobFairDetail = async () => {
 }
 
 const handleQuery = () => {
+  total.value = 0
+  list.value = []
   queryParams.value.pageNo = 1
   getList()
 }
@@ -129,6 +165,28 @@ const handleRemoveWhiteList = async (enterpriseName: string, enterpriseId: strin
   } catch (err) {}
 }
 
+// 开启权益
+const handleEnableRights = async (enterpriseName: string, id: string) => {
+  if (!id) return message.warning('操作失败,请刷新页面重试')
+  try {
+    await message.confirm(`是否确定开启【${formatName(enterpriseName)}】的招聘会权益?`)
+    await JobFairManageApi.enableTicketRights(id)
+    message.success('开启成功')
+    getList()
+  } catch (err) {}
+}
+
+// 关闭权益
+const handleDisableRights = async (enterpriseName: string, id: string) => {
+  if (!id) return message.warning('操作失败,请刷新页面重试')
+  try {
+    await message.confirm(`是否确定禁用【${formatName(enterpriseName)}】的招聘会权益?`)
+    await JobFairManageApi.disableTicketRights(id)
+    message.success('禁用成功')
+    getList()
+  } catch (err) {}
+}
+
 const exportLoading = ref(false)
 /** 导出按钮操作 */
 const handleExport = async () => {

+ 21 - 7
src/views/menduner/system/jobFair/manage/index.vue

@@ -71,7 +71,7 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true">
-      <el-table-column label="标题" align="center" prop="title" width="220">
+      <el-table-column label="招聘会标题" align="center" prop="title" width="220">
         <template #default="scope">
           <div v-html="scope.row.title"></div>
         </template>
@@ -86,16 +86,24 @@
           <el-image v-if="scope.row.pcPreviewImg" :src="scope.row.pcPreviewImg" lazy preview-teleported :preview-src-list="[scope.row.pcPreviewImg]" fit="contain" />
         </template>
       </el-table-column>
+      <!-- <el-table-column label="简历投递次数" align="center" prop="cvRelNum" /> -->
+      <!-- <el-table-column label="门票金额" align="center" prop="admissionPrice">
+        <template #default="scope">
+          {{ scope.row.admissionPrice > 0 ? scope.row.admissionPrice / 100 : '' }}
+        </template>
+      </el-table-column>
+      <el-table-column label="企业可发布职位数" align="center" prop="allowedJobNum" /> -->
       <el-table-column label="状态" align="center" prop="status">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.MENDUNER_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
-      <el-table-column label="开始时间" align="center" prop="startTime" :formatter="dateFormatter" />
-      <el-table-column label="结束时间" align="center" prop="endTime" :formatter="dateFormatter" />
+      <el-table-column label="开始时间" align="center" prop="startTime" :formatter="dateFormatter2" />
+      <el-table-column label="结束时间" align="center" prop="endTime" :formatter="dateFormatter2" />
       <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" />
       <el-table-column label="操作" align="center" fixed="right" min-width="100">
         <template #default="scope">
+          <el-button link type="success" @click="openTicketSettings(scope.row)">门票设置</el-button>
           <el-button link type="primary" @click="openStatistics(scope.row.id)">数据统计</el-button>
           <el-button link type="primary" @click="openDetail(scope.row.id)">白名单</el-button>
           <el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['menduner:system:job-fair:update']">编辑</el-button>
@@ -114,14 +122,17 @@
 
   <!-- 表单弹窗:添加/修改 -->
   <JobFairManageForm ref="formRef" @success="getList" />
+
+  <TicketSettings ref="ticketRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
-import { dateFormatter } from '@/utils/formatTime'
+import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
 // import download from '@/utils/download'
 import { DICT_TYPE } from '@/utils/dict'
 import { JobFairManageApi, JobFairManageVO } from '@/api/menduner/system/jobFair/manage'
 import JobFairManageForm from './JobFairManageForm.vue'
+import TicketSettings from './TicketSettings.vue'
 
 /** 招聘会管理 列表 */
 defineOptions({ name: 'JobFair' })
@@ -135,12 +146,9 @@ const total = ref(0) // 列表的总页数
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
-  // type: undefined,
   title: undefined,
-  // slogan: undefined,
   startTime: [],
   endTime: [],
-  // vipRequire: undefined,
   createTime: []
 })
 const queryFormRef = ref() // 搜索的表单
@@ -176,6 +184,12 @@ const openForm = (type: string, id?: number) => {
   formRef.value.open(type, id)
 }
 
+/** 门票设置 */
+const ticketRef = ref()
+const openTicketSettings = ({ id, admissionPrice, allowedJobNum}) => {
+  ticketRef.value.open({ id, admissionPrice, allowedJobNum})
+}
+
 /** 删除按钮操作 */
 const handleDelete = async (id: number) => {
   try {