Files
education/backend/roomroot-jwgl/target/classes/com/roomroot/jwgl/mapper/SSKCBFZJYMapper.xml
T
2026-08-21 14:39:03 +08:00

114 lines
7.5 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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>