班历功能添加

This commit is contained in:
2026-09-16 17:13:57 +08:00
parent 2e151ea228
commit abf616a8ee
19 changed files with 526 additions and 73 deletions
@@ -16,6 +16,24 @@ export function updateClassCalendarEvent(data) {
})
}
// 批量保存班历时间格(拖选区域一次提交;cell.action='clear' 恢复默认)
export function batchSaveClassCalendarEvent(xydxqbh, cells) {
return request({
url: '/class-calendar/batchSave',
method: 'post',
data: { xydxqbh, cells }
})
}
// 重新同步校历:confirm=false 返回缺失格预览,confirm=true 实际补齐
export function resyncClassCalendar(xydxqbh, confirm) {
return request({
url: '/class-calendar/resync',
method: 'post',
params: { xydxqbh, confirm }
})
}
export function applyClassCalendarEvent(data) {
return request({
url: '/class-calendar/apply',
@@ -140,7 +140,7 @@
<script>
import { getSemester } from '@/api/teachBusiness/semester'
import { listXqxlb, addXqxlb, updateXqxlb } from '@/api/teachBusiness/xqxlb'
import { listClassCalendarEvent, updateClassCalendarEvent } from '@/api/teachOffice/classCalendarEvent'
import { listClassCalendarEvent, updateClassCalendarEvent, batchSaveClassCalendarEvent } from '@/api/teachOffice/classCalendarEvent'
import {
listVenueCalendarRange,
batchSaveVenueCalendar,
@@ -1027,6 +1027,22 @@ export default {
/* ---------- 后端持久化(xqxlb 接口) ---------- */
// 批量保存选中格事件,返回各格子保存成功/失败的个数
persistEvents(keys) {
// 班历走批量接口:一次拖选只发一个请求,整批单事务提交
if (this.mode === 'class') {
const cells = keys
.filter(key => this.events[key])
.map(key => this.buildXqxlbPayload(key, this.events[key]))
.filter(Boolean)
if (!cells.length) return Promise.resolve({ ok: 0, fail: 0 })
return batchSaveClassCalendarEvent(this.xydxqbh, cells).then(res => {
this.$message.success((res && res.message) || '已设定 ' + cells.length + ' 个时间格')
this.reloadEvents()
return { ok: cells.length, fail: 0 }
}).catch(() => {
this.$message.error('班历批量保存失败')
return { ok: 0, fail: cells.length }
})
}
const tasks = keys
.filter(key => this.events[key])
.map(key => {
@@ -1051,8 +1067,29 @@ export default {
return { ok: ok, fail: fail }
})
},
// 批量删除选中格事件:调用 update 接口并将 jqmc 置空完成删除
// 批量删除选中格事件:班历走 batchSave 的 action='clear' 恢复默认,校历仍走 update 置空名称
persistDeleteEvents(keys) {
if (this.mode === 'class') {
const cells = keys
.filter(key => this.events[key])
.map(key => {
const payload = this.buildXqxlbPayload(key, this.events[key])
if (!payload) return null
payload.jqmc = ''
payload.action = 'clear'
return payload
})
.filter(Boolean)
if (!cells.length) return Promise.resolve({ ok: 0, fail: 0 })
return batchSaveClassCalendarEvent(this.xydxqbh, cells).then(() => {
this.$message.success('已删除 ' + cells.length + ' 个时间格事件')
this.reloadEvents()
return { ok: cells.length, fail: 0 }
}).catch(() => {
this.$message.error('班历批量删除失败')
return { ok: 0, fail: cells.length }
})
}
const tasks = keys
.filter(key => this.events[key])
.map(key => {
@@ -11,7 +11,8 @@
<div class="dialog-toolbar">
<el-button size="small" :disabled="!semesterBh" @click="handleApplyRegion">选定区域应用于其它班次</el-button>
<el-button size="small" :disabled="!semesterBh" @click="handleApplyWhole">整个班历应用于其它班次</el-button>
<span class="hint">应用到其它班次只覆盖班历时间格,不改课程任务。</span>
<el-button size="small" :disabled="!semesterBh" :loading="resyncLoading" @click="handleResync">同步校历</el-button>
<span class="hint">应用到其它班次只覆盖班历时间格,不改课程任务;同步校历只补缺失格,不覆盖人工改动。</span>
</div>
<div class="editor-wrap">
<SchoolCalendarEditor
@@ -42,7 +43,7 @@
<script>
import SchoolCalendarEditor from '@/views/teachBusiness/calendar/components/SchoolCalendarEditor.vue'
import ClassTeamSelectDialog from './ClassTeamSelectDialog.vue'
import { applyClassCalendarEvent } from '@/api/teachOffice/classCalendarEvent'
import { applyClassCalendarEvent, resyncClassCalendar } from '@/api/teachOffice/classCalendarEvent'
export default {
name: 'ClassEventCalendarDialog',
@@ -55,7 +56,8 @@ export default {
data() {
return {
teamSelectVisible: false,
applyWhole: false
applyWhole: false,
resyncLoading: false
}
},
computed: {
@@ -132,6 +134,32 @@ export default {
this.teamSelectVisible = false
this.$message.success(`已覆盖 ${res.data || 0} 个时间格`)
})
},
handleResync() {
this.resyncLoading = true
resyncClassCalendar(this.semesterBh, false).then(res => {
const data = res && res.data
if (!data || !data.addCount) {
this.$message.info('班历已与校历一致,无需同步')
return
}
const lines = (data.items || []).slice(0, 20)
.map(i => `${i.jqsj} ${i.courseClass}节 ${i.jqmc || ''}${i.kpk === false ? '(不可排课)' : ''}`)
const more = data.addCount > lines.length ? `<br/>…共 ${data.addCount} 格` : ''
this.$confirm(
`校历中有 ${data.addCount} 个班历缺失的时间格:<br/>${lines.join('<br/>')}${more}<br/><br/>补齐这些格子?(不覆盖已有班历内容)`,
'同步校历',
{ dangerouslyUseHTMLString: true, confirmButtonText: '补齐', cancelButtonText: '取消' }
).then(() => {
return resyncClassCalendar(this.semesterBh, true).then(r => {
this.$message.success(`已补齐 ${(r.data && r.data.addCount) || 0} 个时间格`)
const editor = this.$refs.editor
if (editor && editor.reloadEvents) editor.reloadEvents()
})
}).catch(() => {})
}).finally(() => {
this.resyncLoading = false
})
}
}
}