diagnose_quota_display_issue.sql 7.2 KB

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