From f8e6466d24730efc716deeeadead5d87c72079ce Mon Sep 17 00:00:00 2001 From: liweijie Date: Thu, 24 Sep 2026 15:07:26 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E8=AF=BE=E6=97=B6=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E8=B0=83=E6=95=B4=E6=96=B0=E5=A2=9E=EF=BC=9B?= =?UTF-8?q?=202=E3=80=81=E6=95=99=E5=AD=A6=E6=A5=BC=E5=BA=8F=E5=8F=B7?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E8=87=AA=E5=8A=A8=E5=A1=AB=E5=85=85=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E9=9C=80=E5=A1=AB=E5=86=99=EF=BC=9B=203=E3=80=81?= =?UTF-8?q?=E6=95=99=E5=AD=A6=E6=A5=BC=E6=A3=80=E7=B4=A2=EF=BC=8C=E6=95=99?= =?UTF-8?q?=E5=AD=A6=E6=A5=BC=E4=BB=A3=E5=8F=B7=E4=B8=8B=E6=8B=89=E9=80=89?= =?UTF-8?q?=E6=8B=A9=EF=BC=9B=204=E3=80=81=E8=AF=BE=E8=A1=A8=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E6=A3=80=E6=9F=A5=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwgl/service/impl/KCBServiceImpl.java | 92 +++++++++++-------- .../src/views/teachBusiness/build/index.vue | 31 +++++-- .../views/teachBusiness/timetable/index.vue | 27 ++++-- .../teachBusiness/timetableConflict/index.vue | 10 +- .../shiftSemester/ClassCalendarDialog.vue | 69 +++++++++++++- 5 files changed, 171 insertions(+), 58 deletions(-) diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/KCBServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/KCBServiceImpl.java index c64c74a2a..66ec2945c 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/KCBServiceImpl.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/KCBServiceImpl.java @@ -135,6 +135,10 @@ public class KCBServiceImpl implements KCBService { @Override public void exportSemesterGrades(TimetableQuery cond, HttpServletResponse response) { + // 成绩表按学员粒度返回且不支持教员过滤,教员账号不能导出 + if (jwglRoleHelper.isTeacher()) { + throw new BusinessException(BasicManagementConstants.FORBIDDEN, "教员账号不能导出学期成绩表"); + } TimetableQuery filter = prepareFilter(cond); List list = kcbTimetableMapper.selectSemesterGrades(filter); ExcelUtil util = new ExcelUtil<>(SemesterGradeExportVO.class); @@ -183,60 +187,70 @@ public class KCBServiceImpl implements KCBService { result.setRq(viewDate.format(DATE_FORMAT)); result.setStartDate(start.format(DATE_FORMAT)); result.setEndDate(end.format(DATE_FORMAT)); + // 今日/本周按日期范围取数不锁年度(翻页可跨年),角色限定与组合查询一致 + TimetableQuery scope = applyRoleScope(new TimetableQuery()); result.setList(kcbTimetableMapper.selectLessonTimetable( - null, result.getStartDate(), result.getEndDate())); + scope, result.getStartDate(), result.getEndDate())); return result; } + /** + * 角色数据范围:学员强制只看本队;教员强制只看本人课程; + * 教研室未指定时代号时按本室过滤;其余字段去空白。 + *

今日/本周课表与组合查询共用,不附带年度默认值。

+ */ + private TimetableQuery applyRoleScope(TimetableQuery filter) { + if (jwglRoleHelper.isStudent()) { + filter.setXydbh(jwglRoleHelper.requireStudentTeamId()); + filter.setXydmc(null); + filter.setXybh(null); + filter.setJybh(null); + filter.setJybhs(null); + return filter; + } + if (StringUtils.isNotEmpty(filter.getXybh())) { + filter.setXydbh(resolveTeamByStudent(filter.getXybh().trim())); + filter.setXydmc(null); + } + if (jwglRoleHelper.isTeacher()) { + filter.setJybh(jwglRoleHelper.requireTeacherId()); + filter.setJybhs(null); + } + if (jwglRoleHelper.isResearchOffice() && StringUtils.isEmpty(filter.getJysdh())) { + filter.setJysdh(jwglRoleHelper.requireResearchOfficeId()); + } + if (StringUtils.isNotEmpty(filter.getXydbh())) { + filter.setXydbh(filter.getXydbh().trim()); + } + if (StringUtils.isNotEmpty(filter.getXydmc())) { + filter.setXydmc(filter.getXydmc().trim()); + } + if (StringUtils.isNotEmpty(filter.getJybh())) { + filter.setJybh(filter.getJybh().trim()); + } + if (StringUtils.isNotEmpty(filter.getJsbh())) { + filter.setJsbh(filter.getJsbh().trim()); + } + if (StringUtils.isNotEmpty(filter.getJysdh())) { + filter.setJysdh(filter.getJysdh().trim()); + } + return filter; + } + /** * 未传年度时按当前学期填充;队别班次名称去空白。 * 学员强制只看本人所在学员队课表。 */ private TimetableQuery prepareFilter(TimetableQuery cond) { - TimetableQuery filter = cond == null ? new TimetableQuery() : cond; - if (jwglRoleHelper.isStudent()) { - filter.setXydbh(jwglRoleHelper.requireStudentTeamId()); - filter.setXydmc(null); - filter.setXybh(null); - filter.setJybh(null); - filter.setJybhs(null); - } else { - if (StringUtils.isNotEmpty(filter.getXybh())) { - filter.setXydbh(resolveTeamByStudent(filter.getXybh().trim())); - filter.setXydmc(null); - } - if (jwglRoleHelper.isTeacher()) { - filter.setJybh(jwglRoleHelper.requireTeacherId()); - filter.setJybhs(null); - } - if (jwglRoleHelper.isResearchOffice() && StringUtils.isEmpty(filter.getJysdh())) { - filter.setJysdh(jwglRoleHelper.requireResearchOfficeId()); - } - if (StringUtils.isNotEmpty(filter.getXydbh())) { - filter.setXydbh(filter.getXydbh().trim()); - } - if (StringUtils.isNotEmpty(filter.getXydmc())) { - filter.setXydmc(filter.getXydmc().trim()); - } - if (StringUtils.isNotEmpty(filter.getJybh())) { - filter.setJybh(filter.getJybh().trim()); - } - if (StringUtils.isNotEmpty(filter.getJsbh())) { - filter.setJsbh(filter.getJsbh().trim()); - } - if (StringUtils.isNotEmpty(filter.getJysdh())) { - filter.setJysdh(filter.getJysdh().trim()); - } - } + TimetableQuery filter = applyRoleScope(cond == null ? new TimetableQuery() : cond); if (filter.getNd() != null) { return filter; } SemesterInitializationVO semester = systemInitializationMapper.selectCurrentSemester(); if (semester != null && semester.getYear() != null) { filter.setNd(semester.getYear()); - if (filter.getXqdc() == null) { - filter.setXqdc(semester.getSequenceNumber()); - } + // 不默认学期第次:课程-学员队关联的「学期第次」与校历学期序号口径不同, + // 年度已是学期代号(如 202603),再叠加序号过滤会查不到任何数据。 } else { filter.setNd(LocalDate.now().getYear()); } diff --git a/frontend/src/views/teachBusiness/build/index.vue b/frontend/src/views/teachBusiness/build/index.vue index 1b4c2c183..dd23911b3 100644 --- a/frontend/src/views/teachBusiness/build/index.vue +++ b/frontend/src/views/teachBusiness/build/index.vue @@ -6,7 +6,10 @@ - + + + @@ -71,9 +74,6 @@ - - - @@ -150,6 +150,7 @@ export default { dd: '' }, tableData: [], + jxldhOptions: [], selectedRows: [], total: 0, pageNum: 1, @@ -183,6 +184,7 @@ export default { }, created() { this.fetchList() + this.loadJxldhOptions() }, methods: { /* ---------- 查询 ---------- */ @@ -218,6 +220,19 @@ export default { }) }, + /* ---------- 教学楼代号下拉(全量代号,独立于筛选条件) ---------- */ + loadJxldhOptions() { + listBuild({ pageNum: 1, pageSize: 1000 }).then(response => { + const records = ((response && response.data) || {}).records || [] + const seen = {} + this.jxldhOptions = records + .map(item => (item.jxldh || '').trim()) + .filter(code => code && !seen[code] && (seen[code] = true)) + }).catch(() => { + this.jxldhOptions = [] + }) + }, + handleQuery() { this.pageNum = 1 this.fetchList() @@ -295,8 +310,9 @@ export default { jxlmc: (form.jxlmc || '').trim() } if (this.dialog.isEdit) payload.id = form.id - // 可选字段留空时不提交,交由后端自动生成 / 保持原值 - const optional = { dd: form.dd, xh: form.xh, bz: form.bz } + // 可选字段留空时不提交,交由后端自动生成 / 保持原值; + // 序号 xh 不在表单中录入,新增由后端自动生成、修改保持原值 + const optional = { dd: form.dd, bz: form.bz } Object.keys(optional).forEach(key => { const value = (optional[key] === null || optional[key] === undefined) ? '' : String(optional[key]).trim() if (value !== '') payload[key] = value @@ -317,6 +333,7 @@ export default { this.dialog.submitting = false this.dialog.visible = false this.fetchList() + this.loadJxldhOptions() }).catch(() => { this.dialog.submitting = false }) @@ -356,6 +373,7 @@ export default { this.$message.success('已删除 ' + deleteCount + ' 条教学楼数据') } this.fetchList() + this.loadJxldhOptions() }).catch(() => { this.loading = false this.fetchList() @@ -432,6 +450,7 @@ export default { const skipTip = data.skipCount > 0 ? ',跳过 ' + data.skipCount + ' 条已存在代号' : '' this.$message.success('导入成功,共导入 ' + (data.insertCount || 0) + ' 条' + skipTip) this.fetchList() + this.loadJxldhOptions() }).catch(() => { this.importDialog.importing = false }) diff --git a/frontend/src/views/teachBusiness/timetable/index.vue b/frontend/src/views/teachBusiness/timetable/index.vue index d979a8312..e994cf09a 100644 --- a/frontend/src/views/teachBusiness/timetable/index.vue +++ b/frontend/src/views/teachBusiness/timetable/index.vue @@ -92,7 +92,7 @@
{{ pageTitle }}
学期教学实施计划 - 学期成绩表 + 学期成绩表 课程列表另存Excel
@@ -125,6 +125,7 @@