生成时间: 2026-08-03 · 数据来源: xnybw平台需求及工作计划.xlsx(南网在线绿能云缺陷跟踪表)· 仅针对 backup730/730backup 分支代码

Row 31:新型储能场站信息中,"本项目场站设计容量/设计能量"没有进行有效性校验

一般 已关闭 · 复测通过 新型储能 模块:项目信息填报 / 场站基本信息 处理人:陈键泽

1基本信息

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

2问题截图

场站设计容量/设计能量未校验
图1:红框标出"能量"(项目级,100 MWh)与"本项目场站设计能量"(场站级,300 MWh)均可任意填写,输入框仅做了正数过滤,没有范围/合理性校验

3旧代码定位(backup730 分支)

文件: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-formrules,但生成逻辑里硬编码只产出 required(非空)规则,没有为任何数值型字段(含 designCapacity/designPowerCapacity)挂载 validator;配合输入过滤函数只做字符过滤、不做上限/合理性判断,导致"设计容量/设计能量"可以填入任意正数(如 0.01、99999999),也不会与同一场站的"额定充放电倍率"(容量与能量的比例关系,本例为 0.5C,理论上 能量=容量/倍率)做交叉校验。

4修复方案

修复文件:src/views/projectNew/components/baseInfo/components/stationInfoXXCN.vue

方案一(最小改动):formRows() 生成的规则数组中,为 designCapacitydesignPowerCapacity 追加数值范围 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)
  }
},
方案二(建议一并补充):在保存/提交前追加"容量-能量-充放电倍率"交叉校验,避免出现设计能量与设计容量比例明显不合理的数据(如本例 300MWh / 50MW = 6h,若额定充放电倍率填 0.5C 理论应为 2h,存在数量级偏差):
// 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相差较大,请核实`)
  }
}
效果:"本项目场站设计容量/设计能量"从"只要非空即可保存"升级为"必须为合理范围内的正数",并对容量-能量-倍率的量纲关系给出提示,防止误填导致后续并网容量核算失真。