feat: 提交课表冲突检查相关功能模块

This commit is contained in:
dengxiaoyue
2026-08-21 14:39:03 +08:00
parent 179b12e3bf
commit f190c29e05
857 changed files with 10838 additions and 5 deletions
@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.roomroot.jwgl.mapper.SSKCBFZJYMapper">
<select id="selectBySskcbh" resultType="com.roomroot.jwgl.entity.SSKCBFZJY">
SELECT * FROM "实施_课程表_辅助教员" WHERE "实施_课程表编号" = #{sskcbh}
</select>
<delete id="deleteBySskcbbh">
DELETE FROM "实施_课程表_辅助教员" WHERE "实施_课程表编号" = #{sskcbbh}
</delete>
<!-- ============================================================ -->
<!-- 课表冲突检查 - 维度3:教员时间冲突明细查询 -->
<!-- 检查逻辑:同一教员(主讲+辅讲统一查)在同一日期节次,被安排多个课次 -->
<!-- 用到的表: -->
<!-- 1. 实施_课程表 SSKCB → 日期/节次/年度/删除状态 -->
<!-- 2. 实施_课程表_辅助教员 SSKCBFZJY → 教员编号(FZJYBH) -->
<!-- 3. 教员表/教研室人员表 JYB/JYSX → 翻译教员姓名 -->
<!-- 4. 课表 KB → 翻译课程名称 -->
<!-- ============================================================ -->
<select id="selectTeacherConflictDetails"
resultType="com.roomroot.jwgl.vo.timetableconflict.TimetableConflictDetailVO">
SELECT
/* 固定维度编码:教员时间冲突 */
'TEACHER_CONFLICT' AS dimension_code,
'教员时间冲突' AS dimension_title,
/* 发生冲突的资源(教员)*/
g."辅助教员编号" AS resource_id,
COALESCE(j."教员姓名", g."辅助教员编号") AS resource_name,
/* 冲突日期节次:统一取自主表 s */
g."日期" AS rq,
g."节次" AS jc,
/* 占用课次数:同一教员同一时间排了几门不同的课 */
g."占用课次数" AS occupied_lesson_count,
/* 冲突课程名 + 主讲/辅讲标注 */
g."课程名称列表" AS course_names,
/* 冲突课次编号列表,逗号分隔 */
g."课次编号列表" AS conflict_sskcb_bhs,
/* 中文原因 */
'教员【' || COALESCE(j."教员姓名", g."辅助教员编号") || '】在 '
|| TO_CHAR(g."日期", 'YYYY-MM-DD') || ' 第' || CAST(g."节次" AS VARCHAR) || '节'
|| ' 被同时安排 ' || CAST(g."占用课次数" AS VARCHAR) || ' 门课程:'
|| COALESCE(g."课程名称列表", '(课次号:' || g."课次编号列表" || ')')
AS reason,
/* ========== UI 明细新增 5 字段 ========== */
/* 冲突号:日期8位_节次2位_辅助教员编号 */
TO_CHAR(g."日期", 'YYYYMMDD')
|| '_' || LPAD(CAST(g."节次" AS VARCHAR), 2, '0')
|| '_' || g."辅助教员编号" AS conflict_no,
/* 班次名称列表(这些课次涉及的所有学员队/班次)*/
COALESCE(g.xyd_names_list, '(无)') AS xyd_names,
/* 教员姓名列表(含【主/辅】,该冲突课次涉及的所有教员)*/
COALESCE(g.teacher_names_list, '(无)') AS teacher_names,
/* 场地/教室名称列表 */
COALESCE(g.classroom_names_list, '(无)') AS classroom_names,
/* 责任单位(从班次所属单位聚合)*/
COALESCE(g.responsible_dept_list, '(无)')AS responsible_dept
FROM (
/*
* 内层:按教员编号+日期+节次 GROUP BY,筛选出现>1课次的冲突
*
* 关键修正:
* 1. 关联链路:SSKCB → 实施_课程 c → 课表 k;必须 CAST(c.编号 AS CHAR(36))
* 2. 主讲/辅讲字段:真实列名「主教员」(1主/0辅)
* 3. 日期节次:统一取主表 s
*
* 新增 JOIN(同维度1/2):为明细表格聚合"该冲突课次涉及的所有班次/教员/场地"
* - INNER JOIN f 是"维度过滤主关联"(只保留该教员的课次做分组)
* - 额外 LEFT JOIN xyd/fz/js 三层是"聚合展示用"(把同一冲突组涉及的所有信息都拼出来)
*/
SELECT
f."辅助教员编号",
s."日期",
s."节次",
COUNT(DISTINCT s."编号") AS "占用课次数",
/* 原课程名称列表(课程名 + 主/辅标注)*/
WM_CONCAT(DISTINCT
CASE f."主教员" WHEN 1 THEN '【主】' ELSE '【辅】' END
|| COALESCE(k."课名称", '未命名课程')
) AS "课程名称列表",
WM_CONCAT(DISTINCT s."编号") AS "课次编号列表",
/* ========== 新增 4 个聚合字段(明细表格用)========== */
WM_CONCAT(DISTINCT xyd_info."学员队名称") AS xyd_names_list,
WM_CONCAT(DISTINCT
CASE fz_info."主教员" WHEN 1 THEN '【主】' ELSE '【辅】' END
|| jy_info."教员姓名"
) AS teacher_names_list,
WM_CONCAT(DISTINCT js_info."教室名称") AS classroom_names_list,
WM_CONCAT(DISTINCT xyd_info."所属单位") AS responsible_dept_list
FROM "实施_课程表" s
/* 维度过滤主关联:只看该教员的课次(GROUP BY 维度)*/
INNER JOIN "实施_课程表_辅助教员" f ON f."实施_课程表编号" = s."编号"
/* 课表信息三层关联 */
LEFT JOIN "实施_课程" c ON CAST(c."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "课表" k ON k."科目代码" = c."科目编号"
/* ========== 新增 JOIN:聚合该冲突课次的班次/教员/场地所有信息 ========== */
LEFT JOIN "实施_课程表_学员队" xyd_link ON xyd_link."实施_课程表编号" = s."编号"
LEFT JOIN "学员队表" xyd_info ON xyd_info."学员队编号" = xyd_link."学员队编号"
LEFT JOIN "实施_课程表_辅助教员" fz_info ON fz_info."实施_课程表编号" = s."编号"
LEFT JOIN "教员表" jy_info ON jy_info."教员编号" = fz_info."辅助教员编号"
LEFT JOIN "实施_课程表_教室" js_link ON js_link."实施_课程表编号" = s."编号"
LEFT JOIN "教室表" js_info ON js_info."教室编号" = js_link."教室编号"
WHERE s."删除状态" = 0
AND s."年度" = #{nd}
GROUP BY f."辅助教员编号", s."日期", s."节次"
HAVING COUNT(DISTINCT s."编号") > 1
) g
/* 翻译教员姓名:教员表主键「教员编号」,姓名字段「教员姓名」 */
LEFT JOIN "教员表" j ON j."教员编号" = g."辅助教员编号"
ORDER BY g."日期", g."节次", g."辅助教员编号"
</select>
</mapper>