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


批次时间校验目前只做"首台时间 ≤ 末台时间"的先后顺序校验,缺少"末台时间不能早于已有容量的月份"这一层校验。校验函数集中在 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.1 在 projectDetail.vue 的 saveOrUpdate()(第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 份重复逻辑。