StatisticsQueryImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  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(t.end_time,'%Y-%m-%d') as year_1,DATE_FORMAT(t.end_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(t.end_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(t.end_time) <=to_days(?) ");
  90. queryParams.add(params.get("endDate"));
  91. }
  92. if(Objects.nonNull(params.get("checkDate")) && StringUtils.isNotBlank(MapUtils.getString(params,"checkDate"))){
  93. sql.append(" and t.check_date < ? ");
  94. queryParams.add(params.get("checkDate"));
  95. }
  96. sql.append("GROUP BY DATE_FORMAT(t.end_time,'%y-%m-%d')");
  97. return dao.findPage(sql.toString(),queryParams.toArray(),initPage);
  98. }
  99. @Override
  100. public List<Map<String, Object>> findStudentErrorList(String date,String teacherId,String subject) {
  101. StringBuffer sql = new StringBuffer();
  102. List<Object> queryParams = new ArrayList<>();
  103. sql.append("SELECT t11.homework_id as homeworkId,t12.child_name as studentName,count(1) as errorNums \n");
  104. sql.append("from scon_homework_picture_correct t \n");
  105. sql.append("join scon_homework_picture t11 on t.homework_picture_id = t11.id\n");
  106. sql.append("left join tb_lib_vip t12 on t11.vip_id = t12.id\n");
  107. sql.append("where t.type = 8 and t.is_check_error = 1\n");
  108. sql.append("and t11.`subject`=? and t11.teacher_id=?\n");
  109. queryParams.add(subject);
  110. queryParams.add(teacherId);
  111. sql.append(" and to_days(t.end_time) =to_days(?) ");
  112. queryParams.add(date);
  113. sql.append("group by t11.homework_id");
  114. return dao.findMap(sql.toString(),queryParams.toArray());
  115. }
  116. @Override
  117. public Map<String, Object> findTotalData(Map<String, Object> params) {
  118. /*
  119. correctTotalNums int data 批注总页数
  120. overtimeTotalNums int data 超时批注总页数
  121. notCorrectTotalNums int data 未批注总页数
  122. notCommentTotalNums int data 不批注总页数
  123. repeatTotalNums int data 重复总页数
  124. accuracyTotal string data 总正确率
  125. errorTotalNums
  126. correctNums int list 批注页数
  127. overtimeNums int list 超时批注页数
  128. notCorrectNums int list 未批注页数
  129. notCommentNums int list 不批注页数
  130. repeatNums int list 重复页数
  131. accuracy string list 正确率
  132. errorNums int list 报错页数
  133. */
  134. StringBuffer sql = new StringBuffer();
  135. sql.append("select ifnull(sum(a.correctNums),0) as correctTotalNums,ifnull(sum(overtimeNums),0) as overtimeTotalNums, ");
  136. sql.append("ifnull(sum(a.notCorrectNums),0) as notCorrectTotalNums,ifnull(sum(notCommentNums),0) as notCommentTotalNums, ");
  137. 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 ");
  138. sql.append(" from (");
  139. List<Object> queryParams = new ArrayList<>();
  140. listInfo(params,queryParams,sql);
  141. sql.append(" ) a");
  142. return dao.findMap(sql.toString(),queryParams.toArray()).get(0);
  143. }
  144. @Override
  145. public List<ListVO> statisticsDataList(String dateTime) {
  146. StringBuffer sql = new StringBuffer();
  147. List<Object> queryParams = new ArrayList<>();
  148. 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");
  149. 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");
  150. sql.append("from (\n");
  151. sql.append("SELECT t.name as teacher_name,t.teacher_id,t.`subject`,t.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");
  152. 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(t.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" +
  153. " or (DATE_FORMAT(t.create_time,'%H:%i')<'20:30' and DATE_FORMAT(t.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");
  154. sql.append("count(1) as total,\n");
  155. sql.append("DATE_FORMAT(t.calculate_date,'%Y-%m-%d') as calculate_date,\n");
  156. sql.append("count(if(t.is_feedback=0 and t.is_mark in (0,2),true,null)) as not_correct_nums,\n");
  157. sql.append("count(if(t.is_mark=10,true,null)) as not_comment_nums,\n");
  158. sql.append("count(if(t.is_mark=15,true,null)) as repeat_nums,\n");
  159. sql.append("count(if(t.is_check_error=1,true,null)) as error_nums\n");
  160. sql.append("from (\n");
  161. sql.append("select t.teacher_id,t.is_mark,t11.is_check_error,ifnull(t11.end_time,t.create_time) as calculate_date,t.is_feedback,t.create_time,t11.end_time, \n");
  162. sql.append("t12.name,t.subject,t12.course_name \n");
  163. sql.append("from scon_homework_picture t \n");
  164. sql.append("left join scon_homework_picture_correct t11 on t.id = t11.homework_picture_id \n");
  165. sql.append("left join tb_lib_manager t12 on t.teacher_id = t12.user_id\n");
  166. sql.append("where t12.type = 30 and t11.type = 8 and (to_days(t.create_time)<= to_days(?) or to_days(t11.end_time)<= to_days(?))\n");
  167. queryParams.add(dateTime);
  168. queryParams.add(dateTime);
  169. sql.append(") t \n");
  170. sql.append("GROUP BY t.teacher_id,to_days(t.calculate_date)\n");
  171. sql.append(")a");
  172. return dao.findList(sql.toString(),queryParams.toArray(),ListVO.class);
  173. }
  174. @Override
  175. public List<TeacherSalarysVO> addTeacherSalarysData(String month) {
  176. StringBuffer sql = new StringBuffer();
  177. List<Object> queryParams = new ArrayList<>();
  178. sql.append("SELECT a.correct_nums,a.teacher_id,a.overtime_nums,a.perk_nums,a.error_nums,a.work_date,\n");
  179. sql.append("FLOOR(a.sum_perk/a.perk_nums) as perk_efficiency,round(100*(a.correct_nums-a.error_nums)/a.correct_nums,2) as accuracy,\n");
  180. 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");
  181. sql.append(" when a.perk_nums = a.perk_overtime_nums then (a.perk_overtime_nums-a.error_overtime_nums)*0.075 \n");
  182. 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");
  183. 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");
  184. 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");
  185. sql.append("from (\n");
  186. sql.append("SELECT\n");
  187. sql.append("count(1) as correct_nums,\n");
  188. 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");
  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 overtime_nums,\n");
  190. 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");
  191. 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");
  192. 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");
  193. sql.append("count(IF(t.is_check_error=1,TRUE,null)) as error_nums,\n");
  194. 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");
  195. 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");
  196. 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");
  197. 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");
  198. 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");
  199. sql.append("DATE_FORMAT(t.end_time,'%Y-%m-%d') as work_date,\n");
  200. 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");
  201. sql.append("t11.teacher_id\n");
  202. sql.append("from scon_homework_picture_correct t \n");
  203. sql.append("join scon_homework_picture t11 on t.homework_picture_id = t11.id\n");
  204. sql.append("where t.type=8 and t11.is_mark in(0,2) and t11.is_feedback=1 \n");
  205. sql.append("and t.end_time like concat(?,'%') \n");
  206. queryParams.add(month);
  207. sql.append("GROUP BY t11.teacher_id,DATE_FORMAT(t.end_time,'%Y-%m-%d')\n");
  208. sql.append(") a");
  209. return dao.findList(sql.toString(),queryParams.toArray(),TeacherSalarysVO.class);
  210. }
  211. @Override
  212. public List<TeacherSalarysVO> findOnlineList(String month) {
  213. StringBuffer sql = new StringBuffer();
  214. List<Object> queryParams = new ArrayList<>();
  215. sql.append("select a.work_date,a.user_id as teacher_id from (\n");
  216. sql.append("SELECT DATE_FORMAT(t.login_datetime,'%Y-%m-%d') as work_date,t.user_id \n");
  217. sql.append(" from tb_user_login t\n");
  218. sql.append(" where DATE_FORMAT(t.login_datetime,'%H:%i')<='18:00' \n");
  219. 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");
  220. sql.append(" and t.login_datetime like concat(?,'%')");
  221. queryParams.add(month);
  222. sql.append("GROUP BY t.user_id,to_days(t.login_datetime)\n");
  223. sql.append(") a \n");
  224. sql.append(" join tb_lib_manager t on a.user_id = t.user_id and t.type = 30\n");
  225. 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");
  226. sql.append("where b.id is null");
  227. return dao.findList(sql.toString(),queryParams.toArray(),TeacherSalarysVO.class);
  228. }
  229. @Override
  230. public List<Map<String, Object>> findRegisterList(Map<String, Object> params) {
  231. StringBuffer sql = new StringBuffer();
  232. List<Object> queryParams = new ArrayList<>();
  233. sql.append("SELECT t.name,t.phone_number,\n");
  234. sql.append("case when t.type = 1 then '常规兼职' when t.type=2 then '高校合作' else '远程实习' end as type, \n");
  235. sql.append(" DATE_FORMAT(t.create_time,'%Y.%m.%d %H.%m') as create_time \n");
  236. sql.append(" from tb_teacher_enrollment t \n");
  237. if(params.get("searchKey")!=null && !"".equals(params.get("searchKey"))){
  238. sql.append(" where t.name like concat('%',?,'%') \n");
  239. sql.append(" or t.phone_number like concat('%',?,'%') \n");
  240. queryParams.add(params.get("searchKey"));
  241. queryParams.add(params.get("searchKey"));
  242. }
  243. sql.append(" order by t.create_time desc,t.id ");
  244. return dao.findMap(sql.toString(),queryParams.toArray());
  245. }
  246. @Override
  247. public List<CheckDetailVO> checkDetailList(String homeworkId) {
  248. StringBuffer sql = new StringBuffer();
  249. List<Object> queryParams = new ArrayList<>();
  250. sql.append("SELECT t.id as picture_id,t.corrected_picture_url as picture_url,2 as check_state \n");
  251. sql.append("from scon_homework_picture t \n");
  252. sql.append("left join scon_homework_picture_correct t11 on t.id = t11.homework_picture_id\n");
  253. sql.append("where t11.type = 8 and t11.is_check_error=1\n");
  254. sql.append(" and t.homework_id = ?");
  255. queryParams.add(homeworkId);
  256. return dao.findList(sql.toString(),queryParams.toArray(),CheckDetailVO.class);
  257. }
  258. @Override
  259. public List<Map<String, Object>> salaryList(String userId, int month, int year) {
  260. /**
  261. * tb_teacher_salary
  262. *workDate string list 日期
  263. * correctNums int list 批注总张数
  264. * overtimeNums int list 超时批注总张数
  265. * perkNums int list 高峰时段批注张数
  266. * perkEfficiency String list 高峰时段平均批注时间
  267. * errorNums int list 报错张数
  268. * accuracy string list 正确率
  269. * perkSalary String list 高峰时段薪资
  270. * otherSalary String list 其他时段薪资
  271. * salary String list 总薪资
  272. */
  273. StringBuffer sql = new StringBuffer();
  274. List<Object> queryParams = new ArrayList<>();
  275. sql.append("select t.work_date as workDate,t.correct_nums as correctNums, \n");
  276. sql.append("t.overtime_nums as overtimeNums,t.perk_nums as perkNums, \n");
  277. sql.append(" ifnull(replace(concat(SEC_TO_TIME(t.perk_efficiency),''),'.000000',''),'00:00:00') as perkEfficiency,t.error_nums as errorNums, \n");
  278. sql.append(" concat(ifnull(t.accuracy,'0.00'),'%') as accuracy,t.perk_salary as perkSalary, \n");
  279. sql.append(" t.other_salary as otherSalary,t.salary as salary \n");
  280. sql.append("from tb_teacher_salary t \n");
  281. sql.append("where t.teacher_id = ? and t.month=? and t.year=? order by t.work_date asc");
  282. queryParams.add(userId);
  283. queryParams.add(month);
  284. queryParams.add(year);
  285. return dao.findMap(sql.toString(),queryParams.toArray());
  286. }
  287. }