package org.jeecg.modules.mdc.service.impl; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.jeecg.modules.mdc.entity.EquipmentLog; import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalInfo; import org.jeecg.modules.mdc.entity.MdcOverallEquipmentEfficiency; import org.jeecg.modules.mdc.mapper.MdcHomeMapper; import org.jeecg.modules.mdc.service.IEquipmentLogService; import org.jeecg.modules.mdc.service.IMdcEquipmentService; import org.jeecg.modules.mdc.service.IMdcHomeService; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.EquipmentDayUtilizationVo; import org.jeecg.modules.mdc.vo.MdcCommonVo; import org.jeecg.modules.mdc.vo.MdcEquipmentStatusVo; import org.jeecg.modules.system.entity.MdcProduction; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.util.*; /** * @author Lius * @date 2024/3/14 9:52 */ @Service public class IMdcHomeServiceImpl implements IMdcHomeService { @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private IEquipmentLogService equipmentLogService; @Resource private MdcHomeMapper mdcHomeMapper; /** * 设备运行状态统计 */ @Override public List getEquipmentStatusStatistics(String userId, String key) { List result = new ArrayList<>(); MdcCommonVo mdcCommonVo1 = new MdcCommonVo(); mdcCommonVo1.setName("关机"); mdcCommonVo1.setValue("0"); result.add(mdcCommonVo1); MdcCommonVo mdcCommonVo2 = new MdcCommonVo(); mdcCommonVo2.setName("报警"); mdcCommonVo2.setValue("0"); result.add(mdcCommonVo2); MdcCommonVo mdcCommonVo3 = new MdcCommonVo(); mdcCommonVo3.setName("待机"); mdcCommonVo3.setValue("0"); result.add(mdcCommonVo3); MdcCommonVo mdcCommonVo4 = new MdcCommonVo(); mdcCommonVo4.setName("运行"); mdcCommonVo4.setValue("0"); result.add(mdcCommonVo4); MdcEquipmentStatusVo mdcEquipmentStatusVo = new MdcEquipmentStatusVo(); if (StringUtils.isBlank(key)) { return result; } List equipmentIdList = mdcEquipmentService.getEquipmentIdsProduction(userId, key); if (equipmentIdList == null || equipmentIdList.isEmpty()) { return result; } List logList = equipmentLogService.getEquipmentStatusList(equipmentIdList); if (logList != null && !logList.isEmpty()) { for (EquipmentLog equipmentLog : logList) { if (equipmentLog.getOporation() != null) { switch (equipmentLog.getOporation()) { case 1: case 2: mdcEquipmentStatusVo.setWaitCount(mdcEquipmentStatusVo.getWaitCount() + 1); break; case 3: mdcEquipmentStatusVo.setRunCount(mdcEquipmentStatusVo.getRunCount() + 1); break; case 22: mdcEquipmentStatusVo.setAlarmCount(mdcEquipmentStatusVo.getAlarmCount() + 1); break; default: mdcEquipmentStatusVo.setCloseCount(mdcEquipmentStatusVo.getCloseCount() + 1); break; } } else { mdcEquipmentStatusVo.setCloseCount(mdcEquipmentStatusVo.getCloseCount() + 1); } } } result.clear(); MdcCommonVo mdcCommonVo5 = new MdcCommonVo(); mdcCommonVo5.setName("关机"); mdcCommonVo5.setValue(mdcEquipmentStatusVo.getCloseCount().toString()); result.add(mdcCommonVo5); MdcCommonVo mdcCommonVo6 = new MdcCommonVo(); mdcCommonVo6.setName("报警"); mdcCommonVo6.setValue(mdcEquipmentStatusVo.getAlarmCount().toString()); result.add(mdcCommonVo6); MdcCommonVo mdcCommonVo7 = new MdcCommonVo(); mdcCommonVo7.setName("待机"); mdcCommonVo7.setValue(mdcEquipmentStatusVo.getWaitCount().toString()); result.add(mdcCommonVo7); MdcCommonVo mdcCommonVo8 = new MdcCommonVo(); mdcCommonVo8.setName("运行"); mdcCommonVo8.setValue(mdcEquipmentStatusVo.getRunCount().toString()); result.add(mdcCommonVo8); return result; } /** * 设备利用率统计 */ @Override public List getEquipmentUtilizationStatistics(String userId, String key) { List result = new ArrayList<>(); //获取公司或厂区二级信息 List mdcProductionList = mdcHomeMapper.getProductionByPid(userId, key); if (mdcProductionList != null && !mdcProductionList.isEmpty()) { for (MdcProduction mdcProduction : mdcProductionList) { MdcCommonVo mdcCommonVo = new MdcCommonVo(); mdcCommonVo.setName(mdcProduction.getProductionName()); mdcCommonVo.setProductionCode(mdcProduction.getProductionCode()); mdcCommonVo.setProductionId(mdcProduction.getId()); //获取此层级下设备 List equipmentIdList = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcProduction.getId()); if (equipmentIdList == null || equipmentIdList.isEmpty()) { mdcCommonVo.setValue("0"); } else { String date = DateUtils.format(DateUtils.toDate(LocalDate.now().plusDays(-1).toString(), DateUtils.STR_DATE), DateUtils.STRDATE); BigDecimal processCount = mdcHomeMapper.getProcessCount(equipmentIdList, date); if (processCount == null || processCount.compareTo(BigDecimal.ZERO) == 0) { mdcCommonVo.setValue("0"); } else { mdcCommonVo.setValue(processCount.divide(new BigDecimal("86400").multiply(new BigDecimal(equipmentIdList.size())), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toString()); } } result.add(mdcCommonVo); } } return result; } /** * 设备OEE统计 */ @Override public List getEquipmentOeeStatistics(String userId, String key) { List result = new ArrayList<>(); //获取公司或厂区二级信息 List mdcProductionList = mdcHomeMapper.getProductionByPid(userId, key); if (mdcProductionList != null && !mdcProductionList.isEmpty()) { for (MdcProduction mdcProduction : mdcProductionList) { MdcCommonVo mdcCommonVo = new MdcCommonVo(); mdcCommonVo.setName(mdcProduction.getProductionName()); mdcCommonVo.setProductionCode(mdcProduction.getProductionCode()); //获取此层级下设备 List equipmentIdList = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcProduction.getId()); if (equipmentIdList == null || equipmentIdList.isEmpty()) { mdcCommonVo.setValue("0"); } else { String date = DateUtils.format(DateUtils.toDate(LocalDate.now().plusMonths(-1).toString(), DateUtils.STR_DATE), DateUtils.STR_YEAR_MONTH); BigDecimal oee = mdcHomeMapper.getOeeByDate(equipmentIdList, date); if (oee == null || oee.compareTo(BigDecimal.ZERO) == 0) { mdcCommonVo.setValue("0"); } else { mdcCommonVo.setValue(oee.divide(new BigDecimal(equipmentIdList.size()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toString()); } } result.add(mdcCommonVo); } } return result; } /** * 设备OEE和利用率统计柱状图 */ @Override public Map getEquipmentMonthStatistics(String userId, String key) { List equipmentIdList = mdcEquipmentService.getEquipmentIdsProduction(userId, key); Map result = new HashMap<>(); Date end = DateUtils.toDate(LocalDate.now().plusMonths(-1).toString(), DateUtils.STR_DATE); Date start = DateUtils.toDate(LocalDate.now().plusMonths(-12).toString(), DateUtils.STR_DATE); List monthBetween = DateUtils.getMonthBetween(start, end); List dateList = new ArrayList<>(); List utilizationList = new ArrayList<>(); List oeeList = new ArrayList<>(); for (String month : monthBetween) { //日期集合 String name = month.substring(month.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "月"; dateList.add(name); //利用率和oee MdcCommonVo mdcCommonUtilizationVo = new MdcCommonVo(); mdcCommonUtilizationVo.setName(name); MdcCommonVo mdcCommonOeeVo = new MdcCommonVo(); mdcCommonOeeVo.setName(name); if (equipmentIdList == null || equipmentIdList.isEmpty()) { mdcCommonUtilizationVo.setValue("0"); mdcCommonOeeVo.setValue("0"); } else { //利用率 Map resultMap = mdcHomeMapper.getUtilizationByMonth(equipmentIdList, month.replace("-", "")); if (resultMap != null && resultMap.get("processLong") != null) { BigDecimal processLong = BigDecimal.valueOf((Double) resultMap.get("processLong")); BigDecimal processDay = new BigDecimal((Integer) resultMap.get("processDay")); if (processLong.compareTo(BigDecimal.ZERO) == 0) { mdcCommonUtilizationVo.setValue("0"); } else { mdcCommonUtilizationVo.setValue(processLong.divide(processDay.multiply(new BigDecimal("86400")), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toString()); } } else { mdcCommonUtilizationVo.setValue("0"); } //OEE BigDecimal oee = mdcHomeMapper.getOeeByDate(equipmentIdList, month); if (oee == null || oee.compareTo(BigDecimal.ZERO) == 0) { mdcCommonOeeVo.setValue("0"); } else { mdcCommonOeeVo.setValue(oee.divide(new BigDecimal(equipmentIdList.size()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toString()); } } utilizationList.add(mdcCommonUtilizationVo); oeeList.add(mdcCommonOeeVo); } result.put("dateList", dateList); result.put("utilizationList", utilizationList); result.put("oeeList", oeeList); return result; } /** * 工段级前七天利用率折线图 */ @Override public Map getEquipmentDayUtilizationStatistics(String userId, String key) { Map result = new HashMap<>(); List equipmentIdList = mdcEquipmentService.getEquipmentIdsProduction(userId, key); //获取前七天日期集合 Date start = DateUtils.toDate(LocalDate.now().plusDays(-7).toString(), DateUtils.STR_DATE); Date end = DateUtils.toDate(LocalDate.now().plusDays(-1).toString(), DateUtils.STR_DATE); List dayBetween = DateUtils.getDatesStringList2(start, end); List dateList = new ArrayList<>(); List dataList = new ArrayList<>(); for (String date : dayBetween) { EquipmentDayUtilizationVo equipmentDayUtilizationVo = new EquipmentDayUtilizationVo(); String item = date.substring(4); if (item.startsWith("0")) { item = item.substring(1); String sub = item.substring(1); if (sub.startsWith("0")) { item = item.substring(0, 1) + "月" + sub.substring(1) + "日"; } else { item = item.substring(0, 1) + "月" + item.substring(1) + "日"; } } else { String sub = item.substring(2); if (sub.startsWith("0")) { item = item.substring(0, 2) + "月" + sub.substring(2) + "日"; } else { item = item.substring(0, 2) + "月" + item.substring(2) + "日"; } } dateList.add(item); equipmentDayUtilizationVo.setDate(item); if (equipmentIdList != null && !equipmentIdList.isEmpty()) { //获取前七天利用率数据 List mdcEquipmentStatisticalInfos = mdcHomeMapper.getEquipmentDayUtilizationStatistics(equipmentIdList, dayBetween); if (mdcEquipmentStatisticalInfos != null && !mdcEquipmentStatisticalInfos.isEmpty()) { for (MdcEquipmentStatisticalInfo mdcEquipmentStatisticalInfo : mdcEquipmentStatisticalInfos) { if (mdcEquipmentStatisticalInfo.getTheDate().equals(date)) { equipmentDayUtilizationVo.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("864"), 4, RoundingMode.HALF_UP).divide(new BigDecimal(equipmentIdList.size()), 4, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP)); if (BigDecimal.ZERO.compareTo(mdcEquipmentStatisticalInfo.getOpenLong()) == -1) { equipmentDayUtilizationVo.setOpenRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(mdcEquipmentStatisticalInfo.getOpenLong(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP)); equipmentDayUtilizationVo.setStartRate(mdcEquipmentStatisticalInfo.getOpenLong().divide(new BigDecimal("864"), 4, RoundingMode.HALF_UP).divide(new BigDecimal(equipmentIdList.size()), 4, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP)); } } } } else { dataList.add(equipmentDayUtilizationVo); } } else { dataList.add(equipmentDayUtilizationVo); } } result.put("dateList", dateList); result.put("dataList", dataList); return result; } /** * 查询设备上月OEE */ @Override public List getEquipmentOEEMonthStatistics(String userId, String key) { List result = new ArrayList<>(); List equipmentIdList = mdcEquipmentService.getEquipmentIdsProduction(userId, key); if (equipmentIdList != null && !equipmentIdList.isEmpty()) { String validDate = DateUtils.format(DateUtils.toDate(LocalDate.now().plusMonths(-1).toString(), DateUtils.STR_DATE), DateUtils.STR_YEAR_MONTH); result = mdcHomeMapper.getEquipmentOEEMonthStatistics(validDate, equipmentIdList); } return result; } }