对比新文件 |
| | |
| | | package com.iailab.module.ansteel.job.task; |
| | | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import com.alibaba.excel.util.DateUtils; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.iailab.module.ansteel.power.dao.PeakValleyFlatDao; |
| | | import com.iailab.module.ansteel.power.entity.PeakValleyFlatEntity; |
| | | import com.iailab.module.data.api.point.DataPointApi; |
| | | import com.iailab.module.data.api.point.dto.ApiPointValueDTO; |
| | | import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; |
| | | import com.iailab.module.data.api.point.dto.ApiPointValueWriteDTO; |
| | | import org.checkerframework.checker.units.qual.A; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.text.ParseException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static com.alibaba.excel.util.DateUtils.DATE_FORMAT_16_FORWARD_SLASH; |
| | | |
| | | /** |
| | | * 峰谷平累计量计算 |
| | | * |
| | | * @author DongYukun |
| | | * @Description |
| | | * @createTime 2025年5月5日 |
| | | */ |
| | | @Component("runPeakValleyFlatTask") |
| | | public class RunPeakValleyFlatTask implements ITask { |
| | | private Logger logger = LoggerFactory.getLogger(getClass()); |
| | | |
| | | @Autowired |
| | | private PeakValleyFlatDao peakValleyFlatDao; |
| | | |
| | | @Autowired |
| | | private DataPointApi dataPointApi; |
| | | |
| | | @Override |
| | | public void run(String params) { |
| | | try { |
| | | //查询峰谷平配置列表 |
| | | List<PeakValleyFlatEntity> list = peakValleyFlatDao.selectList(new QueryWrapper<>()); |
| | | |
| | | //根据测点分组 |
| | | Map<String, List<PeakValleyFlatEntity>> groupedByPointNo = list.stream() |
| | | .collect(Collectors.groupingBy(PeakValleyFlatEntity::getPowerNo)); |
| | | |
| | | groupedByPointNo.entrySet().stream().forEach(entry -> { |
| | | |
| | | //计算昨日的累积量 |
| | | double value = getSumValue(entry.getValue(),1); |
| | | ApiPointValueWriteDTO dto = new ApiPointValueWriteDTO(); |
| | | dto.setPointNo(entry.getValue().get(0).getPointNo()); |
| | | dto.setValue(value); |
| | | dataPointApi.writePointRealValue(dto); |
| | | |
| | | //计算前三十日累积量 |
| | | double value30 = 0 ; |
| | | for (int i = 1; i < 31; i++) { |
| | | value30 = value30 + getSumValue(entry.getValue(),i); |
| | | } |
| | | ApiPointValueWriteDTO monthDto = new ApiPointValueWriteDTO(); |
| | | monthDto.setPointNo(entry.getValue().get(0).getPointNoMonth()); |
| | | monthDto.setValue(value30); |
| | | dataPointApi.writePointRealValue(monthDto); |
| | | }); |
| | | } catch (Exception ex) { |
| | | logger.error("runPeakValleyFlatTask运行异常"); |
| | | ex.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | private Date getTime(String timeStr , int ago) { |
| | | String[] timeSplit = timeStr.split(":"); |
| | | if (timeSplit.length != 2) { |
| | | throw new IllegalArgumentException("时间配置格式不合法"); |
| | | } |
| | | //根据配置获取startTime、endTime、 |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeSplit[0])); |
| | | calendar.set(Calendar.MINUTE, Integer.parseInt(timeSplit[1])); |
| | | calendar.add(Calendar.DAY_OF_YEAR, -ago); |
| | | return calendar.getTime(); |
| | | } |
| | | |
| | | private List<ApiPointValueDTO> fillMissingData(List<ApiPointValueDTO> valueList, |
| | | Date startTime, |
| | | Date endTime) { |
| | | // 如果原始数据为空,返回空列表 |
| | | if (valueList == null || valueList.isEmpty()) { |
| | | return new ArrayList<>(); |
| | | } |
| | | List<ApiPointValueDTO> filledList = new ArrayList<>(); |
| | | ApiPointValueDTO lastValidData = null; |
| | | |
| | | // 计算总分钟数 |
| | | long totalMinutes = (endTime.getTime() - startTime.getTime()) / (60 * 1000); |
| | | |
| | | // 遍历每分钟 |
| | | for (int i = 0; i <= totalMinutes; i++) { |
| | | Date currentTime = new Date(startTime.getTime() + i * 60 * 1000); |
| | | |
| | | // 查找当前分钟是否有数据 |
| | | ApiPointValueDTO currentData = findDataForTime(valueList, currentTime); |
| | | |
| | | if (currentData != null) { |
| | | // 如果有数据,使用原始数据 |
| | | filledList.add(currentData); |
| | | lastValidData = currentData; |
| | | } else if (lastValidData != null) { |
| | | // 如果没有数据但有最近的有效数据,则补充 |
| | | ApiPointValueDTO filledData = new ApiPointValueDTO() |
| | | .setT(currentTime) |
| | | .setV(lastValidData.getV()); |
| | | filledList.add(filledData); |
| | | } else { |
| | | // 如果既没有当前数据也没有最近数据,查找第一个有值的数据 |
| | | ApiPointValueDTO filledData = new ApiPointValueDTO() |
| | | .setT(currentTime) |
| | | .setV(valueList.get(0).getV()); |
| | | filledList.add(filledData); |
| | | lastValidData = filledData; |
| | | } |
| | | } |
| | | |
| | | return filledList; |
| | | } |
| | | |
| | | private ApiPointValueDTO findDataForTime(List<ApiPointValueDTO> valueList, Date time) { |
| | | for (ApiPointValueDTO data : valueList) { |
| | | long time1 = data.getT().getTime() / (60 * 1000); |
| | | long time2 = time.getTime() / (60 * 1000); |
| | | if (time1 == time2) { |
| | | return data; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | private double getSumValue( List<PeakValleyFlatEntity> list ,int ago){ |
| | | double value = 0; |
| | | for (int i = 0; i < list.size(); i++) { |
| | | |
| | | PeakValleyFlatEntity entity = list.get(i); |
| | | |
| | | ApiPointValueQueryDTO dto = new ApiPointValueQueryDTO(); |
| | | Date startTime = getTime(entity.getStartTime(),ago); |
| | | Date endTime = getTime(entity.getEndTime(),ago); |
| | | dto.setPointNo(entity.getPowerNo()); |
| | | dto.setStart(startTime); |
| | | dto.setEnd(endTime); |
| | | |
| | | //查找数据 |
| | | List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(dto); |
| | | //补全数据 |
| | | valueList = fillMissingData(valueList, startTime, endTime); |
| | | //累加 |
| | | double sum = valueList.stream().mapToDouble(ApiPointValueDTO::getV).sum(); |
| | | value = value + sum; |
| | | } |
| | | return value/60; |
| | | } |
| | | |
| | | } |