package com.iailab.module.data.arc.service.impl; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.impl.BaseServiceImpl; 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 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; @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) { Map params = new HashMap(); params.put("type", type); switch (ArcTypeEnum.getEumByCode(type)) { case HOUR: //查询对应类型的归档设置列表 List arcHourList = arcPointSettingService.list(params); Date endTime1 = calendar.getTime(); calendar.add(Calendar.HOUR_OF_DAY, -1); Date startTime1 = calendar.getTime(); //遍历列表 arcHourList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); //通过point编号查询数据 ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO(); queryDto.setPointNo(item.getPoint()); queryDto.setStart(startTime1); queryDto.setEnd(endTime1); List valueList = dataPointApi.queryPointHistoryValue(queryDto); //判断根据计算类型计算 BigDecimal value = calculate(item.getCalculate(), valueList); //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); String arcTime = dateFormat.format(startTime1); ArcDataEntity arcDataEntity = new ArcDataEntity(); arcDataEntity.setId(String.valueOf(new Date().getTime())); arcDataEntity.setArcTime(arcTime); arcDataEntity.setArcId(item.getId()); arcDataEntity.setArcValue(value); arcDataDao.delete(new LambdaQueryWrapperX() .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId()) .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime()) ); insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case SHIFT: //查询对应类型的归档设置列表 List arcShiftList = arcPointSettingService.list(params); Date endTime2 = calendar.getTime(); calendar.add(Calendar.HOUR_OF_DAY, -1); Date startTime2 = calendar.getTime(); //遍历列表 arcShiftList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); //通过point编号查询数据 ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO(); queryDto.setPointNo(item.getPoint()); queryDto.setStart(startTime2); queryDto.setEnd(endTime2); List valueList = dataPointApi.queryPointHistoryValue(queryDto); //判断根据计算类型计算 BigDecimal value = calculate(item.getCalculate(), valueList); //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); String arcTime = dateFormat.format(startTime2); ArcDataEntity arcDataEntity = new ArcDataEntity(); arcDataEntity.setId(String.valueOf(new Date().getTime())); arcDataEntity.setArcTime(arcTime); arcDataEntity.setArcId(item.getId()); arcDataEntity.setArcValue(value); arcDataDao.delete(new LambdaQueryWrapperX() .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId()) .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime()) ); insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case DAY: //查询对应类型的归档设置列表 List arcDayList = arcPointSettingService.list(params); Date endTime3 = calendar.getTime(); calendar.add(Calendar.DAY_OF_YEAR, -1); Date startTime3 = calendar.getTime(); //遍历列表 arcDayList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); //通过point编号查询数据 ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO(); queryDto.setPointNo(item.getPoint()); queryDto.setStart(startTime3); queryDto.setEnd(endTime3); List valueList = dataPointApi.queryPointHistoryValue(queryDto); //判断根据计算类型计算 BigDecimal value = calculate(item.getCalculate(), valueList); //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String arcTime = dateFormat.format(startTime3); ArcDataEntity arcDataEntity = new ArcDataEntity(); arcDataEntity.setId(String.valueOf(new Date().getTime())); 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()) ); insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case MONTH: //查询对应类型的归档设置列表 List arcMonthList = arcPointSettingService.list(params); Date endTime4 = calendar.getTime(); calendar.add(Calendar.MONTH, -1); Date startTime4 = calendar.getTime(); //遍历列表 arcMonthList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); //通过point编号查询数据 ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO(); queryDto.setPointNo(item.getPoint()); queryDto.setStart(startTime4); queryDto.setEnd(endTime4); List valueList = dataPointApi.queryPointHistoryValue(queryDto); //判断根据计算类型计算 BigDecimal value = calculate(item.getCalculate(), valueList); //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM"); String arcTime = dateFormat.format(startTime4); ArcDataEntity arcDataEntity = new ArcDataEntity(); arcDataEntity.setId(String.valueOf(new Date().getTime())); 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()) ); insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; case YEAR: //查询对应类型的归档设置列表 List arcYearList = arcPointSettingService.list(params); Date endTime5 = calendar.getTime(); calendar.add(Calendar.YEAR, -1); Date startTime5 = calendar.getTime(); //遍历列表 arcYearList.forEach(item -> { log.debug("开始归档,point:"+item.getPoint()); //通过point编号查询数据 ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO(); queryDto.setPointNo(item.getPoint()); queryDto.setStart(startTime5); queryDto.setEnd(endTime5); List valueList = dataPointApi.queryPointHistoryValue(queryDto); //判断根据计算类型计算 BigDecimal value = calculate(item.getCalculate(), valueList); //归档 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy"); String arcTime = dateFormat.format(startTime5); ArcDataEntity arcDataEntity = new ArcDataEntity(); arcDataEntity.setId(String.valueOf(new Date().getTime())); 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()) ); insert(arcDataEntity); log.debug("归档完成,point:"+item.getPoint()); }); break; } } private BigDecimal calculate(String calculate, List valueList) { List valueFilterList = valueList.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0) ).collect(Collectors.toList()); log.debug("开始计算"); if ( valueList.isEmpty() || valueFilterList.isEmpty()) { throw new IllegalArgumentException("valueList 为空"); } 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(valueFilterList.stream().mapToDouble(ApiPointValueDTO::getV).sum()); break; case DIFF: if (valueFilterList.size() < 2) { throw new IllegalArgumentException("valueFilterList size小于2"); } BigDecimal prev = BigDecimal.valueOf(valueFilterList.get(0).getV()); for (int i = 1; i < valueFilterList.size(); i++) { BigDecimal curr = BigDecimal.valueOf(valueFilterList.get(i).getV()); if(curr.compareTo(prev) > 0 ) { value = value.add(curr.subtract(prev)); } prev = curr; } break; case AVG: value = BigDecimal.valueOf(valueFilterList.stream().mapToDouble(ApiPointValueDTO::getV).sum()); value = value.divide(BigDecimal.valueOf(valueFilterList.size()), 2, BigDecimal.ROUND_HALF_UP); break; default: throw new IllegalArgumentException("没有对应计算方法"); } return value; } @Override public PageResult queryPage(ArcDataPageReqVO reqVO) { return arcDataDao.selectPage(reqVO); } }