DataboardController.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. package com.xjrsoft.module.databoard.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.github.yulichang.toolkit.MPJWrappers;
  5. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  6. import com.xjrsoft.common.enums.DeleteMark;
  7. import com.xjrsoft.common.enums.GenderDictionaryEnum;
  8. import com.xjrsoft.common.enums.StudyStatusEnum;
  9. import com.xjrsoft.common.model.result.RT;
  10. import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
  11. import com.xjrsoft.common.utils.VoToColumnUtil;
  12. import com.xjrsoft.module.courseTable.entity.CourseTable;
  13. import com.xjrsoft.module.courseTable.service.ICourseTableService;
  14. import com.xjrsoft.module.databoard.dto.StatisticsDetailDto;
  15. import com.xjrsoft.module.databoard.dto.StatisticsDto;
  16. import com.xjrsoft.module.databoard.vo.AttendanceStatisticsVo;
  17. import com.xjrsoft.module.databoard.vo.CourseStatisticsVo;
  18. import com.xjrsoft.module.databoard.vo.HealthStatisticsVo;
  19. import com.xjrsoft.module.databoard.vo.ItemCountAmountVo;
  20. import com.xjrsoft.module.databoard.vo.MeetingStatisticsVo;
  21. import com.xjrsoft.module.databoard.vo.PersonStatisticsVo;
  22. import com.xjrsoft.module.databoard.vo.ProcessStatisticsVo;
  23. import com.xjrsoft.module.databoard.vo.ReimbursementStatisticsVo;
  24. import com.xjrsoft.module.databoard.vo.RepairStatisticsVo;
  25. import com.xjrsoft.module.databoard.vo.VisitorStatisticsVo;
  26. import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
  27. import com.xjrsoft.module.outint.service.IVisitorOutInRecordService;
  28. import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
  29. import com.xjrsoft.module.student.service.IBaseStudentService;
  30. import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
  31. import com.xjrsoft.module.system.entity.DictionaryDetail;
  32. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  33. import com.xjrsoft.module.teacher.entity.XjrUser;
  34. import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
  35. import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
  36. import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
  37. import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
  38. import io.swagger.annotations.Api;
  39. import io.swagger.annotations.ApiOperation;
  40. import lombok.AllArgsConstructor;
  41. import org.camunda.bpm.engine.history.HistoricProcessInstance;
  42. import org.springframework.web.bind.annotation.GetMapping;
  43. import org.springframework.web.bind.annotation.RequestMapping;
  44. import org.springframework.web.bind.annotation.RestController;
  45. import javax.validation.Valid;
  46. import java.time.LocalDate;
  47. import java.time.LocalDateTime;
  48. import java.time.format.DateTimeFormatter;
  49. import java.util.ArrayList;
  50. import java.util.List;
  51. import java.util.Map;
  52. import java.util.Set;
  53. import java.util.stream.Collectors;
  54. /**
  55. * @title: 数据看板代码
  56. * @Date: 2024年8月2日
  57. * @Version 1.0
  58. */
  59. @RestController
  60. @RequestMapping("/databoard" + "/databoard")
  61. @Api(value = "/databoard" + "/databoard",tags = "数据看板代码")
  62. @AllArgsConstructor
  63. public class DataboardController {
  64. private final ICourseTableService courseTableService;
  65. private final IVisitorOutInRecordService visitorService;
  66. private final IBaseStudentService studentService;
  67. private final ITeacherbaseManagerService teacherService;
  68. private final IWorkflowFormRelationService formRelationService;
  69. @GetMapping(value = "/process-statistics")
  70. @ApiOperation(value="流程统计")
  71. @SaCheckPermission("databoard:detail")
  72. public RT<ProcessStatisticsVo> processStatistics(@Valid StatisticsDto dto){
  73. ProcessStatisticsVo result = new ProcessStatisticsVo();
  74. List<WorkflowFormRelation> relations = formRelationService.list();
  75. result.setAllCount(Long.parseLong(relations.size() + ""));
  76. long completeCount = 0L;
  77. long uncompleteCount = 0L;
  78. for (WorkflowFormRelation relation : relations) {
  79. if(HistoricProcessInstance.STATE_COMPLETED.equals(relation.getCurrentState())){
  80. completeCount ++;
  81. }else if(HistoricProcessInstance.STATE_INTERNALLY_TERMINATED.equals(relation.getCurrentState())){
  82. completeCount ++;
  83. }else if(HistoricProcessInstance.STATE_EXTERNALLY_TERMINATED.equals(relation.getCurrentState())){
  84. completeCount ++;
  85. }else{
  86. uncompleteCount ++;
  87. }
  88. }
  89. result.setCompleteCount(completeCount);
  90. result.setUncompleteCount(uncompleteCount);
  91. return RT.ok(result);
  92. }
  93. @GetMapping(value = "/meeting-statistics")
  94. @ApiOperation(value="会议统计")
  95. @SaCheckPermission("databoard:detail")
  96. public RT<MeetingStatisticsVo> meetingStatistics(@Valid StatisticsDetailDto dto){
  97. LocalDateTime startTime = null;
  98. LocalDateTime endTime = null;
  99. if(dto.getStartDate() != null){
  100. startTime = dto.getStartDate().atStartOfDay();
  101. }
  102. if(dto.getEndDate() != null){
  103. endTime = dto.getEndDate().atStartOfDay().plusDays(1).plusNanos(-1);
  104. }
  105. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  106. String sql = "SELECT t1.id, (SELECT COUNT(*) FROM xjr_user WHERE FIND_IN_SET(id, t1.meeting_apply_participants)) AS person_count FROM wf_meeting_apply t1" +
  107. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  108. " WHERE t2.current_state = 'COMPLETED'";
  109. if(startTime != null && endTime != null){
  110. sql += " and t1.meeting_apply_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  111. }
  112. if(dto.getUserId() != null){
  113. sql += " and FIND_IN_SET(" + dto.getUserId() +", t1.meeting_apply_participants)";
  114. }
  115. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  116. MeetingStatisticsVo result = new MeetingStatisticsVo();
  117. result.setAllCount(list.size());
  118. int personCount = 0;
  119. for (Map<String, Object> objectMap : list) {
  120. personCount += (Long)objectMap.get("person_count");
  121. }
  122. result.setPersonCount(personCount);
  123. return RT.ok(result);
  124. }
  125. @GetMapping(value = "/course-statistics")
  126. @ApiOperation(value="课表统计")
  127. @SaCheckPermission("databoard:detail")
  128. public RT<CourseStatisticsVo> courseStatistics(@Valid StatisticsDetailDto dto){
  129. List<CourseTable> list = courseTableService.list(
  130. new QueryWrapper<CourseTable>().lambda()
  131. .eq((dto.getStartDate() == null && dto.getEndDate() == null), CourseTable::getScheduleDate, LocalDate.now())
  132. .between((dto.getStartDate() != null && dto.getEndDate() != null), CourseTable::getScheduleDate, dto.getStartDate(), dto.getEndDate())
  133. );
  134. CourseStatisticsVo result = new CourseStatisticsVo();
  135. result.setAllCount(list.size());
  136. int teacherCount = 0, noTeacherCount = 0;
  137. for (CourseTable courseTable : list) {
  138. if(courseTable.getTeacherId() != null && !"0".equals(courseTable.getTeacherId())){
  139. teacherCount ++;
  140. }else{
  141. noTeacherCount ++;
  142. }
  143. }
  144. result.setTeacherCount(teacherCount);
  145. result.setNoTeacherCount(noTeacherCount);
  146. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  147. String sql = "SELECT t1.* FROM wf_course_adjust t1" +
  148. " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
  149. " WHERE t1.adjust_type = 'course_substitute'" +
  150. " AND t2.current_state = 'COMPLETED'";
  151. if(dto.getStartDate() != null && dto.getEndDate() != null){
  152. sql += " AND t1.adjust_date between '" + dto.getStartDate().format(formatter) + "' and '" + dto.getEndDate().format(formatter) + "'";
  153. }else{
  154. sql += " AND t1.adjust_date = DATE_FORMAT(NOW(),'%Y-%m-%d')";
  155. }
  156. result.setAdjustCount(SqlRunnerAdapter.db().selectList(sql).size());
  157. sql = "SELECT t1.* FROM wf_course_adjust t1" +
  158. " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
  159. " WHERE t1.adjust_type = 'course_exchange'" +
  160. " AND t2.current_state = 'COMPLETED'";
  161. if(dto.getStartDate() != null && dto.getEndDate() != null){
  162. sql += " AND t1.adjust_date between '" + dto.getStartDate().format(formatter) + "' and '" + dto.getEndDate().format(formatter) + "'";
  163. }else{
  164. sql += " AND t1.adjust_date = DATE_FORMAT(NOW(),'%Y-%m-%d')";
  165. }
  166. result.setReplaceCount(SqlRunnerAdapter.db().selectList(sql).size());
  167. return RT.ok(result);
  168. }
  169. @GetMapping(value = "/visitor-statistics")
  170. @ApiOperation(value="访客统计")
  171. @SaCheckPermission("databoard:detail")
  172. public RT<VisitorStatisticsVo> visitorStatistics(@Valid StatisticsDto dto){
  173. List<VisitorOutInRecord> list = visitorService.list(
  174. new QueryWrapper<VisitorOutInRecord>().lambda()
  175. .eq(VisitorOutInRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
  176. );
  177. VisitorStatisticsVo result = new VisitorStatisticsVo();
  178. result.setAllCount(list.size());
  179. LocalDate today = LocalDate.now();
  180. int todayCount = 0;
  181. for (VisitorOutInRecord record : list) {
  182. if(today.equals(record.getRecordTime().toLocalDate())){
  183. todayCount ++;
  184. }
  185. }
  186. result.setTodayCount(todayCount);
  187. return RT.ok(result);
  188. }
  189. @GetMapping(value = "/person-statistics")
  190. @ApiOperation(value="全校师生数据概览")
  191. @SaCheckPermission("databoard:detail")
  192. public RT<PersonStatisticsVo> personStatistics(@Valid StatisticsDto dto){
  193. List<BaseStudentUserPageVo> studentList = studentService.getStudentList(new BaseStudentUserPageDto());
  194. PersonStatisticsVo result = new PersonStatisticsVo();
  195. result.setStudentCount(studentList.size());
  196. Set<String> studentMaleSet = studentList.stream()
  197. .filter(x -> (x.getGenderCn() != null && x.getGenderCn().equals(GenderDictionaryEnum.MALE.getCode())))
  198. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  199. result.setStudentMaleCount(studentMaleSet.size());
  200. Set<String> studentFemaleSet = studentList.stream()
  201. .filter(x -> (x.getGenderCn() != null && x.getGenderCn().equals(GenderDictionaryEnum.FEMALE.getCode())))
  202. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  203. result.setStudentFemaleCount(studentFemaleSet.size());
  204. Set<String> studentStayMaleSet = studentList.stream()
  205. .filter(x -> (
  206. x.getGenderCn() != null
  207. && x.getGenderCn().equals(GenderDictionaryEnum.MALE.getCode())
  208. && x.getStduyStatusCn() != null
  209. && x.getStduyStatusCn().equals(StudyStatusEnum.InResidence.getCode())
  210. ))
  211. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  212. result.setStudentStayMaleCount(studentStayMaleSet.size());
  213. Set<String> studentNotStayMaleSet = studentList.stream()
  214. .filter(x -> (
  215. x.getGenderCn() != null
  216. && x.getGenderCn().equals(GenderDictionaryEnum.MALE.getCode())
  217. && x.getStduyStatusCn() != null
  218. && x.getStduyStatusCn().equals(StudyStatusEnum.AttendDaySchool.getCode())
  219. ))
  220. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  221. result.setStudentNotStayMaleCount(studentNotStayMaleSet.size());
  222. Set<String> studentStayFemaleSet = studentList.stream()
  223. .filter(x -> (
  224. x.getGenderCn() != null
  225. && x.getGenderCn().equals(GenderDictionaryEnum.FEMALE.getCode())
  226. && x.getStduyStatusCn() != null
  227. && x.getStduyStatusCn().equals(StudyStatusEnum.InResidence.getCode())
  228. ))
  229. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  230. result.setStudentStayFemaleCount(studentStayFemaleSet.size());
  231. Set<String> studentNotStayFemaleSet = studentList.stream()
  232. .filter(x -> (
  233. x.getGenderCn() != null
  234. && x.getGenderCn().equals(GenderDictionaryEnum.FEMALE.getCode())
  235. && x.getStduyStatusCn() != null
  236. && x.getStduyStatusCn().equals(StudyStatusEnum.AttendDaySchool.getCode())
  237. ))
  238. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  239. result.setStudentNotStayFemaleCount(studentNotStayFemaleSet.size());
  240. MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
  241. .disableSubLogicDel()
  242. .orderByDesc(XjrUser::getId)
  243. .select(XjrUser::getId)
  244. .select(XjrUser.class,x -> VoToColumnUtil.fieldsToColumns(XjrUserPageVo.class).contains(x.getProperty()))
  245. .innerJoin(BaseTeacher.class,BaseTeacher::getUserId,XjrUser::getId)
  246. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,BaseTeacher::getJobState, ext->ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getJobState))
  247. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,XjrUser::getCredentialType,ext->ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getCredentialType))
  248. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,BaseTeacher::getEmployWay,ext->ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getEmployWay))
  249. .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
  250. List<XjrUserPageVo> teacherList = teacherService.selectJoinList(XjrUserPageVo.class, queryWrapper);
  251. result.setTeacherCount(teacherList.size());
  252. Set<String> teacherMaleSet = teacherList.stream()
  253. .filter(x -> (x.getGender() != null && x.getGender().equals(GenderDictionaryEnum.MALE.getCode())))
  254. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  255. result.setTeacherMaleCount(teacherMaleSet.size());
  256. Set<String> teacherFemaleSet = teacherList.stream()
  257. .filter(x -> (x.getGender() != null && x.getGender().equals(GenderDictionaryEnum.FEMALE.getCode())))
  258. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  259. result.setTeacherFemaleCount(teacherFemaleSet.size());
  260. Set<String> teacherSet1 = teacherList.stream()
  261. .filter(x -> (x.getEmployWay() != null && x.getEmployWay().equals("FB1601")))
  262. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  263. result.setTeacherCount1(teacherSet1.size());
  264. Set<String> teacherSet2 = teacherList.stream()
  265. .filter(x -> (x.getEmployWay() != null && x.getEmployWay().equals("FB1602")))
  266. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  267. result.setTeacherCount2(teacherSet2.size());
  268. Set<String> teacherSet3 = teacherList.stream()
  269. .filter(x -> (x.getEmployWay() != null && x.getEmployWay().equals("FB1606")))
  270. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  271. result.setTeacherCount3(teacherSet3.size());
  272. Set<String> teacherSet4 = teacherList.stream()
  273. .filter(x -> (x.getEmployWay() != null && x.getEmployWay().equals("FB1609")))
  274. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  275. result.setTeacherCount4(teacherSet4.size());
  276. Set<String> teacherSet5 = teacherList.stream()
  277. .filter(x -> (x.getEmployWay() != null && x.getEmployWay().equals("FB1608")))
  278. .map(XjrUserPageVo::getId).collect(Collectors.toSet());
  279. result.setTeacherCount5(teacherSet5.size());
  280. return RT.ok(result);
  281. }
  282. @GetMapping(value = "/health-statistics")
  283. @ApiOperation(value="学生健康统计")
  284. @SaCheckPermission("databoard:detail")
  285. public RT<HealthStatisticsVo> healthStatistics(@Valid StatisticsDto dto){
  286. String sql = "SELECT t1.gender,COUNT(t1.id) AS a_count FROM student_infection t1" +
  287. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  288. " WHERE t2.current_state = 'COMPLETED' GROUP BY t1.gender";
  289. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  290. HealthStatisticsVo result = new HealthStatisticsVo();
  291. for (Map<String, Object> objectMap : list) {
  292. if(objectMap.get("gender") != null && GenderDictionaryEnum.FEMALE.getCode().equals(objectMap.get("gender").toString())){
  293. result.setInfectionFemaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  294. }if(objectMap.get("gender") != null && GenderDictionaryEnum.MALE.getCode().equals(objectMap.get("gender").toString())){
  295. result.setInfectionMaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  296. }
  297. }
  298. sql = "SELECT t1.gender,COUNT(t1.id) AS a_count FROM student_psychological t1" +
  299. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  300. " WHERE t2.current_state = 'COMPLETED' GROUP BY t1.gender";
  301. list = SqlRunnerAdapter.db().selectList(sql);
  302. for (Map<String, Object> objectMap : list) {
  303. if(objectMap.get("gender") != null && GenderDictionaryEnum.FEMALE.getCode().equals(objectMap.get("gender").toString())){
  304. result.setInfectionFemaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  305. }if(objectMap.get("gender") != null && GenderDictionaryEnum.MALE.getCode().equals(objectMap.get("gender").toString())){
  306. result.setPsychologicalMaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  307. }
  308. }
  309. return RT.ok(result);
  310. }
  311. @GetMapping(value = "/reimbursement-statistics")
  312. @ApiOperation(value="差旅费报销申请")
  313. @SaCheckPermission("databoard:detail")
  314. public RT<ReimbursementStatisticsVo> reimbursementStatistics(@Valid StatisticsDetailDto dto){
  315. LocalDateTime startTime = null;
  316. LocalDateTime endTime = null;
  317. if(dto.getStartDate() != null){
  318. startTime = dto.getStartDate().atStartOfDay();
  319. }
  320. if(dto.getEndDate() != null){
  321. endTime = dto.getEndDate().atStartOfDay().plusDays(1).plusNanos(-1);
  322. }
  323. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  324. String sql = "SELECT t2.* FROM billing_reimbursement t1" +
  325. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  326. " where 1 = 1";
  327. if(startTime != null && endTime != null){
  328. sql += " and t1.aply_time between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  329. }
  330. if(dto.getUserId() != null){
  331. sql += " and t1.applicant_id = " + dto.getUserId();
  332. }
  333. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  334. ReimbursementStatisticsVo result = new ReimbursementStatisticsVo();
  335. result.setAllCount(list.size());
  336. int completeCount = 0;
  337. int uncompleteCount = 0;
  338. for (Map<String, Object> objectMap : list) {
  339. String statusObj = objectMap.get("current_state").toString();
  340. if(HistoricProcessInstance.STATE_COMPLETED.equals(statusObj)){
  341. completeCount ++;
  342. }else if(HistoricProcessInstance.STATE_INTERNALLY_TERMINATED.equals(statusObj)){
  343. completeCount ++;
  344. }else if(HistoricProcessInstance.STATE_EXTERNALLY_TERMINATED.equals(statusObj)){
  345. completeCount ++;
  346. }else if(HistoricProcessInstance.STATE_ACTIVE.equals(statusObj)){
  347. uncompleteCount ++;
  348. }
  349. }
  350. result.setCompleteCount(completeCount);
  351. result.setUncompleteCount(uncompleteCount);
  352. sql = "SELECT t1.city_in,SUM(t1.total_amount) AS total_amount FROM billing_reimbursement t1" +
  353. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  354. " WHERE t2.current_state = 'COMPLETED'";
  355. if(startTime != null && endTime != null){
  356. sql += " and t1.aply_time between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  357. }
  358. sql += " group by t1.city_in ";
  359. list = SqlRunnerAdapter.db().selectList(sql);
  360. List<ItemCountAmountVo> amountList = new ArrayList<>();
  361. for (Map<String, Object> objectMap : list) {
  362. Object cityInObj = objectMap.get("city_in");
  363. String item = "";
  364. if(cityInObj != null && Integer.parseInt(cityInObj.toString()) == 1){
  365. item = "市外";
  366. }else if(cityInObj != null && Integer.parseInt(cityInObj.toString()) == 0){
  367. item = "室内";
  368. }
  369. ItemCountAmountVo amountVo = new ItemCountAmountVo();
  370. amountVo.setItem(item);
  371. amountVo.setAmount(Double.parseDouble(objectMap.get("total_amount").toString()));
  372. amountList.add(amountVo);
  373. }
  374. result.setAmountList(amountList);
  375. return RT.ok(result);
  376. }
  377. @GetMapping(value = "/repair-statistics")
  378. @ApiOperation(value="维修申报")
  379. @SaCheckPermission("databoard:detail")
  380. public RT<RepairStatisticsVo> repairStatistics(@Valid StatisticsDetailDto dto){
  381. LocalDateTime startTime = null;
  382. LocalDateTime endTime = null;
  383. if(dto.getStartDate() != null){
  384. startTime = dto.getStartDate().atStartOfDay();
  385. }
  386. if(dto.getEndDate() != null){
  387. endTime = dto.getEndDate().atStartOfDay().plusDays(1).plusNanos(-1);
  388. }
  389. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  390. RepairStatisticsVo result = new RepairStatisticsVo();
  391. String sql = "SELECT t1.* FROM wf_repair_declaration t1" +
  392. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  393. " WHERE t2.current_state = 'COMPLETED'";
  394. if(startTime != null && endTime != null){
  395. sql += " and t1.application_time between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  396. }
  397. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  398. result.setAllCount(list.size());
  399. int completeCount = 0;
  400. int uncompleteCount = 0;
  401. int personCount = 0;
  402. for (Map<String, Object> objectMap : list) {
  403. Object statusObj = objectMap.get("maintenance_feedback");
  404. if(statusObj != null && !statusObj.toString().isEmpty()){
  405. completeCount ++;
  406. }else{
  407. uncompleteCount ++;
  408. }
  409. if(objectMap.get("status") != null && "是".equals(objectMap.get("status").toString())){
  410. personCount ++;
  411. }
  412. }
  413. result.setCompleteCount(completeCount);
  414. result.setUncompleteCount(uncompleteCount);
  415. result.setPersonCount(personCount);
  416. sql = "SELECT ifnull(SUM(t1.indemnity), 0) as indemnity FROM wf_repair_declaration t1" +
  417. " INNER JOIN xjr_workflow_form_relation t2 ON t1.id = t2.form_key_value" +
  418. " WHERE t2.current_state = 'COMPLETED'";
  419. list = SqlRunnerAdapter.db().selectList(sql);
  420. result.setTotalAmount(Double.parseDouble(list.get(0).get("indemnity").toString()));
  421. return RT.ok(result);
  422. }
  423. @GetMapping(value = "/attendance-statistics")
  424. @ApiOperation(value="个人考勤")
  425. @SaCheckPermission("databoard:detail")
  426. public RT<AttendanceStatisticsVo> attendanceStatistics(@Valid StatisticsDetailDto dto){
  427. LocalDateTime startTime = null;
  428. LocalDateTime endTime = null;
  429. if(dto.getStartDate() != null){
  430. startTime = dto.getStartDate().atStartOfDay();
  431. }
  432. if(dto.getEndDate() != null){
  433. endTime = dto.getEndDate().atStartOfDay().plusDays(1).plusNanos(-1);
  434. }
  435. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  436. AttendanceStatisticsVo result = new AttendanceStatisticsVo();
  437. String sql = " SELECT ifnull(sum(t1.leave_days), 0) as leave_days FROM wf_teacherleave t1" +
  438. " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
  439. " WHERE t2.current_state = 'COMPLETED'";
  440. if(startTime != null && endTime != null){
  441. String startTimeStr = startTime.format(formatter);
  442. String endTimeStr = endTime.format(formatter);
  443. sql +=" AND (" +
  444. " (t1.leave_start_time BETWEEN '" + startTimeStr + "' and '" + endTimeStr + "')" +
  445. " OR (t1.leave_end_time BETWEEN '" + startTimeStr + "' and '" + endTimeStr + "')" +
  446. " OR (t1.leave_start_time > '" + startTimeStr + "' and '" + endTimeStr + "' > t1.leave_end_time)" +
  447. " OR ('" + startTimeStr + "' > t1.leave_start_time and t1.leave_end_time > '" + endTimeStr + "')" +
  448. ")";
  449. }
  450. if(dto.getUserId() != null){
  451. sql += " and user_id = " + dto.getUserId();
  452. }
  453. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  454. result.setLeaveDays(Double.parseDouble(list.get(0).get("leave_days").toString()));
  455. sql = "SELECT * FROM teacher_attendance_record WHERE delete_mark = 0 and attendance_status = '迟到'";
  456. formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  457. if(startTime != null && endTime != null){
  458. sql +=" AND attendance_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  459. }
  460. if(dto.getUserId() != null){
  461. sql += " and user_id = " + dto.getUserId();
  462. }
  463. list = SqlRunnerAdapter.db().selectList(sql);
  464. result.setLateCount(list.size());
  465. sql = "SELECT COUNT(t1.id) AS a_count FROM wf_course_adjust t1" +
  466. " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
  467. " WHERE t1.adjust_type = 'course_exchange'" +
  468. " AND t2.current_state = 'COMPLETED'";
  469. if(startTime != null && endTime != null){
  470. sql +=" AND t1.adjust_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  471. }
  472. if(dto.getUserId() != null){
  473. sql += " and t1.user_id = " + dto.getUserId();
  474. }
  475. list = SqlRunnerAdapter.db().selectList(sql);
  476. result.setAdjustCount(Integer.parseInt(list.get(0).get("a_count").toString()));
  477. sql = "SELECT COUNT(t1.id) AS a_count FROM wf_course_adjust t1" +
  478. " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
  479. " WHERE t1.adjust_type = 'course_substitute'" +
  480. " AND t2.current_state = 'COMPLETED'";
  481. if(startTime != null && endTime != null){
  482. sql +=" AND t1.adjust_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
  483. }
  484. if(dto.getUserId() != null){
  485. sql += " t1.and user_id = " + dto.getUserId();
  486. }
  487. list = SqlRunnerAdapter.db().selectList(sql);
  488. result.setExchangeCount(Integer.parseInt(list.get(0).get("a_count").toString()));
  489. return RT.ok(result);
  490. }
  491. }