package com.iailab.module.data.arc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.impl.BaseServiceImpl; import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.module.data.api.arc.dto.ApiArcDataDTO; import com.iailab.module.data.api.arc.dto.ApiArcValueQueryDTO; import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX; import com.iailab.framework.mybatis.core.query.QueryWrapperX; import com.iailab.module.data.api.point.DataPointApiImpl; import com.iailab.module.data.api.point.dto.ApiPointValueDTO; import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; import com.iailab.module.data.common.enums.ArcCalculateTypeEnum; import com.iailab.module.data.arc.dao.ArcDataDao; import com.iailab.module.data.arc.entity.ArcDataEntity; import com.iailab.module.data.arc.entity.ArcSettingEntity; import com.iailab.module.data.arc.service.ArcDataService; import com.iailab.module.data.common.enums.ArcTypeEnum; import com.iailab.module.data.arc.service.ArcSettingService; import com.iailab.module.data.arc.vo.ArcDataPageReqVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class ArcDataServiceImpl extends BaseServiceImpl implements ArcDataService { @Autowired private ArcSettingService arcPointSettingService; @Autowired private DataPointApiImpl dataPointApi; @Autowired private ArcDataDao arcDataDao; //根据归档类型进行归档 @Override public void archiving(String type, Calendar calendar) { ArcTypeEnum arcType = ArcTypeEnum.getEumByCode(type); switch (arcType) { case MIN15: break; case HOUR: case SHIFT: calendar.set(Calendar.MINUTE,0); break; case DAY: case MONTH: case YEAR: calendar.set(Calendar.MINUTE,0); calendar.set(Calendar.HOUR_OF_DAY,0); break; } Map params = new HashMap(); params.put("type", type); // 时间格式 SimpleDateFormat dateFormat = arcType.getDateFormat(); int calendarType = arcType.getCalendarType(); int calendarNum = arcType.getCalendarNum(); //查询对应类型的归档设置列表 List arcSettingList = arcPointSettingService.list(params); Date endTime = calendar.getTime(); calendar.add(calendarType, calendarNum); Date startTime = calendar.getTime(); //遍历列表 List result = new ArrayList<>(arcSettingList.size()); arcSettingList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); //通过point编号查询数据 ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO(); queryDto.setPointNo(item.getPoint()); queryDto.setStart(startTime); queryDto.setEnd(endTime); List valueList = dataPointApi.queryPointHistoryValue(queryDto); //判断根据计算类型计算 BigDecimal value = calculate(item.getCalculate(), valueList); //归档 String arcTime = dateFormat.format(startTime); ArcDataEntity arcDataEntity = new ArcDataEntity(); arcDataEntity.setId(UUID.randomUUID().toString()); arcDataEntity.setArcTime(arcTime); arcDataEntity.setArcId(item.getId()); arcDataEntity.setArcValue(value); arcDataEntity.setCode(item.getCode()); arcDataEntity.setCreateTime(new Date()); arcDataDao.delete(new LambdaQueryWrapperX() .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId()) .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime()) ); result.add(arcDataEntity); log.debug("归档完成,point:"+item.getPoint() + ",value:" + value); }); baseDao.insert(result); } private BigDecimal calculate(String calculate, List valueList) { valueList = valueList.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0) ).collect(Collectors.toList()); log.debug("开始计算"); if ( valueList.isEmpty()) { log.error("valueList is empty,return zero!"); return BigDecimal.ZERO; } BigDecimal value = BigDecimal.ZERO; ArcCalculateTypeEnum calculateType = ArcCalculateTypeEnum.getEumByCode(calculate); switch (calculateType) { case NONE: value = BigDecimal.valueOf(valueList.get(valueList.size() - 1).getV()); break; case SUM: value = BigDecimal.valueOf(valueList.stream().mapToDouble(ApiPointValueDTO::getV).sum()); break; case DIFF: if (valueList.size() < 2) { log.error("valueFilterList size小于2"); return BigDecimal.ZERO; } BigDecimal prev = BigDecimal.valueOf(valueList.get(0).getV()); for (int i = 1; i < valueList.size(); i++) { BigDecimal curr = BigDecimal.valueOf(valueList.get(i).getV()); if(curr.compareTo(prev) > 0 ) { value = value.add(curr.subtract(prev)); } prev = curr; } break; case AVG: value = BigDecimal.valueOf(valueList.stream().mapToDouble(ApiPointValueDTO::getV).average().orElse(0.0)); break; case ZERO: value = BigDecimal.valueOf(valueList.stream().filter(e -> Double.valueOf(e.getV()).equals(0.0)).count()); break; default: return BigDecimal.ZERO; } return value; } @Override public PageResult queryPage(ArcDataPageReqVO reqVO) { return arcDataDao.selectPage(reqVO); } @Override public List queryHistoryValue(ApiArcValueQueryDTO queryDTO) { ArcSettingEntity settingEntity = arcPointSettingService.selectByCode(queryDTO.getCode()); if (settingEntity == null) { log.error("arcPointSettingCode:" + queryDTO.getCode() + "不存在"); return new ArrayList<>(); } ArcTypeEnum arcType = ArcTypeEnum.getEumByCode(settingEntity.getType()); // 时间格式 SimpleDateFormat dateFormat = arcType.getDateFormat(); Calendar calendar = Calendar.getInstance(); if (queryDTO.getEnd() == null) { queryDTO.setEnd(calendar.getTime()); } if (queryDTO.getStart() == null) { calendar.add(arcType.getCalendarType(),arcType.getCalendarNum()); queryDTO.setStart(calendar.getTime()); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.between("arc_time",dateFormat.format(queryDTO.getStart()),dateFormat.format(queryDTO.getEnd())) .eq("code",queryDTO.getCode()); return ConvertUtils.sourceToTarget(arcDataDao.selectList(queryWrapper),ApiArcDataDTO.class); } @Override public ApiArcDataDTO queryArcLastValue(String code) { ArcSettingEntity settingEntity = arcPointSettingService.selectByCode(code); if (settingEntity == null) { log.error("arcPointSettingCode:" + code + "不存在"); return new ApiArcDataDTO(); } ArcTypeEnum arcType = ArcTypeEnum.getEumByCode(settingEntity.getType()); Calendar calendar = Calendar.getInstance(); switch (arcType) { case MIN15: break; case HOUR: case SHIFT: calendar.set(Calendar.MINUTE,0); break; case DAY: case MONTH: case YEAR: calendar.set(Calendar.MINUTE,0); calendar.set(Calendar.HOUR_OF_DAY,0); break; } // 最后归档时间 calendar.add(arcType.getCalendarType(), arcType.getCalendarNum()); String arcTime = arcType.getDateFormat().format(calendar.getTime()); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("arc_time",arcTime) .eq("code",code); ArcDataEntity arcDataEntity = baseDao.selectOne(queryWrapper); return ConvertUtils.sourceToTarget(arcDataEntity,ApiArcDataDTO.class); } }