ソースを参照

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

lifanagju_citu 4 日 前
コミット
61608faf15
22 ファイル変更480 行追加1052 行削除
  1. 5 0
      src/api/menduner/system/enterprise/message/index.ts
  2. 5 0
      src/api/menduner/system/jobFair/manage/index.ts
  3. 67 11
      src/views/menduner/system/enterprise/message/details/components/job.vue
  4. 189 0
      src/views/menduner/system/enterprise/message/details/components/resume.vue
  5. 4 0
      src/views/menduner/system/enterprise/message/details/index.vue
  6. 1 1
      src/views/menduner/system/job/index.vue
  7. 0 95
      src/views/menduner/system/jobFair/manage/TicketSettings.vue
  8. 0 278
      src/views/menduner/system/jobFair/manage/details/components/Category copy.vue
  9. 0 1
      src/views/menduner/system/jobFair/manage/details/components/Category.vue
  10. 185 0
      src/views/menduner/system/jobFair/manage/details/components/job.vue
  11. 0 242
      src/views/menduner/system/jobFair/manage/details/index copy.vue
  12. 9 5
      src/views/menduner/system/jobFair/manage/details/index.vue
  13. 0 2
      src/views/menduner/system/jobFair/manage/index.vue
  14. 0 85
      src/views/menduner/system/jobFair/white copy/index.vue
  15. 0 90
      src/views/menduner/system/jobFair/white copy/jobFairForm.vue
  16. 0 142
      src/views/menduner/system/jobFair/white/index.vue
  17. 0 85
      src/views/menduner/system/jobFair/white/jobFairForm.vue
  18. 6 7
      src/views/menduner/system/person/details/components/deliveryJob.vue
  19. 2 1
      src/views/menduner/system/talentMap/maintenance/gather/webPageParsing/index.vue
  20. 2 2
      src/views/menduner/system/web/PreferredGroup.vue
  21. 2 2
      src/views/menduner/system/web/WebContentForm.vue
  22. 3 3
      src/views/menduner/system/web/index.vue

+ 5 - 0
src/api/menduner/system/enterprise/message/index.ts

@@ -126,5 +126,10 @@ export const EnterpriseApi = {
   // 获取企业套餐权益
   getEnterprisePackagePrivilege: async (id: number) => {
     return await request.post({ url: `/menduner/system/enterprise/entitlement/by/id?id=${id}` })
+  },
+
+  // 获取招聘职位简历投递分页
+  getJobResumePage: async (params: any) => {
+    return await request.get({ url: `/menduner/system/job-cv-rel/page`, params })
   }
 }

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

@@ -117,5 +117,10 @@ export const JobFairManageApi = {
   // 更新招聘会类别
   updateJobFairCategory: async (data: any) => {
     return await request.put({ url: `/menduner/system/job-fair/update-category`, data })
+  },
+
+  // 获取参与招聘会企业的职位列表
+  getJobFairEnterpriseJobs: async (params: any) => {
+    return await request.get({ url: `/menduner/system/job-fair/detail/page`, params })
   }
 }

+ 67 - 11
src/views/menduner/system/enterprise/message/details/components/job.vue

@@ -1,11 +1,35 @@
 <template>
-  <div class="text-right">
-    <el-button type="primary" @click="handleRefresh"><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
+  <div class="flex">
+    <div>
+      <el-input
+        v-model="queryParams.name"
+        placeholder="职位名称(回车搜索)"
+        class="!w-240px"
+        clearable
+        @keyup.enter="handleRefresh"
+        @clear="handleRefresh"
+      />
+      <el-select v-model="queryParams.fairId" placeholder="招聘会" class="!w-240px ml-10px" clearable @change="handleRefresh">
+        <el-option
+          v-for="item in jobFairList"
+          :key="item.id"
+          :label="item.title"
+          :value="item.id"
+        />
+        <template #footer v-if="jobFairList?.length < +jobFairTotal">
+          <div class="text-center">
+            <el-button type="primary" link @click="handleGetMore">加载更多</el-button>
+          </div>
+        </template>
+      </el-select>
+    </div>
+    <el-button class="ml-10px" type="success" plain @click="handleRefresh"><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
   </div>
   <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
     <el-table-column label="职位名称" align="center" prop="name">
       <template #default="{ row }">{{ formatName(row.name) }}</template>
     </el-table-column>
+    <el-table-column label="招聘会" align="center" prop="jobFairName" />
     <el-table-column label="职位类型" align="center" prop="positionName" />
     <el-table-column label="地区" align="center" prop="areaName">
       <template #default="scope">
@@ -66,11 +90,12 @@
     @pagination="getList"
   />
 
-  <Dialog title="职位详情" v-model="dialogVisible">
-    <el-descriptions :column="1" border>
+  <Dialog title="职位详情" v-model="dialogVisible" class="!w-60%">
+    <el-descriptions :column="2" border>
       <el-descriptions-item label="职位名称">{{ formatName(itemData.name) }}</el-descriptions-item>
+      <el-descriptions-item label="招聘会">{{ itemData.jobFairName }}</el-descriptions-item>
       <el-descriptions-item label="职位类型">{{ itemData.positionName }}</el-descriptions-item>
-      <el-descriptions-item label="工作城市">{{ !itemData.areaId ? '全国' : itemData.areaName }}</el-descriptions-item>
+      <el-descriptions-item label="地区">{{ !itemData.areaId ? '全国' : itemData.areaName }}</el-descriptions-item>
       <el-descriptions-item label="详细地址">{{ itemData.address }}</el-descriptions-item>
       <el-descriptions-item label="薪资">
         <span v-if="itemData.payFrom && itemData.payTo">
@@ -89,17 +114,24 @@
         <dict-tag v-if="itemData.expType" :type="DICT_TYPE.MENDUNER_EXP_TYPE" :value="itemData.expType" />
         <el-tag v-else>经验不限</el-tag>
       </el-descriptions-item>
-      <el-descriptions-item label="刷新时间">{{ timesTampChange(itemData.updateTime, 'Y-M-D h:m') }}</el-descriptions-item>
-      <el-descriptions-item label="岗位职责">
+      <el-descriptions-item label="职位状态">
+        <el-tag v-if="itemData.status === '99'" type="warning">待支付</el-tag>
+        <dict-tag v-else :type="DICT_TYPE.MENDUNER_STATUS" :value="itemData.status" />
+      </el-descriptions-item>
+      <el-descriptions-item label="发布时间">{{ timesTampChange(itemData.createTime) }}</el-descriptions-item>
+      <el-descriptions-item label="刷新时间">{{ timesTampChange(itemData.updateTime) }}</el-descriptions-item>
+    </el-descriptions>
+    <el-descriptions :column="1" border>
+			<el-descriptions-item label="职位关键字">
+        <el-tag type="primary" v-for="k in itemData.tagList" :key="k" class="m-r-5px">{{ k }}</el-tag>
+      </el-descriptions-item>
+			<el-descriptions-item label="岗位职责">
         <div v-html="cleanedHtml(itemData.content)"></div>
       </el-descriptions-item>
       <el-descriptions-item label="岗位要求">
         <div v-html="cleanedHtml(itemData.requirement)"></div>
       </el-descriptions-item>
-      <el-descriptions-item label="职位关键字">
-        <el-tag type="primary" v-for="k in itemData.tagList" :key="k" class="m-r-5px">{{ k }}</el-tag>
-      </el-descriptions-item>
-    </el-descriptions>
+		</el-descriptions>
     <template #footer>
       <el-button @click="dialogVisible = false; itemData = {}">取 消</el-button>
     </template>
@@ -113,6 +145,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { dealDictArrayData } from '@/utils/transform/position'
 import { timesTampChange } from '@/utils/transform/date'
 import { formatName } from '@/utils'
+import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
 
 const props = defineProps({
   id: String
@@ -126,6 +159,8 @@ const total = ref(0)
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
+  name: undefined,
+  fairId: undefined,
   enterpriseId: props.id
 })
 const payUnit = getIntDictOptions(DICT_TYPE.MENDUNER_PAY_UNIT)
@@ -150,6 +185,27 @@ const handleRefresh = () => {
   getList()
 }
 
+// 获取招聘会列表
+const jobFairTotal = ref(0)
+const pageInfo = ref({
+  pageNo: 1,
+  pageSize: 10
+})
+const jobFairList = ref([])
+const getJobFairList = async () => {
+  try {
+    const data = await JobFairManageApi.getJobFairPage(pageInfo.value)
+    jobFairList.value = jobFairList.value.concat(data.list)
+    jobFairTotal.value = data.total 
+  } catch {}
+}
+getJobFairList()
+
+const handleGetMore = () => {
+  pageInfo.value.pageNo++
+  getJobFairList()
+}
+
 // 职位刷新、开启、关闭
 const arr = [
   { api: EnterpriseApi.refreshEnterpriseJob, label: '刷新' },

+ 189 - 0
src/views/menduner/system/enterprise/message/details/components/resume.vue

@@ -0,0 +1,189 @@
+<template>
+  <div class="flex">
+    <div v-if="!fairId">
+			<el-select v-model="queryParams.jobId" placeholder="招聘职位" class="!w-240px ml-10px" clearable @change="handleRefresh">
+        <el-option
+          v-for="item in jobList"
+          :key="item.id"
+          :label="formatName(item.name)"
+          :value="item.id"
+        />
+      </el-select>
+      <el-select v-model="queryParams.jobFairId" placeholder="招聘会" class="!w-240px ml-10px" clearable @change="handleRefresh">
+        <el-option
+          v-for="item in jobFairList"
+          :key="item.id"
+          :label="item.title"
+          :value="item.id"
+        />
+        <template #footer v-if="jobFairList?.length < +jobFairTotal">
+          <div class="text-center">
+            <el-button type="primary" link @click="handleGetMore">加载更多</el-button>
+          </div>
+        </template>
+      </el-select>
+    </div>
+    <el-select v-else v-model="queryParams.enterpriseId" placeholder="招聘企业" class="!w-240px ml-10px" clearable @change="handleRefresh">
+      <el-option
+        v-for="item in enterpriseList"
+        :key="item.enterpriseId"
+        :label="formatName(item.enterprise.anotherName || item.enterprise.name)"
+        :value="item.enterpriseId"
+      />
+      <template #footer v-if="enterpriseList?.length < +enterpriseTotal">
+        <div class="text-center">
+          <el-button type="primary" link @click="handleGetEnterpriseMore">加载更多</el-button>
+        </div>
+      </template>
+    </el-select>
+    <el-button type="success" class="ml-10px" plain @click="handleRefresh"><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
+  </div>
+
+  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+		<el-table-column label="求职者" align="center" prop="person.name" />
+    <el-table-column label="投递职位" align="center" prop="job.name">
+      <template #default="{ row }">{{ formatName(row.job.name) }}</template>
+    </el-table-column>
+		<el-table-column v-if="fairId" label="发布企业" align="center" prop="enterprise.anotherName">
+      <template #default="{ row }">{{ formatName(row.enterprise.anotherName || rpw.enterprise.name) }}</template>
+    </el-table-column>
+		<el-table-column label="职位发布人" align="center" prop="contact.name" />
+    <el-table-column label="求职者联系电话" align="center" prop="person.phone" />
+    <el-table-column v-if="!fairId" label="招聘会" align="center" prop="jobFair.title" />
+    <el-table-column label="简历查看状态" align="center" prop="cvRel.status">
+      <template #default="scope">
+				<el-tag :type="scope.row.cvRel.status === '0' ? 'warning' : 'success'">
+					{{ scope.row.cvRel.status === '0' ? '未查看' : '已查看' }}
+				</el-tag>
+      </template>
+    </el-table-column>
+		<el-table-column
+      label="投递时间"
+      align="center"
+      prop="cvRel.createTime"
+      :formatter="dateFormatter"
+      width="180px"
+    />
+    <el-table-column label="操作" align="center">
+      <template #default="scope">
+        <el-link
+					v-if="scope.row.cvRel?.url"
+					type="primary"
+					download
+					:href="scope.row.cvRel.url"
+					:underline="false"
+					target="_blank"
+				>
+					附件下载
+				</el-link>
+      </template>
+    </el-table-column>
+  </el-table>
+
+  <Pagination
+    :total="total"
+    v-model:page="queryParams.pageNo"
+    v-model:limit="queryParams.pageSize"
+    @pagination="getList"
+  />
+</template>
+
+<script setup>
+defineOptions({ name: 'EnterpriseJobDeliveryResume'})
+import { EnterpriseApi } from '@/api/menduner/system/enterprise/message'
+import { formatName } from '@/utils'
+import { dateFormatter } from '@/utils/formatTime'
+import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
+import { statisticAnalysisApi } from '@/api/menduner/system/analysis/statisticAnalysis'
+import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
+
+const props = defineProps({
+  id: String,
+	fairId: String
+})
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+const loading = ref(false)
+const tableData = ref([])
+const total = ref(0)
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+	jobId: undefined,
+  jobFairId: props.fairId ?? undefined,
+  enterpriseId: props.id
+})
+
+// 职位投递记录
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await EnterpriseApi.getJobResumePage(queryParams)
+    tableData.value = data.list ?? []
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+getList()
+
+const handleRefresh = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+// 获取招聘会列表
+const jobFairTotal = ref(0)
+const pageInfo = ref({
+  pageNo: 1,
+  pageSize: 10
+})
+const jobFairList = ref([])
+const getJobFairList = async () => {
+  try {
+    const data = await JobFairManageApi.getJobFairPage(pageInfo.value)
+    jobFairList.value = jobFairList.value.concat(data.list)
+    jobFairTotal.value = data.total 
+  } catch {}
+}
+
+const handleGetMore = () => {
+  pageInfo.value.pageNo++
+  getJobFairList()
+}
+
+// 获取招聘职位列表
+const jobList = ref([])
+const getJobList = async () => {
+  try {
+    const data = await statisticAnalysisApi.getAnalysisJobAdvertisedList({ enterpriseId: props.id })
+    jobList.value = jobList.value.concat(data)
+  } catch {}
+}
+
+// 获取参加招聘会的企业列表(白名单)
+const enterpriseTotal = ref(0)
+const enterprisePageInfo = ref({
+  pageNo: 1,
+  pageSize: 20
+})
+const enterpriseList = ref([])
+const getEnterpriseList = async () => {
+  try {
+    const data = await JobFairWhiteApi.getJobFairWhiteList(enterprisePageInfo.value)
+    enterpriseList.value = enterpriseList.value.concat(data.list)
+    enterpriseTotal.value = data.total 
+  } catch {}
+}
+
+const handleGetEnterpriseMore = () => {
+  enterprisePageInfo.value.pageNo++
+  getEnterpriseList()
+}
+
+if (!props.fairId) {
+  getJobFairList()
+  getJobList()
+} else getEnterpriseList()
+</script>

+ 4 - 0
src/views/menduner/system/enterprise/message/details/index.vue

@@ -32,6 +32,9 @@
             <el-tab-pane label="招聘职位">
               <EnterpriseJob :id="id" />
             </el-tab-pane>
+            <el-tab-pane label="收到的简历记录">
+              <EnterpriseResume :id="id" />
+            </el-tab-pane>
           </el-tabs>
         </el-card>
       </el-col>
@@ -48,6 +51,7 @@ import Business from './components/businessInfo.vue'
 import SubordinateEnterprises from './components/subordinateEnterprises.vue'
 import EnterpriseUser from './components/user.vue'
 import EnterpriseJob from './components/job.vue'
+import EnterpriseResume from './components/resume.vue'
 
 /** 初始化 */
 const { currentRoute } = useRouter() // 路由

+ 1 - 1
src/views/menduner/system/job/index.vue

@@ -149,7 +149,7 @@
       </el-table-column>
       <el-table-column label="职位状态" align="center" prop="status">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.MENDUNER_JOB_STATUS" :value="scope.row.status" />
+          <dict-tag :type="DICT_TYPE.MENDUNER_STATUS" :value="scope.row.status" />
         </template>
       </el-table-column>
       <el-table-column

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

@@ -1,95 +0,0 @@
-<template>
-  <Dialog title="招聘会门票设置" v-model="dialogVisible">
-    <div class="mb-50px color-orange text-16px" style="display: flex; align-items: center;">
-      <Icon :size="20" icon="ep:warning" class="mr-3px" />
-      提示:不需要设置门票限制时则不需要填写以下内容
-    </div>
-    <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>

+ 0 - 278
src/views/menduner/system/jobFair/manage/details/components/Category copy.vue

@@ -1,278 +0,0 @@
-<template>
-  <div>
-    <el-form
-      ref="formRef"
-      :model="formData"
-      :rules="formRules"
-      label-width="140px"
-      v-loading="formLoading"
-    >
-      <el-form-item label="类别" prop="category" @change="handleChangeCategory">
-        <el-radio-group v-model="formData.category">
-          <el-radio
-            v-for="dict in categoryList"
-            :key="dict.value"
-            :label="dict.value"
-          >
-            {{ dict.label }}
-          </el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="类别详情" prop="tag">
-        <!-- 职位类型 -->
-        <div v-if="formData.category === '1'" class="!w-100%">
-          <el-row v-for="(val, index) in formData.tag" :key="index" class="mb-10px">
-            <el-col :span="8">
-              <el-input v-model="val.title" clearable placeholder="请输入类别名称"/>
-            </el-col>
-            <el-col :span="10" class="mx-10px">
-              <!-- 职位 -->
-              <el-select  v-model="val.value" filterable multiple placeholder="请选择职位类型" collapse-tags collapse-tags-tooltip>
-                <el-option v-for="k in position" :key="k.id" :label="k.nameCn" :value="k.id.toString()"/>
-              </el-select>
-            </el-col>
-            <el-col :span="4">
-              <el-button text circle @click="handleDelete(index)">
-                <Icon icon="ep:close" />
-              </el-button>
-            </el-col>
-          </el-row>
-        </div>
-        <!-- 企业 -->
-        <div v-if="formData.category === '0'" class="!w-100%">
-          <div v-for="(val, index) in formData.tag" :key="index" class="mb-10px pa-20px" style="border: 1px solid #ccc;">
-            <div style="display: flex; justify-content: space-between; align-items: center">
-              <el-input v-model="val.title" clearable placeholder="请输入类别名称" class="!w-240px" />
-              <div class="text-right">
-                <el-button type="primary" class="mr-10px" @click="handleAddEnterprise(val, index)">添加企业</el-button>
-                <el-button type="danger" @click="handleDelete(index)">删除</el-button>
-              </div>
-            </div>
-
-            <el-table :data="val.value" :stripe="true">
-              <el-table-column label="企业logo" align="center" prop="name">
-                <template #default="scope">
-                  <el-image v-if="scope.row?.logoUrl" :src="scope.row?.logoUrl" class="!w-50px !h-50px" />
-                  <span v-else style="line-height: 70px; color: #999;">未上传</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="企业全称" align="center" prop="name">
-                <template #default="scope">{{ formatName(scope.row?.name) }}</template>
-              </el-table-column>
-              <el-table-column label="企业别名" align="center" prop="anotherName">
-                <template #default="scope">{{ formatName(scope.row?.anotherName) }}</template>
-              </el-table-column>
-              <el-table-column label="操作" align="center">
-                <template #default="scope">
-                  <el-button link type="danger" @click="handleDeleteTagItem(index, scope.$index)">删除</el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-          </div>
-        </div>
-
-        <div>
-          <el-button type="primary" @click="handleAdd"><Icon class="mr-5px" icon="ep:plus" />添加类别</el-button>
-          <div class="color-red-400 mt-5px">若填写了类别,请最少填写两项</div>
-        </div>
-      </el-form-item>
-    </el-form>
-    
-		<div class="text-right">
-			<el-button @click="emit('close')">返回</el-button>
-			<el-button @click="submitForm" type="primary" :disabled="formLoading">保存</el-button>
-		</div>
-  </div>
-
-  <Dialog title="添加企业" v-model="dialogVisible">
-    <el-form
-      ref="formRef"
-      :model="addFormData"
-      :rules="addFormRules"
-      label-width="100px"
-    >
-      <el-form-item label="企业别名" prop="select">
-        <el-select v-model="addFormData.select" value-key="id" multiple filterable clearable remote :remote-method="remoteMethod" :loading="loading" placeholder="请输入企业别称进行查找">
-          <el-option v-for="(item, index) in enterpriseList" :key="index" :value="item" :label="formatName(item.anotherName || item.name)">
-            <span>{{ formatName(item.anotherName || item.name) }}</span>
-          </el-option>
-          <p v-if="showLoadMore" class="text-center color-lightblue cursor-pointer" @click="handleLoadMore">加载更多</p>
-        </el-select>
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button @click="handleSubmitEnterprise" type="primary">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
-</template>
-
-<script setup lang="ts">
-/** 招聘会管理 信息设置 */
-defineOptions({ name: 'JobFairManageInfoSettings' })
-import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
-import { PositionApi } from '@/api/menduner/system/position'
-import { cloneDeep } from 'lodash-es'
-import { formatName } from '@/utils'
-import { EnterpriseApi } from '@/api/menduner/system/enterprise/message'
-
-const props = defineProps({ formType: String, info: Object })
-
-const { t } = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
-const dialogVisible = ref(false)
-
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formData = ref({
-  id: undefined,
-  category: '0',
-  tag: []
-})
-const formRules = reactive({
-  category: [{ required: true, message: '展示类别不能为空', trigger: 'blur' }]
-})
-const categoryList = [
-  { label: '企业', value: '0' },
-  { label: '招聘职位', value: '1' }
-]
-const formRef = ref() // 表单 Ref
-
-const showLoadMore = ref(true) // 是否展示加载更多按钮
-const loading = ref(false)
-const enterpriseList = ref([])
-
-const queryParams = reactive({
-  pageNo: 1,
-  pageSize: 20
-})
-const addFormData = ref({
-  select: [],
-  index: 0
-})
-const addFormRules = reactive({
-  // select: [{ required: true, message: '请选择企业', trigger: 'blur' }]
-})
-const getEnterpriseList = async () => {
-  const result = await EnterpriseApi.getEnterprisePage(queryParams)
-  const list = result.list || []
-  enterpriseList.value = enterpriseList.value.concat(list)
-  if (enterpriseList.value.length === result.total) showLoadMore.value = false
-}
-
-
-const remoteMethod = async (query: string) => {
-  if (query) {
-    loading.value = true
-    enterpriseList.value = []
-    queryParams.pageNo = 1
-    queryParams.anotherName = query
-    await getEnterpriseList()
-    loading.value = false
-  }
-}
-const handleLoadMore = () => {
-  queryParams.pageNo++
-  getEnterpriseList()
-}
-
-// 添加企业
-const handleAddEnterprise = (val, index) => {
-  console.log(val, index, 'add')
-  addFormData.value = {
-    select: val.value,
-    index
-  }
-  getEnterpriseList()
-  dialogVisible.value = true
-}
-// 添加企业-submit
-const handleSubmitEnterprise = () => {
-  const { select, index } = addFormData.value
-  formData.value.tag[index].value = select
-  dialogVisible.value = false
-  addFormData.value = {}
-}
-
-// 职位类型
-const position = ref([])
-const getPositionList = async () => {
-  const data = await PositionApi.getPositionList({})
-  position.value = data || []
-}
-
-
-onMounted(() => {
-  getPositionList()
-  if (props.info && Object.keys(props.info).length > 0) {
-		formLoading.value = true
-    formData.value.id = props.info.id
-		if (!props.info.tag || !props.info.tag.length) {
-			formData.value.tag = []
-		} else {
-      formData.value.tag = cloneDeep(props.info.tag)
-    }
-		formLoading.value = false
-  }
-})
-
-// 切换类别时需将数据清空
-const handleChangeCategory = () => {
-  formData.value.tag.forEach(e => e.value = [])
-}
-
-const handleDelete = (index) => {
-  formData.value.tag.splice(index, 1)
-}
-
-const handleAdd = () => {
-  formData.value.tag.push({ title: '', value: [] })
-}
-
-// 删除企业
-const handleDeleteTagItem = (index, tagItemIndex) => {
-  formData.value.tag[index].value.splice(tagItemIndex, 1)
-}
-
-// 效验内容是否填写完整
-const checkObjectValues = (obj) => {
-  for (let key in obj) {
-    if (obj.hasOwnProperty(key)) {
-      if (obj[key] === undefined || obj[key] === null || obj[key] === '' || obj[key].length === 0) {
-        return false
-      }
-    }
-  }
-  return true
-}
-
-/** 提交表单 */
-const emit = defineEmits(['close'])
-const submitForm = async () => {
-  // 校验表单
-  await formRef.value.validate()
-  
-  if (formData.value?.tag && formData.value?.tag.length > 0) {
-    // 效验类别项是否填写完整
-    const check = formData.value.tag.every(e => checkObjectValues(e))
-    if (!check) return message.warning('请将类别详情中的项填写完整')
-    if (formData.value.tag.length < 2) return message.warning('请至少填写两个类别详情')
-    formData.value.tag.forEach(e => e.key = formData.value.category === '0' ? 'enterpriseId' : 'positionId')
-  }
-
-  // 提交请求
-  formLoading.value = true
-  try {
-		await JobFairManageApi.updateJobFairCategory(formData.value)
-		message.success(t('common.updateSuccess'))
-  } finally {
-    formLoading.value = false
-  }
-}
-
-</script>
-
-<style>
-.el-row {
-  width: 100%;
-}
-</style>

+ 0 - 1
src/views/menduner/system/jobFair/manage/details/components/Category.vue

@@ -219,7 +219,6 @@ onMounted(() => {
 		formLoading.value = true
     formData.value.id = props.info.id
     formData.value.category = props.info.category
-    console.log(props.info, 'props.info')
 		if (!props.info.tag || !props.info.tag.length) {
 			formData.value.tag = []
 		} else {

+ 185 - 0
src/views/menduner/system/jobFair/manage/details/components/job.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="flex">
+    <el-input
+      v-model="queryParams.jobName"
+      placeholder="职位名称(回车搜索)"
+      class="!w-240px"
+      clearable
+      @keyup.enter="handleRefresh"
+      @clear="handleRefresh"
+    />
+		<el-input
+      v-model="queryParams.enterpriseName"
+      placeholder="企业全称(回车搜索)"
+      class="!w-240px mx-10px"
+      clearable
+      @keyup.enter="handleRefresh"
+      @clear="handleRefresh"
+    />
+    <!-- <el-button @click="handleRefresh"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> -->
+    <!-- <el-button @click="resetQuery" plain><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> -->
+    <el-button type="success" @click="handleRefresh" plain><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
+  </div>
+  <el-table v-loading="loading" :data="tableData" :stripe="true" class="m-t-20px">
+    <el-table-column label="职位名称" align="center" prop="jobName">
+      <template #default="{ row }">{{ formatName(row.jobName) }}</template>
+    </el-table-column>
+		<el-table-column label="企业全称" align="center" prop="enterpriseName">
+      <template #default="{ row }">{{ formatName(row.enterpriseName) }}</template>
+    </el-table-column>
+		<el-table-column label="企业别称" align="center" prop="enterpriseAnotherName">
+      <template #default="{ row }">{{ formatName(row.enterpriseAnotherName) }}</template>
+    </el-table-column>
+		<el-table-column
+      label="发布时间"
+      align="center"
+      prop="createTime"
+      :formatter="dateFormatter"
+      :show-overflow-tooltip="true"
+      width="180px"
+    />
+    <el-table-column label="操作" align="center">
+      <template #default="scope">
+        <el-button v-if="scope.row.jobId" link type="primary" @click="openDetail(scope.row)">职位详情</el-button>
+      </template>
+    </el-table-column>
+  </el-table>
+
+  <Pagination
+    :total="total"
+    v-model:page="queryParams.pageNo"
+    v-model:limit="queryParams.pageSize"
+    @pagination="getList"
+  />
+
+  <Dialog title="职位详情" v-model="dialogVisible" class="!w-60%">
+    <el-descriptions :column="2" border>
+      <el-descriptions-item label="职位名称">{{ formatName(itemData.name) }}</el-descriptions-item>
+      <el-descriptions-item label="发布企业">{{ itemData.enterpriseName }}</el-descriptions-item>
+      <el-descriptions-item label="职位类型">{{ itemData.positionName }}</el-descriptions-item>
+      <el-descriptions-item label="地区">{{ !itemData.areaId ? '全国' : itemData.areaName }}</el-descriptions-item>
+      <el-descriptions-item label="详细地址">{{ itemData.address }}</el-descriptions-item>
+      <el-descriptions-item label="薪资">
+        <span v-if="itemData.payFrom && itemData.payTo">
+          {{ itemData.payFrom }} - {{ itemData.payTo }}/{{ payUnit.find(e => e.value === Number(itemData.payUnit))?.label }}
+        </span>
+        <span v-else>面议</span>
+      </el-descriptions-item>
+      <el-descriptions-item label="招聘类型">
+        <dict-tag :type="DICT_TYPE.MENDUNER_JOB_TYPE" :value="itemData.type" />
+      </el-descriptions-item>
+      <el-descriptions-item label="学历要求">
+        <dict-tag v-if="itemData.eduType" :type="DICT_TYPE.MENDUNER_EDUCATION_TYPE" :value="itemData.eduType" />
+        <el-tag v-else>学历不限</el-tag>
+      </el-descriptions-item>
+      <el-descriptions-item label="工作经验">
+        <dict-tag v-if="itemData.expType" :type="DICT_TYPE.MENDUNER_EXP_TYPE" :value="itemData.expType" />
+        <el-tag v-else>经验不限</el-tag>
+      </el-descriptions-item>
+      <el-descriptions-item label="职位状态">
+        <el-tag v-if="itemData.status === '99'" type="warning">待支付</el-tag>
+        <dict-tag v-else :type="DICT_TYPE.MENDUNER_STATUS" :value="itemData.status" />
+      </el-descriptions-item>
+      <el-descriptions-item label="发布时间">{{ timesTampChange(itemData.createTime) }}</el-descriptions-item>
+      <el-descriptions-item label="刷新时间">{{ timesTampChange(itemData.updateTime) }}</el-descriptions-item>
+    </el-descriptions>
+
+		<el-descriptions :column="1" border>
+			<el-descriptions-item label="职位关键字">
+        <el-tag type="primary" v-for="k in itemData.tagList" :key="k" class="m-r-5px">{{ k }}</el-tag>
+      </el-descriptions-item>
+			<el-descriptions-item label="岗位职责">
+        <div v-html="cleanedHtml(itemData.content)"></div>
+      </el-descriptions-item>
+      <el-descriptions-item label="岗位要求">
+        <div v-html="cleanedHtml(itemData.requirement)"></div>
+      </el-descriptions-item>
+		</el-descriptions>
+    <template #footer>
+      <el-button @click="dialogVisible = false; itemData = {}">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup>
+defineOptions({ name: 'EnterpriseUserList'})
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { dealDictObjData } from '@/utils/transform/position'
+import { timesTampChange } from '@/utils/transform/date'
+import { formatName } from '@/utils'
+import { dateFormatter } from '@/utils/formatTime'
+import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
+import { JobAdvertisedApi } from '@/api/menduner/system/job'
+
+const props = defineProps({
+  fairId: String
+})
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+const loading = ref(false)
+const tableData = ref([])
+const total = ref(0)
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  jobName: undefined,
+	enterpriseName: undefined,
+  jobFairId: props.fairId
+})
+const payUnit = getIntDictOptions(DICT_TYPE.MENDUNER_PAY_UNIT)
+const dialogVisible = ref(false)
+const itemData = ref({})
+
+// 职位列表
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await JobFairManageApi.getJobFairEnterpriseJobs(queryParams)
+    tableData.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+getList()
+
+const handleRefresh = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+const resetQuery = () => {
+	queryParams.jobName = undefined
+	queryParams.enterpriseName = undefined
+	handleRefresh()
+}
+
+// 富文本去除空格、换行、空标签
+const cleanedHtml = (text) => {
+  let cleaned = text.replace(/\n/g, '</br>')
+  cleaned = cleaned.replace(/\s+/g, ' ').trim()
+  cleaned = cleaned.replace(/(^|\s+)<\/p>(\s*<p>|$)/g, '</p><p>').trim()
+  cleaned = cleaned.replace(/<p>\s*(<br>)\s*<\/p>/g, '')
+  cleaned = cleaned.replace(/<p>\s*(<\/br>)\s*<\/p>/g, '')
+  return cleaned
+}
+
+// 职位详情
+const openDetail = async (item) => {
+	try {
+		const data = await JobAdvertisedApi.getJobAdvertised(item.jobId)
+		itemData.value = {
+			enterpriseName: formatName(item.enterpriseAnotherName || item.enterpriseName),
+			...dealDictObjData({}, data)
+		}
+		dialogVisible.value = true
+	} catch {}
+}
+</script>
+
+<style scoped lang="scss">
+:deep(.el-descriptions__label.el-descriptions__cell.is-bordered-label) {
+  width: 100px;
+}
+</style>

+ 0 - 242
src/views/menduner/system/jobFair/manage/details/index copy.vue

@@ -1,242 +0,0 @@
-<template>
-  <ContentWrap>
-    <!-- 搜索工作栏 -->
-    <CardTitle fontSize="16" :title="jobFairInfo.title?.replace(/<\/?p[^>]*>/gi, '')" />
-    <el-form
-      class="-mb-15px m-t-20px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="68px"
-      @submit.prevent
-    >
-      <el-form-item label="企业名称" prop="name">
-        <el-input v-model="queryParams.name" placeholder="请输入企业名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
-      </el-form-item>
-      <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" :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>
-    </el-form>
-  </ContentWrap>
-
-  <!-- 列表 -->
-  <ContentWrap>
-    <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" prop="status">
-            <template #default="scope">
-              <span :style="{'color': scope.row.status === '1' ? '#f56c6c' : '#67c23a' }">{{ scope.row.status === '1' ? '已禁用' : '已开启' }}</span>
-            </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"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-  </ContentWrap>
-
-  <!-- 表单弹窗:添加/修改 -->
-  <JobFairForm ref="formRef" @success="getList" />
-</template>
-
-<script setup lang="ts">
-import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
-import JobFairForm from './jobFairForm.vue'
-import download from '@/utils/download'
-import { useTagsViewStore } from '@/store/modules/tagsView'
-import { ElMessage } from 'element-plus'
-import { formatName } from '@/utils'
-import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
-
-/** 招聘会 列表 */
-defineOptions({ name: 'JobFairDetails' })
-
-const message = useMessage() // 消息弹窗
-
-const activeName = ref('whiteList')
-const loading = ref(true) // 列表的加载中
-const list = ref([]) // 列表的数据
-const total = ref(0)
-const queryParams = ref({
-  pageNo: 1,
-  pageSize: 10,
-  name: undefined,
-  jobFairId: ''
-})
-
-/** 查询列表 */
-const getList = async () => {
-  loading.value = true
-  const api = activeName.value === 'whiteList' ? JobFairWhiteApi.getJobFairWhiteList : JobFairManageApi.getBuyTicketEnterprise
-  try {
-    const data = await api(queryParams.value)
-    total.value = data.total
-    list.value = data.list
-  } finally {
-    loading.value = false
-  }
-}
-
-const handleClick = () => {
-  total.value = 0
-  list.value = []
-  queryParams.value.pageNo = 1
-  getList()
-}
-
-/* 查询招聘会详情 */
-const jobFairInfo = ref({})
-const getJobFairDetail = async () => {
-  try {
-    const data = await JobFairManageApi.getJobFair(queryParams.value.jobFairId)
-    jobFairInfo.value = data
-  } catch {}
-}
-
-const handleQuery = () => {
-  total.value = 0
-  list.value = []
-  queryParams.value.pageNo = 1
-  getList()
-}
-
-/** 重置按钮操作 */
-const queryFormRef = ref()
-const resetQuery = () => {
-  queryFormRef.value.resetFields()
-  handleQuery()
-}
-
-const formRef = ref()
-const handleAdd = () => {
-  formRef.value.open(queryParams.value.jobFairId)
-}
-
-// 移出白名单
-const handleRemoveWhiteList = async (enterpriseName: string, enterpriseId: string) => {
-  if (!enterpriseId) return message.warning('操作失败,请刷新页面重试')
-  try {
-    await message.confirm(`确定要将【${enterpriseName}】移出白名单吗?`)
-    await JobFairWhiteApi.removeJobFairWhiteList({ enterpriseIds: enterpriseId, jobFairId: queryParams.value.jobFairId })
-    message.success('移出成功')
-    getList()
-  } 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 () => {
-  try {
-    // 导出的二次确认
-    await message.exportConfirm()
-    // 发起导出
-    exportLoading.value = true
-    const data = await JobFairWhiteApi.exportJobFairWhiteList(queryParams.value.jobFairId)
-    download.excel(data, '招聘会职位列表.xls')
-  } catch {
-  } finally {
-    exportLoading.value = false
-  }
-}
-
-// 招聘会投递情况导出
-const exportDeliveryLoading = ref(false)
-const handleExportDelivery = async () => {
-  try {
-    // 导出的二次确认
-    await message.exportConfirm()
-    // 发起导出
-    exportDeliveryLoading.value = true
-    const data = await JobFairWhiteApi.exportJobFairApplyData(queryParams.value.jobFairId)
-    download.excel(data, '招聘会职位投递情况.xls')
-  } catch {
-  } finally {
-    exportDeliveryLoading.value = false
-  }
-}
-
-/** 初始化 */
-const { currentRoute } = useRouter() // 路由
-const { delView } = useTagsViewStore() // 视图操作
-const route = useRoute()
-const { id } = route.params
-onMounted(() => {
-  if (!id) {
-    ElMessage.warning('参数错误,招聘会编号不能为空!')
-    delView(unref(currentRoute))
-    return
-  }
-  queryParams.value.jobFairId = id
-  getList()
-  getJobFairDetail()
-})
-</script>

+ 9 - 5
src/views/menduner/system/jobFair/manage/details/index.vue

@@ -1,8 +1,4 @@
 <template>
-  <!-- <ContentWrap v-if="id">
-    <CardTitle fontSize="16" :title="jobFairInfo.title?.replace(/<\/?p[^>]*>/gi, '')" />
-  </ContentWrap> -->
-
   <ContentWrap v-if="!id || (jobFairInfo && Object.keys(jobFairInfo).length > 0)">
     <el-tabs v-model="activeName" @tab-change="handleTabChange">
       <el-tab-pane label="招聘会信息" name="infoSettings">
@@ -17,11 +13,17 @@
       <el-tab-pane v-if="id" label="门票设置" name="ticketSettings">
         <TicketSettings :info="jobFairInfo" @close="handleClose" @refresh="getJobFairDetail" />
       </el-tab-pane>
+      <!-- <el-tab-pane v-if="id" label="企业招聘职位" name="enterpriseJob">
+        <EnterpriseJob :fairId="id" />
+      </el-tab-pane>
+      <el-tab-pane v-if="id" label="企业招聘职位投递简历" name="enterpriseJobResume">
+        <EnterpriseJobResume :fairId="id" />
+      </el-tab-pane> -->
     </el-tabs>
   </ContentWrap>
 </template>
 
-<script setup lang="ts">
+<script setup>
 /** 招聘会 详情 */
 defineOptions({ name: 'JobFairDetails' })
 import { JobFairManageApi } from '@/api/menduner/system/jobFair/manage'
@@ -29,6 +31,8 @@ import TicketSettings from './components/TicketSettings.vue'
 import WhiteList from './components/WhiteList.vue'
 import InfoSettings from './components/InfoSettings.vue'
 import Category from './components/Category.vue'
+import EnterpriseJobResume from '@/views/menduner/system/enterprise/message/details/components/resume.vue'
+import EnterpriseJob from './components/job.vue'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 
 const activeName = ref('infoSettings') // 当前激活的tab

+ 0 - 2
src/views/menduner/system/jobFair/manage/index.vue

@@ -114,7 +114,6 @@
   <!-- 表单弹窗:添加/修改 -->
   <JobFairManageForm ref="formRef" @success="getList" />
 
-  <TicketSettings ref="ticketRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
@@ -123,7 +122,6 @@ import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
 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' })

+ 0 - 85
src/views/menduner/system/jobFair/white copy/index.vue

@@ -1,85 +0,0 @@
-<template>
-  <!-- 列表 -->
-  <ContentWrap>
-    <div style="text-align: end;">
-      <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="title" />
-      <el-table-column label="企业全称" align="center" prop="name" />
-      <el-table-column label="企业别称" align="center" prop="anotherName" />
-      <el-table-column label="企业logo" align="center" prop="logoUrl">
-        <template #default="scope">
-          <el-image style="width: 80px; height: 80px" :src="scope.row.logoUrl" />
-        </template>
-      </el-table-column>
-      <el-table-column label="用户名" align="center" prop="contact" />
-      <el-table-column label="操作" align="center">
-        <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="handleRemoveWhiteList(scope.row.id)"
-          >
-            移出白名单
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-  </ContentWrap>
-
-  <!-- 表单弹窗:添加/修改 -->
-  <JobFairForm ref="formRef" @success="getList" />
-</template>
-
-<script setup lang="ts">
-import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
-import JobFairForm from './jobFairForm.vue'
-
-/** 招聘会 列表 */
-defineOptions({ name: 'JobFair' })
-
-const message = useMessage() // 消息弹窗
-
-const loading = ref(true) // 列表的加载中
-const list = ref([]) // 列表的数据
-
-/** 查询列表 */
-const getList = async () => {
-  loading.value = true
-  try {
-    const data = await JobFairWhiteApi.getJobFairWhiteList()
-    if (!data) return list.value = []
-    list.value = data.enterpriseList.map(e => {
-      return { ...e, title: data.fair.title }
-    })
-  } finally {
-    loading.value = false
-  }
-}
-
-const formRef = ref()
-const handleAdd = () => {
-  formRef.value.open()
-}
-
-const handleRemoveWhiteList = async (id: number) => {
-  try {
-    await message.confirm('确定要将该企业移出白名单吗?')
-    await JobFairWhiteApi.removeJobFairWhiteList([id])
-    message.success('移出成功')
-    getList()
-  } catch (err) {}
-}
-
-/** 初始化 **/
-onMounted(() => {
-  getList()
-})
-</script>

+ 0 - 90
src/views/menduner/system/jobFair/white copy/jobFairForm.vue

@@ -1,90 +0,0 @@
-<template>
-  <Dialog title="添加白名单" v-model="dialogVisible">
-    <el-form
-      ref="formRef"
-      :model="formData"
-      :rules="formRules"
-      label-width="100px"
-      v-loading="formLoading"
-    >
-      <el-form-item label="企业名称" prop="enterpriseIds">
-        <el-select v-model="formData.enterpriseIds" filterable clearable multiple placeholder="请输入企业名称进行查找">
-          <el-option
-            v-for="item in enterpriseList"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id"
-          />
-        </el-select>
-      </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">
-import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
-import { EnterpriseUserBindApi } from '@/api/menduner/system/enterprise/userBind'
-
-/** 招聘会 表单 */
-defineOptions({ name: 'JobFairForm' })
-
-const message = useMessage() // 消息弹窗
-
-const enterpriseList = ref([])
-const dialogVisible = ref(false) // 弹窗的是否展示
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formData = ref({
-  enterpriseIds: []
-})
-const formRules = reactive({
-  enterpriseIds: [{ required: true, message: '请选择要添加的企业', trigger: 'blur' }]
-})
-const formRef = ref() // 表单 Ref
-
-/** 打开弹窗 */
-const open = async () => {
-  dialogVisible.value = true
-  resetForm()
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-// 企业列表
-const getEnterpriseListData = async () => {
-  try {
-    const data = await EnterpriseUserBindApi.getEnterpriseList()
-    enterpriseList.value = data
-  } catch (err) {}
-}
-getEnterpriseListData()
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  await formRef.value.validate()
-  
-  // 提交请求
-  formLoading.value = true
-  try {
-    await JobFairWhiteApi.addJobFairWhiteList(formData.value.enterpriseIds)
-    message.success('添加成功')
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-    enterpriseIds: []
-  }
-  formRef.value?.resetFields()
-}
-</script>

+ 0 - 142
src/views/menduner/system/jobFair/white/index.vue

@@ -1,142 +0,0 @@
-<template>
-  <ContentWrap>
-    <!-- 搜索工作栏 -->
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="68px"
-      @submit.prevent
-    >
-      <el-form-item label="企业名称" prop="name">
-        <el-input
-          v-model="queryParams.name"
-          placeholder="请输入企业名称"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <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 v-if="showExport" type="primary" plain @click="handleExport"><Icon icon="ep:download" class="mr-5px" /> 导出参加招聘会职位列表</el-button>
-      </el-form-item>
-    </el-form>
-  </ContentWrap>
-
-  <!-- 列表 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list" :stripe="true">
-      <el-table-column label="招聘会标题" align="center" prop="jobFair.title">
-        <template #default="scope">
-          <div v-html="scope.row.jobFair.title"></div>
-        </template>
-      </el-table-column>
-      <el-table-column label="企业名称" align="center" prop="name" />
-      <el-table-column label="操作" align="center">
-        <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="handleRemoveWhiteList(scope.row.name)"
-          >
-            移出白名单
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-  </ContentWrap>
-
-  <!-- 表单弹窗:添加/修改 -->
-  <JobFairForm ref="formRef" @success="getList" />
-</template>
-
-<script setup lang="ts">
-import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
-import JobFairForm from './jobFairForm.vue'
-import download from '@/utils/download'
-
-/** 招聘会 列表 */
-defineOptions({ name: 'JobFair' })
-
-const message = useMessage() // 消息弹窗
-
-const loading = ref(true) // 列表的加载中
-const list = ref([]) // 列表的数据
-const total = ref(0)
-const queryParams = ref({
-  pageNo: 1,
-  pageSize: 10,
-  name: undefined
-})
-
-/** 查询列表 */
-const getList = async () => {
-  loading.value = true
-  try {
-    const data = await JobFairWhiteApi.getJobFairWhiteList(queryParams.value)
-    total.value = data.total
-    list.value = data.list
-  } finally {
-    loading.value = false
-  }
-}
-
-const handleQuery = () => {
-  queryParams.value.pageNo = 1
-  getList()
-}
-
-/** 重置按钮操作 */
-const queryFormRef = ref()
-const resetQuery = () => {
-  queryFormRef.value.resetFields()
-  handleQuery()
-}
-
-const formRef = ref()
-const handleAdd = () => {
-  formRef.value.open()
-}
-
-// 移出白名单
-const handleRemoveWhiteList = async (enterpriseName: string) => {
-  try {
-    await message.confirm('确定要将该企业移出白名单吗?')
-    await JobFairWhiteApi.removeJobFairWhiteList(enterpriseName)
-    message.success('移出成功')
-    getList()
-  } catch (err) {}
-}
-
-const showExport = ref(true) // 导出参加招聘会职位列表
-const exportLoading = ref(false) // 导出的加载中
-/** 导出按钮操作 */
-const handleExport = async () => {
-  try {
-    // 导出的二次确认
-    await message.exportConfirm()
-    // 发起导出
-    exportLoading.value = true
-    const data = await JobFairWhiteApi.exportJobFairWhiteList()
-    download.excel(data, '招聘会职位列表.xls')
-  } catch {
-  } finally {
-    exportLoading.value = false
-  }
-}
-
-/** 初始化 **/
-onMounted(() => {
-  getList()
-})
-</script>

+ 0 - 85
src/views/menduner/system/jobFair/white/jobFairForm.vue

@@ -1,85 +0,0 @@
-<template>
-  <Dialog title="添加白名单" v-model="dialogVisible">
-    <el-form
-      ref="formRef"
-      :model="formData"
-      :rules="formRules"
-      label-width="100px"
-      v-loading="formLoading"
-    >
-      <el-form-item label="企业名称" prop="enterpriseName">
-        <el-select v-model="formData.enterpriseName" filterable clearable placeholder="请输入企业名称进行查找">
-          <el-option v-for="item in enterpriseList" :key="item.id" :label="item.name" :value="item.name" />
-        </el-select>
-      </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">
-import { JobFairWhiteApi } from '@/api/menduner/system/jobFair/white'
-import { EnterpriseUserBindApi } from '@/api/menduner/system/enterprise/userBind'
-
-/** 招聘会 表单 */
-defineOptions({ name: 'JobFairForm' })
-
-const message = useMessage() // 消息弹窗
-
-const enterpriseList = ref([])
-const dialogVisible = ref(false) // 弹窗的是否展示
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formData = ref({
-  enterpriseName: ''
-})
-const formRules = reactive({
-  enterpriseName: [{ required: true, message: '请选择要添加的企业', trigger: 'blur' }]
-})
-const formRef = ref() // 表单 Ref
-
-/** 打开弹窗 */
-const open = async () => {
-  dialogVisible.value = true
-  resetForm()
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-// 企业列表
-const getEnterpriseListData = async () => {
-  try {
-    const data = await EnterpriseUserBindApi.getEnterpriseList()
-    enterpriseList.value = data
-  } catch (err) {}
-}
-getEnterpriseListData()
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  await formRef.value.validate()
-  
-  // 提交请求
-  formLoading.value = true
-  try {
-    await JobFairWhiteApi.addJobFairWhiteList(formData.value.enterpriseName)
-    message.success('添加成功')
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-    enterpriseName: ''
-  }
-  formRef.value?.resetFields()
-}
-</script>

+ 6 - 7
src/views/menduner/system/person/details/components/deliveryJob.vue

@@ -26,7 +26,7 @@
     </el-table-column>
     <el-table-column label="操作" align="center">
       <template #default="scope">
-        <el-button link type="primary" @click="openDetail(scope.row)" class="m-r-10px">详情</el-button>
+        <el-button link type="primary" @click="openDetail(scope.row)" class="m-r-10px">职位详情</el-button>
         <el-link type="primary" download :href="scope.row.cvRel.url" :underline="false" target="_blank">附件下载</el-link>
       </template>
     </el-table-column>
@@ -56,21 +56,20 @@
         <el-link type="primary" download :href="itemData.title" :underline="false" target="_blank">{{ itemData.title }}</el-link>
       </el-descriptions-item>
       <el-descriptions-item label="投递时间">
-        {{ itemData.time ? timesTampChange(itemData.time, 'Y-M-D h:m:s') : '' }}
+        {{ itemData.time ? timesTampChange(itemData.time) : '' }}
       </el-descriptions-item>
       <el-descriptions-item label="投递状态">
         {{ itemData.cvStatus === '0' ? '未查看' : '已查看' }}
       </el-descriptions-item>
       <el-descriptions-item label="学历要求">
-        <dict-tag :type="DICT_TYPE.MENDUNER_EDUCATION_TYPE" :value="itemData.eduType" />
+        <span v-if="!itemData.eduType">不限</span>
+        <dict-tag v-else :type="DICT_TYPE.MENDUNER_EDUCATION_TYPE" :value="itemData.eduType" />
       </el-descriptions-item>
       <el-descriptions-item label="工作经验">
-        <dict-tag :type="DICT_TYPE.MENDUNER_EXP_TYPE" :value="itemData.expType" />
+        <span v-if="!itemData.expType">不限</span>
+        <dict-tag v-else :type="DICT_TYPE.MENDUNER_EXP_TYPE" :value="itemData.expType" />
       </el-descriptions-item>
       <el-descriptions-item label="刷新时间">{{ timesTampChange(itemData.updateTime, 'Y-M-D h:m') }}</el-descriptions-item>
-      <el-descriptions-item label="到期时间">
-        {{ itemData.expireTime ? timesTampChange(itemData.expireTime, 'Y-M-D') : '长期有效' }}
-      </el-descriptions-item>
       <el-descriptions-item label="职位关键字">
         <el-tag type="primary" v-for="k in itemData.tagList" :key="k" class="m-r-5px m-b-5px">{{ k }}</el-tag>
       </el-descriptions-item>

+ 2 - 1
src/views/menduner/system/talentMap/maintenance/gather/webPageParsing/index.vue

@@ -86,7 +86,8 @@ const { t } = useI18n() // 国际化
 
 const loading = ref(false)
 const queryParams = reactive({
-	urls: 'https://element.eleme.cn/#/zh-CN/component/installation'
+	// urls: 'https://element.eleme.cn/#/zh-CN/component/installation'
+	urls: 'https://mp.weixin.qq.com/s/WeCRR3zN3fPvlGR4t8YFDA'
 })
 const queryFormRef = ref()
 const contents = ref([])

+ 2 - 2
src/views/menduner/system/web/PreferredGroup.vue

@@ -20,13 +20,13 @@
       <!-- <el-form-item label="顶部轮播图左上角LOGO" prop="logo">
         <UploadImg v-model="formData.logo" height="150px" width="150px" />
       </el-form-item> -->
-      <el-form-item label="顶部轮播图" prop="carousel" :rules="[{ required: true, message: '请上传企业轮播图', trigger: 'change'}]">
+      <el-form-item label="顶部轮播图" prop="carousel" :rules="[{ required: true, message: '请上传顶部轮播图', trigger: 'change'}]">
         <UploadImgs v-model="formData.carousel" :limit="20" />
       </el-form-item>
 			<el-form-item label="简介标题" prop="introduce.title" :rules="[{ required: true, message: '请输入简介标题', trigger: 'blur'}]">
         <el-input v-model="formData.introduce.title" />
       </el-form-item>
-			<el-form-item label="集团简介" prop="introduce.describe" :rules="[{ required: true, message: '请输入简介内容', trigger: 'blur'}]">
+			<el-form-item label="简介内容" prop="introduce.describe" :rules="[{ required: true, message: '请输入简介内容', trigger: 'blur'}]">
         <Editor v-model:modelValue="formData.introduce.describe" />
       </el-form-item>
 			<el-form-item label="简介小图" prop="introduce.thumbnail">

+ 2 - 2
src/views/menduner/system/web/WebContentForm.vue

@@ -62,7 +62,7 @@
   </Dialog>
 </template>
 
-<script setup lang="ts">
+<script setup>
 import { WebContentApi } from '@/api/menduner/system/web'
 
 /** 页面内容 表单 */
@@ -125,7 +125,7 @@ const formRules = reactive({
 const formRef = ref() // 表单 Ref
 
 /** 打开弹窗 */
-const open = async (type: string, key: string, title: string, mark?: string) => {
+const open = async (type, key, title, mark) => {
   formType.value = type
   resetForm()
   currentKey.value = key

+ 3 - 3
src/views/menduner/system/web/index.vue

@@ -72,7 +72,7 @@
 
 </template>
 
-<script setup lang="ts">
+<script setup>
 import { WebContentApi } from '@/api/menduner/system/web'
 import WebContentForm from './WebContentForm.vue'
 import PreferredGroup from './PreferredGroup.vue'
@@ -141,12 +141,12 @@ const handleAdd = () => {
 }
 
 const formRef = ref()
-const handleEdit = (mark: string) => {
+const handleEdit = (mark) => {
   formRef.value.open('edit', tabList.value[tab.value].key, tabList.value[tab.value].label, mark)
 }
 
 /** 删除按钮操作 */
-const handleDelete = async (mark: string) => {
+const handleDelete = async (mark) => {
   const index = info[tabList.value[tab.value].key].findIndex((item) => item.mark === mark)
   if (index === -1) return message.warning('图片不存在')
   try {