修改注册页面;字典从接口取值;上传组件地址修改;维护注册页面及其组件多语言;

This commit is contained in:
linxd
2025-07-04 15:24:17 +08:00
parent 92a92b17cf
commit 21e7f15f64
10 changed files with 990 additions and 387 deletions

View File

@ -56,7 +56,7 @@ const FileUpload: React.FC<FileUploadProps> = ({
tip, tip,
action, action,
}) => { }) => {
const actionUrl = action ? `${UPLOAD_URL}${action}` : `${UPLOAD_URL}/fileConfig/files/upload`; const actionUrl = action ? `${UPLOAD_URL}${action}` : `${UPLOAD_URL}/api/files/upload`;
const intl = useIntl(); const intl = useIntl();
const [fileList, setFileList] = useState<UploadFile[]>([]); const [fileList, setFileList] = useState<UploadFile[]>([]);

View File

@ -1,14 +1,15 @@
import help from './en-US/help';
import policy from './en-US/policy';
import download from './en-US/download'; import download from './en-US/download';
import notice from './en-US/notice'; import notice from './en-US/notice';
import help from './en-US/help';
import policy from './en-US/policy';
import register from './en-US/register';
export default { export default {
'menu.首页': 'Home', 'menu.首页': 'Home',
'menu.公告公示': 'Public Announcement', 'menu.公告公示': 'Announcements',
'menu.政策法规': 'Policies and Regulations', 'menu.政策法规': 'Policies',
'menu.通知中心': 'Notifications', 'menu.通知中心': 'Notifications',
'menu.下载中心': 'Download Center', 'menu.下载中心': 'Downloads',
'menu.关于我们': 'About Us', 'menu.关于我们': 'About Us',
// About page // About page
@ -18,22 +19,22 @@ export default {
'about.history.title': 'Development History', 'about.history.title': 'Development History',
'about.contact.title': 'Contact Us', 'about.contact.title': 'Contact Us',
'about.address': 'Headquarters Address', 'about.address': 'Headquarters Address',
'about.phone': 'Phone', 'about.phone': 'Contact Number',
'about.hotline': 'Service Hotline', 'about.hotline': 'Service Hotline',
'about.email': 'Email', 'about.email': 'Email',
'about.worktime': 'Working Hours', 'about.worktime': 'Working Hours',
'about.copyright': '© 2024 COSCO SHIPPING E-Bidding Platform. All Rights Reserved.', 'about.copyright': '© 2024 COSCO Shipping E-Bidding Platform. All Rights Reserved',
"查看":"Info", "查看":"View",
"采购需求公示":"Procurement Demand Announcement", "采购需求公示":"Procurement Requirements",
"招标采购公告":"Bidding Procurement Announcement", "招标采购公告":"Bidding Announcement",
"非招标采购公告":"Non-bidding Procurement Announcement", "非招标采购公告":"Non-bidding Procurement",
"资格预审公告":"Pre-qualification Announcement", "资格预审公告":"Qualification Announcement",
"招募公告":"Recruitment Announcement", "招募公告":"Recruitment Announcement",
"变更公告":"Change Announcement", "变更公告":"Change Announcement",
"中标(中选)候选人公示":"Bid Winner Candidate Announcement", "中标(中选)候选人公示":"Successful Bidder Notice",
"中标(中选)结果公示":"Bid Result Announcement", "中标(中选)结果公示":"Bid Result Announcement",
"采购失败(流标)公告":"Failed Procurement Announcement", "采购失败(流标)公告":"Failed Procurement Notice",
"加载更多":"Load More", "加载更多":"Load More",
"登录/注册":"Login/Register", "登录/注册":"Login/Register",
@ -44,62 +45,12 @@ export default {
"login.tab.agent": "Bidding Agent", "login.tab.agent": "Bidding Agent",
"login.username.placeholder": "Please enter username", "login.username.placeholder": "Please enter username",
"login.password.placeholder": "Please enter password", "login.password.placeholder": "Please enter password",
"login.remember": "Remember me", "login.remember": "Remember password",
"login.forgot": "Forgot password?", "login.forgot": "Forgot password?",
"login.button": "Login", "login.button": "Login",
"login.register.tip": "Don't have an account?", "login.register.tip": "Don't have an account?",
"login.register.action": "Register now", "login.register.action": "Register Now",
"login.back.home": "Back to home", "login.back.home": "Back to Home",
// Registration common text
"register.submit": "Complete Registration",
"register.hasAccount": "Already have an account?",
"register.login": "Login now",
// Username and password common text
"register.username.label": "Username",
"register.username.placeholder": "Please enter username",
"register.username.required": "Please enter username",
"register.username.min": "Username must be at least 4 characters",
"register.password.label": "Password",
"register.password.placeholder": "Please enter password (6-16 characters with letters and numbers)",
"register.password.required": "Please enter password",
"register.password.min": "Password must be at least 6 characters",
"register.password.pattern": "Password must be 6-16 characters with letters and numbers",
"register.confirmPassword.label": "Confirm Password",
"register.confirmPassword.placeholder": "Please confirm password, must match the password above",
"register.confirmPassword.required": "Please confirm password",
"register.confirmPassword.notMatch": "The two passwords do not match",
"register.phone.label": "Phone Number",
"register.phone.placeholder": "Please enter phone number",
"register.phone.required": "Please enter phone number",
"register.phone.invalid": "Please enter a valid phone number",
"register.email.label": "Email",
"register.email.placeholder": "Please enter email",
"register.email.required": "Please enter email",
"register.email.invalid": "Please enter a valid email",
"register.captcha.label": "SMS Verification Code",
"register.captcha.placeholder": "Please enter verification code",
"register.captcha.required": "Please enter verification code",
"register.captcha.get": "Get Code",
// Supplier registration text
"register.supplier.title": "Supplier Registration",
"register.supplier.companyName.label": "Company Name",
"register.supplier.companyName.placeholder": "Please enter company name",
"register.supplier.companyName.required": "Please enter company name",
"register.supplier.contactPerson.label": "Contact Person",
"register.supplier.contactPerson.placeholder": "Please enter contact person",
"register.supplier.contactPerson.required": "Please enter contact person",
// Expert registration text
"register.expert.title": "Expert Registration",
"register.expert.idType.label": "ID Type",
"register.expert.idType.placeholder": "Please select ID type",
"register.expert.idType.required": "Please select ID type",
"register.expert.idCard.label": "ID Number",
"register.expert.idCard.placeholder": "Please enter ID number",
"register.expert.idCard.required": "Please enter ID number",
// Help Center module // Help Center module
...help, ...help,
@ -112,4 +63,7 @@ export default {
// Notice Center module // Notice Center module
...notice, ...notice,
// Registration module
...register,
}; };

View File

@ -0,0 +1,291 @@
export default {
// Bank account information
"register.bank.bankName": "Bank Name",
"register.bank.bankName.placeholder": "Please enter bank name",
"register.bank.bankName.required": "Please enter bank name",
"register.bank.accountName": "Account Name",
"register.bank.accountName.placeholder": "Please enter account name",
"register.bank.accountName.required": "Please enter account name",
"register.bank.accountNumber": "Account Number",
"register.bank.accountNumber.placeholder": "Please enter account number",
"register.bank.accountNumber.required": "Please enter account number",
"register.bank.location": "Country, Province, City",
"register.bank.location.placeholder": "Please select location",
"register.bank.location.required": "Please select location",
// Survey related
"register.survey.fillerInfo": "Filler Information",
"register.survey.supplierName": "Supplier Name",
"register.survey.supplierName.placeholder": "Please enter supplier name",
"register.survey.supplierName.required": "Please enter supplier name",
"register.survey.name": "Name",
"register.survey.name.placeholder": "Please enter name",
"register.survey.name.required": "Please enter name",
"register.survey.position": "Position",
"register.survey.position.placeholder": "Please enter position",
"register.survey.position.required": "Please enter position",
"register.survey.phone": "Phone Number",
"register.survey.phone.placeholder": "Please enter phone number",
"register.survey.phone.required": "Please enter phone number",
"register.survey.email": "Email",
"register.survey.email.placeholder": "Please enter email",
"register.survey.email.required": "Please enter email",
"register.survey.date": "Date",
"register.survey.date.required": "Please select date",
"register.survey.questionnaire": "Questionnaire",
"register.survey.question": "Question",
"register.survey.reply": "Reply",
"register.survey.answer.required": "Please answer question {index}",
"register.survey.answer.placeholder": "Please enter your answer",
"register.survey.noData": "No questionnaire data available",
// Attachment related
"register.attachment.stampUpload": "Please upload after stamping with company seal",
"register.attachment.downloadTemplate": "Download Template",
"register.attachment.commitment.required": "Please upload the stamped anti-commercial bribery commitment",
"register.attachment.otherAttachments.hint": "Other attachments (not required)",
"register.attachment.addMore": "Add More Attachments",
"register.upload.success": "{filename} uploaded successfully",
// Registration common text
"register.submit": "Register",
"register.hasAccount": "Already have an account?",
"register.login": "Login",
// Username/password common text
"register.username.label": "Username",
"register.username.placeholder": "Please enter username",
"register.username.required": "Please enter username",
"register.username.min": "Username must be at least 4 characters",
"register.password.label": "Password",
"register.password.placeholder": "Please enter password (6-16 characters with letters and numbers)",
"register.password.required": "Please enter password",
"register.password.min": "Password must be at least 6 characters",
"register.password.pattern": "Password must be 6-16 characters with letters and numbers",
"register.confirmPassword.label": "Confirm Password",
"register.confirmPassword.placeholder": "Please enter password again",
"register.confirmPassword.required": "Please confirm password",
"register.confirmPassword.notMatch": "The two passwords do not match",
"register.phone.label": "Mobile Phone",
"register.phone.placeholder": "Please enter mobile phone number",
"register.phone.required": "Please enter mobile phone number",
"register.phone.invalid": "Please enter valid phone number",
"register.email.label": "Email",
"register.email.placeholder": "Please enter email",
"register.email.required": "Please enter email",
"register.email.invalid": "Please enter valid email address",
"register.captcha.label": "Verification Code",
"register.captcha.placeholder": "Please enter verification code",
"register.captcha.required": "Please enter verification code",
"register.captcha.get": "Get Code",
"register.captcha.countdown": "Retry in {count}s",
"register.captcha.pattern": "Please enter 6-digit verification code",
// Supplier registration page
'register.supplier.identityType': 'Identity Type',
'register.supplier.domestic': 'Domestic Company',
'register.supplier.foreign': 'Foreign Company',
'register.supplier.agreement': 'I have read and agree to the',
'register.supplier.commitment': 'Registration Commitment',
'register.supplier.commitment.title': 'Registration Commitment',
'register.supplier.commitment.ok': 'I Understand',
'register.supplier.agreement.required': 'Please read and agree to the registration commitment',
"register.supplier.title": "Supplier Registration",
"register.supplier.companyName.label": "Company Name",
"register.supplier.companyName.placeholder": "Please enter company name",
"register.supplier.companyName.required": "Please enter company name",
"register.supplier.contactPerson.label": "Contact Person",
"register.supplier.contactPerson.placeholder": "Please enter contact person name",
"register.supplier.contactPerson.required": "Please enter contact person name",
// Expert registration text
"register.expert.title": "Expert Registration",
"register.expert.tip": "1. Before registration, please ensure you have written authorization (or relevant certificates) from your company;\n2. After registration, please fill in your expert resume and submit key materials in time for platform review;\n3. As expert registration requires a lot of information, we recommend using a PC;\n4. If you have any questions during registration, please contact 010-66078740.",
"register.expert.notice.title": "Registration Notice",
"register.expert.idType.label": "ID Type",
"register.expert.idType.placeholder": "Please select ID type",
"register.expert.idType.required": "Please select ID type",
"register.expert.idCard.label": "ID Number",
"register.expert.idCard.placeholder": "Please enter ID number",
"register.expert.idCard.required": "Please enter ID number",
// Enterprise registration
'register.enterprise.title': 'Enterprise Registration',
// Commitment content
'register.supplier.commitment.content.intro1': 'Dear User:',
'register.supplier.commitment.content.intro2': 'Thank you for registering to use our platform. Please read the following commitment carefully:',
'register.supplier.commitment.content.item1': 'I/We commit that the registration information provided is true, accurate and complete, without false records, misleading statements or major omissions.',
'register.supplier.commitment.content.item2': 'I/We commit to comply with the platform rules and requirements, and not engage in any illegal activities.',
'register.supplier.commitment.content.item3': 'I/We understand and agree that if false information is provided or platform rules are violated, the platform has the right to terminate the service and pursue relevant responsibilities.',
'register.supplier.commitment.content.item4': 'I/We commit to properly safeguard account and password, and be responsible for all operations and actions under the account.',
'register.supplier.commitment.content.item5': 'I/We agree that the platform may legally use the provided information within the necessary scope for providing services and improving user experience.',
'register.supplier.commitment.content.item6': 'I/We commit to comply with national laws and industry standards, adhere to business ethics, and not engage in any behavior that harms the platform or other users\' interests.',
'register.supplier.commitment.content.item7': 'I/We commit that the qualification documents and supporting materials uploaded are authentic and valid, and are responsible for their authenticity and legality.',
'register.supplier.commitment.content.item8': 'I/We understand and agree that the platform has the right to review user materials according to business needs and reserves the final interpretation right.',
'register.supplier.commitment.content.end': 'Hereby committed!',
// Verification code
'register.captcha.sent': 'Verification code has been sent to {phone}',
'register.captcha.phoneRequired': 'Please enter correct phone number first',
// Submission
'register.submit.success': 'Registration successful, please login',
'register.submit.failed': 'Registration failed, please try again',
'register.submit.error': 'Registration failed, please try again later',
// Form section
"register.form.section.basicInfo": "Basic Information",
"register.form.section.qualification": "Qualification Information",
"register.form.section.invoice": "Invoice Information",
"register.form.section.bankAccount": "Bank Account",
"register.form.section.survey": "Social Standards Compliance Questionnaire",
"register.form.section.attachment": "Attachments",
"register.form.section.commitment": "Supplier Anti-Commercial Bribery Commitment",
"register.form.section.otherAttachments": "Other Attachments",
"register.form.table.no": "No.",
"register.form.operation": "Operation",
"register.form.attachment": "Attachment",
"register.form.delete": "Delete",
"register.form.addRow": "Add Row",
"register.form.date.placeholder": "Please select date",
"register.form.upload": "Upload",
// Domestic enterprise registration form
"register.domestic.enterpriseType": "Enterprise Type",
"register.domestic.enterpriseType.placeholder": "Please select enterprise type",
"register.domestic.enterpriseType.required": "Please select enterprise type",
"register.domestic.licenceAccessory": "Business License",
"register.domestic.licenceAccessory.required": "Please upload business license",
"register.domestic.licenceAccessory.tip": "Support PDF, JPG, PNG formats, less than 10MB",
"register.domestic.licenceDate": "License Expiry Date",
"register.domestic.licenceDate.required": "Please select license expiry date",
"register.domestic.companyName": "Company Name",
"register.domestic.companyName.placeholder": "Please enter company name",
"register.domestic.companyName.required": "Please enter company name",
"register.domestic.companyNameEn": "Company English Name",
"register.domestic.companyNameEn.placeholder": "Please enter company English name",
"register.domestic.companyNameEn.required": "Please enter company English name",
"register.domestic.socialCreditCode": "Unified Social Credit Code",
"register.domestic.socialCreditCode.placeholder": "Please enter correct unified social credit code",
"register.domestic.socialCreditCode.required": "Please enter unified social credit code",
"register.domestic.socialCreditCode.pattern": "Please enter valid unified social credit code",
"register.domestic.businessScope": "Business Scope",
"register.domestic.businessScope.placeholder": "Financial products, advertising media, etc.",
"register.domestic.businessScope.required": "Please enter business scope",
"register.domestic.regAddress": "Registered Address",
"register.domestic.regAddress.placeholder": "Shanghai Putuo District XX Road 1888",
"register.domestic.regAddress.required": "Please enter registered address",
"register.domestic.workAddress": "Office Address",
"register.domestic.workAddress.placeholder": "Please specify province, city, district, road, building number",
"register.domestic.parentCompany": "Parent Company/Investor",
"register.domestic.parentCompany.placeholder": "Please enter parent company or investor information",
"register.domestic.legalPerson": "Legal Representative",
"register.domestic.legalPerson.placeholder": "John Doe",
"register.domestic.legalPerson.required": "Please enter legal representative",
"register.domestic.idCard": "Contact ID Number",
"register.domestic.idCard.placeholder": "Please enter correct ID number",
"register.domestic.capital": "Registered Capital",
"register.domestic.capital.placeholder": "Please enter amount",
"register.domestic.capital.required": "Please enter registered capital",
"register.domestic.contactsName": "Contact Name",
"register.domestic.contactsName.placeholder": "Please enter contact name",
"register.domestic.contactsName.required": "Please enter contact name",
"register.domestic.contactsPhone": "Contact Mobile",
"register.domestic.contactsPhone.placeholder": "Please enter mobile number",
"register.domestic.contactsPhone.required": "Please enter contact mobile",
"register.domestic.contactsPhone.pattern": "Please enter valid mobile number",
"register.domestic.contactsEmail": "Contact Email",
"register.domestic.contactsEmail.placeholder": "Please enter contact email",
"register.domestic.contactsEmail.required": "Please enter email",
"register.domestic.telephone": "Telephone",
"register.domestic.telephone.placeholder": "Please enter telephone number",
// Foreign enterprise registration form
"register.foreign.companyName": "Company Name",
"register.foreign.companyName.placeholder": "Please enter company name",
"register.foreign.companyName.required": "Please enter company name",
"register.foreign.companyNameEn": "Company English Name",
"register.foreign.companyNameEn.placeholder": "Please enter company English name",
"register.foreign.companyNameEn.required": "Please enter company English name",
"register.foreign.country": "Country/Region",
"register.foreign.country.placeholder": "Please select country/region",
"register.foreign.country.required": "Please select country/region",
"register.foreign.country.US": "United States",
"register.foreign.country.UK": "United Kingdom",
"register.foreign.country.JP": "Japan",
"register.foreign.country.DE": "Germany",
"register.foreign.country.FR": "France",
"register.foreign.country.AU": "Australia",
"register.foreign.country.CA": "Canada",
"register.foreign.country.SG": "Singapore",
"register.foreign.country.HK": "Hong Kong, China",
"register.foreign.country.OTHER": "Other",
"register.foreign.vat": "VAT Number",
"register.foreign.vat.placeholder": "Please enter VAT number",
"register.foreign.vat.required": "Please enter VAT number",
"register.foreign.workAddress": "Office Address",
"register.foreign.workAddress.placeholder": "Please specify",
"register.foreign.businessScope": "Business Scope",
"register.foreign.businessScope.placeholder": "Please enter business scope",
"register.foreign.businessScope.required": "Please enter business scope",
"register.foreign.parentCompany": "Parent Company/Investor",
"register.foreign.parentCompany.placeholder": "Please enter parent company or investor information",
"register.foreign.legalPerson": "Legal Representative",
"register.foreign.legalPerson.placeholder": "Please enter legal representative",
"register.foreign.legalPerson.required": "Please enter legal representative",
"register.foreign.capital": "Registered Capital",
"register.foreign.capital.placeholder": "Please enter amount",
"register.foreign.capital.required": "Please enter registered capital amount",
"register.foreign.contactsName": "Contact Name",
"register.foreign.contactsName.placeholder": "Please enter contact name",
"register.foreign.contactsName.required": "Please enter contact name",
"register.foreign.contactsEmail": "Contact Email",
"register.foreign.contactsEmail.placeholder": "XXX@XXX.com",
"register.foreign.contactsEmail.required": "Please enter email",
"register.foreign.contactsEmail.extra": "This email will be used for future contact and password recovery",
"register.foreign.contactsPhone": "Contact Phone",
"register.foreign.contactsPhone.placeholder": "Please enter contact phone",
"register.foreign.contactsPhone.required": "Please enter contact phone",
// Qualification information
"register.qualification.certType": "Certificate Type",
"register.qualification.certType.placeholder": "Please select type",
"register.qualification.certType.required": "Please select certificate type",
"register.qualification.certName": "Certificate Name",
"register.qualification.certName.placeholder": "Please enter certificate name",
"register.qualification.certName.required": "Please enter certificate name",
"register.qualification.certNumber": "Certificate Number",
"register.qualification.certNumber.placeholder": "Please enter certificate number",
"register.qualification.certNumber.required": "Please enter certificate number",
"register.qualification.certLevel": "Certificate Level",
"register.qualification.certLevel.placeholder": "Please enter certificate level",
"register.qualification.issuingAuthority": "Issuing Authority",
"register.qualification.issuingAuthority.placeholder": "Please enter issuing authority",
"register.qualification.issuingAuthority.required": "Please enter issuing authority",
"register.qualification.issueDate": "Issue Date",
"register.qualification.issueDate.required": "Please select issue date",
"register.qualification.expiryDate": "Expiry Date",
"register.qualification.expiryDate.required": "Please select expiry date",
"register.qualification.attachment.required": "Please upload certificate attachment",
// Invoice information
"register.invoice.taxpayerType": "Taxpayer Type",
"register.invoice.taxpayerType.placeholder": "Please select taxpayer type",
"register.invoice.taxpayerType.required": "Please select taxpayer type",
"register.invoice.head": "Invoice Title",
"register.invoice.head.placeholder": "Please enter invoice title",
"register.invoice.head.required": "Please enter invoice title",
"register.invoice.taxpayerCode": "Taxpayer ID",
"register.invoice.taxpayerCode.placeholder": "Please enter taxpayer ID",
"register.invoice.taxpayerCode.required": "Please enter taxpayer ID",
"register.invoice.address": "Invoice Address",
"register.invoice.address.placeholder": "Please enter invoice address",
"register.invoice.phone": "Invoice Phone",
"register.invoice.phone.placeholder": "Please enter invoice phone",
"register.invoice.bank": "Bank Name",
"register.invoice.bank.placeholder": "Please enter bank name",
"register.invoice.account": "Bank Account",
"register.invoice.account.placeholder": "Please enter bank account",
"register.invoice.qualificationCertificate": "General Taxpayer Qualification Certificate",
};

View File

@ -1,7 +1,8 @@
import help from './zh-CN/help';
import policy from './zh-CN/policy';
import download from './zh-CN/download'; import download from './zh-CN/download';
import notice from './zh-CN/notice'; import notice from './zh-CN/notice';
import help from './zh-CN/help';
import policy from './zh-CN/policy';
import register from './zh-CN/register';
export default { export default {
'menu.首页': '首页', 'menu.首页': '首页',
@ -51,56 +52,6 @@ export default {
"login.register.action": "立即注册", "login.register.action": "立即注册",
"login.back.home": "返回首页", "login.back.home": "返回首页",
// 注册页通用文案
"register.submit": "注册完成",
"register.hasAccount": "已有账号?",
"register.login": "立即登录",
// 用户名密码通用文案
"register.username.label": "用户名",
"register.username.placeholder": "请输入用户名",
"register.username.required": "请输入用户名",
"register.username.min": "用户名至少4个字符",
"register.password.label": "输入密码",
"register.password.placeholder": "请输入密码应为6-16位的英文加数字组合",
"register.password.required": "请输入密码",
"register.password.min": "密码至少6个字符",
"register.password.pattern": "密码应为6-16位的英文加数字组合",
"register.confirmPassword.label": "确认密码",
"register.confirmPassword.placeholder": "请再次输入密码,两次输入保持一致",
"register.confirmPassword.required": "请确认密码",
"register.confirmPassword.notMatch": "两次输入的密码不一致",
"register.phone.label": "手机号",
"register.phone.placeholder": "请输入手机号",
"register.phone.required": "请输入手机号",
"register.phone.invalid": "请输入有效的手机号",
"register.email.label": "电子邮箱",
"register.email.placeholder": "请输入电子邮箱",
"register.email.required": "请输入电子邮箱",
"register.email.invalid": "请输入有效的电子邮箱",
"register.captcha.label": "短信验证码",
"register.captcha.placeholder": "请输入短信验证码",
"register.captcha.required": "请输入短信验证码",
"register.captcha.get": "获取验证码",
// 供应商注册文案
"register.supplier.title": "供应商注册",
"register.supplier.companyName.label": "公司名称",
"register.supplier.companyName.placeholder": "请输入公司名称",
"register.supplier.companyName.required": "请输入公司名称",
"register.supplier.contactPerson.label": "联系人",
"register.supplier.contactPerson.placeholder": "请输入联系人姓名",
"register.supplier.contactPerson.required": "请输入联系人姓名",
// 专家注册文案
"register.expert.title": "专家注册",
"register.expert.idType.label": "证件类型",
"register.expert.idType.placeholder": "请选择证件类型",
"register.expert.idType.required": "请选择证件类型",
"register.expert.idCard.label": "证件号",
"register.expert.idCard.placeholder": "请输入证件号",
"register.expert.idCard.required": "请输入证件号",
// 帮助中心模块 // 帮助中心模块
...help, ...help,
@ -112,4 +63,7 @@ export default {
// 通知中心模块 // 通知中心模块
...notice, ...notice,
// 注册模块
...register,
}; };

View File

@ -0,0 +1,288 @@
export default {
// 注册页通用文案
"register.submit": "注册完成",
"register.hasAccount": "已有账号?",
"register.login": "立即登录",
// 用户名密码通用文案
"register.username.label": "用户名",
"register.username.placeholder": "请输入用户名",
"register.username.required": "请输入用户名",
"register.username.min": "用户名至少4个字符",
"register.password.label": "输入密码",
"register.password.placeholder": "请输入密码应为6-16位的英文加数字组合",
"register.password.required": "请输入密码",
"register.password.min": "密码至少6个字符",
"register.password.pattern": "密码应为6-16位的英文加数字组合",
"register.confirmPassword.label": "确认密码",
"register.confirmPassword.placeholder": "请再次输入密码,两次输入保持一致",
"register.confirmPassword.required": "请确认密码",
"register.confirmPassword.notMatch": "两次输入的密码不一致",
"register.phone.label": "手机号",
"register.phone.placeholder": "请输入手机号",
"register.phone.required": "请输入手机号",
"register.phone.invalid": "请输入有效的手机号",
"register.email.label": "电子邮箱",
"register.email.placeholder": "请输入电子邮箱",
"register.email.required": "请输入电子邮箱",
"register.email.invalid": "请输入有效的电子邮箱",
"register.captcha.label": "短信验证码",
"register.captcha.placeholder": "请输入短信验证码",
"register.captcha.required": "请输入短信验证码",
"register.captcha.get": "获取验证码",
"register.captcha.countdown": "{count}秒后重新获取",
"register.captcha.pattern": "请输入6位数字验证码",
// 供应商注册页面
'register.supplier.identityType': '身份类型',
'register.supplier.domestic': '境内企业/机构',
'register.supplier.foreign': '境外企业',
'register.supplier.agreement': '我已阅读并同意',
'register.supplier.commitment': '《注册信息承诺书》',
'register.supplier.commitment.title': '注册信息承诺书',
'register.supplier.commitment.ok': '我知道了',
'register.supplier.agreement.required': '请阅读并同意注册信息承诺书',
"register.supplier.title": "供应商注册",
"register.supplier.companyName.label": "公司名称",
"register.supplier.companyName.placeholder": "请输入公司名称",
"register.supplier.companyName.required": "请输入公司名称",
"register.supplier.contactPerson.label": "联系人",
"register.supplier.contactPerson.placeholder": "请输入联系人姓名",
"register.supplier.contactPerson.required": "请输入联系人姓名",
// 专家注册文案
"register.expert.title": "专家注册",
"register.expert.tip": "1、入驻前请确认您已经获得了您所在企业的书面入驻授权或相关证明\n2、注册完成后请及时填写专家履历提交关键资料平台审核通过后您可以正常使用\n3、由于专家注册资料信息较多建议您使用PC端填写\n4、入驻过程中如有疑问请联系010-66078740。",
"register.expert.notice.title": "注册前须知",
"register.expert.idType.label": "证件类型",
"register.expert.idType.placeholder": "请选择证件类型",
"register.expert.idType.required": "请选择证件类型",
"register.expert.idCard.label": "证件号",
"register.expert.idCard.placeholder": "请输入证件号",
"register.expert.idCard.required": "请输入证件号",
// 表单通用
"register.form.section.basicInfo": "基本信息",
"register.form.section.qualification": "资质信息",
"register.form.section.invoice": "开票信息",
"register.form.section.bankAccount": "银行账户",
"register.form.section.survey": "社会准则符合性自查问卷",
"register.form.section.attachment": "附件",
"register.form.section.commitment": "供应商反商业贿赂承诺书",
"register.form.section.otherAttachments": "其他附件",
"register.form.table.no": "序号",
"register.form.operation": "操作",
"register.form.attachment": "附件",
"register.form.delete": "删除",
"register.form.addRow": "添加行",
"register.form.date.placeholder": "请选择日期",
"register.form.upload": "上传文件",
// 境内企业注册表单
"register.domestic.enterpriseType": "企业类型",
"register.domestic.enterpriseType.placeholder": "请选择企业类型",
"register.domestic.enterpriseType.required": "请选择企业类型",
"register.domestic.licenceAccessory": "营业执照附件",
"register.domestic.licenceAccessory.required": "请上传营业执照附件",
"register.domestic.licenceAccessory.tip": "支持PDF、JPG、PNG格式不超过10MB",
"register.domestic.licenceDate": "营业执照有效期",
"register.domestic.licenceDate.required": "请选择营业执照有效期",
"register.domestic.companyName": "企业名称",
"register.domestic.companyName.placeholder": "请输入企业名称",
"register.domestic.companyName.required": "请输入企业名称",
"register.domestic.companyNameEn": "企业英文名",
"register.domestic.companyNameEn.placeholder": "请输入企业英文名",
"register.domestic.companyNameEn.required": "请输入企业英文名",
"register.domestic.socialCreditCode": "统一社会信用代码",
"register.domestic.socialCreditCode.placeholder": "请输入正确的统一社会信用代码",
"register.domestic.socialCreditCode.required": "请输入统一社会信用代码",
"register.domestic.socialCreditCode.pattern": "请输入正确的统一社会信用代码",
"register.domestic.businessScope": "经营范围",
"register.domestic.businessScope.placeholder": "金融专用产品、广告传媒",
"register.domestic.businessScope.required": "请输入经营范围",
"register.domestic.regAddress": "注册地址",
"register.domestic.regAddress.placeholder": "上海市普陀区XX路1888号",
"register.domestic.regAddress.required": "请输入注册地址",
"register.domestic.workAddress": "办公地址",
"register.domestic.workAddress.placeholder": "请具体注明省、市、区、路、门牌号",
"register.domestic.parentCompany": "母公司/出资人",
"register.domestic.parentCompany.placeholder": "请输入母公司或出资人信息",
"register.domestic.legalPerson": "企业法定代表人",
"register.domestic.legalPerson.placeholder": "张三",
"register.domestic.legalPerson.required": "请输入企业法定代表人/负责人",
"register.domestic.idCard": "联系人证件号码",
"register.domestic.idCard.placeholder": "请填写联系人正确的身份证号",
"register.domestic.capital": "注册资本",
"register.domestic.capital.placeholder": "请输入金额",
"register.domestic.capital.required": "请输入注册资本",
"register.domestic.contactsName": "联系人姓名",
"register.domestic.contactsName.placeholder": "请输入联系人姓名",
"register.domestic.contactsName.required": "请输入联系人姓名",
"register.domestic.contactsPhone": "联系人手机",
"register.domestic.contactsPhone.placeholder": "请输入11位手机号码",
"register.domestic.contactsPhone.required": "请输入联系人手机号",
"register.domestic.contactsPhone.pattern": "请输入有效的手机号",
"register.domestic.contactsEmail": "联系人邮箱",
"register.domestic.contactsEmail.placeholder": "请输入联系人邮箱",
"register.domestic.contactsEmail.required": "请输入电子邮箱",
"register.domestic.telephone": "固定电话",
"register.domestic.telephone.placeholder": "请输入固定电话",
// 境外企业注册表单
"register.foreign.companyName": "企业名称",
"register.foreign.companyName.placeholder": "请输入企业名称",
"register.foreign.companyName.required": "请输入企业名称",
"register.foreign.companyNameEn": "企业英文名称",
"register.foreign.companyNameEn.placeholder": "请输入企业英文名称",
"register.foreign.companyNameEn.required": "请输入企业英文名称",
"register.foreign.country": "国家/地区",
"register.foreign.country.placeholder": "请选择国家/地区",
"register.foreign.country.required": "请选择国家/地区",
"register.foreign.country.US": "美国",
"register.foreign.country.UK": "英国",
"register.foreign.country.JP": "日本",
"register.foreign.country.DE": "德国",
"register.foreign.country.FR": "法国",
"register.foreign.country.AU": "澳大利亚",
"register.foreign.country.CA": "加拿大",
"register.foreign.country.SG": "新加坡",
"register.foreign.country.HK": "中国香港",
"register.foreign.country.OTHER": "其他",
"register.foreign.vat": "税号",
"register.foreign.vat.placeholder": "请输入税号",
"register.foreign.vat.required": "请输入税号",
"register.foreign.workAddress": "办公地址",
"register.foreign.workAddress.placeholder": "请具体注明",
"register.foreign.businessScope": "经营范围",
"register.foreign.businessScope.placeholder": "请输入经营范围",
"register.foreign.businessScope.required": "请输入经营范围",
"register.foreign.parentCompany": "母公司/出资人",
"register.foreign.parentCompany.placeholder": "请输入母公司或出资人信息",
"register.foreign.legalPerson": "企业法定代表人",
"register.foreign.legalPerson.placeholder": "请输入企业法定代表人",
"register.foreign.legalPerson.required": "请输入企业法定代表人",
"register.foreign.capital": "注册资本",
"register.foreign.capital.placeholder": "请输入金额",
"register.foreign.capital.required": "请输入注册资本金额",
"register.foreign.contactsName": "联系人姓名",
"register.foreign.contactsName.placeholder": "请输入联系人姓名",
"register.foreign.contactsName.required": "请输入联系人姓名",
"register.foreign.contactsEmail": "联系人邮箱",
"register.foreign.contactsEmail.placeholder": "XXX@XXX.com",
"register.foreign.contactsEmail.required": "请输入电子邮箱",
"register.foreign.contactsEmail.extra": "该邮箱用于后续联系和找回密码",
"register.foreign.contactsPhone": "联系电话",
"register.foreign.contactsPhone.placeholder": "请输入联系电话",
"register.foreign.contactsPhone.required": "请输入联系电话",
// 资质信息
"register.qualification.certType": "资质证书类型",
"register.qualification.certType.placeholder": "请选择类型",
"register.qualification.certType.required": "请选择资质证书类型",
"register.qualification.certName": "资质名称",
"register.qualification.certName.placeholder": "请输入资质名称",
"register.qualification.certName.required": "请输入资质名称",
"register.qualification.certNumber": "资质证书编号",
"register.qualification.certNumber.placeholder": "请输入证书编号",
"register.qualification.certNumber.required": "请输入资质证书编号",
"register.qualification.certLevel": "资质类别和等级",
"register.qualification.certLevel.placeholder": "请输入资质类别和等级",
"register.qualification.issuingAuthority": "发证机构",
"register.qualification.issuingAuthority.placeholder": "请输入发证机构",
"register.qualification.issuingAuthority.required": "请输入发证机构",
"register.qualification.issueDate": "发证日期",
"register.qualification.issueDate.required": "请选择发证日期",
"register.qualification.expiryDate": "资质有效期至",
"register.qualification.expiryDate.required": "请选择资质有效期",
"register.qualification.attachment.required": "请上传资质证书附件",
// 开票信息
"register.invoice.taxpayerType": "纳税人类型",
"register.invoice.taxpayerType.placeholder": "请选择纳税人类型",
"register.invoice.taxpayerType.required": "请选择纳税人类型",
"register.invoice.head": "开票抬头",
"register.invoice.head.placeholder": "请输入开票抬头",
"register.invoice.head.required": "请输入开票抬头",
"register.invoice.taxpayerCode": "纳税人识别号",
"register.invoice.taxpayerCode.placeholder": "请输入纳税人识别号",
"register.invoice.taxpayerCode.required": "请输入纳税人识别号",
"register.invoice.address": "开票地址",
"register.invoice.address.placeholder": "请输入开票地址",
"register.invoice.phone": "开票电话",
"register.invoice.phone.placeholder": "请输入开票电话",
"register.invoice.bank": "开票户行",
"register.invoice.bank.placeholder": "请输入开票银行",
"register.invoice.account": "开票户行账号",
"register.invoice.account.placeholder": "请输入开票户行账号",
"register.invoice.qualificationCertificate": "一般纳税人资格证明",
// 银行账户信息
"register.bank.bankName": "开户银行",
"register.bank.bankName.placeholder": "请输入开户银行",
"register.bank.bankName.required": "请输入开户银行",
"register.bank.accountName": "账户名称",
"register.bank.accountName.placeholder": "请输入账户名称",
"register.bank.accountName.required": "请输入账户名称",
"register.bank.accountNumber": "账号",
"register.bank.accountNumber.placeholder": "请输入账号",
"register.bank.accountNumber.required": "请输入账号",
"register.bank.location": "国家、省、市",
"register.bank.location.placeholder": "请选择省市区",
"register.bank.location.required": "请选择地址",
// 问卷相关
"register.survey.fillerInfo": "填写人信息",
"register.survey.supplierName": "供应商名称",
"register.survey.supplierName.placeholder": "请输入供应商名称",
"register.survey.supplierName.required": "请输入供应商名称",
"register.survey.name": "姓名",
"register.survey.name.placeholder": "请输入姓名",
"register.survey.name.required": "请输入姓名",
"register.survey.position": "职位",
"register.survey.position.placeholder": "请输入职位",
"register.survey.position.required": "请输入职位",
"register.survey.phone": "电话号",
"register.survey.phone.placeholder": "请输入电话号",
"register.survey.phone.required": "请输入电话号",
"register.survey.email": "邮箱",
"register.survey.email.placeholder": "请输入电子邮箱",
"register.survey.email.required": "请输入电子邮箱",
"register.survey.date": "日期",
"register.survey.date.required": "请选择日期",
"register.survey.questionnaire": "问卷",
"register.survey.question": "问题",
"register.survey.reply": "回复",
"register.survey.answer.required": "请选择问题{index}的答案",
"register.survey.answer.placeholder": "请输入回答",
"register.survey.noData": "暂无问卷数据",
// 附件相关
"register.attachment.stampUpload": "请加盖公司公章后上传",
"register.attachment.downloadTemplate": "下载模版",
"register.attachment.commitment.required": "请上传已盖章的反商业贿赂承诺书",
"register.attachment.otherAttachments.hint": "其他附件(非必须上传)",
"register.attachment.addMore": "添加更多附件",
"register.upload.success": "{filename} 上传成功",
// 承诺书内容
'register.supplier.commitment.content.intro1': '尊敬的用户:',
'register.supplier.commitment.content.intro2': '感谢您注册使用我们的平台。请您仔细阅读以下承诺内容:',
'register.supplier.commitment.content.item1': '本人/单位承诺所提供的注册信息真实、准确、完整,不存在虚假记载、误导性陈述或重大遗漏。',
'register.supplier.commitment.content.item2': '本人/单位承诺遵守平台的各项规则和要求,不从事任何违法违规活动。',
'register.supplier.commitment.content.item3': '本人/单位了解并同意,如提供虚假信息或违反平台规则,平台有权终止服务并追究相关责任。',
'register.supplier.commitment.content.item4': '本人/单位承诺妥善保管账号和密码,对账号下的所有操作和行为负责。',
'register.supplier.commitment.content.item5': '本人/单位同意平台在必要范围内合法使用所提供的信息,用于提供服务和改善用户体验。',
'register.supplier.commitment.content.item6': '本人/单位承诺遵守国家法律法规和行业规范,恪守商业道德,不从事任何损害平台或其他用户利益的行为。',
'register.supplier.commitment.content.item7': '本人/单位承诺所上传的资质文件和证明材料真实有效,并对其真实性和合法性负责。',
'register.supplier.commitment.content.item8': '本人/单位了解并同意,平台有权根据业务需要对用户资料进行审核,并保留最终解释权。',
'register.supplier.commitment.content.end': '特此承诺!',
// 验证码相关
'register.captcha.sent': '验证码已发送至 {phone}',
'register.captcha.phoneRequired': '请先输入正确的手机号',
// 提交相关
'register.submit.success': '注册成功,请登录',
'register.submit.failed': '注册失败,请重试',
'register.submit.error': '注册失败,请稍后重试',
};

View File

@ -7,6 +7,8 @@ import DomesticForm from './supplier/DomesticForm';
import ForeignForm from './supplier/ForeignForm'; import ForeignForm from './supplier/ForeignForm';
import { coscoSupplierBaseAdd, fetchSurveyQuestions } from '@/servers/api/register'; import { coscoSupplierBaseAdd, fetchSurveyQuestions } from '@/servers/api/register';
import './register.less'; import './register.less';
import { getDictList } from '@/servers/api/dict';
import type { DictItem } from '@/servers/api/dict';
const SupplierRegister: React.FC = () => { const SupplierRegister: React.FC = () => {
const [form] = Form.useForm(); const [form] = Form.useForm();
@ -17,7 +19,23 @@ const SupplierRegister: React.FC = () => {
const [modalVisible, setModalVisible] = useState(false); const [modalVisible, setModalVisible] = useState(false);
const [surveyQuestions, setSurveyQuestions] = useState<API.SurveyQuestionResponse>([]); const [surveyQuestions, setSurveyQuestions] = useState<API.SurveyQuestionResponse>([]);
const [fetchingQuestions, setFetchingQuestions] = useState(false); const [fetchingQuestions, setFetchingQuestions] = useState(false);
// 币种
const [currencyList, setCurrencyList] = useState<DictItem[]>([]);
// 企业类型
const [entTypeList, setEntTypeList] = useState<DictItem[]>([]);
const getDict = async () => {
// currency 币种
const currencyResponse = await getDictList('currency');
// entType 企业类型
const entTypeResponse = await getDictList('enterprise_type');
Promise.all([currencyResponse, entTypeResponse]).then(
([currencyListResponse, entTypeListResponse]) => {
setCurrencyList(currencyListResponse.data || []);
setEntTypeList(entTypeListResponse.data || []);
},
);
};
// 获取问卷列表 // 获取问卷列表
useEffect(() => { useEffect(() => {
const fetchQuestions = async () => { const fetchQuestions = async () => {
@ -27,17 +45,19 @@ const SupplierRegister: React.FC = () => {
if (response.success) { if (response.success) {
setSurveyQuestions(response.data || []); setSurveyQuestions(response.data || []);
} else { } else {
message.error(response.message || '获取问卷列表失败'); message.error(response.message || intl.formatMessage({ id: 'register.submit.failed' }));
} }
} catch (error) { } catch (error) {
console.error('获取问卷列表出错:', error); console.error('获取问卷列表出错:', error);
message.error('获取问卷列表出错'); message.error(intl.formatMessage({ id: 'register.submit.error' }));
} finally { } finally {
setFetchingQuestions(false); setFetchingQuestions(false);
} }
}; };
fetchQuestions(); fetchQuestions();
// 获取字典
getDict();
}, []); }, []);
// 获取短信验证码 // 获取短信验证码
@ -45,7 +65,7 @@ const SupplierRegister: React.FC = () => {
form form
.validateFields(['contactPhone']) .validateFields(['contactPhone'])
.then((values) => { .then((values) => {
message.success(`验证码已发送至 ${values.contactPhone}`); message.success(intl.formatMessage({ id: 'register.captcha.sent' }, { phone: values.contactPhone }));
let count = 60; let count = 60;
setCountdown(count); setCountdown(count);
@ -58,7 +78,7 @@ const SupplierRegister: React.FC = () => {
}, 1000); }, 1000);
}) })
.catch((errorInfo) => { .catch((errorInfo) => {
message.error('请先输入正确的手机号'); message.error(intl.formatMessage({ id: 'register.captcha.phoneRequired' }));
}); });
}; };
@ -81,15 +101,23 @@ const SupplierRegister: React.FC = () => {
// 处理文件上传组件返回的文件列表值 // 处理文件上传组件返回的文件列表值
// 处理营业执照附件 // 处理营业执照附件
if (values.coscoSupplierBase.licenceAccessory && Array.isArray(values.coscoSupplierBase.licenceAccessory)) { if (
values.coscoSupplierBase.licenceAccessory &&
Array.isArray(values.coscoSupplierBase.licenceAccessory)
) {
const licenceFile = values.coscoSupplierBase.licenceAccessory[0]; const licenceFile = values.coscoSupplierBase.licenceAccessory[0];
values.coscoSupplierBase.licenceAccessory = licenceFile?.response?.url || licenceFile?.response?.filePath || ''; values.coscoSupplierBase.licenceAccessory =
licenceFile?.response?.url || licenceFile?.response?.filePath || '';
} }
// 处理纳税人资格证明 // 处理纳税人资格证明
if (values.coscoSupplierInvoice?.qualificationCertificate && Array.isArray(values.coscoSupplierInvoice.qualificationCertificate)) { if (
values.coscoSupplierInvoice?.qualificationCertificate &&
Array.isArray(values.coscoSupplierInvoice.qualificationCertificate)
) {
const taxFile = values.coscoSupplierInvoice.qualificationCertificate[0]; const taxFile = values.coscoSupplierInvoice.qualificationCertificate[0];
values.coscoSupplierInvoice.qualificationCertificate = taxFile?.response?.url || taxFile?.response?.filePath || ''; values.coscoSupplierInvoice.qualificationCertificate =
taxFile?.response?.url || taxFile?.response?.filePath || '';
} }
// 处理资质证书附件 // 处理资质证书附件
@ -97,7 +125,8 @@ const SupplierRegister: React.FC = () => {
values.coscoSupplierQualifications = values.coscoSupplierQualifications.map((qual: any) => { values.coscoSupplierQualifications = values.coscoSupplierQualifications.map((qual: any) => {
if (qual.accessory && Array.isArray(qual.accessory)) { if (qual.accessory && Array.isArray(qual.accessory)) {
const accessoryFile = qual.accessory[0]; const accessoryFile = qual.accessory[0];
qual.accessory = accessoryFile?.response?.url || accessoryFile?.response?.filePath || ''; qual.accessory =
accessoryFile?.response?.url || accessoryFile?.response?.filePath || '';
} }
return qual; return qual;
}); });
@ -105,13 +134,15 @@ const SupplierRegister: React.FC = () => {
// 处理调查问卷附件 // 处理调查问卷附件
if (values.coscoSupplierSurveyAttachments) { if (values.coscoSupplierSurveyAttachments) {
values.coscoSupplierSurveyAttachments = values.coscoSupplierSurveyAttachments.map((item: any) => { values.coscoSupplierSurveyAttachments = values.coscoSupplierSurveyAttachments.map(
(item: any) => {
if (item.fileUrl && Array.isArray(item.fileUrl)) { if (item.fileUrl && Array.isArray(item.fileUrl)) {
const file = item.fileUrl[0]; const file = item.fileUrl[0];
item.fileUrl = file?.response?.url || file?.response?.filePath || ''; item.fileUrl = file?.response?.url || file?.response?.filePath || '';
} }
return item; return item;
}); },
);
} }
// 处理调查问卷回复 // 处理调查问卷回复
@ -121,7 +152,7 @@ const SupplierRegister: React.FC = () => {
.filter((item: any) => item && item.surveyQuestionId && item.replyValue) .filter((item: any) => item && item.surveyQuestionId && item.replyValue)
.map((item: any) => ({ .map((item: any) => ({
surveyQuestionId: item.surveyQuestionId, surveyQuestionId: item.surveyQuestionId,
replyValue: item.replyValue replyValue: item.replyValue,
})); }));
console.log('处理后的问卷回复:', values.coscoSupplierSurveyQuestionReply); console.log('处理后的问卷回复:', values.coscoSupplierSurveyQuestionReply);
@ -133,14 +164,14 @@ const SupplierRegister: React.FC = () => {
const response = await coscoSupplierBaseAdd(values); const response = await coscoSupplierBaseAdd(values);
if (response.success) { if (response.success) {
message.success('注册成功,请登录'); message.success(intl.formatMessage({ id: 'register.submit.success' }));
history.push('/login'); history.push('/login');
} else { } else {
message.error(response.message || '注册失败,请重试'); message.error(response.message || intl.formatMessage({ id: 'register.submit.failed' }));
} }
} catch (error) { } catch (error) {
console.error('注册出错:', error); console.error('注册出错:', error);
message.error('注册失败,请稍后重试'); message.error(intl.formatMessage({ id: 'register.submit.error' }));
} finally { } finally {
setLoading(false); setLoading(false);
} }
@ -181,10 +212,14 @@ 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={intl.formatMessage({ id: 'register.supplier.identityType' })} labelCol={{ span: 2 }} wrapperCol={{ span: 19 }}>
<Radio.Group onChange={handleSupplierTypeChange} buttonStyle="solid" value={supplierType}> <Radio.Group
<Radio.Button value="dvs">/</Radio.Button> onChange={handleSupplierTypeChange}
<Radio.Button value="ovs"></Radio.Button> buttonStyle="solid"
value={supplierType}
>
<Radio.Button value="dvs">{intl.formatMessage({ id: 'register.supplier.domestic' })}</Radio.Button>
<Radio.Button value="ovs">{intl.formatMessage({ id: 'register.supplier.foreign' })}</Radio.Button>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
@ -194,6 +229,8 @@ const SupplierRegister: React.FC = () => {
countdown={countdown} countdown={countdown}
surveyQuestions={surveyQuestions} surveyQuestions={surveyQuestions}
handleGetCaptcha={handleGetCaptcha} handleGetCaptcha={handleGetCaptcha}
currencyList={currencyList}
entTypeList={entTypeList}
/> />
) : ( ) : (
<ForeignForm <ForeignForm
@ -201,6 +238,8 @@ const SupplierRegister: React.FC = () => {
countdown={countdown} countdown={countdown}
handleGetCaptcha={handleGetCaptcha} handleGetCaptcha={handleGetCaptcha}
surveyQuestions={surveyQuestions} surveyQuestions={surveyQuestions}
currencyList={currencyList}
entTypeList={entTypeList}
/> />
)} )}
<Form.Item <Form.Item
@ -213,12 +252,12 @@ const SupplierRegister: React.FC = () => {
validator: (_, value) => validator: (_, value) =>
value value
? Promise.resolve() ? Promise.resolve()
: Promise.reject(new Error('请阅读并同意注册信息承诺书')), : Promise.reject(new Error(intl.formatMessage({ id: 'register.supplier.agreement.required' }))),
}, },
]} ]}
> >
<Checkbox> <Checkbox>
{intl.formatMessage({ id: 'register.supplier.agreement' })}
<Button <Button
type="link" type="link"
onClick={(e) => { onClick={(e) => {
@ -227,7 +266,7 @@ const SupplierRegister: React.FC = () => {
setModalVisible(true); setModalVisible(true);
}} }}
> >
{intl.formatMessage({ id: 'register.supplier.commitment' })}
</Button> </Button>
</Checkbox> </Checkbox>
</Form.Item> </Form.Item>
@ -244,7 +283,7 @@ const SupplierRegister: React.FC = () => {
{/* 注册信息承诺书弹窗 */} {/* 注册信息承诺书弹窗 */}
<Modal <Modal
title="注册信息承诺书" title={intl.formatMessage({ id: 'register.supplier.commitment.title' })}
visible={modalVisible} visible={modalVisible}
onOk={() => { onOk={() => {
console.log('点击了确定按钮'); console.log('点击了确定按钮');
@ -255,31 +294,31 @@ const SupplierRegister: React.FC = () => {
setModalVisible(false); setModalVisible(false);
}} }}
width={700} width={700}
okText="我知道了" okText={intl.formatMessage({ id: 'register.supplier.commitment.ok' })}
cancelButtonProps={{ style: { display: 'none' } }} cancelButtonProps={{ style: { display: 'none' } }}
destroyOnClose destroyOnClose
// maskClosable={false} // maskClosable={false}
> >
<div style={{ maxHeight: '60vh', overflow: 'auto' }}> <div style={{ maxHeight: '60vh', overflow: 'auto' }}>
<p></p> <p>{intl.formatMessage({ id: 'register.supplier.commitment.content.intro1' })}</p>
<p>使</p> <p>{intl.formatMessage({ id: 'register.supplier.commitment.content.intro2' })}</p>
<ol> <ol>
<li> <li>
/ {intl.formatMessage({ id: 'register.supplier.commitment.content.item1' })}
</li> </li>
<li>/</li> <li>{intl.formatMessage({ id: 'register.supplier.commitment.content.item2' })}</li>
<li> <li>
/ {intl.formatMessage({ id: 'register.supplier.commitment.content.item3' })}
</li> </li>
<li>/</li> <li>{intl.formatMessage({ id: 'register.supplier.commitment.content.item4' })}</li>
<li>/使</li> <li>{intl.formatMessage({ id: 'register.supplier.commitment.content.item5' })}</li>
<li> <li>
/ {intl.formatMessage({ id: 'register.supplier.commitment.content.item6' })}
</li> </li>
<li>/</li> <li>{intl.formatMessage({ id: 'register.supplier.commitment.content.item7' })}</li>
<li>/</li> <li>{intl.formatMessage({ id: 'register.supplier.commitment.content.item8' })}</li>
</ol> </ol>
<p></p> <p>{intl.formatMessage({ id: 'register.supplier.commitment.content.end' })}</p>
</div> </div>
</Modal> </Modal>
</div> </div>

View File

@ -2,7 +2,7 @@
* 供应商注册表单通用部分 * 供应商注册表单通用部分
* 封装了国内企业和境外企业注册表单相同的部分 * 封装了国内企业和境外企业注册表单相同的部分
*/ */
import React from 'react'; import React, { useEffect, useState } from 'react';
import { import {
Form, Form,
Input, Input,
@ -18,7 +18,10 @@ import {
} from 'antd'; } from 'antd';
import { PlusOutlined, DeleteOutlined } from '@ant-design/icons'; import { PlusOutlined, DeleteOutlined } from '@ant-design/icons';
import { message } from 'antd'; import { message } from 'antd';
import { useIntl } from 'umi';
import FileUpload from '@/components/FileUpload'; import FileUpload from '@/components/FileUpload';
import type { DictItem } from '@/servers/api/dict';
import { getDictList } from '@/servers/api/dict';
const { Option } = Select; const { Option } = Select;
@ -73,9 +76,20 @@ interface SurveySectionProps extends CommonFormSectionsProps {
* 包含资质证书类型、名称、编号、等级、发证机构、发证日期、有效期等 * 包含资质证书类型、名称、编号、等级、发证机构、发证日期、有效期等
*/ */
export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }) => { export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }) => {
const intl = useIntl();
// 资质证书类型
const [certTypeList, setCertTypeList] = useState<DictItem[]>([]);
const getDict = async () => {
// qualification_type 资质证书类型
const certTypeResponse = await getDictList('certificate');
setCertTypeList(certTypeResponse.data || []);
};
useEffect(() => {
getDict();
}, []);
return ( return (
<> <>
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.qualification' })}</div>
<Form.List name="coscoSupplierQualifications"> <Form.List name="coscoSupplierQualifications">
{(fields, { add, remove }) => ( {(fields, { add, remove }) => (
@ -92,89 +106,89 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
rowKey="key" rowKey="key"
columns={[ columns={[
{ {
title: '序号', title: intl.formatMessage({ id: 'register.form.table.no' }),
dataIndex: 'name', dataIndex: 'name',
width: 60, width: 60,
render: (_, __, index) => index + 1, render: (_, __, index) => index + 1,
}, },
{ {
title: '资质证书类型', title: intl.formatMessage({ id: 'register.qualification.certType' }),
dataIndex: 'certType', dataIndex: 'certType',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'certificateType']} name={[record.name, 'certificateType']}
noStyle noStyle
rules={[{ required: false, message: '请选择资质证书类型' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.certType.required' }) }]}
> >
<Select placeholder="请选择类型" style={{ width: '100%' }}> <Select placeholder={intl.formatMessage({ id: 'register.qualification.certType.placeholder' })} style={{ width: '100%' }}>
<Option value="机构资质"></Option> {certTypeList.map((item) => (
<Option value="CMMI资质等级">CMMI资质等级</Option> <Option key={item.code} value={item.code}>
<Option value="质量体系认证"></Option> {item.dicName}
<Option value="环境管理体系认证"></Option> </Option>
<Option value="行业资质"></Option> ))}
</Select> </Select>
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '资质名称', title: intl.formatMessage({ id: 'register.qualification.certName' }),
dataIndex: 'certName', dataIndex: 'certName',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'name']} name={[record.name, 'name']}
noStyle noStyle
rules={[{ required: false, message: '请输入资质名称' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.certName.required' }) }]}
> >
<Input placeholder="请输入资质名称" /> <Input placeholder={intl.formatMessage({ id: 'register.qualification.certName.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '资质证书编号', title: intl.formatMessage({ id: 'register.qualification.certNumber' }),
dataIndex: 'certNumber', dataIndex: 'certNumber',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'code']} name={[record.name, 'code']}
noStyle noStyle
rules={[{ required: false, message: '请输入资质证书编号' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.certNumber.required' }) }]}
> >
<Input placeholder="请输入证书编号" /> <Input placeholder={intl.formatMessage({ id: 'register.qualification.certNumber.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '资质类别和等级', title: intl.formatMessage({ id: 'register.qualification.certLevel' }),
dataIndex: 'certLevel', dataIndex: 'certLevel',
render: (_, record) => ( render: (_, record) => (
<Form.Item name={[record.name, 'typeLevel']} noStyle> <Form.Item name={[record.name, 'typeLevel']} noStyle>
<Input placeholder="请输入资质类别和等级" /> <Input placeholder={intl.formatMessage({ id: 'register.qualification.certLevel.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '发证机构', title: intl.formatMessage({ id: 'register.qualification.issuingAuthority' }),
dataIndex: 'issuingAuthority', dataIndex: 'issuingAuthority',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'authority']} name={[record.name, 'authority']}
noStyle noStyle
rules={[{ required: false, message: '请输入发证机构' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.issuingAuthority.required' }) }]}
> >
<Input placeholder="请输入发证机构" /> <Input placeholder={intl.formatMessage({ id: 'register.qualification.issuingAuthority.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '发证日期', title: intl.formatMessage({ id: 'register.qualification.issueDate' }),
dataIndex: 'issueDate', dataIndex: 'issueDate',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'dateTime']} name={[record.name, 'dateTime']}
noStyle noStyle
rules={[{ required: false, message: '请选择发证日期' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.issueDate.required' }) }]}
> >
<DatePicker <DatePicker
placeholder="年/月/日" placeholder={intl.formatMessage({ id: 'register.form.date.placeholder' })}
style={{ width: '100%' }} style={{ width: '100%' }}
format="YYYY-MM-DD" format="YYYY-MM-DD"
/> />
@ -182,16 +196,16 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
), ),
}, },
{ {
title: '资质有效期至', title: intl.formatMessage({ id: 'register.qualification.expiryDate' }),
dataIndex: 'expiryDate', dataIndex: 'expiryDate',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'termOfValidity']} name={[record.name, 'termOfValidity']}
noStyle noStyle
rules={[{ required: false, message: '请选择资质有效期' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.expiryDate.required' }) }]}
> >
<DatePicker <DatePicker
placeholder="年/月/日" placeholder={intl.formatMessage({ id: 'register.form.date.placeholder' })}
style={{ width: '100%' }} style={{ width: '100%' }}
format="YYYY-MM-DD" format="YYYY-MM-DD"
/> />
@ -199,26 +213,26 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
), ),
}, },
{ {
title: '附件', title: intl.formatMessage({ id: 'register.form.attachment' }),
dataIndex: 'certFile', dataIndex: 'certFile',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'accessory']} name={[record.name, 'accessory']}
noStyle noStyle
rules={[{ required: false, message: '请上传资质证书附件' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.qualification.attachment.required' }) }]}
valuePropName="value" valuePropName="value"
> >
<FileUpload <FileUpload
maxSize={10} maxSize={10}
allowedTypes={['pdf', 'jpg', 'jpeg', 'png']} allowedTypes={['pdf', 'jpg', 'jpeg', 'png']}
maxCount={1} maxCount={1}
buttonText="上传" buttonText={intl.formatMessage({ id: 'register.form.upload' })}
/> />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '操作', title: intl.formatMessage({ id: 'register.form.operation' }),
width: 70, width: 70,
render: (_, record) => ( render: (_, record) => (
<Button <Button
@ -227,7 +241,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
icon={<DeleteOutlined />} icon={<DeleteOutlined />}
onClick={() => remove(record.name)} onClick={() => remove(record.name)}
> >
{intl.formatMessage({ id: 'register.form.delete' })}
</Button> </Button>
), ),
}, },
@ -235,7 +249,7 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
/> />
<Form.Item style={{ marginTop: 16 }} wrapperCol={{ span: 24 }}> <Form.Item style={{ marginTop: 16 }} wrapperCol={{ span: 24 }}>
<Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}> <Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}>
{intl.formatMessage({ id: 'register.form.addRow' })}
</Button> </Button>
</Form.Item> </Form.Item>
</> </>
@ -250,72 +264,98 @@ export const QualificationSection: React.FC<CommonFormSectionsProps> = ({ form }
* 包含纳税人类型、开票抬头、纳税人识别号、开票地址等 * 包含纳税人类型、开票抬头、纳税人识别号、开票地址等
*/ */
export const InvoiceSection: React.FC<CommonFormSectionsProps> = ({ form }) => { export const InvoiceSection: React.FC<CommonFormSectionsProps> = ({ form }) => {
const intl = useIntl();
// 纳税人类型
const [taxpayerTypeList, setTaxpayerTypeList] = useState<DictItem[]>([]);
const getDict = async () => {
// taxpayer_type 纳税人类型
const taxpayerTypeResponse = await getDictList('taxpayer_type');
setTaxpayerTypeList(taxpayerTypeResponse.data || []);
};
useEffect(() => {
getDict();
}, []);
return ( return (
<> <>
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.invoice' })}</div>
<Row gutter={24}> <Row gutter={24}>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierInvoice', 'taxpayerType']} name={['coscoSupplierInvoice', 'taxpayerType']}
label="纳税人类型" label={intl.formatMessage({ id: 'register.invoice.taxpayerType' })}
rules={[{ required: true, message: '请选择纳税人类型' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.invoice.taxpayerType.required' }) }]}
> >
<Select placeholder="请选择纳税人类型"> <Select placeholder={intl.formatMessage({ id: 'register.invoice.taxpayerType.placeholder' })}>
<Option value="general"></Option> {taxpayerTypeList.map((item) => (
<Option value="small"></Option> <Option key={item.code} value={item.code}>
{item.dicName}
</Option>
))}
</Select> </Select>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierInvoice', 'head']} name={['coscoSupplierInvoice', 'head']}
label="开票抬头" label={intl.formatMessage({ id: 'register.invoice.head' })}
rules={[{ required: true, message: '请输入开票抬头' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.invoice.head.required' }) }]}
> >
<Input placeholder="请输入开票抬头" /> <Input placeholder={intl.formatMessage({ id: 'register.invoice.head.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierInvoice', 'taxpayerCode']} name={['coscoSupplierInvoice', 'taxpayerCode']}
label="纳税人识别号" label={intl.formatMessage({ id: 'register.invoice.taxpayerCode' })}
rules={[{ required: true, message: '请输入纳税人识别号' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.invoice.taxpayerCode.required' }) }]}
> >
<Input placeholder="请输入纳税人识别号" /> <Input placeholder={intl.formatMessage({ id: 'register.invoice.taxpayerCode.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierInvoice', 'address']} label="开票地址"> <Form.Item
<Input placeholder="请输入开票地址" /> name={['coscoSupplierInvoice', 'address']}
label={intl.formatMessage({ id: 'register.invoice.address' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.invoice.address.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierInvoice', 'phone']} label="开票电话"> <Form.Item
<Input placeholder="请输入开票电话" /> name={['coscoSupplierInvoice', 'phone']}
label={intl.formatMessage({ id: 'register.invoice.phone' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.invoice.phone.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierInvoice', 'bank']} label="开票户行"> <Form.Item
<Input placeholder="请输入开票银行" /> name={['coscoSupplierInvoice', 'bank']}
label={intl.formatMessage({ id: 'register.invoice.bank' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.invoice.bank.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierInvoice', 'account']} label="开票户行账号"> <Form.Item
<Input placeholder="请输入开票户行账号" /> name={['coscoSupplierInvoice', 'account']}
label={intl.formatMessage({ id: 'register.invoice.account' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.invoice.account.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierInvoice', 'qualificationCertificate']} name={['coscoSupplierInvoice', 'qualificationCertificate']}
label="一般纳税人资格证明" label={intl.formatMessage({ id: 'register.invoice.qualificationCertificate' })}
valuePropName="value" valuePropName="value"
> >
<FileUpload <FileUpload
maxSize={10} maxSize={10}
allowedTypes={['pdf', 'jpg', 'jpeg', 'png']} allowedTypes={['pdf', 'jpg', 'jpeg', 'png']}
maxCount={1} maxCount={1}
buttonText="上传文件" buttonText={intl.formatMessage({ id: 'register.form.upload' })}
/> />
</Form.Item> </Form.Item>
</Col> </Col>
@ -329,9 +369,10 @@ export const InvoiceSection: React.FC<CommonFormSectionsProps> = ({ form }) => {
* 包含开户银行、账户名称、账号、所在地区等 * 包含开户银行、账户名称、账号、所在地区等
*/ */
export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form }) => { export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form }) => {
const intl = useIntl();
return ( return (
<> <>
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.bankAccount' })}</div>
<Form.List name="coscoSupplierBank"> <Form.List name="coscoSupplierBank">
{(fields, { add, remove }) => ( {(fields, { add, remove }) => (
@ -348,62 +389,62 @@ export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form })
rowKey="key" rowKey="key"
columns={[ columns={[
{ {
title: '序号', title: intl.formatMessage({ id: 'register.form.table.no' }),
dataIndex: 'name', dataIndex: 'name',
width: 60, width: 60,
render: (_, __, index) => index + 1, render: (_, __, index) => index + 1,
}, },
{ {
title: '开户银行', title: intl.formatMessage({ id: 'register.bank.bankName' }),
dataIndex: 'bankName', dataIndex: 'bankName',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'bank']} name={[record.name, 'bank']}
noStyle noStyle
rules={[{ required: true, message: '请输入开户银行' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.bank.bankName.required' }) }]}
> >
<Input placeholder="请输入开户银行" /> <Input placeholder={intl.formatMessage({ id: 'register.bank.bankName.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '账户名称', title: intl.formatMessage({ id: 'register.bank.accountName' }),
dataIndex: 'accountName', dataIndex: 'accountName',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'accountName']} name={[record.name, 'accountName']}
noStyle noStyle
rules={[{ required: true, message: '请输入账户名称' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.bank.accountName.required' }) }]}
> >
<Input placeholder="请输入账户名称" /> <Input placeholder={intl.formatMessage({ id: 'register.bank.accountName.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '账号', title: intl.formatMessage({ id: 'register.bank.accountNumber' }),
dataIndex: 'accountNumber', dataIndex: 'accountNumber',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'account']} name={[record.name, 'account']}
noStyle noStyle
rules={[{ required: true, message: '请输入账号' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.bank.accountNumber.required' }) }]}
> >
<Input placeholder="请输入账号" /> <Input placeholder={intl.formatMessage({ id: 'register.bank.accountNumber.placeholder' })} />
</Form.Item> </Form.Item>
), ),
}, },
{ {
title: '国家、省、市', title: intl.formatMessage({ id: 'register.bank.location' }),
dataIndex: 'location', dataIndex: 'location',
render: (_, record) => ( render: (_, record) => (
<Form.Item <Form.Item
name={[record.name, 'address']} name={[record.name, 'address']}
noStyle noStyle
rules={[{ required: true, message: '请选择地址' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.bank.location.required' }) }]}
> >
<Cascader <Cascader
options={addressOptions} options={addressOptions}
placeholder="请选择省市区" placeholder={intl.formatMessage({ id: 'register.bank.location.placeholder' })}
showSearch={{ showSearch={{
filter: (inputValue, path) => { filter: (inputValue, path) => {
return path.some((option) => { return path.some((option) => {
@ -421,7 +462,7 @@ export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form })
), ),
}, },
{ {
title: '操作', title: intl.formatMessage({ id: 'register.form.operation' }),
width: 70, width: 70,
render: (_, record) => ( render: (_, record) => (
<Button <Button
@ -430,7 +471,7 @@ export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form })
icon={<DeleteOutlined />} icon={<DeleteOutlined />}
onClick={() => remove(record.name)} onClick={() => remove(record.name)}
> >
{intl.formatMessage({ id: 'register.form.delete' })}
</Button> </Button>
), ),
}, },
@ -438,7 +479,7 @@ export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form })
/> />
<Form.Item style={{ marginTop: 16 }} wrapperCol={{ span: 24 }}> <Form.Item style={{ marginTop: 16 }} wrapperCol={{ span: 24 }}>
<Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}> <Button type="dashed" onClick={() => add()} block icon={<PlusOutlined />}>
{intl.formatMessage({ id: 'register.form.addRow' })}
</Button> </Button>
</Form.Item> </Form.Item>
</> </>
@ -453,6 +494,7 @@ export const BankAccountSection: React.FC<CommonFormSectionsProps> = ({ form })
* 包含填写人信息和问卷内容 * 包含填写人信息和问卷内容
*/ */
export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuestions }) => { export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuestions }) => {
const intl = useIntl();
// 使用API获取的问卷数据如果没有则显示无数据状态 // 使用API获取的问卷数据如果没有则显示无数据状态
const hasQuestions = const hasQuestions =
surveyQuestions && Array.isArray(surveyQuestions) && surveyQuestions.length > 0; surveyQuestions && Array.isArray(surveyQuestions) && surveyQuestions.length > 0;
@ -462,71 +504,71 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
return ( return (
<> <>
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.survey' })}</div>
<div className="questionnaire-header"></div> <div className="questionnaire-header">{intl.formatMessage({ id: 'register.survey.fillerInfo' })}</div>
<Row gutter={24}> <Row gutter={24}>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierSurvey', 'supplierName']} name={['coscoSupplierSurvey', 'supplierName']}
label="供应商名称" label={intl.formatMessage({ id: 'register.survey.supplierName' })}
rules={[{ required: true, message: '请输入供应商名称' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.survey.supplierName.required' }) }]}
> >
<Input placeholder="请输入供应商名称" /> <Input placeholder={intl.formatMessage({ id: 'register.survey.supplierName.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierSurvey', 'name']} name={['coscoSupplierSurvey', 'name']}
label="姓名" label={intl.formatMessage({ id: 'register.survey.name' })}
rules={[{ required: true, message: '请输入姓名' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.survey.name.required' }) }]}
> >
<Input placeholder="请输入姓名" /> <Input placeholder={intl.formatMessage({ id: 'register.survey.name.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierSurvey', 'position']} name={['coscoSupplierSurvey', 'position']}
label="职位" label={intl.formatMessage({ id: 'register.survey.position' })}
rules={[{ required: true, message: '请输入职位' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.survey.position.required' }) }]}
> >
<Input placeholder="请输入职位" /> <Input placeholder={intl.formatMessage({ id: 'register.survey.position.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierSurvey', 'phone']} name={['coscoSupplierSurvey', 'phone']}
label="电话号" label={intl.formatMessage({ id: 'register.survey.phone' })}
rules={[{ required: true, message: '请输入电话号' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.survey.phone.required' }) }]}
> >
<Input placeholder="请输入电话号" /> <Input placeholder={intl.formatMessage({ id: 'register.survey.phone.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierSurvey', 'email']} name={['coscoSupplierSurvey', 'email']}
label="邮箱" label={intl.formatMessage({ id: 'register.survey.email' })}
rules={[ rules={[
{ type: 'email', message: '请输入有效的电子邮箱' }, { type: 'email', message: intl.formatMessage({ id: 'register.email.invalid' }) },
{ required: true, message: '请输入电子邮箱' }, { required: true, message: intl.formatMessage({ id: 'register.survey.email.required' }) },
]} ]}
> >
<Input placeholder="请输入电子邮箱" /> <Input placeholder={intl.formatMessage({ id: 'register.survey.email.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierSurvey', 'dateTime']} name={['coscoSupplierSurvey', 'dateTime']}
label="日期" label={intl.formatMessage({ id: 'register.survey.date' })}
rules={[{ required: true, message: '请选择日期' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.survey.date.required' }) }]}
> >
<DatePicker placeholder="请选择日期" style={{ width: '100%' }} format="YYYY-MM-DD" /> <DatePicker placeholder={intl.formatMessage({ id: 'register.form.date.placeholder' })} style={{ width: '100%' }} format="YYYY-MM-DD" />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>
<div className="questionnaire-header" style={{ marginTop: '20px' }}> <div className="questionnaire-header" style={{ marginTop: '20px' }}>
{intl.formatMessage({ id: 'register.survey.questionnaire' })}
</div> </div>
{hasQuestions ? ( {hasQuestions ? (
@ -549,19 +591,19 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
dataSource={surveyQuestions} dataSource={surveyQuestions}
columns={[ columns={[
{ {
title: '序号', title: intl.formatMessage({ id: 'register.form.table.no' }),
dataIndex: 'id', dataIndex: 'id',
width: 60, width: 60,
align: 'center', align: 'center',
render: (text, record, index) => index + 1, render: (text, record, index) => index + 1,
}, },
{ {
title: '问题', title: intl.formatMessage({ id: 'register.survey.question' }),
dataIndex: 'questionName', dataIndex: 'questionName',
render: (text) => <div style={{ whiteSpace: 'pre-line' }}>{text}</div>, render: (text) => <div style={{ whiteSpace: 'pre-line' }}>{text}</div>,
}, },
{ {
title: '回复', title: intl.formatMessage({ id: 'register.survey.reply' }),
width: 650, width: 650,
render: (_, record, index) => { render: (_, record, index) => {
return ( return (
@ -575,7 +617,7 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name={[index, 'replyValue']} name={[index, 'replyValue']}
rules={[{ required: true, message: `请选择问题${index + 1}的答案` }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.survey.answer.required' }, { index: index + 1 }) }]}
wrapperCol={{ span: 24 }} wrapperCol={{ span: 24 }}
> >
{record.coscoSurveyQuestionOptionList && {record.coscoSurveyQuestionOptionList &&
@ -588,7 +630,7 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
))} ))}
</Radio.Group> </Radio.Group>
) : ( ) : (
<Input placeholder="请输入回答" /> <Input placeholder={intl.formatMessage({ id: 'register.survey.answer.placeholder' })} />
)} )}
</Form.Item> </Form.Item>
</> </>
@ -602,7 +644,7 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
</Form.List> </Form.List>
) : ( ) : (
<div style={{ padding: '30px 0' }}> <div style={{ padding: '30px 0' }}>
<Empty description="暂无问卷数据" image={Empty.PRESENTED_IMAGE_SIMPLE} /> <Empty description={intl.formatMessage({ id: 'register.survey.noData' })} image={Empty.PRESENTED_IMAGE_SIMPLE} />
</div> </div>
)} )}
</> </>
@ -613,19 +655,20 @@ export const SurveySection: React.FC<SurveySectionProps> = ({ form, surveyQuesti
* 供应商反商业贿赂承诺书和其他附件部分 * 供应商反商业贿赂承诺书和其他附件部分
*/ */
export const AttachmentSection: React.FC<CommonFormSectionsProps> = ({ form }) => { export const AttachmentSection: React.FC<CommonFormSectionsProps> = ({ form }) => {
const intl = useIntl();
return ( return (
<> <>
<div className="form-section-title">贿</div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.commitment' })}</div>
<Row gutter={24}> <Row gutter={24}>
<Col span={12}> <Col span={12}>
<div className="upload-label"> <div className="upload-label">
{intl.formatMessage({ id: 'register.attachment.stampUpload' })}
<Button <Button
type="link" type="link"
href="/templates/anti-bribery-template.docx" href="/templates/anti-bribery-template.docx"
download="供应商反商业贿赂承诺书模板.docx" download="供应商反商业贿赂承诺书模板.docx"
> >
{intl.formatMessage({ id: 'register.attachment.downloadTemplate' })}
</Button> </Button>
</div> </div>
@ -650,14 +693,14 @@ export const AttachmentSection: React.FC<CommonFormSectionsProps> = ({ form }) =
<Form.Item <Form.Item
name={[field.name, 'fileUrl']} name={[field.name, 'fileUrl']}
rules={[{ required: true, message: '请上传已盖章的反商业贿赂承诺书' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.attachment.commitment.required' }) }]}
valuePropName="value" valuePropName="value"
> >
<FileUpload <FileUpload
maxSize={10} maxSize={10}
allowedTypes={['pdf', 'doc', 'docx']} allowedTypes={['pdf', 'doc', 'docx']}
maxCount={1} maxCount={1}
buttonText="上传文件" buttonText={intl.formatMessage({ id: 'register.form.upload' })}
onChange={(fileList) => { onChange={(fileList) => {
if (fileList && fileList.length > 0) { if (fileList && fileList.length > 0) {
const file = fileList[0]; const file = fileList[0];
@ -695,13 +738,13 @@ export const AttachmentSection: React.FC<CommonFormSectionsProps> = ({ form }) =
</Col> </Col>
</Row> </Row>
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.otherAttachments' })}</div>
<Row gutter={24}> <Row gutter={24}>
<Col span={24}> <Col span={24}>
<Form.List name="coscoSupplierSurveyAttachments"> <Form.List name="coscoSupplierSurveyAttachments">
{(fields, { add, remove }) => ( {(fields, { add, remove }) => (
<> <>
<div className="upload-label"></div> <div className="upload-label">{intl.formatMessage({ id: 'register.attachment.otherAttachments.hint' })}</div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<div <div
key={field.key} key={field.key}
@ -726,7 +769,7 @@ export const AttachmentSection: React.FC<CommonFormSectionsProps> = ({ form }) =
maxSize={20} maxSize={20}
allowedTypes={['*']} allowedTypes={['*']}
maxCount={1} maxCount={1}
buttonText="上传" buttonText={intl.formatMessage({ id: 'register.form.upload' })}
onChange={(fileList) => { onChange={(fileList) => {
if (fileList && fileList.length > 0) { if (fileList && fileList.length > 0) {
const file = fileList[0]; const file = fileList[0];
@ -766,7 +809,7 @@ export const AttachmentSection: React.FC<CommonFormSectionsProps> = ({ form }) =
icon={<PlusOutlined />} icon={<PlusOutlined />}
style={{ marginTop: 8 }} style={{ marginTop: 8 }}
> >
{intl.formatMessage({ id: 'register.attachment.addMore' })}
</Button> </Button>
</> </>
)} )}

View File

@ -2,7 +2,9 @@
import React from 'react'; import React from 'react';
import { Form, Input, Button, Select, DatePicker, Row, Col, message } from 'antd'; import { Form, Input, Button, Select, DatePicker, Row, Col, message } from 'antd';
import { MobileOutlined, MailOutlined, EnvironmentOutlined } from '@ant-design/icons'; import { MobileOutlined, MailOutlined, EnvironmentOutlined } from '@ant-design/icons';
import { useIntl } from 'umi';
import FileUpload from '@/components/FileUpload'; import FileUpload from '@/components/FileUpload';
import type { DictItem } from '@/servers/api/dict';
/** /**
* 引入通用表单组件 * 引入通用表单组件
@ -25,6 +27,8 @@ interface DomesticFormProps {
countdown: number; countdown: number;
handleGetCaptcha: () => void; handleGetCaptcha: () => void;
surveyQuestions?: API.SurveyQuestionResponse; // 本身就是数组类型 surveyQuestions?: API.SurveyQuestionResponse; // 本身就是数组类型
currencyList: DictItem[];
entTypeList: DictItem[];
} }
/** /**
@ -37,93 +41,98 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
countdown, countdown,
handleGetCaptcha, handleGetCaptcha,
surveyQuestions, surveyQuestions,
currencyList,
entTypeList,
}) => { }) => {
const intl = useIntl();
return ( return (
<> <>
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.basicInfo' })}</div>
{/* 营业执照附件和有效期 */} {/* 营业执照附件和有效期 */}
<Row gutter={24}> <Row gutter={24}>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'enterpriseType']} name={['coscoSupplierBase', 'enterpriseType']}
label="企业类型" label={intl.formatMessage({ id: 'register.domestic.enterpriseType' })}
rules={[{ required: true, message: '请选择企业类型' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.enterpriseType.required' }) }]}
valuePropName="value" valuePropName="value"
> >
<Select placeholder="请选择企业类型"> <Select placeholder={intl.formatMessage({ id: 'register.domestic.enterpriseType.placeholder' })}>
<Option value="limited"></Option> {entTypeList.map((item) => (
<Option value="joint"></Option> <Option key={item.code} value={item.code}>
<Option value="individual"></Option> {item.dicName}
<Option value="other"></Option> </Option>
))}
</Select> </Select>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'licenceAccessory']} name={['coscoSupplierBase', 'licenceAccessory']}
label="营业执照附件" label={intl.formatMessage({ id: 'register.domestic.licenceAccessory' })}
rules={[{ required: true, message: '请上传营业执照附件' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.licenceAccessory.required' }) }]}
valuePropName="value" valuePropName="value"
> >
<FileUpload <FileUpload
maxSize={10} maxSize={10}
allowedTypes={['pdf', 'jpg', 'jpeg', 'png']} allowedTypes={['pdf', 'jpg', 'jpeg', 'png']}
maxCount={1} maxCount={1}
buttonText="上传文件" buttonText={intl.formatMessage({ id: 'register.form.upload' })}
tip="支持PDF、JPG、PNG格式不超过10MB" tip={intl.formatMessage({ id: 'register.domestic.licenceAccessory.tip' })}
/> />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'licenceDate']} name={['coscoSupplierBase', 'licenceDate']}
label="营业执照有效期" label={intl.formatMessage({ id: 'register.domestic.licenceDate' })}
rules={[{ required: true, message: '请选择营业执照有效期' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.licenceDate.required' }) }]}
> >
<DatePicker placeholder="请选择日期" style={{ width: '100%' }} format="YYYY-MM-DD" /> <DatePicker placeholder={intl.formatMessage({ id: 'register.form.date.placeholder' })} style={{ width: '100%' }} format="YYYY-MM-DD" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'name']} name={['coscoSupplierBase', 'name']}
label="企业名称" label={intl.formatMessage({ id: 'register.domestic.companyName' })}
rules={[{ required: true, message: '请输入企业名称' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.companyName.required' }) }]}
> >
<Input placeholder="请输入企业名称" /> <Input placeholder={intl.formatMessage({ id: 'register.domestic.companyName.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'nameEn']} name={['coscoSupplierBase', 'nameEn']}
label="企业英文名" label={intl.formatMessage({ id: 'register.domestic.companyNameEn' })}
rules={[{ required: false, message: '请输入企业英文名' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.domestic.companyNameEn.required' }) }]}
> >
<Input placeholder="请输入企业英文名" /> <Input placeholder={intl.formatMessage({ id: 'register.domestic.companyNameEn.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'socialCreditCode']} name={['coscoSupplierBase', 'socialCreditCode']}
label="统一社会信用代码" label={intl.formatMessage({ id: 'register.domestic.socialCreditCode' })}
rules={[ rules={[
{ required: true, message: '请输入统一社会信用代码' }, { required: true, message: intl.formatMessage({ id: 'register.domestic.socialCreditCode.required' }) },
{ pattern: /^[0-9A-HJ-NPQRTUWXY]{18}$/, message: '请输入正确的统一社会信用代码' }, { pattern: /^[0-9A-HJ-NPQRTUWXY]{18}$/, message: intl.formatMessage({ id: 'register.domestic.socialCreditCode.pattern' }) },
]} ]}
> >
<Input placeholder="请输入正确的统一社会信用代码" /> <Input placeholder={intl.formatMessage({ id: 'register.domestic.socialCreditCode.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24} className="ant-form-item-label-fix"> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'range']} name={['coscoSupplierBase', 'range']}
label="经营范围" label={intl.formatMessage({ id: 'register.domestic.businessScope' })}
rules={[{ required: true, message: '请输入经营范围' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.businessScope.required' }) }]}
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
> >
<TextArea <TextArea
placeholder="金融专用产品、广告传媒" placeholder={intl.formatMessage({ id: 'register.domestic.businessScope.placeholder' })}
rows={2} rows={2}
maxLength={200} maxLength={200}
showCount showCount
@ -136,91 +145,94 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
name={['coscoSupplierBase', 'regAddress']} name={['coscoSupplierBase', 'regAddress']}
label="注册地址" label={intl.formatMessage({ id: 'register.domestic.regAddress' })}
rules={[{ required: true, message: '请输入注册地址' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.regAddress.required' }) }]}
> >
<Input prefix={<EnvironmentOutlined />} placeholder="上海市普陀区XX路1888号" /> <Input prefix={<EnvironmentOutlined />} placeholder={intl.formatMessage({ id: 'register.domestic.regAddress.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24} className="ant-form-item-label-fix"> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'workAddress']} name={['coscoSupplierBase', 'workAddress']}
label="办公地址" label={intl.formatMessage({ id: 'register.domestic.workAddress' })}
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
> >
<Input <Input
prefix={<EnvironmentOutlined />} prefix={<EnvironmentOutlined />}
placeholder="请具体注明省、市、区、路、门牌号" placeholder={intl.formatMessage({ id: 'register.domestic.workAddress.placeholder' })}
/> />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24} className="ant-form-item-label-fix"> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'parentCompanyInvestor']} name={['coscoSupplierBase', 'parentCompanyInvestor']}
label="母公司/出资人" label={intl.formatMessage({ id: 'register.domestic.parentCompany' })}
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
> >
<Input placeholder="请输入母公司或出资人信息" /> <Input placeholder={intl.formatMessage({ id: 'register.domestic.parentCompany.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'legalPerson']} name={['coscoSupplierBase', 'legalPerson']}
label="企业法定代表人" label={intl.formatMessage({ id: 'register.domestic.legalPerson' })}
rules={[{ required: true, message: '请输入企业法定代表人/负责人' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.legalPerson.required' }) }]}
> >
<Input placeholder="张三" /> <Input placeholder={intl.formatMessage({ id: 'register.domestic.legalPerson.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierBase', 'idCard']} label="联系人证件号码"> <Form.Item
<Input placeholder="请填写联系人正确的身份证号" /> name={['coscoSupplierBase', 'idCard']}
label={intl.formatMessage({ id: 'register.domestic.idCard' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.domestic.idCard.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'capital']} name={['coscoSupplierBase', 'capital']}
label="注册资本" label={intl.formatMessage({ id: 'register.domestic.capital' })}
rules={[{ required: true, message: '请输入注册资本' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.capital.required' }) }]}
> >
<Input type="number" placeholder="请输入金额" addonBefore="人民币" addonAfter="万元" /> <Input type="number" placeholder={intl.formatMessage({ id: 'register.domestic.capital.placeholder' })} addonBefore="人民币" addonAfter="万元" />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsName']} name={['coscoSupplierBase', 'contactsName']}
label="联系人姓名" label={intl.formatMessage({ id: 'register.domestic.contactsName' })}
rules={[{ required: true, message: '请输入联系人姓名' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.domestic.contactsName.required' }) }]}
> >
<Input placeholder="请输入联系人姓名" /> <Input placeholder={intl.formatMessage({ id: 'register.domestic.contactsName.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsPhone']} name={['coscoSupplierBase', 'contactsPhone']}
label="联系人手机" label={intl.formatMessage({ id: 'register.domestic.contactsPhone' })}
rules={[ rules={[
{ required: true, message: '请输入联系人手机号' }, { required: true, message: intl.formatMessage({ id: 'register.domestic.contactsPhone.required' }) },
{ pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号' }, { pattern: /^1[3-9]\d{9}$/, message: intl.formatMessage({ id: 'register.domestic.contactsPhone.pattern' }) },
]} ]}
> >
<Input prefix={<MobileOutlined />} placeholder="请输入11位手机号码" /> <Input prefix={<MobileOutlined />} placeholder={intl.formatMessage({ id: 'register.domestic.contactsPhone.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name="captcha" name="captcha"
label="验证码" label={intl.formatMessage({ id: 'register.captcha.label' })}
rules={[{ required: true, message: '请输入验证码' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.captcha.required' }) }]}
> >
<Row gutter={8}> <Row gutter={8}>
<Col span={14}> <Col span={14}>
<Input placeholder="请输入短信验证码" /> <Input placeholder={intl.formatMessage({ id: 'register.captcha.placeholder' })} />
</Col> </Col>
<Col span={10}> <Col span={10}>
<Button <Button
@ -229,7 +241,7 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
disabled={countdown > 0} disabled={countdown > 0}
onClick={handleGetCaptcha} onClick={handleGetCaptcha}
> >
{countdown > 0 ? `${countdown}s` : '获取验证码'} {countdown > 0 ? `${countdown}s` : intl.formatMessage({ id: 'register.captcha.get' })}
</Button> </Button>
</Col> </Col>
</Row> </Row>
@ -239,18 +251,21 @@ const DomesticForm: React.FC<DomesticFormProps> = ({
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsEmail']} name={['coscoSupplierBase', 'contactsEmail']}
label="联系人邮箱" label={intl.formatMessage({ id: 'register.domestic.contactsEmail' })}
rules={[ rules={[
{ type: 'email', message: '请输入有效的电子邮箱' }, { type: 'email', message: intl.formatMessage({ id: 'register.email.invalid' }) },
{ required: true, message: '请输入电子邮箱' }, { required: true, message: intl.formatMessage({ id: 'register.domestic.contactsEmail.required' }) },
]} ]}
> >
<Input prefix={<MailOutlined />} placeholder="请输入企业联系电话" /> <Input prefix={<MailOutlined />} placeholder={intl.formatMessage({ id: 'register.domestic.contactsEmail.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierBase', 'telephone']} label="固定电话"> <Form.Item
<Input placeholder="XXX@XXX.com" /> name={['coscoSupplierBase', 'telephone']}
label={intl.formatMessage({ id: 'register.domestic.telephone' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.domestic.telephone.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
</Row> </Row>

View File

@ -2,6 +2,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 { MobileOutlined, MailOutlined, EnvironmentOutlined } from '@ant-design/icons'; import { MobileOutlined, MailOutlined, EnvironmentOutlined } from '@ant-design/icons';
import { useIntl } from 'umi';
/** /**
* 引入通用表单组件 * 引入通用表单组件
*/ */
@ -12,6 +13,7 @@ import {
SurveySection, SurveySection,
AttachmentSection, AttachmentSection,
} from './CommonFormSections'; } from './CommonFormSections';
import type { DictItem } from '@/servers/api/dict';
const { Option } = Select; const { Option } = Select;
const { TextArea } = Input; const { TextArea } = Input;
@ -21,6 +23,8 @@ interface ForeignFormProps {
countdown: number; countdown: number;
handleGetCaptcha: () => void; handleGetCaptcha: () => void;
surveyQuestions?: API.SurveyQuestionResponse; // 本身就是数组类型 surveyQuestions?: API.SurveyQuestionResponse; // 本身就是数组类型
currencyList: DictItem[];
entTypeList: DictItem[];
} }
/** /**
@ -33,115 +37,127 @@ const ForeignForm: React.FC<ForeignFormProps> = ({
countdown, countdown,
handleGetCaptcha, handleGetCaptcha,
surveyQuestions, surveyQuestions,
currencyList,
entTypeList,
}) => { }) => {
const intl = useIntl();
return ( return (
<> <>
{/* 境外企业特有的基本信息部分 */} {/* 境外企业特有的基本信息部分 */}
<div className="form-section-title"></div> <div className="form-section-title">{intl.formatMessage({ id: 'register.form.section.basicInfo' })}</div>
<Row gutter={24}> <Row gutter={24}>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'name']} name={['coscoSupplierBase', 'name']}
label="企业名称" label={intl.formatMessage({ id: 'register.foreign.companyName' })}
rules={[{ required: false, message: '请输入企业名称' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.foreign.companyName.required' }) }]}
> >
<Input placeholder="请输入企业名称" /> <Input placeholder={intl.formatMessage({ id: 'register.foreign.companyName.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'nameEn']} name={['coscoSupplierBase', 'nameEn']}
label="企业英文名称" label={intl.formatMessage({ id: 'register.foreign.companyNameEn' })}
rules={[{ required: true, message: '请输入企业英文名称' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.foreign.companyNameEn.required' }) }]}
> >
<Input placeholder="请输入企业英文名称" /> <Input placeholder={intl.formatMessage({ id: 'register.foreign.companyNameEn.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name="country" name="country"
label="国家/地区" label={intl.formatMessage({ id: 'register.foreign.country' })}
rules={[{ required: true, message: '请选择国家/地区' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.foreign.country.required' }) }]}
> >
<Select placeholder="请选择国家/地区"> <Select placeholder={intl.formatMessage({ id: 'register.foreign.country.placeholder' })}>
<Option value="US"></Option> <Option value="US">{intl.formatMessage({ id: 'register.foreign.country.US' })}</Option>
<Option value="UK"></Option> <Option value="UK">{intl.formatMessage({ id: 'register.foreign.country.UK' })}</Option>
<Option value="JP"></Option> <Option value="JP">{intl.formatMessage({ id: 'register.foreign.country.JP' })}</Option>
<Option value="DE"></Option> <Option value="DE">{intl.formatMessage({ id: 'register.foreign.country.DE' })}</Option>
<Option value="FR"></Option> <Option value="FR">{intl.formatMessage({ id: 'register.foreign.country.FR' })}</Option>
<Option value="AU"></Option> <Option value="AU">{intl.formatMessage({ id: 'register.foreign.country.AU' })}</Option>
<Option value="CA"></Option> <Option value="CA">{intl.formatMessage({ id: 'register.foreign.country.CA' })}</Option>
<Option value="SG"></Option> <Option value="SG">{intl.formatMessage({ id: 'register.foreign.country.SG' })}</Option>
<Option value="HK"></Option> <Option value="HK">{intl.formatMessage({ id: 'register.foreign.country.HK' })}</Option>
<Option value="OTHER"></Option> <Option value="OTHER">{intl.formatMessage({ id: 'register.foreign.country.OTHER' })}</Option>
</Select> </Select>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'vat']} name={['coscoSupplierBase', 'vat']}
label="税号" label={intl.formatMessage({ id: 'register.foreign.vat' })}
rules={[{ required: false, message: '请输入税号' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.foreign.vat.required' }) }]}
> >
<Input placeholder="请输入税号" /> <Input placeholder={intl.formatMessage({ id: 'register.foreign.vat.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24} className="ant-form-item-label-fix"> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'workAddress']} name={['coscoSupplierBase', 'workAddress']}
label="办公地址" label={intl.formatMessage({ id: 'register.foreign.workAddress' })}
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
> >
<Input prefix={<EnvironmentOutlined />} placeholder="请具体注明" /> <Input prefix={<EnvironmentOutlined />} placeholder={intl.formatMessage({ id: 'register.foreign.workAddress.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={24} className="ant-form-item-label-fix"> <Col span={24} className="ant-form-item-label-fix">
<Form.Item <Form.Item
name={['coscoSupplierBase', 'range']} name={['coscoSupplierBase', 'range']}
label="经营范围" label={intl.formatMessage({ id: 'register.foreign.businessScope' })}
labelCol={{ span: 2 }} labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }} wrapperCol={{ span: 22 }}
rules={[{ required: true, message: '请输入经营范围' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.foreign.businessScope.required' }) }]}
> >
<TextArea placeholder="请输入经营范围" rows={2} maxLength={200} showCount /> <TextArea
placeholder={intl.formatMessage({ id: 'register.foreign.businessScope.placeholder' })}
rows={2}
maxLength={200}
showCount
/>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item name={['coscoSupplierBase', 'parentCompanyInvestor']} label="母公司/出资人"> <Form.Item
<Input placeholder="请输入母公司或出资人信息" /> name={['coscoSupplierBase', 'parentCompanyInvestor']}
label={intl.formatMessage({ id: 'register.foreign.parentCompany' })}
>
<Input placeholder={intl.formatMessage({ id: 'register.foreign.parentCompany.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'legalPerson']} name={['coscoSupplierBase', 'legalPerson']}
label="企业法定代表人" label={intl.formatMessage({ id: 'register.foreign.legalPerson' })}
rules={[{ required: false, message: '请输入企业法定代表人' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.foreign.legalPerson.required' }) }]}
> >
<Input placeholder="请输入企业法定代表人" /> <Input placeholder={intl.formatMessage({ id: 'register.foreign.legalPerson.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item label="注册资本" required style={{ marginBottom: 0 }}> <Form.Item label={intl.formatMessage({ id: 'register.foreign.capital' })} required style={{ marginBottom: 0 }}>
<Input.Group compact style={{ display: 'flex' }}> <Input.Group compact style={{ display: 'flex' }}>
<Form.Item name="currency" 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> {currencyList.map((item) => (
<Option value="EUR"></Option> <Option key={item.code} value={item.code}>
<Option value="GBP"></Option> {item.dicName}
<Option value="JPY"></Option> </Option>
<Option value="HKD"></Option> ))}
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'capital']} name={['coscoSupplierBase', 'capital']}
noStyle noStyle
rules={[{ required: false, message: '请输入注册资本金额' }]} rules={[{ required: false, message: intl.formatMessage({ id: 'register.foreign.capital.required' }) }]}
> >
<Input <Input
type="number" type="number"
placeholder="请输入金额" placeholder={intl.formatMessage({ id: 'register.foreign.capital.placeholder' })}
style={{ flex: 1, borderRadius: '0 2px 2px 0', marginLeft: -1 }} style={{ flex: 1, borderRadius: '0 2px 2px 0', marginLeft: -1 }}
/> />
</Form.Item> </Form.Item>
@ -151,30 +167,30 @@ const ForeignForm: React.FC<ForeignFormProps> = ({
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsName']} name={['coscoSupplierBase', 'contactsName']}
label="联系人姓名" label={intl.formatMessage({ id: 'register.foreign.contactsName' })}
rules={[{ required: true, message: '请输入联系人姓名' }]} rules={[{ required: true, message: intl.formatMessage({ id: 'register.foreign.contactsName.required' }) }]}
> >
<Input placeholder="请输入联系人姓名" /> <Input placeholder={intl.formatMessage({ id: 'register.foreign.contactsName.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsEmail']} name={['coscoSupplierBase', 'contactsEmail']}
label="联系人邮箱" label={intl.formatMessage({ id: 'register.foreign.contactsEmail' })}
rules={[ rules={[
{ type: 'email', message: '请输入有效的电子邮箱' }, { type: 'email', message: intl.formatMessage({ id: 'register.email.invalid' }) },
{ required: true, message: '请输入电子邮箱' }, { required: true, message: intl.formatMessage({ id: 'register.foreign.contactsEmail.required' }) },
]} ]}
> >
<Input prefix={<MailOutlined />} placeholder="XXX@XXX.com" addonAfter={ <Input prefix={<MailOutlined />} placeholder={intl.formatMessage({ id: 'register.foreign.contactsEmail.placeholder' })} addonAfter={
<Button <Button
type="link" type="link"
size="small" size="small"
disabled={countdown > 0} disabled={countdown > 0}
onClick={handleGetCaptcha} onClick={handleGetCaptcha}
> >
{countdown ? `${countdown}秒后重新获取` : '获取验证码'} {countdown ? intl.formatMessage({ id: 'register.captcha.countdown' }, { count: countdown }) : intl.formatMessage({ id: 'register.captcha.get' })}
</Button> </Button>
} /> } />
</Form.Item> </Form.Item>
@ -182,26 +198,26 @@ const ForeignForm: React.FC<ForeignFormProps> = ({
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name="verificationCode" name="verificationCode"
label="验证码" label={intl.formatMessage({ id: 'register.captcha.label' })}
rules={[ rules={[
{ required: true, message: '请输入验证码' }, { required: true, message: intl.formatMessage({ id: 'register.captcha.required' }) },
{ pattern: /^\d{6}$/, message: '请输入6位数字验证码' }, { pattern: /^\d{6}$/, message: intl.formatMessage({ id: 'register.captcha.pattern' }) },
]} ]}
extra="该邮箱用于后续联系和找回密码" extra={intl.formatMessage({ id: 'register.foreign.contactsEmail.extra' })}
> >
<Input placeholder="请输入验证码" /> <Input placeholder={intl.formatMessage({ id: 'register.captcha.placeholder' })} />
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={8}> <Col span={8}>
<Form.Item <Form.Item
name={['coscoSupplierBase', 'contactsPhone']} name={['coscoSupplierBase', 'contactsPhone']}
label="联系电话" label={intl.formatMessage({ id: 'register.foreign.contactsPhone' })}
rules={[ rules={[
{ required: false, message: '请输入联系电话' } { required: false, message: intl.formatMessage({ id: 'register.foreign.contactsPhone.required' }) }
]} ]}
> >
<Input <Input
placeholder="请输入联系电话" placeholder={intl.formatMessage({ id: 'register.foreign.contactsPhone.placeholder' })}
prefix={<MobileOutlined />} prefix={<MobileOutlined />}
/> />
</Form.Item> </Form.Item>

View File

@ -36,6 +36,9 @@ export type DictItem = {
/** /**
* 获取字典列表 * 获取字典列表
* @param code 字典编码 * @param code 字典编码
* currency 币种
* entType 企业类型
* taxpayer_type 纳税人类型
* @returns 字典列表 * @returns 字典列表
*/ */
export async function getDictList(code: string): Promise<DictResponse> { export async function getDictList(code: string): Promise<DictResponse> {