|
|
@@ -0,0 +1,220 @@
|
|
|
+package com.jjt.dyeing.service.impl;
|
|
|
+
|
|
|
+import com.jjt.common.utils.DateUtils;
|
|
|
+import com.jjt.dyeing.domain.DyeingDevice;
|
|
|
+import com.jjt.dyeing.domain.DyeingHourAvg;
|
|
|
+import com.jjt.dyeing.domain.DyeingHourEnergy;
|
|
|
+import com.jjt.dyeing.domain.DyeingHourLine;
|
|
|
+import com.jjt.dyeing.mapper.DyeingHourLineMapper;
|
|
|
+import com.jjt.dyeing.service.IDyeingDeviceService;
|
|
|
+import com.jjt.dyeing.service.IDyeingHourAvgService;
|
|
|
+import com.jjt.dyeing.service.IDyeingHourEnergyService;
|
|
|
+import com.jjt.dyeing.service.IDyeingHourLineService;
|
|
|
+import com.jjt.dyeing.vo.DyeingCalcHourVO;
|
|
|
+import com.jjt.utils.Tools;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 染整线产线小时统计数据Service业务层处理
|
|
|
+ *
|
|
|
+ * @author wukai
|
|
|
+ * @date 2025-10-19
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class DyeingHourLineServiceImpl implements IDyeingHourLineService {
|
|
|
+ @Resource
|
|
|
+ private DyeingHourLineMapper dyeingHourLineMapper;
|
|
|
+ @Resource
|
|
|
+ private IDyeingHourEnergyService energyService;
|
|
|
+ @Resource
|
|
|
+ private IDyeingHourAvgService avgService;
|
|
|
+ @Resource
|
|
|
+ private IDyeingDeviceService deviceService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询染整线产线小时统计数据
|
|
|
+ *
|
|
|
+ * @param id 染整线产线小时统计数据主键
|
|
|
+ * @return 染整线产线小时统计数据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public DyeingHourLine selectDyeingHourLineById(Long id) {
|
|
|
+ return dyeingHourLineMapper.selectDyeingHourLineById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询染整线产线小时统计数据列表
|
|
|
+ *
|
|
|
+ * @param dyeingHourLine 染整线产线小时统计数据
|
|
|
+ * @return 染整线产线小时统计数据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<DyeingHourLine> selectDyeingHourLineList(DyeingHourLine dyeingHourLine) {
|
|
|
+ return dyeingHourLineMapper.selectDyeingHourLineList(dyeingHourLine);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增染整线产线小时统计数据
|
|
|
+ *
|
|
|
+ * @param dyeingHourLine 染整线产线小时统计数据
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int insertDyeingHourLine(DyeingHourLine dyeingHourLine) {
|
|
|
+ return dyeingHourLineMapper.insertDyeingHourLine(dyeingHourLine);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改染整线产线小时统计数据
|
|
|
+ *
|
|
|
+ * @param dyeingHourLine 染整线产线小时统计数据
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int updateDyeingHourLine(DyeingHourLine dyeingHourLine) {
|
|
|
+ return dyeingHourLineMapper.updateDyeingHourLine(dyeingHourLine);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除染整线产线小时统计数据
|
|
|
+ *
|
|
|
+ * @param ids 需要删除的染整线产线小时统计数据主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteDyeingHourLineByIds(Long[] ids) {
|
|
|
+ return dyeingHourLineMapper.deleteDyeingHourLineByIds(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除染整线产线小时统计数据信息
|
|
|
+ *
|
|
|
+ * @param id 染整线产线小时统计数据主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteDyeingHourLineById(Long id) {
|
|
|
+ return dyeingHourLineMapper.deleteDyeingHourLineById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算上一小时数据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void calcLastHour() {
|
|
|
+ LocalDateTime end = Tools.currWholeTime();
|
|
|
+ LocalDateTime start = end.minusHours(1);
|
|
|
+ calc(start.toLocalDate(), start.getHour());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算指定时间指定小时数据
|
|
|
+ *
|
|
|
+ * @param date 时间
|
|
|
+ * @param hour 小时
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void calc(LocalDate date, int hour) {
|
|
|
+ dyeingHourLineMapper.deleteByHour(DateUtils.toDate(date), hour);
|
|
|
+ List<DyeingHourAvg> avgList = avgService.selectByLine(date, hour);
|
|
|
+ List<DyeingHourEnergy> energyList = energyService.selectByLine(date, hour);
|
|
|
+ //1.查询所有设备
|
|
|
+ Map<Long, DyeingDevice> deviceMap = deviceService.deviceMap();
|
|
|
+ Map<String, List<DyeingDevice>> deviceByLine = deviceService.deviceByLine();
|
|
|
+ //2.初始化产线统计
|
|
|
+ List<DyeingCalcHourVO> voList = new ArrayList<>();
|
|
|
+ Map<Long, DyeingHourAvg> avgMap = avgList.stream().collect(Collectors.toMap(DyeingHourAvg::getDeviceId, DyeingHourAvg -> DyeingHourAvg));
|
|
|
+ Map<Long, DyeingHourEnergy> energyMap = energyList.stream().collect(Collectors.toMap(DyeingHourEnergy::getDeviceId, DyeingHourEnergy -> DyeingHourEnergy));
|
|
|
+ avgMap.forEach((deviceId, avg) -> {
|
|
|
+ DyeingHourEnergy energy = energyMap.get(deviceId);
|
|
|
+ DyeingCalcHourVO vo = new DyeingCalcHourVO();
|
|
|
+ DyeingDevice device = deviceMap.get(deviceId);
|
|
|
+ vo.setDataDate(DateUtils.toDate(date));
|
|
|
+ vo.setHour(hour);
|
|
|
+ vo.setLine(device.getLine());
|
|
|
+ vo.setDevice(device);
|
|
|
+ vo.setSpeed(avg.getSpeed());
|
|
|
+ vo.setLength(avg.getLength());
|
|
|
+ vo.setTmp(avg.getTmp());
|
|
|
+ vo.setEnergy(energy.getEnergy());
|
|
|
+ vo.setAmp(energy.getAmp());
|
|
|
+ vo.setOnline(avg.getOnline() == null || avg.getOnline() < 2000L);
|
|
|
+ voList.add(vo);
|
|
|
+ });
|
|
|
+
|
|
|
+ Map<String, List<DyeingCalcHourVO>> voMap = voList.stream().collect(Collectors.groupingBy(DyeingCalcHourVO::getLine));
|
|
|
+ voMap.forEach((line, list) -> {
|
|
|
+ DyeingHourLine hourLine = new DyeingHourLine();
|
|
|
+ hourLine.setLine(line);
|
|
|
+ hourLine.setDataDate(DateUtils.toDate(date));
|
|
|
+ hourLine.setHour(hour);
|
|
|
+ //开机率
|
|
|
+ hourLine.setOpenRate(BigDecimal.valueOf(list.stream().filter(DyeingCalcHourVO::getOnline).count() * 100.0 / list.size()));
|
|
|
+ //计算出布速度,只用定型机计算
|
|
|
+ long speedCount = list.stream()
|
|
|
+ .filter(vo -> vo.getDevice() != null && vo.getDevice().getTypeId() != null && vo.getDevice().getTypeId() == 2)
|
|
|
+ .count();
|
|
|
+
|
|
|
+ BigDecimal averageSpeed = BigDecimal.ZERO;
|
|
|
+ if (speedCount > 0) {
|
|
|
+ averageSpeed = list.stream()
|
|
|
+ .filter(vo -> vo.getDevice() != null && vo.getDevice().getTypeId() != null && vo.getDevice().getTypeId() == 2)
|
|
|
+ .map(DyeingCalcHourVO::getSpeed)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal::add)
|
|
|
+ .orElse(BigDecimal.ZERO)
|
|
|
+ .divide(BigDecimal.valueOf(speedCount), 2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ hourLine.setSpeed(averageSpeed);
|
|
|
+
|
|
|
+ //计算平均温度
|
|
|
+ long tempCount = list.stream()
|
|
|
+ .filter(vo -> vo.getDevice() != null && vo.getDevice().getTypeId() != null && vo.getDevice().getTypeId() == 3)
|
|
|
+ .count();
|
|
|
+
|
|
|
+ BigDecimal averageTemp = BigDecimal.ZERO;
|
|
|
+ if (tempCount > 0) {
|
|
|
+ averageTemp = list.stream()
|
|
|
+ .filter(vo -> vo.getDevice() != null && vo.getDevice().getTypeId() != null && vo.getDevice().getTypeId() == 3)
|
|
|
+ .map(DyeingCalcHourVO::getTmp) // 修正:应该使用getTmp而不是getSpeed
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal::add)
|
|
|
+ .orElse(BigDecimal.ZERO)
|
|
|
+ .divide(BigDecimal.valueOf(tempCount), 2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ hourLine.setTmp(averageTemp);
|
|
|
+
|
|
|
+ //计算总能耗
|
|
|
+ BigDecimal totalEnergy = list.stream()
|
|
|
+ .map(DyeingCalcHourVO::getEnergy)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal::add)
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+ hourLine.setEnergy(totalEnergy);
|
|
|
+
|
|
|
+ //计算A相平均电流
|
|
|
+ BigDecimal avgAmp = BigDecimal.ZERO;
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ avgAmp = list.stream()
|
|
|
+ .map(DyeingCalcHourVO::getAmp)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal::add)
|
|
|
+ .orElse(BigDecimal.ZERO)
|
|
|
+ .divide(BigDecimal.valueOf(list.size()), 2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ hourLine.setAmp(avgAmp);
|
|
|
+ insertDyeingHourLine(hourLine);
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|