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

110 lines
7.1 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.SSKCBJSMapper">
<select id="selectBySskcbh" resultType="com.roomroot.jwgl.entity.SSKCBJS">
SELECT * FROM "实施_课程表_教室" WHERE "实施_课程表编号" = #{sskcbh}
</select>
<delete id="deleteBySskcbbh">
DELETE FROM "实施_课程表_教室" WHERE "实施_课程表编号" = #{sskcbbh}
</delete>
<!-- ============================================================ -->
<!-- 课表冲突检查 - 维度4:教室(教学场地)时间冲突明细查询 -->
<!-- 检查逻辑:同一教室同一日期节次,被安排多个不同课次 -->
<!-- 用到的表: -->
<!-- 1. 实施_课程表 SSKCB → 日期/节次/年度/删除状态 -->
<!-- 2. 实施_课程表_教室 SSKCBJS → 教室编号(JSBH) -->
<!-- 3. 教室表 JSB → 翻译教室中文名 -->
<!-- 4. 课表 KB → 翻译课程名称 -->
<!-- ============================================================ -->
<select id="selectClassroomConflictDetails"
resultType="com.roomroot.jwgl.vo.timetableconflict.TimetableConflictDetailVO">
SELECT
/* 固定维度编码:教室时间冲突 */
'CLASSROOM_CONFLICT' AS dimension_code,
'教室时间冲突' AS dimension_title,
/* 发生冲突的资源(教室)*/
g."教室编号" AS resource_id,
/* 翻译教室名称(教室表主键「教室编号」,名称「教室名称」)*/
COALESCE(r."教室名称", 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(r."教室名称", 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,筛选 COUNT(DISTINCT 课次) > 1
*
* 关键修正:
* 1. 三层关联 JOIN:SSKCB → 实施_课程 → 课表;CAST(ss.编号 AS CHAR(36))
* 2. 日期节次统一取主表 s
*
* 新增 JOIN(同其他维度):聚合该冲突课次的班次/教员/场地所有明细信息
* - INNER JOIN c 作为"维度过滤主关联"(只保留该教室的课次做分组)
* - xyd_link/fz_info/js_link 作为"聚合展示用"JOIN(WM_CONCAT DISTINCT)
*/
SELECT
c."教室编号",
s."日期",
s."节次",
COUNT(DISTINCT s."编号") AS "占用课次数",
WM_CONCAT(DISTINCT 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
/* 维度过滤主关联:教室维度分组 */
INNER JOIN "实施_课程表_教室" c ON c."实施_课程表编号" = s."编号"
/* 课表信息三层关联(ss=实施_课程别名,避免与聚合JOIN的别名冲突)*/
LEFT JOIN "实施_课程" ss ON CAST(ss."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "课表" k ON k."科目代码" = ss."科目编号"
/* ========== 新增 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 c."教室编号", s."日期", s."节次"
HAVING COUNT(DISTINCT s."编号") > 1
) g
/* 修正:教室表主键是「教室编号」,不是「编号」 */
LEFT JOIN "教室表" r ON r."教室编号" = g."教室编号"
ORDER BY g."日期", g."节次", g."教室编号"
</select>
</mapper>