TwinCalc2hrServiceImpl.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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.IIotService;
  6. import com.ruoyi.biz.service.ITwinCalc2hrService;
  7. import com.ruoyi.biz.service.ITwinDeviceService;
  8. import com.ruoyi.common.core.text.Convert;
  9. import org.springframework.stereotype.Service;
  10. import javax.annotation.Resource;
  11. import java.time.LocalDate;
  12. import java.time.LocalDateTime;
  13. import java.time.LocalTime;
  14. import java.time.ZoneOffset;
  15. import java.util.ArrayList;
  16. import java.util.Date;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.concurrent.ExecutionException;
  20. import java.util.concurrent.Future;
  21. /**
  22. * 2小时统计数据Service业务层处理
  23. *
  24. * @author ruoyi
  25. * @date 2024-05-12
  26. */
  27. @Service
  28. public class TwinCalc2hrServiceImpl implements ITwinCalc2hrService {
  29. @Resource
  30. private TwinCalc2hrMapper twinCalc2hrMapper;
  31. @Resource
  32. private ITwinDeviceService deviceService;
  33. @Resource
  34. private IIotService iotService;
  35. @Resource
  36. private AsyncServiceImpl asyncService;
  37. /**
  38. * 查询2小时统计数据
  39. *
  40. * @param id 2小时统计数据主键
  41. * @return 2小时统计数据
  42. */
  43. @Override
  44. public TwinCalc2hr selectTwinCalc2hrById(Long id) {
  45. return twinCalc2hrMapper.selectTwinCalc2hrById(id);
  46. }
  47. /**
  48. * 查询2小时统计数据列表
  49. *
  50. * @param twinCalc2hr 2小时统计数据
  51. * @return 2小时统计数据
  52. */
  53. @Override
  54. public List<TwinCalc2hr> selectTwinCalc2hrList(TwinCalc2hr twinCalc2hr) {
  55. return twinCalc2hrMapper.selectTwinCalc2hrList(twinCalc2hr);
  56. }
  57. /**
  58. * 新增2小时统计数据
  59. *
  60. * @param twinCalc2hr 2小时统计数据
  61. * @return 结果
  62. */
  63. @Override
  64. public int insertTwinCalc2hr(TwinCalc2hr twinCalc2hr) {
  65. return twinCalc2hrMapper.insertTwinCalc2hr(twinCalc2hr);
  66. }
  67. /**
  68. * 修改2小时统计数据
  69. *
  70. * @param twinCalc2hr 2小时统计数据
  71. * @return 结果
  72. */
  73. @Override
  74. public int updateTwinCalc2hr(TwinCalc2hr twinCalc2hr) {
  75. return twinCalc2hrMapper.updateTwinCalc2hr(twinCalc2hr);
  76. }
  77. /**
  78. * 批量删除2小时统计数据
  79. *
  80. * @param ids 需要删除的2小时统计数据主键
  81. * @return 结果
  82. */
  83. @Override
  84. public int deleteTwinCalc2hrByIds(String ids) {
  85. return twinCalc2hrMapper.deleteTwinCalc2hrByIds(Convert.toStrArray(ids));
  86. }
  87. /**
  88. * 删除2小时统计数据信息
  89. *
  90. * @param id 2小时统计数据主键
  91. * @return 结果
  92. */
  93. @Override
  94. public int deleteTwinCalc2hrById(Long id) {
  95. return twinCalc2hrMapper.deleteTwinCalc2hrById(id);
  96. }
  97. /**
  98. * 获取上一个时段
  99. *
  100. * @return 时段 1-12
  101. */
  102. @Override
  103. public TwinCalc2hr lastPeriod() {
  104. return twinCalc2hrMapper.lastPeriod();
  105. }
  106. /**
  107. * 计算当天的统计数据
  108. *
  109. * @return 统计数据
  110. */
  111. @Override
  112. public TwinCalc2hr calcToday() {
  113. TwinCalc2hr calc2hr = twinCalc2hrMapper.calcToday();
  114. TwinCalc2hr curr2hr = calcCurr();
  115. if (calc2hr != null) {
  116. //解决当天 0-2点这个时间段的尴尬
  117. calc2hr.calc(curr2hr);
  118. return calc2hr;
  119. } else {
  120. return curr2hr;
  121. }
  122. }
  123. /**
  124. * 计算指定日期的统计数据
  125. *
  126. * @param date 指定日期
  127. * @return 统计数据
  128. */
  129. @Override
  130. public TwinCalc2hr calc4date(Date date) {
  131. return twinCalc2hrMapper.calc4date(date);
  132. }
  133. /**
  134. * 根据设备ID查询指定时间之后的日统计数据
  135. *
  136. * @param date 指定时间
  137. * @param id 设备ID
  138. * @return 列表
  139. */
  140. @Override
  141. public List<TwinCalc2hr> selectTwinCalc2hrListByTime(Date date, Long id) {
  142. return twinCalc2hrMapper.selectTwinCalc2hrListByTime(date, id);
  143. }
  144. /**
  145. * 按设备分类统计日数据
  146. *
  147. * @param start 开始时间
  148. * @param end 结束时间
  149. * @return 列表
  150. */
  151. @Override
  152. public List<TwinCalc2hr> calc2hrList(Date start, Date end) {
  153. return twinCalc2hrMapper.calc2hrList(start, end);
  154. }
  155. /**
  156. * 查询指定设备的周统计数据
  157. *
  158. * @param twinDevice 设备对象
  159. * @return 列表
  160. */
  161. @Override
  162. public List<TwinCalc2hr> selectWeekData(TwinDevice twinDevice) {
  163. /*
  164. *获取最近7天的数据,当天的数据需要单独处理一下
  165. */
  166. LocalDate localDate = LocalDate.now().minusDays(7);
  167. Date date = Date.from(localDate.atStartOfDay(ZoneOffset.of("+8")).toInstant());
  168. List<TwinCalc2hr> list = twinCalc2hrMapper.selectTwinCalc2hrListByTime(date, twinDevice.getId());
  169. TwinCalc2hr today = list.get(list.size() - 1);
  170. //获取上一个时段
  171. Long lastPeriod = today.getTimePeriod();
  172. LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
  173. if (lastPeriod != 12L) {
  174. //如果为12,则代表是前一天的,那就从今天0点开始
  175. start = start.plusHours(2 * lastPeriod);
  176. start = start.minusSeconds(1);
  177. //获取时段范围 时间 1=0-2点 2=2-4
  178. LocalDateTime end = LocalDateTime.now();
  179. Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  180. Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  181. Future<Map<String, List<?>>> future = asyncService.process(twinDevice, new Date(), startTime, endTime, 0);
  182. try {
  183. Map<String, List<?>> map = future.get();
  184. List<TwinCalc2hr> calc2hrs = (List<TwinCalc2hr>) map.get("calc");
  185. for (TwinCalc2hr calc2hr : calc2hrs) {
  186. today.calc(calc2hr);
  187. }
  188. } catch (InterruptedException e) {
  189. throw new RuntimeException(e);
  190. } catch (ExecutionException e) {
  191. throw new RuntimeException(e);
  192. }
  193. }
  194. return list;
  195. }
  196. /**
  197. * 统计上一个偶数时间至当前的数据
  198. */
  199. private TwinCalc2hr calcCurr() {
  200. TwinCalc2hr result = new TwinCalc2hr(true);
  201. result.setDataDate(new Date());
  202. //获取上一个时段
  203. TwinCalc2hr last = lastPeriod();
  204. Long lastPeriod = last.getTimePeriod();
  205. LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
  206. if (lastPeriod != 12L) {
  207. //如果为12,则代表是前一天的,那就从今天0点开始
  208. start = start.plusHours(2 * lastPeriod);
  209. }
  210. start = start.minusSeconds(1);
  211. //获取时段范围 时间 1=0-2点 2=2-4
  212. LocalDateTime end = LocalDateTime.now();
  213. Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  214. Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
  215. //为了避免多线程同时获取token导致重复执行,先执行一次获取token
  216. iotService.getToken();
  217. List<TwinDevice> list = deviceService.selectTwinDeviceList(new TwinDevice());
  218. List<Future<Map<String, List<?>>>> futureList = new ArrayList<>();
  219. for (int i = 0; i < list.size(); i++) {
  220. TwinDevice twinDevice = list.get(i);
  221. futureList.add(asyncService.process(twinDevice, new Date(), startTime, endTime, 0));
  222. }
  223. try {
  224. for (Future<Map<String, List<?>>> future : futureList) {
  225. Map<String, List<?>> map = future.get();
  226. List<TwinCalc2hr> calc2hrs = (List<TwinCalc2hr>) map.get("calc");
  227. for (TwinCalc2hr calc2hr : calc2hrs) {
  228. result.calc(calc2hr);
  229. }
  230. }
  231. } catch (InterruptedException e) {
  232. throw new RuntimeException(e);
  233. } catch (ExecutionException e) {
  234. throw new RuntimeException(e);
  235. }
  236. return result;
  237. }
  238. }