StatManagerImpl.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package com.punchsettle.server.service.manager.impl;
  2. import com.punchsettle.server.atomic.entity.PiTaskHistory;
  3. import com.punchsettle.server.atomic.entity.StatNewUser;
  4. import com.punchsettle.server.atomic.entity.StatPoints;
  5. import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
  6. import com.punchsettle.server.atomic.service.IStatNewUserService;
  7. import com.punchsettle.server.atomic.service.IStatPointsService;
  8. import com.punchsettle.server.constant.PunchInResultEnum;
  9. import com.punchsettle.server.core.config.BizProperties;
  10. import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
  11. import com.punchsettle.server.pojo.stat.StatNewUserQuery;
  12. import com.punchsettle.server.pojo.stat.StatPointsQuery;
  13. import com.punchsettle.server.pojo.ucharts.LineSeriesVO;
  14. import com.punchsettle.server.pojo.ucharts.LineVO;
  15. import com.punchsettle.server.service.manager.IStatManager;
  16. import com.punchsettle.server.utiis.DateUtils;
  17. import com.punchsettle.server.utiis.UserUtils;
  18. import lombok.Data;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Component;
  21. import org.springframework.util.CollectionUtils;
  22. import java.time.LocalDate;
  23. import java.util.ArrayList;
  24. import java.util.Arrays;
  25. import java.util.Date;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.Objects;
  29. import java.util.Optional;
  30. import java.util.function.Function;
  31. import java.util.stream.Collectors;
  32. /**
  33. * @author myou
  34. * @version 1.0.0
  35. * @date 2025/5/3 9:32
  36. * @description 统计数据服务类
  37. */
  38. @Component
  39. public class StatManagerImpl implements IStatManager {
  40. @Autowired
  41. private IStatPointsService statPointsService;
  42. @Autowired
  43. private IStatNewUserService statNewUserService;
  44. @Autowired
  45. private IPiTaskHistoryService piTaskHistoryService;
  46. @Autowired
  47. private BizProperties bizProperties;
  48. @Override
  49. public LineVO queryStatPointsLine() {
  50. LocalDate endDate = LocalDate.now();
  51. LocalDate startDate = endDate.minusDays(bizProperties.getLineItemCount());
  52. // 获取折线图时间范围
  53. List<LocalDate> dateRange = DateUtils.getDateRange(startDate, endDate);
  54. String[] lineCategories = dateRange.stream().map(LocalDate::toString).toArray(String[]::new);
  55. StatPointsQuery statPointsQuery = new StatPointsQuery();
  56. statPointsQuery.setUserId(UserUtils.getCurrentUserId());
  57. statPointsQuery.setStatStartTime(startDate.toString());
  58. statPointsQuery.setStatEndTime(endDate.toString());
  59. List<StatPoints> statPointsList = statPointsService.queryByCondition(statPointsQuery);
  60. Map<String, StatPoints> statPointsMap = statPointsList.stream().collect(Collectors.toMap(StatPoints::getStatTime, Function.identity(), (v1, v2) -> v1));
  61. List<Integer> settlePointsList = new ArrayList<>(lineCategories.length);
  62. List<Integer> consumePointsList = new ArrayList<>(lineCategories.length);
  63. List<Integer> totalPointsList = new ArrayList<>(lineCategories.length);
  64. for (String lineCategory : lineCategories) {
  65. StatPoints statPoints = statPointsMap.get(lineCategory);
  66. if (Objects.isNull(statPoints)) {
  67. settlePointsList.add(null);
  68. consumePointsList.add(null);
  69. totalPointsList.add(null);
  70. continue;
  71. }
  72. settlePointsList.add(statPoints.getSettlePoints());
  73. consumePointsList.add(statPoints.getConsumePoints());
  74. totalPointsList.add(statPoints.getTotalPoints());
  75. }
  76. LineSeriesVO settlePointsLineSeriesVO = new LineSeriesVO();
  77. settlePointsLineSeriesVO.setName("结算积分");
  78. settlePointsLineSeriesVO.setData(settlePointsList.toArray(Integer[]::new));
  79. LineSeriesVO consumePointsLineSeriesVO = new LineSeriesVO();
  80. consumePointsLineSeriesVO.setName("消耗积分");
  81. consumePointsLineSeriesVO.setData(consumePointsList.toArray(Integer[]::new));
  82. LineSeriesVO totalPointsLineSeriesVO = new LineSeriesVO();
  83. totalPointsLineSeriesVO.setName("总积分");
  84. totalPointsLineSeriesVO.setData(totalPointsList.toArray(Integer[]::new));
  85. LineVO lineVO = new LineVO();
  86. lineVO.setCategories(lineCategories);
  87. lineVO.setSeries(Arrays.asList(settlePointsLineSeriesVO, consumePointsLineSeriesVO, totalPointsLineSeriesVO));
  88. return lineVO;
  89. }
  90. @Override
  91. public LineVO queryStatNewUserLine() {
  92. LocalDate endDate = LocalDate.now();
  93. LocalDate startDate = endDate.minusDays(bizProperties.getLineItemCount());
  94. // 获取折线图时间范围
  95. List<LocalDate> dateRange = DateUtils.getDateRange(startDate, endDate);
  96. String[] lineCategories = dateRange.stream().map(LocalDate::toString).toArray(String[]::new);
  97. StatNewUserQuery statNewUserQuery = new StatNewUserQuery();
  98. statNewUserQuery.setStatStartTime(startDate.toString());
  99. statNewUserQuery.setStatEndTime(endDate.toString());
  100. List<StatNewUser> statNewUserList = statNewUserService.queryByCondition(statNewUserQuery);
  101. Map<String, Integer> statNewUserMap = statNewUserList.stream().collect(Collectors.toMap(StatNewUser::getStatTime, StatNewUser::getNewUserCount, (v1, v2) -> v1));
  102. List<Integer> newUserCountList = new ArrayList<>(lineCategories.length);
  103. for (String lineCategory : lineCategories) {
  104. Integer newUserCount = Optional.ofNullable(statNewUserMap.get(lineCategory)).orElse(0);
  105. newUserCountList.add(newUserCount);
  106. }
  107. LineSeriesVO newUserLineSeriesVO = new LineSeriesVO();
  108. newUserLineSeriesVO.setName("新增用户数");
  109. newUserLineSeriesVO.setData(newUserCountList.toArray(Integer[]::new));
  110. LineVO lineVO = new LineVO();
  111. lineVO.setCategories(lineCategories);
  112. lineVO.setSeries(Arrays.asList(newUserLineSeriesVO));
  113. return lineVO;
  114. }
  115. @Override
  116. public LineVO queryStatTaskLine() {
  117. LocalDate endDate = LocalDate.now();
  118. LocalDate startDate = endDate.minusDays(bizProperties.getLineItemCount());
  119. // 获取折线图时间范围
  120. List<LocalDate> dateRange = DateUtils.getDateRange(startDate, endDate);
  121. String[] lineCategories = dateRange.stream().map(LocalDate::toString).toArray(String[]::new);
  122. PiTaskHistoryQuery piTaskHistoryQuery = new PiTaskHistoryQuery();
  123. piTaskHistoryQuery.setPunchInDateFrom(startDate.toString());
  124. piTaskHistoryQuery.setPunchInDateTo(endDate.toString());
  125. List<PiTaskHistory> piTaskHistoryList = piTaskHistoryService.queryByCondition(piTaskHistoryQuery);
  126. Map<String, List<PiTaskHistory>> piTaskHistoryMap = piTaskHistoryList.stream().collect(Collectors.groupingBy(PiTaskHistory::getPunchInDate));
  127. // 总任务数
  128. List<Integer> totalTaskCountList = new ArrayList<>(lineCategories.length);
  129. // 打卡任务数
  130. List<Integer> punchInTaskCountList = new ArrayList<>(lineCategories.length);
  131. // 完成打卡任务数
  132. List<Integer> doneTaskCountList = new ArrayList<>(lineCategories.length);
  133. for (String lineCategory : lineCategories) {
  134. List<PiTaskHistory> piTaskHistories = piTaskHistoryMap.get(lineCategory);
  135. if (CollectionUtils.isEmpty(piTaskHistories)) {
  136. totalTaskCountList.add(0);
  137. punchInTaskCountList.add(0);
  138. doneTaskCountList.add(0);
  139. continue;
  140. }
  141. // 总任数
  142. totalTaskCountList.add(piTaskHistories.size());
  143. // TODO 这里要单独弄一个统计表,不然无法计算
  144. punchInTaskCountList.add(piTaskHistories.size());
  145. // 任务完成数
  146. doneTaskCountList.add(piTaskHistories.stream().filter(piTaskHistory -> piTaskHistory.getPunchInResult().equals(PunchInResultEnum.DONE)).collect(Collectors.toList()).size());
  147. }
  148. LineSeriesVO totalTaskCountLineSeriesVO = new LineSeriesVO();
  149. totalTaskCountLineSeriesVO.setName("总任务数");
  150. totalTaskCountLineSeriesVO.setData(totalTaskCountList.toArray(Integer[]::new));
  151. LineSeriesVO punchInTaskCountLineSeriesVO = new LineSeriesVO();
  152. punchInTaskCountLineSeriesVO.setName("打卡数量");
  153. punchInTaskCountLineSeriesVO.setData(punchInTaskCountList.toArray(Integer[]::new));
  154. LineSeriesVO doneTaskCountLineSeriesVO = new LineSeriesVO();
  155. doneTaskCountLineSeriesVO.setName("完成数量");
  156. doneTaskCountLineSeriesVO.setData(doneTaskCountList.toArray(Integer[]::new));
  157. LineVO lineVO = new LineVO();
  158. lineVO.setCategories(lineCategories);
  159. lineVO.setSeries(Arrays.asList(totalTaskCountLineSeriesVO, punchInTaskCountLineSeriesVO, doneTaskCountLineSeriesVO));
  160. return lineVO;
  161. }
  162. }