StatisticsServiceImpl.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package com.hz.employmentsite.services.impl.statistics;
  2. import com.hz.employmentsite.mapper.cquery.StatisticsCQuery;
  3. import com.hz.employmentsite.services.service.statistics.StatisticsService;
  4. import com.hz.employmentsite.util.DateUtils;
  5. import com.hz.employmentsite.vo.statistics.RegionSystemDataCount;
  6. import com.hz.employmentsite.vo.statistics.SystemDataCount;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9. import java.time.LocalDate;
  10. import java.util.*;
  11. @Service("StatisticsService")
  12. public class StatisticsServiceImpl implements StatisticsService {
  13. @Autowired
  14. private StatisticsCQuery statisticsCQuery;
  15. @Autowired
  16. private DateUtils dateUtils;
  17. /**
  18. * 查询指定时间段系统使用情况
  19. *
  20. * @param startDate 开始时间
  21. * @param endDate 结束时间
  22. * @return 数据统计VO类集合
  23. */
  24. @Override
  25. public List<SystemDataCount> findSystemDataCount(Date startDate, Date endDate) {
  26. List<SystemDataCount> list = statisticsCQuery.findSystemDataCount(startDate, endDate);
  27. // 初始化总和变量
  28. SystemDataCount totalData = new SystemDataCount("合计", "合计", "合计", "合计", 0, 0, 0, 0);
  29. // 遍历list,计算各项总和
  30. for (SystemDataCount data : list) {
  31. totalData.setSiteUserCount(totalData.getSiteUserCount() + data.getSiteUserCount());
  32. totalData.setCompanyCount(totalData.getCompanyCount() + data.getCompanyCount());
  33. totalData.setPostCount(totalData.getPostCount() + data.getPostCount());
  34. totalData.setJobUserCount(totalData.getJobUserCount() + data.getJobUserCount());
  35. }
  36. // 将合计对象插入到list的第一个位置
  37. list.add(0, totalData);
  38. // 计算每个县区的小计
  39. Map<String, SystemDataCount> regionCounts = new HashMap<>();
  40. for (SystemDataCount data : list) {
  41. if (!data.getRegionName().equals("合计")) {
  42. String regionCode = data.getRegionCode();
  43. if (!regionCounts.containsKey(regionCode)) {
  44. regionCounts.put(regionCode, new SystemDataCount(data.getSiteID(), "小计", data.getRegionCode(), data.getRegionName(), 0, 0, 0, 0));
  45. }
  46. SystemDataCount regionTotal = regionCounts.get(regionCode);
  47. regionTotal.setSiteUserCount(regionTotal.getSiteUserCount() + data.getSiteUserCount());
  48. regionTotal.setCompanyCount(regionTotal.getCompanyCount() + data.getCompanyCount());
  49. regionTotal.setPostCount(regionTotal.getPostCount() + data.getPostCount());
  50. regionTotal.setJobUserCount(regionTotal.getJobUserCount() + data.getJobUserCount());
  51. }
  52. }
  53. // 将小计结果插入到每个相同regionCode的最前面
  54. for (Map.Entry<String, SystemDataCount> entry : regionCounts.entrySet()) {
  55. String regionCode = entry.getKey();
  56. SystemDataCount regionTotal = entry.getValue();
  57. // 找到相同regionCode的第一个位置
  58. int index = 0;
  59. for (int i = 0; i < list.size(); i++) {
  60. if (list.get(i).getRegionCode().equals(regionCode)) {
  61. index = i;
  62. break;
  63. }
  64. }
  65. list.add(index, regionTotal);
  66. }
  67. return list;
  68. }
  69. /**
  70. * 查询指定月份的系统使用情况统计
  71. *
  72. * @param dateStr 月份日期
  73. * @return
  74. */
  75. @Override
  76. public Map<String, List<RegionSystemDataCount>> findMonthSystemDataCount(String dateStr) {
  77. // 各区县的驿站工作人员统计数量
  78. List<Map<String, Object>> regionSiteUserCount = statisticsCQuery.findRegionSiteUserCount();
  79. // 解析日期,获取每周的开始结束时间
  80. List<Map<String, LocalDate>> weekDate = dateUtils.getWeekDateByMonth(dateStr);
  81. Map<String, List<RegionSystemDataCount>> result = new LinkedHashMap<>();
  82. // 汇总数据
  83. List<RegionSystemDataCount> sumData = new ArrayList<>();
  84. // 创建一个 map 来存储 regionCode 和 siteUserCount 的对应关系
  85. Map<String, Integer> siteUserCountMap = new HashMap<>();
  86. for (Map<String, Object> objectMap : regionSiteUserCount) {
  87. String regionCode = (String) objectMap.get("code");
  88. String regionName = (String) objectMap.get("name");
  89. int siteUserCount = ((Long) objectMap.get("siteUserCount")).intValue();
  90. siteUserCountMap.put(regionCode, siteUserCount);
  91. // 计算合计数量
  92. RegionSystemDataCount summaryData = new RegionSystemDataCount(regionCode, regionName, siteUserCount, 0, 0, 0);
  93. sumData.add(summaryData);
  94. }
  95. // 按每周的日期进行系统使用数据查询
  96. for (int i = 0; i < weekDate.size(); i++) {
  97. // 获取当前周的开始日期和结束日期
  98. LocalDate startDate = weekDate.get(i).get("startDate");
  99. LocalDate endDate = weekDate.get(i).get("endDate");
  100. // 查询当前周的系统使用数据
  101. List<RegionSystemDataCount> contData = statisticsCQuery.findWeekSystemDataCount(startDate, endDate);
  102. // 创建合计数据
  103. RegionSystemDataCount summaryData = new RegionSystemDataCount("100", "合计", 0, 0, 0, 0);
  104. // 填充驿站工作人员统计数量
  105. for (RegionSystemDataCount dataCount : contData) {
  106. String regionCode = dataCount.getRegionCode();
  107. if (siteUserCountMap.containsKey(regionCode)) {
  108. dataCount.setSiteUserCount(siteUserCountMap.get(regionCode));
  109. }
  110. // 合计数据累加
  111. summaryData.setSiteUserCount(summaryData.getSiteUserCount() + dataCount.getSiteUserCount());
  112. summaryData.setCompanyCount(summaryData.getCompanyCount() + dataCount.getCompanyCount());
  113. summaryData.setPostCount(summaryData.getPostCount() + dataCount.getPostCount());
  114. summaryData.setJobUserCount(summaryData.getJobUserCount() + dataCount.getJobUserCount());
  115. // 将各个区县的数据累加到汇总
  116. for (RegionSystemDataCount sumDatum : sumData) {
  117. if (sumDatum.getRegionCode().equals(dataCount.getRegionCode())) {
  118. sumDatum.setSiteUserCount(dataCount.getSiteUserCount());
  119. sumDatum.setCompanyCount(sumDatum.getCompanyCount() + dataCount.getCompanyCount());
  120. sumDatum.setPostCount(sumDatum.getPostCount() + dataCount.getPostCount());
  121. sumDatum.setJobUserCount(sumDatum.getJobUserCount() + dataCount.getJobUserCount());
  122. }
  123. }
  124. }
  125. // 将汇总对象添加到结果中
  126. contData.add(summaryData);
  127. // 保存结果
  128. result.put("第" + (i + 1) + "周", contData);
  129. }
  130. // 计算汇总的合计
  131. RegionSystemDataCount summaryData = new RegionSystemDataCount("100", "合计", 0, 0, 0, 0);
  132. for (RegionSystemDataCount sumDatum : sumData) {
  133. summaryData.setSiteUserCount(summaryData.getSiteUserCount() + sumDatum.getSiteUserCount());
  134. summaryData.setCompanyCount(summaryData.getCompanyCount() + sumDatum.getCompanyCount());
  135. summaryData.setPostCount(summaryData.getPostCount() + sumDatum.getPostCount());
  136. summaryData.setJobUserCount(summaryData.getJobUserCount() + sumDatum.getJobUserCount());
  137. }
  138. sumData.add(summaryData);
  139. result.put("汇总", sumData);
  140. return result;
  141. }
  142. }