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

① 基本信息

问题描述选择在役时,退役时间未置空
一级模块实际并网信息
二级模块项目基本信息
涉及类型中压分布式新能源
台账标注区域五区
严重性严重
是否阻断流程
当前状态2.1.待开发
研发处理人陈文琛
处理状态待调整

② 问题截图

批次状态在役但退役时间未清空
"批次并网信息"表格中,"批次状态"已选为"在役",但同一行"退役时间"仍显示"2026-08-02"未被清空

③ 旧代码涉及的项目文件及行数(backup730 分支)

xnybw5f / src/views/projectNew/components/actualInfo/components/pgu_mvdne.vue 第 56-77 行(批次状态下拉框 / 退役时间日期选择器模板)、第 336-343 行(inputCapa 方法内 field=='state' 分支)

④ 代码现状与修复方案

"批次状态"下拉框切换时会触发 inputCapa($event, index, 'state')

<template #state-column="scope">
  <el-select v-model="scope.row.state" ... @change="inputCapa($event, scope.row.index -1, 'state')">...</el-select>   // 第58-61行
</template>
<template #endtime-column="scope">
  <el-date-picker v-model="scope.row.endtime"
    :disabled="viewFlag || !scope.row.state || scope.row.state === '在役' || scope.row.status == '删除'"   // 第75行:选中"在役"后日期框会被禁用
    @change="inputCapa($event, scope.row.index -1, 'endtime')" ... />
</template>

inputCapa()field == 'state' 分支的处理逻辑:

} else if (field == 'state') {
  let endtime = this.station.powerList[index]['endtime'];
  if (e == '退役' && !endtime) {
    this.$message.warning('请填写退役时间');
  } else {
    this.$set(this.station.powerList[index], 'endtime', null)   // 第341行:切到"在役"时理论上会执行到这里,把endtime清空
    this.getPowerChangeTypeData(index);
  }
}
从这段代码的分支逻辑看,切换到"在役"(e !== '退役')会落入 else 分支,本应endtime 置空——但这个 else 分支同时也覆盖了"e=='退役' 且已经填过退役时间"这种情况(此时 !endtime 为 false,同样会进入 else),意味着只要用户在"退役"状态下先前已经填过退役时间,再触发一次 state 变更事件(例如二次点击下拉框选中同一个"退役"选项),这段代码就会把刚填好的退役时间又清空掉——这说明该分支的判断条件本身设计得比较脆弱、覆盖不全,同一段代码在"往在役切"和"往退役切且已有值"两种场景下会有相互矛盾的副作用,可靠性存疑。截图中"在役 + 退役时间未清空"复现的具体触发路径(究竟是 @change 事件未被触发,还是保存接口把前端已经置空的值又还原回去了),仅凭本仓库前端代码不能 100% 排除是提交保存环节把该字段过滤掉未落库导致——这一层未能在后端定位到对应"批次并网信息"保存接口的确切 Mapper 文件,如实说明。

建议修复方式:把"往在役切"和"往退役切"两种意图分开处理,不要共用同一个宽泛的 else 分支,避免相互影响:

} else if (field == 'state') {
  if (e === '退役') {
    let endtime = this.station.powerList[index]['endtime'];
    if (!endtime) {
      this.$message.warning('请填写退役时间');
    }
    // 已有退役时间的,保持不变,不再清空
  } else if (e === '在役') {
    // 明确只在切回"在役"时才清空退役时间
    this.$set(this.station.powerList[index], 'endtime', null)
  }
  this.getPowerChangeTypeData(index);
}

同时建议排查"批次并网信息"保存/提交接口对应的后端更新 Mapper,确认其 UPDATE 语句是否对 endtime 之类字段使用了 <if test="endtime != null"> 这种"传空值就跳过该列更新"的动态 SQL 写法——这是本仓库中其它 Mapper(如 NeDpArcBaseSQL.xml 的级联查询条件片段)里出现过的同类写法模式,若保存该批次记录的 Mapper 也是这种写法,会导致前端已经正确置空的 endtime 无法真正同步到数据库,需要研发按实际调用链路重新核实确认。