From 3c6582c0ec3d265982775c1582ad751e780c8393 Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Thu, 8 Oct 2026 12:20:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E6=B3=A8=E5=86=8C=E4=B8=8E?= =?UTF-8?q?=E8=B5=84=E8=B4=A8=E8=A1=A8=E5=8D=95=E6=96=B0=E5=A2=9E=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E6=88=B7=E4=BF=A1=E6=81=AF=E4=B8=8E=E5=8F=91=E7=A5=A8?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HjcEnterpriseForm.vue:新增账户名称/账号/开户银行/开户支行四个输入与发票类型单选 (VAT_SPECIAL 电子专票 / VAT_NORMAL 电子普票,无默认值),模板 + validate + buildPayload + fill 四处同步 - 账号只做长度与字符校验(^[0-9]{8,32}$),与后端 validateRegister 一致,不加真实性校验 - 必填提示点名到具体项:请填写基本户账户名称 / 开户银行 / 开户支行,未选发票类型提示「请选择发票类型」 - register.vue、tender/qualification.vue 表单初值补齐 5 个字段 - 回显兼容 bank_account_name 与 bankAccountName 两种键名 --- app/components/HjcEnterpriseForm.vue | 96 +++++++++++++++++++++++++++- app/pages/register.vue | 6 ++ app/pages/tender/qualification.vue | 6 ++ 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/app/components/HjcEnterpriseForm.vue b/app/components/HjcEnterpriseForm.vue index 5599045..411d8c7 100644 --- a/app/components/HjcEnterpriseForm.vue +++ b/app/components/HjcEnterpriseForm.vue @@ -27,6 +27,59 @@ +

+ 基本户信息与发票类型 +

+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+

经办人信息

@@ -115,6 +168,18 @@ const ocrHints = reactive>({ license: '', idcard_front: ' /** 材料类型:仅身份证人像面与营业执照需要 OCR */ const OCR_TYPES = ['license', 'idcard_front'] +/** + * 发票类型:单选、**无默认值**、必选。取值与后端 `hjc_invoice.invoice_type` 口径一致, + * 不要另起字符串字面量(与 h5 端 components/EnterpriseForm.vue 保持一致)。 + */ +const INVOICE_TYPES = [ + { value: 'VAT_SPECIAL', label: '电子专票' }, + { value: 'VAT_NORMAL', label: '电子普票' } +] + +/** 基本户账号:与后端 validateRegister 一致,仅做长度与字符校验(纯数字 8-32 位) */ +const BANK_ACCOUNT_NO_RE = /^[0-9]{8,32}$/ + async function onPick(m: any, e: Event) { const input = e.target as HTMLInputElement const file = input.files?.[0] @@ -192,12 +257,16 @@ function removeImage(m: any) { if (ocrHints[m.materialType] !== undefined) ocrHints[m.materialType] = '' } -/** 必填校验:企业联系电话、企业地址选填,其余必填;4 类证件必传 */ +/** 必填校验:企业联系电话、企业地址选填,其余必填(含基本户 4 项与发票类型);4 类证件必传 */ function validate(): boolean { + const f = form.value const required: Array<[string, string]> = [ ['name', '企业名称'], ['creditCode', '纳税人识别号'], ['contactEmail', '企业邮箱'], + ['bankAccountName', '基本户账户名称'], + ['bankName', '开户银行'], + ['bankBranch', '开户支行'], ['agentName', '经办人姓名'], ['idCardNo', '经办人身份证号'], ['agentEmail', '经办人邮箱'], @@ -206,11 +275,21 @@ function validate(): boolean { ] if (props.showPassword) required.unshift(['password', '登录密码']) for (const [key, label] of required) { - if (!form.value[key]) { + if (!String(f[key] ?? '').trim()) { uniToast(`请填写${label}`) return false } } + // 账号:空值已在上面的必填循环里点名提示;这里只负责长度与字符 + if (!BANK_ACCOUNT_NO_RE.test(String(f.bankAccountNo ?? '').trim())) { + uniToast('基本户账号只能为 8-32 位数字') + return false + } + // 发票类型无默认值,未选时提交前拦截 + if (!INVOICE_TYPES.some((t) => t.value === f.invoiceType)) { + uniToast('请选择发票类型') + return false + } if (materials.value.some((m: any) => !m.fileUrl)) { uniToast('请上传全部证件') return false @@ -225,7 +304,7 @@ function normalizeDateTime(v: string) { return s.length === 16 ? `${s}:00` : s } -/** 提交用载荷(含证件材料,授权到期时间已规范化为后端格式) */ +/** 提交用载荷(含基本户与发票类型、证件材料,授权到期时间已规范化为后端格式) */ function buildPayload() { const f = form.value return { @@ -234,6 +313,11 @@ function buildPayload() { contactPhone: f.contactPhone, contactEmail: f.contactEmail, address: f.address, + bankAccountName: f.bankAccountName, + bankAccountNo: f.bankAccountNo, + bankName: f.bankName, + bankBranch: f.bankBranch, + invoiceType: f.invoiceType, agentName: f.agentName, agentEmail: f.agentEmail, agentPhone: f.agentPhone, @@ -256,6 +340,12 @@ function fill(data: any) { f.contactPhone = data.contactPhone || '' f.contactEmail = data.contactEmail || '' f.address = data.address || '' + // 兼容后端列名风格(bank_account_name)与 Java 属性风格(bankAccountName)两种回显键 + f.bankAccountName = data.bankAccountName ?? data.bank_account_name ?? '' + f.bankAccountNo = data.bankAccountNo ?? data.bank_account_no ?? '' + f.bankName = data.bankName ?? data.bank_name ?? '' + f.bankBranch = data.bankBranch ?? data.bank_branch ?? '' + f.invoiceType = data.invoiceType ?? data.invoice_type ?? '' f.agentName = data.agentName || '' f.idCardNo = data.idCardNo || '' f.agentEmail = data.agentEmail || '' diff --git a/app/pages/register.vue b/app/pages/register.vue index 43570c1..63444c0 100644 --- a/app/pages/register.vue +++ b/app/pages/register.vue @@ -109,6 +109,12 @@ const form = ref>({ address: '', contactPhone: '', contactEmail: '', + bankAccountName: '', + bankAccountNo: '', + bankName: '', + bankBranch: '', + // 发票类型:单选、无默认值(未选时提交被拦截) + invoiceType: '', agentName: '', idCardNo: '', agentEmail: '', diff --git a/app/pages/tender/qualification.vue b/app/pages/tender/qualification.vue index 715c4f6..eddc68f 100644 --- a/app/pages/tender/qualification.vue +++ b/app/pages/tender/qualification.vue @@ -62,6 +62,12 @@ const form = ref>({ contactPhone: '', contactEmail: '', address: '', + bankAccountName: '', + bankAccountNo: '', + bankName: '', + bankBranch: '', + // 发票类型:单选、无默认值(未选时提交被拦截) + invoiceType: '', agentName: '', idCardNo: '', agentEmail: '',