课表申请功能重写 bug修复

This commit is contained in:
liumengyu
2026-08-25 18:47:22 +08:00
parent aa4145fd33
commit a30b963dea
58 changed files with 1203 additions and 1632 deletions
@@ -19,7 +19,7 @@
a.数量,
a.备注
FROM "调课申请_保障明细" a
LEFT JOIN "保障提供明细表" m ON a.保障提供明细编号 = m.编号
LEFT JOIN "保障提供明细" m ON TRIM(m.编号) = TRIM(a.保障提供明细编号)
WHERE a.申请编号 = #{dksqbh}
ORDER BY a.编号
</select>
@@ -15,11 +15,11 @@
SELECT
a.编号,
a.辅助教员编号,
t.姓名 AS 辅助教员姓名,
t.教员姓名 AS 辅助教员姓名,
a.主教员,
a.备注
FROM "调课申请_辅助教员" a
LEFT JOIN "教员表" t ON a.辅助教员编号 = t.编号
LEFT JOIN "教员表" t ON TRIM(t.教员编号) = TRIM(a.辅助教员编号)
WHERE a.调课申请编号 = #{dksqbh}
ORDER BY a.编号
</select>
@@ -17,7 +17,7 @@
r.教室名称,
a.备注
FROM "调课申请_教室" a
LEFT JOIN "教室表" r ON a.教室编号 = r.编号
LEFT JOIN "教室表" r ON TRIM(r.教室编号) = TRIM(a.教室编号)
WHERE a.调课申请编号 = #{dksqbh}
ORDER BY a.编号
</select>
@@ -15,7 +15,7 @@
a.学员队编号,
d.学员队名称
FROM "调课申请_学员队" a
LEFT JOIN "学员队表" d ON a.学员队编号 = d.编号
LEFT JOIN "学员队表" d ON TRIM(d.学员队编号) = TRIM(a.学员队编号)
WHERE a.调课申请编号 = #{dksqbh}
ORDER BY a.编号
</select>
@@ -21,7 +21,7 @@
<if test="cond != null and cond.xqdc != null">
AND EXISTS (
SELECT 1 FROM "实施_课程学员队" cxf
WHERE cxf."实施_课程编号" = c."编号"
WHERE LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(cxf."实施_课程编号"), '-', ''))
AND cxf."学期第次" = #{cond.xqdc}
)
</if>
@@ -49,7 +49,7 @@
AND kcb."课次序号" = c."教员课次序号")
)) AS bz
FROM "实施_课程表" s
LEFT JOIN "实施_课程" c ON CAST(c."编号" AS CHAR(36)) = TRIM(s."实施_课程编号")
LEFT JOIN "实施_课程" c ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k ON (k."课编号" = c."科目编号" OR k."科目代码" = c."科目编号")
LEFT JOIN "教研室表" jys ON jys."教研室代号" = k."教研室代号"
LEFT JOIN "教员表" jy ON jy."教员编号" = c."教员编号"
@@ -93,7 +93,13 @@
<sql id="ClassTimetableSelect">
SELECT
c."编号" AS sskcbh,
LOWER(
SUBSTR(RAWTOHEX(c."编号"), 1, 8) || '-' ||
SUBSTR(RAWTOHEX(c."编号"), 9, 4) || '-' ||
SUBSTR(RAWTOHEX(c."编号"), 13, 4) || '-' ||
SUBSTR(RAWTOHEX(c."编号"), 17, 4) || '-' ||
SUBSTR(RAWTOHEX(c."编号"), 21, 12)
) AS sskcbh,
(NVL(k."课名称", c."科目编号")
|| ' / '
|| NVL(TO_CHAR(c."课程课时系数"), '-')) AS kcmcksxs,
@@ -101,7 +107,7 @@
|| ' / '
|| NVL(TO_CHAR(c."教员课次序号"),
TO_CHAR((SELECT COUNT(1) FROM "实施_课程表" t
WHERE CAST(c."编号" AS CHAR(36)) = TRIM(t."实施_课程编号")
WHERE LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(t."实施_课程编号"), '-', ''))
AND COALESCE(t."删除状态", 0) = 0)))) AS zrjykc,
c."学时" AS jhxs,
c."运行学时" AS yxxs,
@@ -113,15 +119,15 @@
FROM "实施_课程表" t
LEFT JOIN "实施_课程表_教室" jsx ON jsx."实施_课程表编号" = t."编号"
LEFT JOIN "教室表" js ON js."教室编号" = jsx."教室编号"
WHERE CAST(c."编号" AS CHAR(36)) = TRIM(t."实施_课程编号")
WHERE LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(t."实施_课程编号"), '-', ''))
AND COALESCE(t."删除状态", 0) = 0),
NVL(js0."教室名称", '-'))) AS rscd,
(SELECT WM_CONCAT(DISTINCT sq."事由")
FROM "实施_调课申请" sq
INNER JOIN "实施_课程表" t ON t."编号" = sq."实施_课程表编号"
WHERE CAST(c."编号" AS CHAR(36)) = TRIM(t."实施_课程编号")) AS ssjhbg
WHERE LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(t."实施_课程编号"), '-', ''))) AS ssjhbg
FROM "实施_课程" c
INNER JOIN "实施_课程学员队" cx ON cx."实施_课程编号" = c."编号"
INNER JOIN "实施_课程学员队" cx ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(cx."实施_课程编号"), '-', ''))
LEFT JOIN "学员队表" xyd ON xyd."学员队编号" = cx."学员队编号"
LEFT JOIN "课表" k ON (k."课编号" = c."科目编号" OR k."科目代码" = c."科目编号")
LEFT JOIN "教员表" zjy ON zjy."教员编号" = c."责任教员编号"
@@ -30,7 +30,6 @@ public interface SSDKSQMapper extends BaseMapper<SSDKSQ> {
@Param("nd") Integer nd,
@Param("jyspzzt") Integer jyspzzt,
@Param("jyscszt") Integer jyscszt,
@Param("jgspzt") Integer jgspzt,
@Param("sczt") Integer sczt,
@Param("cjsjStart") String cjsjStart,
@Param("cjsjEnd") String cjsjEnd);
@@ -22,7 +22,6 @@
<result column="创建时间" property="cjsj"/>
<result column="教研室批准状态" property="jyspzzt"/>
<result column="教研室查收状态" property="jyscszt"/>
<result column="机关审批状态" property="jgspzt"/>
<result column="发回意见" property="fhyj"/>
<result column="删除状态" property="sczt"/>
</resultMap>
@@ -57,6 +56,7 @@
<result column="教研室查收状态" property="jyscszt"/>
<result column="教研室查收时间" property="jyscssj"/>
<result column="教研室查收人编号" property="jyscsrbh"/>
<result column="发回意见" property="fhyj"/>
</resultMap>
<resultMap id="AdjustableLessonMap" type="com.roomroot.jwgl.vo.courserunning.AdjustableLessonVO">
@@ -103,17 +103,11 @@
a.创建时间,
a.教研室批准状态,
a.教研室查收状态,
(
SELECT MAX(sp.审批状态)
FROM "实施_调课申请审批" sp
WHERE sp.实施_调课申请编号 = a.编号
AND sp.审批状态 IS NOT NULL
) AS 机关审批状态,
a.发回意见,
a.删除状态
FROM "实施_调课申请" a
LEFT JOIN "实施_课程表" b ON TRIM(b.编号) = TRIM(a.实施_课程表编号)
LEFT JOIN "实施_课程" e ON CAST(e.编号 AS CHAR(36)) = TRIM(b.实施_课程编号)
LEFT JOIN "实施_课程" e ON LOWER(RAWTOHEX(e."编号")) = LOWER(REPLACE(TRIM(b.实施_课程编号), '-', ''))
LEFT JOIN "课表" kb ON kb.课编号 = COALESCE(NULLIF(TRIM(a.课编号), ''), e.科目编号)
LEFT JOIN "教员表" j ON TRIM(j.教员编号) = TRIM(a.申请教员编号)
LEFT JOIN "课程表" kcb ON TRIM(kcb.编号) = TRIM(a.课程表编号)
@@ -142,14 +136,6 @@
<if test="jyscszt != null">
AND a.教研室查收状态 = #{jyscszt}
</if>
<if test="jgspzt != null">
AND (
SELECT MAX(sp.审批状态)
FROM "实施_调课申请审批" sp
WHERE sp.实施_调课申请编号 = a.编号
AND sp.审批状态 IS NOT NULL
) = #{jgspzt}
</if>
<if test="sczt != null">
AND a.删除状态 = #{sczt}
</if>
@@ -197,10 +183,11 @@
a.教研室批准人编号,
a.教研室查收状态,
a.教研室查收时间,
a.教研室查收人编号
a.教研室查收人编号,
a.发回意见
FROM "实施_调课申请" a
LEFT JOIN "实施_课程表" b ON TRIM(b.编号) = TRIM(a.实施_课程表编号)
LEFT JOIN "实施_课程" e ON CAST(e.编号 AS CHAR(36)) = TRIM(b.实施_课程编号)
LEFT JOIN "实施_课程" e ON LOWER(RAWTOHEX(e."编号")) = LOWER(REPLACE(TRIM(b.实施_课程编号), '-', ''))
LEFT JOIN "课表" kb ON kb.课编号 = COALESCE(NULLIF(TRIM(a.课编号), ''), e.科目编号)
LEFT JOIN "教员表" j ON TRIM(j.教员编号) = TRIM(a.申请教员编号)
WHERE a.编号 = #{ssdksqbh}
@@ -252,7 +239,7 @@
AND kcb.年度 = e.年度
) AS 课程表编号
FROM "实施_课程表" b
JOIN "实施_课程" e ON CAST(e.编号 AS CHAR(36)) = TRIM(b.实施_课程编号)
JOIN "实施_课程" e ON LOWER(RAWTOHEX(e."编号")) = LOWER(REPLACE(TRIM(b.实施_课程编号), '-', ''))
LEFT JOIN "课表" kb ON kb.课编号 = e.科目编号
LEFT JOIN "教员表" jy ON TRIM(jy.教员编号) = TRIM(e.教员编号)
WHERE COALESCE(b.删除状态, 0) = 0
@@ -1,30 +0,0 @@
package com.roomroot.jwgl.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.roomroot.jwgl.entity.SSDKSQSP;
import com.roomroot.jwgl.vo.courserunning.ScheduleAdjustAuditVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 实施_调课申请审批 Mapper。
* <p>
* 提供调课申请审批记录数据的CRUD操作及自定义查询。
* </p>
*/
@Mapper
public interface SSDKSQSPMapper extends BaseMapper<SSDKSQSP> {
/**
* 根据调课申请编号查询审批记录列表。
* <p>
* 关联机构表获取机关名称,关联教员表获取审批人姓名。
* </p>
*
* @param ssdksqbh 调课申请编号
* @return 审批记录列表
*/
List<ScheduleAdjustAuditVO> selectBySsdksqbh(@Param("ssdksqbh") String ssdksqbh);
}
@@ -1,45 +0,0 @@
<?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.SSDKSQSPMapper">
<!-- 调课申请审批记录结果映射 -->
<resultMap id="ScheduleAdjustAuditMap" type="com.roomroot.jwgl.vo.courserunning.ScheduleAdjustAuditVO">
<result column="编号" property="bh"/>
<result column="实施_调课申请编号" property="ssdksqbh"/>
<result column="机关编号" property="jgbh"/>
<result column="机关名称" property="jgmc"/>
<result column="审批时间" property="spsj"/>
<result column="审批状态" property="spzt"/>
<result column="审批人编号" property="sprbh"/>
<result column="审批人姓名" property="sprxm"/>
<result column="查收状态" property="cszt"/>
<result column="查收时间" property="cssj"/>
<result column="查收人编号" property="csrbh"/>
<result column="发回意见" property="fhyj"/>
<result column="年度" property="nd"/>
</resultMap>
<!-- 根据调课申请编号查询审批记录列表 -->
<select id="selectBySsdksqbh" resultMap="ScheduleAdjustAuditMap">
SELECT
a.编号,
a.实施_调课申请编号,
a.机关编号,
j.名称 AS 机关名称,
a.审批时间,
a.审批状态,
a.审批人编号,
t.姓名 AS 审批人姓名,
a.查收状态,
a.查收时间,
a.查收人编号,
a.发回意见,
a.年度
FROM "实施_调课申请审批" a
LEFT JOIN "机构表" j ON a.机关编号 = j.编号
LEFT JOIN "教员表" t ON a.审批人编号 = t.编号
WHERE a.实施_调课申请编号 = #{ssdksqbh}
ORDER BY a.创建时间 DESC
</select>
</mapper>
@@ -61,7 +61,7 @@
* 内层:按教员编号+日期+节次 GROUP BY,筛选出现>1课次的冲突
*
* 关键修正:
* 1. 关联链路:SSKCB → 实施_课程 c → 课表 k;必须 CAST(c.编号 AS CHAR(36))
* 1. 关联链路:SSKCB → 实施_课程 c → 课表 k;VARBINARY 主键用 RAWTOHEX 对齐 CHAR 外键
* 2. 主讲/辅讲字段:真实列名「主教员」(1主/0辅)
* 3. 日期节次:统一取主表 s
*
@@ -92,7 +92,7 @@
/* 维度过滤主关联:只看该教员的课次(GROUP BY 维度)*/
INNER JOIN "实施_课程表_辅助教员" f ON f."实施_课程表编号" = s."编号"
/* 课表信息三层关联 */
LEFT JOIN "实施_课程" c ON CAST(c."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "实施_课程" c ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k ON k."科目代码" = c."科目编号"
/* ========== 新增 JOIN:聚合该冲突课次的班次/教员/场地所有信息 ========== */
LEFT JOIN "实施_课程表_学员队" xyd_link ON xyd_link."实施_课程表编号" = s."编号"
@@ -62,7 +62,7 @@
* 内层:按教室编号+日期+节次 GROUP BY,筛选 COUNT(DISTINCT 课次) > 1
*
* 关键修正:
* 1. 三层关联 JOIN:SSKCB → 实施_课程 → 课表;CAST(ss.编号 AS CHAR(36))
* 1. 三层关联 JOIN:SSKCB → 实施_课程 → 课表;VARBINARY 主键用 RAWTOHEX 对齐 CHAR 外键
* 2. 日期节次统一取主表 s
*
* 新增 JOIN(同其他维度):聚合该冲突课次的班次/教员/场地所有明细信息
@@ -88,7 +88,7 @@
/* 维度过滤主关联:教室维度分组 */
INNER JOIN "实施_课程表_教室" c ON c."实施_课程表编号" = s."编号"
/* 课表信息三层关联(ss=实施_课程别名,避免与聚合JOIN的别名冲突)*/
LEFT JOIN "实施_课程" ss ON CAST(ss."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "实施_课程" ss ON LOWER(RAWTOHEX(ss."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k ON k."科目代码" = ss."科目编号"
/* ========== 新增 JOIN:聚合该冲突课次的班次/教员/场地所有信息 ========== */
LEFT JOIN "实施_课程表_学员队" xyd_link ON xyd_link."实施_课程表编号" = s."编号"
@@ -60,7 +60,7 @@
b.创建时间,
b.变动时间
FROM "实施_课程表" b
LEFT JOIN "实施_课程" a ON b.实施_课程编号 = a.编号
LEFT JOIN "实施_课程" a ON LOWER(RAWTOHEX(a."编号")) = LOWER(REPLACE(TRIM(b.实施_课程编号), '-', ''))
LEFT JOIN "课程表" c ON a.课编号 = c.课编号
WHERE b.删除状态 = 0
<if test="sskcbh != null and sskcbh != ''">
@@ -116,7 +116,7 @@
b.创建时间,
b.变动时间
FROM "实施_课程表" b
LEFT JOIN "实施_课程" a ON b.实施_课程编号 = a.编号
LEFT JOIN "实施_课程" a ON LOWER(RAWTOHEX(a."编号")) = LOWER(REPLACE(TRIM(b.实施_课程编号), '-', ''))
LEFT JOIN "课程表" c ON a.课编号 = c.课编号
WHERE b.编号 = #{sskcbbh}
AND b.删除状态 = 0
@@ -32,10 +32,11 @@
JOIN "实施_课程表_学员队" t ON t."实施_课程表编号" = s."编号"
<!--
修正:三层关联 SSKCB → 实施_课程 → 课表
- 类型转换:c."编号" 是 VARBINARY,s."实施_课程编号" 是 CHAR,必须 CAST 才能匹配上
- 类型转换:c."编号" 是 VARBINARY(16),s."实施_课程编号" 是 CHAR(36);
禁止直接等号(-6147),须 RAWTOHEX 去横线后比较
- 科目关联:KB.科目代码 = SSKC.科目编号
-->
LEFT JOIN "实施_课程" c ON CAST(c."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "实施_课程" c ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k ON k."科目代码" = c."科目编号"
WHERE t."学员队编号" = #{xydbh}
<if test="nd != null">
@@ -126,7 +127,7 @@
/* 维度过滤用:主关联"教学班(学员队)" —— 教学班冲突就是按这个维度 GROUP BY */
INNER JOIN "实施_课程表_学员队" t ON t."实施_课程表编号" = s."编号"
/* 课表信息三层关联 */
LEFT JOIN "实施_课程" c ON CAST(c."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "实施_课程" c ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k ON k."科目代码" = c."科目编号"
/* ========== 新增 JOIN:聚合该冲突课次涉及的所有班次/教员/教室信息 ========== */
LEFT JOIN "实施_课程表_学员队" xyd_link ON xyd_link."实施_课程表编号" = s."编号"
@@ -206,7 +207,7 @@
WM_CONCAT(DISTINCT xyd_info."所属单位") AS responsible_dept_list
FROM "实施_课程表" s
INNER JOIN "实施_课程表_学员队" t ON t."实施_课程表编号" = s."编号"
LEFT JOIN "实施_课程" c ON CAST(c."编号" AS CHAR(36)) = s."实施_课程编号"
LEFT JOIN "实施_课程" c ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k ON k."科目代码" = c."科目编号"
/* ========== 新增 JOIN:三类业务信息 ========== */
LEFT JOIN "实施_课程表_学员队" xyd_link ON xyd_link."实施_课程表编号" = s."编号"
@@ -2,20 +2,32 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.roomroot.jwgl.mapper.SSKCMapper">
<select id="selectBySemester" resultType="com.roomroot.jwgl.entity.SSKC">
<resultMap id="SSKCMap" type="com.roomroot.jwgl.entity.SSKC" autoMapping="true">
<id column="编号" property="bh" jdbcType="VARBINARY"
typeHandler="com.roomroot.jwgl.handler.DmGuidTypeHandler"/>
</resultMap>
<select id="selectBySemester" resultMap="SSKCMap">
SELECT * FROM 实施_课程
WHERE 年度 = #{nd} AND 学期第次 = #{xqdc} AND 停用 = 0
</select>
<select id="selectByClassBh" resultType="com.roomroot.jwgl.entity.SSKC">
<!--
达梦:实施_课程.编号 为 VARBINARY(16),实施_课程学员队.实施_课程编号 为 CHAR(36)。
禁止 编号 = 实施_课程编号:达梦会把 CHAR 当十六进制转 VARBINARY,UUID 中的 '-' 报 -6147。
统一:LOWER(RAWTOHEX(主键)) = LOWER(REPLACE(TRIM(外键), '-', ''))
-->
<select id="selectByClassBh" resultMap="SSKCMap">
SELECT DISTINCT sc.* FROM 实施_课程 sc
INNER JOIN 实施_课程学员队 scxd ON sc.编号 = scxd.实施_课程编号
INNER JOIN 实施_课程学员队 scxd
ON LOWER(RAWTOHEX(sc."编号")) = LOWER(REPLACE(TRIM(scxd."实施_课程编号"), '-', ''))
WHERE scxd.学员队编号 = #{classBh} AND sc.年度 = #{nd} AND sc.停用 = 0
</select>
<select id="selectByCourseBhAndClassBh" resultType="com.roomroot.jwgl.entity.SSKC">
<select id="selectByCourseBhAndClassBh" resultMap="SSKCMap">
SELECT sc.* FROM 实施_课程 sc
INNER JOIN 实施_课程学员队 scxd ON sc.编号 = scxd.实施_课程编号
INNER JOIN 实施_课程学员队 scxd
ON LOWER(RAWTOHEX(sc."编号")) = LOWER(REPLACE(TRIM(scxd."实施_课程编号"), '-', ''))
WHERE sc.课编号 = #{courseBh} AND scxd.学员队编号 = #{classBh} AND sc.年度 = #{nd} AND sc.停用 = 0
</select>
@@ -1,16 +0,0 @@
package com.roomroot.jwgl.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.roomroot.jwgl.entity.ScheduleAdjustStrategy;
import org.apache.ibatis.annotations.Mapper;
/**
* 实施_调课策略 Mapper。
* <p>
* 提供调课策略的基础 CRUD 能力,时间段限制与免审批策略的匹配查询
* 由 Service 层调用 BaseMapper 方法完成。
* </p>
*/
@Mapper
public interface ScheduleAdjustStrategyMapper extends BaseMapper<ScheduleAdjustStrategy> {
}
@@ -1,12 +1,14 @@
package com.roomroot.jwgl.mapper;
import com.roomroot.jwgl.vo.jwtest.PkConflictVO;
import com.roomroot.jwgl.vo.jwtest.PkLessonVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 排课测试全查。
* 排课测试全查与冲突检查。
*/
@Mapper
public interface TestPkMapper {
@@ -15,4 +17,24 @@ public interface TestPkMapper {
* 查询全部排课记录,无筛选条件。
*/
List<PkLessonVO> selectAll();
/**
* 同一班次同一日期节次被安排多门课程。
*/
List<PkConflictVO> selectClassTimeConflict(@Param("nd") Integer nd);
/**
* 同一班次同一日期节次必修课与选修课重叠。
*/
List<PkConflictVO> selectElectiveRequiredConflict(@Param("nd") Integer nd);
/**
* 同一教员同一日期节次被安排多门课程。
*/
List<PkConflictVO> selectTeacherTimeConflict(@Param("nd") Integer nd);
/**
* 同一教室同一日期节次被多门课程占用。
*/
List<PkConflictVO> selectClassroomTimeConflict(@Param("nd") Integer nd);
}
@@ -39,8 +39,8 @@
INNER JOIN "实施_课程表" s
ON TRIM(s."编号") = TRIM(tx."实施_课程表编号")
LEFT JOIN "实施_课程" c
ON REPLACE(LOWER(TRIM(CAST(c."编号" AS CHAR(36)))), '-', '')
= REPLACE(LOWER(TRIM(s."实施_课程编号")), '-', '')
ON LOWER(RAWTOHEX(c."编号"))
= LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k
ON k."课编号" = c."科目编号"
LEFT JOIN "课程表" kcb
@@ -64,4 +64,247 @@
GROUP BY s."编号", s."日期", s."节次", s."年度"
</select>
<!-- 课次明细:一门课一行,含课程/教员/班次/教室/节次时间 -->
<sql id="pkLessonRows">
SELECT
s."编号" AS kcbh,
TO_CHAR(s."日期", 'YYYY-MM-DD') AS skrq,
s."日期" AS rq,
s."节次" AS jc,
MAX(jc."开始时间") AS kssj,
MAX(jc."结束时间") AS jssj,
COALESCE(NULLIF(TRIM(MAX(s."教学内容")), ''), MAX(k."课名称")) AS ktmc,
MAX(k."课名称") AS kcmc,
MAX(NVL(k."课程类型", NVL(k."课类型", c."课类型"))) AS kclx,
COALESCE(WM_CONCAT(DISTINCT jyf."教员姓名"), MAX(jy."教员姓名")) AS jymc,
WM_CONCAT(DISTINCT xyd."学员队名称") AS bjmc,
COALESCE(WM_CONCAT(DISTINCT jsb."教室名称"), MAX(js."教室名称")) AS jsmc
FROM "实施_课程表" s
LEFT JOIN "实施_课程" c
ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课表" k
ON (k."课编号" = c."科目编号" OR k."科目代码" = c."科目编号")
LEFT JOIN "课程表" kcb
ON kcb."年度" = s."年度"
AND kcb."安排时间" = s."计划时间安排"
AND TRIM(kcb."教员编号") = TRIM(c."教员编号")
LEFT JOIN "教员表" jy
ON TRIM(jy."教员编号") = TRIM(NVL(kcb."授课教员编号", c."教员编号"))
LEFT JOIN "实施_课程表_辅助教员" fz ON TRIM(fz."实施_课程表编号") = TRIM(s."编号")
LEFT JOIN "教员表" jyf ON TRIM(jyf."教员编号") = TRIM(fz."辅助教员编号")
LEFT JOIN "实施_课程表_学员队" tx ON TRIM(tx."实施_课程表编号") = TRIM(s."编号")
LEFT JOIN "学员队表" xyd ON xyd."学员队编号" = tx."学员队编号"
LEFT JOIN "实施_课程表_教室" jsx ON TRIM(jsx."实施_课程表编号") = TRIM(s."编号")
LEFT JOIN "教室表" jsb ON jsb."教室编号" = jsx."教室编号"
LEFT JOIN "教室表" js ON js."教室编号" = NVL(kcb."教室编号", c."教室编号")
LEFT JOIN "节次时间表" jc ON TRIM(jc."节次索引") = TRIM(CAST(s."节次" AS VARCHAR))
WHERE NVL(s."删除状态", 0) = 0
<if test="nd != null">
AND s."年度" = #{nd}
</if>
GROUP BY s."编号", s."日期", s."节次"
</sql>
<!-- 1. 同一班次同一时间被安排多门课程 -->
<select id="selectClassTimeConflict" resultType="com.roomroot.jwgl.vo.jwtest.PkConflictVO">
WITH lesson AS (
<include refid="pkLessonRows"/>
)
SELECT
'教学班时间冲突' AS ctlx,
COALESCE(xyd."学员队名称", ta."学员队编号") AS ctzy,
a.skrq AS skrq,
a.jc AS jc,
a.kssj AS kssj,
a.jssj AS jssj,
'【' || COALESCE(xyd."学员队名称", ta."学员队编号") || '】在 '
|| a.skrq || ' 第' || CAST(a.jc AS VARCHAR) || '节('
|| NVL(a.kssj, '-') || '~' || NVL(a.jssj, '-') || ')同时安排了《'
|| NVL(a.kcmc, NVL(a.ktmc, '未命名')) || '》(教员:' || NVL(a.jymc, '无')
|| ',教室:' || NVL(a.jsmc, '无') || ')与《'
|| NVL(b.kcmc, NVL(b.ktmc, '未命名')) || '》(教员:' || NVL(b.jymc, '无')
|| ',教室:' || NVL(b.jsmc, '无') || ')' AS sm,
a.kcbh AS aKcBh, a.ktmc AS aKtmc, a.kcmc AS aKcmc, a.kclx AS aKclx,
a.jymc AS aJymc, a.bjmc AS aBjmc, a.jsmc AS aJsmc,
b.kcbh AS bKcBh, b.ktmc AS bKtmc, b.kcmc AS bKcmc, b.kclx AS bKclx,
b.jymc AS bJymc, b.bjmc AS bBjmc, b.jsmc AS bJsmc
FROM lesson a
INNER JOIN lesson b
ON TRUNC(a.rq) = TRUNC(b.rq)
AND a.jc = b.jc
AND TRIM(a.kcbh) &lt; TRIM(b.kcbh)
INNER JOIN "实施_课程表_学员队" ta ON TRIM(ta."实施_课程表编号") = TRIM(a.kcbh)
INNER JOIN "实施_课程表_学员队" tb
ON TRIM(tb."实施_课程表编号") = TRIM(b.kcbh)
AND ta."学员队编号" = tb."学员队编号"
LEFT JOIN "学员队表" xyd ON xyd."学员队编号" = ta."学员队编号"
ORDER BY a.rq, a.jc, ta."学员队编号"
</select>
<!-- 2. 同一班次同一时间必修课与选修课冲突 -->
<select id="selectElectiveRequiredConflict" resultType="com.roomroot.jwgl.vo.jwtest.PkConflictVO">
WITH lesson AS (
<include refid="pkLessonRows"/>
)
SELECT
'必修选修时间冲突' AS ctlx,
COALESCE(xyd."学员队名称", ta."学员队编号") AS ctzy,
a.skrq AS skrq,
a.jc AS jc,
a.kssj AS kssj,
a.jssj AS jssj,
'【' || COALESCE(xyd."学员队名称", ta."学员队编号") || '】在 '
|| a.skrq || ' 第' || CAST(a.jc AS VARCHAR) || '节('
|| NVL(a.kssj, '-') || '~' || NVL(a.jssj, '-') || ')必修课《'
|| NVL(CASE WHEN INSTR(NVL(a.kclx, ''), '选修') &gt; 0 THEN b.kcmc ELSE a.kcmc END,
'未命名')
|| '》与选修课《'
|| NVL(CASE WHEN INSTR(NVL(a.kclx, ''), '选修') &gt; 0 THEN a.kcmc ELSE b.kcmc END,
'未命名')
|| '》时间重叠;教员分别为 '
|| NVL(a.jymc, '无') || ' / ' || NVL(b.jymc, '无')
|| ',教室分别为 '
|| NVL(a.jsmc, '无') || ' / ' || NVL(b.jsmc, '无') AS sm,
a.kcbh AS aKcBh, a.ktmc AS aKtmc, a.kcmc AS aKcmc, a.kclx AS aKclx,
a.jymc AS aJymc, a.bjmc AS aBjmc, a.jsmc AS aJsmc,
b.kcbh AS bKcBh, b.ktmc AS bKtmc, b.kcmc AS bKcmc, b.kclx AS bKclx,
b.jymc AS bJymc, b.bjmc AS bBjmc, b.jsmc AS bJsmc
FROM lesson a
INNER JOIN lesson b
ON TRUNC(a.rq) = TRUNC(b.rq)
AND a.jc = b.jc
AND TRIM(a.kcbh) &lt; TRIM(b.kcbh)
INNER JOIN "实施_课程表_学员队" ta ON TRIM(ta."实施_课程表编号") = TRIM(a.kcbh)
INNER JOIN "实施_课程表_学员队" tb
ON TRIM(tb."实施_课程表编号") = TRIM(b.kcbh)
AND ta."学员队编号" = tb."学员队编号"
LEFT JOIN "学员队表" xyd ON xyd."学员队编号" = ta."学员队编号"
WHERE (
INSTR(NVL(a.kclx, ''), '必修') &gt; 0 AND INSTR(NVL(b.kclx, ''), '选修') &gt; 0
) OR (
INSTR(NVL(a.kclx, ''), '选修') &gt; 0 AND INSTR(NVL(b.kclx, ''), '必修') &gt; 0
)
ORDER BY a.rq, a.jc, ta."学员队编号"
</select>
<!-- 3. 同一教员同一时间被安排多门课程 -->
<select id="selectTeacherTimeConflict" resultType="com.roomroot.jwgl.vo.jwtest.PkConflictVO">
WITH lesson AS (
<include refid="pkLessonRows"/>
),
teacher_link AS (
SELECT TRIM(s."编号") AS kcbh, TRIM(NVL(kcb."授课教员编号", c."教员编号")) AS jybh
FROM "实施_课程表" s
LEFT JOIN "实施_课程" c
ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课程表" kcb
ON kcb."年度" = s."年度"
AND kcb."安排时间" = s."计划时间安排"
AND TRIM(kcb."教员编号") = TRIM(c."教员编号")
WHERE NVL(s."删除状态", 0) = 0
AND TRIM(NVL(kcb."授课教员编号", c."教员编号")) IS NOT NULL
AND TRIM(NVL(kcb."授课教员编号", c."教员编号")) &lt;&gt; ''
<if test="nd != null">
AND s."年度" = #{nd}
</if>
UNION
SELECT TRIM(fz."实施_课程表编号") AS kcbh, TRIM(fz."辅助教员编号") AS jybh
FROM "实施_课程表_辅助教员" fz
INNER JOIN "实施_课程表" s ON TRIM(s."编号") = TRIM(fz."实施_课程表编号")
WHERE NVL(s."删除状态", 0) = 0
AND TRIM(fz."辅助教员编号") IS NOT NULL
AND TRIM(fz."辅助教员编号") &lt;&gt; ''
<if test="nd != null">
AND s."年度" = #{nd}
</if>
)
SELECT
'教员时间冲突' AS ctlx,
COALESCE(jy."教员姓名", ta.jybh) AS ctzy,
a.skrq AS skrq,
a.jc AS jc,
a.kssj AS kssj,
a.jssj AS jssj,
'教员【' || COALESCE(jy."教员姓名", ta.jybh) || '】在 '
|| a.skrq || ' 第' || CAST(a.jc AS VARCHAR) || '节('
|| NVL(a.kssj, '-') || '~' || NVL(a.jssj, '-') || ')同时被安排《'
|| NVL(a.kcmc, NVL(a.ktmc, '未命名')) || '》(班级:' || NVL(a.bjmc, '无')
|| ',教室:' || NVL(a.jsmc, '无') || ')与《'
|| NVL(b.kcmc, NVL(b.ktmc, '未命名')) || '》(班级:' || NVL(b.bjmc, '无')
|| ',教室:' || NVL(b.jsmc, '无') || ')' AS sm,
a.kcbh AS aKcBh, a.ktmc AS aKtmc, a.kcmc AS aKcmc, a.kclx AS aKclx,
a.jymc AS aJymc, a.bjmc AS aBjmc, a.jsmc AS aJsmc,
b.kcbh AS bKcBh, b.ktmc AS bKtmc, b.kcmc AS bKcmc, b.kclx AS bKclx,
b.jymc AS bJymc, b.bjmc AS bBjmc, b.jsmc AS bJsmc
FROM lesson a
INNER JOIN lesson b
ON TRUNC(a.rq) = TRUNC(b.rq)
AND a.jc = b.jc
AND TRIM(a.kcbh) &lt; TRIM(b.kcbh)
INNER JOIN teacher_link ta ON TRIM(ta.kcbh) = TRIM(a.kcbh)
INNER JOIN teacher_link tb ON TRIM(tb.kcbh) = TRIM(b.kcbh) AND ta.jybh = tb.jybh
LEFT JOIN "教员表" jy ON TRIM(jy."教员编号") = ta.jybh
ORDER BY a.rq, a.jc, ta.jybh
</select>
<!-- 4. 同一教室同一时间被多门课程占用 -->
<select id="selectClassroomTimeConflict" resultType="com.roomroot.jwgl.vo.jwtest.PkConflictVO">
WITH lesson AS (
<include refid="pkLessonRows"/>
),
room_link AS (
SELECT TRIM(s."编号") AS kcbh, TRIM(NVL(kcb."教室编号", c."教室编号")) AS jsbh
FROM "实施_课程表" s
LEFT JOIN "实施_课程" c
ON LOWER(RAWTOHEX(c."编号")) = LOWER(REPLACE(TRIM(s."实施_课程编号"), '-', ''))
LEFT JOIN "课程表" kcb
ON kcb."年度" = s."年度"
AND kcb."安排时间" = s."计划时间安排"
AND TRIM(kcb."教员编号") = TRIM(c."教员编号")
WHERE NVL(s."删除状态", 0) = 0
AND TRIM(NVL(kcb."教室编号", c."教室编号")) IS NOT NULL
AND TRIM(NVL(kcb."教室编号", c."教室编号")) &lt;&gt; ''
<if test="nd != null">
AND s."年度" = #{nd}
</if>
UNION
SELECT TRIM(jsx."实施_课程表编号") AS kcbh, TRIM(jsx."教室编号") AS jsbh
FROM "实施_课程表_教室" jsx
INNER JOIN "实施_课程表" s ON TRIM(s."编号") = TRIM(jsx."实施_课程表编号")
WHERE NVL(s."删除状态", 0) = 0
AND TRIM(jsx."教室编号") IS NOT NULL
AND TRIM(jsx."教室编号") &lt;&gt; ''
<if test="nd != null">
AND s."年度" = #{nd}
</if>
)
SELECT
'教室时间冲突' AS ctlx,
COALESCE(js."教室名称", ta.jsbh) AS ctzy,
a.skrq AS skrq,
a.jc AS jc,
a.kssj AS kssj,
a.jssj AS jssj,
'教室【' || COALESCE(js."教室名称", ta.jsbh) || '】在 '
|| a.skrq || ' 第' || CAST(a.jc AS VARCHAR) || '节('
|| NVL(a.kssj, '-') || '~' || NVL(a.jssj, '-') || ')同时被《'
|| NVL(a.kcmc, NVL(a.ktmc, '未命名')) || '》(教员:' || NVL(a.jymc, '无')
|| ',班级:' || NVL(a.bjmc, '无') || ')与《'
|| NVL(b.kcmc, NVL(b.ktmc, '未命名')) || '》(教员:' || NVL(b.jymc, '无')
|| ',班级:' || NVL(b.bjmc, '无') || ')占用' AS sm,
a.kcbh AS aKcBh, a.ktmc AS aKtmc, a.kcmc AS aKcmc, a.kclx AS aKclx,
a.jymc AS aJymc, a.bjmc AS aBjmc, a.jsmc AS aJsmc,
b.kcbh AS bKcBh, b.ktmc AS bKtmc, b.kcmc AS bKcmc, b.kclx AS bKclx,
b.jymc AS bJymc, b.bjmc AS bBjmc, b.jsmc AS bJsmc
FROM lesson a
INNER JOIN lesson b
ON TRUNC(a.rq) = TRUNC(b.rq)
AND a.jc = b.jc
AND TRIM(a.kcbh) &lt; TRIM(b.kcbh)
INNER JOIN room_link ta ON TRIM(ta.kcbh) = TRIM(a.kcbh)
INNER JOIN room_link tb ON TRIM(tb.kcbh) = TRIM(b.kcbh) AND ta.jsbh = tb.jsbh
LEFT JOIN "教室表" js ON TRIM(js."教室编号") = ta.jsbh
ORDER BY a.rq, a.jc, ta.jsbh
</select>
</mapper>
@@ -216,7 +216,7 @@
LEFT JOIN "教员表" j ON j."教员编号" = sp."审批人编号"
LEFT JOIN "请假课堂表" qjkt ON qjkt."请假编号" = q."编号"
LEFT JOIN "实施_课程表" sskcb ON sskcb."编号" = qjkt."实施_课堂编号"
LEFT JOIN "实施_课程" sskc ON sskcb."实施_课程编号" = sskc."编号"
LEFT JOIN "实施_课程" sskc ON LOWER(RAWTOHEX(sskc."编号")) = LOWER(REPLACE(TRIM(sskcb."实施_课程编号"), '-', ''))
LEFT JOIN "课表" kb ON sskc."科目编号" = kb."课编号"
WHERE q."编号" = #{qjbh}
</select>