| 问题描述 | 新型储能场站信息中,"本项目场站设计容量"没有进行校验(截图中可见相邻"本项目场站设计能量"同样只做了简单的数字过滤,未做取值范围/合理性校验)。 |
| 所属模块 | 项目信息填报 / 场站基本信息(新型储能场站表单) |
| 严重程度 | 一般(阻断流程:是) |
| 涉及类型 | 新型储能 |
| 提出人 | 刘向诚 |
| 处理人 / 状态 | 陈键泽 / 5.1.已关闭(复测通过) |

文件:src/views/projectNew/components/baseInfo/components/stationInfoXXCN.vue
第 115-136 行,"本项目场站设计容量" / "本项目场站设计能量" 表单项:
<el-form-item :required="proStatus" label="本项目场站设计容量" prop="designCapacity" class="blue-check">
<el-input ref="designCapacity" v-model="item.designCapacity" clearable :disabled="readOnly"
maxlength="10" @input="handlePositiveNumberInput3">
<template slot="append">MW</template>
</el-input>
</el-form-item>
<el-form-item :required="proStatus" label="本项目场站设计能量" prop="designPowerCapacity" class="blue-check">
<el-input ref="designPowerCapacity" v-model="item.designPowerCapacity" clearable :disabled="readOnly"
maxlength="10" @input="handlePositiveNumberInput2">
<template slot="append">MWh</template>
</el-input>
</el-form-item>
第 393-431 行,校验规则完全通过 formRows(rulesList) 批量生成,只生成"必填"规则,不含任何数值格式/范围 validator:
rulesList: [
...
{ type: "input", label: "本项目场站设计容量", prop: "designCapacity", proStatus: "1" },
{ type: "input", label: "本项目场站设计能量", prop: "designPowerCapacity", proStatus: "1" },
...
],
...
formRows(list) {
for (let i = 0; i < list.length; i++) {
const item = list[i];
let message = item.type == "input" ? `请输入${item.label}` : `请选择${item.label}`;
const arr = [{
required: item.proStatus ? this.proStatus : true,
message: message,
trigger: ["blur", "change"],
}];
this.$set(this.rules, item.prop, arr); // 只有 required,没有 validator
}
},
第 522-533 行,输入过滤函数只做"去除非数字字符/只保留一个小数点/去掉负号",不限制最大值、不校验与相邻字段的合理关系:
handlePositiveNumberInput(value) {
let filtered = value.replace(/[^0-9.]/g, '')
filtered = filtered.replace(/\.{2,}/g, '.').replace(/^(\d+\.\d*)\..*$/, '$1')
filtered = filtered.replace(/^\./, '0.')
filtered = filtered.replace(/^-/, '')
return filtered
},
rulesList 数组批量声明并由 formRows() 统一生成 el-form 的 rules,但生成逻辑里硬编码只产出 required(非空)规则,没有为任何数值型字段(含 designCapacity/designPowerCapacity)挂载 validator;配合输入过滤函数只做字符过滤、不做上限/合理性判断,导致"设计容量/设计能量"可以填入任意正数(如 0.01、99999999),也不会与同一场站的"额定充放电倍率"(容量与能量的比例关系,本例为 0.5C,理论上 能量=容量/倍率)做交叉校验。修复文件:src/views/projectNew/components/baseInfo/components/stationInfoXXCN.vue
formRows() 生成的规则数组中,为 designCapacity、designPowerCapacity 追加数值范围 validator,与既有"必填"规则合并:const NUMERIC_RANGE_RULES = {
designCapacity: { min: 0.01, max: 9999999, label: '本项目场站设计容量' },
designPowerCapacity: { min: 0.01, max: 9999999, label: '本项目场站设计能量' },
}
formRows(list) {
for (let i = 0; i < list.length; i++) {
const item = list[i]
const message = item.type == "input" ? `请输入${item.label}` : `请选择${item.label}`
const arr = [{
required: item.proStatus ? this.proStatus : true,
message,
trigger: ["blur", "change"],
}]
const range = NUMERIC_RANGE_RULES[item.prop]
if (range) {
arr.push({
validator: (rule, value, callback) => {
if (value === '' || value === undefined || value === null) return callback()
const num = Number(value)
if (isNaN(num) || num <= 0) {
return callback(new Error(`${range.label}必须为大于0的数值`))
}
if (num > range.max) {
return callback(new Error(`${range.label}超出合理范围(不能超过 ${range.max})`))
}
callback()
},
trigger: ['blur', 'change'],
})
}
this.$set(this.rules, item.prop, arr)
}
},
// getValidate() 中,表单基础校验通过后追加
if (this.item.designCapacity && this.item.designPowerCapacity && this.item.edcfdbl) {
const ratio = Number(this.item.designPowerCapacity) / Number(this.item.designCapacity)
const expect = 1 / Number(this.item.edcfdbl)
if (Math.abs(ratio - expect) / expect > 0.5) { // 偏差超过50%时提示
this.$message.warning(`设计能量/设计容量=${ratio.toFixed(2)}h,与额定充放电倍率折算的${expect.toFixed(2)}h相差较大,请核实`)
}
}