+ {/* 基本信息卡片 */}
+
}
+ hidden={!access.hasPerms('cms:outdoorFair:edit')}
+ onClick={() => setEditModalOpen(true)}
+ >
+ 编辑信息
+
+ }
+ style={{ marginBottom: 16 }}
+ >
+
+ {fairInfo.title}
+ {fairInfo.hostUnit}
+
+ {fairInfo.fairType}
+
+ {fairInfo.region}
+ {fairInfo.address}
+ {fairInfo.boothCount}
+ {fairInfo.holdTime}
+ {fairInfo.endTime}
+ {fairInfo.applyStartTime}
+ {fairInfo.applyEndTime}
+ {fairInfo.onlineApply ? '是' : '否'}
+
+
+
+ {/* 参会企业及岗位 */}
+
}
+ onClick={() => setCompanyModalOpen(true)}
+ >
+ 添加企业
+
+ }
+ >
+
{
+ const res = await getParticipatingCompanies(fairId, {
+ current: params.current,
+ pageSize: params.pageSize,
+ companyName: params.companyName,
+ });
+ return { data: res.rows, total: res.total, success: true };
+ }}
+ expandable={{
+ expandedRowRender: (record) => (
+
+ {record.jobList.length === 0 ? (
+
暂无岗位
+ ) : (
+
(
+ { setEditingJob(job); setSelectedCompany(record); setJobModalOpen(true); }}
+ >
+ 编辑
+ ,
+ ,
+ ]}
+ >
+
+ 薪资 {job.minSalary}-{job.maxSalary}K
+ {job.education}
+ {job.experience}
+ 招聘 {job.vacancies} 人
+
+ {job.status === 'active' ? '在招' : '已关闭'}
+
+
+ }
+ />
+
+ )}
+ />
+ )}
+
+ ),
+ }}
+ columns={[
+ { title: '企业名称', dataIndex: 'companyName', ellipsis: true },
+ { title: '行业', dataIndex: 'industry', width: 100, hideInSearch: true,
+ render: (_, r: any) => {r.industry} },
+ { title: '规模', dataIndex: 'scale', width: 110, hideInSearch: true },
+ { title: '联系人', dataIndex: 'contactPerson', width: 100, hideInSearch: true },
+ { title: '联系电话', dataIndex: 'contactPhone', width: 130, hideInSearch: true },
+ { title: '展位号', dataIndex: 'boothNumber', width: 80, hideInSearch: true,
+ render: (_, r: any) => r.boothNumber || '--' },
+ { title: '岗位数', width: 80, hideInSearch: true,
+ render: (_, r: any) => r.jobList?.length || 0 },
+ {
+ title: '操作', valueType: 'option', width: 200,
+ render: (_, record: any) => [
+ ,
+ ,
+ ],
+ },
+ ]}
+ />
+
+
+ {/* 编辑招聘会基本信息弹窗 */}
+ setEditModalOpen(false)}
+ onSubmit={async (values) => {
+ const res = await updateOutdoorFair(values as any);
+ if (res.code === 200) {
+ message.success('修改成功');
+ setEditModalOpen(false);
+ onFairUpdate();
+ } else {
+ message.error(res.msg || '操作失败');
+ }
+ }}
+ />
+
+ {/* 添加企业弹窗 */}
+ setCompanyModalOpen(false)}
+ onSuccess={() => { setCompanyModalOpen(false); actionRef.current?.reload(); }}
+ />
+
+ {/* 添加/编辑岗位弹窗 */}
+ { setJobModalOpen(false); setEditingJob(null); setSelectedCompany(null); }}
+ onSuccess={() => { setJobModalOpen(false); setEditingJob(null); actionRef.current?.reload(); }}
+ />
+
+ );
+};
+
+export default FairInfoTab;
diff --git a/src/pages/Jobfair/Outdoorfair/Detail/components/JobEditModal.tsx b/src/pages/Jobfair/Outdoorfair/Detail/components/JobEditModal.tsx
new file mode 100644
index 0000000..ad8aecc
--- /dev/null
+++ b/src/pages/Jobfair/Outdoorfair/Detail/components/JobEditModal.tsx
@@ -0,0 +1,65 @@
+import React, { useEffect } from 'react';
+import { ModalForm, ProForm, ProFormText, ProFormDigit, ProFormSelect } from '@ant-design/pro-components';
+import { Form } from 'antd';
+import { addJobForCompany, updateJobForCompany } from '@/services/jobportal/outdoorFairDetail';
+
+interface Props {
+ open: boolean;
+ fairId: number;
+ company: any;
+ job: any;
+ onCancel: () => void;
+ onSuccess: () => void;
+}
+
+const JobEditModal: React.FC