课表以及课表调整申请

This commit is contained in:
2026-08-25 20:07:13 +08:00
parent 303d15e234
commit bfb1afb470
4 changed files with 180 additions and 65 deletions
@@ -43,7 +43,7 @@ export function listScheduleAdjust(params) {
* 查询当前教员可供调课的课次 * 查询当前教员可供调课的课次
* GET /course-running/adjust/lessons * GET /course-running/adjust/lessons
* 查询参数:nd 年度(可选) * 查询参数:nd 年度(可选)
* 返回:List<AdjustableLessonVO>(kcmc/rq/jc/xydmc/kcxh/jsbh/sskcbbh 等) * 返回:List<AdjustableLessonVO>,包含提交所需的课次主字段及教室、教员、学员队、保障明细。
*/ */
export function listAdjustableLessons(params) { export function listAdjustableLessons(params) {
return request({ return request({
+3 -3
View File
@@ -7,7 +7,7 @@ import request from '@/utils/request'
/** /**
* 今日课表 * 今日课表
* GET /kcb/today/list * GET /kcb/today/list
* @param params TimetableQuery:nd、xydbh(均可选) * @param params offset 日期偏移量、rq 基准日期(yyyy-MM-dd)
* 返回:今日课表记录(实体字段 bh/sksj/kc/zrdw/bc/jy/cd/jxnrxff/bz) * 返回:今日课表记录(实体字段 bh/sksj/kc/zrdw/bc/jy/cd/jxnrxff/bz)
*/ */
export function listToday(data) { export function listToday(data) {
@@ -21,7 +21,7 @@ export function listToday(data) {
/** /**
* 本周课表 * 本周课表
* GET /kcb/week/list * GET /kcb/week/list
* @param params TimetableQuery:nd、xydbh(均可选) * @param params offset 周偏移量、rq 基准日期(yyyy-MM-dd)
* 返回:本周课表记录 * 返回:本周课表记录
*/ */
export function listWeek(data) { export function listWeek(data) {
@@ -86,4 +86,4 @@ export function exportClassCourses(data) {
params: data, params: data,
responseType: 'blob' responseType: 'blob'
}) })
} }
@@ -11,10 +11,10 @@
</div> </div>
<div class="table-card"> <div class="table-card">
<el-table :data="todayData" v-loading="loading" stripe border> <el-table :data="todayData" row-key="bh" v-loading="loading" stripe border>
<el-table-column type="index" label="序号" width="55" align="center" /> <el-table-column type="index" label="序号" width="55" align="center" />
<el-table-column label="上课时间" width="130" align="center"> <el-table-column label="上课时间" width="130" align="center">
<template #default="{ row }">{{ formatJc(row.jc) }}</template> <template #default="{ row }">{{ row.sjsj || '-' }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="kcmc" label="课程" min-width="140" align="center" show-overflow-tooltip /> <el-table-column prop="kcmc" label="课程" min-width="140" align="center" show-overflow-tooltip />
<el-table-column prop="zrdw" label="责任单位" width="110" align="center" /> <el-table-column prop="zrdw" label="责任单位" width="110" align="center" />
@@ -45,7 +45,7 @@
</div> </div>
<div class="table-card"> <div class="table-card">
<el-table :data="weekData" v-loading="loading" stripe border> <el-table :data="weekData" row-key="bh" v-loading="loading" stripe border>
<el-table-column type="index" label="序号" width="55" align="center" /> <el-table-column type="index" label="序号" width="55" align="center" />
<el-table-column label="上课时间" width="170" align="center" show-overflow-tooltip> <el-table-column label="上课时间" width="170" align="center" show-overflow-tooltip>
<template #default="{ row }">{{ row.sjsj || '-' }}</template> <template #default="{ row }">{{ row.sjsj || '-' }}</template>
@@ -132,10 +132,6 @@
import { listToday, listWeek, listClass, exportClassPlan, exportClassGrades, exportClassCourses } from '@/api/teachBusiness/timetable' import { listToday, listWeek, listClass, exportClassPlan, exportClassGrades, exportClassCourses } from '@/api/teachBusiness/timetable'
import { listTeam } from '@/api/studentRecords/team' import { listTeam } from '@/api/studentRecords/team'
const JC_SECTION = {
1: '1-2节', 2: '3-4节', 3: '5-6节', 4: '7-8节', 5: '9-10节', 6: '11-12节'
}
const WEEK_DAY_NAMES = ['日', '一', '二', '三', '四', '五', '六'] const WEEK_DAY_NAMES = ['日', '一', '二', '三', '四', '五', '六']
function pad2(n) { function pad2(n) {
@@ -161,9 +157,11 @@ export default {
loading: false, loading: false,
// 今日 // 今日
todayDate: new Date(), todayDate: new Date(),
dayOffset: 0,
todayData: [], todayData: [],
// 本周 // 本周
weekStart: getMonday(new Date()), weekStart: getMonday(new Date()),
weekOffset: 0,
weekData: [], weekData: [],
// 班次 // 班次
searchForm: { teamClass: '' }, searchForm: { teamClass: '' },
@@ -173,13 +171,23 @@ export default {
} }
}, },
computed: { computed: {
selectedTodayDate() {
const date = new Date(this.todayDate)
date.setDate(date.getDate() + this.dayOffset)
return date
},
selectedWeekStart() {
const date = new Date(this.weekStart)
date.setDate(date.getDate() + this.weekOffset * 7)
return date
},
dateTitle() { dateTitle() {
return formatDate(this.todayDate) + ' 今日教学实施计划' return formatDate(this.selectedTodayDate) + ' 今日教学实施计划'
}, },
weekRangeText() { weekRangeText() {
const end = new Date(this.weekStart) const end = new Date(this.selectedWeekStart)
end.setDate(end.getDate() + 6) end.setDate(end.getDate() + 6)
return formatDate(this.weekStart) + '(' + this.weekDayName(this.weekStart) + ') 至 ' + return formatDate(this.selectedWeekStart) + '(' + this.weekDayName(this.selectedWeekStart) + ') 至 ' +
formatDate(end) + '(' + this.weekDayName(end) + ') 本周教学实施计划' formatDate(end) + '(' + this.weekDayName(end) + ') 本周教学实施计划'
}, },
pageTitle() { pageTitle() {
@@ -196,34 +204,22 @@ export default {
weekDayName(d) { weekDayName(d) {
return WEEK_DAY_NAMES[d.getDay()] return WEEK_DAY_NAMES[d.getDay()]
}, },
formatJc(jc) {
if (jc === null || jc === undefined || jc === '') return '第?节'
return JC_SECTION[jc] || ('第' + jc + '节')
},
/* ---------- 今日:日期导航 ---------- */ /* ---------- 今日:日期导航 ---------- */
handlePrevDay() { handlePrevDay() {
const d = new Date(this.todayDate) this.dayOffset -= 1
d.setDate(d.getDate() - 1)
this.todayDate = d
this.getTodayList() this.getTodayList()
}, },
handleNextDay() { handleNextDay() {
const d = new Date(this.todayDate) this.dayOffset += 1
d.setDate(d.getDate() + 1)
this.todayDate = d
this.getTodayList() this.getTodayList()
}, },
/* ---------- 本周:周次导航 ---------- */ /* ---------- 本周:周次导航 ---------- */
handlePrevWeek() { handlePrevWeek() {
const d = new Date(this.weekStart) this.weekOffset -= 1
d.setDate(d.getDate() - 7)
this.weekStart = d
this.getWeekList() this.getWeekList()
}, },
handleNextWeek() { handleNextWeek() {
const d = new Date(this.weekStart) this.weekOffset += 1
d.setDate(d.getDate() + 7)
this.weekStart = d
this.getWeekList() this.getWeekList()
}, },
/* ---------- 队别班次下拉(真实接口) ---------- */ /* ---------- 队别班次下拉(真实接口) ---------- */
@@ -243,10 +239,6 @@ export default {
}) })
}, },
/* ---------- 数据字段映射(接口字段 -> 页面字段) ---------- */ /* ---------- 数据字段映射(接口字段 -> 页面字段) ---------- */
parseSection(sksj) {
const m = String(sksj || '').match(/第(\d+)节/)
return m ? Number(m[1]) : undefined
},
mapLessonRow(apiRow) { mapLessonRow(apiRow) {
// 接口今日/本周实体:bh sksj kc zrdw bc jy cd jxnrxff bz // 接口今日/本周实体:bh sksj kc zrdw bc jy cd jxnrxff bz
const row = Object.assign({}, apiRow) const row = Object.assign({}, apiRow)
@@ -256,9 +248,28 @@ export default {
row.jxnrff = apiRow.jxnrxff row.jxnrff = apiRow.jxnrxff
row.jybz = apiRow.bz row.jybz = apiRow.bz
row.sjsj = apiRow.sksj row.sjsj = apiRow.sksj
row.jc = this.parseSection(apiRow.sksj)
return row return row
}, },
extractLessonRows(response) {
const data = response && response.data
if (Array.isArray(data)) {
return data
}
if (!data) {
return []
}
// 新接口返回 DailyWeeklyTimetableRangeVO,列表位于 data.list;
// records 分支用于兼容旧分页结构,避免后端版本切换时页面再次无数据。
if (Array.isArray(data.list)) {
return data.list
}
if (Array.isArray(data.records)) {
return data.records
}
return []
},
mapClassRow(apiRow) { mapClassRow(apiRow) {
// 接口班次实体:sskcbh kcmcksxs zrjykc jhxs yxxs khlxfs ssjy rscd ssjhbg // 接口班次实体:sskcbh kcmcksxs zrjykc jhxs yxxs khlxfs ssjy rscd ssjhbg
const row = Object.assign({}, apiRow) const row = Object.assign({}, apiRow)
@@ -271,12 +282,13 @@ export default {
}, },
/* ---------- 今日:拉取数据 ---------- */ /* ---------- 今日:拉取数据 ---------- */
getTodayList() { getTodayList() {
const params = {
offset: this.dayOffset,
rq: formatDate(this.todayDate)
}
this.loading = true this.loading = true
listToday({}).then(response => { listToday(params).then(response => {
const data = response.data this.todayData = this.extractLessonRows(response).map(item => this.mapLessonRow(item))
this.todayData = Array.isArray(data)
? (data || []).map(item => this.mapLessonRow(item))
: ((data && data.records) || []).map(item => this.mapLessonRow(item))
this.loading = false this.loading = false
}).catch(() => { }).catch(() => {
this.todayData = [] this.todayData = []
@@ -285,12 +297,13 @@ export default {
}, },
/* ---------- 本周:拉取数据 ---------- */ /* ---------- 本周:拉取数据 ---------- */
getWeekList() { getWeekList() {
const params = {
offset: this.weekOffset,
rq: formatDate(this.weekStart)
}
this.loading = true this.loading = true
listWeek({}).then(response => { listWeek(params).then(response => {
const data = response.data this.weekData = this.extractLessonRows(response).map(item => this.mapLessonRow(item))
this.weekData = Array.isArray(data)
? (data || []).map(item => this.mapLessonRow(item))
: ((data && data.records) || []).map(item => this.mapLessonRow(item))
this.loading = false this.loading = false
}).catch(() => { }).catch(() => {
this.weekData = [] this.weekData = []
@@ -339,9 +339,7 @@ const RECEIVE_STATUS = {
export default { export default {
name: 'TimetableAdjust', name: 'TimetableAdjust',
data() { data() {
const curUserName = (this.$store.state.user && this.$store.state.user.name) || ''
return { return {
curUserName: curUserName,
loading: false, loading: false,
tableData: [], tableData: [],
total: 0, total: 0,
@@ -497,11 +495,24 @@ export default {
sy: '', sy: '',
rq: '', rq: '',
jc: 1, jc: 1,
sqjybh: this.curUserName, sqjybh: '',
xydrwbh: '',
kbh: '',
kcbbh: '',
xydmc: '', xydmc: '',
yjsbh: '', yjsbh: '',
xjsbh: '', xjsbh: '',
ydsjap: '' ydsjap: '',
jxnr: '',
jxyd: '',
jxff: '',
jxbzbz: '',
ycxx: '',
bz: '',
roomList: [],
teacherList: [],
teamList: [],
supportList: []
} }
this.lessonOptions = [] this.lessonOptions = []
this.loadClassroomOptions() this.loadClassroomOptions()
@@ -509,11 +520,29 @@ export default {
this.addVisible = true this.addVisible = true
}, },
handleAddYearChange() { handleAddYearChange() {
this.addForm.sskcbbh = '' Object.assign(this.addForm, {
this.addForm.xydmc = '' sskcbbh: '',
this.addForm.yjsbh = '' rq: '',
this.addForm.xjsbh = '' jc: 1,
this.addForm.ydsjap = '' sqjybh: '',
xydrwbh: '',
kbh: '',
kcbbh: '',
xydmc: '',
yjsbh: '',
xjsbh: '',
ydsjap: '',
jxnr: '',
jxyd: '',
jxff: '',
jxbzbz: '',
ycxx: '',
bz: '',
roomList: [],
teacherList: [],
teamList: [],
supportList: []
})
this.lessonOptions = [] this.lessonOptions = []
}, },
loadClassroomOptions() { loadClassroomOptions() {
@@ -558,12 +587,34 @@ export default {
this.$message.warning('当前课次缺少课次编号,无法选择') this.$message.warning('当前课次缺少课次编号,无法选择')
return return
} }
this.addForm.sskcbbh = lessonNumber const currentRoomNumber = row.jsbh || row.yjsbh || row.xjsbh || ''
this.addForm.xydmc = row.xydmc || '' const roomList = this.normalizeRoomList(row.roomList, currentRoomNumber)
this.addForm.yjsbh = row.jsbh || row.yjsbh || '' const teamList = this.normalizeTeamList(row.teamList, row.xydbh)
this.addForm.xjsbh = '' Object.assign(this.addForm, {
this.addForm.ydsjap = row.rq ? this.fmtRqJc(row.rq, row.jc) : (row.ydsjap || '') sskcbbh: lessonNumber,
;['kbh', 'kcbbh', 'xydrwbh', 'jysdh', 'kcmc', 'sqjyxm'].forEach(key => { rq: row.rq ? String(row.rq).substring(0, 10) : '',
jc: row.jc === null || row.jc === undefined ? 1 : Number(row.jc),
nd: row.nd || this.addForm.nd,
sqjybh: row.sqjybh || '',
xydrwbh: row.xydrwbh || '',
kbh: row.kbh || '',
kcbbh: row.kcbbh || '',
xydmc: row.xydmc || '',
yjsbh: row.yjsbh || currentRoomNumber,
xjsbh: row.xjsbh || currentRoomNumber,
ydsjap: row.rq ? this.fmtRqJc(row.rq, row.jc) : (row.ydsjap || ''),
jxnr: row.jxnr || '',
jxyd: row.jxyd || '',
jxff: row.jxff || '',
jxbzbz: row.jxbzbz || '',
ycxx: row.ycxx || '',
bz: row.bz || '',
roomList: roomList,
teacherList: this.normalizeTeacherList(row.teacherList),
teamList: teamList,
supportList: this.normalizeSupportList(row.supportList)
})
;['jysdh', 'kcmc', 'sqjyxm'].forEach(key => {
if (row[key] !== undefined && row[key] !== null) this.addForm[key] = row[key] if (row[key] !== undefined && row[key] !== null) this.addForm[key] = row[key]
}) })
this.lessonDialogVisible = false this.lessonDialogVisible = false
@@ -578,14 +629,19 @@ export default {
sy: this.addForm.sy, sy: this.addForm.sy,
rq: this.addForm.rq + 'T00:00:00', rq: this.addForm.rq + 'T00:00:00',
jc: this.addForm.jc, jc: this.addForm.jc,
nd: this.addForm.nd nd: this.addForm.nd,
roomList: this.buildSubmitRoomList(),
teacherList: this.normalizeTeacherList(this.addForm.teacherList),
teamList: this.normalizeTeamList(this.addForm.teamList),
supportList: this.normalizeSupportList(this.addForm.supportList)
} }
;['xydrwbh', 'kbh', 'kcbbh', 'xjsbh'].forEach(key => { const optionalFields = [
'sqjybh', 'xydrwbh', 'kbh', 'kcbbh', 'xjsbh', 'jxnr', 'jxyd',
'jxff', 'jxbzbz', 'ycxx', 'bz'
]
optionalFields.forEach(key => {
if (this.addForm[key]) payload[key] = this.addForm[key] if (this.addForm[key]) payload[key] = this.addForm[key]
}) })
if (this.addForm.xjsbh) {
payload.roomList = [{ jsbh: this.addForm.xjsbh }]
}
this.addLoading = true this.addLoading = true
submitScheduleAdjust(payload).then(() => { submitScheduleAdjust(payload).then(() => {
this.addLoading = false this.addLoading = false
@@ -597,6 +653,52 @@ export default {
}) })
}) })
}, },
normalizeRoomList(roomList, fallbackRoomNumber) {
const normalizedList = (Array.isArray(roomList) ? roomList : [])
.filter(item => item && item.jsbh)
.map(item => ({
jsbh: item.jsbh,
bz: item.bz || ''
}))
if (normalizedList.length === 0 && fallbackRoomNumber) {
normalizedList.push({ jsbh: fallbackRoomNumber, bz: '' })
}
return normalizedList
},
normalizeTeacherList(teacherList) {
return (Array.isArray(teacherList) ? teacherList : [])
.filter(item => item && item.fzjybh)
.map(item => ({ fzjybh: item.fzjybh }))
},
normalizeTeamList(teamList, fallbackTeamNumber) {
const normalizedList = (Array.isArray(teamList) ? teamList : [])
.filter(item => item && item.xydbh)
.map(item => ({ xydbh: item.xydbh }))
if (normalizedList.length === 0 && fallbackTeamNumber) {
normalizedList.push({ xydbh: fallbackTeamNumber })
}
return normalizedList
},
normalizeSupportList(supportList) {
return (Array.isArray(supportList) ? supportList : [])
.filter(item => item && item.bztgmxbh)
.map(item => ({
bztgmxbh: item.bztgmxbh,
sl: item.sl === null || item.sl === undefined ? undefined : Number(item.sl)
}))
},
buildSubmitRoomList() {
if (!this.addForm.xjsbh) return []
const currentRoomList = this.normalizeRoomList(this.addForm.roomList)
if (this.addForm.xjsbh === this.addForm.yjsbh && currentRoomList.length > 0) {
return currentRoomList
}
const currentRoom = currentRoomList.find(item => item.jsbh === this.addForm.xjsbh)
return [{
jsbh: this.addForm.xjsbh,
bz: currentRoom ? currentRoom.bz : ''
}]
},
/* ---------- 审批 ---------- */ /* ---------- 审批 ---------- */
showAuditMenu(row) { showAuditMenu(row) {
return row.sczt === 0 && (row.jyspzzt === 0 || row.jyspzzt === 2 || row.jyspzzt === 3) return row.sczt === 0 && (row.jyspzzt === 0 || row.jyspzzt === 2 || row.jyspzzt === 3)