diff --git a/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyUnsubscribeTab.tsx b/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyUnsubscribeTab.tsx new file mode 100644 index 0000000..86406be --- /dev/null +++ b/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyUnsubscribeTab.tsx @@ -0,0 +1,63 @@ +import React, { useRef } from 'react'; +import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components'; +import { getCompanyUnsubscribes } from '@/services/jobportal/outdoorFairDetail'; + +interface Props { + fairId: number; +} + +const CompanyUnsubscribeTab: React.FC = ({ fairId }) => { + const actionRef = useRef(); + + const columns: ProColumns[] = [ + { + title: '企业名称', + dataIndex: 'companyName', + ellipsis: true, + order: 1, + }, + { title: '联系人', dataIndex: 'contactPerson', width: 120, hideInSearch: true }, + { title: '联系电话', dataIndex: 'contactPhone', width: 150, hideInSearch: true }, + { + title: '退订原因', + dataIndex: 'reason', + ellipsis: true, + hideInSearch: true, + render: (_, record) => {record.reason}, + }, + { + title: '退订时间', + dataIndex: 'unsubscribeTime', + valueType: 'dateTime', + width: 180, + hideInSearch: true, + }, + ]; + + return ( + + headerTitle="企业退订记录" + actionRef={actionRef} + rowKey="id" + columns={columns} + search={{ labelWidth: 'auto' }} + options={false} + scroll={{ x: 'max-content' }} + pagination={{ pageSize: 10 }} + request={async (params) => { + const res = await getCompanyUnsubscribes(fairId, { + current: params.current, + pageSize: params.pageSize, + companyName: params.companyName, + }); + return { + data: res.rows || [], + total: res.total || 0, + success: res.code === 200, + }; + }} + /> + ); +}; + +export default CompanyUnsubscribeTab; diff --git a/src/pages/Jobfair/Outdoorfair/Detail/index.tsx b/src/pages/Jobfair/Outdoorfair/Detail/index.tsx index 7cb3657..80fb7c7 100644 --- a/src/pages/Jobfair/Outdoorfair/Detail/index.tsx +++ b/src/pages/Jobfair/Outdoorfair/Detail/index.tsx @@ -9,6 +9,7 @@ import FairInfoTab from './components/FairInfoTab'; import BoothTab from './components/BoothTab'; import ParticipatingCompaniesTab from './components/ParticipatingCompaniesTab'; import ParticipatingJobsTab from './components/ParticipatingJobsTab'; +import CompanyUnsubscribeTab from './components/CompanyUnsubscribeTab'; import AttendeeTab from './components/AttendeeTab'; import DeviceTab from './components/DeviceTab'; @@ -42,6 +43,7 @@ const OutdoorFairDetail: React.FC = () => { const tabItems = [ { key: 'fair-info', label: '招聘会管理' }, { key: 'participating-companies', label: '参会企业' }, + { key: 'company-unsubscribe', label: '企业退订' }, { key: 'participating-jobs', label: '参会岗位' }, { key: 'attendee', label: '参会人员管理' }, { key: 'device', label: '设备管理' }, @@ -86,6 +88,8 @@ const OutdoorFairDetail: React.FC = () => { return ; case 'participating-companies': return ; + case 'company-unsubscribe': + return ; case 'participating-jobs': return ; case 'attendee': diff --git a/src/pages/Jobfair/Outdoorfair/index.tsx b/src/pages/Jobfair/Outdoorfair/index.tsx index f5c23ed..7159629 100644 --- a/src/pages/Jobfair/Outdoorfair/index.tsx +++ b/src/pages/Jobfair/Outdoorfair/index.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useAccess, history, useModel } from '@umijs/max'; -import { Button, message, Modal, QRCode, Tag, Typography } from 'antd'; +import { Button, Form, Input, message, Modal, QRCode, Tag, Typography } from 'antd'; import { ActionType, PageContainer, ProColumns, ProTable } from '@ant-design/pro-components'; import { PlusOutlined, @@ -18,6 +18,7 @@ import { deleteOutdoorFair, addOutdoorFairDictOption, signupOutdoorFair, + unsubscribeOutdoorFair, getMyOutdoorFairQrCode, getOutdoorFairMiniProgramQrCode, exportOutdoorFair, @@ -63,6 +64,10 @@ const OutdoorFairList: React.FC = () => { const [miniProgramQrLoadingFairId, setMiniProgramQrLoadingFairId] = useState(); const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); const [rejectReason, setRejectReason] = useState(''); + const [unsubscribeModalOpen, setUnsubscribeModalOpen] = useState(false); + const [unsubscribeFair, setUnsubscribeFair] = useState(null); + const [unsubscribeSubmitting, setUnsubscribeSubmitting] = useState(false); + const [unsubscribeForm] = Form.useForm(); const [companyDetailFair, setCompanyDetailFair] = useState(null); const [companyBoothFair, setCompanyBoothFair] = useState(null); const [fairTypeValueEnum, setFairTypeValueEnum] = useState>({}); @@ -234,6 +239,39 @@ const OutdoorFairList: React.FC = () => { setRejectReasonModalOpen(true); }; + const openUnsubscribe = (record: OutdoorFairItem) => { + setUnsubscribeFair(record); + unsubscribeForm.resetFields(); + setUnsubscribeModalOpen(true); + }; + + const handleUnsubscribe = async () => { + let values: { reason: string }; + try { + values = await unsubscribeForm.validateFields(); + } catch { + return; + } + if (!unsubscribeFair) return; + setUnsubscribeSubmitting(true); + try { + const res = await unsubscribeOutdoorFair(unsubscribeFair.id, values.reason); + if (res.code === 200) { + message.success('退订成功'); + setUnsubscribeModalOpen(false); + setUnsubscribeFair(null); + unsubscribeForm.resetFields(); + actionRef.current?.reload(); + } else { + message.error(res.msg || '退订失败'); + } + } catch { + message.error('退订失败,请稍后重试'); + } finally { + setUnsubscribeSubmitting(false); + } + }; + const openCompanyDetail = (record: OutdoorFairItem) => { setCompanyDetailFair(record); }; @@ -448,6 +486,20 @@ const OutdoorFairList: React.FC = () => { 查看报名岗位 ) : null, + isEnterprise && + record.signedUp && + record.reviewStatus === '1' && + access.hasPerms('cms:outdoorFair:unsubscribe') ? ( + + ) : null, isEnterprise ? (