NetCardInfoLogServiceImpl.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package com.welampiot.service.impl;
  2. import com.welampiot.dao.NetCardInfoLogDao;
  3. import com.welampiot.dto.NetCardInfoLogDTO;
  4. import com.welampiot.service.NetCardInfoLogService;
  5. import com.welampiot.utils.ToolUtils;
  6. import com.welampiot.vo.NetCardLogVO;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9. import java.text.DecimalFormat;
  10. import java.time.LocalDate;
  11. import java.time.format.DateTimeFormatter;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.stream.Collectors;
  16. @Service
  17. public class NetCardInfoLogServiceImpl implements NetCardInfoLogService {
  18. @Autowired
  19. private NetCardInfoLogDao netCardInfoLogDao;
  20. @Override
  21. public NetCardLogVO getNetCardLogListByLogVO(NetCardLogVO netCardLogVO) {
  22. String nowDate = ToolUtils.getNowDate();
  23. String[] split = nowDate.split("-");
  24. String year = split[0];
  25. String month = split[1];
  26. String monthStr = year + "-" + month;
  27. if (netCardLogVO.getDataType() == 1) {
  28. return getNetCardLogListByLampIdAndYear(netCardLogVO.getLampId(), year, month);
  29. }
  30. return getNetCardLogListByLampIdAndMonth(netCardLogVO.getLampId(), year, monthStr);
  31. }
  32. @Override
  33. public NetCardLogVO getNetCardLogListByLampIdAndMonth(Integer lampId, String year, String month) {
  34. List<NetCardInfoLogDTO> logs = netCardInfoLogDao.getNetCardLogListByLampIdAndMonth(lampId, month);
  35. // 按日期分组,取每个日期的最后一笔记录
  36. Map<LocalDate, NetCardInfoLogDTO> dailyLogs = logs.stream()
  37. .collect(Collectors.toMap(
  38. log -> parseLocalDate(log.getUpdateTime()),
  39. log -> log,
  40. (existing, replacement) -> existing.getUpdateTime().compareTo(replacement.getUpdateTime()) > 0 ? existing : replacement
  41. ));
  42. // 计算每天的流量使用量
  43. List<Object> dataList = new ArrayList<>();
  44. List<Object> dateList = new ArrayList<>();
  45. LocalDate firstDayOfMonth = LocalDate.parse(month + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  46. LocalDate lastDayOfMonth = firstDayOfMonth.withDayOfMonth(firstDayOfMonth.lengthOfMonth());
  47. DecimalFormat df = new DecimalFormat("0.##");
  48. for (LocalDate date = firstDayOfMonth; !date.isAfter(lastDayOfMonth); date = date.plusDays(1)) {
  49. NetCardInfoLogDTO currentLog = dailyLogs.get(date);
  50. NetCardInfoLogDTO previousLog = dailyLogs.get(date.minusDays(1));
  51. double usage = 0.0;
  52. if (currentLog != null) {
  53. if (previousLog == null) {
  54. usage = currentLog.getUseGprs(); // 第一天的流量
  55. } else {
  56. usage = currentLog.getUseGprs() - previousLog.getUseGprs();
  57. }
  58. }
  59. dataList.add(df.format(usage));
  60. dateList.add(date.toString());
  61. }
  62. NetCardLogVO netCardLogVO1 = new NetCardLogVO();
  63. netCardLogVO1.setDateList(dateList);
  64. netCardLogVO1.setDataList(dataList);
  65. return netCardLogVO1;
  66. }
  67. @Override
  68. public NetCardLogVO getNetCardLogListByLampIdAndYear(Integer lampId, String year, String month) {
  69. List<NetCardInfoLogDTO> logs = netCardInfoLogDao.getNetCardLogListByLampIdAndYear(lampId, year);
  70. // 创建一个包含所有月份的列表
  71. List<String> allMonths = new ArrayList<>();
  72. for (int i = 1; i <= 12; i++) {
  73. allMonths.add(String.format("%s-%02d", year, i));
  74. }
  75. // 将 logs 转换为 Map,键为月份,值为 NetCardInfoLogDTO
  76. Map<String, NetCardInfoLogDTO> monthlyLogs = logs.stream()
  77. .collect(Collectors.toMap(
  78. log -> log.getUpdateTime().substring(0, 7), // 取前7个字符,即 "YYYY-MM"
  79. log -> log,
  80. (existing, replacement) -> existing.getUpdateTime().compareTo(replacement.getUpdateTime()) > 0 ? existing : replacement
  81. ));
  82. // 初始化 dataList 和 dateList
  83. List<Object> dataList = new ArrayList<>();
  84. List<Object> dateList = new ArrayList<>();
  85. DecimalFormat df = new DecimalFormat("0.##");
  86. // 遍历所有月份,填充 dataList 和 dateList
  87. for (String months : allMonths) {
  88. NetCardInfoLogDTO log = monthlyLogs.get(months);
  89. double usage = log != null ? log.getUseGprs() : 0.0;
  90. dataList.add(df.format(usage));
  91. dateList.add(months);
  92. }
  93. NetCardLogVO netCardLogVO = new NetCardLogVO();
  94. netCardLogVO.setDateList(dateList);
  95. netCardLogVO.setDataList(dataList);
  96. return netCardLogVO;
  97. }
  98. private LocalDate parseLocalDate(String dateStr) {
  99. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  100. return LocalDate.parse(dateStr, formatter);
  101. }
  102. }