DatadetailController.java 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. package com.xjrsoft.module.databoard.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.github.yulichang.toolkit.MPJWrappers;
  7. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  8. import com.xjrsoft.common.enums.GenderDictionaryEnum;
  9. import com.xjrsoft.common.enums.StudyStatusEnum;
  10. import com.xjrsoft.common.model.result.RT;
  11. import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
  12. import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
  13. import com.xjrsoft.common.utils.VoToColumnUtil;
  14. import com.xjrsoft.module.databoard.dto.StatisticsDetailDto;
  15. import com.xjrsoft.module.databoard.vo.CourseCountListVo;
  16. import com.xjrsoft.module.databoard.vo.CourseStatisticsDetailVo;
  17. import com.xjrsoft.module.databoard.vo.DistributionVo;
  18. import com.xjrsoft.module.databoard.vo.DurationVo;
  19. import com.xjrsoft.module.databoard.vo.HealthItemCountVo;
  20. import com.xjrsoft.module.databoard.vo.HealthStatisticsDetailVo;
  21. import com.xjrsoft.module.databoard.vo.ItemCountAmountVo;
  22. import com.xjrsoft.module.databoard.vo.ItemCountRatioVo;
  23. import com.xjrsoft.module.databoard.vo.ItemCountVo;
  24. import com.xjrsoft.module.databoard.vo.ItemDoubleVo;
  25. import com.xjrsoft.module.databoard.vo.ProcessStatisticsDetailVo;
  26. import com.xjrsoft.module.databoard.vo.StudnetStatisticsDetailVo;
  27. import com.xjrsoft.module.databoard.vo.SubscriptionStatisticsDetailVo;
  28. import com.xjrsoft.module.databoard.vo.TeacherStatisticsDetailVo;
  29. import com.xjrsoft.module.ledger.entity.WfSubscription;
  30. import com.xjrsoft.module.ledger.service.IWfSubscriptionService;
  31. import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
  32. import com.xjrsoft.module.student.service.IBaseStudentService;
  33. import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
  34. import com.xjrsoft.module.system.entity.DictionaryDetail;
  35. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  36. import com.xjrsoft.module.teacher.entity.XjrUser;
  37. import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
  38. import com.xjrsoft.module.teacher.vo.XjrUserPageVo;
  39. import com.xjrsoft.module.workflow.constant.WorkflowConstant;
  40. import com.xjrsoft.module.workflow.entity.WorkflowExtra;
  41. import com.xjrsoft.module.workflow.entity.WorkflowSchema;
  42. import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
  43. import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
  44. import io.swagger.annotations.Api;
  45. import io.swagger.annotations.ApiOperation;
  46. import lombok.AllArgsConstructor;
  47. import org.camunda.bpm.engine.HistoryService;
  48. import org.camunda.bpm.engine.history.HistoricProcessInstance;
  49. import org.camunda.bpm.engine.history.HistoricProcessInstanceQuery;
  50. import org.springframework.web.bind.annotation.GetMapping;
  51. import org.springframework.web.bind.annotation.RequestMapping;
  52. import org.springframework.web.bind.annotation.RestController;
  53. import javax.validation.Valid;
  54. import java.math.BigDecimal;
  55. import java.math.RoundingMode;
  56. import java.text.ParseException;
  57. import java.text.SimpleDateFormat;
  58. import java.time.Duration;
  59. import java.time.LocalDate;
  60. import java.time.Period;
  61. import java.time.format.DateTimeFormatter;
  62. import java.util.ArrayList;
  63. import java.util.Collections;
  64. import java.util.Comparator;
  65. import java.util.HashSet;
  66. import java.util.List;
  67. import java.util.Map;
  68. import java.util.Set;
  69. import java.util.stream.Collectors;
  70. /**
  71. * @title: 数据看板代码
  72. * @Date: 2024年8月2日
  73. * @Version 1.0
  74. */
  75. @RestController
  76. @RequestMapping("/datadetail" + "/datadetail")
  77. @Api(value = "/datadetail" + "/datadetail",tags = "数据看板详情代码")
  78. @AllArgsConstructor
  79. public class DatadetailController {
  80. private final HistoryService historyService;
  81. private final IWorkflowExtraService extraService;
  82. private final ITeacherbaseManagerService teacherService;
  83. private final IBaseStudentService studentService;
  84. private final IWfSubscriptionService subscriptionService;
  85. @GetMapping(value = "/process-statistics")
  86. @ApiOperation(value="流程统计详情")
  87. @SaCheckPermission("datadetail:detail")
  88. public RT<ProcessStatisticsDetailVo> processStatistics(@Valid StatisticsDetailDto dto){
  89. HistoricProcessInstanceQuery instanceQuery = historyService.createHistoricProcessInstanceQuery();
  90. if(dto.getUserId() != null){
  91. instanceQuery.variableValueEquals(WorkflowConstant.PROCESS_START_USER_ID_KEY, dto.getUserId());
  92. }
  93. if (!ObjectUtil.isNull(dto.getStartDate())) {
  94. instanceQuery.startedAfter(WorkFlowUtil.getStartOfDay(dto.getStartDate()));
  95. }
  96. if (!ObjectUtil.isNull(dto.getEndDate())) {
  97. instanceQuery.startedBefore(WorkFlowUtil.getEndOfDay(dto.getEndDate()));
  98. }
  99. List<WorkflowExtra> workflowExtras = extraService.list(
  100. new MPJLambdaWrapper<WorkflowExtra>()
  101. .select(WorkflowExtra::getId)
  102. .select(WorkflowExtra.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowExtra.class).contains(x.getProperty()))
  103. .leftJoin(WorkflowSchema.class, WorkflowSchema::getId, WorkflowExtra::getSchemaId)
  104. .leftJoin(DictionaryDetail.class, DictionaryDetail::getId, WorkflowSchema::getCategory)
  105. .orderByDesc("t.end_time")
  106. );
  107. ProcessStatisticsDetailVo result = new ProcessStatisticsDetailVo();
  108. List<HistoricProcessInstance> list = instanceQuery.list();
  109. List<WorkflowExtra> allCountList = new ArrayList<>();
  110. for (HistoricProcessInstance historicProcessInstance : list) {
  111. workflowExtras.stream()
  112. .filter(e -> e.getProcessId().equals(historicProcessInstance.getId()))
  113. .max(Comparator.comparing(WorkflowExtra::getStartTime))
  114. .ifPresent(e -> {
  115. allCountList.add(e);
  116. });
  117. }
  118. result.setAllCount(Long.parseLong(allCountList.size() + ""));
  119. List<HistoricProcessInstance> finished = historyService.createHistoricProcessInstanceQuery().finished().list();
  120. List<WorkflowExtra> completeCountList = new ArrayList<>();
  121. for (HistoricProcessInstance historicProcessInstance : finished) {
  122. workflowExtras.stream()
  123. .filter(e -> e.getProcessId().equals(historicProcessInstance.getId()))
  124. .max(Comparator.comparing(WorkflowExtra::getStartTime))
  125. .ifPresent(e -> {
  126. completeCountList.add(e);
  127. });
  128. }
  129. result.setCompleteCount(Long.parseLong(completeCountList.size() + ""));
  130. List<HistoricProcessInstance> unfinished = historyService.createHistoricProcessInstanceQuery().unfinished().list();
  131. List<WorkflowExtra> uncompleteCountList = new ArrayList<>();
  132. for (HistoricProcessInstance historicProcessInstance : unfinished) {
  133. workflowExtras.stream()
  134. .filter(e -> e.getProcessId().equals(historicProcessInstance.getId()))
  135. .max(Comparator.comparing(WorkflowExtra::getStartTime))
  136. .ifPresent(e -> {
  137. uncompleteCountList.add(e);
  138. });
  139. }
  140. result.setUncompleteCount(Long.parseLong(uncompleteCountList.size() + ""));
  141. Map<String, Long> finishedMap = completeCountList.stream()
  142. .collect(Collectors.groupingBy(WorkflowExtra::getSchemaName, Collectors.counting()));
  143. Map<String, Long> unfinishedMap = uncompleteCountList.stream()
  144. .collect(Collectors.groupingBy(WorkflowExtra::getSchemaName, Collectors.counting()));
  145. Set<String> itemSet = new HashSet<>();
  146. itemSet.addAll(finishedMap.keySet());
  147. itemSet.addAll(unfinishedMap.keySet());
  148. List<DistributionVo> distributionList = new ArrayList();
  149. for (String item : itemSet) {
  150. Long uncompleteCount = unfinishedMap.get(item) == null?0L:unfinishedMap.get(item);
  151. Long completeCount = finishedMap.get(item) == null?0L:finishedMap.get(item);
  152. distributionList.add(
  153. new DistributionVo(){{
  154. setItem(item);
  155. setCompleteCount(completeCount);
  156. setUncompleteCount(uncompleteCount);
  157. }}
  158. );
  159. }
  160. result.setDistributionList(distributionList);
  161. List<DurationVo> durationList = new ArrayList<>();
  162. List<Long> secondList = new ArrayList<>();
  163. completeCountList.stream().filter(el -> el.getEndTime() != null && el.getStartTime() != null).forEach(el -> {
  164. Duration diff = Duration.between(el.getStartTime(), el.getEndTime());
  165. secondList.add(diff.getSeconds());
  166. });
  167. long zeroHour = secondList.stream().filter(x -> x < 3600L).count();
  168. long oneHour = secondList.stream().filter(x -> x < 14400L && x >= 3600L).count();
  169. long fourHour = secondList.stream().filter(x -> x < 28800L && x >= 14400L).count();
  170. long eightHour = secondList.stream().filter(x -> x >= 28800L).count();
  171. DurationVo zeroVo = new DurationVo();
  172. zeroVo.setDuration("0-1h");
  173. zeroVo.setCount(zeroHour);
  174. durationList.add(zeroVo);
  175. zeroVo = new DurationVo();
  176. zeroVo.setDuration("1-4h");
  177. zeroVo.setCount(oneHour);
  178. durationList.add(zeroVo);
  179. zeroVo = new DurationVo();
  180. zeroVo.setDuration("4-8h");
  181. zeroVo.setCount(fourHour);
  182. durationList.add(zeroVo);
  183. zeroVo = new DurationVo();
  184. zeroVo.setDuration("8h以上");
  185. zeroVo.setCount(eightHour);
  186. durationList.add(zeroVo);
  187. result.setDurationList(durationList);
  188. return RT.ok(result);
  189. }
  190. @GetMapping(value = "/health-statistics")
  191. @ApiOperation(value="学生健康统计")
  192. @SaCheckPermission("datadetail:detail")
  193. public RT<HealthStatisticsDetailVo> healthStatistics(@Valid StatisticsDetailDto dto){
  194. String sql = "SELECT gender,COUNT(*) AS a_count FROM student_infection WHERE status = 1 GROUP BY gender";
  195. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  196. HealthStatisticsDetailVo result = new HealthStatisticsDetailVo();
  197. for (Map<String, Object> objectMap : list) {
  198. if(objectMap.get("gender") != null && GenderDictionaryEnum.FEMALE.getCode().equals(objectMap.get("gender").toString())){
  199. result.setInfectionFemaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  200. }if(objectMap.get("gender") != null && GenderDictionaryEnum.MALE.getCode().equals(objectMap.get("gender").toString())){
  201. result.setInfectionMaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  202. }
  203. }
  204. sql = "SELECT gender,COUNT(*) AS a_count FROM student_psychological WHERE status = 1 GROUP BY gender";
  205. list = SqlRunnerAdapter.db().selectList(sql);
  206. for (Map<String, Object> objectMap : list) {
  207. if(objectMap.get("gender") != null && GenderDictionaryEnum.FEMALE.getCode().equals(objectMap.get("gender").toString())){
  208. result.setInfectionFemaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  209. }if(objectMap.get("gender") != null && GenderDictionaryEnum.MALE.getCode().equals(objectMap.get("gender").toString())){
  210. result.setPsychologicalMaleCount(Integer.parseInt(objectMap.get("a_count").toString()));
  211. }
  212. }
  213. List<HealthItemCountVo> gradeList = new ArrayList<>();
  214. sql = "SELECT t1.name as item,COUNT(t3.student_id) AS count FROM base_grade t1" +
  215. " INNER JOIN base_student_school_roll t2 ON t1.id= t2.grade_id" +
  216. " INNER JOIN student_infection t3 ON t3.student_id = t2.user_id" +
  217. " WHERE t3.status = 1 AND t1.delete_mark = 0" +
  218. " GROUP BY t1.name";
  219. list = SqlRunnerAdapter.db().selectList(sql);
  220. for (Map<String, Object> objectMap : list) {
  221. gradeList.add(
  222. new HealthItemCountVo(){{
  223. setItem(objectMap.get("item").toString());
  224. setInfectionCount(Long.parseLong(objectMap.get("count").toString()));
  225. }}
  226. );
  227. }
  228. sql = "SELECT t1.name as item,COUNT(t3.student_id) AS count FROM base_grade t1" +
  229. " INNER JOIN base_student_school_roll t2 ON t1.id= t2.grade_id" +
  230. " INNER JOIN student_psychological t3 ON t3.student_id = t2.user_id" +
  231. " WHERE t3.status = 1 AND t1.delete_mark = 0" +
  232. " GROUP BY t1.name";
  233. list = SqlRunnerAdapter.db().selectList(sql);
  234. for (Map<String, Object> objectMap : list) {
  235. for (HealthItemCountVo itemCountVo : gradeList) {
  236. if(objectMap.get("item").toString().equals(itemCountVo.getItem())){
  237. itemCountVo.setPsychologicalCount(Long.parseLong(objectMap.get("count").toString()));
  238. }
  239. }
  240. }
  241. result.setGradeList(gradeList);
  242. List<HealthItemCountVo> classList = new ArrayList<>();
  243. sql = "SELECT t1.name as item,COUNT(t3.student_id) AS count FROM base_class t1" +
  244. " INNER JOIN base_student_school_roll t2 ON t1.id= t2.grade_id" +
  245. " INNER JOIN student_infection t3 ON t3.student_id = t2.user_id" +
  246. " WHERE t3.status = 1 AND t1.delete_mark = 0" +
  247. " GROUP BY t1.name";
  248. list = SqlRunnerAdapter.db().selectList(sql);
  249. for (Map<String, Object> objectMap : list) {
  250. classList.add(
  251. new HealthItemCountVo(){{
  252. setItem(objectMap.get("item").toString());
  253. setInfectionCount(Long.parseLong(objectMap.get("count").toString()));
  254. }}
  255. );
  256. }
  257. sql = "SELECT t1.name as item,COUNT(t3.student_id) AS count FROM base_class t1" +
  258. " INNER JOIN base_student_school_roll t2 ON t1.id= t2.grade_id" +
  259. " INNER JOIN student_psychological t3 ON t3.student_id = t2.user_id" +
  260. " WHERE t3.status = 1 AND t1.delete_mark = 0" +
  261. " GROUP BY t1.name";
  262. list = SqlRunnerAdapter.db().selectList(sql);
  263. for (Map<String, Object> objectMap : list) {
  264. for (HealthItemCountVo itemCountVo : classList) {
  265. if(objectMap.get("item").toString().equals(itemCountVo.getItem())){
  266. itemCountVo.setPsychologicalCount(Long.parseLong(objectMap.get("count").toString()));
  267. }
  268. }
  269. }
  270. result.setClassList(classList);
  271. return RT.ok(result);
  272. }
  273. @GetMapping(value = "/person-statistics")
  274. @ApiOperation(value="教职工详情数据统计")
  275. @SaCheckPermission("datadetail:detail")
  276. public RT<TeacherStatisticsDetailVo> teahcerStatistics(@Valid StatisticsDetailDto dto) throws ParseException {
  277. String sql = "SELECT IFNULL(t2.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM base_teacher_education t1" +
  278. " LEFT JOIN xjr_dictionary_detail t2 ON t1.education = t2.code" +
  279. " WHERE t1.delete_mark = 0 GROUP BY t2.name";
  280. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  281. TeacherStatisticsDetailVo result = new TeacherStatisticsDetailVo();
  282. List<ItemCountVo> educationList = new ArrayList<>();
  283. for (Map<String, Object> objectMap : list) {
  284. educationList.add(
  285. new ItemCountVo(){{
  286. setItem(objectMap.get("item").toString());
  287. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  288. }}
  289. );
  290. }
  291. result.setEducationList(educationList);
  292. sql = "SELECT IFNULL(t3.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM xjr_user t1" +
  293. " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
  294. " LEFT JOIN xjr_dictionary_detail t3 ON t1.gender = t3.code AND t3.item_id = 2023000000000000004" +
  295. " WHERE t1.delete_mark = 0 GROUP BY t3.name";
  296. list = SqlRunnerAdapter.db().selectList(sql);
  297. List<ItemCountVo> genderList = new ArrayList<>();
  298. for (Map<String, Object> objectMap : list) {
  299. genderList.add(
  300. new ItemCountVo(){{
  301. setItem(objectMap.get("item").toString());
  302. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  303. }}
  304. );
  305. }
  306. result.setGenderList(genderList);
  307. sql = "SELECT IFNULL(t3.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM xjr_user t1" +
  308. " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
  309. " LEFT JOIN xjr_dictionary_detail t3 ON t2.employ_way = t3.code AND t3.item_id = 2023000000000000016" +
  310. " WHERE t1.delete_mark = 0 GROUP BY t3.name";
  311. list = SqlRunnerAdapter.db().selectList(sql);
  312. List<ItemCountVo> employList = new ArrayList<>();
  313. for (Map<String, Object> objectMap : list) {
  314. employList.add(
  315. new ItemCountVo(){{
  316. setItem(objectMap.get("item").toString());
  317. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  318. }}
  319. );
  320. }
  321. result.setEmployList(employList);
  322. sql = "SELECT IFNULL(t4.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM xjr_user t1" +
  323. " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
  324. " LEFT JOIN xjr_user_dept_relation t3 ON t1.id = t3.user_id" +
  325. " LEFT JOIN xjr_department t4 ON t3.dept_id = t4.id" +
  326. " WHERE t1.delete_mark = 0 AND t4.is_major = 1 GROUP BY t4.name";
  327. list = SqlRunnerAdapter.db().selectList(sql);
  328. List<ItemCountVo> deptList = new ArrayList<>();
  329. for (Map<String, Object> objectMap : list) {
  330. deptList.add(
  331. new ItemCountVo(){{
  332. setItem(objectMap.get("item").toString());
  333. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  334. }}
  335. );
  336. }
  337. result.setDeptList(deptList);
  338. MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
  339. .disableSubLogicDel()
  340. .orderByDesc(XjrUser::getId)
  341. .select(XjrUser::getId)
  342. .select(XjrUser.class,x -> VoToColumnUtil.fieldsToColumns(XjrUserPageVo.class).contains(x.getProperty()))
  343. .innerJoin(BaseTeacher.class,BaseTeacher::getUserId,XjrUser::getId)
  344. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,BaseTeacher::getJobState, ext->ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getJobState))
  345. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,XjrUser::getCredentialType,ext->ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getCredentialType))
  346. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,BaseTeacher::getEmployWay,ext->ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getEmployWay))
  347. .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
  348. List<XjrUserPageVo> teacherList = teacherService.selectJoinList(XjrUserPageVo.class, queryWrapper);
  349. List<String> idCardList = teacherList.stream().map(XjrUserPageVo::getCredentialNumber).collect(Collectors.toList());
  350. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  351. LocalDate currentDate = LocalDate.now();
  352. int age20 = 0;
  353. int age30 = 0;
  354. int age40 = 0;
  355. int age50 = 0;
  356. int age60 = 0;
  357. for (String idCard : idCardList) {
  358. if(StrUtil.isEmpty(idCard) || idCard.length() < 18){
  359. continue;
  360. }
  361. String birthdayStr = idCard.substring(6, 14);
  362. java.util.Date date = sdf.parse(birthdayStr);
  363. // 将Date对象转换为LocalDate对象
  364. LocalDate birthDate = date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate();
  365. Period ageObj = Period.between(birthDate, currentDate);
  366. int age = ageObj.getYears();
  367. if(age >= 20 && age <= 29){
  368. age20 ++;
  369. }else if(age >= 30 && age <= 39){
  370. age30 ++;
  371. }else if(age >= 40 && age <= 49){
  372. age40 ++;
  373. }else if(age >= 50 && age <= 59){
  374. age50 ++;
  375. }else if(age >= 60){
  376. age60 ++;
  377. }
  378. }
  379. List<ItemCountVo> ageList = new ArrayList<>();
  380. ItemCountVo itemCountVo = new ItemCountVo();
  381. itemCountVo.setItem("20-29岁");
  382. itemCountVo.setCount(age20);
  383. ageList.add(itemCountVo);
  384. itemCountVo = new ItemCountVo();
  385. itemCountVo.setItem("30-39岁");
  386. itemCountVo.setCount(age30);
  387. ageList.add(itemCountVo);
  388. itemCountVo = new ItemCountVo();
  389. itemCountVo.setItem("40-49岁");
  390. itemCountVo.setCount(age40);
  391. ageList.add(itemCountVo);
  392. itemCountVo = new ItemCountVo();
  393. itemCountVo.setItem("50-59岁");
  394. itemCountVo.setCount(age50);
  395. ageList.add(itemCountVo);
  396. itemCountVo = new ItemCountVo();
  397. itemCountVo.setItem("60岁以上");
  398. itemCountVo.setCount(age60);
  399. ageList.add(itemCountVo);
  400. result.setAgeList(ageList);
  401. return RT.ok(result);
  402. }
  403. @GetMapping(value = "/student-statistics")
  404. @ApiOperation(value="学生详情数据统计")
  405. @SaCheckPermission("datadetail:detail")
  406. public RT<StudnetStatisticsDetailVo> studentStatistics(@Valid StatisticsDetailDto dto) throws ParseException {
  407. StudnetStatisticsDetailVo result = new StudnetStatisticsDetailVo();
  408. String sql = "SELECT IFNULL(t3.name,'未填写') AS item ,COUNT(*) AS a_count FROM xjr_user t1" +
  409. " INNER JOIN base_student t2 ON t1.id = t2.user_id" +
  410. " LEFT JOIN xjr_dictionary_detail t3 ON t1.gender = t3.code AND t3.item_id = 2023000000000000004" +
  411. " WHERE t1.delete_mark = 0 GROUP BY t3.name";
  412. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  413. List<ItemCountVo> genderList = new ArrayList<>();
  414. for (Map<String, Object> objectMap : list) {
  415. genderList.add(
  416. new ItemCountVo(){{
  417. setItem(objectMap.get("item").toString());
  418. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  419. }}
  420. );
  421. }
  422. result.setGenderList(genderList);
  423. sql = "SELECT IFNULL(t3.name,'未填写') AS item ,COUNT(*) AS a_count FROM xjr_user t1" +
  424. " INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id" +
  425. " LEFT JOIN xjr_dictionary_detail t3 ON t2.student_type = t3.code AND t3.item_id = 2023000000000000028" +
  426. " WHERE t1.delete_mark = 0 GROUP BY t3.name";
  427. list = SqlRunnerAdapter.db().selectList(sql);
  428. List<ItemCountVo> studentTypeList = new ArrayList<>();
  429. for (Map<String, Object> objectMap : list) {
  430. studentTypeList.add(
  431. new ItemCountVo(){{
  432. setItem(objectMap.get("item").toString());
  433. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  434. }}
  435. );
  436. }
  437. result.setStudentTypeList(studentTypeList);
  438. List<BaseStudentUserPageVo> studentList = studentService.getStudentList(new BaseStudentUserPageDto());
  439. Set<String> studentStayMaleSet = studentList.stream()
  440. .filter(x -> (
  441. x.getGenderCn() != null
  442. && x.getGenderCn().equals(GenderDictionaryEnum.MALE.getCode())
  443. && x.getStduyStatusCn() != null
  444. && x.getStduyStatusCn().equals(StudyStatusEnum.InResidence.getCode())
  445. ))
  446. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  447. result.setStudentStayMaleCount(studentStayMaleSet.size());
  448. Set<String> studentNotStayMaleSet = studentList.stream()
  449. .filter(x -> (
  450. x.getGenderCn() != null
  451. && x.getGenderCn().equals(GenderDictionaryEnum.MALE.getCode())
  452. && x.getStduyStatusCn() != null
  453. && x.getStduyStatusCn().equals(StudyStatusEnum.AttendDaySchool.getCode())
  454. ))
  455. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  456. result.setStudentNotStayMaleCount(studentNotStayMaleSet.size());
  457. Set<String> studentStayFemaleSet = studentList.stream()
  458. .filter(x -> (
  459. x.getGenderCn() != null
  460. && x.getGenderCn().equals(GenderDictionaryEnum.FEMALE.getCode())
  461. && x.getStduyStatusCn() != null
  462. && x.getStduyStatusCn().equals(StudyStatusEnum.InResidence.getCode())
  463. ))
  464. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  465. result.setStudentStayFemaleCount(studentStayFemaleSet.size());
  466. Set<String> studentNotStayFemaleSet = studentList.stream()
  467. .filter(x -> (
  468. x.getGenderCn() != null
  469. && x.getGenderCn().equals(GenderDictionaryEnum.FEMALE.getCode())
  470. && x.getStduyStatusCn() != null
  471. && x.getStduyStatusCn().equals(StudyStatusEnum.AttendDaySchool.getCode())
  472. ))
  473. .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
  474. result.setStudentNotStayFemaleCount(studentNotStayFemaleSet.size());
  475. sql = "SELECT name AS item,(" +
  476. " SELECT COUNT(*) FROM xjr_user t1" +
  477. " INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id" +
  478. " WHERE t1.delete_mark = 0 AND t2.grade_id = base_grade.id" +
  479. " ) AS a_count FROM base_grade" +
  480. " WHERE delete_mark = 0 AND status = 1 ORDER BY name DESC LIMIT 3";
  481. list = SqlRunnerAdapter.db().selectList(sql);
  482. Collections.reverse(list);
  483. List<ItemCountVo> gradeList = new ArrayList<>();
  484. for (Map<String, Object> objectMap : list) {
  485. gradeList.add(
  486. new ItemCountVo(){{
  487. setItem(objectMap.get("item").toString());
  488. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  489. }}
  490. );
  491. }
  492. result.setGradeList(gradeList);
  493. return RT.ok(result);
  494. }
  495. @GetMapping(value = "/subscription-statistics")
  496. @ApiOperation(value="物品申购详情数据统计")
  497. @SaCheckPermission("datadetail:detail")
  498. public RT<SubscriptionStatisticsDetailVo> subscriptionStatistics(@Valid StatisticsDetailDto dto) {
  499. SubscriptionStatisticsDetailVo result = new SubscriptionStatisticsDetailVo();
  500. List<WfSubscription> list = subscriptionService.list(
  501. new QueryWrapper<WfSubscription>().lambda()
  502. .between((dto.getStartDate() != null && dto.getEndDate() != null), WfSubscription::getShenQingRiQi4752, dto.getStartDate(), dto.getEndDate())
  503. );
  504. double totalAmount = list.stream().filter(x -> x.getTotalAmount() != null && x.getStatus() == 1).mapToDouble(WfSubscription::getTotalAmount).sum();
  505. result.setTotalAmount(totalAmount);
  506. int adoptCount = list.stream().filter(x -> x.getStatus() == 1).collect(Collectors.toList()).size();
  507. result.setAdoptCount(adoptCount);
  508. int pendingCount = list.stream().filter(x -> x.getStatus() == null || x.getStatus() == 0).collect(Collectors.toList()).size();
  509. result.setPendingCount(pendingCount);
  510. String sql = "SELECT IFNULL(t3.name, '未填写') AS item,COUNT(t1.id) AS a_count,SUM(t1.amount) as a_sum FROM wf_subscription_list t1" +
  511. " INNER JOIN wf_subscription t2 ON t1.parent_id = t2.id" +
  512. " LEFT JOIN xjr_dictionary_detail t3 ON t1.item_type = t3.code" +
  513. " AND t3.item_id = 1752140413593518081" +
  514. " WHERE t2.status = 1";
  515. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  516. if(dto.getStartDate() != null && dto.getEndDate() != null){
  517. sql += " and t2.shen_qing_ri_qi4752 between '" + dto.getStartDate().format(formatter) + "' and '" + dto.getEndDate().format(formatter) + "'";
  518. }
  519. sql += " GROUP BY t3.name";
  520. List<Map<String, Object>> datalist = SqlRunnerAdapter.db().selectList(sql);
  521. List<ItemCountVo> categoryCountList = new ArrayList<>();
  522. List<ItemDoubleVo> categoryAmountList = new ArrayList<>();
  523. for (Map<String, Object> objectMap : datalist) {
  524. categoryCountList.add(
  525. new ItemCountVo(){{
  526. setItem(objectMap.get("item").toString());
  527. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  528. }}
  529. );
  530. categoryAmountList.add(
  531. new ItemDoubleVo(){{
  532. setItem(objectMap.get("item").toString());
  533. setAmount(Double.parseDouble(objectMap.get("a_sum").toString()));
  534. }}
  535. );
  536. }
  537. result.setCategoryCountList(categoryCountList);
  538. result.setCategoryAmountList(categoryAmountList);
  539. sql = "SELECT IFNULL(t3.name, '未填写') AS item,COUNT(t1.id) AS a_count,SUM(t1.amount) as a_sum FROM wf_subscription_list t1" +
  540. " INNER JOIN wf_subscription t2 ON t1.parent_id = t2.id" +
  541. " LEFT JOIN xjr_department t3 ON t2.application_department = t3.id" +
  542. " WHERE t2.status = 1";
  543. if(dto.getStartDate() != null && dto.getEndDate() != null){
  544. sql += " and t2.shen_qing_ri_qi4752 between '" + dto.getStartDate().format(formatter) + "' and '" + dto.getEndDate().format(formatter) + "'";
  545. }
  546. sql += " GROUP BY t3.name";
  547. datalist = SqlRunnerAdapter.db().selectList(sql);
  548. List<ItemCountAmountVo> deptList = new ArrayList<>();
  549. for (Map<String, Object> objectMap : datalist) {
  550. deptList.add(
  551. new ItemCountAmountVo(){{
  552. setItem(objectMap.get("item").toString());
  553. setCount(Integer.parseInt(objectMap.get("a_count").toString()));
  554. setAmount(Double.parseDouble(objectMap.get("a_sum").toString()));
  555. }}
  556. );
  557. }
  558. result.setDeptList(deptList);
  559. return RT.ok(result);
  560. }
  561. @GetMapping(value = "/course-statistics")
  562. @ApiOperation(value="课表详情数据统计")
  563. @SaCheckPermission("datadetail:detail")
  564. public RT<CourseStatisticsDetailVo> courseStatistics(@Valid StatisticsDetailDto dto) {
  565. CourseStatisticsDetailVo result = new CourseStatisticsDetailVo();
  566. String sql = "SELECT t1.id, t1.name,t4.name AS dept_name," +
  567. " (SELECT GROUP_CONCAT(DISTINCT(course_name)) FROM course_table WHERE teacher_id = t1.id) AS course_names," +
  568. " (SELECT COUNT(*) FROM course_table WHERE teacher_id = t1.id) AS course_count FROM xjr_user t1" +
  569. " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
  570. " INNER JOIN xjr_user_dept_relation t3 ON t1.id = t3.user_id" +
  571. " INNER JOIN xjr_department t4 ON t3.dept_id = t4.id" +
  572. " WHERE t1.delete_mark = 0 AND t4.is_major = 1" +
  573. " ORDER BY course_count DESC LIMIT 5";
  574. List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
  575. List<CourseCountListVo> courseCountList = new ArrayList<>();
  576. for (Map<String, Object> objectMap : list) {
  577. CourseCountListVo listVo = SqlRunnerAdapterUtil.convertMapToEntity(objectMap, CourseCountListVo.class);
  578. courseCountList.add(listVo);
  579. }
  580. result.setCourseCountList(courseCountList);
  581. sql = "SELECT count(*) FROM course_table t1" +
  582. " INNER JOIN base_teacher t2 ON t1.teacher_id = t2.user_id" +
  583. " INNER JOIN xjr_user_dept_relation t3 ON t2.user_id = t3.user_id" +
  584. " INNER JOIN xjr_department t4 ON t4.id = t3.dept_id" +
  585. " WHERE t4.delete_mark = 0 AND t2.delete_mark = 0" +
  586. " AND t4.is_major = 1";
  587. long allCourseCount = SqlRunnerAdapter.db().selectCount(sql);
  588. sql = "SELECT name,(" +
  589. " SELECT COUNT(*) FROM course_table t1" +
  590. " INNER JOIN base_teacher t2 ON t1.teacher_id = t2.user_id" +
  591. " INNER JOIN xjr_user_dept_relation t3 ON t2.user_id = t3.user_id" +
  592. " WHERE t3.dept_id = xjr_department.id" +
  593. " ) AS course_count FROM xjr_department WHERE is_major = 1";
  594. list = SqlRunnerAdapter.db().selectList(sql);
  595. List<ItemCountRatioVo> deptCourseList = new ArrayList<>();
  596. for (Map<String, Object> objectMap : list) {
  597. int courseCount = Integer.parseInt(objectMap.get("course_count").toString());
  598. //计算出勤率
  599. BigDecimal divide = BigDecimal.valueOf(courseCount).divide(BigDecimal.valueOf(allCourseCount), 4, RoundingMode.HALF_UP);
  600. deptCourseList.add(
  601. new ItemCountRatioVo() {{
  602. setItem(objectMap.get("name").toString());
  603. setCount(courseCount);
  604. setRatio(divide.doubleValue());
  605. }}
  606. );
  607. }
  608. result.setDeptCourseList(deptCourseList);
  609. return RT.ok(result);
  610. }
  611. }