package org.jeecg.modules.mdc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.vo.LoginUser; 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.CustomExcelView; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.MdcUtilizationRateDto; import org.jeecg.modules.mdc.vo.*; 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.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; 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; @Resource private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService; /** * 利用率报表 * * @param userId * @param vo * @return */ @Override public MdcEfficiencyVo efficiencyList(String userId, MdcEfficiencyReportQueryVo vo) { MdcEfficiencyVo result = new MdcEfficiencyVo(); List listDtos = new ArrayList<>(); // 获取设备 ID 列表 List equipmentIds = getEquipmentIds(userId, vo); 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); // 获取设备利用率列表 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl"); // 如果设备 ID 列表为空,直接返回 if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); return result; } // 获取设备 ID 列表 List equipmentIdList = mdcEquipmentService.listEquipmentId(vo); if (equipmentIdList == null || equipmentIdList.isEmpty()) { result.setMdcEfficiencyList(listDtos); return result; } vo.setEquipmentIdList(equipmentIdList); // 查询设备效率数据 List efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo); // 根据类型树处理不同的层级 if ("2".equals(vo.getTypeTree())) { // 部门层级 listDtos = processDepartmentLevel(vo, efficiencyList, dates, mdcUtilizationRateList); } else { // 产线层级 listDtos = processProductionLevel(vo, efficiencyList, dates, mdcUtilizationRateList); } result.setMdcEfficiencyList(listDtos); // 添加合计值和平均值 addSummaryAndAverage(result, listDtos, mdcUtilizationRateList); return result; } /** * 获取设备 ID 列表 */ private List getEquipmentIds(String userId, MdcEfficiencyReportQueryVo vo) { if (StringUtils.isNotEmpty(vo.getParentId()) && StringUtils.isEmpty(vo.getEquipmentId())) { return "2".equals(vo.getTypeTree()) ? mdcEquipmentService.getEquipmentIdsByDepart(userId, vo.getParentId()) : mdcEquipmentService.getEquipmentIdsProduction(userId, vo.getParentId()); } else if (StringUtils.isNotEmpty(vo.getEquipmentId())) { vo.setEquipmentIdList(Collections.singletonList(vo.getEquipmentId())); return Collections.emptyList(); } else { return "2".equals(vo.getTypeTree()) ? mdcEquipmentService.getEquipmentIdsByDepart(userId, null) : mdcEquipmentService.getEquipmentIdsProduction(userId, null); } } /** * 处理部门层级 */ private List processDepartmentLevel(MdcEfficiencyReportQueryVo vo, List efficiencyList, List dates, List mdcUtilizationRateList) { List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); List departList = sysDepartService.list(new LambdaQueryWrapper() .ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()) .orderByAsc(SysDepart::getDepartOrder)); return equipmentList.stream().map(mdcEquDepDto -> { MdcEfficiencyListDto mdcEfficiencyListDto = createEfficiencyListDto(mdcEquDepDto); setDepartmentLevels(mdcEfficiencyListDto, mdcEquDepDto, departList); mdcEfficiencyListDto.setDataList(processEfficiencyData(efficiencyList, dates, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList)); return mdcEfficiencyListDto; }).collect(Collectors.toList()); } /** * 处理产线层级 */ private List processProductionLevel(MdcEfficiencyReportQueryVo vo, List efficiencyList, List dates, List mdcUtilizationRateList) { List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); List productionList = mdcProductionService.list(new LambdaQueryWrapper() .ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()) .orderByAsc(MdcProduction::getProductionOrder)); return equipmentList.stream().map(mdcEquProDto -> { MdcEfficiencyListDto mdcEfficiencyListDto = createEfficiencyListDto(mdcEquProDto); setProductionLevels(mdcEfficiencyListDto, mdcEquProDto, productionList); mdcEfficiencyListDto.setDataList(processEfficiencyData(efficiencyList, dates, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList)); return mdcEfficiencyListDto; }).collect(Collectors.toList()); } /** * 创建 MdcEfficiencyListDto 对象 */ private MdcEfficiencyListDto createEfficiencyListDto(MdcEquDepDto mdcEquDepDto) { MdcEfficiencyListDto dto = new MdcEfficiencyListDto(); dto.setEquipmentId(mdcEquDepDto.getEquipmentId()); dto.setEquipmentName(mdcEquDepDto.getEquipmentName()); dto.setEquipmentType(mdcEquDepDto.getEquipmentType()); dto.setEquipmentModel(mdcEquDepDto.getEquipmentModel()); return dto; } private MdcEfficiencyListDto createEfficiencyListDto(MdcEquProDto mdcEquProDto) { MdcEfficiencyListDto dto = new MdcEfficiencyListDto(); dto.setEquipmentId(mdcEquProDto.getEquipmentId()); dto.setEquipmentName(mdcEquProDto.getEquipmentName()); dto.setEquipmentType(mdcEquProDto.getEquipmentType()); dto.setEquipmentModel(mdcEquProDto.getEquipmentModel()); return dto; } /** * 设置部门层级信息 */ private void setDepartmentLevels(MdcEfficiencyListDto dto, MdcEquDepDto mdcEquDepDto, List departList) { switch (mdcEquDepDto.getOrgType()) { case "1": dto.setLevel1(mdcEquDepDto.getDepartName()); break; case "2": dto.setLevel2(mdcEquDepDto.getDepartName()); break; case "3": dto.setLevel3(mdcEquDepDto.getDepartName()); break; } Optional sysDepart = departList.stream().filter(depart -> depart.getId().equals(mdcEquDepDto.getParentId())).findAny(); sysDepart.ifPresent(depart -> { switch (depart.getOrgType()) { case "1": dto.setLevel1(depart.getDepartName()); break; case "2": dto.setLevel2(depart.getDepartName()); break; case "3": dto.setLevel3(depart.getDepartName()); break; } if (StringUtils.isNotEmpty(depart.getParentId())) { departList.stream().filter(d -> d.getId().equals(depart.getParentId())).findAny().ifPresent(parent -> { switch (parent.getOrgType()) { case "1": dto.setLevel1(parent.getDepartName()); break; case "2": dto.setLevel2(parent.getDepartName()); break; case "3": dto.setLevel3(parent.getDepartName()); break; } }); } }); } /** * 设置部门层级信息 */ private void setProductionLevels(MdcEfficiencyListDto dto, MdcEquProDto mdcEquProDto, List productionList) { switch (mdcEquProDto.getOrgType()) { case "1": dto.setLevel1(mdcEquProDto.getProductionName()); break; case "2": dto.setLevel2(mdcEquProDto.getProductionName()); break; case "3": dto.setLevel3(mdcEquProDto.getProductionName()); break; } Optional mdcProduction = productionList.stream().filter(production -> production.getId().equals(mdcEquProDto.getParentId())).findAny(); mdcProduction.ifPresent(production -> { switch (production.getOrgType()) { case "1": dto.setLevel1(production.getProductionName()); break; case "2": dto.setLevel2(production.getProductionName()); break; case "3": dto.setLevel3(production.getProductionName()); break; } if (StringUtils.isNotEmpty(production.getParentId())) { productionList.stream().filter(p -> p.getId().equals(production.getParentId())).findAny().ifPresent(parent -> { switch (parent.getOrgType()) { case "1": dto.setLevel1(parent.getProductionName()); break; case "2": dto.setLevel2(parent.getProductionName()); break; case "3": dto.setLevel3(parent.getProductionName()); break; } }); } }); } /** * 处理设备效率数据 */ private List processEfficiencyData(List efficiencyList, List dates, String equipmentId, List mdcUtilizationRateList) { List list = new ArrayList<>(); MdcEfficiencyResultDto avgDto = new MdcEfficiencyResultDto(); avgDto.setTheDate("平均值"); MdcEfficiencyResultDto sumDto = new MdcEfficiencyResultDto(); sumDto.setTheDate("合计"); for (String date : dates) { MdcEfficiencyResultDto dto = efficiencyRate(efficiencyList, date, equipmentId, mdcUtilizationRateList, avgDto); list.add(dto); } sumDto.setProcessLong(avgDto.getProcessLong()); avgDto.setProcessLong(avgDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); avgDto.setUtilizationRate(avgDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); sumDto.setUtilizationRate(avgDto.getUtilizationRate()); avgDto.setStartRate(avgDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); sumDto.setStartRate(avgDto.getStartRate()); avgDto.setOpenRate(avgDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); sumDto.setOpenRate(avgDto.getOpenRate()); sumDto.setOpenLong(avgDto.getOpenLong()); avgDto.setOpenLong(avgDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); sumDto.setWaitLong(avgDto.getWaitLong()); avgDto.setWaitLong(avgDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); sumDto.setCloseLong(avgDto.getCloseLong()); avgDto.setCloseLong(avgDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); long rate = avgDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { avgDto.setColor(mdcUtilizationRate.getRateParameterColor()); sumDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } list.add(sumDto); list.add(avgDto); return list; } /** * 添加合计值和平均值 */ private void addSummaryAndAverage(MdcEfficiencyVo result, List listDtos, List mdcUtilizationRateList) { result.getDates().add("合计"); result.getDates().add("平均值"); MdcEfficiencyListDto sum = new MdcEfficiencyListDto(); sum.setLevel1("合计"); sum.setLevel2("合计"); sum.setLevel3("合计"); sum.setEquipmentId("合计"); sum.setEquipmentName("合计"); sum.setEquipmentType("合计"); sum.setDataList(calculateTotal(listDtos, mdcUtilizationRateList)); MdcEfficiencyListDto avg = new MdcEfficiencyListDto(); avg.setLevel1("平均值"); avg.setLevel2("平均值"); avg.setLevel3("平均值"); avg.setEquipmentId("平均值"); avg.setEquipmentName("平均值"); avg.setEquipmentType("平均值"); avg.setDataList(calculateAverage(listDtos, mdcUtilizationRateList)); result.getMdcEfficiencyList().add(sum); result.getMdcEfficiencyList().add(avg); } /** * 计算平均值 * * @param mdcEfficiencyList * @param mdcUtilizationRateList * @return */ private List calculateAverage(List mdcEfficiencyList, List mdcUtilizationRateList) { List result = new ArrayList<>(); List dataList = new ArrayList<>(); for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) { dataList.addAll(mdcEfficiencyListDto.getDataList()); } dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList())) .forEach((theDate, mert) -> { mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto( a.getTheDate(), a.getProcessLong().add(b.getProcessLong()), a.getUtilizationRate().add(b.getUtilizationRate()), a.getStartRate().add(b.getStartRate()), a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate)); return result; } /** * 计算合计值 * * @param mdcEfficiencyList * @return */ private List calculateTotal(List mdcEfficiencyList, List mdcUtilizationRateList) { List result = new ArrayList<>(); List dataList = new ArrayList<>(); for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) { dataList.addAll(mdcEfficiencyListDto.getDataList()); } dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList())) .forEach((theDate, mert) -> { mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto( a.getTheDate(), a.getProcessLong().add(b.getProcessLong()), a.getUtilizationRate().add(b.getUtilizationRate()), a.getStartRate().add(b.getStartRate()), a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate)); 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); // 利用率等级 List mdcUtilizationRateList = mdcUtilizationRateService.listByType("kdl"); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { result.setMdcEfficiencyList(listDtos); } else { List equipmentIdList = mdcEquipmentService.listEquipmentId(vo); if (equipmentIdList != null && !equipmentIdList.isEmpty()) { vo.setEquipmentIdList(equipmentIdList); } else { result.setMdcEfficiencyList(listDtos); return result; } // 查询利用率数据 List efficiencyList = mdcEfficiencyReportMapper.efficiencyPOList(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()).orderByAsc(SysDepart::getDepartOrder)); for (MdcEquDepDto mdcEquDepDto : equipmentList) { MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquDepDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquDepDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquDepDto.getEquipmentType()); mdcEfficiencyListDto.setEquipmentModel(mdcEquDepDto.getEquipmentModel()); 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<>(); MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto(); MdcEfficiencyResultDto mdcEfficiencyResultDto1 = new MdcEfficiencyResultDto(); mdcEfficiencyResultDto1.setTheDate("合计"); mdcEfficiencyResultDto.setTheDate("平均值"); for (String date : dates) { list.add(this.efficiencyRate(efficiencyList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyResultDto)); } mdcEfficiencyResultDto1.setProcessLong(mdcEfficiencyResultDto.getProcessLong()); mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate()); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setStartRate(mdcEfficiencyResultDto.getStartRate()); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setOpenRate(mdcEfficiencyResultDto.getOpenRate()); mdcEfficiencyResultDto1.setOpenLong(mdcEfficiencyResultDto.getOpenLong()); mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setWaitLong(mdcEfficiencyResultDto.getWaitLong()); mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong()); mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); mdcEfficiencyResultDto1.setColor(mdcUtilizationRate.getRateParameterColor()); } } list.add(mdcEfficiencyResultDto1); list.add(mdcEfficiencyResultDto); 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()).orderByAsc(MdcProduction::getProductionOrder)); for (MdcEquProDto mdcEquProDto : equipmentList) { MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto(); mdcEfficiencyListDto.setEquipmentId(mdcEquProDto.getEquipmentId()); mdcEfficiencyListDto.setEquipmentName(mdcEquProDto.getEquipmentName()); mdcEfficiencyListDto.setEquipmentType(mdcEquProDto.getEquipmentType()); mdcEfficiencyListDto.setEquipmentModel(mdcEquProDto.getEquipmentModel()); 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<>(); MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto(); MdcEfficiencyResultDto mdcEfficiencyResultDto1 = new MdcEfficiencyResultDto(); mdcEfficiencyResultDto1.setTheDate("合计"); mdcEfficiencyResultDto.setTheDate("平均值"); for (String date : dates) { list.add(this.efficiencyRate(efficiencyList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyResultDto)); } mdcEfficiencyResultDto1.setProcessLong(mdcEfficiencyResultDto.getProcessLong()); mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate()); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setStartRate(mdcEfficiencyResultDto.getStartRate()); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setOpenRate(mdcEfficiencyResultDto.getOpenRate()); mdcEfficiencyResultDto1.setOpenLong(mdcEfficiencyResultDto.getOpenLong()); mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setWaitLong(mdcEfficiencyResultDto.getWaitLong()); mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto1.setCloseLong(mdcEfficiencyResultDto.getCloseLong()); mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); mdcEfficiencyResultDto1.setColor(mdcUtilizationRate.getRateParameterColor()); } } list.add(mdcEfficiencyResultDto1); list.add(mdcEfficiencyResultDto); mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } result.setMdcEfficiencyList(listDtos); } result.getDates().add("合计"); result.getDates().add("平均值"); MdcEfficiencyListDto sum = new MdcEfficiencyListDto(); sum.setLevel1("合计"); sum.setLevel2("合计"); sum.setLevel3("合计"); sum.setEquipmentId("合计"); sum.setEquipmentName("合计"); sum.setEquipmentType("合计"); //计算合计值 sum.setDataList(this.calculateOpenTotal(result.getMdcEfficiencyList(), mdcUtilizationRateList)); MdcEfficiencyListDto avg = new MdcEfficiencyListDto(); avg.setLevel1("平均值"); avg.setLevel2("平均值"); avg.setLevel3("平均值"); avg.setEquipmentId("平均值"); avg.setEquipmentName("平均值"); avg.setEquipmentType("平均值"); //计算平均值 avg.setDataList(this.calculateOpenAverage(result.getMdcEfficiencyList(), mdcUtilizationRateList)); result.getMdcEfficiencyList().add(sum); result.getMdcEfficiencyList().add(avg); return result; } /** * 计算平均值 * * @param mdcEfficiencyList * @param mdcUtilizationRateList * @return */ private List calculateOpenAverage(List mdcEfficiencyList, List mdcUtilizationRateList) { List result = new ArrayList<>(); List dataList = new ArrayList<>(); for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) { dataList.addAll(mdcEfficiencyListDto.getDataList()); } dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList())) .forEach((theDate, mert) -> { mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto( a.getTheDate(), a.getProcessLong().add(b.getProcessLong()), a.getUtilizationRate().add(b.getUtilizationRate()), a.getStartRate().add(b.getStartRate()), a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setCloseLong(mdcEfficiencyResultDto.getCloseLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setWaitLong(mdcEfficiencyResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenLong(mdcEfficiencyResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setProcessLong(mdcEfficiencyResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate)); return result; } /** * 计算合计值 * * @param mdcEfficiencyList * @param mdcUtilizationRateList * @return */ private List calculateOpenTotal(List mdcEfficiencyList, List mdcUtilizationRateList) { List result = new ArrayList<>(); List dataList = new ArrayList<>(); for (MdcEfficiencyListDto mdcEfficiencyListDto : mdcEfficiencyList) { dataList.addAll(mdcEfficiencyListDto.getDataList()); } dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyResultDto::getTheDate, Collectors.toList())) .forEach((theDate, mert) -> { mert.stream().reduce((a, b) -> new MdcEfficiencyResultDto( a.getTheDate(), a.getProcessLong().add(b.getProcessLong()), a.getUtilizationRate().add(b.getUtilizationRate()), a.getStartRate().add(b.getStartRate()), a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); }); for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) { mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenRate(mdcEfficiencyResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setStartRate(mdcEfficiencyResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); long rate = mdcEfficiencyResultDto.getStartRate().multiply(new BigDecimal("100")).longValue(); for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) { if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) { mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor()); } } } result.sort(Comparator.comparing(MdcEfficiencyResultDto::getTheDate)); 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 mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl"); 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 equipmentIdList = mdcEquipmentService.listEquipmentIdShift(vo); if (equipmentIdList != null && !equipmentIdList.isEmpty()) { vo.setEquipmentIdList(equipmentIdList); } else { result.setMdcEfficiencyList(listDtos); return result; } // 班次利用率数据 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()).orderByAsc(SysDepart::getDepartOrder)); // 班次名称显示处理 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.setEquipmentModel(mdcEquDepDto.getEquipmentModel()); 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<>(); MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto(); MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto1 = new MdcEfficiencyShiftResultDto(); mdcEfficiencyShiftResultDto.setTheDate("平均值"); mdcEfficiencyShiftResultDto1.setTheDate("合计"); for (String date : dates) { list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyShiftResultDto)); } mdcEfficiencyShiftResultDto1.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong()); mdcEfficiencyShiftResultDto.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate()); mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setStartRate(mdcEfficiencyShiftResultDto.getStartRate()); mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate()); mdcEfficiencyShiftResultDto1.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong()); mdcEfficiencyShiftResultDto.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong()); mdcEfficiencyShiftResultDto.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong()); mdcEfficiencyShiftResultDto.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.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()); mdcEfficiencyShiftResultDto1.setColor(mdcUtilizationRate.getRateParameterColor()); } } list.add(mdcEfficiencyShiftResultDto1); list.add(mdcEfficiencyShiftResultDto); 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()).orderByAsc(MdcProduction::getProductionOrder)); // 班次名称显示处理 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.setEquipmentModel(mdcEquProDto.getEquipmentModel()); 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<>(); MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto(); MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto1 = new MdcEfficiencyShiftResultDto(); mdcEfficiencyShiftResultDto.setTheDate("平均值"); mdcEfficiencyShiftResultDto1.setTheDate("合计"); for (String date : dates) { list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList, mdcEfficiencyShiftResultDto)); } mdcEfficiencyShiftResultDto1.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong()); mdcEfficiencyShiftResultDto.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate()); mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setStartRate(mdcEfficiencyShiftResultDto.getStartRate()); mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate()); mdcEfficiencyShiftResultDto1.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong()); mdcEfficiencyShiftResultDto.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong()); mdcEfficiencyShiftResultDto.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto1.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong()); mdcEfficiencyShiftResultDto.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.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()); mdcEfficiencyShiftResultDto1.setColor(mdcUtilizationRate.getRateParameterColor()); } } list.add(mdcEfficiencyShiftResultDto1); list.add(mdcEfficiencyShiftResultDto); mdcEfficiencyShiftListDto.setDataList(list); listDtos.add(mdcEfficiencyShiftListDto); } } // listDtos.sort(((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getLevel3(), o2.getLevel3()))); result.setMdcEfficiencyList(listDtos); } result.getDates().add("合计"); result.getDates().add("平均值"); MdcEfficiencyShiftListDto sum = new MdcEfficiencyShiftListDto(); sum.setLevel1("合计"); sum.setLevel2("合计"); sum.setLevel3("合计"); sum.setEquipmentId("合计"); sum.setEquipmentName("合计"); sum.setEquipmentType("合计"); sum.setShiftSubName("合计"); sum.setDataList(this.calculateShiftTotal(result.getMdcEfficiencyList(), mdcUtilizationRateList)); MdcEfficiencyShiftListDto avg = new MdcEfficiencyShiftListDto(); avg.setLevel1("平均值"); avg.setLevel2("平均值"); avg.setLevel3("平均值"); avg.setEquipmentId("平均值"); avg.setEquipmentName("平均值"); avg.setEquipmentType("平均值"); avg.setShiftSubName("平均值"); avg.setDataList(this.calculateShiftAverage(result.getMdcEfficiencyList(), mdcUtilizationRateList)); result.getMdcEfficiencyList().add(sum); result.getMdcEfficiencyList().add(avg); return result; } /** * 计算平均值 * * @param mdcEfficiencyList * @param mdcUtilizationRateList * @return */ private List calculateShiftAverage(List mdcEfficiencyList, List mdcUtilizationRateList) { List result = new ArrayList<>(); List dataList = new ArrayList<>(); for (MdcEfficiencyShiftListDto mdcEfficiencyShiftListDto : mdcEfficiencyList) { dataList.addAll(mdcEfficiencyShiftListDto.getDataList()); } dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyShiftResultDto::getTheDate, Collectors.toList())) .forEach((theDate, mert) -> { mert.stream().reduce((a, b) -> new MdcEfficiencyShiftResultDto( a.getTheDate(), a.getProcessLong().add(b.getProcessLong()), a.getUtilizationRate().add(b.getUtilizationRate()), a.getStartRate().add(b.getStartRate()), a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); }); for (MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto : result) { mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setCloseLong(mdcEfficiencyShiftResultDto.getCloseLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setWaitLong(mdcEfficiencyShiftResultDto.getWaitLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setOpenLong(mdcEfficiencyShiftResultDto.getOpenLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setProcessLong(mdcEfficiencyShiftResultDto.getProcessLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.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()); } } } result.sort(Comparator.comparing(MdcEfficiencyShiftResultDto::getTheDate)); return result; } /** * 计算合计值 * * @param mdcEfficiencyList * @param mdcUtilizationRateList * @return */ private List calculateShiftTotal(List mdcEfficiencyList, List mdcUtilizationRateList) { List result = new ArrayList<>(); List dataList = new ArrayList<>(); for (MdcEfficiencyShiftListDto mdcEfficiencyShiftListDto : mdcEfficiencyList) { dataList.addAll(mdcEfficiencyShiftListDto.getDataList()); } dataList.parallelStream().collect(Collectors.groupingBy(MdcEfficiencyShiftResultDto::getTheDate, Collectors.toList())) .forEach((theDate, mert) -> { mert.stream().reduce((a, b) -> new MdcEfficiencyShiftResultDto( a.getTheDate(), a.getProcessLong().add(b.getProcessLong()), a.getUtilizationRate().add(b.getUtilizationRate()), a.getStartRate().add(b.getStartRate()), a.getOpenRate().add(b.getOpenRate()), a.getOpenLong().add(b.getOpenLong()), a.getWaitLong().add(b.getWaitLong()), a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add); }); for (MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto : result) { mdcEfficiencyShiftResultDto.setUtilizationRate(mdcEfficiencyShiftResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setOpenRate(mdcEfficiencyShiftResultDto.getOpenRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP)); mdcEfficiencyShiftResultDto.setStartRate(mdcEfficiencyShiftResultDto.getStartRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.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()); } } } result.sort(Comparator.comparing(MdcEfficiencyShiftResultDto::getTheDate)); return result; } private MdcEfficiencyShiftResultDto efficiencyShiftRate(List mdcEquipmentStatisticalShiftInfoList, String date, String equipmentId, List mdcUtilizationRateList, MdcEfficiencyShiftResultDto efficiencyShiftResultDto) { 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()); if (equipmentStatisticalShiftInfo.getTotalLong().compareTo(BigDecimal.ZERO) == 0) { mdcEfficiencyShiftResultDto.setUtilizationRate(BigDecimal.ZERO); } else { mdcEfficiencyShiftResultDto.setUtilizationRate(equipmentStatisticalShiftInfo.getProcessLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, RoundingMode.HALF_UP)); } mdcEfficiencyShiftResultDto.setCloseLong(equipmentStatisticalShiftInfo.getCloseLong()); mdcEfficiencyShiftResultDto.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong()); mdcEfficiencyShiftResultDto.setWaitLong(equipmentStatisticalShiftInfo.getWaitLong()); if (equipmentStatisticalShiftInfo.getTotalLong().compareTo(BigDecimal.ZERO) == 0) { mdcEfficiencyShiftResultDto.setOpenRate(BigDecimal.ZERO); } else { mdcEfficiencyShiftResultDto.setOpenRate(equipmentStatisticalShiftInfo.getOpenLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, RoundingMode.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()); } } } efficiencyShiftResultDto.setProcessLong(efficiencyShiftResultDto.getProcessLong().add(mdcEfficiencyShiftResultDto.getProcessLong())); efficiencyShiftResultDto.setUtilizationRate(efficiencyShiftResultDto.getUtilizationRate().add(mdcEfficiencyShiftResultDto.getUtilizationRate())); efficiencyShiftResultDto.setStartRate(efficiencyShiftResultDto.getStartRate().add(mdcEfficiencyShiftResultDto.getStartRate())); efficiencyShiftResultDto.setOpenRate(efficiencyShiftResultDto.getOpenRate().add(mdcEfficiencyShiftResultDto.getOpenRate())); efficiencyShiftResultDto.setOpenLong(efficiencyShiftResultDto.getOpenLong().add(mdcEfficiencyShiftResultDto.getOpenLong())); efficiencyShiftResultDto.setWaitLong(efficiencyShiftResultDto.getWaitLong().add(mdcEfficiencyShiftResultDto.getWaitLong())); efficiencyShiftResultDto.setCloseLong(efficiencyShiftResultDto.getCloseLong().add(mdcEfficiencyShiftResultDto.getCloseLong())); 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(Arrays.asList(vo.getEquipmentId().split(","))); } 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; } vo.setDeviceCategoryList(Arrays.asList(vo.getDeviceCategory().split(","))); vo.setDeviceLevelList(Arrays.asList(vo.getDeviceLevel().split(","))); vo.setDriveTypeList(Arrays.asList(vo.getDriveType().split(","))); vo.setEquipmentTypeList(Arrays.asList(vo.getEquipmentType().split(","))); // 查询原始数据 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 { MdcEfficiencyReportQueryVo vo1 = new MdcEfficiencyReportQueryVo(); BeanUtils.copyProperties(vo, vo1); List equipmentIdList = mdcEquipmentService.listEquipmentId(vo1); if (equipmentIdList != null && !equipmentIdList.isEmpty()) { vo.setEquipmentIdList(equipmentIdList); } else { result.setMdcEfficiencyList(listDtos); return result; } // 利用率等级 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 { MdcEfficiencyReportQueryVo vo1 = new MdcEfficiencyReportQueryVo(); BeanUtils.copyProperties(vo, vo1); List equipmentIdList = mdcEquipmentService.listEquipmentId(vo1); if (equipmentIdList != null && !equipmentIdList.isEmpty()) { vo.setEquipmentIdList(equipmentIdList); } else { result.setMdcEfficiencyList(listDtos); return result; } // 利用率等级 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) { list.add(this.utilizationRateTrend(mdcEquDepDto.getEquipmentId(), mdcEquDepDto.getEquipmentName(), mdcEquDepDto.getEquipmentType(), 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) { list.add(this.utilizationRateTrend(mdcEquProDto.getEquipmentId(), mdcEquProDto.getEquipmentName(), mdcEquProDto.getEquipmentType(), date, mdcUtilizationRateList)); } mdcEfficiencyListDto.setDataList(list); listDtos.add(mdcEfficiencyListDto); } } result.setMdcEfficiencyList(listDtos); } return result; } private MdcUtilizationResultDto utilizationRateTrend(String equipmentId, String equipmentName, String equipmentType, String date, List mdcUtilizationRateList) { MdcUtilizationResultDto dto = new MdcUtilizationResultDto(); dto.setEquipmentId(equipmentId); dto.setEquipmentName(equipmentName); dto.setEquipmentType(equipmentType); dto.setTheDate(date); MdcEquipmentStatisticalInfo mdcEquipmentStatisticalInfo = mdcEquipmentStatisticalInfoService.findMdcEquipmentStatisticalInfo(equipmentId, date); if (mdcEquipmentStatisticalInfo != null) { dto.setUtilizationRate(mdcEquipmentStatisticalInfo.getProcessLong().divide(new BigDecimal("86400"), 6, RoundingMode.HALF_UP)); } 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()); } } if (StringUtils.isBlank(dto.getColor())) { dto.setColor(mdcUtilizationRateList.get(mdcUtilizationRateList.size() - 1).getRateParameterColor()); } return dto; } @Override public List getEfficiencyRate(String equipmentId, String date) { return mdcEfficiencyReportMapper.getEfficiencyRate(equipmentId, date); } /** * 利用率列表导出 * * @param vo * @return */ @Override public ModelAndView exportEfficiencyXls(MdcEfficiencyReportQueryVo vo){ LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); // 获取设备 ID 列表 List equipmentIds = getEquipmentIds(user.getId(), vo); if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { vo.setEquipmentIdList(equipmentIds); } // 如果设备 ID 列表为空,直接返回 if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) { throw new JeecgBootException("无数据"); } // 获取设备 ID 列表 List equipmentIdList = mdcEquipmentService.listEquipmentId(vo); if (equipmentIdList == null || equipmentIdList.isEmpty()) { throw new JeecgBootException("无数据"); } vo.setEquipmentIdList(equipmentIdList); // 3. 准备设备数据 List exportData = new ArrayList<>(); // 获取日期列表并按月分组 List dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime())); Map> groupedByMonth = dates.stream() .collect(Collectors.groupingBy( date -> date.substring(0, 6) // 提取年月(如 "202405") )); // 2. 提取每月的首尾日期 List> monthRanges = groupedByMonth.entrySet().stream() .map(entry -> { List monthDates = entry.getValue(); Map map = new HashMap<>(); map.put("startTime", monthDates.get(0)); map.put("endTime", monthDates.get(monthDates.size() - 1)); map.put("dateList", monthDates); return map; }) .collect(Collectors.toList()); for (Map monthRange : monthRanges) { List listDtos = new ArrayList<>(); vo.setStartTime((String) monthRange.get("startTime")); vo.setEndTime((String) monthRange.get("endTime")); List dateList = (List) monthRange.get("dateList"); // 查询设备效率数据 List efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo); // 处理数据 // 根据类型树处理不同的层级 if ("2".equals(vo.getTypeTree())) { // 部门层级 listDtos = processDeLevel(vo, efficiencyList, dateList); } else { // 产线层级 listDtos = processProLevel(vo, efficiencyList, dateList); } if (exportData.isEmpty()) { exportData.addAll(listDtos); } else { Map map = listDtos.stream().collect(Collectors.toMap(MdcEfficiencyListDto::getEquipmentId, a -> a, (k1, k2) -> k1)); exportData.forEach(mdcEfficiencyListDto -> { List dataList = mdcEfficiencyListDto.getDataList(); if (map.containsKey(mdcEfficiencyListDto.getEquipmentId())) { MdcEfficiencyListDto mdcEfficiencyListDto1 = map.get(mdcEfficiencyListDto.getEquipmentId()); List dataList1 = mdcEfficiencyListDto1.getDataList(); dataList.addAll(dataList1); mdcEfficiencyListDto.setDataList(dataList); } }); } } // 数据排序 exportData = exportData.stream().sorted(Comparator.comparing(MdcEfficiencyListDto::getLevel2)).sorted(Comparator.comparing(MdcEfficiencyListDto::getLevel3)).collect(Collectors.toList()); // 1. 创建工作簿和工作表 XSSFWorkbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("利用率数据"); // 3. 准备设备数据 // 创建样式 CellStyle centerStyle = createCenterStyle(workbook); CellStyle fixedHeaderStyle = createFixedHeaderStyle(workbook); CellStyle dateHeaderStyle = createDateHeaderStyle(workbook); CellStyle metricHeaderStyle = createMetricHeaderStyle(workbook); // dates.add("合计"); // dates.add("平均"); // 写入标题行 writeHeaderRows(sheet, fixedHeaderStyle, dateHeaderStyle, metricHeaderStyle, dates); // 写入数据行 writeDataRows(sheet, centerStyle, exportData, dates); // 添加自适应列宽(所有列,从0开始到最后一列) // autoSizeAllColumns(sheet, 0, sheet.getRow(0).getLastCellNum() - 1); // 7. 将工作簿转换为字节数组输出流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { workbook.write(bos); } catch (IOException e) { e.printStackTrace(); } // 具体实现可能需要根据你的项目结构进行调整 ModelAndView mv = new ModelAndView(new CustomExcelView(bos.toByteArray())); return mv; } /** * 自适应所有列宽(处理合并单元格) * @param sheet 工作表 * @param startCol 起始列索引 * @param endCol 结束列索引 */ private void autoSizeAllColumns(Sheet sheet, int startCol, int endCol) { // 先处理合并单元格对列宽的影响 adjustMergedCells(sheet); // 自动调整列宽 for (int i = startCol; i <= endCol; i++) { sheet.autoSizeColumn(i); // 解决POI自动列宽过窄问题,增加额外宽度(单位:1/256字符宽度,这里增加200相当于约3个字符) sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 1800); } } /** * 处理合并单元格,确保列宽计算正确 * (POI的autoSizeColumn对合并单元格支持不佳,需要手动展开计算) */ private void adjustMergedCells(Sheet sheet) { List mergedRegions = new ArrayList<>(); for (int i = 0; i < sheet.getNumMergedRegions(); i++) { mergedRegions.add(sheet.getMergedRegion(i)); } for (CellRangeAddress region : mergedRegions) { int firstCol = region.getFirstColumn(); int lastCol = region.getLastColumn(); if (firstCol == lastCol) continue; // 单列合并无需处理 // 计算合并区域的最大宽度 int maxWidth = 0; for (int row = region.getFirstRow(); row <= region.getLastRow(); row++) { Row rowData = sheet.getRow(row); if (rowData == null) continue; Cell cell = rowData.getCell(firstCol); if (cell == null) continue; int width = getCellWidth(cell); if (width > maxWidth) { maxWidth = width; } } // 应用到所有合并列(只设置首列宽度,POI会自动同步到合并列) sheet.setColumnWidth(firstCol, maxWidth); } } /** * 获取单元格内容宽度(考虑字体和内容) */ private int getCellWidth(Cell cell) { // 通过Sheet获取Workbook,兼容性更好 Workbook workbook = cell.getSheet().getWorkbook(); CellStyle style = cell.getCellStyle(); Font font = workbook.getFontAt(style.getFontIndex()); String text = cell.getStringCellValue(); // 计算文本宽度(粗略估计,可根据实际字体调整) int width = text.length() * 256; if (font.getBold()) width = (int) (width * 1.2); // 加粗字体增加20%宽度 return width + 512; // 增加额外宽度 } /** * 处理部门层级 */ private List processDeLevel(MdcEfficiencyReportQueryVo vo, List efficiencyList, List dates) { List equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList()); List departList = sysDepartService.list(new LambdaQueryWrapper() .ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()) .orderByAsc(SysDepart::getDepartOrder)); return equipmentList.stream().map(mdcEquDepDto -> { MdcEfficiencyListDto mdcEfficiencyListDto = createEfficiencyListDto(mdcEquDepDto); setDepartmentLevels(mdcEfficiencyListDto, mdcEquDepDto, departList); mdcEfficiencyListDto.setDataList(processEffData(efficiencyList, dates, mdcEquDepDto.getEquipmentId())); return mdcEfficiencyListDto; }).collect(Collectors.toList()); } private List processProLevel(MdcEfficiencyReportQueryVo vo, List efficiencyList, List dates) { List equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList()); List productionList = mdcProductionService.list(new LambdaQueryWrapper() .ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()) .orderByAsc(MdcProduction::getProductionOrder)); return equipmentList.stream().map(mdcEquProDto -> { MdcEfficiencyListDto mdcEfficiencyListDto = createEfficiencyListDto(mdcEquProDto); setProductionLevels(mdcEfficiencyListDto, mdcEquProDto, productionList); mdcEfficiencyListDto.setDataList(processEffData(efficiencyList, dates, mdcEquProDto.getEquipmentId())); return mdcEfficiencyListDto; }).collect(Collectors.toList()); } private List processEffData(List efficiencyList, List dates, String equipmentId) { List list = new ArrayList<>(); // MdcEfficiencyResultDto avgDto = new MdcEfficiencyResultDto(); // avgDto.setTheDate("平均值"); // MdcEfficiencyResultDto sumDto = new MdcEfficiencyResultDto(); // sumDto.setTheDate("合计"); for (String date : dates) { MdcEfficiencyResultDto dto = effRate(efficiencyList, date, equipmentId); list.add(dto); } // sumDto.setProcessLong(avgDto.getProcessLong()); // avgDto.setProcessLong(avgDto.getProcessLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); // avgDto.setUtilizationRate(avgDto.getUtilizationRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); // sumDto.setUtilizationRate(avgDto.getUtilizationRate()); // avgDto.setStartRate(avgDto.getStartRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); // sumDto.setStartRate(avgDto.getStartRate()); // avgDto.setOpenRate(avgDto.getOpenRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP)); // sumDto.setOpenRate(avgDto.getOpenRate()); // sumDto.setOpenLong(avgDto.getOpenLong()); // avgDto.setOpenLong(avgDto.getOpenLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); // sumDto.setWaitLong(avgDto.getWaitLong()); // avgDto.setWaitLong(avgDto.getWaitLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); // sumDto.setCloseLong(avgDto.getCloseLong()); // avgDto.setCloseLong(avgDto.getCloseLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP)); // // list.add(sumDto); // list.add(avgDto); return list; } private MdcEfficiencyResultDto effRate(List efficiencyList, String date, String equipmentId) { MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto(); if (efficiencyList != null && !efficiencyList.isEmpty()) { Map collect = efficiencyList.stream().collect(Collectors.toMap(dto -> dto.getEquipmentId() + "_" + dto.getTheDate(), dto -> dto)); if (collect.containsKey(equipmentId + "_" + date)) { MdcEfficiencyDto efficiencyDto = collect.get(equipmentId + "_" + date); mdcEfficiencyResultDto.setTheDate(efficiencyDto.getTheDate()); mdcEfficiencyResultDto.setProcessLong(efficiencyDto.getProcessLong().divide(new BigDecimal("3600"), 2, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setUtilizationRate(efficiencyDto.getUtilizationRate().multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setStartRate(efficiencyDto.getStartRate().multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenRate(efficiencyDto.getOpenRate().multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setOpenLong(efficiencyDto.getOpenLong().divide(new BigDecimal("3600"), 2, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setWaitLong(efficiencyDto.getWaitLong().divide(new BigDecimal("3600"), 2, RoundingMode.HALF_UP)); mdcEfficiencyResultDto.setCloseLong(efficiencyDto.getCloseLong().divide(new BigDecimal("3600"), 2, RoundingMode.HALF_UP)); } else { mdcEfficiencyResultDto.setTheDate(date); } } 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")); } return mdcEfficiencyResultDto; } private void writeHeaderRows(Sheet sheet, CellStyle fixedHeaderStyle, CellStyle dateHeaderStyle, CellStyle metricHeaderStyle, List dateList) { Row titleRow1 = sheet.createRow(0); Row titleRow2 = sheet.createRow(1); int colIndex = 0; // 写入固定列标题(公司、车间等) String[] fixedHeaders = {"公司", "车间", "工段", "设备ID", "设备名称", "设备类型"}; for (int i = 0; i < fixedHeaders.length; i++) { createCellWithStyle(titleRow1, colIndex, fixedHeaders[i], fixedHeaderStyle); createCellWithStyle(titleRow2, colIndex, "", fixedHeaderStyle); // 合并单元格(跨行不跨列) CellRangeAddress region = new CellRangeAddress(0, 1, colIndex, colIndex); sheet.addMergedRegion(region); colIndex++; } // 写入日期,跨6列合并 for (String date : dateList) { CellRangeAddress dateRegion = new CellRangeAddress(0, 0, colIndex, colIndex + 5); sheet.addMergedRegion(dateRegion); createCellWithStyle(titleRow1, colIndex, date, dateHeaderStyle); colIndex += 6; } // 写入日期指标标题(每个日期对应6列) colIndex = 6; for (String date : dateList) { createCellWithStyle(titleRow2, colIndex++, "利用率(%)", metricHeaderStyle); createCellWithStyle(titleRow2, colIndex++, "开机率(%)", metricHeaderStyle); createCellWithStyle(titleRow2, colIndex++, "开机时长(小时)", metricHeaderStyle); createCellWithStyle(titleRow2, colIndex++, "加工时长(小时)", metricHeaderStyle); createCellWithStyle(titleRow2, colIndex++, "待机时长(小时)", metricHeaderStyle); createCellWithStyle(titleRow2, colIndex++, "关机时长(小时)", metricHeaderStyle); } } private CellStyle createCenterStyle(Workbook workbook) { CellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); // 添加完整边框 style.setBorderTop(BorderStyle.THIN); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); return style; } private CellStyle createFixedHeaderStyle(Workbook workbook) { CellStyle style = createCenterStyle(workbook); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); return style; } private CellStyle createDateHeaderStyle(Workbook workbook) { CellStyle style = createCenterStyle(workbook); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); return style; } private CellStyle createMetricHeaderStyle(Workbook workbook) { CellStyle style = createCenterStyle(workbook); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); return style; } private void writeDataRows(Sheet sheet, CellStyle style, List exportData, List dateList) { int rowIndex = 2; for (MdcEfficiencyListDto device : exportData) { Row dataRow = sheet.createRow(rowIndex++); int colIndex = 0; // 写入固定列数据(公司、车间等) createCellWithStyle(dataRow, colIndex++, device.getLevel1(), style); createCellWithStyle(dataRow, colIndex++, device.getLevel2(), style); createCellWithStyle(dataRow, colIndex++, device.getLevel3(), style); createCellWithStyle(dataRow, colIndex++, device.getEquipmentId(), style); createCellWithStyle(dataRow, colIndex++, device.getEquipmentName(), style); createCellWithStyle(dataRow, colIndex++, device.getEquipmentType(), style); // 写入日期指标数据(每个日期对应6列) for (String date : dateList) { // 确保dateStr对应的Map已初始化 MdcEfficiencyResultDto dateData = device.getDataList().stream().filter(mdcEfficiencyResultDto -> date.equals(mdcEfficiencyResultDto.getTheDate())).collect(Collectors.toList()).get(0); createCellWithStyle(dataRow, colIndex++, dateData.getUtilizationRate().doubleValue(), style); createCellWithStyle(dataRow, colIndex++, dateData.getOpenRate().doubleValue(), style); createCellWithStyle(dataRow, colIndex++, dateData.getOpenLong().doubleValue(), style); createCellWithStyle(dataRow, colIndex++, dateData.getProcessLong().doubleValue(), style); createCellWithStyle(dataRow, colIndex++, dateData.getWaitLong().doubleValue(), style); createCellWithStyle(dataRow, colIndex++, dateData.getCloseLong().doubleValue(), style); } } } private void createCellWithStyle(Row row, int colIndex, Object value, CellStyle style) { Cell cell = row.createCell(colIndex); if (value instanceof String) { cell.setCellValue((String) value); } else if (value instanceof Double) { cell.setCellValue((Double) value); } cell.setCellStyle(style); } 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()); } } if (StringUtils.isBlank(dto.getColor())) { dto.setColor(mdcUtilizationRateList.get(mdcUtilizationRateList.size() - 1).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 efficiencyResultDto) { 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()); } } } efficiencyResultDto.setProcessLong(efficiencyResultDto.getProcessLong().add(mdcEfficiencyResultDto.getProcessLong())); efficiencyResultDto.setUtilizationRate(efficiencyResultDto.getUtilizationRate().add(mdcEfficiencyResultDto.getUtilizationRate())); efficiencyResultDto.setStartRate(efficiencyResultDto.getStartRate().add(mdcEfficiencyResultDto.getStartRate())); efficiencyResultDto.setOpenRate(efficiencyResultDto.getOpenRate().add(mdcEfficiencyResultDto.getOpenRate())); efficiencyResultDto.setOpenLong(efficiencyResultDto.getOpenLong().add(mdcEfficiencyResultDto.getOpenLong())); efficiencyResultDto.setWaitLong(efficiencyResultDto.getWaitLong().add(mdcEfficiencyResultDto.getWaitLong())); efficiencyResultDto.setCloseLong(efficiencyResultDto.getCloseLong().add(mdcEfficiencyResultDto.getCloseLong())); return mdcEfficiencyResultDto; } }