StudentAttendanceMapper.xml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <!--
  4. 这个文件是自动生成的。
  5. 不要修改此文件。所有改动将在下次重新自动生成时丢失。
  6. -->
  7. <mapper namespace="com.ym.mec.biz.dal.dao.StudentAttendanceDao">
  8. <resultMap type="com.ym.mec.biz.dal.entity.StudentAttendance" id="StudentAttendance">
  9. <result column="id_" property="id"/>
  10. <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  11. <result column="music_group_id_" property="musicGroupId"/>
  12. <result column="class_group_id_" property="classGroupId"/>
  13. <result column="course_schedule_id_" property="courseScheduleId"/>
  14. <result column="user_id_" property="userId"/>
  15. <result column="username_" property="username"/>
  16. <result column="avatar_" property="avatar"/>
  17. <result column="teacher_avatar_" property="teacherAvatar"/>
  18. <result column="subject_name_" property="subjectName"/>
  19. <result column="phone_" property="phone"/>
  20. <result column="teacher_id_" property="teacherId"/>
  21. <result column="sign_in_time_" property="signInTime"/>
  22. <result column="sign_out_time_" property="signOutTime"/>
  23. <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  24. <result column="visitFlag" property="visitFlag" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  25. <result column="create_time_" property="createTime"/>
  26. <result column="update_time_" property="updateTime"/>
  27. <result column="remark_" property="remark"/>
  28. <result column="normal_remind_" property="normalRemind"/>
  29. <result column="current_class_times_" property="currentClassTimes"/>
  30. <result column="current_class_times_" property="currentClassTimes"/>
  31. <result column="current_schedule_id_" property="currentScheduleId"/>
  32. <result column="organ_name_" property="courseSchedule.organization.name"/>
  33. <result column="teacher_name_" property="courseSchedule.teacherName"/>
  34. <result column="teach_mode_" property="courseSchedule.teachMode"/>
  35. <result column="course_type_" property="courseSchedule.type"/>
  36. <result column="course_status_" property="courseSchedule.status"/>
  37. <result column="current_schedule_id_" property="courseSchedule.id"/>
  38. <result column="course_schedule_name_" property="courseSchedule.name"/>
  39. <result column="class_date_" property="courseSchedule.classDate"/>
  40. <result column="classTimeStr" property="classTimeStr"/>
  41. <result column="start_class_time_" property="courseSchedule.startClassTime"/>
  42. <result column="end_class_time_" property="courseSchedule.endClassTime"/>
  43. <result column="new_course_id_" property="courseSchedule.newCourseId"/>
  44. <result column="tenant_id_" property="tenantId"/>
  45. <result column="qualified_flag_" property="qualifiedFlag"/>
  46. <result column="join_course_type_" property="joinCourseType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  47. </resultMap>
  48. <!-- 根据主键查询一条记录 -->
  49. <select id="get" resultMap="StudentAttendance">
  50. SELECT * FROM student_attendance WHERE id_ = #{id}
  51. </select>
  52. <!-- 全查询 -->
  53. <select id="findAll" resultMap="StudentAttendance">
  54. SELECT * FROM student_attendance where tenant_id_ = #{tenantId} ORDER BY id_
  55. </select>
  56. <!-- 向数据库增加一条记录 -->
  57. <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentAttendance" useGeneratedKeys="true"
  58. keyColumn="id" keyProperty="id">
  59. INSERT INTO student_attendance
  60. (group_type_,music_group_id_,class_group_id_,course_schedule_id_,user_id_,teacher_id_,status_,create_time_,
  61. update_time_,remark_,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_,visit_flag_,normal_remind_,tenant_id_,qualified_flag_)
  62. VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
  63. #{courseScheduleId},#{userId},#{teacherId},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),
  64. #{remark},#{currentClassTimes},#{signInTime},#{signOutTime},#{currentScheduleId},#{visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
  65. #{normalRemind},#{tenantId},#{qualifiedFlag})
  66. </insert>
  67. <insert id="addStudentAttendances" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
  68. INSERT INTO student_attendance (group_type_, music_group_id_, class_group_id_, course_schedule_id_,
  69. user_id_, teacher_id_, status_, create_time_,update_time_, remark_ ,current_class_times_,sign_in_time_,
  70. sign_out_time_,current_schedule_id_,visit_flag_,normal_remind_,tenant_id_)
  71. VALUES
  72. <foreach collection="list" item="studentAttendance" separator=",">
  73. (#{studentAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
  74. #{studentAttendance.musicGroupId},#{studentAttendance.classGroupId},#{studentAttendance.courseScheduleId},
  75. #{studentAttendance.userId},#{studentAttendance.teacherId},
  76. #{studentAttendance.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{studentAttendance.updateTime},
  77. #{studentAttendance.remark},#{studentAttendance.currentClassTimes},
  78. #{studentAttendance.signInTime},#{studentAttendance.signOutTime},#{studentAttendance.currentScheduleId},
  79. #{studentAttendance.visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
  80. #{studentAttendance.normalRemind},#{studentAttendance.tenantId})
  81. </foreach>
  82. </insert>
  83. <!-- 根据主键查询一条记录 -->
  84. <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentAttendance">
  85. UPDATE student_attendance
  86. <set>
  87. <if test="status != null">
  88. status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
  89. </if>
  90. <if test="visitFlag != null">
  91. visit_flag_ = #{visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
  92. </if>
  93. <if test="currentScheduleId != null">
  94. current_schedule_id_ = #{currentScheduleId},
  95. </if>
  96. <if test="signOutTime != null">
  97. sign_out_time_ = #{signOutTime},
  98. </if>
  99. <if test="signInTime != null">
  100. sign_in_time_ = #{signInTime},
  101. </if>
  102. <if test="userId != null">
  103. user_id_ = #{userId},
  104. </if>
  105. <if test="remark != null">
  106. remark_ = #{remark},
  107. </if>
  108. <if test="groupType != null">
  109. group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
  110. </if>
  111. <if test="classGroupId != null">
  112. class_group_id_ = #{classGroupId},
  113. </if>
  114. <if test="teacherId != null">
  115. teacher_id_ = #{teacherId},
  116. </if>
  117. <if test="courseScheduleId != null">
  118. course_schedule_id_ = #{courseScheduleId},
  119. </if>
  120. <if test="musicGroupId != null">
  121. music_group_id_ = #{musicGroupId},
  122. </if>
  123. <if test="currentClassTimes != null">
  124. current_class_times_ = #{currentClassTimes},
  125. </if>
  126. <if test="normalRemind != null">
  127. normal_remind_ = #{normalRemind},
  128. </if>
  129. update_time_ = NOW()
  130. </set>
  131. WHERE id_ = #{id} and tenant_id_ = #{tenantId}
  132. </update>
  133. <update id="cleanCourseStudentSignOut">
  134. UPDATE student_attendance
  135. SET sign_out_time_= NULL
  136. WHERE course_schedule_id_=#{courseId} AND user_id_ = #{userId}
  137. </update>
  138. <update id="updateLeaveVisitFlag">
  139. UPDATE student_attendance SET leave_visit_flag_ = 1 WHERE user_id_ = #{userId} AND status_ = 'LEAVE'
  140. </update>
  141. <update id="updateQualified">
  142. UPDATE student_attendance SET qualified_flag_ = #{qualifiedFlag} WHERE course_schedule_id_ = #{courseScheduleId} AND user_id_ IN
  143. <foreach collection="studentIds" separator="," item="userId" open="(" close=")">
  144. #{userId}
  145. </foreach>
  146. </update>
  147. <!-- 根据主键删除一条记录 -->
  148. <delete id="delete">
  149. DELETE FROM student_attendance WHERE id_ = #{id}
  150. </delete>
  151. <delete id="deleteByCourseSchedules">
  152. DELETE FROM student_attendance WHERE course_schedule_id_ IN
  153. <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
  154. #{courseScheduleId}
  155. </foreach>
  156. </delete>
  157. <delete id="deleteByCourseAndUser">
  158. DELETE FROM student_attendance WHERE course_schedule_id_ IN
  159. <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
  160. #{courseScheduleId}
  161. </foreach>
  162. AND user_id_=#{userId}
  163. </delete>
  164. <delete id="deleteStudentAttendancesByCourseAndUsers">
  165. DELETE FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId}
  166. AND user_id_ IN
  167. <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  168. #{userId}
  169. </foreach>
  170. </delete>
  171. <delete id="deleteByGroup">
  172. DELETE FROM student_attendance WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
  173. </delete>
  174. <resultMap id="studentAttendanceViewUtilEntity" type="com.ym.mec.biz.dal.dto.StudentAttendanceViewDto">
  175. <result property="classGroupId" column="class_group_id_"/>
  176. <result property="studentId" column="student_id_"/>
  177. <result property="userName" column="username_"/>
  178. <result property="musicGroupId" column="music_group_id_"/>
  179. <result property="groupType" column="group_type_"/>
  180. <result property="subjectId" column="subject_id_"/>
  181. <result property="subjectName" column="subject_name_"/>
  182. <result property="currentGradeNum" column="current_grade_num_"/>
  183. <result property="currentClass" column="current_class_"/>
  184. <result property="avatar" column="avatar_"/>
  185. <result property="phone" column="phone_"/>
  186. <result property="beMerged" column="be_merged_"/>
  187. <result property="joinCourseType" column="joinCourseType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  188. <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  189. </resultMap>
  190. <sql id="queryPageCondition">
  191. <where>
  192. cgsm.class_group_id_=#{classGroupId} AND cgsm.status_ != 'QUIT'
  193. <if test="filterStatus!=null">
  194. AND cgsm.status_!=#{filterStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
  195. </if>
  196. </where>
  197. </sql>
  198. <!-- 分页查询 -->
  199. <select id="queryPage" resultMap="studentAttendanceViewUtilEntity" parameterType="map">
  200. SELECT
  201. cgsm.class_group_id_,
  202. su.id_ student_id_,
  203. su.username_,
  204. mg.id_ music_group_id_,
  205. s.id_ subject_id_,
  206. s.name_ subject_name_,
  207. cgsm.status_
  208. FROM
  209. class_group_student_mapper cgsm
  210. LEFT JOIN class_group cg ON cg.id_ = cgsm.class_group_id_
  211. LEFT JOIN sys_user su ON cgsm.user_id_=su.id_
  212. LEFT JOIN music_group mg ON cg.music_group_id_=mg.id_
  213. LEFT JOIN `subject` s ON cg.subject_id_list_=s.id_
  214. <include refid="queryPageCondition"/>
  215. <include refid="global.limit"/>
  216. </select>
  217. <!-- 查询当前表的总记录数 -->
  218. <select id="queryCount" resultType="int">
  219. SELECT COUNT(*)
  220. FROM
  221. class_group cg
  222. LEFT JOIN class_group_student_mapper cgsm ON cg.id_=cgsm.class_group_id_
  223. LEFT JOIN sys_user su ON cgsm.user_id_=su.id_
  224. LEFT JOIN music_group mg ON cg.music_group_id_=mg.id_
  225. LEFT JOIN `subject` s ON cg.subject_id_list_=s.id_
  226. <include refid="queryPageCondition"/>
  227. </select>
  228. <select id="countStudentStatus" resultType="com.ym.mec.biz.dal.dto.StudentStatusCountUtilEntity">
  229. SELECT
  230. status_ studentStatus,
  231. COUNT(user_id_) numberOfStudent
  232. FROM
  233. class_group_student_mapper
  234. WHERE class_group_id_=#{classId} AND status_ != 'QUIT'
  235. GROUP BY status_
  236. </select>
  237. <select id="getStudentAttendanceInfo" parameterType="com.ym.mec.biz.dal.entity.StudentAttendance" resultMap="StudentAttendance">
  238. SELECT
  239. cs.class_group_id_,
  240. #{userId} user_id_,
  241. mg.id_ music_group_id_,
  242. #{teacherId} teacher_id_,
  243. #{status} status_,
  244. #{remark} remark_,
  245. #{courseScheduleId} course_schedule_id_,
  246. #{currentClassTimes} current_class_times_
  247. FROM
  248. course_schedule cs
  249. LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
  250. LEFT JOIN music_group mg ON cg.music_group_id_ = mg.id_
  251. WHERE cs.id_=#{courseScheduleId}
  252. </select>
  253. <select id="getStudentLatestAttendanceInfo" resultType="com.ym.mec.biz.dal.entity.StudentAttendance" resultMap="StudentAttendance">
  254. SELECT
  255. *
  256. FROM
  257. student_attendance sa
  258. WHERE
  259. sa.music_group_id_ = #{musicGroupId}
  260. AND sa.user_id_ = #{userId}
  261. ORDER BY
  262. sa.create_time_ DESC
  263. LIMIT 1
  264. </select>
  265. <resultMap id="studentPersonalAttendance" type="com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto">
  266. <result property="classDate" column="class_date_"/>
  267. <result property="startClassTime" column="start_class_time_"/>
  268. <result property="type" column="type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  269. <result property="className" column="name_"/>
  270. <result property="teacherName" column="username_"/>
  271. <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  272. </resultMap>
  273. <sql id="queryCondition">
  274. <where>
  275. cs.del_flag_ = '0' AND cs.pre_course_flag_ != 1 and cs.tenant_id_ = #{tenantId}
  276. <if test="studentID != null">
  277. and sa.user_id_ = #{studentID}
  278. </if>
  279. <if test="musicGroupId != null">
  280. and sa.music_group_id_ = #{musicGroupId}
  281. </if>
  282. <if test="classGroupId != null">
  283. and sa.class_group_id_ = #{classGroupId}
  284. </if>
  285. <if test="status != null">
  286. and sa.status_ = #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
  287. </if>
  288. </where>
  289. </sql>
  290. <select id="queryStudentPersonalAttendances" resultMap="studentPersonalAttendance">
  291. SELECT
  292. cs.class_date_,
  293. cs.start_class_time_,
  294. cg.type_,
  295. cg.name_,
  296. su.username_,
  297. sa.status_
  298. FROM
  299. student_attendance sa
  300. LEFT JOIN course_schedule cs ON sa.course_schedule_id_=cs.id_
  301. LEFT JOIN class_group cg ON sa.class_group_id_=cg.id_
  302. LEFT JOIN sys_user su ON sa.teacher_id_=su.id_
  303. <include refid="queryCondition"/>
  304. </select>
  305. <select id="queryStudentPersonalAttendancesCount" resultType="int">
  306. SELECT
  307. count(*)
  308. FROM
  309. student_attendance sa
  310. LEFT JOIN course_schedule cs ON sa.course_schedule_id_=cs.id_
  311. LEFT JOIN class_group cg ON sa.class_group_id_=cg.id_
  312. LEFT JOIN sys_user su ON sa.teacher_id_=su.id_
  313. <include refid="queryCondition"/>
  314. </select>
  315. <select id="findLatestAttendanceDate" resultType="date">
  316. SELECT MAX(create_time_) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId}
  317. </select>
  318. <resultMap id="StudentAttendanceResponse" type="com.ym.mec.biz.dal.dto.StudentAttendanceResponse">
  319. <result property="userId" column="user_id_"/>
  320. <result property="classDate" column="class_date_"/>
  321. <result property="status" column="status_"/>
  322. <result property="courseScheduleId" column="course_schedule_id_"/>
  323. </resultMap>
  324. <select id="findByClassGroupAndUsers" resultMap="StudentAttendanceResponse">
  325. SELECT
  326. cs.id_ course_schedule_id_,
  327. cs.class_date_,
  328. sa.user_id_,
  329. sa.status_
  330. FROM
  331. student_attendance sa
  332. LEFT JOIN course_schedule cs ON sa.course_schedule_id_=cs.id_
  333. WHERE
  334. cs.del_flag_ = '0' AND cs.pre_course_flag_ != 1
  335. AND sa.class_group_id_=#{classGroupId}
  336. AND sa.user_id_ IN
  337. <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  338. #{userId}
  339. </foreach>
  340. </select>
  341. <resultMap id="StudentAttendanceStatusCountDto" type="com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto">
  342. <result property="userId" column="user_id_"/>
  343. <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  344. <result property="num" column="num_"/>
  345. </resultMap>
  346. <select id="countStudentAttendanceStatus" resultMap="StudentAttendanceStatusCountDto">
  347. SELECT
  348. user_id_,
  349. status_,
  350. COUNT(course_schedule_id_) num_
  351. FROM
  352. student_attendance
  353. WHERE class_group_id_=#{classGroupId}
  354. AND user_id_ IN
  355. <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  356. #{userId}
  357. </foreach>
  358. GROUP BY user_id_,status_
  359. </select>
  360. <select id="getCurrentClassTimesByCourses" resultType="map">
  361. SELECT
  362. course_schedule_id_ AS 'key',
  363. current_class_times_ AS 'value'
  364. FROM
  365. student_attendance
  366. WHERE
  367. course_schedule_id_ IN
  368. <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
  369. #{courseScheduleId}
  370. </foreach>
  371. GROUP BY course_schedule_id_,current_class_times_
  372. </select>
  373. <select id="findLatestSignInDate" resultType="java.util.Date">
  374. SELECT
  375. MAX(create_time_)
  376. FROM
  377. student_attendance
  378. WHERE class_group_id_=#{classGroupId}
  379. </select>
  380. <select id="findByStatusAndCourseScheduleId" resultMap="StudentAttendance">
  381. SELECT * FROM student_attendance sa WHERE course_schedule_id_ = #{courseScheduleId} AND user_id_ = #{userId} LIMIT 1
  382. </select>
  383. <select id="queryNoSignStudentRecord" resultMap="StudentAttendance">
  384. SELECT cg.music_group_id_,cg.id_ class_group_id_,cssp.course_schedule_id_,
  385. cssp.user_id_,cg.current_class_times_,cg.group_type_
  386. FROM course_schedule_student_payment cssp
  387. LEFT JOIN class_group cg ON cg.id_ = cssp.class_group_id_
  388. WHERE cssp.user_id_ NOT IN
  389. (SELECT DISTINCT sa.user_id_ FROM student_attendance sa WHERE course_schedule_id_ = #{courseScheduleId})
  390. AND cssp.course_schedule_id_ = #{courseScheduleId}
  391. </select>
  392. <select id="countStudentAttendenceNum" resultType="int">
  393. SELECT
  394. COUNT( sa.user_id_ )
  395. FROM
  396. student_attendance sa
  397. LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
  398. WHERE
  399. sa.create_time_ &gt; DATE_ADD( CONCAT( cs.class_date_, ' ', cs.start_class_time_ ), INTERVAL - 4 HOUR )
  400. AND sa.course_schedule_id_ = #{courseScheduleId}
  401. AND (sa.update_time_!='1970-01-01 00:00:00' OR sa.update_time_ IS NULL)
  402. </select>
  403. <select id="countStudentAttendancesByCourses" resultType="java.util.Map">
  404. SELECT
  405. course_schedule_id_ AS 'key',
  406. COUNT( id_ ) AS 'value'
  407. FROM
  408. student_attendance
  409. WHERE
  410. course_schedule_id_ IN
  411. <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
  412. #{courseScheduleId}
  413. </foreach>
  414. AND remark_ IS NULL
  415. GROUP BY
  416. course_schedule_id_
  417. </select>
  418. <select id="countStudentAttendancesByCoursesAndStatus" resultType="java.util.Map">
  419. SELECT
  420. course_schedule_id_ AS 'key',
  421. COUNT( id_ ) AS 'value'
  422. FROM
  423. student_attendance
  424. WHERE
  425. status_=#{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
  426. AND course_schedule_id_ IN
  427. <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
  428. #{courseScheduleId}
  429. </foreach>
  430. GROUP BY
  431. course_schedule_id_
  432. </select>
  433. <select id="countCourseLeaveStudentNumWithFourHoursAgo" resultType="java.util.Map">
  434. SELECT
  435. sa.course_schedule_id_ AS 'key',
  436. COUNT( DISTINCT sa.user_id_ ) AS 'value'
  437. FROM
  438. student_attendance sa
  439. LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
  440. WHERE
  441. sa.status_ = 'LEAVE'
  442. AND sa.create_time_ &lt; DATE_ADD( CONCAT( cs.class_date_, ' ', cs.start_class_time_ ), INTERVAL -#{hours} HOUR )
  443. AND sa.course_schedule_id_ IN
  444. <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
  445. #{courseScheduleId}
  446. </foreach>
  447. GROUP BY sa.course_schedule_id_
  448. </select>
  449. <select id="findStudentAttendance" resultMap="StudentAttendance">
  450. SELECT cssp.id_,cssp.course_schedule_id_,cssp.user_id_,cssp.group_type_,cssp.music_group_id_,sa.sign_in_time_,sa.sign_out_time_,
  451. CASE WHEN sa.status_ IS NULL and cs.status_ = 'OVER' THEN 'TRUANT' ELSE sa.status_ END status_,
  452. su.username_,su.phone_,su.avatar_,cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,tu.real_name_ teacher_name_,tu.avatar_ teacher_avatar_,
  453. cs.name_ course_schedule_name_,cs.status_ course_status_,
  454. cs.actual_teacher_id_ teacher_id_,cssp.join_course_type_ as join_course_type_,
  455. CONCAT(cs.class_date_,' ',cs.start_class_time_,'-',cs.end_class_time_) classTimeStr,
  456. cs.class_date_ ,cs.start_class_time_,cs.end_class_time_ ,cs.new_course_id_,
  457. CASE WHEN sa.visit_flag_ IS NULL THEN 0 ELSE sa.visit_flag_ END visitFlag,
  458. CASE WHEN sa.status_ IS NULL OR sa.status_ = 'TRUANT' THEN '1LEAVE' ELSE sa.status_ END status_1
  459. FROM course_schedule_student_payment cssp
  460. LEFT JOIN course_schedule cs on cs.id_ = cssp.course_schedule_id_
  461. LEFT JOIN student_attendance sa on cssp.course_schedule_id_ = sa.course_schedule_id_ and cssp.user_id_ = sa.user_id_
  462. LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
  463. LEFT JOIN sys_user tu on tu.id_ = cs.actual_teacher_id_
  464. LEFT JOIN organization o on o.id_ = cs.organ_id_
  465. <include refid="findStudentAttendanceSql"/>
  466. GROUP BY cssp.id_
  467. ORDER BY
  468. <if test="orderFlag == 1 and search != null and search != ''">
  469. status_1,visitFlag,cssp.id_,
  470. </if>
  471. CONCAT(cs.class_date_, ' ', cs.start_class_time_) ASC
  472. <include refid="global.limit"/>
  473. </select>
  474. <sql id="findStudentAttendanceSql">
  475. <where>
  476. cs.del_flag_ = '0' AND cs.pre_course_flag_ != 1 AND cs.is_lock_ = 0 and cs.tenant_id_ = #{tenantId}
  477. <if test="visitFlag != null">
  478. <if test="visitFlag == 1">
  479. AND sa.visit_flag_ = 1
  480. </if>
  481. <if test="visitFlag == 0">
  482. AND (sa.visit_flag_ = 0 OR sa.visit_flag_ IS NULL)
  483. </if>
  484. </if>
  485. <if test="courseScheduleId != null">
  486. AND cssp.course_schedule_id_ = #{courseScheduleId}
  487. </if>
  488. <if test="search != null">
  489. AND cssp.course_schedule_id_ = #{search}
  490. </if>
  491. <if test="studentID != null">
  492. AND cssp.user_id_ = #{studentID}
  493. </if>
  494. <if test="startDateOfCourse != null">
  495. AND cs.class_date_ &gt;= #{startDateOfCourse}
  496. </if>
  497. <if test="endDateOfCourse != null">
  498. AND cs.class_date_ &lt;= #{endDateOfCourse}
  499. </if>
  500. <if test="courseScheduleType != null">
  501. AND cs.type_ = #{courseScheduleType}
  502. </if>
  503. <if test="teacherId != null">
  504. AND cs.actual_teacher_id_ = #{teacherId}
  505. </if>
  506. <if test="courseStatus != null">
  507. AND cs.status_ = #{courseStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
  508. </if>
  509. <if test="status != null">
  510. AND (sa.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
  511. <if test="status.code == 'TRUANT'">
  512. OR sa.id_ IS NULL
  513. </if>
  514. )
  515. </if>
  516. <if test="groupType != null">
  517. and cssp.group_type_ = #{groupType}
  518. </if>
  519. <if test="musicGroupId != null">
  520. and cssp.music_group_id_ = #{musicGroupId}
  521. </if>
  522. <if test="organId != null and organId != ''">
  523. AND FIND_IN_SET(cs.organ_id_,#{organId})
  524. </if>
  525. <if test="ids != null and ids != ''">
  526. AND FIND_IN_SET(cssp.id_,#{ids})
  527. </if>
  528. </where>
  529. </sql>
  530. <select id="countStudentAttendance" resultType="java.lang.Integer">
  531. SELECT count(DISTINCT cssp.id_)
  532. FROM course_schedule_student_payment cssp
  533. left join course_schedule cs on cs.id_ = cssp.course_schedule_id_
  534. left join student_attendance sa on cssp.course_schedule_id_ = sa.course_schedule_id_ and cssp.user_id_ = sa.user_id_
  535. <include refid="findStudentAttendanceSql"/>
  536. </select>
  537. <select id="findByCourseId" resultMap="StudentAttendance">
  538. SELECT * FROM student_attendance WHERE course_schedule_id_=#{courseId}
  539. </select>
  540. <select id="findByCourseIds" resultMap="StudentAttendance">
  541. SELECT * FROM student_attendance WHERE course_schedule_id_ IN
  542. <foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
  543. #{courseId}
  544. </foreach>
  545. </select>
  546. <select id="getWithCoursesAndExcludeQuitStudent" resultMap="StudentAttendance">
  547. SELECT sa.* FROM student_attendance sa
  548. LEFT JOIN class_group_student_mapper cgsm ON sa.class_group_id_=cgsm.class_group_id_ AND sa.user_id_=cgsm.user_id_
  549. WHERE cgsm.status_ NOT IN ('QUIT', 'QUIT_SCHOOL') AND course_schedule_id_ IN
  550. <foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
  551. #{courseId}
  552. </foreach>
  553. </select>
  554. <select id="findFirstSign" resultType="java.lang.Long">
  555. SELECT sa.course_schedule_id_ FROM student_attendance sa
  556. WHERE sa.current_schedule_id_ = #{courseScheduleId} AND sa.user_id_ = #{userId}
  557. AND sa.sign_in_time_ IS NOT NULL ORDER BY sa.sign_in_time_ ASC LIMIT 1
  558. </select>
  559. <resultMap id="ExportStudentAttendanceDtoMap" type="com.ym.mec.biz.dal.dto.ExportStudentAttendanceDto">
  560. <result property="classDate" column="class_date_"/>
  561. <result property="courseScheduleId" column="course_schedule_id_"/>
  562. <result property="courseScheduleName" column="course_schedule_name_"/>
  563. <result property="educationalTeacherId" column="educational_teacher_id_"/>
  564. <result property="educationalTeacherName" column="educational_teacher_name_"/>
  565. <result property="actualTeacherId" column="actual_teacher_id_"/>
  566. <result property="actualTeacherName" column="actual_teacher_name_"/>
  567. <result property="endClassTime" column="end_class_time_"/>
  568. <result property="groupId" column="music_group_id_"/>
  569. <result property="groupName" column="music_group_name_"/>
  570. <result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  571. <result property="organId" column="organ_id_"/>
  572. <result property="organName" column="organ_name_"/>
  573. <result property="startClassTime" column="start_class_time_"/>
  574. <result property="studentAttendanceStatus" column="attendance_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
  575. <result property="userId" column="user_id_"/>
  576. <result property="username" column="username_"/>
  577. </resultMap>
  578. <select id="countExportStudentAttendancesQueryPage" resultType="java.lang.Integer">
  579. SELECT COUNT(cssp.id_)
  580. FROM course_schedule_student_payment cssp
  581. LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
  582. <include refid="exportStudentAttendancesQueryPageSql"/>
  583. </select>
  584. <sql id="exportStudentAttendancesQueryPageSql">
  585. <where>
  586. cs.pre_course_flag_ != 1 and cs.tenant_id_ = #{tenantId}
  587. <if test="organId != null and organId != ''">
  588. AND FIND_IN_SET(cs.organ_id_,#{organId})
  589. </if>
  590. <if test="groupType != null">
  591. AND cssp.group_type_ = #{groupType}
  592. </if>
  593. <if test="classStartDate != null and classStartDate != ''">
  594. AND cs.class_date_ >= #{classStartDate}
  595. </if>
  596. <if test="classEndDate != null and classEndDate != ''">
  597. AND cs.class_date_ &lt;= #{classEndDate}
  598. </if>
  599. </where>
  600. </sql>
  601. <select id="exportStudentAttendancesQueryPage"
  602. resultMap="ExportStudentAttendanceDtoMap">
  603. SELECT MAX(o.name_) organ_name_,MAX(o.id_) organ_id_,MAX(cs.music_group_id_) music_group_id_,MAX(mg.name_) music_group_name_,MAX(su.username_) username_,MAX(cssp.user_id_) user_id_,
  604. MAX(cs.name_) course_schedule_name_,MAX(cs.id_) course_schedule_id_,
  605. MAX(cs.class_date_) class_date_,MAX(cs.start_class_time_) start_class_time_,MAX(cs.end_class_time_) end_class_time_,
  606. MAX(su1.real_name_) educational_teacher_name_,MAX(mg.educational_teacher_id_) educational_teacher_id_,MAX(cs.group_type_) group_type_,
  607. MAX(cs.actual_teacher_id_) actual_teacher_id_,MAX(su3.real_name_) actual_teacher_name_,
  608. CASE WHEN MAX(sa.id_) IS NULL THEN 'TRUANT' ELSE MAX(sa.status_) END attendance_status_
  609. FROM course_schedule_student_payment cssp
  610. LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
  611. LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND sa.user_id_ = cssp.user_id_
  612. <if test="groupType == 'MUSIC'">
  613. LEFT JOIN music_group mg ON mg.id_ = cssp.music_group_id_
  614. </if>
  615. <if test="groupType == 'VIP'">
  616. LEFT JOIN vip_group mg ON mg.id_ = cssp.music_group_id_
  617. </if>
  618. <if test="groupType == 'PRACTICE'">
  619. LEFT JOIN practice_group mg ON mg.id_ = cssp.music_group_id_
  620. </if>
  621. LEFT JOIN sys_user su1 ON su1.id_ = mg.educational_teacher_id_
  622. LEFT JOIN organization o ON o.id_ = cs.organ_id_
  623. LEFT JOIN student st ON st.user_id_ = cssp.user_id_
  624. LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
  625. LEFT JOIN sys_user su3 ON su3.id_ = cs.actual_teacher_id_
  626. <include refid="exportStudentAttendancesQueryPageSql"/>
  627. GROUP BY cssp.id_
  628. ORDER BY cssp.music_group_id_ DESC,cssp.id_ DESC
  629. <include refid="global.limit"/>
  630. </select>
  631. <select id="countErrorAttendance" resultType="java.lang.Integer">
  632. SELECT COUNT(cssp.id_) FROM course_schedule_student_payment cssp
  633. LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
  634. WHERE (sa.status_ != 'NORMAL' OR sa.status_ IS NULL) AND cssp.course_schedule_id_ = #{courseScheduleId}
  635. </select>
  636. <select id="getLeaveNum" resultType="java.lang.Integer">
  637. SELECT COUNT(sa.id_) FROM student_attendance sa
  638. LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
  639. WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') = #{month} AND sa.user_id_ = #{userId} AND sa.status_ = 'LEAVE' AND cs.pre_course_flag_ != 1
  640. <if test="attendanceId != null">
  641. AND sa.id_ != #{attendanceId}
  642. </if>
  643. </select>
  644. <select id="queryLeaveNum" resultType="java.util.Map">
  645. SELECT sa.user_id_ 'key',COUNT(sa.id_) 'value' FROM student_attendance sa
  646. LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
  647. WHERE sa.status_ = 'LEAVE' AND DATE_FORMAT(cs.class_date_,'%Y-%m') = #{month} AND cs.pre_course_flag_ != 1
  648. AND sa.user_id_ IN
  649. <foreach collection="userIds" item="userId" separator="," open="(" close=")">
  650. #{userId}
  651. </foreach>
  652. GROUP BY sa.user_id_
  653. </select>
  654. <select id="statisticalAttendanceInformation" resultType="com.ym.mec.biz.dal.school.dto.ClassesForDayDto">
  655. select COUNT(cssp.user_id_) studentNum,
  656. COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 END) attendanceNormalNum,
  657. COUNT(CASE WHEN sa.status_ = 'TRUANT' OR sa.id_ IS NULL THEN 1 END) attendanceTruantNum,
  658. COUNT(CASE WHEN sa.status_ = 'LEAVE' THEN 1 END) attendanceLeaveNum,
  659. COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 END) attendanceLateNum,
  660. cssp.course_schedule_id_ courseId
  661. from course_schedule_student_payment cssp
  662. left join student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ and sa.user_id_ = cssp.user_id_
  663. where cssp.course_schedule_id_ IN
  664. <foreach collection="courseIds" item="courseId" separator="," open="(" close=")">
  665. #{courseId}
  666. </foreach>
  667. group by cssp.course_schedule_id_
  668. </select>
  669. <select id="queryCourseStudentList" resultType="com.ym.mec.biz.dal.school.dto.CourseStudentDto">
  670. select cssp.user_id_ studentId,CASE WHEN sa.id_ IS NULL THEN 'TRUANT' ELSE sa.status_ END attendanceStatus,sa.qualified_flag_ qualifiedFlag
  671. ,CASE WHEN s.membership_end_time_ > NOW() THEN 1 ELSE 0 END memberFlag
  672. from course_schedule_student_payment cssp
  673. left join student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ and sa.user_id_ = cssp.user_id_
  674. left join student s ON s.user_id_ = cssp.user_id_
  675. where cssp.course_schedule_id_ = #{courseId}
  676. </select>
  677. <select id="getStudentAttendance" resultMap="StudentAttendance">
  678. select cssp.user_id_ as user_id_,sa.status_,sa.id_
  679. from course_schedule cs
  680. left join course_schedule_student_payment cssp on cs.id_ = cssp.course_schedule_id_
  681. left join student_attendance sa on sa.course_schedule_id_ = cs.id_ and sa.user_id_ = cssp.user_id_
  682. <where>
  683. and cs.status_ = 'OVER'
  684. <if test="param.musicGroupId != null">
  685. and cs.music_group_id_ = #{param.musicGroupId}
  686. </if>
  687. <if test="param.studentIds != null and param.studentIds.size() != 0">
  688. and cssp.user_id_ in
  689. <foreach collection="param.studentIds" item="studentId" separator="," open="(" close=")">
  690. #{studentId}
  691. </foreach>
  692. </if>
  693. <if test="param.startTime != null">
  694. and cs.class_date_ &gt;= #{param.startTime}
  695. </if>
  696. <if test="param.endTime != null">
  697. and cs.class_date_ &lt;= #{param.endTime}
  698. </if>
  699. <if test="param.musicGroupIds != null and param.musicGroupIds.size() != 0">
  700. and cs.music_group_id_ in
  701. <foreach collection="param.musicGroupIds" close=")" open="(" separator="," item="item">
  702. #{item}
  703. </foreach>
  704. </if>
  705. </where>
  706. </select>
  707. <select id="statCoopAttendance"
  708. resultType="com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper$StudentAttendance">
  709. select COUNT(cssp.user_id_) totalNum,
  710. COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 END) normalNum,
  711. COUNT(CASE WHEN sa.status_ = 'TRUANT' OR sa.id_ IS NULL THEN 1 END) truantNum,
  712. COUNT(CASE WHEN sa.status_ = 'LEAVE' THEN 1 END) leaveNum,
  713. COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 END) lateNum
  714. from course_schedule cs
  715. left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
  716. left join student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
  717. where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
  718. AND cs.music_group_id_ IN
  719. <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
  720. #{item}
  721. </foreach>
  722. AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
  723. </select>
  724. <select id="getTruantStudentNum" resultType="java.lang.Integer">
  725. select COUNT(cssp.user_id_) from course_schedule_student_payment cssp
  726. left join student_attendance sa on sa.course_schedule_id_ = cssp.course_schedule_id_ and sa.user_id_ = cssp.user_id_
  727. where cssp.course_schedule_id_ = #{courseId} and (sa.status_ = 'TRUANT' or sa.id_ is null)
  728. </select>
  729. <select id="getStudentNumByStatus" resultType="java.lang.Integer">
  730. select COUNT(cssp.user_id_) from course_schedule_student_payment cssp
  731. left join student_attendance sa on sa.course_schedule_id_ = cssp.course_schedule_id_ and sa.user_id_ = cssp.user_id_
  732. where cssp.course_schedule_id_ = #{courseScheduleId}
  733. and (sa.status_ = #{status.name}
  734. <if test="status.name == 'TRUANT'"> or sa.id_ is null </if>
  735. )
  736. </select>
  737. <select id="queryStudentLeave"
  738. resultType="com.ym.mec.biz.dal.dto.CourseHomeworkWrapper$StudentLeaveResult">
  739. select cs.class_date_ classDate,cs.start_class_time_ startClassTime,cs.end_class_time_ endClassTime,
  740. cg.name_ classGroupName,cs.type_ courseScheduleType,sa.remark_ remark,su.username_ username from student_attendance sa
  741. left join course_schedule cs ON cs.id_ = sa.course_schedule_id_
  742. left join class_group cg ON cg.id_ = cs.class_group_id_
  743. left join sys_user su ON su.id_ = sa.user_id_
  744. <include refid="queryStudentLeaveCondition"/>
  745. </select>
  746. <select id="countStudentLeave" resultType="java.lang.Integer">
  747. select COUNT(sa.id_) from student_attendance sa
  748. left join course_schedule cs ON cs.id_ = sa.course_schedule_id_
  749. left join sys_user su ON su.id_ = sa.user_id_
  750. <include refid="queryStudentLeaveCondition"/>
  751. </select>
  752. <sql id="queryStudentLeaveCondition">
  753. <where>
  754. sa.status_ = 'LEAVE'
  755. <if test="classGroupId != null">
  756. AND sa.class_group_id_ = #{classGroupId}
  757. </if>
  758. <if test="courseScheduleId != null">
  759. AND sa.course_schedule_id_ = #{courseScheduleId}
  760. </if>
  761. <if test="startTime != null and startTime != ''">
  762. AND cs.class_date_ BETWEEN #{startTime} AND #{endTime}
  763. </if>
  764. <if test="musicGroupIds != null and musicGroupIds != ''">
  765. AND FIND_IN_SET(cs.music_group_id_,#{musicGroupIds})
  766. </if>
  767. <if test="search != null and search != ''">
  768. AND (sa.user_id_ = #{search} OR su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
  769. </if>
  770. </where>
  771. </sql>
  772. </mapper>