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

① 基本信息

问题描述发电单元信息新增后保存,数据消失了
一级模块新型储能
二级模块项目基础信息
涉及类型新型储能
台账标注区域五区
严重性严重
当前状态2.1.待开发
研发处理人杨智超
处理状态待调整

② 问题截图

第一批-发电单元信息表格暂无数据
"第一批-发电单元信息"表格保存后显示"暂无数据"(新增的储能单元记录已经消失)

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

xnybw5f / src/views/projectNew/components/baseInfo/components/informationListXXCN.vue 第 905-929 行(addDiaLog 新增发电单元方法,生成临时客户端ID)
xnybw5b / src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/SjbwAppService.java 第 2420-2461 行(xmxxUpdateXxcnPower,按 uuid 判断新增/更新)

④ 代码现状与修复方案

点击"新增发电单元"时,前端 addDiaLog() 往当前批次的单元列表里 push 了一条新记录,只给它设置了一个临时的 id(用于前端表格渲染时的 key),没有设置 uuid 字段

const powerEnergyProcesses = this.currentRow.powerEnergyProcesses.concat([
  {
    cndysyzbh: '#',
    electricWireName: '',
    bqzt: '在役',
    //新增设置虚拟的ID
    id: Date.now() + '_' + Math.floor(Math.random() * 10000)   // 第919-923行:只设置了id,没有设置uuid
  }
])
this.$set(this.currentRow, 'powerEnergyProcesses', powerEnergyProcesses)

保存时该数组会作为 powerEnergyProcesses 提交给后端,最终进入 SjbwAppService.xmxxUpdateXxcnPower() 做新增/更新判断,判断依据是 val.getUuid() 是否为空:

for (NePwrEnProcVO val : plist) {
    if (ObjectUtil.isEmpty(val.getUuid())) {          // 前端没传uuid,这里为空,走"新增"分支——逻辑上是对的
        val.setUuid(IdUtil.fastSimpleUUID());
        if (StrUtil.isEmpty(val.getId())) {
            val.setId(val.getUuid());
        }                                              // 但val.getId()不为空(前端塞了临时id),这里不会执行,id字段保留成前端生成的临时值
        ...
        dtj.add(val);                                  // 加入"待插入"列表
    } else if (...) { ... } else { ... }
}
if (!dtj.isEmpty()) {
    getCapBaseCommonDAO().insert("cn.csg.so.oms.in.newenergy.project.model.NePwrEnProcVO_saveBatch", dtj);   // 批量插入
}
按代码逐行推演,这条新增记录理论上会被识别为"新增"并执行批量插入(uuid 为空触发新增分支)——单纯从这段 Java 逻辑看,插入本身应该能成功,只是主键 ID 列最终存的是前端生成的非标准 UUID 格式字符串(时间戳_随机数,而不是标准 32 位 UUID),这本身是一处数据规范隐患,但未必直接导致"消失"。

结合截图"保存后表格显示暂无数据"这个现象,更可能的情况是:保存成功后,页面重新整体拉取项目详情做刷新,而刷新时的查询条件/关联字段没有正确带上本次新增单元的归属信息(例如 batchId/plantId 等归属字段前端在 addDiaLog() 里没有一并补全,只给了 cndysyzbh/electricWireName/bqzt/id 四个字段,其余归属字段要等到调用保存接口时才由后端 ProjectImplAppService 统一补上,见 powerEnergyProcess.setBatchId(informationId) 等赋值),如果补全归属字段的时机与"保存后刷新页面重新查询"的时机没有完全对齐(例如刷新查询发生在批量插入真正提交事务之前,或查询条件没有匹配上新插入行的归属字段),前端展示就会出现"新增数据保存后又查不到"的现象。受限于仅做静态代码审查、未做运行时联调验证,这一步的确切触发时序未能 100% 定位,如实说明。

建议修复方式:

  1. 前端 addDiaLog() 新增记录时不要自造非标准格式的 id,改为不设置该字段(或用标准 UUID 库生成),避免与后端 uuid 判断逻辑产生歧义;
  2. 核实"保存"接口返回成功后,页面刷新逻辑拉取的数据源与后端批量插入的事务提交时机是否存在竞态(建议保存接口返回时机放在插入事务真正提交之后,前端拿到成功响应再触发刷新,不要并行/提前刷新);
  3. 建议研发在测试环境复现该步骤时打开浏览器网络面板,核对"保存"请求的响应体和紧随其后的"详情查询"请求的响应体,直接确认新增单元是否真的写入了数据库,以便快速判断是持久化问题还是纯前端展示/时序问题。