From e935889261ef38c8eaef31e54cbfc466d63d2ef4 Mon Sep 17 00:00:00 2001
From: hyingbo <1363390067@qq.com>
Date: 星期四, 17 七月 2025 09:42:28 +0800
Subject: [PATCH] fanuc获取程序名、获取报警描述

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java |  395 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 389 insertions(+), 6 deletions(-)

diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
index c8dd286..55ea7fd 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java
@@ -4,6 +4,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.modules.mdc.dto.*;
 import org.jeecg.modules.mdc.entity.*;
 import org.jeecg.modules.mdc.mapper.MdcEfficiencyReportMapper;
@@ -15,6 +16,8 @@
 import org.jeecg.modules.system.entity.SysDepart;
 import org.jeecg.modules.system.service.IMdcProductionService;
 import org.jeecg.modules.system.service.ISysDepartService;
+import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.system.vo.MdcProOptionsVo;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -24,6 +27,7 @@
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -53,6 +57,9 @@
 
     @Resource
     private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
+
+    @Resource
+    private ISysDictService sysDictService;
 
     /**
      * 鍒╃敤鐜囨姤琛�
@@ -189,6 +196,12 @@
                     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));
+                    mdcEfficiencyResultDto1.setFaultLong(mdcEfficiencyResultDto.getFaultLong());
+                    mdcEfficiencyResultDto.setFaultLong(mdcEfficiencyResultDto.getFaultLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
+                    mdcEfficiencyResultDto1.setFaultRate(mdcEfficiencyResultDto.getFaultRate());
+                    mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
+                    mdcEfficiencyResultDto1.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong());
+                    mdcEfficiencyResultDto.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong().divide(new BigDecimal(dates.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()) {
@@ -277,6 +290,12 @@
                     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));
+                    mdcEfficiencyResultDto1.setFaultLong(mdcEfficiencyResultDto.getFaultLong());
+                    mdcEfficiencyResultDto.setFaultLong(mdcEfficiencyResultDto.getFaultLong().divide(new BigDecimal(dates.size()), 0, RoundingMode.HALF_UP));
+                    mdcEfficiencyResultDto1.setFaultRate(mdcEfficiencyResultDto.getFaultRate());
+                    mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(dates.size()), 4, RoundingMode.HALF_UP));
+                    mdcEfficiencyResultDto1.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong());
+                    mdcEfficiencyResultDto.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong().divide(new BigDecimal(dates.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()) {
@@ -342,7 +361,10 @@
                             a.getOpenRate().add(b.getOpenRate()),
                             a.getOpenLong().add(b.getOpenLong()),
                             a.getWaitLong().add(b.getWaitLong()),
-                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
+                            a.getCloseLong().add(b.getCloseLong()),
+                            a.getFaultLong().add(b.getFaultLong()),
+                            a.getFaultRate().add(b.getFaultRate()),
+                            a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add);
                 });
         for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
             mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
@@ -385,7 +407,10 @@
                             a.getOpenRate().add(b.getOpenRate()),
                             a.getOpenLong().add(b.getOpenLong()),
                             a.getWaitLong().add(b.getWaitLong()),
-                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
+                            a.getCloseLong().add(b.getCloseLong()),
+                            a.getFaultLong().add(b.getFaultLong()),
+                            a.getFaultRate().add(b.getFaultRate()),
+                            a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add);
                 });
         for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
             mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
@@ -448,7 +473,7 @@
         if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
             result.setMdcEfficiencyList(listDtos);
         } else {
-            
+
             List<String> equipmentIdList = mdcEquipmentService.listEquipmentId(vo);
             if (equipmentIdList != null && !equipmentIdList.isEmpty()) {
                 vo.setEquipmentIdList(equipmentIdList);
@@ -689,7 +714,10 @@
                             a.getOpenRate().add(b.getOpenRate()),
                             a.getOpenLong().add(b.getOpenLong()),
                             a.getWaitLong().add(b.getWaitLong()),
-                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
+                            a.getCloseLong().add(b.getCloseLong()),
+                            a.getFaultLong().add(b.getFaultLong()),
+                            a.getFaultRate().add(b.getFaultRate()),
+                            a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).ifPresent(result::add);
                 });
         for (MdcEfficiencyResultDto mdcEfficiencyResultDto : result) {
             mdcEfficiencyResultDto.setUtilizationRate(mdcEfficiencyResultDto.getUtilizationRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
@@ -699,6 +727,9 @@
             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));
+            mdcEfficiencyResultDto.setFaultLong(mdcEfficiencyResultDto.getFaultLong().divide(new BigDecimal(mdcEfficiencyList.size()), 0, RoundingMode.HALF_UP));
+            mdcEfficiencyResultDto.setFaultRate(mdcEfficiencyResultDto.getFaultRate().divide(new BigDecimal(mdcEfficiencyList.size()), 4, RoundingMode.HALF_UP));
+            mdcEfficiencyResultDto.setRemoveFaultRunLong(mdcEfficiencyResultDto.getRemoveFaultRunLong().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()) {
@@ -733,12 +764,16 @@
                             a.getOpenRate().add(b.getOpenRate()),
                             a.getOpenLong().add(b.getOpenLong()),
                             a.getWaitLong().add(b.getWaitLong()),
-                            a.getCloseLong().add(b.getCloseLong()))).ifPresent(result::add);
+                            a.getCloseLong().add(b.getCloseLong()),
+                            a.getFaultLong().add(b.getFaultLong()),
+                            a.getFaultRate().add(b.getFaultRate()),
+                            a.getRemoveFaultRunLong().add(b.getRemoveFaultRunLong()))).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.setFaultRate(mdcEfficiencyResultDto.getFaultRate().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()) {
@@ -1736,6 +1771,342 @@
         return mdcEfficiencyReportMapper.getEfficiencyRate(equipmentId, date);
     }
 
+    /**
+     * 鐝粍鍚勮澶囩患鍚堝埄鐢ㄧ巼
+     *
+     * @param equEffVo
+     * @return
+     */
+    @Override
+    public Map<String, Object> equipmentEfficiencyAnalyze(String userId, EquEffVo equEffVo) {
+        Map<String, Object> result = new HashMap<>();
+        List<String> mdcProductionIds = new ArrayList<>();
+        if (StringUtils.isBlank(equEffVo.getProductionIds())) {
+            mdcProductionIds.add(equEffVo.getProductionId());
+        } else {
+            mdcProductionIds.addAll(Arrays.asList(equEffVo.getProductionIds().split(",")));
+        }
+        List<String> allProductionIds = mdcProductionService.findChildren(mdcProductionIds);
+        //鏁版嵁鏉冮檺杩囨护
+        allProductionIds = mdcProductionService.findProIdsByUId(userId, allProductionIds);
+        List<MdcEquipment> equipmentList = mdcEquipmentService.findByProductionIds(allProductionIds);
+        if (equipmentList != null && !equipmentList.isEmpty()) {
+            List<String> equipmentIdList = equipmentList.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
+            List<EquipmentEfficiencyAnalyzeDto> dataList = mdcEfficiencyReportMapper.equipmentEfficiencyAnalyze(equipmentIdList, equEffVo.getMonth());
+            result.put("dataList", dataList);
+            List<String> equipmentNameList = dataList.stream().map(EquipmentEfficiencyAnalyzeDto::getEquipmentName).collect(Collectors.toList());
+            result.put("equipmentNameList", equipmentNameList);
+        }
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> teamEquipmentEfficiencyAnalyze(String userId, EquEffVo equEffVo) {
+        Map<String, Object> result = new HashMap<>();
+        // 1. 澶勭悊鐢熶骇ID
+        List<String> mdcProductionIds = StringUtils.isBlank(equEffVo.getProductionIds())
+                ? Collections.singletonList(equEffVo.getProductionId())
+                : Arrays.asList(equEffVo.getProductionIds().split(","));
+
+        List<String> allProductionIds = mdcProductionService.findChildren(mdcProductionIds);
+        if (allProductionIds.isEmpty()) {
+            return result; // 鎻愬墠杩斿洖绌虹粨鏋�
+        }
+        //鏁版嵁鏉冮檺杩囨护
+        allProductionIds = mdcProductionService.findProIdsByUId(userId, allProductionIds);
+        // 2. 鑾峰彇璁惧鍒楄〃
+        List<MdcEquipment> equipmentList = StringUtils.isNotBlank(equEffVo.getTeamCodes())
+                ? mdcEquipmentService.findByProIdsAndTeamCode(allProductionIds, Arrays.asList(equEffVo.getTeamCodes().split(",")))
+                : mdcEquipmentService.findByProductionIds(allProductionIds);
+
+        if (equipmentList.isEmpty()) {
+            return result;
+        }
+
+        // 3. 鏁版嵁澶勭悊
+        List<String> equipmentIdList = equipmentList.stream()
+                .map(MdcEquipment::getEquipmentId)
+                .collect(Collectors.toList());
+
+        List<TeamEquEffDto> dataList = mdcEfficiencyReportMapper
+                .teamEquipmentEfficiencyAnalyze(equipmentIdList, equEffVo.getMonth());
+
+        if (dataList.isEmpty()) {
+            return result;
+        }
+
+        // 4. 鍒嗙粍璁$畻骞冲潎鍊�
+        Map<String, TeamEquEffDto> grouped = dataList.stream()
+                .collect(Collectors.groupingBy(
+                        TeamEquEffDto::getTeamCode,
+                        Collectors.collectingAndThen(
+                                Collectors.toList(),
+                                this::calculateAverages // 鎻愬彇璁$畻鏂规硶
+                        )));
+
+        // 5. 瀛楀吀杞崲
+        Map<String, String> dictMap = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_MDC_STAFF_TEAM)
+                .stream()
+                .collect(Collectors.toMap(DictModel::getValue, DictModel::getText));
+
+        List<TeamEquEffDto> resultList = grouped.entrySet().stream()
+                .map(entry -> buildResultDto(entry, dictMap))// 鎻愬彇鏋勫缓鏂规硶
+                .sorted(Comparator.comparing(TeamEquEffDto::getUtilizationRate).reversed())
+                .collect(Collectors.toList());
+
+        result.put("dataList", resultList);
+        result.put("teamCodeList", resultList.stream()
+                .map(TeamEquEffDto::getTeamCode)
+                .collect(Collectors.toList()));
+
+        return result;
+
+    }
+
+    @Override
+    public Map<String, Object> teamEfficiencyAnalyzeByMonth(String userId, EquEffVo equEffVo) {
+        Map<String, Object> result = new HashMap<>();
+
+        // 1. 鏃ユ湡澶勭悊
+        LocalDate now = LocalDate.now();
+        Date start = DateUtils.toDate(now.plusMonths(-6).toString(), DateUtils.STR_DATE);
+        Date end = DateUtils.toDate(now.plusMonths(-1).toString(), DateUtils.STR_DATE);
+
+        List<String> monthBetween = DateUtils.getMonthBetween(start, end);
+        List<String> dateList = monthBetween.stream()
+                .map(date -> date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�")
+                .collect(Collectors.toList());
+        result.put("dateList", dateList);
+
+        // 2. 鑾峰彇浜х嚎鏁版嵁
+        List<MdcProduction> mdcProductions = mdcProductionService.findMdcPros(userId, equEffVo.getProductionId());
+
+        // 3. 鍒濆鍖栫粨鏋滈泦
+        List<TeamEquEffMonthDto> utilizationRateList = new ArrayList<>();
+        List<TeamEquEffMonthDto> shiftUtilizationRateList = new ArrayList<>();
+        List<TeamEquEffMonthDto> amendUtilizationRateList = new ArrayList<>();
+
+        // 4. 澶勭悊姣忎釜浜х嚎
+        mdcProductions.forEach(mdcProduction -> {
+            // 4.1 鑾峰彇涓嬬骇浜х嚎骞惰繃婊�
+            List<String> allProductionIds = mdcProductionService.recursionChildren(mdcProduction.getId());
+            // 鏁版嵁鏉冮檺杩囨护
+            allProductionIds = mdcProductionService.findProIdsByUId(userId, allProductionIds);
+            // 4.2 鑾峰彇璁惧鍒楄〃
+            List<MdcEquipment> equipmentList = mdcEquipmentService.findByProductionIds(allProductionIds);
+            if (equipmentList == null || equipmentList.isEmpty()) {
+                return;
+            }
+            //鎻愬彇id闆嗗悎
+            List<String> equipmentIdList = equipmentList.stream()
+                    .map(MdcEquipment::getEquipmentId)
+                    .collect(Collectors.toList());
+
+            TeamEquEffMonthDto urDto = new TeamEquEffMonthDto();
+            TeamEquEffMonthDto surDto = new TeamEquEffMonthDto();
+            TeamEquEffMonthDto aurDto = new TeamEquEffMonthDto();
+            urDto.setProductionName(mdcProduction.getProductionName());
+            surDto.setProductionName(mdcProduction.getProductionName());
+            aurDto.setProductionName(mdcProduction.getProductionName());
+            List<TeamEquEffMonthChildDto> urDataList = new ArrayList<>();
+            List<TeamEquEffMonthChildDto> surDataList = new ArrayList<>();
+            List<TeamEquEffMonthChildDto> aurDataList = new ArrayList<>();
+
+            monthBetween.forEach(date -> {
+                TeamEquEffMonthChildDto urCDto = new TeamEquEffMonthChildDto();
+                TeamEquEffMonthChildDto surCDto = new TeamEquEffMonthChildDto();
+                TeamEquEffMonthChildDto aurCDto = new TeamEquEffMonthChildDto();
+                String month = date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�";
+                urCDto.setMonth(month);
+                surCDto.setMonth(month);
+                aurCDto.setMonth(month);
+                List<TeamEquEffDto> dataList = mdcEfficiencyReportMapper.teamEquipmentEfficiencyAnalyze(equipmentIdList, date.replaceAll("-", ""));
+                if (dataList != null && !dataList.isEmpty()) {
+                    // 璁$畻骞冲潎鍊�
+                    BigDecimal ur = dataList.stream()
+                            .map(TeamEquEffDto::getUtilizationRate)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                            .divide(BigDecimal.valueOf(dataList.size()), 2, RoundingMode.HALF_UP);
+                    //鍒╃敤鐜�
+                    urCDto.setUtilizationRate(ur);
+                    //鐝鍒╃敤鐜�
+                    BigDecimal sur = dataList.stream()
+                            .map(TeamEquEffDto::getShiftUtilizationRate)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                            .divide(BigDecimal.valueOf(dataList.size()), 2, RoundingMode.HALF_UP);
+                    surCDto.setUtilizationRate(sur);
+                    //鍘婚櫎鏁呴殰24灏忔椂鍒╃敤鐜�
+                    BigDecimal aur = dataList.stream()
+                            .map(TeamEquEffDto::getAmendUtilizationRate)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                            .divide(BigDecimal.valueOf(dataList.size()), 2, RoundingMode.HALF_UP);
+                    aurCDto.setUtilizationRate(aur);
+                }
+                urDataList.add(urCDto);
+                surDataList.add(surCDto);
+                aurDataList.add(aurCDto);
+            });
+            urDto.setDataList(urDataList);
+            surDto.setDataList(surDataList);
+            aurDto.setDataList(aurDataList);
+            utilizationRateList.add(urDto);
+            shiftUtilizationRateList.add(surDto);
+            amendUtilizationRateList.add(aurDto);
+        });
+        result.put("utilizationRateList", utilizationRateList);
+        result.put("shiftUtilizationRateList", shiftUtilizationRateList);
+        result.put("amendUtilizationRateList", amendUtilizationRateList);
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> comprehensiveRateAnalyze(String userId, EquEffVo vo) {
+        Map<String, Object> result = new HashMap<>();
+        // 1. 鏃ユ湡澶勭悊
+        LocalDate now = LocalDate.now();
+        Date start = DateUtils.toDate(now.plusMonths(-12).toString(), DateUtils.STR_DATE);
+        Date end = DateUtils.toDate(now.plusMonths(-1).toString(), DateUtils.STR_DATE);
+
+        List<String> monthBetween = DateUtils.getMonthBetween(start, end);
+        List<String> dateList = monthBetween.stream()
+                .map(date -> date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�")
+                .collect(Collectors.toList());
+        result.put("dateList", dateList);
+
+        // 1. 澶勭悊鐢熶骇ID
+        List<String> mdcProductionIds = StringUtils.isBlank(vo.getProductionIds())
+                ? Collections.singletonList(vo.getProductionId())
+                : Arrays.asList(vo.getProductionIds().split(","));
+
+        List<String> allProductionIds = mdcProductionService.findChildren(mdcProductionIds);
+        if (allProductionIds.isEmpty()) {
+            return result; // 鎻愬墠杩斿洖绌虹粨鏋�
+        }
+        //鏁版嵁鏉冮檺杩囨护
+        allProductionIds = mdcProductionService.findProIdsByUId(userId, allProductionIds);
+        // 2. 鑾峰彇璁惧鍒楄〃
+        List<MdcEquipment> equipmentList = StringUtils.isNotBlank(vo.getEquipmentType())
+                ? mdcEquipmentService.findByProIdsAndType(allProductionIds, Arrays.asList(vo.getEquipmentType().split(",")))
+                : mdcEquipmentService.findByProductionIds(allProductionIds);
+
+        if (equipmentList.isEmpty()) {
+            return result;
+        }
+
+        // 3. 鏁版嵁澶勭悊
+        List<String> equipmentIdList = equipmentList.stream()
+                .map(MdcEquipment::getEquipmentId)
+                .collect(Collectors.toList());
+        String startStr = monthBetween.get(0).replaceAll("-", "");
+        String endStr = monthBetween.get(monthBetween.size() - 1).replaceAll("-", "");
+        List<ComRateDto> comRateDtoList = mdcEfficiencyReportMapper.comprehensiveRateAnalyze(equipmentIdList, startStr, endStr);
+        if (comRateDtoList.isEmpty()) {
+            return result; // 鎻愬墠杩斿洖绌虹粨鏋�
+        }
+        List<ComRateDto> dataList = new ArrayList<>();
+        Map<String, ComRateDto> map = comRateDtoList.stream().collect(Collectors.toMap(ComRateDto::getTheMonth, comRateDto -> comRateDto));
+        monthBetween.forEach(date -> {
+            String d = date.replaceAll("-", "");
+            String month = date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�";
+            if (map.containsKey(d)) {
+                ComRateDto comRateDto = map.get(d);
+                comRateDto.setTheMonth(month);
+                comRateDto.setUtilizationRate(comRateDto.getUtilizationRate().setScale(2, RoundingMode.HALF_UP));
+                comRateDto.setShiftUtilizationRate(comRateDto.getShiftUtilizationRate() != null ? comRateDto.getShiftUtilizationRate().setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO);
+                comRateDto.setAmendUtilizationRate(comRateDto.getAmendUtilizationRate().setScale(2, RoundingMode.HALF_UP));
+                comRateDto.setProcessLong(comRateDto.getProcessLong().divide(new BigDecimal("3600"), 2, RoundingMode.HALF_UP));
+                dataList.add(comRateDto);
+            } else {
+                ComRateDto comRateDto = new ComRateDto();
+                comRateDto.setTheMonth(month);
+                dataList.add(comRateDto);
+            }
+        });
+        result.put("dataList", dataList);
+
+        if (StringUtils.isNotBlank(vo.getShiftId())) {
+            List<MdcShiftSub> shiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper<MdcShiftSub>().eq(MdcShiftSub::getShiftId, vo.getShiftId()));
+            if (shiftSubList == null || shiftSubList.isEmpty()) {
+                return result;
+            }
+            List<String> shiftSubNameList = shiftSubList.stream().map(MdcShiftSub::getShiftSubName).collect(Collectors.toList());
+            result.put("shiftSubList", shiftSubNameList);
+
+            List<ComShiftRateDto> comShiftRateDtoList = mdcEfficiencyReportMapper.comprehensiveShiftRateAnalyze(equipmentIdList, startStr, endStr, vo.getShiftId());
+            Map<String, List<ComShiftRateDto>> groupMap;
+            if (comShiftRateDtoList != null && !comShiftRateDtoList.isEmpty()) {
+                groupMap = comShiftRateDtoList.stream().collect(Collectors.groupingBy(ComShiftRateDto::getShiftSub));
+            } else {
+                groupMap = new HashMap<>();
+            }
+            List<ComShiftDto> shiftDataList = new ArrayList<>();
+            shiftSubList.forEach(mdcShiftSub -> {
+                ComShiftDto comShiftDto = new ComShiftDto();
+                comShiftDto.setShiftSubName(mdcShiftSub.getShiftSubName());
+                if (groupMap.containsKey(mdcShiftSub.getId())) {
+                    List<ComShiftRateDto> csrd = groupMap.get(mdcShiftSub.getId());
+                    Map<String, ComShiftRateDto> collect = csrd.stream().collect(Collectors.toMap(ComShiftRateDto::getTheMonth, comShiftRateDto -> comShiftRateDto));
+                    List<ComShiftChildDto> comShiftChildDtoList = new ArrayList<>();
+                    monthBetween.forEach(date -> {
+                        String d = date.replaceAll("-", "");
+                        String month = date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�";
+                        if (collect.containsKey(d)) {
+                            ComShiftRateDto comShiftRateDto = collect.get(d);
+                            ComShiftChildDto comShiftChildDto = new ComShiftChildDto();
+                            comShiftChildDto.setMonth(month);
+                            comShiftChildDto.setUtilizationRate(comShiftRateDto.getUtilizationRate().setScale(2, RoundingMode.HALF_UP));
+                            comShiftChildDtoList.add(comShiftChildDto);
+                        } else {
+                            ComShiftChildDto comShiftChildDto = new ComShiftChildDto();
+                            comShiftChildDto.setMonth(month);
+                            comShiftChildDtoList.add(comShiftChildDto);
+                        }
+                    });
+                    comShiftDto.setDataList(comShiftChildDtoList);
+                } else {
+                    List<ComShiftChildDto> comShiftChildDtoList = new ArrayList<>();
+                    monthBetween.forEach(date -> {
+                        String month = date.substring(date.lastIndexOf("-") + 1).replaceFirst("^0*", "") + "鏈�";
+                        ComShiftChildDto comShiftChildDto = new ComShiftChildDto();
+                        comShiftChildDto.setMonth(month);
+                        comShiftChildDtoList.add(comShiftChildDto);
+                    });
+                    comShiftDto.setDataList(comShiftChildDtoList);
+                }
+                shiftDataList.add(comShiftDto);
+            });
+
+            result.put("shiftDataList", shiftDataList);
+        }
+
+        return result;
+    }
+
+    // 鎻愬彇鐨勫钩鍧囧�艰绠楁柟娉�
+    private TeamEquEffDto calculateAverages(List<TeamEquEffDto> items) {
+        BigDecimal size = new BigDecimal(items.size());
+        return new TeamEquEffDto(
+                calculateAverage(items, TeamEquEffDto::getUtilizationRate, size),
+                calculateAverage(items, TeamEquEffDto::getShiftUtilizationRate, size),
+                calculateAverage(items, TeamEquEffDto::getAmendUtilizationRate, size)
+        );
+    }
+
+    // 閫氱敤鐨勫钩鍧囧�艰绠�
+    private BigDecimal calculateAverage(List<TeamEquEffDto> items, Function<TeamEquEffDto, BigDecimal> mapper, BigDecimal size) {
+        return items.stream()
+                .map(mapper)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .divide(size, 2, RoundingMode.HALF_UP);
+    }
+
+    // 鏋勫缓缁撴灉DTO
+    private TeamEquEffDto buildResultDto(Map.Entry<String, TeamEquEffDto> entry, Map<String, String> dictMap) {
+        TeamEquEffDto dto = entry.getValue();
+        dto.setTeamCode(dictMap.getOrDefault(entry.getKey(), entry.getKey()));
+        return dto;
+    }
+
     private MdcUtilizationResultDto utilizationRate(String equipmentId, String equipmentName, String equipmentType, Date startTime, Date endTime, String date, List<MdcUtilizationRate> mdcUtilizationRateList) {
         MdcUtilizationResultDto dto = new MdcUtilizationResultDto();
         dto.setEquipmentId(equipmentId);
@@ -1760,7 +2131,7 @@
                 }
             }
             BigDecimal totalLong = new BigDecimal(DateUtils.differentSecond(startTime, endTime));
-            BigDecimal utilizationRate = processLong.divide(totalLong, 6, BigDecimal.ROUND_HALF_UP);
+            BigDecimal utilizationRate = processLong.divide(totalLong, 6, RoundingMode.HALF_UP);
             dto.setUtilizationRate(utilizationRate);
         } else {
             dto.setUtilizationRate(new BigDecimal("0"));
@@ -1803,6 +2174,9 @@
                     mdcEfficiencyResultDto.setOpenLong(efficiencyDto.getOpenLong());
                     mdcEfficiencyResultDto.setWaitLong(efficiencyDto.getWaitLong());
                     mdcEfficiencyResultDto.setCloseLong(efficiencyDto.getCloseLong());
+                    mdcEfficiencyResultDto.setFaultLong(efficiencyDto.getFaultLong());
+                    mdcEfficiencyResultDto.setFaultRate(efficiencyDto.getFaultRate());
+                    mdcEfficiencyResultDto.setRemoveFaultRunLong(efficiencyDto.getRemoveFaultRunLong());
                     long rate = efficiencyDto.getUtilizationRate().multiply(new BigDecimal("100")).longValue();
                     for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                         if (rate >= mdcUtilizationRate.getMinimumRange() && rate < mdcUtilizationRate.getMaximumRange()) {
@@ -1820,6 +2194,9 @@
             mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0"));
             mdcEfficiencyResultDto.setWaitLong(new BigDecimal("0"));
             mdcEfficiencyResultDto.setCloseLong(new BigDecimal("0"));
+            mdcEfficiencyResultDto.setFaultLong(new BigDecimal("0"));
+            mdcEfficiencyResultDto.setFaultRate(new BigDecimal("0"));
+            mdcEfficiencyResultDto.setRemoveFaultRunLong(new BigDecimal("0"));
             for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                 if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) {
                     mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
@@ -1835,6 +2212,9 @@
             mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0"));
             mdcEfficiencyResultDto.setWaitLong(new BigDecimal("0"));
             mdcEfficiencyResultDto.setCloseLong(new BigDecimal("0"));
+            mdcEfficiencyResultDto.setFaultLong(new BigDecimal("0"));
+            mdcEfficiencyResultDto.setFaultRate(new BigDecimal("0"));
+            mdcEfficiencyResultDto.setRemoveFaultRunLong(new BigDecimal("0"));
             for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
                 if (0 >= mdcUtilizationRate.getMinimumRange() && 0 < mdcUtilizationRate.getMaximumRange()) {
                     mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
@@ -1848,6 +2228,9 @@
         efficiencyResultDto.setOpenLong(efficiencyResultDto.getOpenLong().add(mdcEfficiencyResultDto.getOpenLong()));
         efficiencyResultDto.setWaitLong(efficiencyResultDto.getWaitLong().add(mdcEfficiencyResultDto.getWaitLong()));
         efficiencyResultDto.setCloseLong(efficiencyResultDto.getCloseLong().add(mdcEfficiencyResultDto.getCloseLong()));
+        efficiencyResultDto.setFaultLong(efficiencyResultDto.getFaultLong().add(mdcEfficiencyResultDto.getFaultLong()));
+        efficiencyResultDto.setFaultRate(efficiencyResultDto.getFaultRate().add(mdcEfficiencyResultDto.getFaultRate()));
+        efficiencyResultDto.setRemoveFaultRunLong(efficiencyResultDto.getRemoveFaultRunLong().add(mdcEfficiencyResultDto.getRemoveFaultRunLong()));
         return mdcEfficiencyResultDto;
     }
 

--
Gitblit v1.9.3