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

① 基本信息

问题描述场站状态为:待建状态,经纬度不应该校验必填
一级模块项目信息填报
二级模块/
涉及类型新型储能
严重性严重
当前状态5.1.已关闭
研发处理人周小龙
复测情况复测通过

② 问题截图

待建状态经纬度必填报错
场站状态选为“待建”,保存时报错“中心经度 zxjd 必须为十进制度或度分秒格式,当前值:undefined°undefined'undefined"”
说明:该截图(DISPIMG ID 与 Excel 第 6 行完全一致)实际展示的场站“类型”是“海上风电”,与本行“涉及类型=新型储能”不一致——这是台账里同一缺陷被复制到多行的常见情况(第 6 行报的是集中式新能源/海上风电类型,本行是研发确认该问题在新型储能类型下同样复现后追加登记,复用了同一张证据图)。下文按“新型储能”类型在 backup730/730backup 代码中的实际情况分析。

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

xnybw5b / src/main/java/cn/csg/so/oms/in/newenergy/project/appservice/ProjectImplAppService.java 第 1176 - 1183 行
xnybw5b / src/main/java/cn/csg/so/oms/in/newenergy/common/validation/ProjectCoordinateValidator.java 第 48 - 70 行(validateImpl 方法)
xnybw5f / src/views/projectNew/components/baseInfo/components/stationInfo.vue 第 113 行(中心经度表单项)、第 410-416 行(proStatus 计算属性)

④ 代码现状与修复方案

前端(backup730)stationInfo.vue 第 410-416 行的 proStatus 计算属性只在场站状态 item.proStatus == "4"(在建)时返回 true,第 113 行 中心经度 表单项的 :required="proStatus" 因此在“待建”(值为 "3")时正确地不标记必填——前端这部分逻辑本身没问题

computed: {
  proStatus() {
    if (this.item.proStatus && this.item.proStatus == "4") {  // 第411行:只认"在建"
      return true;
    } else {
      return false;  // 待建(3)/已投产(5) 都不要求必填
    }
  },
},

后端(730backup)才是真正报错来源ProjectImplAppService.java 第 1176 行触发坐标校验的条件是按项目类型(type)判断,与场站状态(proStatus/待建-在建-已投产)完全无关:

for (ProjectImplVo vo : projectImplVos) {
    if (StrUtil.equalsAny(vo.getType(),"集中式","海上风电","集中式光伏")){   // 第1177行:只按类型过滤,不看场站状态
        ProjectCoordinateValidationResult coordinateValidationResult = ProjectCoordinateValidator.validate(proVo);
        ProjectCoordinateValidator.validate(proVo);   // 第1179行:重复调用了两次,属另一处小瑕疵
        if (!coordinateValidationResult.isPassed()) {
            throw new ServiceException(coordinateValidationResult.getMessage(),500);
        }
    }
    ...

ProjectCoordinateValidator.validateImpl()(第 48-70 行)内部同样没有读取 implVo.getProStatus(),只要 zxjd/zxwd 为空或格式不对就直接判失败:

String longitudeText = trim(implVo.getZxjd());
if (longitudeText == null) {
    return ProjectCoordinateValidationResult.failure("中心经度 zxjd 不能为空");   // 第56行,未按 proStatus 豁免
}
...
if (longitude == null) {
    return ProjectCoordinateValidationResult.failure("中心经度 zxjd 必须为十进制度或度分秒格式,当前值:" + longitudeText);  // 第65行,截图报错原文
}
经核对 ProjectImplVosrc/main/java/.../project/vo/ProjectImplVo.java 第35行)本身已有 proStatus 字段可直接读取——只是 ProjectCoordinateValidator 没有使用它。同时注意:第 1177 行的类型白名单里不包含“新型储能”,也就是说按当前 backup730/730backup 代码,“新型储能”类型的场站保存时其实不会触发这条坐标校验,报错更可能来自“集中式/海上风电/集中式光伏”类型(与截图证据吻合)。若新型储能场站在生产环境确实复现过同样报错,说明当时线上版本与本快照存在差异,或新型储能场站在另一条相似的存量场站/关联机组保存链路上有等价校验逻辑,建议一并核实 src/views/projectNew/components/baseInfo/components/stationInfoXXCN.vue 对应的储能场站保存接口是否也做了未按状态区分的坐标必填校验。

建议修复方式:在触发校验的判断条件和 ProjectCoordinateValidator 内部同时加入“待建豁免”,两处任一遗漏都会导致本缺陷复现:

if (StrUtil.equalsAny(vo.getType(),"集中式","海上风电","集中式光伏")){
if (StrUtil.equalsAny(vo.getType(),"集中式","海上风电","集中式光伏","新型储能")
        && !"3".equals(vo.getProStatus())) {   // 待建(3)不校验坐标
    ProjectCoordinateValidationResult coordinateValidationResult = ProjectCoordinateValidator.validate(proVo);
    if (!coordinateValidationResult.isPassed()) {
        throw new ServiceException(coordinateValidationResult.getMessage(),500);
    }
}

同时建议把重复调用的 ProjectCoordinateValidator.validate(proVo);(第1179行)这一行冗余代码一并删除,避免无意义的双重校验开销。