|
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
|
|
approveEnterpriseReview,
|
|
|
|
|
archivePlatformTenant,
|
|
|
|
|
changePlatformTenantStatus,
|
|
|
|
|
checkPlatformTenantContactPhone,
|
|
|
|
|
createPlatformTenant,
|
|
|
|
|
createPlatformTenantImpersonation,
|
|
|
|
|
downloadTenantQualification,
|
|
|
|
@@ -148,11 +147,14 @@ const rules: FormRules = {
|
|
|
|
|
tenantName: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
|
|
|
|
|
legalName: [{ required: true, message: '请输入营业执照上的企业名称', trigger: 'blur' }],
|
|
|
|
|
legalRepresentative: [{ required: true, message: '请输入法定代表人姓名', trigger: 'blur' }],
|
|
|
|
|
unifiedSocialCreditCode: [{ pattern: /^[0-9A-Z]{18}$/, message: '请输入 18 位大写字母或数字', trigger: 'blur' }],
|
|
|
|
|
unifiedSocialCreditCode: [
|
|
|
|
|
{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' },
|
|
|
|
|
{ pattern: /^[0-9A-Z]{18}$/, message: '请输入 18 位大写字母或数字', trigger: 'blur' },
|
|
|
|
|
],
|
|
|
|
|
contactName: [{ required: true, message: '请输入联系人姓名', trigger: 'blur' }],
|
|
|
|
|
contactPhone: [
|
|
|
|
|
{ required: true, message: '请输入联系电话', trigger: 'blur' },
|
|
|
|
|
{ pattern: /^[0-9-]{4,32}$/, message: '请输入 4-32 位数字或连字符,联系电话将作为登录用户名', trigger: 'blur' },
|
|
|
|
|
{ required: true, message: '请输入公司联系电话', trigger: 'blur' },
|
|
|
|
|
{ pattern: /^[0-9-]{4,32}$/, message: '请输入 4-32 位数字或连字符', trigger: 'blur' },
|
|
|
|
|
],
|
|
|
|
|
contactEmail: [{ type: 'email', message: '请输入有效邮箱地址', trigger: 'blur' }],
|
|
|
|
|
servicePackage: [{ required: true, message: '请选择客户套餐', trigger: 'change' }],
|
|
|
|
@@ -171,7 +173,7 @@ const decisionRules: FormRules = {
|
|
|
|
|
function newQualificationDrafts(): QualificationDraft[] {
|
|
|
|
|
const definitions: Array<Pick<QualificationDraft, 'type' | 'label' | 'required'>> = [
|
|
|
|
|
{ type: 'BUSINESS_LICENSE', label: '营业执照', required: true },
|
|
|
|
|
{ type: 'LEGAL_PERSON_ID', label: '法人身份证', required: true },
|
|
|
|
|
{ type: 'LEGAL_PERSON_ID', label: '法人身份证', required: false },
|
|
|
|
|
{ type: 'FREIGHT_FORWARDER_CERTIFICATE', label: '货代资质证书', required: false },
|
|
|
|
|
{ type: 'BANK_ACCOUNT_LICENSE', label: '银行开户许可证', required: false },
|
|
|
|
|
]
|
|
|
|
@@ -221,23 +223,16 @@ const uploadingQualifications = computed(() => qualifications.value.some((item)
|
|
|
|
|
const hasSelectedQualifications = computed(() => qualifications.value.some((item) => item.file))
|
|
|
|
|
const selectedBusinessLicense = computed(() => qualifications.value.find((item) => item.type === 'BUSINESS_LICENSE')?.file)
|
|
|
|
|
const selectedLegalPersonId = computed(() => qualifications.value.find((item) => item.type === 'LEGAL_PERSON_ID')?.file)
|
|
|
|
|
const requiredPackageChangeSelected = computed(() => Boolean(selectedBusinessLicense.value || selectedLegalPersonId.value))
|
|
|
|
|
const requiredPackageFilesSelected = computed(() => Boolean(selectedBusinessLicense.value && selectedLegalPersonId.value))
|
|
|
|
|
const creditCodeReadyForSave = computed(() => requiredPackageChangeSelected.value
|
|
|
|
|
? requiredPackageFilesSelected.value && (creditCodeEstablished.value
|
|
|
|
|
|| unifiedSocialCreditCodePattern.test(form.value.unifiedSocialCreditCode || ''))
|
|
|
|
|
: creditCodeEstablished.value)
|
|
|
|
|
const requiredQualificationPackageComplete = computed(() => creditCodeReadyForSave.value
|
|
|
|
|
&& (requiredPackageChangeSelected.value
|
|
|
|
|
? requiredPackageFilesSelected.value
|
|
|
|
|
: qualifications.value.filter((item) => item.required).every((item) => item.uploaded)))
|
|
|
|
|
const businessLicenseReadyForSave = computed(() => Boolean(selectedBusinessLicense.value
|
|
|
|
|
|| qualifications.value.find((item) => item.type === 'BUSINESS_LICENSE')?.uploaded))
|
|
|
|
|
const creditCodeReadyForSave = computed(() => creditCodeEstablished.value
|
|
|
|
|
|| unifiedSocialCreditCodePattern.test(form.value.unifiedSocialCreditCode || ''))
|
|
|
|
|
const requiredQualificationPackageComplete = computed(() => businessLicenseReadyForSave.value && creditCodeReadyForSave.value)
|
|
|
|
|
const missingQualificationPackageItems = computed(() => {
|
|
|
|
|
const businessLicense = qualifications.value.find((item) => item.type === 'BUSINESS_LICENSE')
|
|
|
|
|
const legalPersonId = qualifications.value.find((item) => item.type === 'LEGAL_PERSON_ID')
|
|
|
|
|
const missing: string[] = []
|
|
|
|
|
if (requiredPackageChangeSelected.value ? !businessLicense?.file : !businessLicense?.uploaded) missing.push('营业执照')
|
|
|
|
|
if (!creditCodeReadyForSave.value) missing.push('18位统一社会信用代码(需随必填资质包保存)')
|
|
|
|
|
if (requiredPackageChangeSelected.value ? !legalPersonId?.file : !legalPersonId?.uploaded) missing.push('法人身份证')
|
|
|
|
|
if (!businessLicense?.file && !businessLicense?.uploaded) missing.push('营业执照')
|
|
|
|
|
if (!creditCodeReadyForSave.value) missing.push('18位统一社会信用代码(需随营业执照保存)')
|
|
|
|
|
return missing
|
|
|
|
|
})
|
|
|
|
|
const hasUnsavedChanges = computed(() => Boolean(editingId.value) && JSON.stringify(form.value) !== savedFormSnapshot.value)
|
|
|
|
@@ -512,27 +507,38 @@ async function uploadSelectedQualifications(tenantId: string) {
|
|
|
|
|
const failures: string[] = []
|
|
|
|
|
const businessLicense = qualifications.value.find((item) => item.type === 'BUSINESS_LICENSE')
|
|
|
|
|
const legalPersonId = qualifications.value.find((item) => item.type === 'LEGAL_PERSON_ID')
|
|
|
|
|
if (requiredPackageChangeSelected.value && businessLicense?.file && legalPersonId?.file) {
|
|
|
|
|
businessLicense.uploading = true; legalPersonId.uploading = true
|
|
|
|
|
businessLicense.error = ''; legalPersonId.error = ''
|
|
|
|
|
const businessLicenseFile = businessLicense?.file || null
|
|
|
|
|
const legalPersonIdFile = legalPersonId?.file || null
|
|
|
|
|
if (businessLicense && businessLicenseFile) {
|
|
|
|
|
businessLicense.uploading = true
|
|
|
|
|
if (legalPersonIdFile && legalPersonId) legalPersonId.uploading = true
|
|
|
|
|
businessLicense.error = ''
|
|
|
|
|
if (legalPersonId) legalPersonId.error = ''
|
|
|
|
|
try {
|
|
|
|
|
const uploaded = await uploadPlatformTenantRequiredQualificationPackage(
|
|
|
|
|
tenantId, businessLicense.file, legalPersonId.file, form.value.unifiedSocialCreditCode,
|
|
|
|
|
businessLicense.uploaded, legalPersonId.uploaded,
|
|
|
|
|
tenantId, businessLicenseFile, legalPersonIdFile, form.value.unifiedSocialCreditCode,
|
|
|
|
|
businessLicense.uploaded, Boolean(legalPersonIdFile && legalPersonId?.uploaded),
|
|
|
|
|
)
|
|
|
|
|
businessLicense.uploaded = true; legalPersonId.uploaded = true
|
|
|
|
|
if (legalPersonIdFile && !uploaded.legalPersonIdDocumentUrl) throw new Error('法人身份证上传结果缺少文件地址')
|
|
|
|
|
businessLicense.uploaded = true
|
|
|
|
|
creditCodeEstablished.value = true
|
|
|
|
|
businessLicense.uploadedName = businessLicense.file.name
|
|
|
|
|
legalPersonId.uploadedName = legalPersonId.file.name
|
|
|
|
|
businessLicense.uploadedName = businessLicenseFile.name
|
|
|
|
|
businessLicense.documentUrl = uploaded.businessLicenseDocumentUrl
|
|
|
|
|
legalPersonId.documentUrl = uploaded.legalPersonIdDocumentUrl
|
|
|
|
|
businessLicense.file = null; legalPersonId.file = null
|
|
|
|
|
businessLicense.file = null
|
|
|
|
|
if (legalPersonIdFile && legalPersonId) {
|
|
|
|
|
legalPersonId.uploaded = true
|
|
|
|
|
legalPersonId.uploadedName = legalPersonIdFile.name
|
|
|
|
|
legalPersonId.documentUrl = uploaded.legalPersonIdDocumentUrl || ''
|
|
|
|
|
legalPersonId.file = null
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
const message = getApiErrorMessage(error, '必填资质包上传失败,请重试')
|
|
|
|
|
businessLicense.error = message; legalPersonId.error = message
|
|
|
|
|
failures.push('必填资质包')
|
|
|
|
|
const message = getApiErrorMessage(error, '营业执照及统一社会信用代码保存失败,请重试')
|
|
|
|
|
businessLicense.error = message
|
|
|
|
|
if (legalPersonIdFile && legalPersonId) legalPersonId.error = message
|
|
|
|
|
failures.push('营业执照资质')
|
|
|
|
|
} finally {
|
|
|
|
|
businessLicense.uploading = false; legalPersonId.uploading = false
|
|
|
|
|
businessLicense.uploading = false
|
|
|
|
|
if (legalPersonId) legalPersonId.uploading = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (const draft of failures.length ? [] : qualifications.value.filter((item) => !item.required && item.file)) {
|
|
|
|
|