StatisticsQueryImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.ssj.statistics.dao.impl;
  2. import com.ssj.api.domain.vo.homework.CheckDetailVO;
  3. import com.ssj.api.domain.vo.statistics.ListVO;
  4. import com.ssj.api.domain.vo.statistics.TeacherSalarysVO;
  5. import com.ssj.framework.core.persistence.PagingHibernateJdbcDao;
  6. import com.ssj.statistics.dao.IStatisticsQueryDao;
  7. import org.apache.commons.collections4.MapUtils;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.data.domain.Page;
  11. import org.springframework.data.domain.Pageable;
  12. import org.springframework.stereotype.Repository;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.Objects;
  17. /**
  18. * @author sh
  19. * @className StatisticsQueryImpl
  20. * @description queryImpl
  21. * @date 2021/2/27
  22. */
  23. @Repository
  24. public class StatisticsQueryImpl implements IStatisticsQueryDao {
  25. @Autowired
  26. private PagingHibernateJdbcDao dao;
  27. @Override
  28. public Page<Map<String, Object>> statisticsList(Map<String, Object> params, Pageable initPage) {
  29. StringBuffer sql = new StringBuffer();
  30. List<Object> queryParams = new ArrayList<>();
  31. /**
  32. *teacherId string list 老师id
  33. * teacherName string list 老师姓名
  34. * subject string list 科目
  35. * allSubject string list 老师拥有的科目,多科目英文逗号隔开,
  36. * correctNums int list 批注页数
  37. * overtimeNums int list 超时批注页数
  38. * notCorrectNums int list 未批注页数
  39. * notCommentNums int list 不批注页数
  40. * repeatNums int list 重复页数
  41. * accuracy string list 正确率
  42. * errorNums int list 报错页数
  43. */
  44. sql.append("select a.correctNums,a.overtimeNums, ");
  45. sql.append("a.notCorrectNums,a.notCommentNums, ");
  46. sql.append("a.repeatNums,concat(floor(100*(a.totalNums- a.errorNums-a.notCorrectNums)/a.totalNums),'%') as accuracy,a.errorNums,a.teacherId,a.teacherName,a.subject,a.allSubject ");
  47. sql.append(" from (");
  48. listInfo(params,queryParams,sql);
  49. sql.append(" ) a");
  50. return dao.findPage(sql.toString(),queryParams.toArray(),initPage);
  51. }
  52. private void listInfo(Map<String, Object> params,List<Object> queryParams,StringBuffer sql){
  53. sql.append("select t.teacher_id as teacherId,t11.name as teacherName,t11.course_name as subject,t11.course_name as allSubject, \n");
  54. sql.append(" sum(t.correct_nums) as correctNums,sum(t.overtime_nums) as overtimeNums,sum(t.not_correct_nums) as notCorrectNums, \n");
  55. sql.append(" sum(t.not_comment_nums) as notCommentNums,sum(t.repeat_nums) as repeatNums,round(avg(t.accuracy),2) as accuracy,sum(t.error_nums) as errorNums,sum(t.total_nums) as totalNums \n");
  56. sql.append(" from plat_teacher_statistics t \n");
  57. sql.append(" left join tb_lib_manager t11 on t.teacher_id = t11.user_id \n");
  58. sql.append(" where t11.type = 30 \n");
  59. if(Objects.nonNull(params.get("beginDate")) && StringUtils.isNotBlank(MapUtils.getString(params,"beginDate"))){
  60. sql.append(" and t.calculate_date >= ? ");
  61. queryParams.add(params.get("beginDate"));
  62. }
  63. if(Objects.nonNull(params.get("endDate")) && StringUtils.isNotBlank(MapUtils.getString(params,"endDate"))){
  64. sql.append(" and t.calculate_date <= ? ");
  65. queryParams.add(params.get("endDate"));
  66. }
  67. if(Objects.nonNull(params.get("teacherName")) && StringUtils.isNotBlank(MapUtils.getString(params,"teacherName"))){
  68. sql.append(" and t11.name like concat('%',?,'%') ");
  69. queryParams.add(params.get("teacherName"));
  70. }
  71. sql.append(" group by t11.user_id ");
  72. }
  73. @Override
  74. public Page<Map<String, Object>> errorList(Map<String, Object> params, Pageable initPage) {
  75. StringBuffer sql = new StringBuffer();
  76. List<Object> queryParams = new ArrayList<>();
  77. sql.append("SELECT DATE_FORMAT(t11.create_time,'%Y-%m-%d') as year_1,DATE_FORMAT(t11.create_time,'%m月%d日') as workDate from scon_homework_picture_correct t \n");
  78. sql.append("join scon_homework_picture t11 on t.homework_picture_id = t11.id\n");
  79. sql.append("left join tb_lib_vip t12 on t11.vip_id = t12.id\n");
  80. sql.append("where t.type = 8 and t.is_check_error = 1\n");
  81. sql.append("and t11.`subject`=? and t11.teacher_id=?\n");
  82. queryParams.add(params.get("subject"));
  83. queryParams.add(params.get("teacherId"));
  84. if(Objects.nonNull(params.get("beginDate")) && StringUtils.isNotBlank(MapUtils.getString(params,"beginDate"))){
  85. sql.append(" and to_days(t11.create_time) >=to_days(?) ");
  86. queryParams.add(params.get("beginDate"));
  87. }
  88. if(Objects.nonNull(params.get("endDate")) && StringUtils.isNotBlank(MapUtils.getString(params,"endDate"))){
  89. sql.append(" and to_days(t11.create_time) <=to_days(?) ");
  90. queryParams.add(params.get("endDate"));
  91. }
  92. sql.append("GROUP BY DATE_FORMAT(t11.create_time,'%y-%m-%d')");
  93. return dao.findPage(sql.toString(),queryParams.toArray(),initPage);
  94. }
  95. @Override
  96. public List<Map<String, Object>> findStudentErrorList(String date,String teacherId,String subject) {
  97. StringBuffer sql = new StringBuffer();
  98. List<Object> queryParams = new ArrayList<>();
  99. sql.append("SELECT t11.homework_id as homeworkId,t12.child_name as studentName,count(1) as errorNums \n");
  100. sql.append("from scon_homework_picture_correct t \n");
  101. sql.append("join scon_homework_picture t11 on t.homework_picture_id = t11.id\n");
  102. sql.append("left join tb_lib_vip t12 on t11.vip_id = t12.id\n");
  103. sql.append("where t.type = 8 and t.is_check_error = 1\n");
  104. sql.append("and t11.`subject`=? and t11.teacher_id=?\n");
  105. queryParams.add(subject);
  106. queryParams.add(teacherId);
  107. sql.append(" and to_days(t11.create_time) =to_days(?) ");
  108. queryParams.add(date);
  109. sql.append("group by t11.homework_id");
  110. return dao.findMap(sql.toString(),queryParams.toArray());
  111. }
  112. @Override
  113. public Map<String, Object> findTotalData(Map<String, Object> params) {
  114. /*
  115. correctTotalNums int data 批注总页数
  116. overtimeTotalNums int data 超时批注总页数
  117. notCorrectTotalNums int data 未批注总页数
  118. notCommentTotalNums int data 不批注总页数
  119. repeatTotalNums int data 重复总页数
  120. accuracyTotal string data 总正确率
  121. errorTotalNums
  122. correctNums int list 批注页数
  123. overtimeNums int list 超时批注页数
  124. notCorrectNums int list 未批注页数
  125. notCommentNums int list 不批注页数
  126. repeatNums int list 重复页数
  127. accuracy string list 正确率
  128. errorNums int list 报错页数
  129. */
  130. StringBuffer sql = new StringBuffer();
  131. sql.append("select ifnull(sum(a.correctNums),0) as correctTotalNums,ifnull(sum(overtimeNums),0) as overtimeTotalNums, ");
  132. sql.append("ifnull(sum(a.notCorrectNums),0) as notCorrectTotalNums,ifnull(sum(notCommentNums),0) as notCommentTotalNums, ");
  133. sql.append("ifnull(sum(a.repeatNums),0) as repeatTotalNums,concat(floor(100*(sum(a.totalNums)- sum(a.errorNums)-sum(a.notCorrectNums))/sum(a.totalNums)),'%') as accuracyTotal,ifnull(sum(errorNums),0) as errorTotalNums ");
  134. sql.append(" from (");
  135. List<Object> queryParams = new ArrayList<>();
  136. listInfo(params,queryParams,sql);
  137. sql.append(" ) a");
  138. return dao.findMap(sql.toString(),queryParams.toArray()).get(0);
  139. }
  140. @Override
  141. public List<ListVO> statisticsDataList(String dateTime) {
  142. StringBuffer sql = new StringBuffer();
  143. List<Object> queryParams = new ArrayList<>();
  144. sql.append("SELECT a.teacher_id,a.teacher_name,a.`subject`,a.all_subject,a.correct_nums,a.overtime_nums,a.not_correct_nums,a.not_comment_nums,a.repeat_nums,a.error_nums,\n");
  145. sql.append("floor(100*(a.total- a.error_nums-a.not_correct_nums)/a.total) as accuracy,a.calculate_date,a.total as total_nums\n");
  146. sql.append("from (\n");
  147. sql.append("SELECT t12.name as teacher_name,t.teacher_id,t.`subject`,t12.course_name as all_subject,count(if((t.is_mark in (0,2) and t.is_feedback=1) or t.is_mark in (1,3),true,NULL)) as correct_nums, \n");
  148. sql.append("count(if((t.is_feedback=1 or t.is_mark in (1,3)) and (DATE_FORMAT(t.create_time,'%H:%i')>='20:30' and DATE_FORMAT(t11.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(DATE_ADD(t.create_time,interval 1 day),'%Y-%m-%d'),' 12:00:00'))\n" +
  149. " or (DATE_FORMAT(t.create_time,'%H:%i')<'20:30' and DATE_FORMAT(t11.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(t.create_time,'%Y-%m-%d'),' 23:59:59')),true,null)) as overtime_nums,\n");
  150. sql.append("count(1) as total,\n");
  151. sql.append("DATE_FORMAT(t.create_time,'%Y-%m-%d') as calculate_date,\n");
  152. sql.append("count(if(t.is_feedback=0 and t.is_mark in (0,2),true,null)) as not_correct_nums,\n");
  153. sql.append("count(if(t.is_mark=10,true,null)) as not_comment_nums,\n");
  154. sql.append("count(if(t.is_mark=15,true,null)) as repeat_nums,\n");
  155. sql.append("count(if(t11.is_check_error=1,true,null)) as error_nums\n");
  156. sql.append("from scon_homework_picture t \n");
  157. sql.append("left join scon_homework_picture_correct t11 on t.id = t11.homework_picture_id \n");
  158. sql.append("left join tb_lib_manager t12 on t.teacher_id = t12.user_id\n");
  159. sql.append("where t12.type = 30 and t11.type = 8 and to_days(t.create_time)<= to_days(?)\n");
  160. queryParams.add(dateTime);
  161. sql.append("GROUP BY t.teacher_id,to_days(t.create_time)\n");
  162. sql.append(")a");
  163. return dao.findList(sql.toString(),queryParams.toArray(),ListVO.class);
  164. }
  165. @Override
  166. public List<TeacherSalarysVO> addTeacherSalarysData(String month) {
  167. StringBuffer sql = new StringBuffer();
  168. List<Object> queryParams = new ArrayList<>();
  169. sql.append("SELECT a.correct_nums,a.teacher_id,a.overtime_nums,a.perk_nums,a.error_nums,a.work_date,\n");
  170. sql.append("FLOOR(a.sum_perk/a.perk_nums) as perk_efficiency,Floor(100*(a.correct_nums-a.error_nums)/a.correct_nums) as accuracy,\n");
  171. sql.append("case when a.perk_nums-a.perk_overtime_nums<134 and a.perk_nums-a.perk_overtime_nums>0 and floor(a.sum_perk/a.perk_nums)<120 then 20 \n");
  172. sql.append(" when a.perk_nums = a.perk_overtime_nums then (a.perk_overtime_nums-a.error_overtime_nums)*0.075 \n");
  173. sql.append(" else (a.perk_nums-a.perk_overtime_nums-a.perk_error_nums+a.error_overtime_nums)*0.15+(a.perk_overtime_nums-a.error_overtime_nums)*0.075 end as perk_salary,\n");
  174. sql.append("case when a.correct_nums-a.perk_nums-a.overtime_nums+a.perk_overtime_nums=0 then (a.correct_nums-a.perk_nums-a.error_nums+a.perk_error_nums)*0.075 \n");
  175. sql.append(" else (a.correct_nums-a.perk_nums-a.overtime_nums+a.perk_overtime_nums-a.error_nums+a.perk_error_nums+a.error_overtime_nums2-a.error_overtime_nums)*0.15+(a.overtime_nums-a.perk_overtime_nums-a.error_overtime_nums2+a.error_overtime_nums)*0.075 end as other_salary\n");
  176. sql.append("from (\n");
  177. sql.append("SELECT\n");
  178. sql.append("count(1) as correct_nums,\n");
  179. sql.append("count(if((DATE_FORMAT(t11.create_time,'%H:%i')>='20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(DATE_ADD(t11.create_time,interval 1 day),'%Y-%m-%d'),' 12:00:00'))\n");
  180. sql.append(" or (DATE_FORMAT(t11.create_time,'%H:%i')<'20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(t11.create_time,'%Y-%m-%d'),' 23:59:59')),true,null)) as overtime_nums,\n");
  181. sql.append("count(IF(DATE_FORMAT(t.end_time,'%H:%i')>='18:00' and DATE_FORMAT(t.end_time,'%H:%i')<='20:00',TRUE,null)) as perk_nums,\n");
  182. sql.append("count(IF(DATE_FORMAT(t.end_time,'%H:%i')>='18:00' and DATE_FORMAT(t.end_time,'%H:%i')<='20:00' and ((DATE_FORMAT(t11.create_time,'%H:%i')>='20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(DATE_ADD(t11.create_time,interval 1 day),'%Y-%m-%d'),' 12:00:00'))\n");
  183. sql.append(" or (DATE_FORMAT(t11.create_time,'%H:%i')<'20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(t11.create_time,'%Y-%m-%d'),' 23:59:59'))),TRUE,null)) as perk_overtime_nums,\n");
  184. sql.append("count(IF(t.is_check_error=1,TRUE,null)) as error_nums,\n");
  185. sql.append("count(IF(t.is_check_error=1 and DATE_FORMAT(t.end_time,'%H:%i')>='18:00' and DATE_FORMAT(t.end_time,'%H:%i')<='20:00',TRUE,null)) as perk_error_nums,\n");
  186. sql.append("count(IF(t.is_check_error=1 and DATE_FORMAT(t.end_time,'%H:%i')>='18:00' and DATE_FORMAT(t.end_time,'%H:%i')<='20:00' and ((DATE_FORMAT(t11.create_time,'%H:%i')>='20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(DATE_ADD(t11.create_time,interval 1 day),'%Y-%m-%d'),' 12:00:00'))\n");
  187. sql.append(" or (DATE_FORMAT(t11.create_time,'%H:%i')<'20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(t11.create_time,'%Y-%m-%d'),' 23:59:59'))),TRUE,null)) as error_overtime_nums,\n");
  188. sql.append("count(IF(t.is_check_error=1 and ((DATE_FORMAT(t11.create_time,'%H:%i')>='20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(DATE_ADD(t11.create_time,interval 1 day),'%Y-%m-%d'),' 12:00:00'))\n");
  189. sql.append(" or (DATE_FORMAT(t11.create_time,'%H:%i')<'20:30' and DATE_FORMAT(t.end_time,'%Y-%m-%d %H:%i:%s')>concat(DATE_FORMAT(t11.create_time,'%Y-%m-%d'),' 23:59:59'))),TRUE,null)) as error_overtime_nums2,\n");
  190. sql.append("DATE_FORMAT(t.end_time,'%Y-%m-%d') as work_date,\n");
  191. sql.append("sum(IF(DATE_FORMAT(t.end_time,'%H:%i')>='18:00' and DATE_FORMAT(t.end_time,'%H:%i')<='20:00',t.correction_time,0)) as sum_perk,\n");
  192. sql.append("t11.teacher_id\n");
  193. sql.append("from scon_homework_picture_correct t \n");
  194. sql.append("join scon_homework_picture t11 on t.homework_picture_id = t11.id\n");
  195. sql.append("where t.type=8 and t11.is_mark in(0,2) and t11.is_feedback=1 \n");
  196. sql.append("and t.end_time like concat(?,'%') \n");
  197. queryParams.add(month);
  198. sql.append("GROUP BY t11.teacher_id\n");
  199. sql.append(") a");
  200. return dao.findList(sql.toString(),queryParams.toArray(),TeacherSalarysVO.class);
  201. }
  202. @Override
  203. public List<TeacherSalarysVO> findOnlineList(String month) {
  204. StringBuffer sql = new StringBuffer();
  205. List<Object> queryParams = new ArrayList<>();
  206. sql.append("select a.work_date,a.user_id as teacher_id from (\n");
  207. sql.append("SELECT DATE_FORMAT(t.login_datetime,'%Y-%m-%d') as work_date,t.user_id \n");
  208. sql.append(" from tb_user_login t\n");
  209. sql.append(" where DATE_FORMAT(t.login_datetime,'%H:%i')<='18:00' \n");
  210. sql.append(" and (concat(DATE_FORMAT(t.login_datetime,'%Y-%m-%d'),' 20:00:00') <DATE_FORMAT(t.logout_datetime,'%Y-%m-%d %H:%i:%s') or logout_time=0)\n");
  211. sql.append(" and t.login_datetime like concat(?,'%')");
  212. queryParams.add(month);
  213. sql.append("GROUP BY t.user_id,to_days(t.login_datetime)\n");
  214. sql.append(") a \n");
  215. sql.append(" join tb_lib_manager t on a.user_id = t.user_id and t.type = 30\n");
  216. sql.append("left join scon_homework_picture b on a.user_id = b.teacher_id and a.work_date = DATE_FORMAT(b.allot_time,'%Y-%m-%d') and DATE_FORMAT(b.allot_time,'%H:%i')>='18:00' and DATE_FORMAT(b.allot_time,'%H:%i')<='20:00'\n");
  217. sql.append("where b.id is null");
  218. return dao.findList(sql.toString(),queryParams.toArray(),TeacherSalarysVO.class);
  219. }
  220. @Override
  221. public List<CheckDetailVO> checkDetailList(String homeworkId) {
  222. StringBuffer sql = new StringBuffer();
  223. List<Object> queryParams = new ArrayList<>();
  224. sql.append("SELECT t.id as picture_id,t.corrected_picture_url as picture_url,2 as check_state \n");
  225. sql.append("from scon_homework_picture t \n");
  226. sql.append("left join scon_homework_picture_correct t11 on t.id = t11.homework_picture_id\n");
  227. sql.append("where t11.type = 8 and t11.is_check_error=1\n");
  228. sql.append(" and t.homework_id = ?");
  229. queryParams.add(homeworkId);
  230. return dao.findList(sql.toString(),queryParams.toArray(),CheckDetailVO.class);
  231. }
  232. @Override
  233. public List<Map<String, Object>> salaryList(String userId, int month, int year) {
  234. /**
  235. * tb_teacher_salary
  236. *workDate string list 日期
  237. * correctNums int list 批注总张数
  238. * overtimeNums int list 超时批注总张数
  239. * perkNums int list 高峰时段批注张数
  240. * perkEfficiency String list 高峰时段平均批注时间
  241. * errorNums int list 报错张数
  242. * accuracy string list 正确率
  243. * perkSalary String list 高峰时段薪资
  244. * otherSalary String list 其他时段薪资
  245. * salary String list 总薪资
  246. */
  247. StringBuffer sql = new StringBuffer();
  248. List<Object> queryParams = new ArrayList<>();
  249. sql.append("select t.work_date as workDate,t.correct_nums as correctNums, \n");
  250. sql.append("t.overtime_nums as overtimeNums,t.correct_nums as perkNums, \n");
  251. sql.append(" SEC_TO_TIME(t.perk_efficiency) as perkEfficiency,t.error_nums as errorNums, \n");
  252. sql.append(" t.accuracy,t.perk_salary as perkSalary, \n");
  253. sql.append(" t.other_salary as otherSalary,t.salary as salary \n");
  254. sql.append("from tb_teacher_salary t \n");
  255. sql.append("where t.teacher_id = ? and t.month=? and t.year=?");
  256. queryParams.add(userId);
  257. queryParams.add(month);
  258. queryParams.add(year);
  259. return dao.findMap(sql.toString(),queryParams.toArray());
  260. }
  261. }