From 09e22d89710364548fa896917506a372795a7bd3 Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期五, 26 一月 2024 09:37:36 +0800
Subject: [PATCH] 加班管理功能调整

---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOvertimeController.java             |   20 --
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java          |   28 ++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java                     |    2 
 lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java                                |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java                         |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOvertimeMapper.xml                  |   48 +++---
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java                        |  194 +++++++++++++++++++++++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java           |    7 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java             |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOvertime.java                           |   43 ++----
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOvertimeService.java                  |    8 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java |   12 +
 12 files changed, 303 insertions(+), 74 deletions(-)

diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
index 402ff1a..5ffcb6c 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
@@ -592,4 +592,10 @@
      */
     String DICT_EQUIPMENT_RATE_NORMAL = "equipment_rate_normal";
 
+    /**
+     * 鍔犵彮鏁版嵁 鑷姩璁$畻鏍囪瘑 1(鏄�) 2(鍚�)
+     */
+    Integer AUTO_FLAG_Y = 1;
+    Integer AUTO_FLAG_N = 2;
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOvertimeController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOvertimeController.java
index c50dffd..b69c725 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOvertimeController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOvertimeController.java
@@ -1,7 +1,6 @@
 package org.jeecg.modules.mdc.controller;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
@@ -20,9 +19,7 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 /**
  * @Description: 璁惧鍔犵彮绠$悊
@@ -72,18 +69,13 @@
     @ApiOperation(value = "璁惧鍔犵彮绠$悊-娣诲姞", notes = "璁惧鍔犵彮绠$悊-娣诲姞")
     @PostMapping(value = "/add")
     public Result<?> add(@RequestBody MdcEquipmentOvertime mdcEquipmentOvertime) {
-        String[] calendarIdList = mdcEquipmentOvertime.getCalendarId().split(",");
-        List<MdcEquipmentOvertime> equipmentOvertimeList = new ArrayList<>();
-        mdcEquipmentOvertimeService.remove(new LambdaQueryWrapper<MdcEquipmentOvertime>().in(MdcEquipmentOvertime::getCalendarId, Arrays.asList(calendarIdList)));
-        for (String calendarId : calendarIdList) {
-            MdcEquipmentOvertime equipmentOvertime = new MdcEquipmentOvertime();
-            equipmentOvertime.setCalendarId(calendarId);
-            equipmentOvertime.setStartTime(mdcEquipmentOvertime.getStartTime());
-            equipmentOvertime.setEndTime(mdcEquipmentOvertime.getEndTime());
-            equipmentOvertime.setRemark(mdcEquipmentOvertime.getRemark());
-            equipmentOvertimeList.add(equipmentOvertime);
+        if (org.apache.commons.lang3.StringUtils.isBlank(mdcEquipmentOvertime.getEquipmentId())) {
+            return Result.error("鏈�夋嫨璁惧锛岃鎺掓煡锛�");
         }
-        mdcEquipmentOvertimeService.saveBatch(equipmentOvertimeList);
+        boolean result = mdcEquipmentOvertimeService.addOvertime(mdcEquipmentOvertime);
+        if (!result) {
+            return Result.error("娣诲姞澶辫触锛�");
+        }
         return Result.OK("娣诲姞鎴愬姛锛�");
     }
 
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOvertime.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOvertime.java
index bf2d75d..e4dea3c 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOvertime.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOvertime.java
@@ -7,10 +7,12 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.base.entity.JeecgEntity;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -28,42 +30,20 @@
 
     private static final long serialVersionUID = -7163039765166584824L;
 
-    @TableField(exist = false)
     @Excel(name = "璁惧缂栧彿", width = 20)
+    @ApiModelProperty("鏃ユ湡")
     private String equipmentId;
 
     @TableField(exist = false)
     @Excel(name = "璁惧鍚嶇О", width = 20)
     private String equipmentName;
 
-    /**
-     * 鐢熸晥鏃ユ湡
-     */
-    @Excel(name = "鐢熸晥鏃ユ湡", width = 15)
-    @TableField(exist = false)
-    private String effectiveDate;
+    @ApiModelProperty("鏃ユ湡")
+    private String theDate;
 
-    /**
-     * 鐝寮�濮嬫椂闂�
-     */
-    @Excel(name = "鐝寮�濮嬫椂闂�", width = 20)
-    @ApiModelProperty("鐝寮�濮嬫椂闂�")
-    @TableField(exist = false)
-    private String startDate;
-
-    /**
-     * 鐝缁撴潫鏃堕棿
-     */
-    @Excel(name = "鐝缁撴潫鏃堕棿", width = 20)
-    @ApiModelProperty("鐝缁撴潫鏃堕棿")
-    @TableField(exist = false)
-    private String endDate;
-
-    /**
-     * 宸ヤ綔鏃ュ巻id
-     */
-    @ApiModelProperty(value = "宸ヤ綔鏃ュ巻id")
-    private String calendarId;
+    @Excel(name = "鑷姩璁$畻鏍囪瘑", width = 15)
+    @ApiModelProperty("鑷姩璁$畻鏍囪瘑")
+    private Integer autoFlag = CommonConstant.AUTO_FLAG_N;
 
     /**
      * 鍔犵彮寮�濮嬫椂闂�
@@ -79,6 +59,13 @@
     private String endTime;
 
     /**
+     * 鍔犵彮鏃堕暱
+     */
+    @Excel(name = "鏃堕暱", width = 20)
+    @ApiModelProperty(value = "鏃堕暱")
+    private BigDecimal duration;
+
+    /**
      * 澶囨敞
      */
     @Excel(name = "澶囨敞")
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java
index a46e9de..6c79675 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java
@@ -72,8 +72,8 @@
         log.info("璁惧鐘舵�侀暱鏈熸棤鍙樺寲鎶ヨ浠诲姟 RunningEquipmentStatusJob start!  鏃堕棿:" + DateUtils.getNow());
         long startTime = System.currentTimeMillis();
         try {
-            //List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<>());
-            List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140198"));
+            List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<>());
+            //List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140198"));
             // 鑾峰彇鍒╃敤鐜囧垽瀹氬ぉ鏁�
             List<DictModel> dictModelList1 = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_EQUIPMENT_RATE_JUDGE);
             Integer equipmentRateJudge = 5;
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java
new file mode 100644
index 0000000..3c42552
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java
@@ -0,0 +1,194 @@
+package org.jeecg.modules.mdc.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.entity.MdcEquipmentOvertime;
+import org.jeecg.modules.mdc.entity.MdcEquipmentRunningSection;
+import org.jeecg.modules.mdc.entity.MdcSystemParameters;
+import org.jeecg.modules.mdc.service.*;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.util.ThrowableUtil;
+import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo;
+import org.jeecg.modules.quartz.entity.QuartzJob;
+import org.jeecg.modules.quartz.entity.SysQuartzLog;
+import org.jeecg.modules.quartz.service.IQuartzJobService;
+import org.jeecg.modules.quartz.service.ISysQuartzLogService;
+import org.jeecg.modules.system.service.ISysAnnouncementService;
+import org.quartz.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Lius
+ * @Description: 璁惧鍔犵彮鏃堕暱绠楁硶缁熻
+ * @date 2024/1/24 17:12
+ */
+@PersistJobDataAfterExecution
+@DisallowConcurrentExecution
+@Slf4j
+public class RunningOvertimeDurationJob implements Job {
+
+    @Resource
+    private IQuartzJobService quartzJobService;
+
+    @Resource
+    private ISysQuartzLogService sysQuartzLogService;
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+
+    @Resource
+    private IMdcEquipmentOvertimeService mdcEquipmentOvertimeService;
+
+    /**
+     * 鑻ュ弬鏁板彉閲忓悕淇敼 QuartzJobController涓篃闇�瀵瑰簲淇敼  鏃堕棿锛� yyyyMMdd 渚嬶細 20230414
+     */
+    private String parameter;
+
+    public void setParameter(String parameter) {
+        this.parameter = parameter;
+    }
+
+    @Resource
+    private ISysAnnouncementService sysAnnouncementService;
+
+    @Resource
+    private IMdcDeviceCalendarService mdcDeviceCalendarService;
+
+    @Resource
+    private IMdcSystemParametersService mdcSystemParametersService;
+
+    @Resource
+    private IMdcEquipmentRunningSectionService mdcEquipmentRunningSectionService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        SysQuartzLog quartzLog = new SysQuartzLog();
+        quartzLog.setCreateTime(new Date());
+        List<QuartzJob> byJobClassName = this.quartzJobService.findByJobClassName(this.getClass().getName());
+        if (byJobClassName != null && !byJobClassName.isEmpty()) {
+            quartzLog.setJobId(byJobClassName.get(0).getId());
+        }
+        quartzLog.setParams(this.parameter);
+        log.info(String.format("瀹氭椂缁熻璁惧鍔犵彮鏃堕暱浠诲姟 param: %s RunningOvertimeDurationJob start!  鏃堕棿:" + DateUtils.getNow(), this.parameter));
+        long startTime = System.currentTimeMillis();
+        try {
+            String date = "";
+            if (StringUtils.isNotBlank(this.parameter)) {
+                date = DateUtils.format(DateUtils.toDate(this.parameter, DateUtils.STRDATE), DateUtils.STR_DATE);
+                Date initDate = DateUtils.toDate(this.parameter, DateUtils.STRDATE);
+                if (initDate != null) {
+                    mdcEquipmentOvertimeService.remove(new LambdaQueryWrapper<MdcEquipmentOvertime>().eq(MdcEquipmentOvertime::getTheDate, this.parameter).eq(MdcEquipmentOvertime::getAutoFlag, CommonConstant.AUTO_FLAG_Y));
+                }
+            } else {
+                date = DateUtils.format(DateUtils.getNow(), DateUtils.STR_DATE);
+            }
+            List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<>());
+            MdcSystemParameters mdcSystemParameters = mdcSystemParametersService.getOne(new LambdaQueryWrapper<MdcSystemParameters>().eq(MdcSystemParameters::getCode, "equip_log_statis_time"));
+            if (mdcSystemParameters == null) {
+                throw new JobExecutionException("mdc_system_parameters 琛ㄤ腑鏁版嵁缂哄け");
+            }
+            String value = mdcSystemParameters.getValue();
+            List<MdcEquipmentOvertime> result = new ArrayList<>();
+            for (MdcEquipment mdcEquipment : equipmentList) {
+                // 鑾峰彇璁惧宸ヤ綔鏃ュ巻
+                List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = mdcDeviceCalendarService.listByEquipmentIdAndDate(mdcEquipment.getEquipmentId(), this.parameter);
+                if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
+                    //鑾峰彇鏈�鍚庝竴涓彮娆$粨鏉熸椂闂�
+                    Date startDate = this.getCalendarEndDate(mdcDeviceCalendarVos, date);
+                    Date endDate = DateUtils.plusTime(DateUtils.toDate(date + " " + value, DateUtils.STR_DATE_TIME_SMALL), 1);
+                    List<MdcEquipmentRunningSection> equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), startDate, endDate);
+                    if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) {
+                        // 鏃堕棿淇
+                        if (equipmentRunningSectionList.get(0).getStartTime().before(startDate)) {
+                            equipmentRunningSectionList.get(0).setStartTime(startDate);
+                        }
+                        if (equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).getEndTime().after(endDate)) {
+                            equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(endDate);
+                        }
+                        BigDecimal duration = BigDecimal.ZERO;
+                        for (MdcEquipmentRunningSection mdcEquipmentRunningSection : equipmentRunningSectionList) {
+                            duration = duration.add(new BigDecimal(DateUtils.differentSecond(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime())));
+                        }
+                        MdcEquipmentOvertime mdcEquipmentOvertime = new MdcEquipmentOvertime();
+                        mdcEquipmentOvertime.setEquipmentId(mdcEquipment.getEquipmentId());
+                        mdcEquipmentOvertime.setDuration(duration);
+                        mdcEquipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_Y);
+                        mdcEquipmentOvertime.setTheDate(this.parameter);
+                        result.add(mdcEquipmentOvertime);
+                    }
+
+                } else {
+                    // 娌℃湁鐝閰嶇疆锛岃绠楀叏澶╃殑璁惧鍔犲伐鐘舵��
+                    Date startDate = DateUtils.toDate(date + " " + value, DateUtils.STR_DATE_TIME_SMALL);
+                    Date endDate = DateUtils.plusTime(startDate, 1);
+                    List<MdcEquipmentRunningSection> equipmentRunningSectionList = mdcEquipmentRunningSectionService.selectRunningData(mdcEquipment.getEquipmentId(), startDate, endDate);
+                    if (equipmentRunningSectionList != null && !equipmentRunningSectionList.isEmpty()) {
+                        // 鏃堕棿淇
+                        if (equipmentRunningSectionList.get(0).getStartTime().before(startDate)) {
+                            equipmentRunningSectionList.get(0).setStartTime(startDate);
+                        }
+                        if (equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).getEndTime().after(endDate)) {
+                            equipmentRunningSectionList.get(equipmentRunningSectionList.size() - 1).setEndTime(endDate);
+                        }
+                        BigDecimal duration = BigDecimal.ZERO;
+                        for (MdcEquipmentRunningSection mdcEquipmentRunningSection : equipmentRunningSectionList) {
+                            duration = duration.add(new BigDecimal(DateUtils.differentSecond(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime())));
+                        }
+                        MdcEquipmentOvertime mdcEquipmentOvertime = new MdcEquipmentOvertime();
+                        mdcEquipmentOvertime.setEquipmentId(mdcEquipment.getEquipmentId());
+                        mdcEquipmentOvertime.setDuration(duration);
+                        mdcEquipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_Y);
+                        mdcEquipmentOvertime.setTheDate(this.parameter);
+                        result.add(mdcEquipmentOvertime);
+                    }
+
+                }
+            }
+            if (!result.isEmpty()) {
+                mdcEquipmentOvertimeService.saveBatch(result);
+            }
+            quartzLog.setIsSuccess(0);
+        } catch (Exception e) {
+            quartzLog.setIsSuccess(-1);
+            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
+            // 鍙戦�佹秷鎭�氱煡
+            sysAnnouncementService.jobSendMessage("瀹氭椂缁熻璁惧鍔犵彮鏃堕暱浠诲姟澶辫触", quartzLog.getExceptionDetail());
+        }
+        long endTime = System.currentTimeMillis();
+        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
+        sysQuartzLogService.save(quartzLog);
+    }
+
+    private Date getCalendarEndDate(List<MdcDeviceCalendarVo> mdcDeviceCalendarVos, String date) {
+        date = DateUtils.format(DateUtils.toDate(date, DateUtils.STRDATE), DateUtils.STR_DATE);
+        String endDate = "";
+        for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
+            String shiftEndDate = "";
+            if ("true".equals(mdcDeviceCalendarVo.getIsDaySpan())) {
+                shiftEndDate = DateUtils.format(DateUtils.plusTime(DateUtils.toDate(date, DateUtils.STR_DATE), 1), DateUtils.STR_DATE) + " " + mdcDeviceCalendarVo.getEndDate();
+            } else {
+                shiftEndDate = date + " " + mdcDeviceCalendarVo.getEndDate();
+            }
+            if (StringUtils.isBlank(endDate)) {
+                endDate = shiftEndDate;
+            } else {
+                // endDate
+                Date date1 = DateUtils.toDate(endDate, DateUtils.STR_DATE_TIME_SMALL);
+                // shiftEndDate
+                Date date2 = DateUtils.toDate(shiftEndDate, DateUtils.STR_DATE_TIME_SMALL);
+                if (date2.after(date1)) {
+                    endDate = shiftEndDate;
+                }
+            }
+        }
+        return DateUtils.toDate(endDate, DateUtils.STR_DATE_TIME_SMALL);
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOvertimeMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOvertimeMapper.xml
index a528b02..b8606e1 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOvertimeMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOvertimeMapper.xml
@@ -6,13 +6,12 @@
     <select id="pageList" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentOvertime">
         SELECT
             t1.id,
-            t2.equipment_id equipmentId,
-            t4.equipment_name equipmentName,
-            t2.effective_date effectiveDate,
-            t3.start_date startDate,
-            t3.end_date endDate,
+            t1.equipment_id equipmentId,
+            t2.equipment_name equipmentName,
+            t1.the_date theDate,
             t1.start_time startTime,
             t1.end_time endTime,
+            t1.duration duration,
             t1.remark remark,
             t1.create_by createBy,
             t1.create_time createTime,
@@ -20,37 +19,37 @@
             t1.update_time updateTime
         FROM
             mdc_equipment_overtime t1
-            LEFT JOIN mdc_device_calendar t2 ON t1.calendar_id = t2.id
-            LEFT JOIN mdc_shift_sub t3 ON t3.id = t2.shift_sub_id
-            LEFT JOIN mdc_equipment t4 ON t4.equipment_id = t2.equipment_id
+            LEFT JOIN mdc_equipment t2 ON t2.equipment_id = t1.equipment_id
         <where>
             <if test="mdcEquipmentOvertime.equipmentName != null and mdcEquipmentOvertime.equipmentName != '' ">
-                AND t4.equipment_name LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentName}),'%')
+                AND t2.equipment_name LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentName}),'%')
             </if>
             <if test="mdcEquipmentOvertime.equipmentId != null and mdcEquipmentOvertime.equipmentId != '' ">
-                AND t2.equipment_id LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentId}),'%')
+                AND t1.equipment_id LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentId}),'%')
             </if>
             <if test="mdcEquipmentOvertime.mdcSectionIds != null and mdcEquipmentOvertime.mdcSectionIds.size() > 0 ">
-                AND t2.equipment_id IN
+                AND t1.equipment_id IN
                 <foreach collection="mdcEquipmentOvertime.mdcSectionIds" item="id" index="index" open="(" close=")" separator=",">
                     #{ id }
                 </foreach>
             </if>
+            <if test="mdcEquipmentOvertime.startTime != null and mdcEquipmentOvertime.startTime != '' and mdcEquipmentOvertime.endTime != null and mdcEquipmentOvertime.endTime != ''">
+                AND t1.the_date BETWEEN #{ mdcEquipmentOvertime.startTime } AND #{ mdcEquipmentOvertime.endTime }
+            </if>
         </where>
-        order by t2.effective_date asc
+        order by t1.the_date asc
     </select>
 
     <!--list鍒楄〃-->
     <select id="list" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentOvertime">
         SELECT
             t1.id,
-            t2.equipment_id equipmentId,
-            t4.equipment_name equipmentName,
-            t2.effective_date effectiveDate,
-            t3.start_date startDate,
-            t3.end_date endDate,
+            t1.equipment_id equipmentId,
+            t2.equipment_name equipmentName,
+            t1.the_date theDate,
             t1.start_time startTime,
             t1.end_time endTime,
+            t1.duration duration,
             t1.remark remark,
             t1.create_by createBy,
             t1.create_time createTime,
@@ -58,24 +57,25 @@
             t1.update_time updateTime
         FROM
             mdc_equipment_overtime t1
-            LEFT JOIN mdc_device_calendar t2 ON t1.calendar_id = t2.id
-            LEFT JOIN mdc_shift_sub t3 ON t3.id = t2.shift_sub_id
-            LEFT JOIN mdc_equipment t4 ON t4.equipment_id = t2.equipment_id
+            LEFT JOIN mdc_equipment t2 ON t2.equipment_id = t1.equipment_id
         <where>
             <if test="mdcEquipmentOvertime.equipmentName != null and mdcEquipmentOvertime.equipmentName != '' ">
-                AND t4.equipment_name LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentName}),'%')
+                AND t2.equipment_name LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentName}),'%')
             </if>
             <if test="mdcEquipmentOvertime.equipmentId != null and mdcEquipmentOvertime.equipmentId != '' ">
-                AND t2.equipment_id LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentId}),'%')
+                AND t1.equipment_id LIKE CONCAT(CONCAT('%',#{mdcEquipmentOvertime.equipmentId}),'%')
             </if>
             <if test="mdcEquipmentOvertime.mdcSectionIds != null and mdcEquipmentOvertime.mdcSectionIds.size() > 0 ">
-                AND t2.equipment_id IN
+                AND t1.equipment_id IN
                 <foreach collection="mdcEquipmentOvertime.mdcSectionIds" item="id" index="index" open="(" close=")" separator=",">
                     #{ id }
                 </foreach>
             </if>
+            <if test="mdcEquipmentOvertime.startTime != null and mdcEquipmentOvertime.startTime != '' and mdcEquipmentOvertime.endTime != null and mdcEquipmentOvertime.endTime != ''">
+                AND t1.the_date BETWEEN #{ mdcEquipmentOvertime.startTime } AND #{ mdcEquipmentOvertime.endTime }
+            </if>
         </where>
-        order by t2.effective_date asc
+            order by t1.the_date asc
     </select>
 
     <!--鏌ヨ鍔犵彮鏃堕暱-->
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
index 588853f..7c055ed 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java
@@ -71,4 +71,6 @@
     void generateDeviceCalendar();
 
     MdcDeviceCalendar getFirstData(String equipmentId);
+
+    List<MdcDeviceCalendarVo> listByEquipmentIdAndDate(String equipmentId, String date);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOvertimeService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOvertimeService.java
index 33f0763..5bf5d49 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOvertimeService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOvertimeService.java
@@ -46,4 +46,12 @@
      * @return
      */
     BigDecimal computeOvertime(String equipmentId, String validDate);
+
+    /**
+     * 娣诲姞
+     * @param mdcEquipmentOvertime
+     * @return
+     */
+    boolean addOvertime(MdcEquipmentOvertime mdcEquipmentOvertime);
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
index cdce65c..238de3a 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
@@ -210,4 +210,9 @@
         return this.baseMapper.getFirstData(equipmentId);
     }
 
+    @Override
+    public List<MdcDeviceCalendarVo> listByEquipmentIdAndDate(String equipmentId, String date) {
+        return this.baseMapper.listByEquipmentAndDate(equipmentId, date);
+    }
+
 }
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 5ba142f..cd1ce79 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
@@ -1160,8 +1160,11 @@
                     mdcEfficiencyShiftResultDto.setCloseLong(equipmentStatisticalShiftInfo.getCloseLong());
                     mdcEfficiencyShiftResultDto.setOpenLong(equipmentStatisticalShiftInfo.getOpenLong());
                     mdcEfficiencyShiftResultDto.setWaitLong(equipmentStatisticalShiftInfo.getWaitLong());
-
-                    mdcEfficiencyShiftResultDto.setOpenRate(equipmentStatisticalShiftInfo.getOpenLong().divide(equipmentStatisticalShiftInfo.getTotalLong(), 6, RoundingMode.HALF_UP));
+                    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()) {
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java
index c83a76a..ec22b51 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.mdc.entity.MdcEquipmentOvertime;
 import org.jeecg.modules.mdc.mapper.MdcEquipmentOvertimeMapper;
@@ -153,4 +154,31 @@
         }
         return result;
     }
+
+    /**
+     * 娣诲姞
+     *
+     * @param mdcEquipmentOvertime
+     * @return
+     */
+    @Override
+    public boolean addOvertime(MdcEquipmentOvertime mdcEquipmentOvertime) {
+        String[] equipmentIds = mdcEquipmentOvertime.getEquipmentIds().split(",");
+        List<MdcEquipmentOvertime> mdcEquipmentOvertimes = new ArrayList<>();
+        // 璁$畻鏃堕暱(绉�)
+        String startTime = mdcEquipmentOvertime.getStartTime();
+        String endTime = mdcEquipmentOvertime.getEndTime();
+        long duration = DateUtils.differentSecond(DateUtils.setTimeForDay(DateUtils.getNow(), startTime), DateUtils.setTimeForDay(DateUtils.getNow(), endTime));
+        for (String equipmentId : equipmentIds) {
+            MdcEquipmentOvertime equipmentOvertime = new MdcEquipmentOvertime();
+            equipmentOvertime.setEquipmentId(equipmentId);
+            equipmentOvertime.setTheDate(mdcEquipmentOvertime.getTheDate());
+            equipmentOvertime.setAutoFlag(CommonConstant.AUTO_FLAG_N);
+            equipmentOvertime.setStartTime(mdcEquipmentOvertime.getStartTime());
+            equipmentOvertime.setEndTime(mdcEquipmentOvertime.getEndTime());
+            equipmentOvertime.setDuration(new BigDecimal(duration));
+            mdcEquipmentOvertimes.add(equipmentOvertime);
+        }
+        return super.saveBatch(mdcEquipmentOvertimes);
+    }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java
index 20ac661..919e18b 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java
@@ -108,9 +108,13 @@
             }
 
 //            BigDecimal shiftTimeCount = mdcDeviceCalendarService.computeShiftTimeCount(equipmentId, validDate);
-            mdcOverallEquipmentEfficiency.setShiftTimeCount(new BigDecimal("8"));
+            if (StringUtils.isEmpty(mdcOverallEquipmentEfficiency.getShift())) {
+                mdcOverallEquipmentEfficiency.setShiftTimeCount(BigDecimal.ZERO);
+            } else {
+                mdcOverallEquipmentEfficiency.setShiftTimeCount(new BigDecimal("8"));
+            }
 
-            // 璁$畻鍔犵彮鏃堕棿
+            // TODO 璁$畻鍔犵彮鏃堕棿
             BigDecimal overtime = mdcEquipmentOvertimeService.computeOvertime(equipmentId, validDate);
             mdcOverallEquipmentEfficiency.setOvertime(overtime);
 
@@ -119,7 +123,7 @@
             mdcOverallEquipmentEfficiency.setActualWorkDayCount(actualWorkDayCount);
 
             // 鏈堝害瀹為檯鐝骇鎬绘椂闂�(鍒嗛挓)
-            mdcOverallEquipmentEfficiency.setMonthActualWorkDayTimeCount(mdcOverallEquipmentEfficiency.getShiftTimeCount().add(overtime));
+            mdcOverallEquipmentEfficiency.setMonthActualWorkDayTimeCount(mdcOverallEquipmentEfficiency.getShiftTimeCount().multiply(actualWorkDayCount).multiply(new BigDecimal("60")).add(overtime));
 
             // 鏁呴殰鍋滄満鏃堕暱缁熻(鍒嗛挓)
             BigDecimal breakdownDownDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.BREAKDOWN_DOWN);
@@ -156,7 +160,7 @@
             // mdcOverallEquipmentEfficiency.getShiftTimeCount() - plannedMaintenanceDuration - conferenceTrainingDuration - otherRestDuration
             // 璐熻嵎鏃堕棿(鍒嗛挓)
             BigDecimal loadTime = mdcOverallEquipmentEfficiency.getShiftTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration);
-            if (loadTime.compareTo(BigDecimal.ZERO) > -1) {
+            if (loadTime.compareTo(BigDecimal.ZERO) < 0) {
                 loadTime = BigDecimal.ZERO;
             }
             mdcOverallEquipmentEfficiency.setLoadTime(loadTime.divide(new BigDecimal("60"), 1, RoundingMode.HALF_UP));

--
Gitblit v1.9.3