① 基本信息
| 问题描述 | 计划并网审核通过之后,在项目基本信息页面修改批次的"本批次预计首台机组接入电网时间、本批次预计末台机组接入电网时间"调整后增加了跨年,计划并网信息页面的年度没有增加 |
|---|---|
| 一级模块 | 计划并网信息 |
| 二级模块 | / |
| 涉及类型 | 全部类型 |
| 所属区域 | 不确定或共性 |
| 严重性 | 严重 |
| 当前状态 | 2.1.待开发 |
| 研发处理人 | 冷柏烨 |
| 处理说明 | 已调整待验证 |
② 问题截图
③ 旧代码涉及的项目文件及行数
xnybw5b / src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/JhbwAppService.java
第 762-795 行 findDetailMap(计划并网信息年度列表的核心计算方法,决定跨年后是否补齐新年度)
public Map<String, List<NePjImplDetailVO>> findDetailMap(List<NePjImplVO> implList) {
for (NePjImplVO impl : implList) {
List<NePjImplDetailVO> detailList = new ArrayList<>();
String bakPstatus = impl.getBakPstatus(); // 项目状态:无效项目0 有效项目1
String type = impl.getType();
if (StrUtil.equals(bakPstatus, "0")|| ProjectTypeConstant.isZYFBSXNY(type) || ProjectTypeConstant.isSWZ(type)) {
// 只有"无效项目" 或 类型=中压分布式新能源 或 类型=生物质,才会执行下面的"按新批次年月补齐缺失年度"逻辑
List<NePjImplDetAdjVO> adjustList = NePjImplDetAdjAppService.listByImplId(impl.getId());
...
List<String> batchYearMonthList = impl.getBatchYearMonthList();
for (String yearMonth : batchYearMonthList) {
String year = yearMonth.substring(0, 4);
List<NePjImplDetailVO> filterDetailList = detailList.stream()
.filter(detail -> StrUtil.equals(detail.getYear(), year)).collect(Collectors.toList());
if (CollectionUtil.isEmpty(filterDetailList)) {
NePjImplDetailVO detail = new NePjImplDetailVO();
detail.setImplId(implId);
detail.setYear(year);
detailList.add(detail); // 补齐新年度的行,只在上面条件成立时才会走到这里
}
}
} else {
detailList = NePjImplDetailAppService.listByImplId(impl.getId()); // 直接返回历史已存的年度列表,不做任何"跨年补齐"
}
detailMap.put(implId, detailList);
}
return detailMap;
}
定位结论:
findDetailMap 里"按新批次时间补齐年度列表"的逻辑,只在 bakPstatus=="0"(无效项目/草稿态)或项目类型为"中压分布式新能源""生物质"这三种条件之一成立时才会执行。而本条问题描述的场景是"计划并网审核通过之后"——审核通过意味着项目状态大概率已经从"无效项目(0)"流转为"有效项目(1)";此时如果项目类型又不属于中压分布式新能源或生物质(比如集中式新能源、新型储能、海上风电等),代码会直接落入 else 分支(第789-791行),只返回数据库里已经存在的历史年度记录,完全不会比对新的 batchYearMonthList 去补齐跨年后新增的年度。这正好解释了"审核通过后调整批次时间跨年,年度没有增加",同时也解释了该记录 involved_type=全部类型——因为除中压分布式/生物质外的所有其他类型,在"有效项目"状态下都会命中这个逻辑缺口。
④ 修复代码涉及的项目文件及行数
xnybw5b / src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/JhbwAppService.java
第 770 行判断条件:去掉"项目状态/类型"的限定,改为对所有类型、所有项目状态统一执行"按批次年月补齐年度"逻辑
-if (StrUtil.equals(bakPstatus, "0")|| ProjectTypeConstant.isZYFBSXNY(type) || ProjectTypeConstant.isSWZ(type)) { +// 不再按项目状态/类型限定,"审核通过后调整批次时间跨年"对所有类型都应补齐新年度 +{ List<NePjImplDetAdjVO> adjustList = NePjImplDetAdjAppService.listByImplId(impl.getId()); if (CollectionUtil.isNotEmpty(adjustList)) { detailList = BeanUtil.copyToList(adjustList, NePjImplDetailVO.class); } else { detailList = NePjImplDetailAppService.listByImplId(impl.getId()); } List<String> batchYearMonthList = impl.getBatchYearMonthList(); for (String yearMonth : batchYearMonthList) { String year = yearMonth.substring(0, 4); List<NePjImplDetailVO> filterDetailList = detailList.stream() .filter(detail -> StrUtil.equals(detail.getYear(), year)).collect(Collectors.toList()); if (CollectionUtil.isEmpty(filterDetailList)) { NePjImplDetailVO detail = new NePjImplDetailVO(); detail.setImplId(implId); detail.setYear(year); detailList.add(detail); } } -} else { - detailList = NePjImplDetailAppService.listByImplId(impl.getId()); -} +}
⑤ 修复方案
根因是 JhbwAppService.findDetailMap(第762-795行)里"按批次预计接入电网时间补齐计划并网年度列表"的逻辑被限定在了"无效项目"或"中压分布式新能源/生物质"类型下才执行,其余类型在项目转为"有效项目"(审核通过后的常态)时完全跳过这段补齐逻辑,导致跨年调整后新年度不出现。
修复方式是去掉这个不合理的范围限定,让"批次年月→年度列表补齐"对所有项目状态、所有发电类型统一生效(该逻辑本身——按 batchYearMonthList 补齐 detailList 中缺失的年度——是正确、通用的,不需要重写,只需要去掉外层错误的 if 条件限制)。需要注意的是,本仓库另一条缺陷 Excel 第69行(生物质类型,时间调整后不在区间内的年份未自动删除)指向的是同一个方法里"只补齐、不剔除超出区间年份"的另一侧问题;两条问题建议在同一次修改中一并处理:既要在时间区间扩大(跨年)时补齐新年度,也要在时间区间缩小时剔除超出范围的旧年度。
修改前建议确认
NePjImplDetAdjAppService.listByImplId(有调整记录时的年度列表来源)是否也需要同步这部分"补齐"逻辑,避免只改了主 detailList 分支、遗漏调整记录分支。