From 3b1877f302f89ea0687e47b56f5ab94bbfc36c7f Mon Sep 17 00:00:00 2001 From: francis-fh Date: Wed, 24 Jun 2026 09:06:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=9B=E8=81=98=E4=BC=9A=E4=B8=89=E4=B8=AA?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .codegraph/daemon.pid | 6 - .../Detail/components/BoothAssignModal.tsx | 103 ++++++++++ .../Detail/components/CompanyQueryTab.tsx | 2 +- .../Detail/components/CompanyRecordTab.tsx | 2 +- .../Detail/components/CompanyReviewModal.tsx | 43 ++++ .../Detail/components/CompanyReviewTab.tsx | 68 ++++++- .../Detail/components/FairBoothModal.tsx | 186 ++++++++++++++++++ .../Detail/components/FairInfoModal.tsx | 62 ++++++ .../Detail/components/FairManageTab.tsx | 11 +- .../Detail/components/JobQueryTab.tsx | 2 +- .../Detail/components/JobReviewTab.tsx | 165 +++++++++++----- .../components/ReservationRecordTab.tsx | 8 +- .../Detail/components/ReviewModal.tsx | 85 ++++++++ .../Detail/components/VenueLayoutModal.tsx | 162 +++++++++++++++ .../Detail/components/VenueTab.tsx | 11 +- .../Detail/components/AttendeeTab.tsx | 42 +++- .../Detail/components/BoothTab.tsx | 25 ++- .../Detail/components/CompanyAddModal.tsx | 2 +- .../Detail/components/CompanyReviewTab.tsx | 30 ++- .../Detail/components/DeviceTab.tsx | 12 +- src/services/jobportal/indoorJobFair.ts | 2 +- src/services/jobportal/outdoorFair.ts | 2 +- src/services/jobportal/outdoorFairDetail.ts | 6 +- 23 files changed, 939 insertions(+), 98 deletions(-) delete mode 100644 .codegraph/daemon.pid create mode 100644 src/pages/Jobfair/Indoorjobfair/Detail/components/BoothAssignModal.tsx create mode 100644 src/pages/Jobfair/Indoorjobfair/Detail/components/CompanyReviewModal.tsx create mode 100644 src/pages/Jobfair/Indoorjobfair/Detail/components/FairBoothModal.tsx create mode 100644 src/pages/Jobfair/Indoorjobfair/Detail/components/FairInfoModal.tsx create mode 100644 src/pages/Jobfair/Indoorjobfair/Detail/components/ReviewModal.tsx create mode 100644 src/pages/Jobfair/Indoorjobfair/Detail/components/VenueLayoutModal.tsx diff --git a/.codegraph/daemon.pid b/.codegraph/daemon.pid deleted file mode 100644 index f1c1c84..0000000 --- a/.codegraph/daemon.pid +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pid": 17132, - "version": "0.9.9", - "socketPath": "\\\\.\\pipe\\codegraph-ae68fa88b3ffb91a", - "startedAt": 1781719809693 -} diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/BoothAssignModal.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/BoothAssignModal.tsx new file mode 100644 index 0000000..17b51af --- /dev/null +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/BoothAssignModal.tsx @@ -0,0 +1,103 @@ +import React, { useState } from 'react'; +import { Modal, Form, Select, Input, Button, message, Space } from 'antd'; +import type { BoothItem } from './FairBoothModal'; + +interface Props { + booth: BoothItem | null; + open: boolean; + onClose: () => void; + onSuccess: (boothNumber: string, companyName: string) => void; +} + +const AVAILABLE_COMPANIES = [ + { companyId: 1001, companyName: '新疆天业(集团)有限公司', industry: '化工', scale: '1000人以上' }, + { companyId: 1002, companyName: '石河子经济技术开发区管委会', industry: '政府/公共事业', scale: '500-1000人' }, + { companyId: 1003, companyName: '新疆西部牧业股份有限公司', industry: '农业/畜牧', scale: '500-1000人' }, + { companyId: 1004, companyName: '兵团水利水电工程集团', industry: '建筑/工程', scale: '1000人以上' }, + { companyId: 1005, companyName: '阿拉尔新爵纺织有限公司', industry: '纺织/服装', scale: '200-500人' }, + { companyId: 1006, companyName: '新疆通用航空有限责任公司', industry: '航空/交通', scale: '200-500人' }, + { companyId: 1007, companyName: '石河子市商业银行', industry: '金融', scale: '500-1000人' }, + { companyId: 1008, companyName: '兵团广播电视大学', industry: '教育/科研', scale: '200-500人' }, +]; + +const BoothAssignModal: React.FC = ({ booth, open, onClose, onSuccess }) => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + + if (!booth) return null; + + const handleSubmit = async () => { + try { + const values = await form.validateFields(); + setLoading(true); + + // 模拟提交 + setTimeout(() => { + message.success(`展位「${booth.boothNumber}」已分配给「${values.companyName}」`); + onSuccess(booth.boothNumber, values.companyName); + form.resetFields(); + onClose(); + setLoading(false); + }, 500); + } catch (error) { + console.error('表单验证失败', error); + } + }; + + return ( + 取消, + , + ]} + width={500} + destroyOnClose + > +
+ + + + + + + + + |}> + 场地:{fair.venueName} + 开始日期:{fair.startDate} + 结束日期:{fair.endDate} + 状态:{fair.status === 'ongoing' ? '进行中' : fair.status === 'pending' ? '筹备中' : '已结束'} + + + + setAssignModalOpen(false)} + onSuccess={handleAssignSuccess} + /> + + ); +}; + +export default FairBoothModal; diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/FairInfoModal.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/FairInfoModal.tsx new file mode 100644 index 0000000..9a3d9f1 --- /dev/null +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/FairInfoModal.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { Modal, Descriptions, Tag, Space } from 'antd'; +import type { CompanyReviewItem } from '@/services/jobportal/indoorJobFair'; + +interface Props { + record: CompanyReviewItem | null; + open: boolean; + onClose: () => void; +} + +const FairInfoModal: React.FC = ({ record, open, onClose }) => { + if (!record) return null; + + const fairInfo = { + fairName: record.fairName, + venueName: '石河子大学体育馆', + address: '石河子市北三路石河子大学内', + startDate: '2026-03-20', + endDate: '2026-03-22', + status: 'ongoing', + boothCount: 60, + boothUseCount: 45, + organizer: '石河子大学就业指导中心', + contactPerson: '王老师', + contactPhone: '0993-2058999', + }; + + const statusMap: Record = { + pending: { text: '筹备中', color: 'default' }, + ongoing: { text: '进行中', color: 'green' }, + finished: { text: '已结束', color: 'red' }, + }; + + return ( + + + {fairInfo.fairName} + {fairInfo.venueName} + {fairInfo.address} + {fairInfo.startDate} + {fairInfo.endDate} + + {statusMap[fairInfo.status]?.text} + + {fairInfo.boothCount} + {fairInfo.boothUseCount} + {fairInfo.organizer} + {fairInfo.contactPerson} + {fairInfo.contactPhone} + + + ); +}; + +export default FairInfoModal; diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/FairManageTab.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/FairManageTab.tsx index 626bdc2..4411e65 100644 --- a/src/pages/Jobfair/Indoorjobfair/Detail/components/FairManageTab.tsx +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/FairManageTab.tsx @@ -10,6 +10,7 @@ import { deleteJobFair, } from '@/services/jobportal/indoorJobFair'; import type { JobFairItem, JobFairForm } from '@/services/jobportal/indoorJobFair'; +import FairBoothModal from './FairBoothModal'; interface Props { fairId: number; @@ -22,6 +23,8 @@ const FairManageTab: React.FC = ({ fairInfo }) => { const actionRef = useRef(); const [modalOpen, setModalOpen] = useState(false); const [editingFair, setEditingFair] = useState(null); + const [boothModalOpen, setBoothModalOpen] = useState(false); + const [boothFair, setBoothFair] = useState(null); const statusMap: Record = { pending: { text: '筹备中', color: 'default' }, @@ -51,7 +54,7 @@ const FairManageTab: React.FC = ({ fairInfo }) => { width: 200, render: (_, record) => [ , , record.reviewStatus === 'pending' && ( - + + ), + record.reviewStatus === 'pending' && ( + ), ], }, @@ -115,24 +142,72 @@ const JobReviewTab: React.FC = () => { }} /> - setCompanyModalOpen(false)} + footer={null} width={500} - modalProps={{ destroyOnClose: true, onCancel: () => setReviewModalOpen(false) }} - onFinish={async (values) => { - if (values.action === 'approve') { - return handleApprove(values); - } else { - return handleReject(values); - } - }} - initialValues={currentJob} + destroyOnClose > - - - - + + {currentJob?.companyName} + {currentJob?.fairName} + {currentJob?.jobTitle} + {currentJob?.education} + {currentJob?.experience} + {currentJob?.vacancies} + + + + {/* 审核弹窗 */} + setReviewModalOpen(false)} + footer={[ + , + , + ]} + width={500} + destroyOnClose + > + + {currentJob?.companyName} + {currentJob?.jobTitle} + {currentJob?.vacancies} + {currentJob?.education} + {currentJob?.experience} + + + + + + ); }; diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/ReservationRecordTab.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/ReservationRecordTab.tsx index 33a8c0b..f18c814 100644 --- a/src/pages/Jobfair/Indoorjobfair/Detail/components/ReservationRecordTab.tsx +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/ReservationRecordTab.tsx @@ -11,13 +11,7 @@ const ReservationRecordTab: React.FC = () => { const actionRef = useRef(); const columns: ProColumns[] = [ - { title: '招聘会名称', dataIndex: 'fairName', ellipsis: true, hideInSearch: true }, - { - title: '操作人', - dataIndex: 'operator', - order: 1, - }, - { title: '操作人', dataIndex: 'operator', width: 100, hideInSearch: true }, + { title: '操作人', dataIndex: 'operator', order: 1 }, { title: '招聘会名称', dataIndex: 'fairName', ellipsis: true, hideInSearch: true }, { title: '展位号', dataIndex: 'boothNumber', width: 100, hideInSearch: true }, { title: '企业名称', dataIndex: 'companyName', ellipsis: true, hideInSearch: true, render: (_, r) => r.companyName || '--' }, diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/ReviewModal.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/ReviewModal.tsx new file mode 100644 index 0000000..eb66426 --- /dev/null +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/ReviewModal.tsx @@ -0,0 +1,85 @@ +import React, { useState } from 'react'; +import { Modal, Form, Input, Button, message } from 'antd'; +import { CheckOutlined, CloseOutlined } from '@ant-design/icons'; +import type { CompanyReviewItem } from '@/services/jobportal/indoorJobFair'; +import { batchApproveCompany, batchRejectCompany } from '@/services/jobportal/indoorJobFair'; + +interface Props { + record: CompanyReviewItem | null; + type: 'approve' | 'reject'; + open: boolean; + onClose: () => void; + onSuccess: () => void; +} + +const ReviewModal: React.FC = ({ record, type, open, onClose, onSuccess }) => { + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + + if (!record) return null; + + const handleSubmit = async () => { + try { + const values = await form.validateFields(); + setLoading(true); + + const res = type === 'approve' + ? await batchApproveCompany([record.id]) + : await batchRejectCompany([record.id]); + + if (res.code === 200) { + message.success(type === 'approve' ? '审核已通过' : '审核已拒绝'); + onSuccess(); + onClose(); + form.resetFields(); + } else { + message.error(res.msg); + } + } catch (error) { + console.error('表单验证失败', error); + } finally { + setLoading(false); + } + }; + + return ( + 取消, + , + ]} + width={500} + destroyOnClose + > +
+ 单位名称:{record.companyName} +
+ + + + + +
+ ); +}; + +export default ReviewModal; diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueLayoutModal.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueLayoutModal.tsx new file mode 100644 index 0000000..91ae318 --- /dev/null +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueLayoutModal.tsx @@ -0,0 +1,162 @@ +import React, { useState } from 'react'; +import { Modal, Tag, Space, Card, Row, Col, Button, message } from 'antd'; +import { CloseOutlined, CheckOutlined } from '@ant-design/icons'; +import type { VenueItem } from '@/services/jobportal/indoorJobFair'; + +interface Props { + venue: VenueItem | null; + open: boolean; + onClose: () => void; +} + +const VENUE_LAYOUT_DATA = [ + // A区 + { id: 1, area: 'A', row: 1, col: 1, boothNumber: 'A01', status: 'reserved', companyName: '新疆天业(集团)有限公司' }, + { id: 2, area: 'A', row: 1, col: 2, boothNumber: 'A02', status: 'fixed', companyName: '石河子经济技术开发区管委会' }, + { id: 3, area: 'A', row: 1, col: 3, boothNumber: 'A03', status: 'available', companyName: '' }, + { id: 4, area: 'A', row: 1, col: 4, boothNumber: 'A04', status: 'reserved', companyName: '新疆西部牧业股份有限公司' }, + { id: 5, area: 'A', row: 2, col: 1, boothNumber: 'A05', status: 'available', companyName: '' }, + { id: 6, area: 'A', row: 2, col: 2, boothNumber: 'A06', status: 'locked', companyName: '' }, + { id: 7, area: 'A', row: 2, col: 3, boothNumber: 'A07', status: 'available', companyName: '' }, + { id: 8, area: 'A', row: 2, col: 4, boothNumber: 'A08', status: 'reserved', companyName: '兵团水利水电工程集团' }, + // B区 + { id: 9, area: 'B', row: 1, col: 1, boothNumber: 'B01', status: 'available', companyName: '' }, + { id: 10, area: 'B', row: 1, col: 2, boothNumber: 'B02', status: 'fixed', companyName: '阿拉尔新爵纺织有限公司' }, + { id: 11, area: 'B', row: 1, col: 3, boothNumber: 'B03', status: 'locked', companyName: '' }, + { id: 12, area: 'B', row: 1, col: 4, boothNumber: 'B04', status: 'available', companyName: '' }, + { id: 13, area: 'B', row: 2, col: 1, boothNumber: 'B05', status: 'reserved', companyName: '新疆通用航空有限责任公司' }, + { id: 14, area: 'B', row: 2, col: 2, boothNumber: 'B06', status: 'available', companyName: '' }, + { id: 15, area: 'B', row: 2, col: 3, boothNumber: 'B07', status: 'reserved', companyName: '石河子市商业银行' }, + { id: 16, area: 'B', row: 2, col: 4, boothNumber: 'B08', status: 'available', companyName: '' }, +]; + +const statusMap: Record = { + available: { text: '可用', color: '#52c41a' }, + fixed: { text: '固定', color: '#1890ff' }, + reserved: { text: '预留', color: '#fa8c16' }, + locked: { text: '锁定', color: '#ff4d4f' }, +}; + +const VenueLayoutModal: React.FC = ({ venue, open, onClose }) => { + const [selectedBooth, setSelectedBooth] = useState(null); + + if (!venue) return null; + + const areas = ['A', 'B']; + + const handleBoothClick = (booth: typeof VENUE_LAYOUT_DATA[0]) => { + setSelectedBooth(booth); + }; + + const getBoothStyle = (status: string) => { + switch (status) { + case 'available': + return { backgroundColor: '#f6ffed', borderColor: '#52c41a' }; + case 'fixed': + return { backgroundColor: '#e6f7ff', borderColor: '#1890ff' }; + case 'reserved': + return { backgroundColor: '#fff7e6', borderColor: '#fa8c16' }; + case 'locked': + return { backgroundColor: '#fff1f0', borderColor: '#ff4d4f' }; + default: + return {}; + } + }; + + return ( + +
+ + 可用 + 固定 + 预留 + 锁定 + + + 共 {venue.boothCount} 个展位 | 已使用 {VENUE_LAYOUT_DATA.filter(b => b.status !== 'available').length} 个 | 可用 {VENUE_LAYOUT_DATA.filter(b => b.status === 'available').length} 个 + +
+ + +
+ + {areas.map((area) => ( +
+
【{area}区】
+
+ {VENUE_LAYOUT_DATA.filter(b => b.area === area).map((booth) => ( +
handleBoothClick(booth)} + style={{ + ...getBoothStyle(booth.status), + border: '1px solid', + borderRadius: 4, + padding: '8px 4px', + textAlign: 'center', + cursor: 'pointer', + minHeight: 60, + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + }} + > +
{booth.boothNumber}
+ {booth.companyName ? ( +
+ {booth.companyName} +
+ ) : ( +
{statusMap[booth.status].text}
+ )} +
+ ))} +
+
+ ))} +
+ + + + + {selectedBooth ? ( +
+

展位号:{selectedBooth.boothNumber}

+

状态:{statusMap[selectedBooth.status].text}

+

区域:{selectedBooth.area}区 {selectedBooth.row}排 {selectedBooth.col}列

+

企业名称:{selectedBooth.companyName || '--'}

+ + + + +
+ ) : ( +
+ 点击左侧展位查看详情 +
+ )} +
+ + +

场地名称:{venue.venueName}

+

就业机构:{venue.employmentAgency}

+

场地类型:{venue.venueType}

+

场地地址:{venue.venueAddress}

+

联系人:{venue.contactPerson}

+

联系电话:{venue.contactPhone}

+
+ + + + ); +}; + +export default VenueLayoutModal; diff --git a/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueTab.tsx b/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueTab.tsx index d4925fa..74e3cd3 100644 --- a/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueTab.tsx +++ b/src/pages/Jobfair/Indoorjobfair/Detail/components/VenueTab.tsx @@ -10,6 +10,7 @@ import { deleteVenue, } from '@/services/jobportal/indoorJobFair'; import type { VenueItem, VenueForm } from '@/services/jobportal/indoorJobFair'; +import VenueLayoutModal from './VenueLayoutModal'; interface Props { fairId: number; @@ -20,6 +21,8 @@ const VenueTab: React.FC = () => { const actionRef = useRef(); const [modalOpen, setModalOpen] = useState(false); const [editingVenue, setEditingVenue] = useState(null); + const [layoutModalOpen, setLayoutModalOpen] = useState(false); + const [layoutVenue, setLayoutVenue] = useState(null); const statusMap: Record = { active: { text: '启用', color: 'green' }, @@ -54,7 +57,7 @@ const VenueTab: React.FC = () => { onClick={() => { setEditingVenue(record); setModalOpen(true); }} >编辑, , , + >扫码入场, , ]} /> - {/* 模拟扫码入场弹窗 */} + {/* 扫码入场弹窗 */} setScanModalOpen(false) }} diff --git a/src/pages/Jobfair/Outdoorfair/Detail/components/BoothTab.tsx b/src/pages/Jobfair/Outdoorfair/Detail/components/BoothTab.tsx index fbd7710..8fddc36 100644 --- a/src/pages/Jobfair/Outdoorfair/Detail/components/BoothTab.tsx +++ b/src/pages/Jobfair/Outdoorfair/Detail/components/BoothTab.tsx @@ -32,8 +32,27 @@ const BoothTab: React.FC = ({ fairId }) => { const [assigningBooth, setAssigningBooth] = useState(null); const columns: ProColumns[] = [ - { title: '展位号', dataIndex: 'boothNumber', width: 100 }, - { title: '企业名称', dataIndex: 'companyName', ellipsis: true, render: (_, r) => r.companyName || '--' }, + { + title: '展位号', + dataIndex: 'boothNumber', + width: 100, + hideInTable: true, + fieldProps: { placeholder: '请输入展位号' }, + }, + { + title: '审核状态', + dataIndex: 'reviewStatus', + width: 100, + hideInTable: true, + valueType: 'select', + options: [ + { label: '待审核', value: 'pending' }, + { label: '已通过', value: 'approved' }, + { label: '已拒绝', value: 'rejected' }, + ], + }, + { title: '展位号', dataIndex: 'boothNumber', width: 100, hideInSearch: true }, + { title: '企业名称', dataIndex: 'companyName', ellipsis: true, hideInSearch: true, render: (_, r) => r.companyName || '--' }, { title: '岗位数', dataIndex: 'jobCount', width: 80, hideInSearch: true }, { title: '审核状态', dataIndex: 'reviewStatus', width: 100, render: (_, r) => { @@ -65,7 +84,7 @@ const BoothTab: React.FC = ({ fairId }) => { disabled: !record.companyName, onClick: () => { if (!record.companyName) { message.warning('该展位尚未分配企业'); return; } - message.success(`已向「${record.companyName}」发送展位信息通知(模拟)`); + message.success(`已向「${record.companyName}」发送展位信息通知`); }, }, { type: 'divider' as const }, diff --git a/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyAddModal.tsx b/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyAddModal.tsx index 8c4bc7f..5221675 100644 --- a/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyAddModal.tsx +++ b/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyAddModal.tsx @@ -10,7 +10,7 @@ interface Props { onSuccess: () => void; } -/** 模拟可添加的企业列表 */ +/** 可添加的企业列表 */ const MOCK_AVAILABLE_COMPANIES = [ { companyId: 1013, companyName: '石河子市天富集团', industry: '能源', scale: '1000人以上', contactPerson: '黄经理', contactPhone: '13309930001' }, { companyId: 1014, companyName: '新疆兵团勘察设计院', industry: '建筑/工程', scale: '200-500人', contactPerson: '曹院长', contactPhone: '13309930002' }, diff --git a/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyReviewTab.tsx b/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyReviewTab.tsx index 574f470..eba4a8d 100644 --- a/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyReviewTab.tsx +++ b/src/pages/Jobfair/Outdoorfair/Detail/components/CompanyReviewTab.tsx @@ -48,8 +48,8 @@ const CompanyReviewTab: React.FC = ({ fairId }) => { const handleQrCheckIn = async (id: number) => { Modal.confirm({ - title: '模拟扫码签到', - content: '确认该单位已完成现场扫码签到吗?(模拟操作)', + title: '扫码签到', + content: '确认该单位已完成现场扫码签到吗?', onOk: async () => { const res = await qrCheckIn(id); if (res.code === 200) { message.success(res.msg); actionRef.current?.reload(); } @@ -58,22 +58,40 @@ const CompanyReviewTab: React.FC = ({ fairId }) => { }; const handleNotify = (companyName: string, method: string) => { - message.success(`已通过${method}向「${companyName}」发送审核结果通知(模拟)`); + message.success(`已通过${method}向「${companyName}」发送审核结果通知`); }; const columns: ProColumns[] = [ - { title: '企业名称', dataIndex: 'companyName', ellipsis: true }, + { + title: '企业名称', + dataIndex: 'companyName', + ellipsis: true, + hideInTable: true, + fieldProps: { placeholder: '请输入企业名称' }, + }, + { + title: '审核状态', + dataIndex: 'reviewStatus', + hideInTable: true, + valueType: 'select', + options: [ + { label: '待审核', value: 'pending' }, + { label: '已通过', value: 'approved' }, + { label: '已拒绝', value: 'rejected' }, + ], + }, + { title: '企业名称', dataIndex: 'companyName', ellipsis: true, hideInSearch: true }, { title: '行业', dataIndex: 'industry', width: 80, hideInSearch: true, render: (_, r) => {r.industry} }, { title: '规模', dataIndex: 'scale', width: 100, hideInSearch: true }, { title: '联系人', dataIndex: 'contactPerson', width: 100, hideInSearch: true }, { title: '联系电话', dataIndex: 'contactPhone', width: 130, hideInSearch: true }, - { title: '审核状态', dataIndex: 'reviewStatus', width: 100, + { title: '审核状态', dataIndex: 'reviewStatus', width: 100, hideInSearch: true, render: (_, r) => { const s = reviewStatusMap[r.reviewStatus] || { text: r.reviewStatus, color: 'default' }; return {s.text}; }, }, - { title: '签到状态', dataIndex: 'qrCheckInStatus', width: 100, + { title: '签到状态', dataIndex: 'qrCheckInStatus', width: 100, hideInSearch: true, render: (_, r) => {r.qrCheckInStatus === 'checked_in' ? '已签到' : '未签到'} , diff --git a/src/pages/Jobfair/Outdoorfair/Detail/components/DeviceTab.tsx b/src/pages/Jobfair/Outdoorfair/Detail/components/DeviceTab.tsx index 7c0e473..8252dc6 100644 --- a/src/pages/Jobfair/Outdoorfair/Detail/components/DeviceTab.tsx +++ b/src/pages/Jobfair/Outdoorfair/Detail/components/DeviceTab.tsx @@ -86,7 +86,7 @@ const DeviceTab: React.FC = ({ fairId }) => { key: 'qrcode', icon: , label: '重新生成二维码', - onClick: () => message.success(`已为「${record.deviceName}」重新生成二维码(模拟)`), + onClick: () => message.success(`已为「${record.deviceName}」重新生成二维码`), }] : []), { key: 'edit', @@ -173,8 +173,8 @@ const DeviceTab: React.FC = ({ fairId }) => { - {/* 模拟闸机 */} - + {/* 闸机管理 */} + {gateStatuses.map((gate: any) => ( @@ -190,7 +190,7 @@ const DeviceTab: React.FC = ({ fairId }) => { + >扫码 @@ -265,9 +265,9 @@ const DeviceTab: React.FC = ({ fairId }) => { /> - {/* 模拟闸机扫码 */} + {/* 闸机扫码 */} setScanModalOpen(false) }} diff --git a/src/services/jobportal/indoorJobFair.ts b/src/services/jobportal/indoorJobFair.ts index 80d13d0..d089242 100644 --- a/src/services/jobportal/indoorJobFair.ts +++ b/src/services/jobportal/indoorJobFair.ts @@ -4,7 +4,7 @@ import type { API as IndoorJobFairAPI } from '@/types/jobfair/indoorJobFair'; -// ==================== 模拟数据 ==================== +// ==================== 假数据 ==================== // 模块1: 场地信息 const MOCK_VENUES: API.IndoorJobFair.VenueItem[] = [ diff --git a/src/services/jobportal/outdoorFair.ts b/src/services/jobportal/outdoorFair.ts index 9442666..efc6f5d 100644 --- a/src/services/jobportal/outdoorFair.ts +++ b/src/services/jobportal/outdoorFair.ts @@ -205,7 +205,7 @@ const MOCK_DATA: OutdoorFairItem[] = [ }, ]; -// 模拟自增 ID +// 自增 ID let nextId = MOCK_DATA.length + 1; // ==================== API 接口(使用假数据) ==================== diff --git a/src/services/jobportal/outdoorFairDetail.ts b/src/services/jobportal/outdoorFairDetail.ts index 480a9fc..a7690a6 100644 --- a/src/services/jobportal/outdoorFairDetail.ts +++ b/src/services/jobportal/outdoorFairDetail.ts @@ -344,7 +344,7 @@ export async function reviewRegisteredJob(regId: number, jobId: number, status: return { code: 200, msg: status === 'approved' ? '岗位审核通过' : '岗位审核拒绝' }; } -/** 模拟扫码签到 */ +/** 扫码签到 */ export async function qrCheckIn(regId: number) { const reg = MOCK_REGISTRATIONS.find(r => r.id === regId); if (!reg) return { code: 404, msg: '未找到' }; @@ -366,7 +366,7 @@ export async function getAttendeeList(fairId: number, params?: { current?: numbe return { code: 200, total, rows }; } -/** 模拟扫码入场 */ +/** 扫码入场 */ export async function scanAttendeeEntry(data: { name: string; phone: string; idCard: string; checkInMethod: string }) { const attendee: AttendeeItem = { id: nextAttendeeId++, @@ -486,7 +486,7 @@ export async function getGateEntryLogs(fairId: number, params?: { current?: numb return { code: 200, total, rows }; } -/** 模拟闸机扫码 */ +/** 闸机扫码 */ export async function simulateGateScan(data: { fairId: number; gateName: string; attendeeName: string; scanMethod: string }) { const gate = MOCK_GATE_STATUSES.find(g => g.fairId === data.fairId && g.gateName === data.gateName); if (!gate) return { code: 404, msg: '闸机未找到' };