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.MdcEquipmentDaySummary; import org.jeecg.modules.mdc.entity.MdcEquipmentMonitor; import org.jeecg.modules.mdc.service.IEquipmentAlarmService; import org.jeecg.modules.mdc.service.IMdcEquipmentDaySummaryService; 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.*; 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.Date; import java.util.HashMap; import java.util.List; import java.util.Map; 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; @Resource private IEquipmentAlarmService equipmentAlarmService; @Resource private IMdcEquipmentDaySummaryService mdcEquipmentDaySummaryService; /** * 设备状态情况 * * @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() + 1); 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); } } } } } // mes产量 MdcEquipmentDaySummary mdcEquipmentDaySummary = mdcEquipmentDaySummaryService.statisticsQty(productionId); if (mdcEquipmentDaySummary != null) { equipmentStatusOverview.setQualifiedQty(mdcEquipmentDaySummary.getQualifiedQty()); equipmentStatusOverview.setPlanQty(mdcEquipmentDaySummary.getPlanQty()); } 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 = mdcProductionList.stream().map(mdcProduction -> { 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(mdcProduction.getId(), date.replaceAll("-", "")); utilizationMonth.setUtilizationRate(utilizationRate); return utilizationMonth; }).collect(Collectors.toList()); utilizationRateDto.setUtilizationRateList(utilizationRates); return utilizationRateDto; }).collect(Collectors.toList()); //计算总厂的利用率 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.setUtilizationRateList(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 = mdcProductionList.stream().map(mdcProduction -> { UtilizationDayDto utilizationDayDto = new UtilizationDayDto(); utilizationDayDto.setProductionName(mdcProduction.getProductionName()); BigDecimal utilizationRate = mdcEquipmentStatisticalInfoService.computeUtilizationWeek(mdcProduction.getId(), date); utilizationDayDto.setUtilizationRate(utilizationRate); return utilizationDayDto; }).collect(Collectors.toList()); result.put("dataList", utilizationDayDtos); return result; } /** * 设备报警信息 * * @param productionId * @return */ @Override public List getAlarmInfo(String productionId) { return equipmentAlarmService.getAlarmInfo(productionId); } /** * 创建子生产的月度利用率 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.setUtilizationRateList(utilizationMonthList); return utilizationMonthDto; } /** * 创建总厂的月度利用率 DTO */ private UtilizationRateDto createTotalUtilizationMonthDto(String productionId, List dateLists) { UtilizationRateDto utilizationMonthDto = new UtilizationRateDto(); utilizationMonthDto.setProductionName("总厂"); List utilizationMonthList = calculateUtilizationRatesTotal(productionId, dateLists); utilizationMonthDto.setUtilizationRateList(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()); } }