package org.jeecg.modules.screen.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.vo.DictModel; import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor; import org.jeecg.modules.mdc.service.IMdcEquipmentService; import org.jeecg.modules.mdc.service.IMdcEquipmentStatisticalInfoService; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.screen.dto.EquipmentStatusOverview; import org.jeecg.modules.screen.dto.UtilizationDayDto; import org.jeecg.modules.screen.dto.UtilizationRate; import org.jeecg.modules.screen.dto.UtilizationRateDto; import org.jeecg.modules.screen.service.MdcLargeScreenService; import org.jeecg.modules.system.entity.MdcProduction; import org.jeecg.modules.system.service.IMdcProductionService; import org.jeecg.modules.system.service.ISysDictService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; /** * @Author: Lius * @CreateTime: 2025-02-28 * @Description: */ @Service public class MdcLargeScreenServiceImpl implements MdcLargeScreenService { @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private ISysDictService sysDictService; @Resource private IMdcProductionService mdcProductionService; @Resource private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService; /** * 设备状态情况 * * @param productionId * @return */ @Override public EquipmentStatusOverview equipmentStatusOverview(String productionId) { EquipmentStatusOverview equipmentStatusOverview = new EquipmentStatusOverview(); List equipmentMonitorList = mdcEquipmentService.getEquipmentMonitorList(productionId); if (equipmentMonitorList != null && !equipmentMonitorList.isEmpty()) { equipmentStatusOverview.setEquipmentCount(equipmentMonitorList.size()); for (MdcEquipmentMonitor mdcEquipmentMonitor : equipmentMonitorList) { if (mdcEquipmentMonitor.getEquipmentStatus() == 0) { if (mdcEquipmentMonitor.getOporation() != null) { switch (mdcEquipmentMonitor.getOporation()) { case 1: case 2: equipmentStatusOverview.setWaitCount(equipmentStatusOverview.getWaitCount() + 1); break; case 3: equipmentStatusOverview.setRunCount(equipmentStatusOverview.getRunCount()); break; case 22: equipmentStatusOverview.setErrorCount(equipmentStatusOverview.getErrorCount() + 1); break; default: equipmentStatusOverview.setCloseCount(equipmentStatusOverview.getCloseCount() + 1); break; } } else { equipmentStatusOverview.setCloseCount(equipmentStatusOverview.getCloseCount() + 1); mdcEquipmentMonitor.setOporation(0); } } else { List dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_STATUS); for (DictModel dictModel : dictList) { if (Integer.valueOf(dictModel.getValue()).equals(mdcEquipmentMonitor.getEquipmentStatus())) { equipmentStatusOverview.setRepairCount(equipmentStatusOverview.getRepairCount() + 1); } } } } } return equipmentStatusOverview; } /** * 设备月利用率趋势 * * @param productionId * @return */ @Override public Map monthUtilizationTendency(String productionId) { Map result = new HashMap<>(); // 获取子生产列表 List mdcProductionList = mdcProductionService.list( new LambdaQueryWrapper().eq(MdcProduction::getParentId, productionId) ); if (mdcProductionList == null || mdcProductionList.isEmpty()) { return result; } // 生成月度日期范围 List dateLists = DateUtils.generateMonthlyDateRanges(DateUtils.format(new Date(), DateUtils.STRDATE)); List dateList = dateLists.stream() .map(array -> array[2]) // 提取月份名称 .collect(Collectors.toList()); result.put("dateList", dateList); // 计算每个子生产的月度利用率 List utilizationMonthDtoList = mdcProductionList.stream() .map(mdcProduction -> createUtilizationMonthDto(mdcProduction, dateLists)) .collect(Collectors.toList()); // 计算总厂的月度利用率 UtilizationRateDto totalUtilizationMonthDto = createTotalUtilizationMonthDto(productionId, dateLists); utilizationMonthDtoList.add(totalUtilizationMonthDto); result.put("dataList", utilizationMonthDtoList); return result; } /** * 设备周利用率趋势 * * @param productionId * @return */ @Override public Map weekUtilizationTendency(String productionId) { Map result = new HashMap<>(); // 获取子生产列表 List mdcProductionList = mdcProductionService.list( new LambdaQueryWrapper().eq(MdcProduction::getParentId, productionId) ); if (mdcProductionList == null || mdcProductionList.isEmpty()) { return result; } // 生成周范围 List dateList = DateUtils.getNearWeek(); result.put("dateList", dateList); // 计算每个工段的利用率 List utilizationMonthDtoList = new ArrayList<>(); for (MdcProduction mdcProduction : mdcProductionList) { UtilizationRateDto utilizationRateDto = new UtilizationRateDto(); utilizationRateDto.setProductionId(mdcProduction.getId()); utilizationRateDto.setProductionName(mdcProduction.getProductionName()); List utilizationRates = dateList.stream() .map(date -> { UtilizationRate utilizationMonth = new UtilizationRate(); utilizationMonth.setDate(date); BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeek(productionId, date.replaceAll("-", "")); utilizationMonth.setUtilizationRate(utilizationRate); return utilizationMonth; }) .collect(Collectors.toList()); utilizationRateDto.setUtilizationMonthList(utilizationRates); utilizationMonthDtoList.add(utilizationRateDto); } //计算总厂的利用率 UtilizationRateDto utilizationRateDto = new UtilizationRateDto(); utilizationRateDto.setProductionName("总厂"); List utilizationRates = dateList.stream() .map(date -> { UtilizationRate utilizationMonth = new UtilizationRate(); utilizationMonth.setDate(date); BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeekTotal(productionId, date.replaceAll("-", "")); utilizationMonth.setUtilizationRate(utilizationRate); return utilizationMonth; }) .collect(Collectors.toList()); utilizationRateDto.setUtilizationMonthList(utilizationRates); utilizationMonthDtoList.add(utilizationRateDto); result.put("dataList", utilizationMonthDtoList); return result; } /** * 设备日利用率 * * @param productionId * @return */ @Override public Map dayUtilizationTendency(String productionId) { Map result = new HashMap<>(); // 获取子生产列表 List mdcProductionList = mdcProductionService.list( new LambdaQueryWrapper().eq(MdcProduction::getParentId, productionId) ); if (mdcProductionList == null || mdcProductionList.isEmpty()) { return result; } List productionList = mdcProductionList.stream().map(MdcProduction::getProductionName).collect(Collectors.toList()); result.put("productionList", productionList); String date = LocalDate.now().minusDays(1).toString().replaceAll("-", ""); List utilizationDayDtos = new ArrayList<>(); for (MdcProduction mdcProduction : mdcProductionList) { UtilizationDayDto utilizationDayDto = new UtilizationDayDto(); utilizationDayDto.setProductionName(mdcProduction.getProductionName()); BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeekTotal(mdcProduction.getId(), date); utilizationDayDto.setUtilizationRate(utilizationRate); utilizationDayDtos.add(utilizationDayDto); } result.put("dataList", utilizationDayDtos); return result; } /** * 创建子生产的月度利用率 DTO */ private UtilizationRateDto createUtilizationMonthDto(MdcProduction mdcProduction, List dateLists) { UtilizationRateDto utilizationMonthDto = new UtilizationRateDto(); utilizationMonthDto.setProductionId(mdcProduction.getId()); utilizationMonthDto.setProductionName(mdcProduction.getProductionName()); List utilizationMonthList = calculateUtilizationRates(mdcProduction.getId(), dateLists); utilizationMonthDto.setUtilizationMonthList(utilizationMonthList); return utilizationMonthDto; } /** * 创建总厂的月度利用率 DTO */ private UtilizationRateDto createTotalUtilizationMonthDto(String productionId, List dateLists) { UtilizationRateDto utilizationMonthDto = new UtilizationRateDto(); utilizationMonthDto.setProductionName("总厂"); List utilizationMonthList = calculateUtilizationRatesTotal(productionId, dateLists); utilizationMonthDto.setUtilizationMonthList(utilizationMonthList); return utilizationMonthDto; } /** * 计算子生产的月度利用率 */ private List calculateUtilizationRates(String productionId, List dateLists) { return dateLists.stream() .map(dates -> { UtilizationRate utilizationMonth = new UtilizationRate(); utilizationMonth.setDate(dates[2]); BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationMonth(productionId, dates[0], dates[1]); utilizationMonth.setUtilizationRate(utilizationRate); return utilizationMonth; }) .collect(Collectors.toList()); } /** * 计算总厂的月度利用率 */ private List calculateUtilizationRatesTotal(String productionId, List dateLists) { return dateLists.stream() .map(dates -> { UtilizationRate utilizationMonth = new UtilizationRate(); utilizationMonth.setDate(dates[2]); BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationMonthTotal(productionId, dates[0], dates[1]); utilizationMonth.setUtilizationRate(utilizationRate); return utilizationMonth; }) .collect(Collectors.toList()); } }