① 基本信息
| 问题描述 | 选择在役时,退役时间未置空 |
|---|---|
| 一级模块 | 实际并网信息 |
| 二级模块 | 项目基本信息 |
| 涉及类型 | 中压分布式新能源 |
| 台账标注区域 | 五区 |
| 严重性 | 严重 |
| 是否阻断流程 | 是 |
| 当前状态 | 2.1.待开发 |
| 研发处理人 | 陈文琛 |
| 处理状态 | 待调整 |
② 问题截图
③ 旧代码涉及的项目文件及行数(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 无法真正同步到数据库,需要研发按实际调用链路重新核实确认。