forked from liweijie/education
学期新增的时候校验校历功能点添加,否则会有大量的数据重复生成
This commit is contained in:
@@ -18,12 +18,14 @@ export function getXqxlb(bh) {
|
||||
})
|
||||
}
|
||||
|
||||
// 预生成学期整张校历占位记录(首次进入新学期时调用,接口自带去重)
|
||||
export function addXqxlb(startDate, endDate) {
|
||||
// 预生成学期整张校历占位记录(首次进入新学期时调用,接口幂等)
|
||||
// nd 为 6 位学期代号(如 202601),后端据此落库,必须与 listXqxlb 的查询口径一致,
|
||||
// 否则后端写入的年度与前端查询的年度对不上,会每次进入都重新生成一遍。
|
||||
export function addXqxlb(startDate, endDate, nd) {
|
||||
return request({
|
||||
url: '/xqxlb/add',
|
||||
method: 'post',
|
||||
params: { startDate: startDate, endDate: endDate }
|
||||
params: { startDate: startDate, endDate: endDate, nd: nd }
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user