From 40c22341b74d5bec60cbec08e338d8c8b22fcc92 Mon Sep 17 00:00:00 2001
From: lius <Lius2225@163.com>
Date: 星期四, 27 七月 2023 17:28:23 +0800
Subject: [PATCH] 班次利用率

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java               |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRepairMapper.xml                       |   22 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRepairMapper.java                          |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDateVo.java                                             |   17 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java       |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftListDto.java                            |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftResultDto.java                          |   49 +++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRepairService.java                       |   11 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java                  |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java |  478 +++++++++++++++++++++++++----
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentStatisticalShiftInfo.java                  |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRepairServiceImpl.java               |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java              |  244 +++++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml               |   28 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java                         |   10 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml                      |   43 ++
 16 files changed, 880 insertions(+), 68 deletions(-)

diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftListDto.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftListDto.java
index 200180d..105506d 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftListDto.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftListDto.java
@@ -36,5 +36,5 @@
     /**
      * 鍒╃敤鐜囨暟鎹�
      */
-    private List<MdcEfficiencyResultDto> dataList;
+    private List<MdcEfficiencyShiftResultDto> dataList;
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftResultDto.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftResultDto.java
new file mode 100644
index 0000000..aa92a72
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEfficiencyShiftResultDto.java
@@ -0,0 +1,49 @@
+package org.jeecg.modules.mdc.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: LiuS
+ * @create: 2023-07-26 16:04
+ */
+@Data
+public class MdcEfficiencyShiftResultDto {
+    /**
+     * 鏈夋晥鏃ユ湡
+     */
+    private String theDate;
+    /**
+     * 鍔犲伐鏃堕暱
+     */
+    private BigDecimal processLong;
+    /**
+     * 鍒╃敤鐜�
+     */
+    private BigDecimal utilizationRate;
+    /**
+     * 寮�鍔ㄧ巼
+     */
+    private BigDecimal startRate;
+    /**
+     * 寮�鏈虹巼
+     */
+    private BigDecimal openRate;
+    /**
+     * 寮�鏈烘椂闀�
+     */
+    private BigDecimal openLong;
+    /**
+     * 寰呮満鏃堕暱
+     */
+    private BigDecimal waitLong;
+    /**
+     * 鍏虫満鏃堕暱
+     */
+    private BigDecimal closeLong;
+    /**
+     * 棰滆壊
+     */
+    private String color;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentStatisticalShiftInfo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentStatisticalShiftInfo.java
index 1ffc1f7..3feb581 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentStatisticalShiftInfo.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentStatisticalShiftInfo.java
@@ -76,6 +76,11 @@
     @ApiModelProperty(value = "鎶ヨ鏃堕暱")
     private BigDecimal errorLong = new BigDecimal("0");
     /**
+     * 鏈夋晥鎬绘椂闀�
+     */
+    @ApiModelProperty(value = "鏈夋晥鎬绘椂闀�")
+    private BigDecimal totalLong = new BigDecimal("0");
+    /**
      * 鏈夋晥鏃ユ湡
      */
     @ApiModelProperty(value = "鏈夋晥鏃ユ湡")
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java
index 7462e8e..f041ad2 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEfficiencyReportMapper.java
@@ -2,7 +2,9 @@
 
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.mdc.dto.MdcEfficiencyDto;
+import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo;
 import org.jeecg.modules.mdc.vo.MdcEfficiencyReportQueryVo;
+import org.jeecg.modules.mdc.vo.MdcEfficiencyReportShiftQueryVo;
 
 import java.util.List;
 
@@ -27,4 +29,12 @@
      * @return
      */
     List<MdcEfficiencyDto> efficiencyPOList(@Param("vo") MdcEfficiencyReportQueryVo vo);
+
+    /**
+     * 寰楀埌鎵�鏈夌彮娆℃暟鎹箣鍜�
+     *
+     * @param vo
+     * @return
+     */
+    List<MdcEquipmentStatisticalShiftInfo> efficiencyShiftSumList(@Param("vo") MdcEfficiencyReportShiftQueryVo vo);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRepairMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRepairMapper.java
index c02fd62..d99633e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRepairMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRepairMapper.java
@@ -5,6 +5,9 @@
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.mdc.entity.MdcEquipmentRepair;
 
+import java.util.Date;
+import java.util.List;
+
 
 /**
  * @Description: 璁惧缁翠慨浼戠彮
@@ -21,4 +24,5 @@
      */
     IPage<MdcEquipmentRepair> pageList(IPage<MdcEquipmentRepair> pageData, @Param("repair") MdcEquipmentRepair repair);
 
+    List<MdcEquipmentRepair> selectByIdAndTime(@Param("equipmentId") String equipmentid, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
index 2a3a7c6..8ef1f7c 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentRunningSectionMapper.java
@@ -39,4 +39,14 @@
      * 璁$畻涓�娈垫椂闂村唴鐨勬暟鎹�
      */
     List<MdcEquipmentRunningSection> listEquipmentRunningSection(@Param("equipmentId") String equipmentid, @Param("startLong") long start, @Param("endLong") long end);
+
+    /**
+     * 璁$畻涓�娈垫椂闂村唴鐨勮繍琛屾暟鎹�
+     */
+    List<MdcEquipmentRunningSection> listEquipmentRunningSectionRun(@Param("equipmentId") String equipmentid, @Param("startLong") long start, @Param("endLong") long end);
+
+    /**
+     * 璁$畻涓�娈垫椂闂村唴鐨勬晠闅滄暟鎹�
+     */
+    List<MdcEquipmentRunningSection> listEquipmentRunningSectionError(@Param("equipmentId") String equipmentid, @Param("startLong") long start, @Param("endLong") long end);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
index d5d3516..e85db73 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEfficiencyReportMapper.xml
@@ -68,4 +68,47 @@
         </if>
         ORDER BY t1.the_date
     </select>
+
+    <!--寰楀埌鎵�鏈夌彮娆℃暟鎹箣鍜�-->
+    <select id="efficiencyShiftSumList" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo">
+        SELECT
+            t2.equipment_id equipmentId,
+            t2.equipment_name equipmentName,
+            t2.equipment_type equipmentType,
+            t1.the_date theDate,
+            t1.shift_id shiftId,
+            t1.shift_sub_id shiftSubId,
+            SUM ( t1.process_long ) processLong,
+            SUM ( t1.open_long ) openLong,
+            SUM ( t1.wait_long ) waitLong,
+            SUM ( t1.close_long ) closeLong
+        FROM
+            mdc_equipment t2
+            LEFT JOIN mdc_equipment_statistical_shift_info t1 ON t1.equipment_id = t2.equipment_id
+        <where>
+            AND t1.the_date &lt;= #{ endTime }
+            AND t1.the_date &gt;= #{ startTime }
+            <if test="vo.equipmentIdList != null and vo.equipmentIdList.size() > 0 ">
+                AND t2.equipment_id IN
+                <foreach collection="vo.equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+                    #{ id }
+                </foreach>
+            </if>
+            <if test="vo.shiftId != null and vo.shiftId != ''">
+                AND t1.shift_id = #{ vo.shiftId }
+            </if>
+            <if test="vo.shiftSubId != null and vo.shiftSubId != ''">
+                AND t1.shift_sub_id = #{ vo.shiftSubId }
+            </if>
+        </where>
+        GROUP BY
+            t2.equipment_id,
+            t2.equipment_name,
+            t2.equipment_type,
+            t1.the_date,
+            t1.shift_id,
+            t1.shift_sub_id
+        ORDER BY
+            t1.the_date
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRepairMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRepairMapper.xml
index 9159e09..553523b 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRepairMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRepairMapper.xml
@@ -31,4 +31,26 @@
         ORDER BY START_TIME ASC
     </select>
 
+    <!--鏌ヨ鏌愭鏃堕棿鍐呮槸鍚︽湁缁翠慨浼戠彮鏁版嵁-->
+    <select id="selectByIdAndTime" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentRepair">
+        SELECT
+            *
+        FROM
+            mdc_equipment_repair
+        <where>
+            <if test="equipmentId != null and equipmentId!= ''">
+                AND equipment_id = #{ equipmentId }
+            </if>
+            <if test="startTime != null and endTime!= null">
+                AND (
+                ( START_TIME  <![CDATA[ >= ]]>  #{ startTime }  AND START_TIME <![CDATA[ <= ]]>  #{ endTime } )
+                OR ( START_TIME <![CDATA[ <= ]]> #{ startTime }  AND END_TIME <![CDATA[ >= ]]> #{ endTime })
+                OR ( END_TIME <![CDATA[ >= ]]> #{ startTime }  AND END_TIME <![CDATA[ <= ]]>  #{ endTime } )
+                OR ( START_TIME <![CDATA[ <= ]]> #{ startTime }  AND END_TIME <![CDATA[ >= ]]> #{ endTime } )
+                )
+            </if>
+        </where>
+        ORDER BY start_time ASC
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
index a9566ea..7d4294e 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentRunningSectionMapper.xml
@@ -43,5 +43,33 @@
             start_time
     </select>
 
+    <!--璁$畻涓�娈垫椂闂村唴鐨勮繍琛屾暟鎹�-->
+    <select id="listEquipmentRunningSectionRun" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection">
+        SELECT
+            *
+        FROM
+            mdc_equipment_running_section
+        WHERE
+            equipment_id = #{ equipmentId }
+            AND status <![CDATA[ <> ]]> '22'
+            AND  (start_long &lt;= #{ endLong } AND end_long &gt;= #{ startLong })
+        ORDER BY
+            start_time
+    </select>
+
+    <!--璁$畻涓�娈垫椂闂村唴鐨勬晠闅滄暟鎹�-->
+    <select id="listEquipmentRunningSectionError" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection">
+        SELECT
+            *
+        FROM
+            mdc_equipment_running_section
+        WHERE
+            equipment_id = #{ equipmentId }
+            AND status = '22'
+            AND  (start_long &lt;= #{ endLong } AND end_long &gt;= #{ startLong })
+        ORDER BY
+            start_time
+    </select>
+
 
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRepairService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRepairService.java
index 7c8d353..ca3464c 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRepairService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRepairService.java
@@ -28,6 +28,7 @@
 
     /**
      * 鍒嗛〉鏌ヨ
+     *
      * @param userId
      * @param page
      * @param repair
@@ -43,4 +44,14 @@
      * @return
      */
     boolean updateMdcRepair(MdcEquipmentRepair repair);
+
+    /**
+     * 鏌ヨ鏌愭鏃堕棿鍐呮槸鍚︽湁缁翠慨浼戠彮鏁版嵁
+     *
+     * @param equipmentid
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<MdcEquipmentRepair> mdcRepairListDate(String equipmentid, Date startDate, Date endDate);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
index 35e2297..1174bb4 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentRunningSectionService.java
@@ -51,4 +51,14 @@
      * 鏌ヨ鏌愪釜璁惧涓�娈垫椂闂村唴鐨勬暟鎹�
      */
     List<MdcEquipmentRunningSection> listRunningSectionFromLog(String equipmentid, long start, long end);
+
+    /**
+     * 鏌ヨ鎽镐釜璁惧涓�娈垫椂闂村唴鐨勮繍琛屾暟鎹�
+     */
+    List<MdcEquipmentRunningSection> listEquipmentRunningSectionRun(String equipmentid, long start, long end);
+
+    /**
+     * 鏌ヨ鎽镐釜璁惧涓�娈垫椂闂村唴鐨勬晠闅滄暟鎹�
+     */
+    List<MdcEquipmentRunningSection> listEquipmentRunningSectionError(String equipmentid, long start, long end);
 }
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 f7c0b2d..2fca558 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
@@ -6,9 +6,12 @@
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.mdc.dto.*;
 import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo;
+import org.jeecg.modules.mdc.entity.MdcShiftSub;
 import org.jeecg.modules.mdc.entity.MdcUtilizationRate;
 import org.jeecg.modules.mdc.mapper.MdcEfficiencyReportMapper;
 import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.service.IMdcShiftSubService;
 import org.jeecg.modules.mdc.service.IMdcUtilizationRateService;
 import org.jeecg.modules.mdc.service.MdcEfficiencyReportService;
 import org.jeecg.modules.mdc.util.DateUtils;
@@ -22,6 +25,7 @@
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author: LiuS
@@ -44,6 +48,9 @@
 
     @Resource
     private IMdcProductionService mdcProductionService;
+
+    @Resource
+    private IMdcShiftSubService mdcShiftSubService;
 
     /**
      * 鍒╃敤鐜囨姤琛�
@@ -449,10 +456,244 @@
             result.setMdcEfficiencyList(listDtos);
         } else {
             // 鐝鍒╃敤鐜囩瓑绾�
-            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("kdl");
+            List<MdcUtilizationRate> mdcUtilizationRateList = mdcUtilizationRateService.listByType("bclyl");
+            // 鐝鍒╃敤鐜囨暟鎹�
+            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()));
+                // 鐝鍚嶇О鏄剧ず澶勭悊
+                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.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<>();
+                    for (String date : dates) {
+                        list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquDepDto.getEquipmentId(), mdcUtilizationRateList));
+                    }
+                    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()));
+
+                // 鐝鍚嶇О鏄剧ず澶勭悊
+                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.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<>();
+                    for (String date : dates) {
+                        list.add(this.efficiencyShiftRate(mdcEquipmentStatisticalShiftInfoList, date, mdcEquProDto.getEquipmentId(), mdcUtilizationRateList));
+                    }
+                    mdcEfficiencyShiftListDto.setDataList(list);
+                    listDtos.add(mdcEfficiencyShiftListDto);
+                }
+            }
+            result.setMdcEfficiencyList(listDtos);
         }
+        return result;
+    }
 
+
+    private MdcEfficiencyShiftResultDto efficiencyShiftRate(List<MdcEquipmentStatisticalShiftInfo> mdcEquipmentStatisticalShiftInfoList, String date, String equipmentId, List<MdcUtilizationRate> mdcUtilizationRateList) {
+        MdcEfficiencyShiftResultDto mdcEfficiencyShiftResultDto = new MdcEfficiencyShiftResultDto();
+        if (mdcEquipmentStatisticalShiftInfoList != null && !mdcEquipmentStatisticalShiftInfoList.isEmpty()) {
+            for (MdcEquipmentStatisticalShiftInfo equipmentStatisticalShiftInfo : mdcEquipmentStatisticalShiftInfoList) {
+                if (date.equals(equipmentStatisticalShiftInfo.getTheDate()) && equipmentStatisticalShiftInfo.getEquipmentId().equals(equipmentId)) {
+                    mdcEfficiencyShiftResultDto.setTheDate(equipmentStatisticalShiftInfo.getTheDate());
+                    mdcEfficiencyShiftResultDto.setProcessLong(equipmentStatisticalShiftInfo.getProcessLong());
+                    mdcEfficiencyShiftResultDto.setUtilizationRate(equipmentStatisticalShiftInfo.getProcessLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, BigDecimal.ROUND_HALF_UP));
+                    mdcEfficiencyShiftResultDto.setCloseLong(equipmentStatisticalShiftInfo.getCloseLong());
+                    mdcEfficiencyShiftResultDto.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong());
+                    mdcEfficiencyShiftResultDto.setWaitLong(equipmentStatisticalShiftInfo.getWaitLong());
+                    mdcEfficiencyShiftResultDto.setOpenRate(equipmentStatisticalShiftInfo.getOpenLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, BigDecimal.ROUND_HALF_UP));
+                    for (MdcUtilizationRate mdcUtilizationRate : mdcUtilizationRateList) {
+                        if (mdcEfficiencyShiftResultDto.getUtilizationRate().longValue() * 100 >= mdcUtilizationRate.getMinimumRange() && mdcEfficiencyShiftResultDto.getUtilizationRate().longValue() * 100 < 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());
+                }
+            }
+        }
+        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()));
+            } else {
+                map.put(equipmentStatisticalShiftInfo.getEquipmentId() + "_" + equipmentStatisticalShiftInfo.getTheDate(), equipmentStatisticalShiftInfo);
+            }
+        }
+        for (String s : map.keySet()) {
+            result.add(map.get(s));
+        }
         return result;
     }
 
@@ -548,7 +789,6 @@
                             mdcEfficiencyResultDto.setColor(mdcUtilizationRate.getRateParameterColor());
                         }
                     }
-
                 }
             }
         } else {
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRepairServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRepairServiceImpl.java
index 5b083fe..3391b4a 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRepairServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRepairServiceImpl.java
@@ -239,4 +239,9 @@
         return result;
     }
 
+    @Override
+    public List<MdcEquipmentRepair> mdcRepairListDate(String equipmentid, Date startDate, Date endDate) {
+        return this.baseMapper.selectByIdAndTime(equipmentid, startDate, endDate);
+    }
+
 }
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
index afefa7a..1d529cf 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java
@@ -579,6 +579,16 @@
         return running;
     }
 
+    @Override
+    public List<MdcEquipmentRunningSection> listEquipmentRunningSectionRun(String equipmentid, long start, long end) {
+        return this.baseMapper.listEquipmentRunningSectionRun(equipmentid, start, end);
+    }
+
+    @Override
+    public List<MdcEquipmentRunningSection> listEquipmentRunningSectionError(String equipmentid, long start, long end) {
+        return this.baseMapper.listEquipmentRunningSectionError(equipmentid, start, end);
+    }
+
     private Map<String, List<MdcEquipmentRunningSectionDto>> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo, String date) {
         Map<String, List<MdcEquipmentRunningSectionDto>> map = new HashMap<>();
         List<MdcEquipmentRunningSectionDto> normal = new ArrayList<>();
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
index 9b9c7dc..cc27400 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentStatisticalShiftInfoServiceImpl.java
@@ -4,14 +4,13 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.modules.mdc.entity.Equipment;
+import org.jeecg.modules.mdc.entity.MdcEquipmentRepair;
 import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection;
 import org.jeecg.modules.mdc.entity.MdcEquipmentStatisticalShiftInfo;
 import org.jeecg.modules.mdc.mapper.MdcEquipmentStatisticalShiftInfoMapper;
-import org.jeecg.modules.mdc.service.IEquipmentService;
-import org.jeecg.modules.mdc.service.IMdcDeviceCalendarService;
-import org.jeecg.modules.mdc.service.IMdcEquipmentRunningSectionService;
-import org.jeecg.modules.mdc.service.IMdcEquipmentStatisticalShiftInfoService;
+import org.jeecg.modules.mdc.service.*;
 import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.vo.MdcDateVo;
 import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo;
 import org.jeecg.modules.mdc.vo.MdcShiftDateVo;
 import org.springframework.stereotype.Service;
@@ -22,6 +21,7 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 璁惧鍗曟棩鐝杩愯鏁版嵁琛�
@@ -39,6 +39,9 @@
 
     @Resource
     private IMdcDeviceCalendarService mdcDeviceCalendarService;
+
+    @Resource
+    private IMdcEquipmentRepairService mdcEquipmentRepairService;
 
     /**
      * 璁$畻璁惧鍗曟棩鐝杩愯鏁版嵁
@@ -141,6 +144,7 @@
                         equipmentStatisticalShiftInfo.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong().add(shiftInfo.getOpenLong()));
                         equipmentStatisticalShiftInfo.setErrorLong(equipmentStatisticalShiftInfo.getErrorLong().add(shiftInfo.getErrorLong()));
                     }
+                    resultList.add(equipmentStatisticalShiftInfo);
                 }
             }
         }
@@ -158,79 +162,423 @@
         if (dates == null || StringUtils.isBlank(equipmentid)) {
             return null;
         }
-        //涓嶈繃婊や紤鐝拰缁翠慨
-        //鑾峰彇鐝鏃堕棿娈靛唴鏁版嵁
-        List<MdcEquipmentRunningSection> sectionList = mdcEquipmentRunningSectionService.listEquipmentRunningSection(equipmentid, dates.getStart(), dates.getEnd());
-        //鏌ヨ鏃犳暟鎹渶瑕丒quipmentLog瑙f瀽
-        if (sectionList.isEmpty()) {
-            sectionList = mdcEquipmentRunningSectionService.listRunningSectionFromLog(equipmentid, dates.getStart(), dates.getEnd());
-        }
-        if (sectionList == null || sectionList.isEmpty()) {
-            sectionList = new ArrayList<>();
-        }
-        //澶勭悊鏁版嵁
-        long datesStart = dates.getStart();
-        long datesEnd = dates.getEnd();
-        for (int i = 0; i < sectionList.size(); i++) {
-            MdcEquipmentRunningSection equipmentRunningSection = sectionList.get(i);
-            long start = equipmentRunningSection.getStartTime().getTime();
-            long end = equipmentRunningSection.getEndTime().getTime();
-            if (datesStart <= start) {
-                equipmentRunningSection.setStartTime(equipmentRunningSection.getStartTime());
+        //鏌ヨ鏄惁闇�瑕佺淮淇殑璁惧
+        List<MdcEquipmentRepair> repairs = mdcEquipmentRepairService.mdcRepairListDate(equipmentid, dates.getStartDate(), dates.getEndDate());
+        //鍒跺害鏃堕棿娈靛唴鐨勪紤鐝拰缁翠慨鏃堕棿娈电瓫閫�
+        List<MdcEquipmentRepair> repairList = this.findSubRepairs(repairs, dates);
+        List<MdcDateVo> dateList = new ArrayList<>();
+        if (repairList == null || repairList.isEmpty()) {
+            //鍒跺害鏃堕棿娈靛唴娌℃湁缁翠慨鍜屼紤鐝椂闂存
+            MdcEquipmentStatisticalShiftInfo shiftInfo = mdcRateEquipment(equipmentid, dates.getStartDate(), dates.getEndDate());
+            return shiftInfo;
+        } else {
+            if (repairList.size() == 1 ) {
+                long start = repairList.get(0).getStartTime().getTime();
+                long end = repairList.get(0).getEndTime().getTime();
+                if ( start > dates.getStart() && end < dates.getEnd() ) {
+                    MdcDateVo d1 = new MdcDateVo();
+                    d1.setStartTime(dates.getStartDate());
+                    d1.setEndTime(repairList.get(0).getStartTime());
+                    dateList.add(d1);
+                    MdcDateVo d2 = new MdcDateVo();
+                    d2.setStartTime(repairList.get(0).getEndTime());
+                    d2.setEndTime(dates.getEndDate());
+                    dateList.add(d2);
+                } else  if (start == dates.getStart() && end < dates.getEnd()){
+                    MdcDateVo d2 = new MdcDateVo();
+                    d2.setStartTime(repairList.get(0).getEndTime());
+                    d2.setEndTime(dates.getEndDate());
+                    dateList.add(d2);
+                } else if (start > dates.getStart() && end == dates.getEnd()) {
+                    MdcDateVo d1 = new MdcDateVo();
+                    d1.setStartTime(dates.getStartDate());
+                    d1.setEndTime(repairList.get(0).getStartTime());
+                    dateList.add(d1);
+                } else {
+                    //浼戠彮
+                    MdcEquipmentStatisticalShiftInfo vo = new MdcEquipmentStatisticalShiftInfo();
+                    vo.setTotalLong(BigDecimal.ZERO);
+                    vo.setErrorLong(BigDecimal.ZERO);
+                    vo.setProcessLong(BigDecimal.ZERO);
+                    vo.setWaitLong(BigDecimal.ZERO);
+                    vo.setCloseLong(BigDecimal.ZERO);
+                    vo.setOpenLong(BigDecimal.ZERO);
+                    return vo;
+                }
             } else {
-                equipmentRunningSection.setStartTime(dates.getStartDate());
-            }
-            if (datesEnd >= end) {
-                equipmentRunningSection.setEndTime(equipmentRunningSection.getEndTime());
-            } else {
-                equipmentRunningSection.setEndTime(dates.getEndDate());
-            }
-            Long sen = DateUtils.differentSecond(equipmentRunningSection.getStartTime(), equipmentRunningSection.getEndTime());
-            if (sen <= 0) {
-                sectionList.remove(i);
-                i--;
-            } else {
-                equipmentRunningSection.setDuration(sen);
-                equipmentRunningSection.setStartLong(equipmentRunningSection.getStartTime().getTime());
-                equipmentRunningSection.setEndLong(equipmentRunningSection.getEndTime().getTime());
+                long s = dates.getStartDate().getTime();
+                for (int i = 0 ; i < repairList.size(); i ++) {
+                    long start = repairList.get(i).getStartTime().getTime();
+                    long end = repairList.get(i).getEndTime().getTime();
+
+                    if (start > s ) {
+                        MdcDateVo d = new MdcDateVo();
+                        d.setStartTime(dates.getStartDate());
+                        d.setEndTime(repairList.get(i).getStartTime());
+                        if (d.getEndTime().getTime() != d.getStartTime().getTime()) {
+                            dateList.add(d);
+                        }
+                        dates.setStartDate(repairList.get(i).getEndTime());
+                    } else if (start == s) {
+                        dates.setStartDate(repairList.get(i).getEndTime());
+                    }
+                    if(i == repairList.size() -1 ) {
+                        if(dates.getStartDate().getTime() >= end) {
+                            MdcDateVo d = new MdcDateVo();
+                            d.setStartTime(repairList.get(i).getEndTime());
+                            d.setEndTime(dates.getEndDate());
+                            if (d.getEndTime().getTime() != d.getStartTime().getTime()) {
+                                dateList.add(d);
+                            }
+                        }
+                    }
+                }
             }
         }
         MdcEquipmentStatisticalShiftInfo shiftInfo = new MdcEquipmentStatisticalShiftInfo();
-        shiftInfo.setEquipmentId(equipmentid);
-        shiftInfo.setShiftId(dates.getShiftId());
-        shiftInfo.setShiftSubId(dates.getShiftSubId());
-        shiftInfo.setTheDate(dates.getDay());
-        long waitLong = 0L;
-        long processLong = 0L;
-        long closeLong = 0L;
-        long errorLong = 0L;
-        for (MdcEquipmentRunningSection equipmentRunningSection : sectionList) {
-            Long duration = equipmentRunningSection.getDuration();
-            int status = equipmentRunningSection.getStatus();
-            if (status == 2) {
-                waitLong += duration;
+        for (MdcDateVo date : dateList) {
+            MdcEquipmentStatisticalShiftInfo v = mdcRateEquipment(equipmentid, date.getStartTime(), date.getEndTime());
+            shiftInfo.setTotalLong(v.getTotalLong().add(shiftInfo.getTotalLong()));
+            shiftInfo.setOpenLong(v.getOpenLong().add(shiftInfo.getOpenLong()));
+            shiftInfo.setCloseLong(v.getCloseLong().add(shiftInfo.getCloseLong()));
+            shiftInfo.setWaitLong(v.getWaitLong().add(shiftInfo.getWaitLong()));
+            shiftInfo.setProcessLong(v.getProcessLong().add(shiftInfo.getProcessLong()));
+            shiftInfo.setErrorLong(v.getErrorLong().add(shiftInfo.getErrorLong()));
+        }
+        return shiftInfo;
+    }
+
+    private MdcEquipmentStatisticalShiftInfo mdcRateEquipment(String equipmentid, Date startDate, Date endDate) {
+        MdcDateVo date = new MdcDateVo();
+        date.setStartTime(startDate);
+        date.setEndTime(endDate);
+        List<MdcEquipmentRunningSection> runningSections = new ArrayList<>();
+        runningSections = mdcEquipmentRunningSectionService.listEquipmentRunningSectionRun(equipmentid, startDate.getTime(), endDate.getTime());
+        //鏌ヨ濡傛灉鏃犳暟鎹渶瑕� EquipmentLog 瑙f瀽
+        if (runningSections == null || runningSections.isEmpty()) {
+            runningSections = mdcEquipmentRunningSectionService.listRunningSectionFromLog(equipmentid, startDate.getTime(), endDate.getTime());
+        }
+        if(runningSections == null || runningSections.isEmpty()) {
+            runningSections = new ArrayList<>();
+        }
+        List<MdcEquipmentRunningSection> sectionErrors = mdcEquipmentRunningSectionService.listEquipmentRunningSectionError(equipmentid, startDate.getTime(), endDate.getTime());
+
+        // 鎺掗櫎鍩虹閰嶇疆鎶ヨ鍙凤紙鍩虹閰嶇疆鎶ヨ鍙风殑涓嶇畻鎶ヨ锛�
+        //sectionErrors = filterSectionErrors(equipmentId, sectionErrors);
+        MdcEquipmentStatisticalShiftInfo shiftInfo = new MdcEquipmentStatisticalShiftInfo();
+        BigDecimal totalLongRairs = new BigDecimal("0");
+        List<MdcEquipmentRunningSection> sectionList = findStatsEquipment(null, runningSections, date, sectionErrors);
+        if (sectionList == null || sectionList.isEmpty()) {
+            shiftInfo.setEquipmentId(equipmentid);
+            return shiftInfo;
+        }
+        List<MdcEquipmentRunningSection> runs = new ArrayList<>();
+        List<MdcEquipmentRunningSection> errs = new ArrayList<>();
+        for (MdcEquipmentRunningSection section : sectionList) {
+            if (section.getStatus() == 22 || section.getStatus() == 0) {
+                errs.add(section);
             }
-            if (status == 3) {
-                processLong += duration;
-            }
-            if (status == 0) {
-                closeLong += duration;
-            }
-            if (status == 22) {
-                errorLong += duration;
+            if (section.getStatus() == 3) {
+                runs.add(section);
             }
         }
-        shiftInfo.setWaitLong(new BigDecimal(waitLong));
-        shiftInfo.setProcessLong(new BigDecimal(processLong));
-        shiftInfo.setCloseLong(new BigDecimal(closeLong));
-        //寮�鏈烘椂闂磋绠椾负 鏈夋晥鏃堕暱 - 鍏虫満鏃堕暱
-        shiftInfo.setOpenLong(new BigDecimal((datesEnd - datesStart) / 1000).subtract(shiftInfo.getCloseLong()));
-        shiftInfo.setErrorLong(new BigDecimal(errorLong));
+        // 鍙婃�诲伐鏃� => 鏈夋晥鏃堕暱鍑�
+        BigDecimal totalLong = new BigDecimal(DateUtils.getSeconds(startDate, endDate)).subtract(totalLongRairs);
+        // 璁$畻鍔犲伐
+        BigDecimal processLong = new BigDecimal("0");
+        if (runs != null && !runs.isEmpty()) {
+            processLong = processLongInfo(runs);
+        }
+        // 鍏虫満鏁版嵁
+        List<MdcEquipmentRunningSection> closes = errs.stream().filter(section -> section.getStatus() != 22).collect(Collectors.toList());
 
+        // 鍏虫満鏃堕暱
+        BigDecimal closeLong = new BigDecimal("0");
+        closeLong = closeLong(closes);
+
+        /*鏁呴殰鏃堕棿  errs => 鍏虫満鏁版嵁 + 鎶ヨ鏁版嵁 */
+        BigDecimal faultLong = new BigDecimal("0");
+        faultLong =  faultLongInfo(errs);
+
+        //鎶ヨ鏁版嵁
+        List<MdcEquipmentRunningSection> alarms = errs.stream().filter(section -> section.getStatus() == 22).collect(Collectors.toList());
+
+        //鎶ヨ鏃堕暱
+        BigDecimal alarmLong = new BigDecimal("0");
+        alarmLong = alarmLong(alarms);
+
+        //寰呮満鏃堕暱 => 鏈夋晥鏃堕暱 - 杩愯鏃堕暱 - 鎶ヨ鏃堕暱
+        BigDecimal waitLong = totalLong.subtract(processLong).subtract(alarmLong);
+        if (waitLong.compareTo(BigDecimal.ZERO) < 0) {
+            waitLong = new BigDecimal("0");
+        }
+
+        // 寮�鏈烘椂闀� => 鏈夋晥鏃堕暱 - 鍏虫満鏃堕暱
+        BigDecimal openLong = totalLong.subtract(closeLong);
+        if (openLong.compareTo(BigDecimal.ZERO) < 0) {
+            openLong = new BigDecimal("0");
+        }
+
+        shiftInfo.setProcessLong(processLong);
+        shiftInfo.setTotalLong(totalLong);
+        shiftInfo.setWaitLong(waitLong);
+        shiftInfo.setErrorLong(alarmLong);
+        shiftInfo.setCloseLong(closeLong);
+        shiftInfo.setOpenLong(openLong);
         return shiftInfo;
     }
 
     /**
+     * 缁熻鍏虫満鏃堕暱
+     */
+    private BigDecimal closeLong(List<MdcEquipmentRunningSection> closes) {
+        BigDecimal closeLong = new BigDecimal("0");
+        for (MdcEquipmentRunningSection alarm : closes) {
+            closeLong = closeLong.add(new BigDecimal(alarm.getDuration()));
+        }
+        return closeLong;
+    }
+
+    /**
+     * 缁熻鎶ヨ鏃堕暱
+     */
+    private BigDecimal alarmLong(List<MdcEquipmentRunningSection> alarms) {
+        BigDecimal alarmLong = new BigDecimal("0");
+        for (MdcEquipmentRunningSection alarm : alarms) {
+            alarmLong = alarmLong.add(new BigDecimal(alarm.getDuration()));
+        }
+        return alarmLong;
+    }
+
+    /**
+     * 缁熻鏁呴殰鏃堕暱
+     */
+    private BigDecimal faultLongInfo(List<MdcEquipmentRunningSection> errs) {
+        BigDecimal faultLong = new BigDecimal("0");
+        for (MdcEquipmentRunningSection e : errs) {
+            faultLong = faultLong.add(new BigDecimal(e.getDuration()));
+        }
+        return faultLong;
+    }
+
+    /**
+     * 缁熻鍔犲伐鏃堕暱
+     */
+    private BigDecimal processLongInfo(List<MdcEquipmentRunningSection> runs) {
+        BigDecimal processLong = new BigDecimal("0");
+        for (MdcEquipmentRunningSection se : runs) {
+            if (se.getStatus() == 3) {
+                processLong = processLong.add(new BigDecimal(se.getDuration()));
+            }
+        }
+        return processLong;
+    }
+
+    private List<MdcEquipmentRunningSection> findStatsEquipment(List<MdcEquipmentRepair> repairs, List<MdcEquipmentRunningSection> sRun, MdcDateVo mdcDate, List<MdcEquipmentRunningSection> errors) {
+        if (sRun == null || sRun.isEmpty()) {
+            //鏃犳暟鎹鐞�
+            //TODO
+            return null;
+        }
+        Long  startMdc =  mdcDate.getStartTime().getTime();
+        Long  endMdc =  mdcDate.getEndTime().getTime();
+        if (sRun != null && !sRun.isEmpty()) {
+            for (int i = 0 ; i < sRun.size() ; i ++) {
+                Long start = sRun.get(i).getStartTime().getTime();
+                Long end =  sRun.get(i).getEndTime().getTime();
+                if (startMdc <= start ) {
+                    sRun.get(i).setStartTime( sRun.get(i).getStartTime());
+                } else {
+                    sRun.get(i).setStartTime(mdcDate.getStartTime());
+                }
+                if (endMdc >= end) {
+                    sRun.get(i).setEndTime( sRun.get(i).getEndTime());
+                } else {
+                    sRun.get(i).setEndTime(mdcDate.getEndTime());
+                }
+                Long sen = DateUtils.differentSecond( sRun.get(i).getStartTime(),
+                        sRun.get(i).getEndTime());
+                if (sen <= 0) {
+                    sRun.remove(i);
+                    i--;
+                } else {
+                    sRun.get(i).setDuration(sen);
+                    sRun.get(i).setStartLong( sRun.get(i).getStartTime().getTime());
+                    sRun.get(i).setEndLong( sRun.get(i).getEndTime().getTime());
+                }
+            }
+        }
+        //閮ㄥ垎鏁版嵁鏄淮淇�  1銆佽繍琛岀姸鎬佷笅鎶ヨ鎯呭喌
+        List<MdcEquipmentRunningSection> faultRun = new ArrayList<>();
+        //鍒跺害鏃堕棿娈靛唴鎶ヨ鏁版嵁
+        if (errors != null && !errors.isEmpty() ) {
+            for (int i = 0 ; i < errors.size() ; i ++) {
+                Long start = errors.get(i).getStartTime().getTime();
+                Long end =  errors.get(i).getEndTime().getTime();
+                if (startMdc <= start ) {
+                    errors.get(i).setStartTime( errors.get(i).getStartTime());
+                } else {
+                    errors.get(i).setStartTime(mdcDate.getStartTime());
+                }
+                if (endMdc >= end) {
+                    errors.get(i).setEndTime( errors.get(i).getEndTime());
+                } else {
+                    errors.get(i).setEndTime(mdcDate.getEndTime());
+                }
+                Long sen = DateUtils.differentSecond( errors.get(i).getStartTime(),
+                        errors.get(i).getEndTime());
+                if (sen <= 0) {
+                    errors.remove(i);
+                    i--;
+                } else {
+                    errors.get(i).setDuration(sen);
+                    errors.get(i).setStartLong( errors.get(i).getStartTime().getTime());
+                    errors.get(i).setEndLong( errors.get(i).getEndTime().getTime());
+                }
+            }
+
+            //鎶婅繍琛屼腑瀛樺湪鐨勬姤璀﹀墧闄ゆ帀
+            for (MdcEquipmentRunningSection se : sRun) {
+                long runStart = se.getStartTime().getTime();
+                long runEnd =  se.getEndTime().getTime();
+                if (se.getStatus() == 3) {
+                    if (errors != null && !errors.isEmpty() ) {
+                        //澶勭悊鎶ヨ鏁版嵁
+                        for (int i = 0 ; i < errors.size(); i ++ ) {
+                            long errStart = errors.get(i).getStartTime().getTime();
+                            long errEnd = errors.get(i).getEndTime().getTime();
+                            // 鎶ヨ寮�濮� 灏忎簬 杩愯寮�濮�  鎶ヨ缁撴潫 灏忎簬杩愯缁撴潫 鎶ヨ缁撴潫 澶т簬 杩愯寮�濮�
+                            if ( errStart  < runStart && errEnd <= runEnd && errEnd >  runStart ) {
+                                errors.get(i).setEndTime(se.getStartTime());
+                                Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(),
+                                        errors.get(i).getEndTime());
+                                errors.get(i).setDuration(sen);
+                                errors.get(i).setStartLong(errors.get(i).getStartTime().getTime());
+                                errors.get(i).setEndLong(errors.get(i).getEndTime().getTime());
+                            }
+                            // 鎶ヨ寮�濮� 澶т簬 杩愯寮�濮� 锛� 鎶ヨ寮�濮� 灏忎簬 杩愯缁撴潫 锛屾姤璀︾粨鏉� 澶т簬 杩愯缁撴潫
+                            else if (errStart >=  runStart && errStart < runEnd &&  errEnd > runEnd ) {
+                                errors.get(i).setStartTime(se.getEndTime());
+                                Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(),
+                                        errors.get(i).getEndTime());
+                                errors.get(i).setDuration(sen);
+                                errors.get(i).setStartLong(errors.get(i).getStartTime().getTime());
+                                errors.get(i).setEndLong(errors.get(i).getEndTime().getTime());
+                            }
+                            // 鎶ヨ寮�濮� 澶т簬 杩愯寮�濮� 锛� 鎶ヨ寮�濮� 灏忎簬 杩愯缁撴潫 锛屾姤璀︾粨鏉� 澶т簬 杩愯寮�濮嬶紝鎶ヨ缁撴潫 灏忎簬  杩愯缁撴潫
+                            else if (errStart >= runStart && errStart < runEnd &&
+                                    errEnd > runStart && errEnd <= runEnd ){
+                                errors.remove(i);
+                                i--;
+                            }
+                            //濡傛灉瓒呭嚭鑼冨洿
+                            else if (errStart <= runStart && errStart < runEnd &&
+                                    errEnd > runStart && errEnd >= runEnd ) {
+                                MdcEquipmentRunningSection errOne = new MdcEquipmentRunningSection();
+                                errOne.setEndTime(errors.get(i).getEndTime());
+
+                                errors.get(i).setStartTime(errors.get(i).getStartTime());
+                                errors.get(i).setEndTime(se.getStartTime());
+                                Long sen = DateUtils.differentSecond(errors.get(i).getStartTime(),
+                                        errors.get(i).getEndTime());
+                                //
+
+                                //TODO
+                                errOne.setStatus(22);
+                                errOne.setEquipmentId(errors.get(i).getEquipmentId());
+                                errOne.setStartTime(se.getEndTime());
+                                errors.get(i).setDuration(sen);
+                                errors.get(i).setStartLong(errors.get(i).getStartTime().getTime());
+                                errors.get(i).setEndLong(errors.get(i).getEndTime().getTime());
+
+                                Long one = DateUtils.differentSecond(errOne.getStartTime(), errOne.getEndTime());
+                                errOne.setDuration(one);
+                                errOne.setStartLong(errOne.getStartTime().getTime());
+                                errOne.setEndLong(errOne.getEndTime().getTime());
+                                if (sen <= 0) {
+                                    errors.remove(i);
+                                    errors.add(i,errOne);
+                                } else {
+                                    errors.add(i+1,errOne);
+                                    i++;
+                                }
+                            } else {
+                                continue;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        //澶勭悊鎶ヨ鏁版嵁
+        List<MdcEquipmentRunningSection> sectionList = new ArrayList<>();
+        if (sRun != null && !sRun.isEmpty()) {
+            for (MdcEquipmentRunningSection se : sRun) {
+                sectionList.add(se);
+            }
+        }
+        //鎶ヨ鍓旈櫎杩愯鎶ヨ
+        if (errors != null && !errors.isEmpty()) {
+            sectionList.addAll(errors);
+        }
+        //鍏虫満澶勭悊涓烘晠闅滄姤璀�
+        if (faultRun != null && !faultRun.isEmpty()) {
+            sectionList.addAll(faultRun);
+        }
+        return sectionList;
+    }
+
+    private List<MdcEquipmentRepair> findSubRepairs(List<MdcEquipmentRepair> repairs, MdcShiftDateVo dates) {
+        if (repairs == null || repairs.isEmpty() || dates == null) {
+            return null;
+        }
+        for (MdcEquipmentRepair repair : repairs) {
+            //璋冩暣
+            Date start = null;
+            Date end = null;
+            long dStart = dates.getStartDate().getTime();
+            long dEnd = dates.getEndDate().getTime();
+            long rStart = repair.getStartTime().getTime();
+            long rEnd = repair.getEndTime().getTime();
+
+            if (rStart <= dStart && rEnd >= dStart && rEnd <= dEnd) {
+                start = dates.getStartDate();
+                end = repair.getEndTime();
+            } else if (rStart >= dStart && rEnd <= dEnd) {
+                start = repair.getStartTime();
+                end = repair.getEndTime();
+            } else if (rStart >= dStart && rStart <= dEnd && rEnd >= dEnd) {
+                start = repair.getStartTime();
+                end = dates.getEndDate();
+            } else if (rStart <= dStart && rEnd >= dEnd) {
+                start = dates.getStartDate();
+                end = dates.getEndDate();
+            }
+            repair.setStartTime(start);
+            repair.setEndTime(end);
+            //澶勭悊寮傚父鏁版嵁
+            if (start == null || end == null) {
+                repair.setSecondLong(0);
+            } else {
+                try {
+                    repair.setSecondLong(DateUtils.getSeconds(start, end));
+                } catch (Exception e) {
+                    repair.setSecondLong(0);
+                }
+
+            }
+
+        }
+        for (int i = 0; i < repairs.size(); i++) {
+            if (repairs.get(i).getStartTime() == null || repairs.get(i).getEndTime() == null || repairs.get(i).getSecondLong() == 0) {
+                repairs.remove(i);
+                i--;
+            }
+        }
+        return repairs;
+    }
+
+    /**
      * 鏃堕棿闂澶勭悊 濡傛灉褰撳ぉ鏈�鏈熬鏃堕棿澶т簬褰撳墠鏃堕棿 杩斿洖0
      *
      * @param temp
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDateVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDateVo.java
new file mode 100644
index 0000000..77fc75d
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcDateVo.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author: LiuS
+ * @create: 2023-07-27 09:58
+ */
+@Data
+public class MdcDateVo {
+    private Date startTime;
+    private Date endTime;
+    private Long start;
+    private Long end;
+}

--
Gitblit v1.9.3