package com.bizmatics.service.impl; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.bizmatics.common.core.util.DateUtils; import com.bizmatics.common.spring.util.JsonUtils; import com.bizmatics.model.HadDataLog; import com.bizmatics.model.HtAnalogData; import com.bizmatics.persistence.mapper.HtAnalogDataMapper; import com.bizmatics.persistence.mapper.SiteMapper; import com.bizmatics.service.HadDataLogService; import com.bizmatics.service.HtAnalogDataService; import com.bizmatics.common.mvc.base.AbstractCrudService; import com.bizmatics.service.util.Arith; import com.bizmatics.service.util.SessionLocal; import com.bizmatics.service.vo.*; import com.fasterxml.jackson.core.type.TypeReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author ya * @since 2021-07-07 */ @Service public class HtAnalogDataServiceImpl extends AbstractCrudService implements HtAnalogDataService { @Autowired private HtAnalogDataMapper htAnalogDataMapper; @Autowired private SiteMapper siteMapper; @Autowired private HadDataLogService hadDataLogService; @Override public HadCountVO selectCount() { Integer userId = SessionLocal.getUserId(); Date date = new Date(); HadCountVO hadCountVO = new HadCountVO(); List idList = siteMapper.idList(userId, null); //日 List todayList = hadDataLogService.list(DateUtils.getDayStartTime(date),date); for (HadCrVO hadCr:getEppData(idList, todayList)) { hadCountVO.setDayCount(Arith.add(hadCountVO.getDayCount(),Arith.sub(hadCr.getHadMax(),hadCr.getHadMax()))); } //月 Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date); hadCountVO.setMonthCount(getMonthAndYearDate(firstDayOfMonth, date, idList)); //年 Date beginDayOfYear = DateUtils.getBeginDayOfYear(date); hadCountVO.setYearCount(getMonthAndYearDate(beginDayOfYear, date, idList)); return hadCountVO; } public Double getMonthAndYearDate(Date startTime,Date endTime,List idList){ AtomicReference count = new AtomicReference<>(0.00); List startList = hadDataLogService.list(startTime,DateUtils.getDayEndTime(startTime)); List endList = hadDataLogService.list(DateUtils.getDayStartTime(endTime),endTime); List startEppData = getEppData(idList, startList); List endEppData = getEppData(idList, endList); for (HadCrVO hadCrVO:startEppData) { endEppData.stream() .filter(hadCr -> hadCr.getSiteId().equals(hadCrVO.getSiteId())) .findAny() .ifPresent(had ->{ count.updateAndGet(v -> v + had.getHadMax() - hadCrVO.getHadMin()); }); } return count.get(); } @Override public List selectTrendByDate(Date date,Integer siteId) { Integer userId = SessionLocal.getUserId(); List list = new ArrayList<>(); list.add(getByDate("today", userId, siteId, date)); list.add(getByDate("yesterday", userId, siteId, DateUtils.addDays(date,-1))); return list; } @Override public HadCountVO getCountBySite(Integer siteId) { Date date = new Date(); Integer userId = SessionLocal.getUserId(); //当日开始时间 Date firstDayOfDate = DateUtils.getDayStartTime(date); //当月开始时间 Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date); //当年开始时间 Date firstDayOfYear = DateUtils.getBeginDayOfYear(date); HadCountVO hadCountVO = new HadCountVO(); hadCountVO.setDayCount(getElectricity(userId,siteId,firstDayOfDate,date)); hadCountVO.setMonthCount(getElectricity(userId,siteId,firstDayOfMonth,date)); hadCountVO.setYearCount(getElectricity(userId,siteId,firstDayOfYear,date)); hadCountVO.setLastDayCount(getElectricity(userId,siteId,DateUtils.addDays(firstDayOfDate, -1),DateUtils.addDays(date, -1))); hadCountVO.setLastMonthCount(getElectricity(userId,siteId,DateUtils.addMonths(firstDayOfMonth, -1),DateUtils.addMonths(date, -1))); hadCountVO.setLastYearCount(getElectricity(userId,siteId,DateUtils.addYears(firstDayOfYear, -1),DateUtils.addYears(date, -1))); hadCountVO.setDayRadio(Optional.ofNullable(hadCountVO.getDayCount()) .filter(dayCount -> 0.00 != dayCount) .map(dayCount -> Arith.div(hadCountVO.getLastDayCount(), dayCount)) .orElse(0.00)); hadCountVO.setMonthRadio(Optional.ofNullable(hadCountVO.getMonthCount()) .filter(dayCount -> 0.00 != dayCount) .map(dayCount -> Arith.div(hadCountVO.getLastMonthCount(), dayCount)) .orElse(0.00)); hadCountVO.setYearRadio(Optional.ofNullable(hadCountVO.getYearCount()) .filter(dayCount -> 0.00 != dayCount) .map(dayCount -> Arith.div(hadCountVO.getLastYearCount(), dayCount)) .orElse(0.00)); return hadCountVO; } @Override public TimeShareVO getTimeShare(Integer siteId, Date date) { Integer userId = SessionLocal.getUserId(); TimeShareVO timeShareVO = new TimeShareVO(); timeShareVO.setNeed(getElectricity(userId, siteId, DateUtils.setHours(date, 9), DateUtils.setHours(date, 12))); //高峰 Double peakStart = getElectricity(userId, siteId, DateUtils.setHours(date, 8), DateUtils.setHours(date, 12)); Double peakEnd = getElectricity(userId, siteId, DateUtils.setHours(date, 16), DateUtils.setHours(date, 20)); timeShareVO.setPeak(peakStart+peakEnd); //平 Double flatStart = getElectricity(userId, siteId, DateUtils.setHours(date, 6), DateUtils.setHours(date, 8)); Double flatCentre = getElectricity(userId, siteId, DateUtils.setHours(date, 12), DateUtils.setHours(date, 16)); Double flatEnd = getElectricity(userId, siteId, DateUtils.setHours(date, 20), DateUtils.setHours(date, 22)); timeShareVO.setFlat(flatStart+flatCentre+flatEnd); timeShareVO.setGrain(getElectricity(userId, siteId, DateUtils.setHours(date, 22), DateUtils.setHours(DateUtils.addDays(date, 1), 6))); return timeShareVO; } @Override public List getDemandIco(Integer siteId) { Date date = DateUtils.getLastDayOfMonth(new Date()); List maxList = new ArrayList<>(); List minList = new ArrayList<>(); List avgList = new ArrayList<>(); List dateList = new ArrayList<>(); for (int i = 1; i <= Integer.parseInt(DateUtils.getDay(date)); i++) { Date setDays = DateUtils.setDays(date, i); Date dayStartTime = DateUtils.getDayStartTime(setDays); Date dayEndTime = DateUtils.getDayEndTime(setDays); Map map = baseMapper.selectMaxAndMinAndAvg(siteId, dayStartTime,dayEndTime); maxList.add(Optional.ofNullable(map).map(max -> max.get("demandMax")).orElse(0.00)); minList.add(Optional.ofNullable(map).map(max -> max.get("demandMin")).orElse(0.00)); avgList.add(Optional.ofNullable(map).map(max -> max.get("demandAvd")).orElse(0.00)); dateList.add(DateUtils.getDay(setDays)); } List list = new ArrayList<>(); list.add(CommonIcoVO.builder().name("MAX").list(maxList).listDate(dateList).build()); list.add(CommonIcoVO.builder().name("MIN").list(minList).list(dateList).build()); list.add(CommonIcoVO.builder().name("AVG").list(avgList).listDate(dateList).build()); return list; } @Override public List getElectricIco(Integer siteId, Date date) { Integer userId = SessionLocal.getUserId(); List iaList = new ArrayList<>(); iaList.add(0.00); List ibList = new ArrayList<>(); ibList.add(0.00); List icList = new ArrayList<>(); icList.add(0.00); List uaList = new ArrayList<>(); uaList.add(0.00); List ubList = new ArrayList<>(); ubList.add(0.00); List ucList = new ArrayList<>(); ucList.add(0.00); List dateList = new ArrayList<>(); dateList.add("00:00:00"); for (int i = 2; i < 24 ; i+=2) { //结束时间 Date endTime = DateUtils.addHours(date, i); HtAnalogData htAnalogData = htAnalogDataMapper.selectByEndTime(date,endTime, siteId, userId); iaList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getIa()).orElse(0.00)); ibList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getIb()).orElse(0.00)); icList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getIc()).orElse(0.00)); uaList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getUa()).orElse(0.00)); ubList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getUb()).orElse(0.00)); ucList.add(Optional.ofNullable(htAnalogData).map(had -> htAnalogData.getUc()).orElse(0.00)); date = endTime; dateList.add(DateUtils.getTime(endTime)); } List list = new ArrayList<>(); list.add(CommonIcoVO.builder().name("IA").list(iaList).listDate(dateList).build()); list.add(CommonIcoVO.builder().name("IB").list(ibList).listDate(dateList).build()); list.add(CommonIcoVO.builder().name("IC").list(icList).listDate(dateList).build()); list.add(CommonIcoVO.builder().name("UA").list(uaList).listDate(dateList).build()); list.add(CommonIcoVO.builder().name("UB").list(ubList).listDate(dateList).build()); list.add(CommonIcoVO.builder().name("UC").list(ucList).listDate(dateList).build()); return list; } public CommonIcoVO getByDate(String name,Integer userId,Integer siteId,Date date){ List objects = new ArrayList<>(); objects.add(0.0); List dates = new ArrayList<>(); dates.add("00:00:00"); for (int i = 2; i < 24 ; i+=2) { //结束时间 Date endTime = DateUtils.addHours(date, i); objects.add(getElectricity(userId,siteId,date,endTime)); date = endTime; dates.add(DateUtils.getTime(date)); } return CommonIcoVO.builder().name(name).list(objects).listDate(dates).build(); } /** * 获取用电量 * @param userId * @param siteId * @param startTime * @param endTime * @return */ public Double getElectricity(Integer userId,Integer siteId,Date startTime,Date endTime){ HtAnalogData ascHad = htAnalogDataMapper.selectByStartTime(startTime,endTime, siteId, userId); HtAnalogData descHad = htAnalogDataMapper.selectByEndTime(endTime,endTime, siteId, userId); Double ascHadEpp = Optional.ofNullable(ascHad).map(HtAnalogData::getEpp).orElse(0.00); Double descHadEpp = Optional.ofNullable(descHad).map(HtAnalogData::getEpp).orElse(0.00); return Arith.sub(descHadEpp,ascHadEpp); } /** * 获取 * @param idList * @param list * @return */ public HadCrVO getDemandData(List idList, List list){ HadCrVO hadCrVO = new HadCrVO(); hadCrVO.setCount(0); hadCrVO.setSumDemand(0.00); List hadCrVOS = new ArrayList<>(); for (HadDataLog hadDataLog:list) { List siteIdList = JsonUtils.fromJson(hadDataLog.getSiteIdList(), new TypeReference>(){}); List origin = new ArrayList<>(idList); origin.retainAll(siteIdList); // 有交集 if(CollectionUtils.isNotEmpty(origin)){ List hadDataLogVos = JsonUtils.fromJson(hadDataLog.getHadData(), new TypeReference>(){}); hadCrVO.setCount(hadCrVO.getCount()+origin.size()); hadCrVO.setSumDemand(hadCrVO.getSumDemand()+ hadDataLogVos.stream().filter(hadDataLogVO -> origin.contains(hadDataLogVO.getSiteId())).mapToDouble(HadDataLogVO::getDemand).sum()); //分组求每个站点的最大值和最小值 Map collect = hadDataLogVos.stream() .filter(hadDataLogVO -> idList.contains(hadDataLogVO.getSiteId())) .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getDemand))); checkData(collect,hadCrVOS); } } for (HadCrVO hadCr:hadCrVOS) { hadCrVO.setHadDif(Arith.add(hadCrVO.getHadDif(),Arith.sub(hadCr.getHadMax(),hadCr.getHadMax()))); } hadCrVO.setHadAvg(Arith.div(hadCrVO.getSumDemand(),hadCrVO.getCount())); hadCrVO.setList(hadCrVOS); return hadCrVO; } /** * 获取epp数据 * @param idList * @param list * @return */ public List getEppData(List idList,List list){ List hadCrVoArrayList = new ArrayList<>(); for (HadDataLog hadDataLog:list) { List siteIdList = JsonUtils.fromJson(hadDataLog.getSiteIdList(), new TypeReference>(){}); List origin = new ArrayList<>(idList); origin.retainAll(siteIdList); // 有交集 if(CollectionUtils.isNotEmpty(origin)){ List hadDataLogVos = JsonUtils.fromJson(hadDataLog.getHadData(), new TypeReference>(){}); //分组求每个站点的最大值和最小值 Map collect = hadDataLogVos.stream() .filter(hadDataLogVO -> idList.contains(hadDataLogVO.getSiteId())) .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getEpp))); checkData(collect,hadCrVoArrayList); } } return hadCrVoArrayList; } /** * 便利寻找最大值/最小值 * @param collect * @param siteMaxVOList */ public void checkData(Map collect,List siteMaxVOList){ for (Integer siteId:collect.keySet()) { if (CollectionUtils.isEmpty(siteMaxVOList)){ HadCrVO hadCrVO = new HadCrVO(); hadCrVO.setSiteId(siteId); hadCrVO.setHadMax(collect.get(siteId).getMax()); hadCrVO.setHadMin(collect.get(siteId).getMin()); siteMaxVOList.add(hadCrVO); }else { siteMaxVOList.stream() .filter(siteMaxVO -> siteMaxVO.getSiteId().equals(siteId)) .findFirst() .map(siteMaxVO -> { if (siteMaxVO.getHadMax() < collect.get(siteId).getMax()){ siteMaxVO.setHadMax(collect.get(siteId).getMax()); } if (siteMaxVO.getHadMin() < collect.get(siteId).getMin()){ siteMaxVO.setHadMin(collect.get(siteId).getMin()); } return Optional.empty(); }).orElseGet(() -> { HadCrVO hadCrVO = new HadCrVO(); hadCrVO.setSiteId(siteId); hadCrVO.setHadMax(collect.get(siteId).getMax()); hadCrVO.setHadMin(collect.get(siteId).getMin()); siteMaxVOList.add(hadCrVO); return Optional.empty(); }); } } } }