From a79d1641ab162cf1e96d3af666d1e77abde68c1b Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期一, 09 六月 2025 16:58:18 +0800
Subject: [PATCH] 批量导出设备利用率

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java | 2294 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 2,251 insertions(+), 43 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 fff89eb..f0fb0db 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
@@ -1,25 +1,38 @@
 package org.jeecg.modules.mdc.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import net.sf.saxon.expr.Component;
 import org.apache.commons.lang3.StringUtils;
-import org.jeecg.modules.mdc.dto.MdcEfficiencyDto;
-import org.jeecg.modules.mdc.dto.MdcEfficiencyListDto;
-import org.jeecg.modules.mdc.dto.MdcEfficiencyResultDto;
-import org.jeecg.modules.mdc.entity.MdcEquipment;
-import org.jeecg.modules.mdc.entity.MdcUtilizationRate;
+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.IMdcEquipmentService;
-import org.jeecg.modules.mdc.service.IMdcUtilizationRateService;
-import org.jeecg.modules.mdc.service.MdcEfficiencyReportService;
+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.MdcEfficiencyReportQueryVo;
-import org.jeecg.modules.mdc.vo.MdcEfficiencyVo;
+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;
 
@@ -39,6 +52,21 @@
     @Resource
     private IMdcUtilizationRateService mdcUtilizationRateService;
 
+    @Resource
+    private ISysDepartService sysDepartService;
+
+    @Resource
+    private IMdcProductionService mdcProductionService;
+
+    @Resource
+    private IMdcShiftSubService mdcShiftSubService;
+
+    @Resource
+    private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
+
+    @Resource
+    private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService;
+
     /**
      * 鍒╃敤鐜囨姤琛�
      *
@@ -48,6 +76,389 @@
      */
     @Override
     public MdcEfficiencyVo efficiencyList(String userId, MdcEfficiencyReportQueryVo vo) {
+        MdcEfficiencyVo result = new MdcEfficiencyVo();
+        List<MdcEfficiencyListDto> listDtos = new ArrayList<>();
+
+        // 鑾峰彇璁惧 ID 鍒楄〃
+        List<String> equipmentIds = getEquipmentIds(userId, vo);
+        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
+            vo.setEquipmentIdList(equipmentIds);
+        }
+
+        // 鑾峰彇鏃ユ湡鍒楄〃
+        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
+        result.setDates(dates);
+
+        // 鑾峰彇璁惧鍒╃敤鐜囧垪琛�
+        List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl");
+
+        // 濡傛灉璁惧 ID 鍒楄〃涓虹┖锛岀洿鎺ヨ繑鍥�
+        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
+            result.setMdcEfficiencyList(listDtos);
+            return result;
+        }
+
+        // 鑾峰彇璁惧 ID 鍒楄〃
+        List<String> equipmentIdList = mdcEquipmentService.listEquipmentId(vo);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            result.setMdcEfficiencyList(listDtos);
+            return result;
+        }
+
+        vo.setEquipmentIdList(equipmentIdList);
+
+        // 鏌ヨ璁惧鏁堢巼鏁版嵁
+        List<MdcEfficiencyDto> 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<String> 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<MdcEfficiencyListDto> processDepartmentLevel(MdcEfficiencyReportQueryVo vo, List<MdcEfficiencyDto> efficiencyList, List<String> dates, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
+        List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>()
+                .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<MdcEfficiencyListDto> processProductionLevel(MdcEfficiencyReportQueryVo vo, List<MdcEfficiencyDto> efficiencyList, List<String> dates, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
+        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>()
+                .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<SysDepart> 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> 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<MdcProduction> 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> 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<MdcEfficiencyResultDto> processEfficiencyData(List<MdcEfficiencyDto> efficiencyList, List<String> dates, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyResultDto> 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<MdcEfficiencyListDto> listDtos, List<MdcUtilizationRate> 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<MdcEfficiencyResultDto> calculateAverage(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyResultDto> result = new ArrayList<>();
+        List<MdcEfficiencyResultDto> 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<MdcEfficiencyResultDto> calculateTotal(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyResultDto> result = new ArrayList<>();
+        List<MdcEfficiencyResultDto> 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<MdcEfficiencyListDto> listDtos = new ArrayList<>();
         List<String> equipmentIds = new ArrayList<>();
@@ -72,64 +483,1840 @@
                 equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null);
             }
         }
-        vo.setEquipmentIdList(equipmentIds);
-
-        // 鏌ヨ鍒╃敤鐜囨暟鎹�
-        List<MdcEfficiencyDto> efficiencyList = mdcEfficiencyReportMapper.efficiencyList(vo);
-        // 鍒╃敤鐜囩瓑绾�
-        List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl");
-
-        //灏佽缁撴灉
-        List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().in(MdcEquipment::getEquipmentId, vo.getEquipmentIdList()));
-
-        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
-
-        for (MdcEquipment mdcEquipment : equipmentList) {
-            MdcEfficiencyListDto mdcEfficiencyListDto = new MdcEfficiencyListDto();
-            mdcEfficiencyListDto.setEquipmentId(mdcEquipment.getEquipmentId());
-            mdcEfficiencyListDto.setEquipmentName(mdcEquipment.getEquipmentName());
-            mdcEfficiencyListDto.setEquipmentType(mdcEquipment.getEquipmentType());
-            List<MdcEfficiencyResultDto> list = new ArrayList<>();
-            for (String date : dates) {
-                list.add(this.efficiencyRate(efficiencyList, date, mdcEquipment, mdcUtilizationRateList));
-            }
-            mdcEfficiencyListDto.setDataList(list);
-            listDtos.add(mdcEfficiencyListDto);
+        if (vo.getEquipmentIdList() == null || vo.getEquipmentIdList().isEmpty()) {
+            vo.setEquipmentIdList(equipmentIds);
         }
 
-        result.setMdcEfficiencyList(listDtos);
+        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
         result.setDates(dates);
+
+        // 鍒╃敤鐜囩瓑绾�
+        List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("kdl");
+
+        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);
+            } else {
+                result.setMdcEfficiencyList(listDtos);
+                return result;
+            }
+            // 鏌ヨ鍒╃敤鐜囨暟鎹�
+            List<MdcEfficiencyDto> efficiencyList = mdcEfficiencyReportMapper.efficiencyPOList(vo);
+
+            // 灏佽缁撴灉
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
+                // 鏌ヨ鎵�鏈夐儴闂ㄤ俊鎭�
+                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().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<MdcEfficiencyResultDto> 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<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
+                // 鏌ヨ鎵�鏈変骇绾夸俊鎭�
+                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().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<MdcEfficiencyResultDto> 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<MdcEfficiencyResultDto> calculateOpenAverage(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyResultDto> result = new ArrayList<>();
+        List<MdcEfficiencyResultDto> 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<MdcEfficiencyResultDto> calculateOpenTotal(List<MdcEfficiencyListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyResultDto> result = new ArrayList<>();
+        List<MdcEfficiencyResultDto> 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<MdcEfficiencyShiftListDto> listDtos = new ArrayList<>();
+        List<String> 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<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl");
+
+        List<String> 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<String> equipmentIdList = mdcEquipmentService.listEquipmentIdShift(vo);
+            if (equipmentIdList != null && !equipmentIdList.isEmpty()) {
+                vo.setEquipmentIdList(equipmentIdList);
+            } else {
+                result.setMdcEfficiencyList(listDtos);
+                return result;
+            }
+
+
+            // 鐝鍒╃敤鐜囨暟鎹�
+            List<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList = mdcEfficiencyReportMapper.efficiencyShiftSumList(vo);
+
+            // 灏佽缁撴灉
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
+                // 鏌ヨ鎵�鏈夐儴闂ㄤ俊鎭�
+                List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().ne(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(SysDepart::getDepartOrder));
+                // 鐝鍚嶇О鏄剧ず澶勭悊
+                String shiftSubName = "";
+                if (StringUtils.isBlank(vo.getShiftId())) {
+                    // 鍚堝苟璁惧姣忓ぉ鎵�鏈夌彮娆$殑鏁版嵁
+                    shiftSubName = "鍏ㄩ儴";
+                } else {
+                    List<MdcShiftSub> mdcShiftSubList = new ArrayList<>();
+                    if (StringUtils.isBlank(vo.getShiftSubId())) {
+                        // 鎷兼帴鎵�閫夌彮鍒朵笅鐨勬墍鏈夌彮娆″悕绉�
+                        mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper<MdcShiftSub>().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<MdcShiftSub>().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<String> 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<MdcEfficiencyShiftResultDto> 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<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
+                // 鏌ヨ鎵�鏈変骇绾夸俊鎭�
+                List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().ne(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_1.toString()).orderByAsc(MdcProduction::getProductionOrder));
+
+                // 鐝鍚嶇О鏄剧ず澶勭悊
+                String shiftSubName = "";
+                if (StringUtils.isBlank(vo.getShiftId())) {
+                    // 鍚堝苟璁惧姣忓ぉ鎵�鏈夌彮娆$殑鏁版嵁
+                    shiftSubName = "鍏ㄩ儴";
+                } else {
+                    List<MdcShiftSub> mdcShiftSubList = new ArrayList<>();
+                    if (StringUtils.isBlank(vo.getShiftSubId())) {
+                        // 鎷兼帴鎵�閫夌彮鍒朵笅鐨勬墍鏈夌彮娆″悕绉�
+                        mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper<MdcShiftSub>().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<MdcShiftSub>().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<String> 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<MdcEfficiencyShiftResultDto> 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<MdcEfficiencyShiftResultDto> calculateShiftAverage(List<MdcEfficiencyShiftListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyShiftResultDto> result = new ArrayList<>();
+        List<MdcEfficiencyShiftResultDto> 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<MdcEfficiencyShiftResultDto> calculateShiftTotal(List<MdcEfficiencyShiftListDto> mdcEfficiencyList, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        List<MdcEfficiencyShiftResultDto> result = new ArrayList<>();
+        List<MdcEfficiencyShiftResultDto> 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<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList, String date, String equipmentId, List<MdcUtilizationRate> 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<MdcEquipmentStatisticalShiftInfo> handleEfficiencyShiftList(List<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList) {
+        List<MdcEquipmentStatisticalShiftInfo> result = new ArrayList<>();
+        Map<String, MdcEquipmentStatisticalShiftInfo> 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<String> 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<MdcEfficiencyDto> 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<String> 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<MdcComAnaDto> resultDtos = mdcEfficiencyReportMapper.comparativeAnalysis(vo);
+        if (resultDtos != null && !resultDtos.isEmpty()) {
+            // 缁勮鍥惧舰鍜屼华琛ㄦ暟鎹�
+            List<GraphicsDto> 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<UtilizationRateDto> tops = new ArrayList<>();
+            List<UtilizationRateDto> 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;
     }
 
-    private MdcEfficiencyResultDto efficiencyRate(List<MdcEfficiencyDto> efficiencyList, String date, MdcEquipment mdcEquipment, List<MdcUtilizationRate> mdcUtilizationRateList) {
+    /**
+     * 璁惧鏃ュ埄鐢ㄧ巼
+     *
+     * @param vo
+     * @return
+     */
+    @Override
+    public DayUtilizationRateDto dayUtilizationRate(String userId, DayUtilizationRateQueryVo vo) {
+        DayUtilizationRateDto result = new DayUtilizationRateDto();
+        if (StringUtils.isBlank(vo.getEquipmentId())) {
+            List<String> 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<MdcEquipment>().eq(MdcEquipment::getEquipmentId, vo.getEquipmentId()));
+        result.setEquipmentName(mdcEquipment.getEquipmentName());
+        List<String> 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<DayRateDto> 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<MdcEquipmentRunningSection> 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<String> 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<MdcEquipment>().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<String> dateList = DateUtils.getDatesStringLists(start, end);
+        result.setDateList(dateList);
+        List<String> datesStringList = DateUtils.getDatesStringList(start, end);
+        List<DayRateDto> 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<MdcEquipmentRunningSection> 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<MdcUtilizationRateListDto> listDtos = new ArrayList<>();
+        List<String> 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<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartDate()), DateUtils.getShortDate2(vo.getEndDate()));
+        List<String> 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<String> equipmentIdList = mdcEquipmentService.listEquipmentId(vo1);
+            if (equipmentIdList != null && !equipmentIdList.isEmpty()) {
+                vo.setEquipmentIdList(equipmentIdList);
+            } else {
+                result.setMdcEfficiencyList(listDtos);
+                return result;
+            }
+
+            // 鍒╃敤鐜囩瓑绾�
+            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl");
+
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                List<MdcEquDepDto> 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<MdcUtilizationResultDto> 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<MdcEquProDto> 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<MdcUtilizationResultDto> 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<MdcUtilizationRateListDto> listDtos = new ArrayList<>();
+        List<String> 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<String> 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<String> equipmentIdList = mdcEquipmentService.listEquipmentId(vo1);
+            if (equipmentIdList != null && !equipmentIdList.isEmpty()) {
+                vo.setEquipmentIdList(equipmentIdList);
+            } else {
+                result.setMdcEfficiencyList(listDtos);
+                return result;
+            }
+
+            // 鍒╃敤鐜囩瓑绾�
+            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("lyl");
+            if ("2".equals(vo.getTypeTree())) {
+                // 閮ㄩ棬灞傜骇
+                List<MdcEquDepDto> 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<MdcUtilizationResultDto> 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<MdcEquProDto> 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<MdcUtilizationResultDto> 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<MdcUtilizationRate> 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<BigDecimal> 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<String> 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<String> equipmentIdList = mdcEquipmentService.listEquipmentId(vo);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            throw new JeecgBootException("鏃犳暟鎹�");
+        }
+        vo.setEquipmentIdList(equipmentIdList);
+
+        // 3. 鍑嗗璁惧鏁版嵁
+        List<MdcEfficiencyListDto> exportData = new ArrayList<>();
+
+        // 鑾峰彇鏃ユ湡鍒楄〃骞舵寜鏈堝垎缁�
+        List<String> dates = DateUtils.getDatesStringList2(DateUtils.getShortDate2(vo.getStartTime()), DateUtils.getShortDate2(vo.getEndTime()));
+
+        Map<String, List<String>> groupedByMonth = dates.stream()
+                .collect(Collectors.groupingBy(
+                        date -> date.substring(0, 6) // 鎻愬彇骞存湀锛堝 "202405"锛�
+                ));
+        // 2. 鎻愬彇姣忔湀鐨勯灏炬棩鏈�
+        List<Map<String, Object>> monthRanges = groupedByMonth.entrySet().stream()
+                .map(entry -> {
+                    List<String> monthDates = entry.getValue();
+                    Map<String, Object> 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<String, Object> monthRange : monthRanges) {
+            List<MdcEfficiencyListDto> listDtos = new ArrayList<>();
+            vo.setStartTime((String) monthRange.get("startTime"));
+            vo.setEndTime((String) monthRange.get("endTime"));
+            List<String> dateList = (List<String>) monthRange.get("dateList");
+            // 鏌ヨ璁惧鏁堢巼鏁版嵁
+            List<MdcEfficiencyDto> 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<String, MdcEfficiencyListDto> map = listDtos.stream().collect(Collectors.toMap(MdcEfficiencyListDto::getEquipmentId, a -> a, (k1, k2) -> k1));
+                exportData.forEach(mdcEfficiencyListDto -> {
+                    List<MdcEfficiencyResultDto> dataList = mdcEfficiencyListDto.getDataList();
+                    if (map.containsKey(mdcEfficiencyListDto.getEquipmentId())) {
+                        MdcEfficiencyListDto mdcEfficiencyListDto1 = map.get(mdcEfficiencyListDto.getEquipmentId());
+                        List<MdcEfficiencyResultDto> 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);
+            // 瑙e喅POI鑷姩鍒楀杩囩獎闂锛屽鍔犻澶栧搴︼紙鍗曚綅锛�1/256瀛楃瀹藉害锛岃繖閲屽鍔�200鐩稿綋浜庣害3涓瓧绗︼級
+            sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 1800);
+        }
+    }
+
+    /**
+     * 澶勭悊鍚堝苟鍗曞厓鏍硷紝纭繚鍒楀璁$畻姝g‘
+     * 锛圥OI鐨刟utoSizeColumn瀵瑰悎骞跺崟鍏冩牸鏀寔涓嶄匠锛岄渶瑕佹墜鍔ㄥ睍寮�璁$畻锛�
+     */
+    private void adjustMergedCells(Sheet sheet) {
+        List<CellRangeAddress> 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;
+                }
+            }
+
+            // 搴旂敤鍒版墍鏈夊悎骞跺垪锛堝彧璁剧疆棣栧垪瀹藉害锛孭OI浼氳嚜鍔ㄥ悓姝ュ埌鍚堝苟鍒楋級
+            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<MdcEfficiencyListDto> processDeLevel(MdcEfficiencyReportQueryVo vo, List<MdcEfficiencyDto> efficiencyList, List<String> dates) {
+        List<MdcEquDepDto> equipmentList = mdcEquipmentService.findEquDepList(vo.getEquipmentIdList());
+        List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>()
+                .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<MdcEfficiencyListDto> processProLevel(MdcEfficiencyReportQueryVo vo, List<MdcEfficiencyDto> efficiencyList, List<String> dates) {
+        List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(vo.getEquipmentIdList());
+        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>()
+                .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<MdcEfficiencyResultDto> processEffData(List<MdcEfficiencyDto> efficiencyList, List<String> dates, String equipmentId) {
+        List<MdcEfficiencyResultDto> 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<MdcEfficiencyDto> efficiencyList, String date, String equipmentId) {
+        MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
+        if (efficiencyList != null && !efficiencyList.isEmpty()) {
+            Map<String, MdcEfficiencyDto> collect = new HashMap<>();
+            efficiencyList.forEach(mdcEfficiencyDto -> {
+                if (!collect.containsKey(mdcEfficiencyDto.getEquipmentId() + "_" + mdcEfficiencyDto.getTheDate())) {
+                    collect.put(mdcEfficiencyDto.getEquipmentId() + "_" + mdcEfficiencyDto.getTheDate(), mdcEfficiencyDto);
+                }
+            });
+            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<String> 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<MdcEfficiencyListDto> exportData, List<String> 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瀵瑰簲鐨凪ap宸插垵濮嬪寲
+                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<MdcUtilizationRate> mdcUtilizationRateList) {
+        MdcUtilizationResultDto dto = new MdcUtilizationResultDto();
+        dto.setEquipmentId(equipmentId);
+        dto.setEquipmentName(equipmentName);
+        dto.setEquipmentType(equipmentType);
+        dto.setTheDate(date);
+        List<MdcEquipmentRunningSection> 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<MdcEfficiencyDto> 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<MdcEfficiencyDto> efficiencyList, String date, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList, MdcEfficiencyResultDto efficiencyResultDto) {
         MdcEfficiencyResultDto mdcEfficiencyResultDto = new MdcEfficiencyResultDto();
         if (efficiencyList != null && !efficiencyList.isEmpty()) {
             for (MdcEfficiencyDto efficiencyDto : efficiencyList) {
-                if (date.equals(efficiencyDto.getTheDate()) && efficiencyDto.getEquipmentId().equals(mdcEquipment.getEquipmentId())) {
+                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.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 (efficiencyDto.getUtilizationRate().longValue() * 100 >= mdcUtilizationRate.getMinimumRange() && efficiencyDto.getUtilizationRate().longValue() * 100 < mdcUtilizationRate.getMaximumRange()) {
+                        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.setStartRate(new BigDecimal("0"));
             mdcEfficiencyResultDto.setOpenRate(new BigDecimal("0"));
             mdcEfficiencyResultDto.setOpenLong(new BigDecimal("0"));
@@ -141,7 +2328,28 @@
                 }
             }
         }
-
+        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;
     }
 

--
Gitblit v1.9.3