学期新增的时候校验校历功能点添加,否则会有大量的数据重复生成

This commit is contained in:
2026-09-14 17:24:56 +08:00
parent 52a04dbf60
commit 5187435285
9 changed files with 352 additions and 87 deletions
@@ -304,26 +304,24 @@ export default {
this.$message.warning('学期详情获取失败,请确认学期数据')
})
},
// 从后端拉取本学期校历事件,渲染到对应时间格(年度由 6 位学期代号截取前 4 位)
// XQXLB 的 nd 存的是「年份」(如 2026),春/夏/秋三学期共用同一批年度记录;
// 从后端拉取本学期校历事件,渲染到对应时间格。
// XQXLB 的 nd 存 6 位学期代号(如 202601),与 this.xqxlbNd 一致;
// 后端 updateById 只能改已存在的 bh,所以每个格子必须有预生成的记录才能存。
// 若本学期日期区间 [kxrq, jsrq] 内还没有任何占位记录(首次进入该学期),
// 调用 /xqxlb/add 只按本学期 kxrq/jsrq 预生成这一张网格,再重新拉取,
// 这样后续 /xqxlb/update 的 updateById 才能命中每一格。(区间有覆盖则跳过,幂等)
// 每次进入都调一次 /xqxlb/add 补齐网格:后端已幂等,只会插入缺失的格子,
// 既不重复插入也不覆盖已有标记。这样即便区间只被部分覆盖,
// 也不会出现「格子没有 bh → /xqxlb/update 静默失效」。
loadXqxlbEvents() {
const fetchList = () => listXqxlb({ nd: this.xqxlbNd }).then(res => {
const data = res.data
return Array.isArray(data) ? data : (data && data.records) || []
})
fetchList().then(list => {
const hasCoverage = list.some(item => this.isInRange(item.jqsj))
if (!hasCoverage && this.startDate && this.endDate) {
const startStr = fmtDate(this.startDate)
const endStr = fmtDate(this.endDate)
return addXqxlb(startStr, endStr).then(() => fetchList())
const ensureGrid = () => {
if (!this.startDate || !this.endDate) {
return Promise.resolve()
}
return list
}).then(list => {
return addXqxlb(fmtDate(this.startDate), fmtDate(this.endDate), this.xqxlbNd)
}
ensureGrid().then(fetchList).then(list => {
this.renderEventList(list)
}).catch(() => {
this.$message.warning('校历事件加载失败')
@@ -362,13 +360,6 @@ export default {
})
this.events = loaded
},
// 判断某条记录(jqsj 日期)是否落在本学期 [startDate, endDate] 区间内
isInRange(jqsj) {
if (!this.startDate || !this.endDate || !jqsj) return false
const d = new Date(String(jqsj).slice(0, 10).replace(/-/g, '/'))
if (isNaN(d.getTime())) return false
return d >= this.startDate && d <= this.endDate
},
// 根据假期记录反推时间格位置(jqsj 日期 + courseClass 节次),与列是否可见无关
locateXqxlb(item) {
if (!this.calendarStart || !item.jqsj) return null