对接境外注册

This commit is contained in:
linxd
2025-06-30 15:24:09 +08:00
parent 662053b731
commit 73fc2bfa7b
5 changed files with 95 additions and 167 deletions

View File

@ -112,4 +112,7 @@
height: 75vh; height: 75vh;
overflow-x: hidden; overflow-x: hidden;
overflow-y: auto; overflow-y: auto;
.ant-form-item-label-fix{
padding-left: 30px !important;
}
} }

View File

@ -181,7 +181,7 @@ const SupplierRegister: React.FC = () => {
labelCol={{ span: 7 }} labelCol={{ span: 7 }}
wrapperCol={{ span: 17 }} wrapperCol={{ span: 17 }}
> >
<Form.Item label="企业类型" labelCol={{ span: 2 }} wrapperCol={{ span: 19 }}> <Form.Item label="身份类型" labelCol={{ span: 2 }} wrapperCol={{ span: 19 }}>
<Radio.Group onChange={handleSupplierTypeChange} buttonStyle="solid" value={supplierType}> <Radio.Group onChange={handleSupplierTypeChange} buttonStyle="solid" value={supplierType}>
<Radio.Button value="dvs">/</Radio.Button> <Radio.Button value="dvs">/</Radio.Button>
<Radio.Button value="ovs"></Radio.Button> <Radio.Button value="ovs"></Radio.Button>

View File

@ -104,7 +104,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'certificateType']} name={[record.name, 'certificateType']}
noStyle noStyle
rules={[{ required: true, message: '请选择资质证书类型' }]} rules={[{ required: false, message: '请选择资质证书类型' }]}
> >
<Select placeholder="请选择类型" style={{ width: '100%' }}> <Select placeholder="请选择类型" style={{ width: '100%' }}>
<Option value="机构资质"></Option> <Option value="机构资质"></Option>
@ -123,7 +123,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'name']} name={[record.name, 'name']}
noStyle noStyle
rules={[{ required: true, message: '请输入资质名称' }]} rules={[{ required: false, message: '请输入资质名称' }]}
> >
<Input placeholder="请输入资质名称" /> <Input placeholder="请输入资质名称" />
</Form.Item> </Form.Item>
@ -136,7 +136,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'code']} name={[record.name, 'code']}
noStyle noStyle
rules={[{ required: true, message: '请输入资质证书编号' }]} rules={[{ required: false, message: '请输入资质证书编号' }]}
> >
<Input placeholder="请输入证书编号" /> <Input placeholder="请输入证书编号" />
</Form.Item> </Form.Item>
@ -158,7 +158,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'authority']} name={[record.name, 'authority']}
noStyle noStyle
rules={[{ required: true, message: '请输入发证机构' }]} rules={[{ required: false, message: '请输入发证机构' }]}
> >
<Input placeholder="请输入发证机构" /> <Input placeholder="请输入发证机构" />
</Form.Item> </Form.Item>
@ -171,7 +171,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'dateTime']} name={[record.name, 'dateTime']}
noStyle noStyle
rules={[{ required: true, message: '请选择发证日期' }]} rules={[{ required: false, message: '请选择发证日期' }]}
> >
<DatePicker <DatePicker
placeholder="年/月/日" placeholder="年/月/日"
@ -188,7 +188,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'termOfValidity']} name={[record.name, 'termOfValidity']}
noStyle noStyle
rules={[{ required: true, message: '请选择资质有效期' }]} rules={[{ required: false, message: '请选择资质有效期' }]}
> >
<DatePicker <DatePicker
placeholder="年/月/日" placeholder="年/月/日"
@ -205,7 +205,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
<Form.Item <Form.Item
name={[record.name, 'accessory']} name={[record.name, 'accessory']}
noStyle noStyle
rules={[{ required: true, message: '请上传资质证书附件' }]} rules={[{ required: false, message: '请上传资质证书附件' }]}
valuePropName="value" valuePropName="value"
> >
<FileUpload <FileUpload
@ -306,7 +306,11 @@ export const InvoiceSection: React.FC<CommonFormSectionsProps> = ({ form }) => {
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierInvoice', 'qualificationCertificate']} label="一般纳税人资格证明" valuePropName="value"> <Form.Item
name={['coscoSupplierInvoice', 'qualificationCertificate']}
label="一般纳税人资格证明"
valuePropName="value"
>
<FileUpload <FileUpload
maxSize={10} maxSize={10}
allowedTypes={['pdf', 'jpg', 'jpeg', 'png']} allowedTypes={['pdf', 'jpg', 'jpeg', 'png']}
@ -450,7 +454,8 @@ export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form })
*/ */
export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuestions }) => { export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuestions }) => {
// 使用API获取的问卷数据如果没有则显示无数据状态 // 使用API获取的问卷数据如果没有则显示无数据状态
const hasQuestions = surveyQuestions && Array.isArray(surveyQuestions) && surveyQuestions.length > 0; const hasQuestions =
surveyQuestions && Array.isArray(surveyQuestions) && surveyQuestions.length > 0;
// 调试日志 // 调试日志
console.log('调查问卷数据:', surveyQuestions); console.log('调查问卷数据:', surveyQuestions);
@ -525,7 +530,13 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
</div> </div>
{hasQuestions ? ( {hasQuestions ? (
<Form.List name="coscoSupplierSurveyQuestionReply" initialValue={surveyQuestions.map((q: any, index) => ({ surveyQuestionId: q.id, replyValue: '' }))}> <Form.List
name="coscoSupplierSurveyQuestionReply"
initialValue={surveyQuestions.map((q: any, index) => ({
surveyQuestionId: q.id,
replyValue: '',
}))}
>
{(fields, { add, remove }) => { {(fields, { add, remove }) => {
console.log('Form.List fields:', fields); console.log('Form.List fields:', fields);
@ -567,13 +578,11 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
rules={[{ required: true, message: `请选择问题${index + 1}的答案` }]} rules={[{ required: true, message: `请选择问题${index + 1}的答案` }]}
wrapperCol={{ span: 24 }} wrapperCol={{ span: 24 }}
> >
{record.coscoSurveyQuestionOptionList && record.coscoSurveyQuestionOptionList.length > 0 ? ( {record.coscoSurveyQuestionOptionList &&
record.coscoSurveyQuestionOptionList.length > 0 ? (
<Radio.Group> <Radio.Group>
{record.coscoSurveyQuestionOptionList.map((option: any) => ( {record.coscoSurveyQuestionOptionList.map((option: any) => (
<Radio <Radio key={option.id} value={option.opentionValue}>
key={option.id}
value={option.opentionValue}
>
{option.optionName} {option.optionName}
</Radio> </Radio>
))} ))}
@ -584,7 +593,7 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
</Form.Item> </Form.Item>
</> </>
); );
} },
}, },
]} ]}
/> />

View File

@ -44,11 +44,25 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
{/* 营业执照附件和有效期 */} {/* 营业执照附件和有效期 */}
<Row gutter={24}> <Row gutter={24}>
<Col span={8}>
<Form.Item
name={['coscoSupplierBase', 'enterpriseType']}
label="企业类型"
rules={[{ required: true, message: '请选择企业类型' }]}
valuePropName="value"
>
<Select placeholder="请选择企业类型">
<Option value="limited"></Option>
<Option value="joint"></Option>
<Option value="individual"></Option>
<Option value="other"></Option>
</Select>
</Form.Item>
</Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'licenceAccessory']} name={['coscoSupplierBase', 'licenceAccessory']}
label="营业执照附件" label="营业执照附件"
// extra="pdf,jpg,jpeg,png类型的文件,大小不超过10MB"
rules={[{ required: true, message: '请上传营业执照附件' }]} rules={[{ required: true, message: '请上传营业执照附件' }]}
valuePropName="value" valuePropName="value"
> >
@ -100,7 +114,7 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
<Input placeholder="请输入正确的统一社会信用代码" /> <Input placeholder="请输入正确的统一社会信用代码" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24}> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'range']} name={['coscoSupplierBase', 'range']}
label="经营范围" label="经营范围"
@ -117,7 +131,7 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
/> />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24}> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
@ -128,7 +142,7 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
<Input prefix={<EnvironmentOutlined />} placeholder="上海市普陀区XX路1888号" /> <Input prefix={<EnvironmentOutlined />} placeholder="上海市普陀区XX路1888号" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24}> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'workAddress']} name={['coscoSupplierBase', 'workAddress']}
label="办公地址" label="办公地址"
@ -141,7 +155,7 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
/> />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24}> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'parentCompanyInvestor']} name={['coscoSupplierBase', 'parentCompanyInvestor']}
label="母公司/出资人" label="母公司/出资人"

View File

@ -1,11 +1,7 @@
/* 境外企业 表单项 */ /* 境外企业 表单项 */
import React from 'react'; import React from 'react';
import { Form, Input, Button, Select, Row, Col } from 'antd'; import { Form, Input, Button, Select, Row, Col } from 'antd';
import { import { MobileOutlined, MailOutlined, EnvironmentOutlined } from '@ant-design/icons';
MobileOutlined,
MailOutlined,
EnvironmentOutlined,
} from '@ant-design/icons';
/** /**
* 引入通用表单组件 * 引入通用表单组件
*/ */
@ -32,7 +28,12 @@ interface ForeignFormProps {
* 基本信息部分为境外企业特有 * 基本信息部分为境外企业特有
* 其他部分使用通用表单组件 * 其他部分使用通用表单组件
*/ */
const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCaptcha, surveyQuestions }) => { const ForeignForm: React.FC<ForeignFormProps> = ({
form,
countdown,
handleGetCaptcha,
surveyQuestions,
}) => {
return ( return (
<> <>
{/* 境外企业特有的基本信息部分 */} {/* 境外企业特有的基本信息部分 */}
@ -43,7 +44,7 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
<Form.Item <Form.Item
name={['coscoSupplierBase', 'name']} name={['coscoSupplierBase', 'name']}
label="企业名称" label="企业名称"
rules={[{ required: true, message: '请输入企业名称' }]} rules={[{ required: false, message: '请输入企业名称' }]}
> >
<Input placeholder="请输入企业名称" /> <Input placeholder="请输入企业名称" />
</Form.Item> </Form.Item>
@ -57,15 +58,6 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
<Input placeholder="请输入企业英文名称" /> <Input placeholder="请输入企业英文名称" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}>
<Form.Item
name={['coscoSupplierBase', 'socialCreditCode']}
label="公司注册号"
rules={[{ required: true, message: '请输入公司注册号' }]}
>
<Input placeholder="请输入公司注册号" />
</Form.Item>
</Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name="country" name="country"
@ -88,51 +80,32 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name="registrationPassword" name={['coscoSupplierBase', 'vat']}
label="登录密码" label="税号"
rules={[ rules={[{ required: false, message: '请输入税号' }]}
{ required: true, message: '请输入登录密码' },
{ min: 8, message: '密码长度为8-20位' },
{
pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,20}$/,
message: '需要同时包含字母、数字、大小写',
},
]}
> >
<Input.Password placeholder="长度为8-20位需要同时包含字母、数字、大小写" /> <Input placeholder="请输入税号" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name="confirmPassword" name={['coscoSupplierBase', 'workAddress']}
label="确认密码" label="办公地址"
rules={[ labelCol={{ span: 2 }}
{ required: true, message: '请再次输入密码' }, wrapperCol={{ span: 22 }}
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('registrationPassword') === value) {
return Promise.resolve();
}
return Promise.reject(new Error('两次输入的密码不一致'));
},
}),
]}
>
<Input.Password placeholder="请再次输入密码" />
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
name={['coscoSupplierBase', 'regAddress']}
label="注册地址"
rules={[{ required: true, message: '请输入注册地址' }]}
> >
<Input prefix={<EnvironmentOutlined />} placeholder="请具体注明" /> <Input prefix={<EnvironmentOutlined />} placeholder="请具体注明" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={24} className="ant-form-item-label-fix">
<Form.Item name={['coscoSupplierBase', 'workAddress']} label="办公地址"> <Form.Item
<Input prefix={<EnvironmentOutlined />} placeholder="请具体注明" /> name={['coscoSupplierBase', 'range']}
label="经营范围"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
rules={[{ required: true, message: '请输入经营范围' }]}
>
<TextArea placeholder="请输入经营范围" rows={2} maxLength={200} showCount />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
@ -144,48 +117,15 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
<Form.Item <Form.Item
name={['coscoSupplierBase', 'legalPerson']} name={['coscoSupplierBase', 'legalPerson']}
label="企业法定代表人" label="企业法定代表人"
rules={[{ required: true, message: '请输入企业法定代表人' }]} rules={[{ required: false, message: '请输入企业法定代表人' }]}
> >
<Input placeholder="请输入企业法定代表人" /> <Input placeholder="请输入企业法定代表人" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item label="注册资本" required style={{ marginBottom: 0 }}>
name={['coscoSupplierBase', 'enterpriseType']}
label="企业性质"
rules={[{ required: true, message: '请选择企业性质' }]}
>
<Select placeholder="请选择企业性质">
<Option value="corporation"></Option>
<Option value="partnership"></Option>
<Option value="joint"></Option>
<Option value="sole"></Option>
<Option value="other"></Option>
</Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
name={['coscoSupplierBase', 'supplierType']}
label="供应商类型"
rules={[{ required: true, message: '请选择供应商类型' }]}
>
<Select placeholder="请选择供应商类型">
<Option value="manufacturer"></Option>
<Option value="agent"></Option>
<Option value="service"></Option>
<Option value="other"></Option>
</Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
label="注册资本"
required
style={{ marginBottom: 0 }}
>
<Input.Group compact style={{ display: 'flex' }}> <Input.Group compact style={{ display: 'flex' }}>
<Form.Item name="capitalCurrency" noStyle initialValue="USD"> <Form.Item name="currency" noStyle initialValue="USD">
<Select style={{ width: 100, borderRadius: '2px 0 0 2px' }}> <Select style={{ width: 100, borderRadius: '2px 0 0 2px' }}>
<Option value="USD"></Option> <Option value="USD"></Option>
<Option value="EUR"></Option> <Option value="EUR"></Option>
@ -197,7 +137,7 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
<Form.Item <Form.Item
name={['coscoSupplierBase', 'capital']} name={['coscoSupplierBase', 'capital']}
noStyle noStyle
rules={[{ required: true, message: '请输入注册资本金额' }]} rules={[{ required: false, message: '请输入注册资本金额' }]}
> >
<Input <Input
type="number" type="number"
@ -208,17 +148,6 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
</Input.Group> </Input.Group>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24}>
<Form.Item
name={['coscoSupplierBase', 'range']}
label="经营范围"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
rules={[{ required: true, message: '请输入经营范围' }]}
>
<TextArea placeholder="请输入经营范围" rows={2} maxLength={200} showCount />
</Form.Item>
</Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsName']} name={['coscoSupplierBase', 'contactsName']}
@ -230,17 +159,15 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsPhone']} name={['coscoSupplierBase', 'contactsEmail']}
label="联系人手机" label="联系人邮箱"
rules={[ rules={[
{ required: true, message: '请输入联系人手机号码' }, { type: 'email', message: '请输入有效的电子邮箱' },
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码' }, { required: true, message: '请输入电子邮箱' },
]} ]}
> >
<Input <Input prefix={<MailOutlined />} placeholder="XXX@XXX.com" addonAfter={
placeholder="请输入11位手机号码"
prefix={<MobileOutlined />}
addonAfter={
<Button <Button
type="link" type="link"
size="small" size="small"
@ -249,8 +176,7 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
> >
{countdown ? `${countdown}秒后重新获取` : '获取验证码'} {countdown ? `${countdown}秒后重新获取` : '获取验证码'}
</Button> </Button>
} } />
/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
@ -261,47 +187,23 @@ const ForeignForm: React.FC<ForeignFormProps> = ({ form, countdown, handleGetCap
{ required: true, message: '请输入验证码' }, { required: true, message: '请输入验证码' },
{ pattern: /^\d{6}$/, message: '请输入6位数字验证码' }, { pattern: /^\d{6}$/, message: '请输入6位数字验证码' },
]} ]}
extra="该手机号用于后续联系和找回密码" extra="该邮箱用于后续联系和找回密码"
> >
<Input placeholder="请输入验证码" /> <Input placeholder="请输入验证码" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsType']} name={['coscoSupplierBase', 'contactsPhone']}
label="联系人身份类别" label="联系电话"
rules={[{ required: true, message: '请选择联系人身份类别' }]}
>
<Select placeholder="请选择类型">
<Option value="internal"></Option>
<Option value="external"></Option>
</Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
name={['coscoSupplierBase', 'idCard']}
label="联系人证件号码"
rules={[{ required: true, message: '请输入联系人证件号码' }]}
>
<Input placeholder="请填写联系人正确的身份证号" />
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
name={['coscoSupplierBase', 'contactsEmail']}
label="联系人邮箱"
rules={[ rules={[
{ type: 'email', message: '请输入有效的电子邮箱' }, { required: false, message: '请输入联系电话' }
{ required: true, message: '请输入电子邮箱' },
]} ]}
> >
<Input prefix={<MailOutlined />} placeholder="XXX@XXX.com" /> <Input
</Form.Item> placeholder="请输入联系电话"
</Col> prefix={<MobileOutlined />}
<Col span={8}> />
<Form.Item name={['coscoSupplierBase', 'telephone']} label="固定电话">
<Input placeholder="请输入企业联系电话" />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>