import React, { useRef, useState } from 'react'; import { useAccess } from '@umijs/max'; import { Button, message, Modal, Tag, Drawer, Space } from 'antd'; import { ActionType, ProColumns, ProTable, ModalForm, ProFormText, ProFormSelect, ProFormDateTimePicker, ProFormTextArea } from '@ant-design/pro-components'; import { ScanOutlined, EditOutlined, ScheduleOutlined, ExportOutlined } from '@ant-design/icons'; import { getAttendeeList, scanAttendeeEntry, updateAttendeeResume, trackInterview, } from '@/services/jobportal/outdoorFairDetail'; interface Props { fairId: number; } const checkInMethodMap: Record = { qr_scan: '扫码入场', id_card: '刷身份证', manual: '手动登记', }; const interviewStatusMap: Record = { none: { text: '未面试', color: 'default' }, scheduled: { text: '已预约', color: 'blue' }, in_progress: { text: '面试中', color: 'processing' }, completed: { text: '已完成', color: 'green' }, passed: { text: '已通过', color: 'green' }, failed: { text: '未通过', color: 'red' }, }; const AttendeeTab: React.FC = ({ fairId }) => { const access = useAccess(); const actionRef = useRef(); const [scanModalOpen, setScanModalOpen] = useState(false); const [resumeDrawerOpen, setResumeDrawerOpen] = useState(false); const [currentAttendee, setCurrentAttendee] = useState(null); const [interviewModalOpen, setInterviewModalOpen] = useState(false); const columns: ProColumns[] = [ { title: '姓名', dataIndex: 'name', width: 100 }, { title: '性别', dataIndex: 'gender', width: 60, hideInSearch: true }, { title: '手机号', dataIndex: 'phone', width: 130 }, { 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: '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, render: (_, r) => { const s = interviewStatusMap[r.interviewStatus] || { text: r.interviewStatus, color: 'default' }; return {s.text}; }, }, { title: '操作', valueType: 'option', width: 220, render: (_, record) => [ , , , ], }, ]; return (
{ const res = await getAttendeeList(fairId, { current: params.current, pageSize: params.pageSize, name: params.name, phone: params.phone, interviewStatus: params.interviewStatus, }); return { data: res.rows, total: res.total, success: true }; }} toolBarRender={() => [ , , ]} /> {/* 模拟扫码入场弹窗 */} setScanModalOpen(false) }} onFinish={async (values) => { const res = await scanAttendeeEntry(values); if (res.code === 200) { message.success(res.msg); setScanModalOpen(false); actionRef.current?.reload(); return true; } message.error(res.msg); return false; }} > {/* 简历编辑抽屉 */} setResumeDrawerOpen(false)} destroyOnClose > { if (!currentAttendee) return; const res = await updateAttendeeResume(currentAttendee.id, values); if (res.code === 200) { message.success('简历更新成功'); setResumeDrawerOpen(false); actionRef.current?.reload(); return true; } message.error(res.msg); return false; }} > ({ label: v, value: v }))} /> {/* 面试跟踪弹窗 */} setInterviewModalOpen(false) }} initialValues={currentAttendee} onFinish={async (values) => { if (!currentAttendee) return; const res = await trackInterview({ attendeeId: currentAttendee.id, ...values }); if (res.code === 200) { message.success('面试信息更新成功'); setInterviewModalOpen(false); actionRef.current?.reload(); return true; } message.error(res.msg); return false; }} >
); }; export default AttendeeTab;