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

Row 50:调整批次"预计首台/末台机组接入电网时间"时,未校验已有计划并网容量的月份是否被移出范围

严重 2.1.待开发 全部类型 五区 模块:项目信息填报 / 计划并网容量信息 处理人:陈文琛

1基本信息

问题描述如果计划并网有月份存在容量,在项目基本信息页面调整"本批次预计首台机组接入电网时间、本批次预计末台机组接入电网时间"时需要校验,容量大于0的月份不可被调整在范围之外。
所属模块项目信息填报 / 计划并网容量信息
严重程度严重(阻断流程:是)
涉及类型全部类型
提出人文日明
处理人 / 状态陈文琛 / 2.1.待开发(已更新待验证)

2问题截图

项目基本信息-批次预计首台末台机组接入电网时间
图1:项目基本信息 Tab → 批次信息,"本批次预计首台机组接入电网时间=2026-08-13"、"本批次预计末台机组接入电网时间=2027-07-14"(红框)
计划并网容量信息月度表格
图2:计划并网容量信息 Tab,2027年8月仍填有容量22MW(红框),已超出图1中"末台机组接入电网时间=2027-07-14"所限定的范围,但项目基本信息页面保存批次时间时未被拦截

3旧代码定位(backup730 分支)

批次时间校验目前只做"首台时间 ≤ 末台时间"的先后顺序校验,缺少"末台时间不能早于已有容量的月份"这一层校验。校验函数集中在 src/views/projectNew/components/baseInfo/js/validateProjectDetail.js,按项目类型拆成 4 份几乎相同的重复代码:

类型校验函数批次时间校验代码行
集中式新能源checkZYData(form, message)(第21行起)第 198-206 行
新型储能checkXXCNData(form, message)(第268行起)第 418-425 行
中压分布式checkData(form, message)(第483行起)第 640-647 行
生物质checkSWZData(form, message)(第705行起)约同上结构

以集中式 checkZYData 第 198-206 行为例:

if (!information.batchPredictFirstTime) {
  message.error('请输入本批次预计首台机组接入电网时间')
  return false
}
if (!information.batchPredictAllTime) {
  message.error('请输入本批次预计全容量并网时间')
  return false
} else {
  var date1 = new Date(information.batchPredictFirstTime)
  var date2 = new Date(information.batchPredictAllTime)
  if (!(date2 >= date1)) {
    message.error('本批次预计全容量并网时间必须大于等于本批次预计首次并网时间')   // 第204行
    return false
  }
  // 只校验了 date1 <= date2,没有和计划并网容量各月数据做任何交叉校验
}

调用方 —— src/views/projectNew/components/baseInfo/projectDetail.vue 第 418-445 行 saveOrUpdate(),按类型分别 await 调用上述 4 个函数之一,函数签名里只传入 form(项目基本信息表单本身),没有传入计划并网容量信息(jhbw)数据,因此校验函数即便想加逻辑也拿不到"哪些月份已经有容量"这个信息。

根因说明:
校验维度缺失:批次时间校验与计划并网容量月度数据校验分属两个完全独立的模块——前者在 projectDetail.vue(项目基本信息 Tab),后者在 jhbwDetail.vue(计划并网容量信息 Tab,参见本报告 Row 49),两者互不感知对方状态,导致用户可以在基本信息页面把末台机组接入电网时间改早,而计划并网容量页面已录入的月份容量却被静默移出了有效区间,出现截图中"2027-07-14"与"2027年8月仍有容量"并存的矛盾数据。

4修复方案

4.1 在 projectDetail.vuesaveOrUpdate()(第418行起)保存批次信息前,复用 Row 49 中已提及的 projectPlanApi.getByPlanId(planId) 接口,取回该批次对应的计划并网容量月度数据,传入校验函数。

4.2 在 validateProjectDetail.js 中新增一个公共校验函数,供 4 个 check*Data 函数统一调用(以集中式 checkZYData 第 206 行之后为例):

// validateProjectDetail.js 新增公共函数
export function checkBatchTimeAgainstPlanCapacity(information, planYearMonthMap, message) {
  // planYearMonthMap: { '2027-08': 22, '2026-08': 111, ... } 由调用方通过
  // projectPlanApi.getByPlanId 提前查询好后传入,key 为 'YYYY-MM'
  const first = new Date(information.batchPredictFirstTime)
  const last  = new Date(information.batchPredictAllTime)
  const outOfRangeMonths = Object.keys(planYearMonthMap).filter(ym => {
    const capa = planYearMonthMap[ym]
    if (!capa || capa <= 0) return false
    const d = new Date(ym + '-01')
    return d < new Date(first.getFullYear(), first.getMonth(), 1)
        || d > new Date(last.getFullYear(), last.getMonth(), 1)
  })
  if (outOfRangeMonths.length > 0) {
    message.error(
      `${outOfRangeMonths.join('、')} 已填有计划并网容量,不能将本批次时间范围调整到覆盖这些月份之外,请先在"计划并网容量信息"中调整对应月份数据`
    )
    return false
  }
  return true
}

// checkZYData 第206行 date2 >= date1 校验通过后追加:
if (!checkBatchTimeAgainstPlanCapacity(information, planYearMonthMap, message)) {
  return false
}

4.3 checkXXCNData(新型储能)、checkData(中压分布式)、checkSWZData(生物质)三处同类批次时间校验(分别约第 424 行、646 行及生物质对应位置)按同样方式接入该公共函数,避免继续复制 4 份重复逻辑。

效果:只要计划并网容量信息中某月份已填写大于0的容量,用户在项目基本信息页面就无法把批次的首台/末台机组接入电网时间调整到不覆盖该月份的范围,从根本上避免"批次时间"与"计划并网月度容量"两个页面的数据互相矛盾。