/** * 供应商注册表单通用部分 * 封装了国内企业和境外企业注册表单相同的部分 */ import React, { useEffect, useState } from 'react'; import { Form, Input, Button, Select, DatePicker, Row, Col, Table, Radio, Cascader, Empty, } from 'antd'; import { PlusOutlined, DeleteOutlined } from '@ant-design/icons'; import { message } from 'antd'; import { useIntl } from 'umi'; import FileUpload from '@/components/FileUpload'; import type { DictItem } from '@/servers/api/dict'; import { getDictList } from '@/servers/api/dict'; const { Option } = Select; // 中国省市区级联数据 export const addressOptions = [ { value: '330000', label: '浙江省', children: [ { value: '330100', label: '杭州市', children: [ { value: '330102', label: '上城区' }, { value: '330103', label: '下城区' }, { value: '330104', label: '江干区' }, { value: '330105', label: '拱墅区' }, { value: '330106', label: '西湖区' }, { value: '330108', label: '滨江区' }, ], }, ], }, { value: '310000', label: '上海市', children: [ { value: '310100', label: '上海市', children: [ { value: '310101', label: '黄浦区' }, { value: '310104', label: '徐汇区' }, { value: '310105', label: '长宁区' }, ], }, ], }, ]; interface CommonFormSectionsProps { form: any; } // 扩展问卷部分的属性接口 interface SurveySectionProps extends CommonFormSectionsProps { surveyQuestions?: API.SurveyQuestionResponse; } /** * 资质信息表单部分 * 包含资质证书类型、名称、编号、等级、发证机构、发证日期、有效期等 */ export const QualificationSection: React.FC = ({ form }) => { const intl = useIntl(); // 资质证书类型 const [certTypeList, setCertTypeList] = useState([]); const getDict = async () => { // qualification_type 资质证书类型 const certTypeResponse = await getDictList('certificate'); setCertTypeList(certTypeResponse.data || []); }; useEffect(() => { getDict(); }, []); return ( <>
{intl.formatMessage({ id: 'register.form.section.qualification' })}
{(fields, { add, remove }) => ( <> ({ ...field, key: field.key, fieldKey: field.name, }))} pagination={false} bordered size="middle" rowKey="key" columns={[ { title: intl.formatMessage({ id: 'register.form.table.no' }), dataIndex: 'name', width: 60, render: (_, __, index) => index + 1, }, { title: intl.formatMessage({ id: 'register.qualification.certType' }), dataIndex: 'certType', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.qualification.certName' }), dataIndex: 'certName', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.qualification.certNumber' }), dataIndex: 'certNumber', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.qualification.certLevel' }), dataIndex: 'certLevel', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.qualification.issuingAuthority' }), dataIndex: 'issuingAuthority', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.qualification.issueDate' }), dataIndex: 'issueDate', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.qualification.expiryDate' }), dataIndex: 'expiryDate', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.form.attachment' }), dataIndex: 'certFile', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.form.operation' }), width: 70, render: (_, record) => ( ), }, ]} /> )} ); }; /** * 开票信息表单部分 * 包含纳税人类型、开票抬头、纳税人识别号、开票地址等 */ export const InvoiceSection: React.FC = ({ form }) => { const intl = useIntl(); // 纳税人类型 const [taxpayerTypeList, setTaxpayerTypeList] = useState([]); const getDict = async () => { // taxpayer_type 纳税人类型 const taxpayerTypeResponse = await getDictList('taxpayer_type'); setTaxpayerTypeList(taxpayerTypeResponse.data || []); }; useEffect(() => { getDict(); }, []); return ( <>
{intl.formatMessage({ id: 'register.form.section.invoice' })}
); }; /** * 银行账户表单部分 * 包含开户银行、账户名称、账号、所在地区等 */ export const BankAccountSection: React.FC = ({ form }) => { const intl = useIntl(); return ( <>
{intl.formatMessage({ id: 'register.form.section.bankAccount' })}
{(fields, { add, remove }) => ( <>
({ ...field, key: field.key, fieldKey: field.name, }))} pagination={false} bordered size="middle" rowKey="key" columns={[ { title: intl.formatMessage({ id: 'register.form.table.no' }), dataIndex: 'name', width: 60, render: (_, __, index) => index + 1, }, { title: intl.formatMessage({ id: 'register.bank.bankName' }), dataIndex: 'bankName', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.bank.accountName' }), dataIndex: 'accountName', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.bank.accountNumber' }), dataIndex: 'accountNumber', render: (_, record) => ( ), }, { title: intl.formatMessage({ id: 'register.bank.location' }), dataIndex: 'location', render: (_, record) => ( { return path.some((option) => { if (typeof option.label === 'string') { return ( option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1 ); } return false; }); }, }} /> ), }, { title: intl.formatMessage({ id: 'register.form.operation' }), width: 70, render: (_, record) => ( ), }, ]} /> )} ); }; /** * 社会准则符合性自查问卷部分 * 包含填写人信息和问卷内容 */ export const SurveySection: React.FC = ({ form, surveyQuestions }) => { const intl = useIntl(); // 使用API获取的问卷数据,如果没有则显示无数据状态 const hasQuestions = surveyQuestions && Array.isArray(surveyQuestions) && surveyQuestions.length > 0; // 调试日志 console.log('调查问卷数据:', surveyQuestions); return ( <>
{intl.formatMessage({ id: 'register.form.section.survey' })}
{intl.formatMessage({ id: 'register.survey.fillerInfo' })}:
{intl.formatMessage({ id: 'register.survey.questionnaire' })}:
{hasQuestions ? ( ({ surveyQuestionId: q.id, replyValue: '', }))} > {(fields, { add, remove }) => { console.log('Form.List fields:', fields); return (
`survey_question_${index}`} dataSource={surveyQuestions} columns={[ { title: intl.formatMessage({ id: 'register.form.table.no' }), dataIndex: 'id', width: 60, align: 'center', render: (text, record, index) => index + 1, }, { title: intl.formatMessage({ id: 'register.survey.question' }), dataIndex: 'questionName', render: (text) =>
{text}
, }, { title: intl.formatMessage({ id: 'register.survey.reply' }), width: 650, render: (_, record, index) => { return ( <> {record.coscoSurveyQuestionOptionList && record.coscoSurveyQuestionOptionList.length > 0 ? ( {record.coscoSurveyQuestionOptionList.map((option: any) => ( {option.optionName} ))} ) : ( )} ); }, }, ]} /> ); }} ) : (
)} ); }; /** * 供应商反商业贿赂承诺书和其他附件部分 */ export const AttachmentSection: React.FC = ({ form }) => { const intl = useIntl(); return ( <>
{intl.formatMessage({ id: 'register.form.section.commitment' })}
{intl.formatMessage({ id: 'register.attachment.stampUpload' })}
{(fields, { add, remove }) => { // 确保至少有一项用于反商业贿赂承诺书 if (fields.length === 0) { add({ attachmentsType: 'commitment' }); } return (
{fields.map((field, index) => (
{ if (fileList && fileList.length > 0) { const file = fileList[0]; if (file.status === 'done' && file.response) { const response = file.response; if (response && response.success) { // 填充文件信息 form.setFieldsValue({ coscoSupplierSurveyAttachments: [ { ...form.getFieldValue([ 'coscoSupplierSurveyAttachments', field.name, ]), fileName: file.name, fileType: file.type, fileSize: file.size?.toString(), filePath: response.filePath || response.url, }, ], }); message.success(`${file.name} 上传成功`); } } } }} />
))}
); }}
{intl.formatMessage({ id: 'register.form.section.otherAttachments' })}
{(fields, { add, remove }) => ( <>
{intl.formatMessage({ id: 'register.attachment.otherAttachments.hint' })}
{fields.map((field, index) => (
0 || fields.length === 1 ? 'block' : 'none', marginBottom: 8, }} > {index > 0 && ( )} {index > 0 && ( { if (fileList && fileList.length > 0) { const file = fileList[0]; if (file.status === 'done' && file.response) { const response = file.response; if (response && response.success) { // 填充文件信息 const fieldValue = form.getFieldValue([ 'coscoSupplierSurveyAttachments', field.name, ]); form.setFieldsValue({ coscoSupplierSurveyAttachments: [ { ...fieldValue, fileName: file.name, fileType: file.type, fileSize: file.size?.toString(), filePath: response.filePath || response.url, }, ], }); message.success(`${file.name} 上传成功`); } } } }} /> )}
))} )}
); };