From 680a66f5aad3dc6fc41251db8ee2e8a263a34fb7 Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期五, 28 三月 2025 14:20:47 +0800
Subject: [PATCH] 班组综合利用率图表接口

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 101 insertions(+), 8 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 fde18f5..0d7ebe1 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,7 @@
 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.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -24,6 +26,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 +56,9 @@
 
     @Resource
     private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
+
+    @Resource
+    private ISysDictService sysDictService;
 
     /**
      * 鍒╃敤鐜囨姤琛�
@@ -1739,28 +1745,115 @@
     /**
      * 鐝粍鍚勮澶囩患鍚堝埄鐢ㄧ巼
      *
-     * @param teamEquEffVo
+     * @param equEffVo
      * @return
      */
     @Override
-    public Map<String, Object> teamEquipmentEfficiencyAnalyze(TeamEquEffVo teamEquEffVo) {
+    public Map<String, Object> equipmentEfficiencyAnalyze(EquEffVo equEffVo) {
         Map<String, Object> result = new HashMap<>();
         List<String> mdcProductionIds = new ArrayList<>();
-        if (StringUtils.isEmpty(teamEquEffVo.getProductionIds())) {
-            mdcProductionIds.add(teamEquEffVo.getProductionId());
+        if (StringUtils.isBlank(equEffVo.getProductionIds())) {
+            mdcProductionIds.add(equEffVo.getProductionId());
         } else {
-            mdcProductionIds.addAll(Arrays.asList(teamEquEffVo.getProductionIds().split(",")));
+            mdcProductionIds.addAll(Arrays.asList(equEffVo.getProductionIds().split(",")));
         }
         List<String> allProductionIds = mdcProductionService.findChildren(mdcProductionIds);
         List<MdcEquipment> equipmentList = mdcEquipmentService.findByProductionIds(allProductionIds);
         if (equipmentList != null && !equipmentList.isEmpty()) {
             List<String> equipmentIdList = equipmentList.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
-            List<TeamEquipmentEfficiencyAnalyzeDto> dataList = mdcEfficiencyReportMapper.teamEquipmentEfficiencyAnalyze(equipmentIdList, teamEquEffVo.getMonth());
+            List<EquipmentEfficiencyAnalyzeDto> dataList = mdcEfficiencyReportMapper.equipmentEfficiencyAnalyze(equipmentIdList, equEffVo.getMonth());
             result.put("dataList", dataList);
-            List<String> equipmentNameList = dataList.stream().map(TeamEquipmentEfficiencyAnalyzeDto::getEquipmentName).collect(Collectors.toList());
+            List<String> equipmentNameList = dataList.stream().map(EquipmentEfficiencyAnalyzeDto::getEquipmentName).collect(Collectors.toList());
             result.put("equipmentNameList", equipmentNameList);
         }
         return result;
+    }
+
+    @Override
+    public Map<String, Object> teamEquipmentEfficiencyAnalyze(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; // 鎻愬墠杩斿洖绌虹粨鏋�
+        }
+
+        // 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;
+
+    }
+
+    // 鎻愬彇鐨勫钩鍧囧�艰绠楁柟娉�
+    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) {
@@ -1787,7 +1880,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"));

--
Gitblit v1.9.3