import { ModalForm, ProForm, ProFormDigit, ProFormSelect, ProFormText, ProFormTextArea, ProDescriptions, } from '@ant-design/pro-components'; import { Form, Button, Input } from 'antd'; import { PlusOutlined, MinusCircleOutlined } from '@ant-design/icons'; import React, { useEffect, useRef, useState } from 'react'; import { DictValueEnumObj } from '@/components/DictTag'; import { getCmsCompanyList } from '@/services/company/list'; import { getCmsJobDetail } from '@/services/Management/list'; export type ListFormProps = { onCancel: (flag?: boolean, formVals?: unknown) => void; onSubmit: (values: API.ManagementList.Manage) => Promise; open: boolean; values?: Partial; educationEnum: DictValueEnumObj; experienceEnum: DictValueEnumObj; areaEnum: DictValueEnumObj; jobTypeEnum: DictValueEnumObj; mode?: 'view' | 'edit' | 'create'; }; const waitTime = (time: number = 100) => { return new Promise((resolve) => { setTimeout(() => { resolve(true); }, time); }); }; const listEdit: React.FC = (props) => { const [form] = Form.useForm(); const companyNameMap = useRef>({}); const [jobDetail, setJobDetail] = useState(null); const [loading, setLoading] = useState(false); const { educationEnum, experienceEnum, areaEnum, jobTypeEnum } = props; const { mode = props.values ? 'edit' : 'create' } = props; useEffect(() => { if(props.open){ form.resetFields(); if (props.values) { form.setFieldsValue({ ...props.values, jobLocationAreaCode: String(props.values.jobLocationAreaCode || ''), }); } } }, [form, props.values?.jobId,props.open]); // 在查看模式和编辑模式下调用API获取详情 useEffect(() => { if (props.open && (mode === 'view' || mode === 'edit') && props.values?.jobId) { fetchJobDetail(); } }, [props.open, mode, props.values?.jobId]); const fetchJobDetail = async () => { if (!props.values?.jobId) return; setLoading(true); try { const response = await getCmsJobDetail(props.values.jobId.toString()); if (response.code === 200) { setJobDetail(response.data); // 如果是编辑模式,将获取到的详情数据设置到表单中 if (mode === 'edit') { form.setFieldsValue({ ...response.data, jobLocationAreaCode: String(response.data.jobLocationAreaCode || ''), }); } } } catch (error) { console.error('获取岗位详情失败:', error); } finally { setLoading(false); } }; const handleCancel = () => { props.onCancel(); form.resetFields(); }; const handleFinish = async (values: Record) => { const payload: API.ManagementList.Manage = { jobTitle: values.jobTitle, companyId: values.companyId, companyName: typeof values.companyName === 'string' ? values.companyName : companyNameMap.current[values.companyId] ?? '', minSalary: values.minSalary, maxSalary: values.maxSalary, education: values.education, experience: values.experience, jobLocationAreaCode: values.jobLocationAreaCode, vacancies: values.vacancies, jobType: values.jobType, jobLocation: values.jobLocation, description: values.description, jobContactList: (values.jobContactList ?? []).map((item: API.ManagementList.ContactPerson) => ({ contactPerson: item.contactPerson, contactPersonPhone: item.contactPersonPhone, position: item.position, })), }; if (mode === 'edit' && values.jobId) { payload.jobId = values.jobId; } await props.onSubmit(payload); return true; }; if (mode === 'view') { return ( handleCancel(), footer: null, }} submitter={false} > column={2} dataSource={jobDetail || props.values || {}} loading={loading} > { const company = record?.company; if (!company) { return 暂无公司信息; } return (
公司名称: {company.name}
公司地址: {company.location}
公司规模: {company.scale}
公司性质: {company.nature}
{company.description && (
公司描述: {company.description}
)}
); }} /> { const contactList = record?.jobContactList || []; if (!contactList || contactList.length === 0) { return 暂无联系人信息; } return (
{contactList.map((contact: any, index: number) => ( ))}
联系人姓名 职务 联系电话
{contact.contactPerson} {contact.position} {contact.contactPersonPhone}
); }} />
); } return ( title={mode === 'edit' ? '编辑岗位' : '新建岗位'} form={form} autoFocusFirstInput open={props.open} width={900} grid={true} rowProps={{ gutter: [16, 16] }} colProps={{ span: 12 }} modalProps={{ destroyOnClose: true, onCancel: () => handleCancel(), style: { height: '80vh' }, styles: { body: { height: 'calc(80vh - 120px)', overflowY: 'auto', padding: '16px 24px', }, }, }} submitTimeout={2000} onFinish={handleFinish} >