招聘会三个模块开发
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled

This commit is contained in:
francis-fh
2026-06-24 09:06:09 +08:00
parent e7616b0c8e
commit 3b1877f302
23 changed files with 939 additions and 98 deletions

View File

@@ -36,17 +36,45 @@ const AttendeeTab: React.FC<Props> = ({ fairId }) => {
const [interviewModalOpen, setInterviewModalOpen] = useState(false);
const columns: ProColumns<any>[] = [
{ title: '姓名', dataIndex: 'name', width: 100 },
{
title: '姓名',
dataIndex: 'name',
width: 100,
hideInTable: true,
fieldProps: { placeholder: '请输入姓名' },
},
{
title: '手机号',
dataIndex: 'phone',
width: 130,
hideInTable: true,
fieldProps: { placeholder: '请输入手机号' },
},
{
title: '面试状态',
dataIndex: 'interviewStatus',
hideInTable: true,
valueType: 'select',
options: [
{ label: '未面试', value: 'none' },
{ label: '已预约', value: 'scheduled' },
{ label: '面试中', value: 'in_progress' },
{ label: '已完成', value: 'completed' },
{ label: '已通过', value: 'passed' },
{ label: '未通过', value: 'failed' },
],
},
{ title: '姓名', dataIndex: 'name', width: 100, hideInSearch: true },
{ title: '性别', dataIndex: 'gender', width: 60, hideInSearch: true },
{ title: '手机号', dataIndex: 'phone', width: 130 },
{ title: '手机号', dataIndex: 'phone', width: 130, hideInSearch: true },
{ title: '身份证号', dataIndex: 'idCard', width: 180, hideInSearch: true },
{ title: '学历', dataIndex: 'education', width: 80, hideInSearch: true },
{ title: '毕业院校', dataIndex: 'graduationSchool', width: 150, hideInSearch: true, ellipsis: true },
{ title: '入场时间', dataIndex: 'checkInTime', valueType: 'dateTime', width: 170, render: (_, r) => r.checkInTime || '未入场' },
{ title: '入场时间', dataIndex: 'checkInTime', valueType: 'dateTime', width: 170, hideInSearch: true, render: (_, r) => r.checkInTime || '未入场' },
{ title: '入场方式', dataIndex: 'checkInMethod', width: 100, hideInSearch: true,
render: (_, r) => checkInMethodMap[r.checkInMethod] || r.checkInMethod },
{ title: '意向企业', dataIndex: 'targetCompanies', width: 180, ellipsis: true, hideInSearch: true },
{ title: '面试状态', dataIndex: 'interviewStatus', width: 100,
{ title: '面试状态', dataIndex: 'interviewStatus', width: 100, hideInSearch: true,
render: (_, r) => {
const s = interviewStatusMap[r.interviewStatus] || { text: r.interviewStatus, color: 'default' };
return <Tag color={s.color}>{s.text}</Tag>;
@@ -97,14 +125,14 @@ const AttendeeTab: React.FC<Props> = ({ fairId }) => {
toolBarRender={() => [
<Button key="simulate" type="primary" icon={<ScanOutlined />}
onClick={() => setScanModalOpen(true)}
></Button>,
></Button>,
<Button key="export" icon={<ExportOutlined />}></Button>,
]}
/>
{/* 模拟扫码入场弹窗 */}
{/* 扫码入场弹窗 */}
<ModalForm
title="模拟扫码入场"
title="扫码入场"
open={scanModalOpen}
width={450}
modalProps={{ destroyOnClose: true, onCancel: () => setScanModalOpen(false) }}

View File

@@ -32,8 +32,27 @@ const BoothTab: React.FC<Props> = ({ fairId }) => {
const [assigningBooth, setAssigningBooth] = useState<any>(null);
const columns: ProColumns<any>[] = [
{ 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<Props> = ({ fairId }) => {
disabled: !record.companyName,
onClick: () => {
if (!record.companyName) { message.warning('该展位尚未分配企业'); return; }
message.success(`已向「${record.companyName}」发送展位信息通知(模拟)`);
message.success(`已向「${record.companyName}」发送展位信息通知`);
},
},
{ type: 'divider' as const },

View File

@@ -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' },

View File

@@ -48,8 +48,8 @@ const CompanyReviewTab: React.FC<Props> = ({ 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<Props> = ({ fairId }) => {
};
const handleNotify = (companyName: string, method: string) => {
message.success(`已通过${method}向「${companyName}」发送审核结果通知(模拟)`);
message.success(`已通过${method}向「${companyName}」发送审核结果通知`);
};
const columns: ProColumns<any>[] = [
{ 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) => <Tag>{r.industry}</Tag> },
{ 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 <Tag color={s.color}>{s.text}</Tag>;
},
},
{ title: '签到状态', dataIndex: 'qrCheckInStatus', width: 100,
{ title: '签到状态', dataIndex: 'qrCheckInStatus', width: 100, hideInSearch: true,
render: (_, r) => <Tag color={r.qrCheckInStatus === 'checked_in' ? 'green' : 'default'}>
{r.qrCheckInStatus === 'checked_in' ? '已签到' : '未签到'}
</Tag>,

View File

@@ -86,7 +86,7 @@ const DeviceTab: React.FC<Props> = ({ fairId }) => {
key: 'qrcode',
icon: <QrcodeOutlined />,
label: '重新生成二维码',
onClick: () => message.success(`已为「${record.deviceName}」重新生成二维码(模拟)`),
onClick: () => message.success(`已为「${record.deviceName}」重新生成二维码`),
}] : []),
{
key: 'edit',
@@ -173,8 +173,8 @@ const DeviceTab: React.FC<Props> = ({ fairId }) => {
</Col>
</Row>
{/* 模拟闸机 */}
<Card title="模拟闸机" style={{ marginBottom: 16 }}>
{/* 闸机管理 */}
<Card title="闸机管理" style={{ marginBottom: 16 }}>
<Row gutter={16} style={{ marginBottom: 16 }}>
{gateStatuses.map((gate: any) => (
<Col span={12} key={gate.id}>
@@ -190,7 +190,7 @@ const DeviceTab: React.FC<Props> = ({ fairId }) => {
<Button type="primary" size="small" icon={<ScanOutlined />}
disabled={!gate.isOpen}
onClick={() => { setScanGate(gate); setScanModalOpen(true); }}
></Button>
></Button>
</Space>
</Card>
</Col>
@@ -265,9 +265,9 @@ const DeviceTab: React.FC<Props> = ({ fairId }) => {
/>
</ModalForm>
{/* 模拟闸机扫码 */}
{/* 闸机扫码 */}
<ModalForm
title={`模拟闸机扫码 — ${scanGate?.gateName || ''}`}
title={`闸机扫码 — ${scanGate?.gateName || ''}`}
open={scanModalOpen}
width={400}
modalProps={{ destroyOnClose: true, onCancel: () => setScanModalOpen(false) }}