HtAnalogDataServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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.persistence.mapper.HtAnalogDataMapper;
  8. import com.bizmatics.persistence.mapper.SiteMapper;
  9. import com.bizmatics.service.HadDataLogService;
  10. import com.bizmatics.service.HtAnalogDataService;
  11. import com.bizmatics.common.mvc.base.AbstractCrudService;
  12. import com.bizmatics.service.util.Arith;
  13. import com.bizmatics.service.util.SessionLocal;
  14. import com.bizmatics.service.vo.*;
  15. import com.fasterxml.jackson.core.type.TypeReference;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import java.util.*;
  19. import java.util.concurrent.atomic.AtomicReference;
  20. import java.util.stream.Collectors;
  21. /**
  22. * <p>
  23. * 服务实现类
  24. * </p>
  25. *
  26. * @author ya
  27. * @since 2021-07-07
  28. */
  29. @Service
  30. public class HtAnalogDataServiceImpl extends AbstractCrudService<HtAnalogDataMapper, HtAnalogData> implements HtAnalogDataService {
  31. @Autowired
  32. private HtAnalogDataMapper htAnalogDataMapper;
  33. @Autowired
  34. private SiteMapper siteMapper;
  35. @Autowired
  36. private HadDataLogService hadDataLogService;
  37. @Override
  38. public HadCountVO selectCount() {
  39. Integer userId = SessionLocal.getUserId();
  40. Date date = new Date();
  41. HadCountVO hadCountVO = new HadCountVO();
  42. List<Integer> idList = siteMapper.idList(userId, null);
  43. //日
  44. List<HadDataLog> todayList = hadDataLogService.list(DateUtils.getDayStartTime(date),date);
  45. for (HadCrVO hadCr:getEppData(idList, todayList)) {
  46. hadCountVO.setDayCount(Arith.add(hadCountVO.getDayCount(),Arith.sub(hadCr.getHadMax(),hadCr.getHadMax())));
  47. }
  48. //月
  49. Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date);
  50. hadCountVO.setMonthCount(getMonthAndYearDate(firstDayOfMonth, date, idList));
  51. //年
  52. Date beginDayOfYear = DateUtils.getBeginDayOfYear(date);
  53. hadCountVO.setYearCount(getMonthAndYearDate(beginDayOfYear, date, idList));
  54. return hadCountVO;
  55. }
  56. public Double getMonthAndYearDate(Date startTime,Date endTime,List<Integer> idList){
  57. AtomicReference<Double> count = new AtomicReference<>(0.00);
  58. List<HadDataLog> startList = hadDataLogService.list(startTime,DateUtils.getDayEndTime(startTime));
  59. List<HadDataLog> endList = hadDataLogService.list(DateUtils.getDayStartTime(endTime),endTime);
  60. List<HadCrVO> startEppData = getEppData(idList, startList);
  61. List<HadCrVO> endEppData = getEppData(idList, endList);
  62. for (HadCrVO hadCrVO:startEppData) {
  63. endEppData.stream()
  64. .filter(hadCr -> hadCr.getSiteId().equals(hadCrVO.getSiteId()))
  65. .findAny()
  66. .ifPresent(had ->{
  67. count.updateAndGet(v -> v + had.getHadMax() - hadCrVO.getHadMin());
  68. });
  69. }
  70. return count.get();
  71. }
  72. @Override
  73. public List<CommonIcoVO> selectTrendByDate(Date date,Integer siteId) {
  74. Integer userId = SessionLocal.getUserId();
  75. List<CommonIcoVO> list = new ArrayList<>();
  76. list.add(getByDate("today", userId, siteId, date));
  77. list.add(getByDate("yesterday", userId, siteId, DateUtils.addDays(date,-1)));
  78. return list;
  79. }
  80. @Override
  81. public HadCountVO getCountBySite(Integer siteId) {
  82. Date date = new Date();
  83. Integer userId = SessionLocal.getUserId();
  84. //当日开始时间
  85. Date firstDayOfDate = DateUtils.getDayStartTime(date);
  86. //当月开始时间
  87. Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date);
  88. //当年开始时间
  89. Date firstDayOfYear = DateUtils.getBeginDayOfYear(date);
  90. HadCountVO hadCountVO = new HadCountVO();
  91. hadCountVO.setDayCount(getElectricity(userId,siteId,firstDayOfDate,date));
  92. hadCountVO.setMonthCount(getElectricity(userId,siteId,firstDayOfMonth,date));
  93. hadCountVO.setYearCount(getElectricity(userId,siteId,firstDayOfYear,date));
  94. hadCountVO.setLastDayCount(getElectricity(userId,siteId,DateUtils.addDays(firstDayOfDate, -1),DateUtils.addDays(date, -1)));
  95. hadCountVO.setLastMonthCount(getElectricity(userId,siteId,DateUtils.addMonths(firstDayOfMonth, -1),DateUtils.addMonths(date, -1)));
  96. hadCountVO.setLastYearCount(getElectricity(userId,siteId,DateUtils.addYears(firstDayOfYear, -1),DateUtils.addYears(date, -1)));
  97. hadCountVO.setDayRadio(Optional.ofNullable(hadCountVO.getDayCount())
  98. .filter(dayCount -> 0.00 != dayCount)
  99. .map(dayCount -> Arith.div(hadCountVO.getLastDayCount(), dayCount))
  100. .orElse(0.00));
  101. hadCountVO.setMonthRadio(Optional.ofNullable(hadCountVO.getMonthCount())
  102. .filter(dayCount -> 0.00 != dayCount)
  103. .map(dayCount -> Arith.div(hadCountVO.getLastMonthCount(), dayCount))
  104. .orElse(0.00));
  105. hadCountVO.setYearRadio(Optional.ofNullable(hadCountVO.getYearCount())
  106. .filter(dayCount -> 0.00 != dayCount)
  107. .map(dayCount -> Arith.div(hadCountVO.getLastYearCount(), dayCount))
  108. .orElse(0.00));
  109. return hadCountVO;
  110. }
  111. @Override
  112. public TimeShareVO getTimeShare(Integer siteId, Date date) {
  113. Integer userId = SessionLocal.getUserId();
  114. TimeShareVO timeShareVO = new TimeShareVO();
  115. timeShareVO.setNeed(getElectricity(userId, siteId, DateUtils.setHours(date, 9), DateUtils.setHours(date, 12)));
  116. //高峰
  117. Double peakStart = getElectricity(userId, siteId, DateUtils.setHours(date, 8), DateUtils.setHours(date, 12));
  118. Double peakEnd = getElectricity(userId, siteId, DateUtils.setHours(date, 16), DateUtils.setHours(date, 20));
  119. timeShareVO.setPeak(peakStart+peakEnd);
  120. //平
  121. Double flatStart = getElectricity(userId, siteId, DateUtils.setHours(date, 6), DateUtils.setHours(date, 8));
  122. Double flatCentre = getElectricity(userId, siteId, DateUtils.setHours(date, 12), DateUtils.setHours(date, 16));
  123. Double flatEnd = getElectricity(userId, siteId, DateUtils.setHours(date, 20), DateUtils.setHours(date, 22));
  124. timeShareVO.setFlat(flatStart+flatCentre+flatEnd);
  125. timeShareVO.setGrain(getElectricity(userId, siteId, DateUtils.setHours(date, 22), DateUtils.setHours(DateUtils.addDays(date, 1), 6)));
  126. return timeShareVO;
  127. }
  128. @Override
  129. public List<CommonIcoVO> getDemandIco(Integer siteId) {
  130. Date date = DateUtils.getLastDayOfMonth(new Date());
  131. List<Object> maxList = new ArrayList<>();
  132. List<Object> minList = new ArrayList<>();
  133. List<Object> avgList = new ArrayList<>();
  134. List<Object> dateList = new ArrayList<>();
  135. for (int i = 1; i <= Integer.parseInt(DateUtils.getDay(date)); i++) {
  136. Date setDays = DateUtils.setDays(date, i);
  137. Date dayStartTime = DateUtils.getDayStartTime(setDays);
  138. Date dayEndTime = DateUtils.getDayEndTime(setDays);
  139. Map<String, Double> map = baseMapper.selectMaxAndMinAndAvg(siteId, dayStartTime,dayEndTime);
  140. maxList.add(Optional.ofNullable(map).map(max -> max.get("demandMax")).orElse(0.00));
  141. minList.add(Optional.ofNullable(map).map(max -> max.get("demandMin")).orElse(0.00));
  142. avgList.add(Optional.ofNullable(map).map(max -> max.get("demandAvd")).orElse(0.00));
  143. dateList.add(DateUtils.getDay(setDays));
  144. }
  145. List<CommonIcoVO> list = new ArrayList<>();
  146. list.add(CommonIcoVO.builder().name("MAX").list(maxList).listDate(dateList).build());
  147. list.add(CommonIcoVO.builder().name("MIN").list(minList).list(dateList).build());
  148. list.add(CommonIcoVO.builder().name("AVG").list(avgList).listDate(dateList).build());
  149. return list;
  150. }
  151. @Override
  152. public List<CommonIcoVO> getElectricIco(Integer siteId, Date date) {
  153. Integer userId = SessionLocal.getUserId();
  154. List<Object> iaList = new ArrayList<>();
  155. iaList.add(0.00);
  156. List<Object> ibList = new ArrayList<>();
  157. ibList.add(0.00);
  158. List<Object> icList = new ArrayList<>();
  159. icList.add(0.00);
  160. List<Object> uaList = new ArrayList<>();
  161. uaList.add(0.00);
  162. List<Object> ubList = new ArrayList<>();
  163. ubList.add(0.00);
  164. List<Object> ucList = new ArrayList<>();
  165. ucList.add(0.00);
  166. List<Object> dateList = new ArrayList<>();
  167. dateList.add("00:00:00");
  168. for (int i = 2; i < 24 ; i+=2) {
  169. //结束时间
  170. Date endTime = DateUtils.addHours(date, i);
  171. HtAnalogData htAnalogData = htAnalogDataMapper.selectByEndTime(date,endTime, siteId, userId);
  172. iaList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getIa()).orElse(0.00));
  173. ibList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getIb()).orElse(0.00));
  174. icList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getIc()).orElse(0.00));
  175. uaList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getUa()).orElse(0.00));
  176. ubList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getUb()).orElse(0.00));
  177. ucList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getUc()).orElse(0.00));
  178. date = endTime;
  179. dateList.add(DateUtils.getTime(endTime));
  180. }
  181. List<CommonIcoVO> list = new ArrayList<>();
  182. list.add(CommonIcoVO.builder().name("IA").list(iaList).listDate(dateList).build());
  183. list.add(CommonIcoVO.builder().name("IB").list(ibList).listDate(dateList).build());
  184. list.add(CommonIcoVO.builder().name("IC").list(icList).listDate(dateList).build());
  185. list.add(CommonIcoVO.builder().name("UA").list(uaList).listDate(dateList).build());
  186. list.add(CommonIcoVO.builder().name("UB").list(ubList).listDate(dateList).build());
  187. list.add(CommonIcoVO.builder().name("UC").list(ucList).listDate(dateList).build());
  188. return list;
  189. }
  190. public CommonIcoVO getByDate(String name,Integer userId,Integer siteId,Date date){
  191. List<Object> objects = new ArrayList<>();
  192. objects.add(0.0);
  193. List<Object> dates = new ArrayList<>();
  194. dates.add("00:00:00");
  195. for (int i = 2; i < 24 ; i+=2) {
  196. //结束时间
  197. Date endTime = DateUtils.addHours(date, i);
  198. objects.add(getElectricity(userId,siteId,date,endTime));
  199. date = endTime;
  200. dates.add(DateUtils.getTime(date));
  201. }
  202. return CommonIcoVO.builder().name(name).list(objects).listDate(dates).build();
  203. }
  204. /**
  205. * 获取用电量
  206. * @param userId
  207. * @param siteId
  208. * @param startTime
  209. * @param endTime
  210. * @return
  211. */
  212. public Double getElectricity(Integer userId,Integer siteId,Date startTime,Date endTime){
  213. HtAnalogData ascHad = htAnalogDataMapper.selectByStartTime(startTime,endTime, siteId, userId);
  214. HtAnalogData descHad = htAnalogDataMapper.selectByEndTime(endTime,endTime, siteId, userId);
  215. Double ascHadEpp = Optional.ofNullable(ascHad).map(HtAnalogData::getEpp).orElse(0.00);
  216. Double descHadEpp = Optional.ofNullable(descHad).map(HtAnalogData::getEpp).orElse(0.00);
  217. return Arith.sub(descHadEpp,ascHadEpp);
  218. }
  219. /**
  220. * 获取
  221. * @param idList
  222. * @param list
  223. * @return
  224. */
  225. public HadCrVO getDemandData(List<Integer> idList, List<HadDataLog> list){
  226. HadCrVO hadCrVO = new HadCrVO();
  227. hadCrVO.setCount(0);
  228. hadCrVO.setSumDemand(0.00);
  229. List<HadCrVO> hadCrVOS = new ArrayList<>();
  230. for (HadDataLog hadDataLog:list) {
  231. List<Integer> siteIdList = JsonUtils.fromJson(hadDataLog.getSiteIdList(), new TypeReference<List<Integer>>(){});
  232. List<Integer> origin = new ArrayList<>(idList);
  233. origin.retainAll(siteIdList);
  234. // 有交集
  235. if(CollectionUtils.isNotEmpty(origin)){
  236. List<HadDataLogVO> hadDataLogVos = JsonUtils.fromJson(hadDataLog.getHadData(), new TypeReference<List<HadDataLogVO>>(){});
  237. hadCrVO.setCount(hadCrVO.getCount()+origin.size());
  238. hadCrVO.setSumDemand(hadCrVO.getSumDemand()+
  239. hadDataLogVos.stream().filter(hadDataLogVO -> origin.contains(hadDataLogVO.getSiteId())).mapToDouble(HadDataLogVO::getDemand).sum());
  240. //分组求每个站点的最大值和最小值
  241. Map<Integer, DoubleSummaryStatistics> collect = hadDataLogVos.stream()
  242. .filter(hadDataLogVO -> idList.contains(hadDataLogVO.getSiteId()))
  243. .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getDemand)));
  244. checkData(collect,hadCrVOS);
  245. }
  246. }
  247. for (HadCrVO hadCr:hadCrVOS) {
  248. hadCrVO.setHadDif(Arith.add(hadCrVO.getHadDif(),Arith.sub(hadCr.getHadMax(),hadCr.getHadMax())));
  249. }
  250. hadCrVO.setHadAvg(Arith.div(hadCrVO.getSumDemand(),hadCrVO.getCount()));
  251. hadCrVO.setList(hadCrVOS);
  252. return hadCrVO;
  253. }
  254. /**
  255. * 获取epp数据
  256. * @param idList
  257. * @param list
  258. * @return
  259. */
  260. public List<HadCrVO> getEppData(List<Integer> idList,List<HadDataLog> list){
  261. List<HadCrVO> hadCrVoArrayList = new ArrayList<>();
  262. for (HadDataLog hadDataLog:list) {
  263. List<Integer> siteIdList = JsonUtils.fromJson(hadDataLog.getSiteIdList(), new TypeReference<List<Integer>>(){});
  264. List<Integer> origin = new ArrayList<>(idList);
  265. origin.retainAll(siteIdList);
  266. // 有交集
  267. if(CollectionUtils.isNotEmpty(origin)){
  268. List<HadDataLogVO> hadDataLogVos = JsonUtils.fromJson(hadDataLog.getHadData(), new TypeReference<List<HadDataLogVO>>(){});
  269. //分组求每个站点的最大值和最小值
  270. Map<Integer, DoubleSummaryStatistics> collect = hadDataLogVos.stream()
  271. .filter(hadDataLogVO -> idList.contains(hadDataLogVO.getSiteId()))
  272. .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getEpp)));
  273. checkData(collect,hadCrVoArrayList);
  274. }
  275. }
  276. return hadCrVoArrayList;
  277. }
  278. /**
  279. * 便利寻找最大值/最小值
  280. * @param collect
  281. * @param siteMaxVOList
  282. */
  283. public void checkData(Map<Integer, DoubleSummaryStatistics> collect,List<HadCrVO> siteMaxVOList){
  284. for (Integer siteId:collect.keySet()) {
  285. if (CollectionUtils.isEmpty(siteMaxVOList)){
  286. HadCrVO hadCrVO = new HadCrVO();
  287. hadCrVO.setSiteId(siteId);
  288. hadCrVO.setHadMax(collect.get(siteId).getMax());
  289. hadCrVO.setHadMin(collect.get(siteId).getMin());
  290. siteMaxVOList.add(hadCrVO);
  291. }else {
  292. siteMaxVOList.stream()
  293. .filter(siteMaxVO -> siteMaxVO.getSiteId().equals(siteId))
  294. .findFirst()
  295. .map(siteMaxVO -> {
  296. if (siteMaxVO.getHadMax() < collect.get(siteId).getMax()){
  297. siteMaxVO.setHadMax(collect.get(siteId).getMax());
  298. }
  299. if (siteMaxVO.getHadMin() < collect.get(siteId).getMin()){
  300. siteMaxVO.setHadMin(collect.get(siteId).getMin());
  301. }
  302. return Optional.empty();
  303. }).orElseGet(() -> {
  304. HadCrVO hadCrVO = new HadCrVO();
  305. hadCrVO.setSiteId(siteId);
  306. hadCrVO.setHadMax(collect.get(siteId).getMax());
  307. hadCrVO.setHadMin(collect.get(siteId).getMin());
  308. siteMaxVOList.add(hadCrVO);
  309. return Optional.empty();
  310. });
  311. }
  312. }
  313. }
  314. }