From 7d97be64500c9b1715735cd62a0c0deebc7e589b Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 2 Sep 2026 10:15:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/CompanyProfileView.vue | 20 ++++++++++++++----- .../tenant-management/views/MembersView.vue | 2 +- .../views/TenantAdministrationViews.test.mjs | 6 +++++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/modules/tenant-management/views/CompanyProfileView.vue b/src/modules/tenant-management/views/CompanyProfileView.vue index a1a1227..e9ea571 100644 --- a/src/modules/tenant-management/views/CompanyProfileView.vue +++ b/src/modules/tenant-management/views/CompanyProfileView.vue @@ -83,6 +83,7 @@ const normalizedQualificationCertificateNo = computed(() => qualificationCertifi const draftCreditCodeValid = computed(() => unifiedSocialCreditCodePattern.test(normalizedQualificationCertificateNo.value)) const businessLicenseFileSelected = computed(() => Boolean(qualificationDraftItem('BUSINESS_LICENSE')?.file)) const legalPersonIdFileSelected = computed(() => Boolean(qualificationDraftItem('LEGAL_PERSON_ID')?.file)) +const standaloneLegalPersonIdUnsupported = computed(() => legalPersonIdFileSelected.value && !businessLicenseFileSelected.value) const requiredPackageChangeSelected = computed(() => businessLicenseFileSelected.value) const requiredPackageFilesSelected = computed(() => businessLicenseFileSelected.value) const qualificationCreditCodeReady = computed(() => requiredPackageChangeSelected.value @@ -90,7 +91,6 @@ const qualificationCreditCodeReady = computed(() => requiredPackageChangeSelecte : companyCreditCodeValid.value) const qualificationCreditCodeError = computed(() => { if (qualificationCreditCodeReady.value) return '' - if (legalPersonIdFileSelected.value && !businessLicenseFileSelected.value) return '法人身份证需与本次营业执照一起保存' if (draftCreditCodeValid.value && !requiredPackageFilesSelected.value) return '统一社会信用代码必须随营业执照共同保存' return '请输入18位字母或数字组成的统一社会信用代码' }) @@ -122,11 +122,11 @@ const qualificationUploadDisabledReason = computed(() => { const selectedQualificationCount = computed(() => qualificationDrafts.filter((item) => Boolean(item.file)).length) const canSaveQualificationBatch = computed(() => canUploadQualification.value && selectedQualificationCount.value > 0 - && (!legalPersonIdFileSelected.value || businessLicenseFileSelected.value) + && !standaloneLegalPersonIdUnsupported.value && requiredPackageComplete.value) const qualificationSaveDisabledReason = computed(() => { if (!canUploadQualification.value) return qualificationUploadDisabledReason.value - if (legalPersonIdFileSelected.value && !businessLicenseFileSelected.value) return '法人身份证需与本次营业执照一起保存' + if (standaloneLegalPersonIdUnsupported.value) return '法人身份证为选填项;当前文件服务尚未开放单独保存,请取消本次选择后保存其他资质。' if (!requiredPackageComplete.value) return `请完整保存必填业务项:${missingRequiredPackageItems.value.join('、')}` if (!selectedQualificationCount.value) return '当前没有需要保存的变更' return '' @@ -150,7 +150,10 @@ const profileFormRules: FormRules = { companyName: [{ required: true, whitespace: true, message: '请输入公司名称', trigger: 'blur' }], legalRepresentative: [{ required: true, whitespace: true, message: '请输入法人姓名', trigger: 'blur' }], contactName: [{ required: true, whitespace: true, message: '请输入联系人姓名', trigger: 'blur' }], - contactPhone: [{ required: true, whitespace: true, message: '请输入公司联系电话', trigger: 'blur' }], + contactPhone: [ + { required: true, whitespace: true, message: '请输入公司联系电话', trigger: 'blur' }, + { pattern: /^[0-9-]{4,32}$/, message: '公司联系电话仅支持 4–32 位数字或连字符', trigger: 'blur' }, + ], contactEmail: [{ type: 'email', message: '请输入正确的联系邮箱', trigger: 'blur' }], } const qualificationColumns: DataTableColumn[] = [ @@ -337,6 +340,13 @@ async function submitQualification() { ElMessage.warning(qualificationUploadDisabledReason.value) return } + if (standaloneLegalPersonIdUnsupported.value) { + const legalPersonId = qualificationDraftItem('LEGAL_PERSON_ID') + const message = '当前文件服务尚未开放法人身份证单独上传或替换,该选填文件未提交。' + if (legalPersonId) { legalPersonId.error = message; legalPersonId.uploadState = 'error' } + ElMessage.warning(message) + return + } if (!requiredPackageComplete.value) { const businessLicense = qualificationDraftItem('BUSINESS_LICENSE') if (businessLicense && !qualificationCreditCodeReady.value) businessLicense.error = qualificationCreditCodeError.value @@ -571,7 +581,7 @@ function closeQualificationPreview() {

联系信息

- 仅用于公司业务联系,不会修改任何成员的登录手机号。 + 仅用于公司业务联系,不会修改任何成员的登录手机号。
diff --git a/src/modules/tenant-management/views/MembersView.vue b/src/modules/tenant-management/views/MembersView.vue index 4d09626..ff9d29a 100644 --- a/src/modules/tenant-management/views/MembersView.vue +++ b/src/modules/tenant-management/views/MembersView.vue @@ -199,7 +199,7 @@ async function resetPassword(member: TenantMember) { -
用于该成员手机号登录;修改后会同步认证账号。
+
用于该成员手机号登录;修改后会同步认证账号并退出该成员现有会话。
请通过安全渠道将初始密码交给成员;前端不会保存或再次展示该密码。
diff --git a/src/modules/tenant-management/views/TenantAdministrationViews.test.mjs b/src/modules/tenant-management/views/TenantAdministrationViews.test.mjs index a0d53f1..2816e3d 100644 --- a/src/modules/tenant-management/views/TenantAdministrationViews.test.mjs +++ b/src/modules/tenant-management/views/TenantAdministrationViews.test.mjs @@ -72,6 +72,9 @@ test('implements company details, contact information and qualification workflow assert.match(profileSource, /银行开户许可证'.*required: false/) assert.match(profileSource, /requiredQualificationTypes\.every/) assert.doesNotMatch(profileSource, /四类必填资质/) + assert.doesNotMatch(profileSource, /法人身份证需与本次营业执照一起保存/) + assert.match(profileSource, /const standaloneLegalPersonIdUnsupported = computed/) + assert.match(profileSource, /当前文件服务尚未开放法人身份证单独上传或替换,该选填文件未提交/) assert.match(profileSource, /qualificationUploadErrorMessage\(error\)/) assert.match(profileSource, /submitTenantQualificationReview/) assert.match(profileSource, /提交企业审核/) @@ -97,6 +100,7 @@ test('implements company details, contact information and qualification workflow assert.match(profileSource, /
公司联系电话<\/dt>
\{\{ store\.company\.contactPhone/) assert.match(profileSource, /label="公司联系电话" prop="contactPhone" required/) assert.match(profileSource, /不会修改任何成员的登录手机号/) + assert.match(profileSource, /pattern: \/\^\[0-9-\]\{4,32\}\$\//) assert.doesNotMatch(profileSource, /
联系电话<\/dt>
\{\{ store\.company\.contactPhone/) assert.match(storeSource, /expiresAt: item\.validTo \|\| '长期有效'/) }) @@ -141,7 +145,7 @@ test('implements member list, role assignment, password reset and status control assert.doesNotMatch(membersSource, /member-metrics/) assert.match(membersSource, /label="登录手机号" prop="phone"/) assert.match(membersSource, /登录手机号 \/ 邮箱/) - assert.match(membersSource, /用于该成员手机号登录;修改后会同步认证账号/) + assert.match(membersSource, /用于该成员手机号登录;修改后会同步认证账号并退出该成员现有会话/) assert.match(membersSource, /phone: \[\{ pattern: \/\^1\[3-9\]\\d\{9\}\$\//) assert.doesNotMatch(membersSource, /label="联系电话" prop="phone"/) })