Lius
2024-01-26 09e22d89710364548fa896917506a372795a7bd3
加班管理功能调整
已添加1个文件
已修改11个文件
377 ■■■■ 文件已修改
lxzn-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentOvertimeController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentOvertime.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningEquipmentStatusJob.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOvertimeDurationJob.java 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentOvertimeMapper.xml 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcDeviceCalendarService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentOvertimeService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEfficiencyReportServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}
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("添加成功!");
    }
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 = "备注")
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;
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);
    }
}
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>
    <!--查询加班时长-->
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);
}
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);
}
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);
    }
}
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()) {
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);
    }
}
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));