HtAnalogDataServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. package com.bizmatics.service.impl;
  2. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  3. import com.bizmatics.common.core.util.DateUtils;
  4. import com.bizmatics.common.spring.util.JsonUtils;
  5. import com.bizmatics.model.HadDataLog;
  6. import com.bizmatics.model.HtAnalogData;
  7. import com.bizmatics.model.Site;
  8. import com.bizmatics.persistence.mapper.HtAnalogDataMapper;
  9. import com.bizmatics.persistence.mapper.SiteMapper;
  10. import com.bizmatics.service.HadDataLogService;
  11. import com.bizmatics.service.HtAnalogDataService;
  12. import com.bizmatics.common.mvc.base.AbstractCrudService;
  13. import com.bizmatics.service.util.Arith;
  14. import com.bizmatics.service.util.SessionLocal;
  15. import com.bizmatics.service.vo.*;
  16. import com.fasterxml.jackson.core.type.TypeReference;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.apache.lucene.index.IndexFormatTooNewException;
  19. import org.checkerframework.checker.units.qual.A;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import java.util.*;
  23. import java.util.concurrent.atomic.AtomicReference;
  24. import java.util.stream.Collectors;
  25. /**
  26. * <p>
  27. * 服务实现类
  28. * </p>
  29. *
  30. * @author ya
  31. * @since 2021-07-07
  32. */
  33. @Slf4j
  34. @Service
  35. public class HtAnalogDataServiceImpl extends AbstractCrudService<HtAnalogDataMapper, HtAnalogData> implements HtAnalogDataService {
  36. @Autowired
  37. private SiteMapper siteMapper;
  38. @Autowired
  39. private HadDataLogService hadDataLogService;
  40. @Override
  41. public HadCountVO selectCount() {
  42. Integer userId = SessionLocal.getUserId();
  43. Date date = new Date();
  44. HadCountVO hadCountVO = new HadCountVO();
  45. //获取用户对应的站点信息
  46. List<Integer> idList = siteMapper.idList(userId, null);
  47. //日
  48. List<HadDataLog> byToday = getByToday(DateUtils.getDayStartTime(date), date);
  49. hadCountVO.setDayCount(getEpp(byToday, idList, null, null));
  50. //月
  51. List<HadDataLog> byMonth = getByMonth(DateUtils.getFirstDayOfMonth(date), date);
  52. hadCountVO.setMonthCount(getEpp(byMonth, idList, null, null));
  53. //年
  54. List<HadDataLog> byYear = getByMonth(DateUtils.getBeginDayOfYear(date), date);
  55. hadCountVO.setYearCount(getEpp(byYear, idList, null, null));
  56. return hadCountVO;
  57. }
  58. /**
  59. * 获取epp计算结果
  60. * @param list
  61. * @param siteIdList
  62. * @return
  63. */
  64. public Double getEpp(List<HadDataLog> list, List<Integer> siteIdList,Date startTime,Date endTime){
  65. List<HadCrVO> hadCrVoS = new ArrayList<>();
  66. list.forEach(hadDataLog -> {
  67. //获取真实数据
  68. List<HadDataLogVO> hadDateList = getHadDateList(hadDataLog, siteIdList,startTime,endTime);
  69. Map<Integer, DoubleSummaryStatistics> collect = hadDateList.stream()
  70. .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getEpp)));
  71. checkData(collect,hadCrVoS);
  72. });
  73. return getSubCount(hadCrVoS);
  74. }
  75. public List<HadDataLog> getByToday(Date startTime,Date endTime){
  76. return hadDataLogService.list(startTime,endTime);
  77. }
  78. public List<HadDataLog> getByMonth(Date startTime,Date endTime){
  79. return hadDataLogService.maxAndMinList(startTime,endTime);
  80. }
  81. @Override
  82. public List<CommonIcoVO> selectTrendByDate(Integer siteId) {
  83. Date date = new Date();
  84. List<CommonIcoVO> list = new ArrayList<>();
  85. List<Integer> idList = getSiteIdList(siteId);
  86. list.add(getTrendOne("today", idList, DateUtils.getDayStartTime(date), date));
  87. list.add(getTrendOne("yesterday", idList, DateUtils.addDays(date, -1), date));
  88. return list;
  89. }
  90. @Override
  91. public CommonIcoVO selectTrendByMonth() {
  92. List<Integer> siteIdList = getSiteIdList(null);
  93. Date date = new Date();
  94. List<Object> objects = new ArrayList<>();
  95. List<Object> dateList = new ArrayList<>();
  96. List<HadDataLog> hadDataLogList = getByToday(DateUtils.getFirstDayOfMonth(date), date);
  97. for (int i = 1; i <= Integer.parseInt(DateUtils.getDay(date)); i++) {
  98. Date setDays = DateUtils.setDays(date, i);
  99. Date dayStartTime = DateUtils.getDayStartTime(setDays);
  100. Date dayEndTime = DateUtils.getDayEndTime(setDays);
  101. objects.add(getEpp(hadDataLogList,siteIdList,dayStartTime,dayEndTime));
  102. dateList.add(DateUtils.getDay(setDays));
  103. }
  104. CommonIcoVO.builder().name("当月趋势图").list(objects).listDate(dateList).build();
  105. return null;
  106. }
  107. public CommonIcoVO getTrendOne(String name,List<Integer> idList,Date startTime,Date endTime){
  108. List<HadDataLog> list = getByToday(startTime, endTime);
  109. List<Object> objects = new ArrayList<>();
  110. objects.add(0.0);
  111. List<Object> dates = new ArrayList<>();
  112. dates.add("00:00:00");
  113. for (int i = 2; i < 24 ; i+=2) {
  114. //结束时间
  115. Date hours = DateUtils.addHours(startTime, i);
  116. objects.add(getEpp(list,idList,startTime,hours));
  117. startTime = hours;
  118. dates.add(DateUtils.getTime(hours));
  119. }
  120. return CommonIcoVO.builder().name(name).list(objects).listDate(dates).build();
  121. }
  122. @Override
  123. public HadCountVO getCountBySite(Integer siteId) {
  124. List<Integer> siteIdList = getSiteIdList(siteId);
  125. Date date = new Date();
  126. //当日开始时间
  127. Date firstDayOfDate = DateUtils.getDayStartTime(date);
  128. //当月开始时间
  129. Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date);
  130. //当年开始时间
  131. Date firstDayOfYear = DateUtils.getBeginDayOfYear(date);
  132. HadCountVO hadCountVO = new HadCountVO();
  133. //今日
  134. List<HadDataLog> byToday = getByToday(firstDayOfDate, date);
  135. hadCountVO.setDayCount(getEpp(byToday,siteIdList,null,null));
  136. //本月
  137. List<HadDataLog> byToMonth = getByMonth(firstDayOfMonth, date);
  138. hadCountVO.setMonthCount(getEpp(byToMonth,siteIdList,null,null));
  139. //本年
  140. List<HadDataLog> byToYear = getByMonth(firstDayOfYear, date);
  141. hadCountVO.setYearCount(getEpp(byToYear,siteIdList,null,null));
  142. //昨天
  143. List<HadDataLog> lastDay = getByToday(DateUtils.addDays(firstDayOfDate, -1), DateUtils.addDays(date, -1));
  144. Double lastDayEpp = getEpp(lastDay, siteIdList, null,null);
  145. hadCountVO.setLastDayCount(lastDayEpp);
  146. //上月
  147. List<HadDataLog> lastMonth = getByMonth(DateUtils.addMonths(firstDayOfMonth, -1), DateUtils.addMonths(date, -1));
  148. Double lastMonthEpp = getEpp(lastMonth, siteIdList, null,null);
  149. hadCountVO.setLastMonthCount(lastMonthEpp);
  150. //去年
  151. List<HadDataLog> lastYear = getByMonth(DateUtils.addYears(firstDayOfYear, -1), DateUtils.addYears(date, -1));
  152. Double lastYearEpp = getEpp(lastYear, siteIdList, null, null);
  153. hadCountVO.setLastDayCount(lastYearEpp);
  154. hadCountVO.setDayRadio(Optional.ofNullable(hadCountVO.getDayCount())
  155. .filter(dayCount -> 0.00 != dayCount)
  156. .map(dayCount -> Arith.div(hadCountVO.getLastDayCount(), dayCount))
  157. .orElse(0.00));
  158. hadCountVO.setMonthRadio(Optional.ofNullable(hadCountVO.getMonthCount())
  159. .filter(dayCount -> 0.00 != dayCount)
  160. .map(dayCount -> Arith.div(hadCountVO.getLastMonthCount(), dayCount))
  161. .orElse(0.00));
  162. hadCountVO.setYearRadio(Optional.ofNullable(hadCountVO.getYearCount())
  163. .filter(dayCount -> 0.00 != dayCount)
  164. .map(dayCount -> Arith.div(hadCountVO.getLastYearCount(), dayCount))
  165. .orElse(0.00));
  166. return hadCountVO;
  167. }
  168. @Override
  169. public TimeShareVO getTimeShare(Integer siteId, Date date) {
  170. TimeShareVO timeShareVO = new TimeShareVO();
  171. List<Integer> idList = new ArrayList<>();
  172. idList.add(siteId);
  173. List<HadDataLog> byToday = getByToday(date, DateUtils.getDayEndTime(date));
  174. //尖峰时间
  175. Date nine = DateUtils.setMinutes(DateUtils.setHours(date, 9), 30);
  176. Date eleven = DateUtils.setMinutes(DateUtils.setHours(date, 11), 30);
  177. Date nineTeen = DateUtils.setHours(date, 19);
  178. Date twoOne = DateUtils.setHours(date, 21);
  179. //高峰时间
  180. Date eight = DateUtils.setMinutes(DateUtils.setHours(date, 8), 30);
  181. Date ten = DateUtils.setMinutes(DateUtils.setHours(date, 10), 30);
  182. Date oneEight = DateUtils.setHours(date, 18);
  183. Date oneNine = DateUtils.setHours(date, 19);
  184. Date twoThree = DateUtils.setHours(date, 23);
  185. //低谷
  186. Date seven = DateUtils.setHours(date, 7);
  187. //平谷
  188. Date oneTwo = DateUtils.setHours(date, 12);
  189. Date oneSeven = DateUtils.setHours(date, 17);
  190. //尖
  191. Double nToe = getEpp(byToday, idList, nine, eleven);
  192. Double nTot = getEpp(byToday, idList, nineTeen, twoOne);
  193. timeShareVO.setNeed(Arith.sub(nToe,nTot));
  194. //高峰
  195. Double eTot = getEpp(byToday, idList, eight, ten);
  196. Double hnTot = getEpp(byToday, idList, oneEight, oneNine);
  197. Double tTot = getEpp(byToday, idList, twoOne, twoThree);
  198. timeShareVO.setPeak(Arith.sub(Arith.sub(eTot,hnTot),tTot));
  199. //低谷
  200. Double tTos = getEpp(byToday, idList, twoThree, seven);
  201. timeShareVO.setGrain(tTos);
  202. //平谷
  203. Double oToo = getEpp(byToday, idList, oneTwo, oneSeven);
  204. timeShareVO.setFlat(oToo);
  205. return timeShareVO;
  206. }
  207. @Override
  208. public List<CommonIcoVO> getDemandIco(Integer siteId) {
  209. List<Integer> idList = new ArrayList<>();
  210. idList.add(siteId);
  211. Date date = new Date();
  212. List<HadDataLog> hadDataLogList = getByToday(date, DateUtils.getLastDayOfMonth(date));
  213. List<Object> maxList = new ArrayList<>();
  214. List<Object> minList = new ArrayList<>();
  215. List<Object> avgList = new ArrayList<>();
  216. List<Object> dateList = new ArrayList<>();
  217. for (int i = 1; i <= Integer.parseInt(DateUtils.getDay(date)); i++) {
  218. List<HadCrVO> hadCrVoS = new ArrayList<>();
  219. AtomicReference<Double> count = new AtomicReference<>(0.00);
  220. AtomicReference<Integer> size = new AtomicReference<>(0);
  221. Date setDays = DateUtils.setDays(date, i);
  222. Date dayStartTime = DateUtils.getDayStartTime(setDays);
  223. Date dayEndTime = DateUtils.getDayEndTime(setDays);
  224. //筛选出日期范围数据
  225. List<HadDataLog> hadDataLogs = hadDataLogList.stream()
  226. .filter(hadDataLog -> hadDataLog.getDataTime().after(dayStartTime) && hadDataLog.getDataTime().after(dayEndTime))
  227. .collect(Collectors.toList());
  228. hadDataLogs.forEach(hadDataLog -> {
  229. List<HadDataLogVO> hadDateList = getHadDateList(hadDataLog, idList, null, null);
  230. count.updateAndGet(v -> v + hadDateList.stream().mapToDouble(HadDataLogVO::getDemand).sum());
  231. size.updateAndGet(v -> v + hadDateList.size());
  232. Map<Integer, DoubleSummaryStatistics> collect = hadDateList.stream()
  233. .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getDemand)));
  234. checkData(collect,hadCrVoS);
  235. });
  236. maxList.add(hadCrVoS.stream().max(Comparator.comparingDouble(HadCrVO::getHadMax)).map(HadCrVO::getHadMax).orElse(0.00));
  237. maxList.add(hadCrVoS.stream().min(Comparator.comparingDouble(HadCrVO::getHadMin)).map(HadCrVO::getHadMin).orElse(0.00));
  238. avgList.add(Arith.div(count.get(),size.get()));
  239. dateList.add(DateUtils.getDay(setDays));
  240. }
  241. List<CommonIcoVO> list = new ArrayList<>();
  242. list.add(CommonIcoVO.builder().name("MAX").list(maxList).listDate(dateList).build());
  243. list.add(CommonIcoVO.builder().name("MIN").list(minList).list(dateList).build());
  244. list.add(CommonIcoVO.builder().name("AVG").list(avgList).listDate(dateList).build());
  245. return list;
  246. }
  247. @Override
  248. public List<CommonIcoVO> getElectricIco(Integer siteId, Date date) {
  249. Integer userId = SessionLocal.getUserId();
  250. List<Integer> siteIdList = new ArrayList<>();
  251. siteIdList.add(siteId);
  252. List<Object> iaList = new ArrayList<>();
  253. iaList.add(0.00);
  254. List<Object> ibList = new ArrayList<>();
  255. ibList.add(0.00);
  256. List<Object> icList = new ArrayList<>();
  257. icList.add(0.00);
  258. List<Object> uaList = new ArrayList<>();
  259. uaList.add(0.00);
  260. List<Object> ubList = new ArrayList<>();
  261. ubList.add(0.00);
  262. List<Object> ucList = new ArrayList<>();
  263. ucList.add(0.00);
  264. List<Object> dateList = new ArrayList<>();
  265. dateList.add("00:00:00");
  266. List<HadDataLog> hadDataLogList = getByToday(date, DateUtils.getDayStartTime(date));
  267. for (int i = 2; i < 24 ; i+=2) {
  268. //结束时间
  269. Date endTime = DateUtils.addHours(date, i);
  270. Date finalDate = date;
  271. List<HadDataLogVO> maxHadList = new ArrayList<>();
  272. Comparator<HadDataLogVO> comparator = Comparator.comparing(HadDataLogVO::getDataTime);
  273. hadDataLogList.forEach(hadDataLog -> {
  274. List<HadDataLogVO> hadDateList = getHadDateList(hadDataLog, siteIdList, finalDate, endTime);
  275. hadDateList.stream().max(comparator).ifPresent(maxHadList::add);
  276. });
  277. Optional<HadDataLogVO> max = maxHadList.stream().max(comparator);
  278. iaList.add(max.map(HadDataLogVO::getIa).orElse(0.00));
  279. ibList.add(max.map(HadDataLogVO::getIb).orElse(0.00));
  280. icList.add(max.map(HadDataLogVO::getIc).orElse(0.00));
  281. uaList.add(max.map(HadDataLogVO::getUa).orElse(0.00));
  282. ubList.add(max.map(HadDataLogVO::getUa).orElse(0.00));
  283. ucList.add(max.map(HadDataLogVO::getUa).orElse(0.00));
  284. date = endTime;
  285. dateList.add(DateUtils.getTime(endTime));
  286. }
  287. List<CommonIcoVO> list = new ArrayList<>();
  288. list.add(CommonIcoVO.builder().name("IA").list(iaList).listDate(dateList).build());
  289. list.add(CommonIcoVO.builder().name("IB").list(ibList).listDate(dateList).build());
  290. list.add(CommonIcoVO.builder().name("IC").list(icList).listDate(dateList).build());
  291. list.add(CommonIcoVO.builder().name("UA").list(uaList).listDate(dateList).build());
  292. list.add(CommonIcoVO.builder().name("UB").list(ubList).listDate(dateList).build());
  293. list.add(CommonIcoVO.builder().name("UC").list(ucList).listDate(dateList).build());
  294. return list;
  295. }
  296. public List<Integer> getSiteIdList(Integer siteId){
  297. Integer userId = SessionLocal.getUserId();
  298. List<Integer> list = new ArrayList<>();
  299. if (null == siteId){
  300. list = siteMapper.idList(userId, null);
  301. }else {
  302. list.add(siteId);
  303. }
  304. return list;
  305. }
  306. /**
  307. * 求多个站点最大值减最小值的结果
  308. * @param list
  309. * @return
  310. */
  311. public Double getSubCount(List<HadCrVO> list){
  312. double count = 0.00;
  313. for (HadCrVO hadCrVO:list) {
  314. count+=Arith.add(count,Arith.sub(hadCrVO.getHadMax(),hadCrVO.getHadMax()));
  315. }
  316. return count;
  317. }
  318. /**
  319. * 根据统计表的一条记录获取真实数据
  320. * @param hadDataLog
  321. * @return
  322. */
  323. public List<HadDataLogVO> getHadDateList(HadDataLog hadDataLog,List<Integer> idList,Date startTime,Date endTime){
  324. List<HadDataLogVO> hadDataLogVos = new ArrayList<>();
  325. List<Integer> siteIdList = JsonUtils.fromJson(hadDataLog.getSiteIdList(), new TypeReference<List<Integer>>(){});
  326. List<Integer> origin = new ArrayList<>(idList);
  327. origin.retainAll(siteIdList);
  328. // 有交集
  329. if(CollectionUtils.isNotEmpty(origin)){
  330. hadDataLogVos = JsonUtils.fromJson(hadDataLog.getHadData(), new TypeReference<List<HadDataLogVO>>(){});
  331. hadDataLogVos = hadDataLogVos.stream()
  332. .filter(hadDataLogVO -> idList.contains(hadDataLogVO.getSiteId()))
  333. .filter(hadDataLogVO -> Optional.ofNullable(startTime).map(sTime -> hadDataLogVO.getDataTime().after(sTime)).orElse(true))
  334. .filter(hadDataLogVO -> Optional.ofNullable(endTime).map(eTime -> hadDataLogVO.getDataTime().before(eTime)).orElse(true))
  335. .collect(Collectors.toList());
  336. }
  337. return hadDataLogVos;
  338. }
  339. /**
  340. * 便利寻找最大值/最小值
  341. * @param collect
  342. * @param siteMaxVOList
  343. */
  344. public void checkData(Map<Integer, DoubleSummaryStatistics> collect,List<HadCrVO> siteMaxVOList){
  345. for (Integer siteId:collect.keySet()) {
  346. if (CollectionUtils.isEmpty(siteMaxVOList)){
  347. HadCrVO hadCrVO = new HadCrVO();
  348. hadCrVO.setSiteId(siteId);
  349. hadCrVO.setHadMax(collect.get(siteId).getMax());
  350. hadCrVO.setHadMin(collect.get(siteId).getMin());
  351. siteMaxVOList.add(hadCrVO);
  352. }else {
  353. siteMaxVOList.stream()
  354. .filter(siteMaxVO -> siteMaxVO.getSiteId().equals(siteId))
  355. .findFirst()
  356. .map(siteMaxVO -> {
  357. if (siteMaxVO.getHadMax() < collect.get(siteId).getMax()){
  358. siteMaxVO.setHadMax(collect.get(siteId).getMax());
  359. }
  360. if (siteMaxVO.getHadMin() < collect.get(siteId).getMin()){
  361. siteMaxVO.setHadMin(collect.get(siteId).getMin());
  362. }
  363. return Optional.empty();
  364. }).orElseGet(() -> {
  365. HadCrVO hadCrVO = new HadCrVO();
  366. hadCrVO.setSiteId(siteId);
  367. hadCrVO.setHadMax(collect.get(siteId).getMax());
  368. hadCrVO.setHadMin(collect.get(siteId).getMin());
  369. siteMaxVOList.add(hadCrVO);
  370. return Optional.empty();
  371. });
  372. }
  373. }
  374. }
  375. }