diagnose_quota_display_issue_correct.sql 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. -- ===================================================================
  2. -- 奖学金名额显示问题诊断脚本 (修正版)
  3. -- 创建时间: 2025-01-27
  4. -- 目的: 检查班级名额分配和奖学金类型的数据完整性
  5. -- ===================================================================
  6. -- 1. 检查当前班主任和班级信息
  7. SELECT
  8. '=== 1. 班主任和班级信息检查 ===' as info;
  9. SELECT
  10. u.user_id,
  11. u.user_name,
  12. u.nick_name,
  13. c.class_id,
  14. c.class_name,
  15. c.grade,
  16. c.dept_id
  17. FROM sys_user u
  18. LEFT JOIN xg_class_info c ON u.user_id = c.head_teacher_id
  19. WHERE u.user_type = '03' -- 班主任
  20. AND c.class_id IS NOT NULL
  21. ORDER BY c.class_id;
  22. -- 2. 检查奖学金批次信息
  23. SELECT
  24. '=== 2. 奖学金批次信息检查 ===' as info;
  25. SELECT
  26. batch_id,
  27. batch_name,
  28. batch_status,
  29. start_date,
  30. end_date,
  31. create_time
  32. FROM jcbt_scholarship_batch
  33. WHERE batch_status = '1' -- 启用状态
  34. ORDER BY create_time DESC;
  35. -- 3. 检查奖学金类型信息
  36. SELECT
  37. '=== 3. 奖学金类型信息检查 ===' as info;
  38. SELECT
  39. st.type_id,
  40. st.type_name,
  41. st.type_level,
  42. st.type_status,
  43. bt.batch_id,
  44. b.batch_name
  45. FROM jcbt_scholarship_type st
  46. LEFT JOIN jcbt_scholarship_batch_type bt ON st.type_id = bt.type_id
  47. LEFT JOIN jcbt_scholarship_batch b ON bt.batch_id = b.batch_id
  48. WHERE st.type_status = '1' -- 启用状态
  49. ORDER BY st.type_level, st.type_name;
  50. -- 4. 检查班级名额分配情况
  51. SELECT
  52. '=== 4. 班级名额分配情况检查 ===' as info;
  53. SELECT
  54. cq.quota_id,
  55. cq.batch_id,
  56. b.batch_name,
  57. cq.type_id,
  58. st.type_name,
  59. cq.class_id,
  60. c.class_name,
  61. cq.allocated_quota,
  62. cq.create_time
  63. FROM jcbt_scholarship_class_quota cq
  64. LEFT JOIN jcbt_scholarship_batch b ON cq.batch_id = b.batch_id
  65. LEFT JOIN jcbt_scholarship_type st ON cq.type_id = st.type_id
  66. LEFT JOIN xg_class_info c ON cq.class_id = c.class_id
  67. ORDER BY cq.batch_id, cq.class_id, cq.type_id;
  68. -- 5. 检查已使用名额情况
  69. SELECT
  70. '=== 5. 已使用名额情况检查 ===' as info;
  71. SELECT
  72. sa.batch_id,
  73. b.batch_name,
  74. sa.scholarship_type_id,
  75. st.type_name,
  76. sa.applicant_class_id,
  77. c.class_name,
  78. COUNT(*) as used_quota,
  79. GROUP_CONCAT(sa.application_status) as status_list
  80. FROM jcbt_scholarship_application sa
  81. LEFT JOIN jcbt_scholarship_batch b ON sa.batch_id = b.batch_id
  82. LEFT JOIN jcbt_scholarship_type st ON sa.scholarship_type_id = st.type_id
  83. LEFT JOIN xg_class_info c ON sa.applicant_class_id = c.class_id
  84. WHERE sa.application_status IN ('submitted', 'approved') -- 有效申请
  85. GROUP BY sa.batch_id, sa.scholarship_type_id, sa.applicant_class_id
  86. ORDER BY sa.batch_id, sa.applicant_class_id, sa.scholarship_type_id;
  87. -- 6. 检查名额使用情况汇总
  88. SELECT
  89. '=== 6. 名额使用情况汇总 ===' as info;
  90. SELECT
  91. cq.batch_id,
  92. b.batch_name,
  93. cq.class_id,
  94. c.class_name,
  95. cq.type_id,
  96. st.type_name,
  97. cq.allocated_quota,
  98. COALESCE(used.used_count, 0) as used_quota,
  99. (cq.allocated_quota - COALESCE(used.used_count, 0)) as available_quota,
  100. CASE
  101. WHEN cq.allocated_quota = 0 THEN 'unlimited'
  102. WHEN (cq.allocated_quota - COALESCE(used.used_count, 0)) > 0 THEN 'available'
  103. ELSE 'full'
  104. END as quota_status
  105. FROM jcbt_scholarship_class_quota cq
  106. LEFT JOIN jcbt_scholarship_batch b ON cq.batch_id = b.batch_id
  107. LEFT JOIN jcbt_scholarship_type st ON cq.type_id = st.type_id
  108. LEFT JOIN xg_class_info c ON cq.class_id = c.class_id
  109. LEFT JOIN (
  110. SELECT
  111. batch_id,
  112. scholarship_type_id,
  113. applicant_class_id,
  114. COUNT(*) as used_count
  115. FROM jcbt_scholarship_application
  116. WHERE application_status IN ('submitted', 'approved')
  117. GROUP BY batch_id, scholarship_type_id, applicant_class_id
  118. ) used ON cq.batch_id = used.batch_id
  119. AND cq.type_id = used.scholarship_type_id
  120. AND cq.class_id = used.applicant_class_id
  121. ORDER BY cq.batch_id, cq.class_id, cq.type_id;
  122. -- 7. 检查特定班级的详细情况(以班级ID=1为例)
  123. SELECT
  124. '=== 7. 特定班级详细情况检查 (class_id=1) ===' as info;
  125. SELECT
  126. '班级基本信息:' as section,
  127. c.class_id,
  128. c.class_name,
  129. c.grade,
  130. u.user_name as head_teacher_name,
  131. u.nick_name as head_teacher_nick
  132. FROM xg_class_info c
  133. LEFT JOIN sys_user u ON c.head_teacher_id = u.user_id
  134. WHERE c.class_id = 1;
  135. SELECT
  136. '该班级的名额分配:' as section,
  137. cq.type_id,
  138. st.type_name,
  139. cq.allocated_quota
  140. FROM jcbt_scholarship_class_quota cq
  141. LEFT JOIN jcbt_scholarship_type st ON cq.type_id = st.type_id
  142. WHERE cq.class_id = 1
  143. ORDER BY cq.type_id;
  144. -- 8. 检查数据完整性问题
  145. SELECT
  146. '=== 8. 数据完整性问题检查 ===' as info;
  147. -- 检查缺少名额分配的奖学金类型
  148. SELECT
  149. '缺少名额分配的奖学金类型:' as issue_type,
  150. st.type_id,
  151. st.type_name,
  152. bt.batch_id,
  153. b.batch_name
  154. FROM jcbt_scholarship_type st
  155. INNER JOIN jcbt_scholarship_batch_type bt ON st.type_id = bt.type_id
  156. INNER JOIN jcbt_scholarship_batch b ON bt.batch_id = b.batch_id
  157. LEFT JOIN jcbt_scholarship_class_quota cq ON st.type_id = cq.type_id AND bt.batch_id = cq.batch_id
  158. WHERE st.type_status = '1'
  159. AND b.batch_status = '1'
  160. AND cq.quota_id IS NULL;
  161. -- 检查有名额分配但奖学金类型不存在的情况
  162. SELECT
  163. '名额分配指向不存在的奖学金类型:' as issue_type,
  164. cq.quota_id,
  165. cq.type_id,
  166. cq.batch_id,
  167. cq.class_id
  168. FROM jcbt_scholarship_class_quota cq
  169. LEFT JOIN jcbt_scholarship_type st ON cq.type_id = st.type_id
  170. WHERE st.type_id IS NULL;
  171. -- 9. 模拟API查询结果
  172. SELECT
  173. '=== 9. 模拟API查询结果 (batch_id=1, class_id=1) ===' as info;
  174. SELECT
  175. st.type_id,
  176. st.type_name,
  177. st.type_level,
  178. st.type_description,
  179. CASE
  180. WHEN cq.allocated_quota IS NULL THEN 0
  181. ELSE cq.allocated_quota
  182. END as total_quota,
  183. COALESCE(used.used_count, 0) as used_quota,
  184. CASE
  185. WHEN cq.allocated_quota IS NULL THEN 0
  186. WHEN cq.allocated_quota = 0 THEN 999999
  187. ELSE (cq.allocated_quota - COALESCE(used.used_count, 0))
  188. END as available_quota,
  189. CASE
  190. WHEN cq.allocated_quota IS NULL THEN FALSE
  191. WHEN cq.allocated_quota = 0 THEN FALSE
  192. ELSE TRUE
  193. END as has_quota,
  194. CASE
  195. WHEN cq.allocated_quota IS NULL THEN 'unlimited'
  196. WHEN cq.allocated_quota = 0 THEN 'unlimited'
  197. WHEN (cq.allocated_quota - COALESCE(used.used_count, 0)) > 0 THEN 'available'
  198. ELSE 'full'
  199. END as quota_status
  200. FROM jcbt_scholarship_type st
  201. INNER JOIN jcbt_scholarship_batch_type bt ON st.type_id = bt.type_id
  202. LEFT JOIN jcbt_scholarship_class_quota cq ON st.type_id = cq.type_id
  203. AND bt.batch_id = cq.batch_id
  204. AND cq.class_id = 1
  205. LEFT JOIN (
  206. SELECT
  207. scholarship_type_id,
  208. applicant_class_id,
  209. COUNT(*) as used_count
  210. FROM jcbt_scholarship_application
  211. WHERE batch_id = 1
  212. AND applicant_class_id = 1
  213. AND application_status IN ('submitted', 'approved')
  214. GROUP BY scholarship_type_id, applicant_class_id
  215. ) used ON st.type_id = used.scholarship_type_id
  216. WHERE bt.batch_id = 1
  217. AND st.type_status = '1'
  218. ORDER BY
  219. CASE quota_status
  220. WHEN 'available' THEN 1
  221. WHEN 'unlimited' THEN 2
  222. WHEN 'full' THEN 3
  223. END,
  224. st.type_level,
  225. st.type_name;