123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- 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.model.Site;
- 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 lombok.extern.slf4j.Slf4j;
- import org.apache.lucene.index.IndexFormatTooNewException;
- import org.checkerframework.checker.units.qual.A;
- 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;
- /**
- * <p>
- * 服务实现类
- * </p>
- *
- * @author ya
- * @since 2021-07-07
- */
- @Slf4j
- @Service
- public class HtAnalogDataServiceImpl extends AbstractCrudService<HtAnalogDataMapper, HtAnalogData> implements HtAnalogDataService {
- @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<Integer> idList = siteMapper.idList(userId, null);
- //日
- List<HadDataLog> byToday = getByToday(DateUtils.getDayStartTime(date), date);
- hadCountVO.setDayCount(getEpp(byToday, idList, null, null));
- //月
- List<HadDataLog> byMonth = getByMonth(DateUtils.getFirstDayOfMonth(date), date);
- hadCountVO.setMonthCount(getEpp(byMonth, idList, null, null));
- //年
- List<HadDataLog> byYear = getByMonth(DateUtils.getBeginDayOfYear(date), date);
- hadCountVO.setYearCount(getEpp(byYear, idList, null, null));
- return hadCountVO;
- }
- /**
- * 获取epp计算结果
- * @param list
- * @param siteIdList
- * @return
- */
- public Double getEpp(List<HadDataLog> list, List<Integer> siteIdList,Date startTime,Date endTime){
- List<HadCrVO> hadCrVoS = new ArrayList<>();
- list.forEach(hadDataLog -> {
- //获取真实数据
- List<HadDataLogVO> hadDateList = getHadDateList(hadDataLog, siteIdList,startTime,endTime);
- Map<Integer, DoubleSummaryStatistics> collect = hadDateList.stream()
- .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getEpp)));
- checkData(collect,hadCrVoS);
- });
- return getSubCount(hadCrVoS);
- }
- public List<HadDataLog> getByToday(Date startTime,Date endTime){
- return hadDataLogService.list(startTime,endTime);
- }
- public List<HadDataLog> getByMonth(Date startTime,Date endTime){
- return hadDataLogService.maxAndMinList(startTime,endTime);
- }
- @Override
- public List<CommonIcoVO> selectTrendByDate(Integer siteId) {
- Date date = new Date();
- List<CommonIcoVO> list = new ArrayList<>();
- List<Integer> idList = getSiteIdList(siteId);
- list.add(getTrendOne("today", idList, DateUtils.getDayStartTime(date), date));
- list.add(getTrendOne("yesterday", idList, DateUtils.addDays(date, -1), date));
- return list;
- }
- @Override
- public CommonIcoVO selectTrendByMonth() {
- List<Integer> siteIdList = getSiteIdList(null);
- Date date = new Date();
- List<Object> objects = new ArrayList<>();
- List<Object> dateList = new ArrayList<>();
- List<HadDataLog> hadDataLogList = getByToday(DateUtils.getFirstDayOfMonth(date), date);
- 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);
- objects.add(getEpp(hadDataLogList,siteIdList,dayStartTime,dayEndTime));
- dateList.add(DateUtils.getDay(setDays));
- }
- CommonIcoVO.builder().name("当月趋势图").list(objects).listDate(dateList).build();
- return null;
- }
- public CommonIcoVO getTrendOne(String name,List<Integer> idList,Date startTime,Date endTime){
- List<HadDataLog> list = getByToday(startTime, endTime);
- List<Object> objects = new ArrayList<>();
- objects.add(0.0);
- List<Object> dates = new ArrayList<>();
- dates.add("00:00:00");
- for (int i = 2; i < 24 ; i+=2) {
- //结束时间
- Date hours = DateUtils.addHours(startTime, i);
- objects.add(getEpp(list,idList,startTime,hours));
- startTime = hours;
- dates.add(DateUtils.getTime(hours));
- }
- return CommonIcoVO.builder().name(name).list(objects).listDate(dates).build();
- }
- @Override
- public HadCountVO getCountBySite(Integer siteId) {
- List<Integer> siteIdList = getSiteIdList(siteId);
- Date date = new Date();
- //当日开始时间
- Date firstDayOfDate = DateUtils.getDayStartTime(date);
- //当月开始时间
- Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date);
- //当年开始时间
- Date firstDayOfYear = DateUtils.getBeginDayOfYear(date);
- HadCountVO hadCountVO = new HadCountVO();
- //今日
- List<HadDataLog> byToday = getByToday(firstDayOfDate, date);
- hadCountVO.setDayCount(getEpp(byToday,siteIdList,null,null));
- //本月
- List<HadDataLog> byToMonth = getByMonth(firstDayOfMonth, date);
- hadCountVO.setMonthCount(getEpp(byToMonth,siteIdList,null,null));
- //本年
- List<HadDataLog> byToYear = getByMonth(firstDayOfYear, date);
- hadCountVO.setYearCount(getEpp(byToYear,siteIdList,null,null));
- //昨天
- List<HadDataLog> lastDay = getByToday(DateUtils.addDays(firstDayOfDate, -1), DateUtils.addDays(date, -1));
- Double lastDayEpp = getEpp(lastDay, siteIdList, null,null);
- hadCountVO.setLastDayCount(lastDayEpp);
- //上月
- List<HadDataLog> lastMonth = getByMonth(DateUtils.addMonths(firstDayOfMonth, -1), DateUtils.addMonths(date, -1));
- Double lastMonthEpp = getEpp(lastMonth, siteIdList, null,null);
- hadCountVO.setLastMonthCount(lastMonthEpp);
- //去年
- List<HadDataLog> lastYear = getByMonth(DateUtils.addYears(firstDayOfYear, -1), DateUtils.addYears(date, -1));
- Double lastYearEpp = getEpp(lastYear, siteIdList, null, null);
- hadCountVO.setLastDayCount(lastYearEpp);
- 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) {
- TimeShareVO timeShareVO = new TimeShareVO();
- List<Integer> idList = new ArrayList<>();
- idList.add(siteId);
- List<HadDataLog> byToday = getByToday(date, DateUtils.getDayEndTime(date));
- //尖峰时间
- Date nine = DateUtils.setMinutes(DateUtils.setHours(date, 9), 30);
- Date eleven = DateUtils.setMinutes(DateUtils.setHours(date, 11), 30);
- Date nineTeen = DateUtils.setHours(date, 19);
- Date twoOne = DateUtils.setHours(date, 21);
- //高峰时间
- Date eight = DateUtils.setMinutes(DateUtils.setHours(date, 8), 30);
- Date ten = DateUtils.setMinutes(DateUtils.setHours(date, 10), 30);
- Date oneEight = DateUtils.setHours(date, 18);
- Date oneNine = DateUtils.setHours(date, 19);
- Date twoThree = DateUtils.setHours(date, 23);
- //低谷
- Date seven = DateUtils.setHours(date, 7);
- //平谷
- Date oneTwo = DateUtils.setHours(date, 12);
- Date oneSeven = DateUtils.setHours(date, 17);
- //尖
- Double nToe = getEpp(byToday, idList, nine, eleven);
- Double nTot = getEpp(byToday, idList, nineTeen, twoOne);
- timeShareVO.setNeed(Arith.sub(nToe,nTot));
- //高峰
- Double eTot = getEpp(byToday, idList, eight, ten);
- Double hnTot = getEpp(byToday, idList, oneEight, oneNine);
- Double tTot = getEpp(byToday, idList, twoOne, twoThree);
- timeShareVO.setPeak(Arith.sub(Arith.sub(eTot,hnTot),tTot));
- //低谷
- Double tTos = getEpp(byToday, idList, twoThree, seven);
- timeShareVO.setGrain(tTos);
- //平谷
- Double oToo = getEpp(byToday, idList, oneTwo, oneSeven);
- timeShareVO.setFlat(oToo);
- return timeShareVO;
- }
- @Override
- public List<CommonIcoVO> getDemandIco(Integer siteId) {
- List<Integer> idList = new ArrayList<>();
- idList.add(siteId);
- Date date = new Date();
- List<HadDataLog> hadDataLogList = getByToday(date, DateUtils.getLastDayOfMonth(date));
- List<Object> maxList = new ArrayList<>();
- List<Object> minList = new ArrayList<>();
- List<Object> avgList = new ArrayList<>();
- List<Object> dateList = new ArrayList<>();
- for (int i = 1; i <= Integer.parseInt(DateUtils.getDay(date)); i++) {
- List<HadCrVO> hadCrVoS = new ArrayList<>();
- AtomicReference<Double> count = new AtomicReference<>(0.00);
- AtomicReference<Integer> size = new AtomicReference<>(0);
- Date setDays = DateUtils.setDays(date, i);
- Date dayStartTime = DateUtils.getDayStartTime(setDays);
- Date dayEndTime = DateUtils.getDayEndTime(setDays);
- //筛选出日期范围数据
- List<HadDataLog> hadDataLogs = hadDataLogList.stream()
- .filter(hadDataLog -> hadDataLog.getDataTime().after(dayStartTime) && hadDataLog.getDataTime().after(dayEndTime))
- .collect(Collectors.toList());
- hadDataLogs.forEach(hadDataLog -> {
- List<HadDataLogVO> hadDateList = getHadDateList(hadDataLog, idList, null, null);
- count.updateAndGet(v -> v + hadDateList.stream().mapToDouble(HadDataLogVO::getDemand).sum());
- size.updateAndGet(v -> v + hadDateList.size());
- Map<Integer, DoubleSummaryStatistics> collect = hadDateList.stream()
- .collect(Collectors.groupingBy(HadDataLogVO::getSiteId, Collectors.summarizingDouble(HadDataLogVO::getDemand)));
- checkData(collect,hadCrVoS);
- });
- maxList.add(hadCrVoS.stream().max(Comparator.comparingDouble(HadCrVO::getHadMax)).map(HadCrVO::getHadMax).orElse(0.00));
- maxList.add(hadCrVoS.stream().min(Comparator.comparingDouble(HadCrVO::getHadMin)).map(HadCrVO::getHadMin).orElse(0.00));
- avgList.add(Arith.div(count.get(),size.get()));
- dateList.add(DateUtils.getDay(setDays));
- }
- List<CommonIcoVO> 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<CommonIcoVO> getElectricIco(Integer siteId, Date date) {
- Integer userId = SessionLocal.getUserId();
- List<Integer> siteIdList = new ArrayList<>();
- siteIdList.add(siteId);
- List<Object> iaList = new ArrayList<>();
- iaList.add(0.00);
- List<Object> ibList = new ArrayList<>();
- ibList.add(0.00);
- List<Object> icList = new ArrayList<>();
- icList.add(0.00);
- List<Object> uaList = new ArrayList<>();
- uaList.add(0.00);
- List<Object> ubList = new ArrayList<>();
- ubList.add(0.00);
- List<Object> ucList = new ArrayList<>();
- ucList.add(0.00);
- List<Object> dateList = new ArrayList<>();
- dateList.add("00:00:00");
- List<HadDataLog> hadDataLogList = getByToday(date, DateUtils.getDayStartTime(date));
- for (int i = 2; i < 24 ; i+=2) {
- //结束时间
- Date endTime = DateUtils.addHours(date, i);
- Date finalDate = date;
- List<HadDataLogVO> maxHadList = new ArrayList<>();
- Comparator<HadDataLogVO> comparator = Comparator.comparing(HadDataLogVO::getDataTime);
- hadDataLogList.forEach(hadDataLog -> {
- List<HadDataLogVO> hadDateList = getHadDateList(hadDataLog, siteIdList, finalDate, endTime);
- hadDateList.stream().max(comparator).ifPresent(maxHadList::add);
- });
- Optional<HadDataLogVO> max = maxHadList.stream().max(comparator);
- iaList.add(max.map(HadDataLogVO::getIa).orElse(0.00));
- ibList.add(max.map(HadDataLogVO::getIb).orElse(0.00));
- icList.add(max.map(HadDataLogVO::getIc).orElse(0.00));
- uaList.add(max.map(HadDataLogVO::getUa).orElse(0.00));
- ubList.add(max.map(HadDataLogVO::getUa).orElse(0.00));
- ucList.add(max.map(HadDataLogVO::getUa).orElse(0.00));
- date = endTime;
- dateList.add(DateUtils.getTime(endTime));
- }
- List<CommonIcoVO> 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 List<Integer> getSiteIdList(Integer siteId){
- Integer userId = SessionLocal.getUserId();
- List<Integer> list = new ArrayList<>();
- if (null == siteId){
- list = siteMapper.idList(userId, null);
- }else {
- list.add(siteId);
- }
- return list;
- }
- /**
- * 求多个站点最大值减最小值的结果
- * @param list
- * @return
- */
- public Double getSubCount(List<HadCrVO> list){
- double count = 0.00;
- for (HadCrVO hadCrVO:list) {
- count+=Arith.add(count,Arith.sub(hadCrVO.getHadMax(),hadCrVO.getHadMax()));
- }
- return count;
- }
- /**
- * 根据统计表的一条记录获取真实数据
- * @param hadDataLog
- * @return
- */
- public List<HadDataLogVO> getHadDateList(HadDataLog hadDataLog,List<Integer> idList,Date startTime,Date endTime){
- List<HadDataLogVO> hadDataLogVos = new ArrayList<>();
- List<Integer> siteIdList = JsonUtils.fromJson(hadDataLog.getSiteIdList(), new TypeReference<List<Integer>>(){});
- List<Integer> origin = new ArrayList<>(idList);
- origin.retainAll(siteIdList);
- // 有交集
- if(CollectionUtils.isNotEmpty(origin)){
- hadDataLogVos = JsonUtils.fromJson(hadDataLog.getHadData(), new TypeReference<List<HadDataLogVO>>(){});
- hadDataLogVos = hadDataLogVos.stream()
- .filter(hadDataLogVO -> idList.contains(hadDataLogVO.getSiteId()))
- .filter(hadDataLogVO -> Optional.ofNullable(startTime).map(sTime -> hadDataLogVO.getDataTime().after(sTime)).orElse(true))
- .filter(hadDataLogVO -> Optional.ofNullable(endTime).map(eTime -> hadDataLogVO.getDataTime().before(eTime)).orElse(true))
- .collect(Collectors.toList());
- }
- return hadDataLogVos;
- }
- /**
- * 便利寻找最大值/最小值
- * @param collect
- * @param siteMaxVOList
- */
- public void checkData(Map<Integer, DoubleSummaryStatistics> collect,List<HadCrVO> 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();
- });
- }
- }
- }
- }
|