From 8ddb73449928008b487738de12625c7ac5d276ec Mon Sep 17 00:00:00 2001 From: luojie <125330818@qq.com> Date: Wed, 7 Jan 2026 22:19:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:[=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86][?= =?UTF-8?q?=E6=B2=A1=E8=BE=93=E5=85=A5=E5=86=85=E5=AE=B9=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E6=A0=87=E7=BA=A2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Template/BaseInfoFormPcakge.vue | 99 +++++++++++++++++--------- src/components/Template/CustomTable.vue | 63 ++++++++++++---- src/components/Template/DecimalInput.vue | 18 ++++- src/components/Template/HandleFormItem.vue | 81 +++++++++++++++++++-- vue.config.js | 4 +- 5 files changed, 208 insertions(+), 57 deletions(-) diff --git a/src/components/Template/BaseInfoFormPcakge.vue b/src/components/Template/BaseInfoFormPcakge.vue index 57f9ef0..5544400 100644 --- a/src/components/Template/BaseInfoFormPcakge.vue +++ b/src/components/Template/BaseInfoFormPcakge.vue @@ -9,12 +9,12 @@ @@ -27,7 +27,7 @@
{{ sItem.label }}
+ @copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" :error="errors[key]" @update:error="errors[key] = false" />
@@ -36,7 +36,7 @@
其他
+ @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false" />
@@ -54,19 +54,19 @@
{{ sItem.label }}
+ @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" />
+ @copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" :error="errors[key]" @update:error="errors[key] = false" />
+ @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" />
+ @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" />
@@ -80,24 +80,24 @@
{{ sItem.label }}
+ @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" />
+ @copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" :error="errors[key]" @update:error="errors[key] = false" />
其他
+ @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false" />
+ @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> + @copy="onCopy(sItem, key)" @change="onSelectChange(sItem.subKey, $event)" :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false" />
{{ formFields[sItem.subKey] }}
@@ -108,9 +108,9 @@
+ @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> + @copy="onCopy(sItem, key)" @change="onSelectChange(sItem.subKey, $event)" :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false" />
{{ formFields[sItem.subKey] }}
@@ -152,6 +152,7 @@ export default { return { formFields: {},//表单绑定字段 allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写 + errors: {},//存储表单错误信息,用于标红提示 }; }, watch: { @@ -187,13 +188,25 @@ export default { }, onInputNumberChange(key, val){ this.formFields[key] = val; + // 清除该表单项的错误状态 + if (this.errors[key]) { + this.$set(this.errors, key, false); + } }, updateFormData(key, value){ this.formFields[key] = value; + // 清除该表单项的错误状态 + if (this.errors[key]) { + this.$set(this.errors, key, false); + } }, batchUpdateFormData(data){ Object.keys(data).forEach(key => { this.formFields[key] = data[key]; + // 清除该表单项的错误状态 + if (this.errors[key]) { + this.$set(this.errors, key, false); + } }) }, handleClickable(sItem,event){ @@ -272,12 +285,12 @@ export default { if (currentConfig.otherCode) { const { otherCode } = currentConfig; result[otherCode] = formData[otherCode] || ''; - config[otherCode] = { label: "其他", type: "input" } + config[otherCode] = { label: "其他", parentKey:key, type: "input",fillType:currentConfig.fillType,otherCode } } if (currentConfig.subKey) { const { subKey } = currentConfig; result[subKey] = formData[subKey] || ''; - config[subKey] = { label: currentConfig.label, type: currentConfig.subType } + config[subKey] = { label: currentConfig.label,subKey, type: currentConfig.subType,fillType:currentConfig.subFillType || currentConfig.fillType } } }); @@ -287,11 +300,9 @@ export default { } } }); - console.log(result,"initResult") // 更新表单字段 this.formFields = result; this.allFieldsConfig = config; - console.log(config,"config") }, //判断是否禁用 getDisabled() { @@ -313,28 +324,46 @@ export default { getFormData() { const { formFields, allFieldsConfig } = this; const { templateStatus } = this.$store.state.template; - return new Promise((resolve,reject)=>{ - for (const key in formFields) { - console.log(key,formFields[key]) - if (!formFields[key]) { - const o = allFieldsConfig[key]; - if (o.fillType == templateStatus && !o.disabled) { + + // 重置错误状态 + this.errors = {}; + const errors = {}; + let firstError = null; + for (const key in allFieldsConfig) { + if (!formFields[key]) { + const o = allFieldsConfig[key]; + if (o.label === "其他" && !this.isShowOther(formFields[o.parentKey])) { + continue + } + if (o.fillType == templateStatus && !o.disabled) { + // 标记为错误状态 + errors[key] = true; + + if (!firstError) { let prefix = ""; if (o.type === "input" || o.type === "inputNumber" || o.type === "textarea") { - prefix = "填写" + prefix = "填写"; } else { - prefix = "选择" + prefix = "选择"; } - this.$message.error(`${o.label}还未${prefix}请${prefix}后再提交`); - reject(`${o.label}还未${prefix}`); - return; + firstError = { label: o.label, prefix }; } - } } - resolve(formFields) - }) + } + // 设置错误状态 + this.errors = errors; + + return new Promise((resolve, reject) => { + if (Object.keys(errors).length > 0) { + // 显示第一个错误的提示信息 + this.$message.error(`表单内容未填完,请填写后再提交`); + reject(`${firstError.label}还未${firstError.prefix}`); + } else { + resolve(formFields); + } + }); }, getFormDataByKey(key){ return this.formFields[key]; @@ -355,6 +384,10 @@ export default { this.formFields[key] = val; // } this.$emit("select", { key, value: val }); + // 清除该表单项的错误状态 + if (this.errors[key]) { + this.$set(this.errors, key, false); + } }, //复制 onCopy(config, key) { diff --git a/src/components/Template/CustomTable.vue b/src/components/Template/CustomTable.vue index 8f51c80..cdd0b86 100644 --- a/src/components/Template/CustomTable.vue +++ b/src/components/Template/CustomTable.vue @@ -31,14 +31,14 @@