package org.jeecg.modules.mdc.service.impl; import com.alipay.api.domain.NewsfeedMediaGiftInfo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.commons.lang3.StringUtils; import org.checkerframework.checker.units.qual.A; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.mdc.dto.*; import org.jeecg.modules.mdc.entity.*; import org.jeecg.modules.mdc.mapper.MdcEfficiencyReportMapper; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.*; import org.jeecg.modules.mdc.vo.MdcUtilizationRateDto; import org.jeecg.modules.system.entity.MdcProduction; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.service.IMdcProductionService; import org.jeecg.modules.system.service.ISysDepartService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; /** * @author: LiuS * @create: 2023-06-16 09:52 */ @Service public class MdcEfficiencyReportServiceImpl implements MdcEfficiencyReportService { @Resource private IMdcEquipmentService mdcEquipmentService; @Resource private MdcEfficiencyReportMapper mdcEfficiencyReportMapper; @Resource private IMdcUtilizationRateService mdcUtilizationRateService; @Resource private ISysDepartService sysDepartService; @Resource private IMdcProductionService mdcProductionService; @Resource private IMdcShiftSubService mdcShiftSubService; @Resource private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService; /** * 利用率报表 * * @param userId * @param vo * @return */ @Override public MdcEfficiencyVo efficiencyList(String userId, MdcEfficiencyReportQueryVo vo) { MdcEfficiencyVo result = new MdcEfficiencyVo(); List listDtos = new ArrayList<>(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } List dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime())); result.setDates(dates); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); } else { // 查询利用率数据 List efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo); // 利用率等级 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl"); // 封装结果 if ("2".equals(vo.getTypeTree())) { // 部门层级 List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); // 查询所有部门信息 List departList = sysDepartService.list(new LambdaQueryWrapper().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString())); for (MdcEquDepDto mdcEquDepDto : equipmentList) { MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquDepDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquDepDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquDepDto.getEquipmentType()); switch (mdcEquDepDto.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(mdcEquDepDto.getDepartName()); break; case "2": mdcEfficiencyListDto.setLevel2(mdcEquDepDto.getDepartName()); break; case "3": mdcEfficiencyListDto.setLevel3(mdcEquDepDto.getDepartName()); break; default: } SysDepart sysDepart = departList.stream().filter(depart -> depart.getId().equals(mdcEquDepDto.getParentId())).findAny().orElse(null); if (sysDepart != null) { switch (sysDepart.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(sysDepart.getDepartName()); break; case "2": mdcEfficiencyListDto.setLevel2(sysDepart.getDepartName()); break; case "3": mdcEfficiencyListDto.setLevel3(sysDepart.getDepartName()); break; default: } if (StringUtils.isNotEmpty(sysDepart.getParentId())) { departList.stream().filter(depart -> depart.getId().equals(sysDepart.getParentId())).findAny().ifPresent(depart1 -> { switch (depart1.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(depart1.getDepartName()); break; case "2": mdcEfficiencyListDto.setLevel2(depart1.getDepartName()); break; case "3": mdcEfficiencyListDto.setLevel3(depart1.getDepartName()); break; default: } }); } } List list = new ArrayList<>(); for (String date : dates) { list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } else { // 产线层级 List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); // 查询所有产线信息 List productionList = mdcProductionService.list(new LambdaQueryWrapper().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString())); for (MdcEquProDto mdcEquProDto : equipmentList) { MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquProDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquProDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquProDto.getEquipmentType()); switch (mdcEquProDto.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(mdcEquProDto.getProductionName()); break; case "2": mdcEfficiencyListDto.setLevel2(mdcEquProDto.getProductionName()); break; case "3": mdcEfficiencyListDto.setLevel3(mdcEquProDto.getProductionName()); break; default: } MdcProduction mdcProduction = productionList.stream().filter(production -> production.getId().equals(mdcEquProDto.getParentId())).findAny().orElse(null); if (mdcProduction != null) { switch (mdcProduction.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(mdcProduction.getProductionName()); break; case "2": mdcEfficiencyListDto.setLevel2(mdcProduction.getProductionName()); break; case "3": mdcEfficiencyListDto.setLevel3(mdcProduction.getProductionName()); break; default: } if (StringUtils.isNotEmpty(mdcProduction.getParentId())) { productionList.stream().filter(production -> production.getId().equals(mdcProduction.getParentId())).findAny().ifPresent(production1 -> { switch (production1.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(production1.getProductionName()); break; case "2": mdcEfficiencyListDto.setLevel2(production1.getProductionName()); break; case "3": mdcEfficiencyListDto.setLevel3(production1.getProductionName()); break; default: } }); } } List list = new ArrayList<>(); for (String date : dates) { list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } result.setMdcEfficiencyList(listDtos); } return result; } /** * 开机率报表 * * @param userId * @param vo * @return */ @Override public MdcEfficiencyVo efficiencyPOList(String userId, MdcEfficiencyReportQueryVo vo) { MdcEfficiencyVo result = new MdcEfficiencyVo(); List listDtos = new ArrayList<>(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } List dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime())); result.setDates(dates); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); } else { // 查询利用率数据 List efficiencyList = mdcEfficiencyReportMapper.efficiencyPOList(vo); // 利用率等级 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("kdl"); // 封装结果 if ("2".equals(vo.getTypeTree())) { // 部门层级 List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); // 查询所有部门信息 List departList = sysDepartService.list(new LambdaQueryWrapper().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString())); for (MdcEquDepDto mdcEquDepDto : equipmentList) { MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquDepDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquDepDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquDepDto.getEquipmentType()); switch (mdcEquDepDto.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(mdcEquDepDto.getDepartName()); break; case "2": mdcEfficiencyListDto.setLevel2(mdcEquDepDto.getDepartName()); break; case "3": mdcEfficiencyListDto.setLevel3(mdcEquDepDto.getDepartName()); break; default: } SysDepart sysDepart = departList.stream().filter(depart -> depart.getId().equals(mdcEquDepDto.getParentId())).findAny().orElse(null); if (sysDepart != null) { switch (sysDepart.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(sysDepart.getDepartName()); break; case "2": mdcEfficiencyListDto.setLevel2(sysDepart.getDepartName()); break; case "3": mdcEfficiencyListDto.setLevel3(sysDepart.getDepartName()); break; default: } if (StringUtils.isNotEmpty(sysDepart.getParentId())) { departList.stream().filter(depart -> depart.getId().equals(sysDepart.getParentId())).findAny().ifPresent(depart1 -> { switch (depart1.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(depart1.getDepartName()); break; case "2": mdcEfficiencyListDto.setLevel2(depart1.getDepartName()); break; case "3": mdcEfficiencyListDto.setLevel3(depart1.getDepartName()); break; default: } }); } } List list = new ArrayList<>(); for (String date : dates) { list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } else { // 产线层级 List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); // 查询所有产线信息 List productionList = mdcProductionService.list(new LambdaQueryWrapper().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString())); for (MdcEquProDto mdcEquProDto : equipmentList) { MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquProDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquProDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquProDto.getEquipmentType()); switch (mdcEquProDto.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(mdcEquProDto.getProductionName()); break; case "2": mdcEfficiencyListDto.setLevel2(mdcEquProDto.getProductionName()); break; case "3": mdcEfficiencyListDto.setLevel3(mdcEquProDto.getProductionName()); break; default: } MdcProduction mdcProduction = productionList.stream().filter(production -> production.getId().equals(mdcEquProDto.getParentId())).findAny().orElse(null); if (mdcProduction != null) { switch (mdcProduction.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(mdcProduction.getProductionName()); break; case "2": mdcEfficiencyListDto.setLevel2(mdcProduction.getProductionName()); break; case "3": mdcEfficiencyListDto.setLevel3(mdcProduction.getProductionName()); break; default: } if (StringUtils.isNotEmpty(mdcProduction.getParentId())) { productionList.stream().filter(production -> production.getId().equals(mdcProduction.getParentId())).findAny().ifPresent(production1 -> { switch (production1.getOrgType()) { case "1": mdcEfficiencyListDto.setLevel1(production1.getProductionName()); break; case "2": mdcEfficiencyListDto.setLevel2(production1.getProductionName()); break; case "3": mdcEfficiencyListDto.setLevel3(production1.getProductionName()); break; default: } }); } } List list = new ArrayList<>(); for (String date : dates) { list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } result.setMdcEfficiencyList(listDtos); } return result; } /** * 班次利用率报表 * * @param userId * @param vo * @return */ @Override public MdcEfficiencyShiftVo efficiencyShiftList(String userId, MdcEfficiencyReportShiftQueryVo vo) { MdcEfficiencyShiftVo result = new MdcEfficiencyShiftVo(); List listDtos = new ArrayList<>(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } List dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime())); result.setDates(dates); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); } else { // 班次利用率等级 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl"); // 班次利用率数据 List mdcEquipmentStatisticalShiftInfoList = mdcEfficiencyReportMapper.efficiencyShiftSumList(vo); // 封装结果 if ("2".equals(vo.getTypeTree())) { // 部门层级 List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); // 查询所有部门信息 List departList = sysDepartService.list(new LambdaQueryWrapper().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString())); // 班次名称显示处理 String shiftSubName = ""; if (StringUtils.isBlank(vo.getShiftId())) { // 合并设备每天所有班次的数据 shiftSubName = "全部"; } else { List mdcShiftSubList = new ArrayList<>(); if (StringUtils.isBlank(vo.getShiftSubId())) { // 拼接所选班制下的所有班次名称 mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper().eq(MdcShiftSub::getShiftId, vo.getShiftId()).eq(MdcShiftSub::getShiftSubStatus, "1")); mdcEquipmentStatisticalShiftInfoList = mdcEquipmentStatisticalShiftInfoList.stream().filter(mdcEquipmentShiftRateVo -> mdcEquipmentShiftRateVo.getShiftId().equals(vo.getShiftId())).collect(Collectors.toList()); } else { // 设置当前选择的班次名称 mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper().eq(MdcShiftSub::getId, vo.getShiftSubId()).eq(MdcShiftSub::getShiftSubStatus, "1")); mdcEquipmentStatisticalShiftInfoList = mdcEquipmentStatisticalShiftInfoList.stream().filter(mdcEquipmentShiftRateVo -> mdcEquipmentShiftRateVo.getShiftId().equals(vo.getShiftId()) && mdcEquipmentShiftRateVo.getShiftSubId().equals(vo.getShiftSubId())).collect(Collectors.toList()); } List shiftSubNames = mdcShiftSubList.stream().map(MdcShiftSub::getShiftSubName).collect(Collectors.toList()); shiftSubName = String.join(",", shiftSubNames); } // 合并同一天多班次数据 mdcEquipmentStatisticalShiftInfoList = this.handleEfficiencyShiftList(mdcEquipmentStatisticalShiftInfoList); for (MdcEquDepDto mdcEquDepDto : equipmentList) { MdcEfficiencyShiftListDto mdcEfficiencyShiftListDto = new MdcEfficiencyShiftListDto(); mdcEfficiencyShiftListDto.setEquipmentId(mdcEquDepDto.getEquipmentId()); mdcEfficiencyShiftListDto.setEquipmentName(mdcEquDepDto.getEquipmentName()); mdcEfficiencyShiftListDto.setEquipmentType(mdcEquDepDto.getEquipmentType()); mdcEfficiencyShiftListDto.setShiftSubName(shiftSubName); switch (mdcEquDepDto.getOrgType()) { case "1": mdcEfficiencyShiftListDto.setLevel1(mdcEquDepDto.getDepartName()); break; case "2": mdcEfficiencyShiftListDto.setLevel2(mdcEquDepDto.getDepartName()); break; case "3": mdcEfficiencyShiftListDto.setLevel3(mdcEquDepDto.getDepartName()); break; default: } SysDepart sysDepart = departList.stream().filter(depart -> depart.getId().equals(mdcEquDepDto.getParentId())).findAny().orElse(null); if (sysDepart != null) { switch (sysDepart.getOrgType()) { case "1": mdcEfficiencyShiftListDto.setLevel1(sysDepart.getDepartName()); break; case "2": mdcEfficiencyShiftListDto.setLevel2(sysDepart.getDepartName()); break; case "3": mdcEfficiencyShiftListDto.setLevel3(sysDepart.getDepartName()); break; default: } if (StringUtils.isNotEmpty(sysDepart.getParentId())) { departList.stream().filter(depart -> depart.getId().equals(sysDepart.getParentId())).findAny().ifPresent(depart1 -> { switch (depart1.getOrgType()) { case "1": mdcEfficiencyShiftListDto.setLevel1(depart1.getDepartName()); break; case "2": mdcEfficiencyShiftListDto.setLevel2(depart1.getDepartName()); break; case "3": mdcEfficiencyShiftListDto.setLevel3(depart1.getDepartName()); break; default: } }); } } List list = new ArrayList<>(); for (String date : dates) { list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList)); } mdcEfficiencyShiftListDto.setDataList(list); listDtos.add(mdcEfficiencyShiftListDto); } } else { // 产线层级 List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); // 查询所有产线信息 List productionList = mdcProductionService.list(new LambdaQueryWrapper().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString())); // 班次名称显示处理 String shiftSubName = ""; if (StringUtils.isBlank(vo.getShiftId())) { // 合并设备每天所有班次的数据 shiftSubName = "全部"; } else { List mdcShiftSubList = new ArrayList<>(); if (StringUtils.isBlank(vo.getShiftSubId())) { // 拼接所选班制下的所有班次名称 mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper().eq(MdcShiftSub::getShiftId, vo.getShiftId()).eq(MdcShiftSub::getShiftSubStatus, "1")); mdcEquipmentStatisticalShiftInfoList = mdcEquipmentStatisticalShiftInfoList.stream().filter(mdcEquipmentShiftRateVo -> mdcEquipmentShiftRateVo.getShiftId().equals(vo.getShiftId())).collect(Collectors.toList()); } else { // 设置当前选择的班次名称 mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper().eq(MdcShiftSub::getId, vo.getShiftSubId()).eq(MdcShiftSub::getShiftSubStatus, "1")); mdcEquipmentStatisticalShiftInfoList = mdcEquipmentStatisticalShiftInfoList.stream().filter(mdcEquipmentShiftRateVo -> mdcEquipmentShiftRateVo.getShiftId().equals(vo.getShiftId()) && mdcEquipmentShiftRateVo.getShiftSubId().equals(vo.getShiftSubId())).collect(Collectors.toList()); } List shiftSubNames = mdcShiftSubList.stream().map(MdcShiftSub::getShiftSubName).collect(Collectors.toList()); shiftSubName = String.join(",", shiftSubNames); } // 合并同一天多班次数据 mdcEquipmentStatisticalShiftInfoList = this.handleEfficiencyShiftList(mdcEquipmentStatisticalShiftInfoList); for (MdcEquProDto mdcEquProDto : equipmentList) { MdcEfficiencyShiftListDto mdcEfficiencyShiftListDto = new MdcEfficiencyShiftListDto(); mdcEfficiencyShiftListDto.setEquipmentId(mdcEquProDto.getEquipmentId()); mdcEfficiencyShiftListDto.setEquipmentName(mdcEquProDto.getEquipmentName()); mdcEfficiencyShiftListDto.setEquipmentType(mdcEquProDto.getEquipmentType()); mdcEfficiencyShiftListDto.setShiftSubName(shiftSubName); switch (mdcEquProDto.getOrgType()) { case "1": mdcEfficiencyShiftListDto.setLevel1(mdcEquProDto.getProductionName()); break; case "2": mdcEfficiencyShiftListDto.setLevel2(mdcEquProDto.getProductionName()); break; case "3": mdcEfficiencyShiftListDto.setLevel3(mdcEquProDto.getProductionName()); break; default: } MdcProduction mdcProduction = productionList.stream().filter(production -> production.getId().equals(mdcEquProDto.getParentId())).findAny().orElse(null); if (mdcProduction != null) { switch (mdcProduction.getOrgType()) { case "1": mdcEfficiencyShiftListDto.setLevel1(mdcProduction.getProductionName()); break; case "2": mdcEfficiencyShiftListDto.setLevel2(mdcProduction.getProductionName()); break; case "3": mdcEfficiencyShiftListDto.setLevel3(mdcProduction.getProductionName()); break; default: } if (StringUtils.isNotEmpty(mdcProduction.getParentId())) { productionList.stream().filter(production -> production.getId().equals(mdcProduction.getParentId())).findAny().ifPresent(production1 -> { switch (production1.getOrgType()) { case "1": mdcEfficiencyShiftListDto.setLevel1(production1.getProductionName()); break; case "2": mdcEfficiencyShiftListDto.setLevel2(production1.getProductionName()); break; case "3": mdcEfficiencyShiftListDto.setLevel3(production1.getProductionName()); break; default: } }); } } List list = new ArrayList<>(); for (String date : dates) { list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList)); } mdcEfficiencyShiftListDto.setDataList(list); listDtos.add(mdcEfficiencyShiftListDto); } } result.setMdcEfficiencyList(listDtos); } return result; } private MdcEfficiencyShiftResultDto efficiencyShiftRate(List mdcEquipmentStatisticalShiftInfoList, String date, String equipmentId, List mdcUtilizationRateList) { MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto(); if (mdcEquipmentStatisticalShiftInfoList != null && !mdcEquipmentStatisticalShiftInfoList.isEmpty()) { for (MdcEquipmentStatisticalShiftInfo equipmentStatisticalShiftInfo : mdcEquipmentStatisticalShiftInfoList) { if (date.equals(equipmentStatisticalShiftInfo.getTheDate()) && equipmentStatisticalShiftInfo.getEquipmentId().equals(equipmentId)) { mdcEfficiencyShiftResultDto.setTheDate(equipmentStatisticalShiftInfo.getTheDate()); mdcEfficiencyShiftResultDto.setProcessLong(equipmentStatisticalShiftInfo.getProcessLong()); mdcEfficiencyShiftResultDto.setUtilizationRate(equipmentStatisticalShiftInfo.getProcessLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, BigDecimal.ROUND_HALF_UP)); mdcEfficiencyShiftResultDto.setCloseLong(equipmentStatisticalShiftInfo.getCloseLong()); mdcEfficiencyShiftResultDto.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong()); mdcEfficiencyShiftResultDto.setWaitLong(equipmentStatisticalShiftInfo.getWaitLong()); mdcEfficiencyShiftResultDto.setOpenRate(equipmentStatisticalShiftInfo.getOpenLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, BigDecimal.ROUND_HALF_UP)); long rate = mdcEfficiencyShiftResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } } } else { mdcEfficiencyShiftResultDto.setTheDate(date); mdcEfficiencyShiftResultDto.setProcessLong(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setUtilizationRate(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setStartRate(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setOpenRate(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setOpenLong(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setWaitLong(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setCloseLong(new BigDecimal("0")); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } if (StringUtils.isBlank(mdcEfficiencyShiftResultDto.getColor())) { mdcEfficiencyShiftResultDto.setTheDate(date); mdcEfficiencyShiftResultDto.setProcessLong(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setUtilizationRate(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setStartRate(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setOpenRate(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setOpenLong(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setWaitLong(new BigDecimal("0")); mdcEfficiencyShiftResultDto.setCloseLong(new BigDecimal("0")); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyShiftResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } return mdcEfficiencyShiftResultDto; } /** * 合并同一天同班次数据 * * @param mdcEquipmentStatisticalShiftInfoList * @return */ private List handleEfficiencyShiftList(List mdcEquipmentStatisticalShiftInfoList) { List result = new ArrayList<>(); Map map = new HashMap<>(); for (MdcEquipmentStatisticalShiftInfo equipmentStatisticalShiftInfo : mdcEquipmentStatisticalShiftInfoList) { if (map.containsKey(equipmentStatisticalShiftInfo.getEquipmentId() + "_" + equipmentStatisticalShiftInfo.getTheDate())) { MdcEquipmentStatisticalShiftInfo vo = map.get(equipmentStatisticalShiftInfo.getEquipmentId() + "_" + equipmentStatisticalShiftInfo.getTheDate()); vo.setProcessLong(vo.getProcessLong().add(equipmentStatisticalShiftInfo.getProcessLong())); vo.setOpenLong(vo.getOpenLong().add(equipmentStatisticalShiftInfo.getOpenLong())); vo.setWaitLong(vo.getWaitLong().add(equipmentStatisticalShiftInfo.getWaitLong())); vo.setCloseLong(vo.getCloseLong().add(equipmentStatisticalShiftInfo.getCloseLong())); vo.setTotalLong(vo.getTotalLong().add(equipmentStatisticalShiftInfo.getTotalLong())); } else { map.put(equipmentStatisticalShiftInfo.getEquipmentId() + "_" + equipmentStatisticalShiftInfo.getTheDate(), equipmentStatisticalShiftInfo); } } for (String s : map.keySet()) { result.add(map.get(s)); } return result; } /** * 统计分析列表 * * @param userId * @param vo * @return */ @Override public StatisticalAnalysisVo dayStatisticalRate(String userId, MdcEfficiencyReportQueryVo vo) { StatisticalAnalysisVo result = new StatisticalAnalysisVo(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { return result; } if (!StringUtils.isNotEmpty(vo.getDateTime())) { throw new JeecgBootException("请输入查询条件时间"); } vo.setStartTime(vo.getDateTime()); vo.setEndTime(vo.getDateTime()); List efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo); if (efficiencyList == null || efficiencyList.isEmpty()) { return result; } result = this.efficiencyStatisticalRate(efficiencyList); if (result.getOpenRate().compareTo(new BigDecimal("0")) > 0) { result.setOpenRate(result.getOpenRate().multiply(new BigDecimal("100")).divide(new BigDecimal(vo.getEquipmentIdList().size()), 2, BigDecimal.ROUND_HALF_UP)); } if (result.getUtilizationRate().compareTo(new BigDecimal("0")) > 0) { result.setUtilizationRate(result.getUtilizationRate().multiply(new BigDecimal(100)).divide(new BigDecimal(vo.getEquipmentIdList().size()), 2, BigDecimal.ROUND_HALF_UP)); } if (result.getOpenLong().compareTo(new BigDecimal(0)) > 0 && result.getProcessLong().compareTo(new BigDecimal(0)) > 0) { result.setUsedOpenRate(result.getProcessLong().divide(result.getOpenLong(), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100))); } return result; } /** * 对比分析 */ @Override public ComparativeAnalysisDto comparativeAnalysis(String userId, ComparativeAnalysisQueryVo vo) { ComparativeAnalysisDto result = new ComparativeAnalysisDto(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { return result; } // 查询原始数据 List resultDtos = mdcEfficiencyReportMapper.comparativeAnalysis(vo); if (resultDtos != null && !resultDtos.isEmpty()) { // 组装图形和仪表数据 List graphicsDtos = new ArrayList<>(); // 获取天数 long days = ChronoUnit.DAYS.between(LocalDate.parse(vo.getStartTime(), DateTimeFormatter.ofPattern("yyyyMMdd")), LocalDate.parse(vo.getEndTime(), DateTimeFormatter.ofPattern("yyyyMMdd"))) + 1; BigDecimal time = new BigDecimal("24").multiply(new BigDecimal(days)).multiply(new BigDecimal("60")).multiply(new BigDecimal("60")); for (MdcComAnaDto mdcComAnaDto : resultDtos) { GraphicsDto graphicsDto = new GraphicsDto(); graphicsDto.setEquipmentId(mdcComAnaDto.getEquipmentId()); graphicsDto.setCloseLong(mdcComAnaDto.getCloseLong()); graphicsDto.setOpenLong(mdcComAnaDto.getOpenLong()); // 24小时利用率 = 加工时间/24 graphicsDto.setUtilizationRate(mdcComAnaDto.getProcessLong().divide(time, 6, BigDecimal.ROUND_HALF_UP)); // 开机率 = 开机时间 / 24 graphicsDto.setOpenRate(mdcComAnaDto.getOpenLong().divide(time, 6, BigDecimal.ROUND_HALF_UP)); graphicsDtos.add(graphicsDto); } result.setGraphics(graphicsDtos); List tops = new ArrayList<>(); List lasts = new ArrayList<>(); graphicsDtos.stream().sorted(Comparator.comparing(GraphicsDto::getUtilizationRate)).limit(5).forEach(graphicsDto -> { UtilizationRateDto utilizationRateDto = new UtilizationRateDto(); utilizationRateDto.setEquipmentId(graphicsDto.getEquipmentId()); utilizationRateDto.setUtilizationRate(graphicsDto.getUtilizationRate()); lasts.add(utilizationRateDto); }); graphicsDtos.stream().sorted(Comparator.comparing(GraphicsDto::getUtilizationRate).reversed()).limit(5).forEach(graphicsDto -> { UtilizationRateDto utilizationRateDto = new UtilizationRateDto(); utilizationRateDto.setEquipmentId(graphicsDto.getEquipmentId()); utilizationRateDto.setUtilizationRate(graphicsDto.getUtilizationRate()); tops.add(utilizationRateDto); }); MeterDto meterDto = new MeterDto(); meterDto.setTops(tops); meterDto.setLasts(lasts); result.setMeters(meterDto); // 组装饼图数据 PieChartDto pieChartDto = new PieChartDto(); BigDecimal openLong = new BigDecimal("0"); BigDecimal closeLong = new BigDecimal("0"); BigDecimal waitLong = new BigDecimal("0"); BigDecimal processLong = new BigDecimal("0"); for (MdcComAnaDto resultDto : resultDtos) { openLong = openLong.add(resultDto.getOpenLong()); closeLong = closeLong.add(resultDto.getCloseLong()); waitLong = waitLong.add(resultDto.getWaitLong()); processLong = processLong.add(resultDto.getProcessLong()); } // 开机率 = 开机时长 / (24 × 天数 × 个数) pieChartDto.setOpenRate(openLong.divide(time.multiply(new BigDecimal(resultDtos.size())), 6, BigDecimal.ROUND_HALF_UP)); // 关机率 = 1 - 开机率 pieChartDto.setCloseRate(new BigDecimal("1").subtract(pieChartDto.getOpenRate())); // 加工率 = 加工时间 / (24 × 天数 × 个数) pieChartDto.setProcessRate(processLong.divide(time.multiply(new BigDecimal(resultDtos.size())), 6, BigDecimal.ROUND_HALF_UP)); // 待机率 = 开机率 - 加工率 pieChartDto.setWaitRate(pieChartDto.getOpenRate().subtract(pieChartDto.getProcessRate())); result.setPieCharts(pieChartDto); } return result; } /** * 设备日利用率 * * @param vo * @return */ @Override public DayUtilizationRateDto dayUtilizationRate(String userId, DayUtilizationRateQueryVo vo) { DayUtilizationRateDto result = new DayUtilizationRateDto(); if (StringUtils.isBlank(vo.getEquipmentId())) { List equipmentIds; // 获取用户拥有设备权限 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } if (equipmentIds != null && !equipmentIds.isEmpty()) { vo.setEquipmentId(equipmentIds.get(0)); } } result.setEquipmentId(vo.getEquipmentId()); MdcEquipment mdcEquipment = mdcEquipmentService.getOne(new LambdaQueryWrapper().eq(MdcEquipment::getEquipmentId, vo.getEquipmentId())); result.setEquipmentName(mdcEquipment.getEquipmentName()); List dateList = new ArrayList<>(); for (int i = 1; i <= 24 / vo.getTimeType(); i++) { if (i * vo.getTimeType() < 10) { dateList.add("0" + i * vo.getTimeType() + ":00"); } else { dateList.add(i * vo.getTimeType() + ":00"); } } dateList.add(0, "00:00"); List dayRateDtoList = new ArrayList<>(); for (int i = 0; i < dateList.size() - 1; i++) { DayRateDto dayRateDto = new DayRateDto(); dayRateDto.setDateTime(dateList.get(i + 1)); String dateTime = DateUtils.dateConvertion(vo.getDateTime()); Date startTime = DateUtils.toDate(dateTime + " " + dateList.get(i) + ":00", DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(dateTime + " " + dateList.get(i + 1) + ":00", DateUtils.STR_DATE_TIME_SMALL); List runningSections = mdcEquipmentRunningSectionService.listEquipmentRunningSection(vo.getEquipmentId(), startTime.getTime(), endTime.getTime()); if (runningSections != null && !runningSections.isEmpty()) { // 时间修正 runningSections.get(0).setStartTime(startTime); if (runningSections.size() > 1) { runningSections.get(runningSections.size() - 1).setEndTime(endTime); } else { runningSections.get(0).setEndTime(endTime); } // 利用率计算 BigDecimal processLong = new BigDecimal("0"); for (MdcEquipmentRunningSection runningSection : runningSections) { if (runningSection.getStatus() == 3) { long duration = DateUtils.differentSecond(runningSection.getStartTime(), runningSection.getEndTime()); processLong = processLong.add(new BigDecimal(duration)); } } BigDecimal totalLong = new BigDecimal(vo.getTimeType()).multiply(new BigDecimal("60")).multiply(new BigDecimal("60")); BigDecimal utilizationRate = processLong.divide(totalLong, 6, BigDecimal.ROUND_HALF_UP); dayRateDto.setUtilizationRate(utilizationRate); } else { dayRateDto.setUtilizationRate(new BigDecimal("0")); } dayRateDtoList.add(dayRateDto); } dateList.remove(0); result.setDateList(dateList); result.setDayRateDto(dayRateDtoList); return result; } /** * 设备日利用率对比分析 * * @param userId * @param vo * @return */ @Override public DayUtilizationRateDto dayUtilizationRateContrast(String userId, DayUtilizationRateContrastQueryVo vo) { DayUtilizationRateDto result = new DayUtilizationRateDto(); if (StringUtils.isBlank(vo.getEquipmentId())) { List equipmentIds; // 获取用户拥有设备权限 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } if (equipmentIds != null && !equipmentIds.isEmpty()) { vo.setEquipmentId(equipmentIds.get(0)); } } result.setEquipmentId(vo.getEquipmentId()); MdcEquipment mdcEquipment = mdcEquipmentService.getOne(new LambdaQueryWrapper().eq(MdcEquipment::getEquipmentId, vo.getEquipmentId())); result.setEquipmentName(mdcEquipment.getEquipmentName()); Date start = DateUtils.toDate(vo.getStartDate(), DateUtils.STRDATE); Date end = DateUtils.toDate(vo.getEndDate(), DateUtils.STRDATE); List dateList = DateUtils.getDatesStringLists(start, end); result.setDateList(dateList); List datesStringList = DateUtils.getDatesStringList(start, end); List dayRateDtoList = new ArrayList<>(); for (String date : datesStringList) { DayRateDto dayRateDto = new DayRateDto(); String format = DateUtils.format(DateUtils.toDate(date, DateUtils.STR_DATE), DateUtils.STR_MMDD); dayRateDto.setDateTime(format); Date startTime = DateUtils.toDate(date + " " + vo.getStartTime() + ":00", DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(date + " " + vo.getEndTime() + ":00", DateUtils.STR_DATE_TIME_SMALL); List runningSections = mdcEquipmentRunningSectionService.listEquipmentRunningSection(vo.getEquipmentId(), startTime.getTime(), endTime.getTime()); if (runningSections != null && !runningSections.isEmpty()) { //时间修正 runningSections.get(0).setStartTime(startTime); if (runningSections.size() > 1) { runningSections.get(runningSections.size() - 1).setEndTime(endTime); } else { runningSections.get(0).setEndTime(endTime); } // 利用率计算 BigDecimal processLong = new BigDecimal("0"); for (MdcEquipmentRunningSection runningSection : runningSections) { if (runningSection.getStatus() == 3) { long duration = DateUtils.differentSecond(runningSection.getStartTime(), runningSection.getEndTime()); processLong = processLong.add(new BigDecimal(duration)); } } BigDecimal totalLong = new BigDecimal(DateUtils.differentSecond(startTime, endTime)); BigDecimal utilizationRate = processLong.divide(totalLong, 6, BigDecimal.ROUND_HALF_UP); dayRateDto.setUtilizationRate(utilizationRate); } else { dayRateDto.setUtilizationRate(new BigDecimal("0")); } dayRateDtoList.add(dayRateDto); } result.setDayRateDto(dayRateDtoList); return result; } /** * 设备利用率分段分析 * * @param userId * @param vo * @return */ @Override public MdcUtilizationRateDto utilizationRateSectionAnalyze(String userId, DayUtilizationRateContrastQueryVo vo) { MdcUtilizationRateDto result = new MdcUtilizationRateDto(); List listDtos = new ArrayList<>(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } List dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartDate()), DateUtils.getShortDate2(vo.getEndDate())); List dateList = DateUtils.getDatesStringList(DateUtils.getShortDate2(vo.getStartDate()), DateUtils.getShortDate2(vo.getEndDate())); result.setDates(dates); String startString = vo.getStartTime(); String endString = vo.getEndTime(); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); } else { // 利用率等级 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl"); if ("2".equals(vo.getTypeTree())) { // 部门层级 List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); for (MdcEquDepDto mdcEquDepDto : equipmentList) { MdcUtilizationRateListDto mdcUtilizationRateListDto = new MdcUtilizationRateListDto(); mdcUtilizationRateListDto.setEquipmentId(mdcEquDepDto.getEquipmentId()); mdcUtilizationRateListDto.setEquipmentName(mdcEquDepDto.getEquipmentName()); mdcUtilizationRateListDto.setEquipmentType(mdcEquDepDto.getEquipmentType()); // List list = new ArrayList<>(); for (String date : dateList) { Date startTime = DateUtils.toDate(date + " " + startString + ":00", DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(date + " " + endString + ":00", DateUtils.STR_DATE_TIME_SMALL); list.add(this.utilizationRate(mdcEquDepDto.getEquipmentId(), mdcEquDepDto.getEquipmentName(), mdcEquDepDto.getEquipmentType(), startTime, endTime, date, mdcUtilizationRateList)); } mdcUtilizationRateListDto.setDataList(list); listDtos.add(mdcUtilizationRateListDto); } } else { // 产线层级 List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); for (MdcEquProDto mdcEquProDto : equipmentList) { MdcUtilizationRateListDto mdcEfficiencyListDto = new MdcUtilizationRateListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquProDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquProDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquProDto.getEquipmentType()); // List list = new ArrayList<>(); for (String date : dateList) { Date startTime = DateUtils.toDate(date + " " + startString + ":00", DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(date + " " + endString + ":00", DateUtils.STR_DATE_TIME_SMALL); list.add(this.utilizationRate(mdcEquProDto.getEquipmentId(), mdcEquProDto.getEquipmentName(), mdcEquProDto.getEquipmentType(), startTime, endTime, date, mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } result.setMdcEfficiencyList(listDtos); } return result; } /** * 设备利用率走势分析 * * @param userId * @param vo * @return */ @Override public MdcUtilizationRateDto utilizationRateTrendAnalyze(String userId, DayUtilizationRateContrastQueryVo vo) { MdcUtilizationRateDto result = new MdcUtilizationRateDto(); List listDtos = new ArrayList<>(); List equipmentIds = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { // 单台设备信息 vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); } else { // 查询用户拥有的所有设备信息 if ("2".equals(vo.getTypeTree())) { // 部门层级 equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); } else { // 产线层级 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } List dateList = DateUtils.getDatesStringList(DateUtils.getShortDate2(vo.getStartDate()), DateUtils.getShortDate2(vo.getEndDate())); result.setDates(dateList); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); } else { // 利用率等级 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl"); if ("2".equals(vo.getTypeTree())) { // 部门层级 List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); for (MdcEquDepDto mdcEquDepDto : equipmentList) { MdcUtilizationRateListDto mdcEfficiencyListDto = new MdcUtilizationRateListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquDepDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquDepDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquDepDto.getEquipmentType()); List list = new ArrayList<>(); for (String date : dateList) { Date startTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL); endTime = DateUtils.addDays(endTime, 1); list.add(this.utilizationRate(mdcEquDepDto.getEquipmentId(), mdcEquDepDto.getEquipmentName(), mdcEquDepDto.getEquipmentType(), startTime, endTime, date, mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } else { // 产线层级 List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); for (MdcEquProDto mdcEquProDto : equipmentList) { MdcUtilizationRateListDto mdcEfficiencyListDto = new MdcUtilizationRateListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquProDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquProDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquProDto.getEquipmentType()); List list = new ArrayList<>(); for (String date : dateList) { Date startTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(date + " 00:00:00", DateUtils.STR_DATE_TIME_SMALL); endTime = DateUtils.addDays(endTime, 1); list.add(this.utilizationRate(mdcEquProDto.getEquipmentId(), mdcEquProDto.getEquipmentName(), mdcEquProDto.getEquipmentType(), startTime, endTime, date, mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } result.setMdcEfficiencyList(listDtos); } return result; } private MdcUtilizationResultDto utilizationRate(String equipmentId, String equipmentName, String equipmentType, Date startTime, Date endTime, String date, List mdcUtilizationRateList) { MdcUtilizationResultDto dto = new MdcUtilizationResultDto(); dto.setEquipmentId(equipmentId); dto.setEquipmentName(equipmentName); dto.setEquipmentType(equipmentType); dto.setTheDate(date); List runningSections = mdcEquipmentRunningSectionService.listEquipmentRunningSection(equipmentId, startTime.getTime(), endTime.getTime()); if (runningSections != null && !runningSections.isEmpty()) { // 时间修正 runningSections.get(0).setStartTime(startTime); if (runningSections.size() > 1) { runningSections.get(runningSections.size() - 1).setEndTime(endTime); } else { runningSections.get(0).setEndTime(endTime); } // 利用率计算 BigDecimal processLong = new BigDecimal("0"); for (MdcEquipmentRunningSection runningSection : runningSections) { if (runningSection.getStatus() == 3) { long duration = DateUtils.differentSecond(runningSection.getStartTime(), runningSection.getEndTime()); processLong = processLong.add(new BigDecimal(duration)); } } BigDecimal totalLong = new BigDecimal(DateUtils.differentSecond(startTime, endTime)); BigDecimal utilizationRate = processLong.divide(totalLong, 6, BigDecimal.ROUND_HALF_UP); dto.setUtilizationRate(utilizationRate); } else { dto.setUtilizationRate(new BigDecimal("0")); } long rate = dto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { dto.setColor(mdcUtilizationRate.getRateParameterColor()); } } return dto; } private StatisticalAnalysisVo efficiencyStatisticalRate(List efficiencyList) { StatisticalAnalysisVo vo = new StatisticalAnalysisVo(); for (MdcEfficiencyDto mdcEfficiencyDto : efficiencyList) { vo.setUtilizationRate(vo.getUtilizationRate().add(mdcEfficiencyDto.getUtilizationRate())); vo.setOpenRate(vo.getOpenRate().add(mdcEfficiencyDto.getOpenRate())); vo.setOpenLong(vo.getOpenLong().add(mdcEfficiencyDto.getOpenLong())); vo.setProcessLong(vo.getProcessLong().add(mdcEfficiencyDto.getProcessLong())); vo.setWaitLong(vo.getWaitLong().add(mdcEfficiencyDto.getWaitLong())); vo.setCloseLong(vo.getCloseLong().add(mdcEfficiencyDto.getCloseLong())); } return vo; } private MdcEfficiencyResultDto efficiencyRate(List efficiencyList, String date, String equipmentId, List mdcUtilizationRateList) { MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto(); if (efficiencyList != null && !efficiencyList.isEmpty()) { for (MdcEfficiencyDto efficiencyDto : efficiencyList) { if (date.equals(efficiencyDto.getTheDate()) && efficiencyDto.getEquipmentId().equals(equipmentId)) { mdcEfficiencyResultDto.setTheDate(efficiencyDto.getTheDate()); mdcEfficiencyResultDto.setProcessLong(efficiencyDto.getProcessLong()); mdcEfficiencyResultDto.setUtilizationRate(efficiencyDto.getUtilizationRate()); mdcEfficiencyResultDto.setStartRate(efficiencyDto.getStartRate()); mdcEfficiencyResultDto.setOpenRate(efficiencyDto.getOpenRate()); mdcEfficiencyResultDto.setOpenLong(efficiencyDto.getOpenLong()); mdcEfficiencyResultDto.setWaitLong(efficiencyDto.getWaitLong()); mdcEfficiencyResultDto.setCloseLong(efficiencyDto.getCloseLong()); long rate = efficiencyDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } } } else { mdcEfficiencyResultDto.setTheDate(date); mdcEfficiencyResultDto.setProcessLong(new BigDecimal("0")); mdcEfficiencyResultDto.setUtilizationRate(new BigDecimal("0")); mdcEfficiencyResultDto.setStartRate(new BigDecimal("0")); mdcEfficiencyResultDto.setOpenRate(new BigDecimal("0")); mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0")); mdcEfficiencyResultDto.setWaitLong(new BigDecimal("0")); mdcEfficiencyResultDto.setCloseLong(new BigDecimal("0")); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } if (StringUtils.isBlank(mdcEfficiencyResultDto.getColor())) { mdcEfficiencyResultDto.setTheDate(date); mdcEfficiencyResultDto.setProcessLong(new BigDecimal("0")); mdcEfficiencyResultDto.setUtilizationRate(new BigDecimal("0")); mdcEfficiencyResultDto.setStartRate(new BigDecimal("0")); mdcEfficiencyResultDto.setOpenRate(new BigDecimal("0")); mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0")); mdcEfficiencyResultDto.setWaitLong(new BigDecimal("0")); mdcEfficiencyResultDto.setCloseLong(new BigDecimal("0")); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } return mdcEfficiencyResultDto; } }