| 问题描述 | 项目通过删除按钮删除之后,新增同项目名称的项目,出现"项目名已存在,请重新编辑!",新增不了项目的情况。 |
| 所属模块 | 项目信息填报 / - |
| 严重程度 | 严重(阻断流程:是) |
| 涉及类型 | 全部类型 |
| 提出人 | 刘向诚 |
| 处理人 / 状态 | 周小龙 / 2.1.待开发(待调整) |


① 前端删除入口 —— xnybw5f@backup730:src/views/projectNew/projectNewList.vue 第 494-529 行 _deleteBatch(goalRow),调用:
projectBaseApi.deleteBatchImpl(param).then(res => { // 第519行
this.$message.info('删除成功')
this.getDataList(this.searchForm) // 重新查询列表,刷新后"看不到"该项目
})
② 后端删除实现 —— xnybw5b@730backup:src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/ProjectImplAppService.java 第 1749-1839 行 deleteBatchImpl(ProjectVo vo),方法开头有一段非常关键的设计注释(第 1770-1774 行):
//删除机组
//删除批次
//删除场站
//删除场站项目关联
//删除项目 <-- 第1774行:设计上明确要"删除项目"这一步
但往下看整个方法的唯一一处落库操作(第 1836 行):
Map<String, Object> params = new HashMap<>();
params.put("implIdList", implIdList);
getCapBaseCommonDAO().update(
"cn.csg.so.oms.in.newenergy.project.model.NePjImplVO_updateDelFlagByIds", params); // 第1836行:只对"场站(impl)"记录做软删除
return "删除成功"; // 第1838行:直接返回成功,此后再无任何代码
NePjImplVO,对应表 SO_IN_NE_PJ_IMPL)执行了 DEL_FLAG=1 的软删除(第 1809 行 impl.setDelFlag("1") + 第 1836 行批量更新),从未处理项目主表 SO_IN_NE_PJ(对应模型 NePjVO,含 PLAN_NAME 字段)——该表既没有被删除,也没有任何 DEL_FLAG 类字段可供标记(经查 NePjVO.java 与 NePjSQL_mysql.xml 均无 DEL_FLAG 相关定义)。projectBaseApi.addOrUpdatePro → 后端 ProjectImplAppService.java 第 1158 行 checkProjectName(planName, opType, planId)(实现见第 1590-1607 行),其查询 SQL NePjSQL_mysql.xml:NePjVO_selectByPlanName(第 47-71 行)为:SELECT ... FROM SO_IN_NE_PJ WHERE PLAN_NAME = #{planName} -- 没有任何 DEL_FLAG 过滤条件
SO_IN_NE_PJ 里的项目行,这条 SQL 依然能查到"已删除"项目的那一行,checkProjectName 判定为重名,第 1159 行返回 "项目名已存在,请重新编辑!",用户因此无法用同名重新新增。修复代码文件:xnybw5b@730backup:src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/ProjectImplAppService.java,在 deleteBatchImpl(第 1836 行更新 impl DEL_FLAG 之后、第 1838 行 return "删除成功" 之前)补上注释里原本设计但缺失的"删除项目"步骤:
getCapBaseCommonDAO().update(
"cn.csg.so.oms.in.newenergy.project.model.NePjImplVO_updateDelFlagByIds", params);
// 新增:级联检查 —— 若该项目(planId)下已无任何未删除的场站(impl)记录,则一并清理项目主表,
// 避免项目名残留导致后续无法用同名重新新增
for (String planId : planIdList) {
GetProjectAdjustQueryParam checkParam = new GetProjectAdjustQueryParam();
checkParam.setApplyPlanIdList(Collections.singletonList(planId));
checkParam.setPageNum(1);
checkParam.setPageSize(1);
IPage<NePjImplVO> remain = selectAll(checkParam); // 复用本方法上文已使用的查询
boolean noActiveImplLeft = remain.getRecords().stream()
.noneMatch(item -> !"1".equals(item.getDelFlag()));
if (noActiveImplLeft) {
Map<String, Object> delProjectParams = new HashMap<>();
delProjectParams.put("id", planId);
getCapBaseCommonDAO().delete(
"cn.csg.so.oms.in.newenergy.project.model.NePjVO_deleteById", delProjectParams);
}
}
return "删除成功";
并在 NePjSQL_mysql.xml(对应 NePjSQL_dm.xml 同步补充)中新增一条按 ID 删除项目主表记录的 SQL:
<!-- 根据ID删除项目 -->
<delete id="NePjVO_deleteById" parameterType="string">
DELETE FROM SO_IN_NE_PJ WHERE ID = #{id}
</delete>
备选方案:若担心物理删除影响历史审计/统计报表,也可为 SO_IN_NE_PJ 表新增 DEL_FLAG 字段做软删除,并同步在 NePjVO_selectByPlanName 查询中加上 AND (DEL_FLAG IS NULL OR DEL_FLAG != '1') 过滤条件——两种方案均可解决重名误判问题,物理删除实现更简单,软删除更利于留痕,建议与数据库管理员确认后二选一。
checkProjectName 不会再命中"僵尸"记录,"项目名已存在,请重新编辑!"的误报将不再出现。