TwinCalc2hrServiceImpl.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package com.ruoyi.biz.service.impl;
  2. import com.ruoyi.biz.domain.TwinCalc2hr;
  3. import com.ruoyi.biz.domain.TwinDevice;
  4. import com.ruoyi.biz.mapper.TwinCalc2hrMapper;
  5. import com.ruoyi.biz.service.ITwinCalc2hrService;
  6. import com.ruoyi.biz.service.ITwinDeviceService;
  7. import com.ruoyi.common.core.text.Convert;
  8. import org.springframework.stereotype.Service;
  9. import javax.annotation.Resource;
  10. import java.time.LocalDate;
  11. import java.time.LocalDateTime;
  12. import java.time.LocalTime;
  13. import java.time.ZoneOffset;
  14. import java.util.ArrayList;
  15. import java.util.Date;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.concurrent.ExecutionException;
  19. import java.util.concurrent.Future;
  20. /**
  21. * 2小时统计数据Service业务层处理
  22. *
  23. * @author ruoyi
  24. * @date 2024-05-12
  25. */
  26. @Service
  27. public class TwinCalc2hrServiceImpl implements ITwinCalc2hrService {
  28. @Resource
  29. private TwinCalc2hrMapper twinCalc2hrMapper;
  30. @Resource
  31. private ITwinDeviceService deviceService;
  32. @Resource
  33. private IotTokenServiceImpl iotTokenService;
  34. @Resource
  35. private AsyncServiceImpl asyncService;
  36. /**
  37. * 查询2小时统计数据
  38. *
  39. * @param id 2小时统计数据主键
  40. * @return 2小时统计数据
  41. */
  42. @Override
  43. public TwinCalc2hr selectTwinCalc2hrById(Long id) {
  44. return twinCalc2hrMapper.selectTwinCalc2hrById(id);
  45. }
  46. /**
  47. * 查询2小时统计数据列表
  48. *
  49. * @param twinCalc2hr 2小时统计数据
  50. * @return 2小时统计数据
  51. */
  52. @Override
  53. public List<TwinCalc2hr> selectTwinCalc2hrList(TwinCalc2hr twinCalc2hr) {
  54. return twinCalc2hrMapper.selectTwinCalc2hrList(twinCalc2hr);
  55. }
  56. /**
  57. * 新增2小时统计数据
  58. *
  59. * @param twinCalc2hr 2小时统计数据
  60. * @return 结果
  61. */
  62. @Override
  63. public int insertTwinCalc2hr(TwinCalc2hr twinCalc2hr) {
  64. return twinCalc2hrMapper.insertTwinCalc2hr(twinCalc2hr);
  65. }
  66. /**
  67. * 修改2小时统计数据
  68. *
  69. * @param twinCalc2hr 2小时统计数据
  70. * @return 结果
  71. */
  72. @Override
  73. public int updateTwinCalc2hr(TwinCalc2hr twinCalc2hr) {
  74. return twinCalc2hrMapper.updateTwinCalc2hr(twinCalc2hr);
  75. }
  76. /**
  77. * 批量删除2小时统计数据
  78. *
  79. * @param ids 需要删除的2小时统计数据主键
  80. * @return 结果
  81. */
  82. @Override
  83. public int deleteTwinCalc2hrByIds(String ids) {
  84. return twinCalc2hrMapper.deleteTwinCalc2hrByIds(Convert.toStrArray(ids));
  85. }
  86. /**
  87. * 删除2小时统计数据信息
  88. *
  89. * @param id 2小时统计数据主键
  90. * @return 结果
  91. */
  92. @Override
  93. public int deleteTwinCalc2hrById(Long id) {
  94. return twinCalc2hrMapper.deleteTwinCalc2hrById(id);
  95. }
  96. /**
  97. * 获取上一个时段
  98. *
  99. * @return 时段 1-12
  100. */
  101. @Override
  102. public Long lastPeriod() {
  103. return twinCalc2hrMapper.lastPeriod();
  104. }
  105. /**
  106. * 计算当天的统计数据
  107. *
  108. * @return 统计数据
  109. */
  110. @Override
  111. public TwinCalc2hr calcToday() {
  112. TwinCalc2hr calc2hr = twinCalc2hrMapper.calcToday();
  113. TwinCalc2hr curr2hr = calcCurr();
  114. calc2hr.calc(curr2hr);
  115. return calc2hr;
  116. }
  117. /**
  118. * 统计上一个偶数时间至当前的数据
  119. */
  120. private TwinCalc2hr calcCurr() {
  121. TwinCalc2hr result = new TwinCalc2hr();
  122. //获取上一个时段
  123. Long lastPeriod = lastPeriod();
  124. LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
  125. if (lastPeriod != 12L) {
  126. //如果为12,则代表是前一天的,那就从今天0点开始
  127. start = start.plusHours(2 * lastPeriod);
  128. }
  129. start = start.minusSeconds(1);
  130. //获取时段范围 时间 1=0-2点 2=2-4
  131. LocalDateTime end = LocalDateTime.now();
  132. Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  133. Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  134. //为了避免多线程同时获取token导致重复执行,先执行一次获取token
  135. iotTokenService.getToken();
  136. List<TwinDevice> list = deviceService.selectTwinDeviceList(new TwinDevice());
  137. List<Future<Map<String, List<?>>>> futureList = new ArrayList<>();
  138. for (int i = 0; i < list.size(); i++) {
  139. TwinDevice twinDevice = list.get(i);
  140. futureList.add(asyncService.process(twinDevice, new Date(), startTime, endTime, 0));
  141. }
  142. try {
  143. for (Future<Map<String, List<?>>> future : futureList) {
  144. Map<String, List<?>> map = future.get();
  145. List<TwinCalc2hr> calc2hrs = (List<TwinCalc2hr>) map.get("calc");
  146. for (TwinCalc2hr calc2hr : calc2hrs) {
  147. result.calc(calc2hr);
  148. }
  149. }
  150. } catch (InterruptedException e) {
  151. throw new RuntimeException(e);
  152. } catch (ExecutionException e) {
  153. throw new RuntimeException(e);
  154. }
  155. return result;
  156. }
  157. }