部分表名写成了英文名调整

This commit is contained in:
2026-09-18 17:48:31 +08:00
parent cff7b039e3
commit 68b02ea58e
6 changed files with 215 additions and 109 deletions
@@ -2,75 +2,105 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.roomroot.jwgl.mapper.OperationAnalysisMapper">
<!--
各教学系(教研室表.部系)排课完成率:
课程归属经 实施_课程.科目编号 -> 课表.教研室代号 -> 教研室表.部系 解析;
完成判定:该课程在实施_课程表下至少有一条未删除课次。
目标表均无"学期第次"列,xqd 参数保留签名不参与过滤。
-->
<select id="selectCourseCompletionByDept" resultType="com.roomroot.jwgl.vo.courserunning.CourseCompletionByDeptVO">
SELECT
t.JXXBH as jxxbh,
t.JXXMC as jxxmc,
COUNT(c.BH) as completedCount,
SUM(c.KCS) as totalCount,
CASE WHEN SUM(c.KCS) > 0 THEN ROUND(COUNT(c.BH) * 100.0 / SUM(c.KCS), 2) ELSE 0 END as completionRate
FROM SSKC c
LEFT JOIN SSKCB b ON c.SSKCBBH = b.BH
LEFT JOIN JXX t ON b.JXXBH = t.BH
WHERE c.SCZTF = 0
COALESCE(jys.部系, '未分配') AS jxxbh,
COALESCE(jys.部系, '未分配') AS jxxmc,
COUNT(DISTINCT CASE WHEN kc.实施_课程编号 IS NOT NULL THEN c.编号 END) AS completedCount,
COUNT(DISTINCT c.编号) AS totalCount,
CASE WHEN COUNT(DISTINCT c.编号) > 0
THEN ROUND(COUNT(DISTINCT CASE WHEN kc.实施_课程编号 IS NOT NULL THEN c.编号 END) * 100.0 / COUNT(DISTINCT c.编号), 2)
ELSE 0 END AS completionRate
FROM 实施_课程 c
LEFT JOIN 课表 k ON k.课编号 = c.科目编号
LEFT JOIN 教研室表 jys ON jys.教研室代号 = k.教研室代号
LEFT JOIN (
SELECT DISTINCT 实施_课程编号
FROM 实施_课程表
WHERE COALESCE(删除状态, 0) = 0
) kc ON LOWER(RAWTOHEX(c.编号)) = LOWER(REPLACE(TRIM(kc.实施_课程编号), '-', ''))
WHERE 1 = 1
<if test="nd != null and nd != ''">
AND c.ND = #{nd}
AND c.年度 = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND c.XQD = #{xqd}
</if>
GROUP BY t.JXXBH, t.JXXMC
GROUP BY COALESCE(jys.部系, '未分配')
ORDER BY completionRate DESC
</select>
<!--
场地使用率分布(教室表.教学场地类型):
使用率 = 该场地类型下被课次实际使用的教室数 / 启用教室总数;
课次经 实施_课程表_教室 -> 实施_课程表(删除状态=0)关联。
-->
<select id="selectVenueUsageRate" resultType="com.roomroot.jwgl.vo.courserunning.VenueUsageRateVO">
SELECT
c.CDLYBH as cdlybh,
c.CDLYMC as cdlymc,
COUNT(b.BH) as usageCount,
COUNT(DISTINCT b.CDBH) as totalCount,
CASE WHEN COUNT(DISTINCT b.CDBH) > 0 THEN ROUND(COUNT(b.BH) * 100.0 / COUNT(DISTINCT b.CDBH), 2) ELSE 0 END as usageRate
FROM SSKC c
LEFT JOIN SSKCB b ON c.SSKCBBH = b.BH
LEFT JOIN CDLY cdl ON b.CDLYBH = cdl.BH
WHERE c.SCZTF = 0
<if test="nd != null and nd != ''">
AND c.ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND c.XQD = #{xqd}
</if>
GROUP BY c.CDLYBH, c.CDLYMC
t.lx AS cdlybh,
t.lx AS cdlymc,
COALESCE(u.usedCount, 0) AS usageCount,
t.totalCount,
CASE WHEN t.totalCount > 0
THEN ROUND(COALESCE(u.usedCount, 0) * 100.0 / t.totalCount, 2)
ELSE 0 END AS usageRate
FROM (
SELECT COALESCE(教学场地类型, '未分类') AS lx,
COUNT(DISTINCT 教室编号) AS totalCount
FROM 教室表
WHERE COALESCE(停用, 0) = 0
GROUP BY COALESCE(教学场地类型, '未分类')
) t
LEFT JOIN (
SELECT COALESCE(j.教学场地类型, '未分类') AS lx,
COUNT(DISTINCT kjs.教室编号) AS usedCount
FROM 实施_课程表_教室 kjs
JOIN 实施_课程表 kcb
ON kcb.编号 = kjs.实施_课程表编号
AND COALESCE(kcb.删除状态, 0) = 0
JOIN 教室表 j ON j.教室编号 = kjs.教室编号
WHERE 1 = 1
<if test="nd != null and nd != ''">
AND kcb.年度 = #{nd}
</if>
GROUP BY COALESCE(j.教学场地类型, '未分类')
) u ON u.lx = t.lx
ORDER BY usageRate DESC
</select>
<!-- 调课频次趋势:实施_调课申请按创建时间所在周(IW)聚合。 -->
<select id="selectScheduleAdjustTrend" resultType="com.roomroot.jwgl.vo.courserunning.ScheduleAdjustTrendVO">
SELECT
TO_CHAR(a.CJSJ, 'IW') as period,
'第' || TO_CHAR(a.CJSJ, 'IW') || '周' as periodName,
COUNT(a.BH) as adjustCount
FROM SSDKSQ a
WHERE a.SCZTF = 0
TO_CHAR(a.创建时间, 'IW') AS period,
'第' || TO_CHAR(a.创建时间, 'IW') || '周' AS periodName,
COUNT(a.编号) AS adjustCount
FROM 实施_调课申请 a
WHERE COALESCE(a.删除状态, 0) = 0
<if test="nd != null and nd != ''">
AND a.ND = #{nd}
AND a.年度 = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND a.XQD = #{xqd}
</if>
GROUP BY TO_CHAR(a.CJSJ, 'IW')
GROUP BY TO_CHAR(a.创建时间, 'IW')
ORDER BY period
</select>
<!-- 整体排课完成率:有未删除课次的课程数 / 课程总数。 -->
<select id="selectOverallCourseCompletionRate" resultType="java.lang.Double">
SELECT
CASE WHEN SUM(c.KCS) > 0 THEN ROUND(COUNT(c.BH) * 100.0 / SUM(c.KCS), 2) ELSE 0 END
FROM SSKC c
WHERE c.SCZTF = 0
CASE WHEN COUNT(DISTINCT c.编号) > 0
THEN ROUND(COUNT(DISTINCT CASE WHEN kc.实施_课程编号 IS NOT NULL THEN c.编号 END) * 100.0 / COUNT(DISTINCT c.编号), 2)
ELSE 0 END
FROM 实施_课程 c
LEFT JOIN (
SELECT DISTINCT 实施_课程编号
FROM 实施_课程表
WHERE COALESCE(删除状态, 0) = 0
) kc ON LOWER(RAWTOHEX(c.编号)) = LOWER(REPLACE(TRIM(kc.实施_课程编号), '-', ''))
WHERE 1 = 1
<if test="nd != null and nd != ''">
AND c.ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND c.XQD = #{xqd}
AND c.年度 = #{nd}
</if>
</select>
@@ -78,22 +108,28 @@
SELECT 0.0
</select>
<!-- 场地平均使用率:被课次使用的启用教室数 / 启用教室总数。 -->
<select id="selectVenueAvgUsageRate" resultType="java.lang.Double">
SELECT AVG(v.usageRate)
SELECT
CASE WHEN t.totalCount > 0
THEN ROUND(u.usedCount * 100.0 / t.totalCount, 2)
ELSE 0 END
FROM (
SELECT
CASE WHEN COUNT(DISTINCT b.CDBH) > 0 THEN ROUND(COUNT(b.BH) * 100.0 / COUNT(DISTINCT b.CDBH), 2) ELSE 0 END as usageRate
FROM SSKC c
LEFT JOIN SSKCB b ON c.SSKCBBH = b.BH
WHERE c.SCZTF = 0
SELECT COUNT(DISTINCT 教室编号) AS totalCount
FROM 教室表
WHERE COALESCE(停用, 0) = 0
) t,
(
SELECT COUNT(DISTINCT kjs.教室编号) AS usedCount
FROM 实施_课程表_教室 kjs
JOIN 实施_课程表 kcb
ON kcb.编号 = kjs.实施_课程表编号
AND COALESCE(kcb.删除状态, 0) = 0
WHERE 1 = 1
<if test="nd != null and nd != ''">
AND c.ND = #{nd}
AND kcb.年度 = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND c.XQD = #{xqd}
</if>
GROUP BY b.CDBH
) v
) u
</select>
<select id="selectAvgWeeklyHoursPerTeacher" resultType="java.lang.Double">
@@ -101,65 +137,52 @@
</select>
<select id="selectTotalScheduleAdjustCount" resultType="java.lang.Integer">
SELECT COUNT(BH)
FROM SSDKSQ
WHERE SCZTF = 0
SELECT COUNT(编号)
FROM 实施_调课申请
WHERE COALESCE(删除状态, 0) = 0
<if test="nd != null and nd != ''">
AND ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND XQD = #{xqd}
AND 年度 = #{nd}
</if>
</select>
<select id="selectTotalSupportPlanCount" resultType="java.lang.Integer">
SELECT COUNT(BH)
FROM KCBBZMX
WHERE SCZTF = 0
SELECT COUNT(编号)
FROM 课程表_保障明细
WHERE 1 = 1
<if test="nd != null and nd != ''">
AND ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND XQD = #{xqd}
AND 年度 = #{nd}
</if>
</select>
<!-- 学员教学请假表无"年度"列,按创建时间年份过滤。 -->
<select id="selectTotalLeaveCount" resultType="java.lang.Integer">
SELECT COUNT(BH)
FROM XYJXQJB
WHERE SCZTF = 0
SELECT COUNT(编号)
FROM 学员教学请假表
WHERE 1 = 1
<if test="nd != null and nd != ''">
AND ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND XQD = #{xqd}
AND TO_CHAR(创建时间, 'YYYY') = #{nd}
</if>
</select>
<!-- 待审批调课:教研室批准状态为 0。 -->
<select id="selectPendingAdjustCount" resultType="java.lang.Integer">
SELECT COUNT(BH)
FROM SSDKSQ
WHERE SCZTF = 0
AND JYSPZZT = 0
SELECT COUNT(编号)
FROM 实施_调课申请
WHERE COALESCE(删除状态, 0) = 0
AND COALESCE(教研室批准状态, 0) = 0
<if test="nd != null and nd != ''">
AND ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND XQD = #{xqd}
AND 年度 = #{nd}
</if>
</select>
<!-- 待审批请假:状态 = '0'。 -->
<select id="selectPendingLeaveCount" resultType="java.lang.Integer">
SELECT COUNT(BH)
FROM XYJXQJB
WHERE SCZTF = 0
AND ZT = '0'
SELECT COUNT(编号)
FROM 学员教学请假表
WHERE 状态 = '0'
<if test="nd != null and nd != ''">
AND ND = #{nd}
</if>
<if test="xqd != null and xqd != ''">
AND XQD = #{xqd}
AND TO_CHAR(创建时间, 'YYYY') = #{nd}
</if>
</select>
</mapper>
</mapper>