lyh
13 小时以前 f71cea3609c4c7bf0b70c77b2c9d8c571586df33
二保定时任务修改
已添加1个文件
已修改11个文件
已删除1个文件
482 ■■■■■ 文件已修改
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentExtendService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentExtendServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamSecondMaintenanceOrderController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/SecondMaintenanceOrderGenerateJob.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamSecondMaintenanceOrderService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderAsyncService.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java
@@ -69,4 +69,14 @@
    /** å¼‚常描述 */
    @ApiModelProperty(name = "异常描述",notes = "")
    private String exceptionDescription;
    public EamSecondMaintenanceOrderDetail() {
    }
    public EamSecondMaintenanceOrderDetail(EamMaintenanceStandardDetail detail) {
        this.itemCode = detail.getItemCode();
        this.itemCategory = detail.getItemCategory();
        this.itemName = detail.getItemName();
    }
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentMapper.java
@@ -62,6 +62,11 @@
    List<EamEquipment> selectThreeMaintenanceEquipmentList(@Param(Constants.WRAPPER) Wrapper<EamEquipment> queryWrapper);
    /**
     * èŽ·å–å¯ç”ŸæˆäºŒä¿å·¥å•çš„è®¾å¤‡åˆ—è¡¨
     */
    List<EamEquipment> selectSecondMaintenanceEquipmentList(@Param(Constants.WRAPPER) Wrapper<EamEquipment> queryWrapper);
    /**
     * è®¾å¤‡ç®¡ç†é¦–页
     * @param ids
     * @return
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentMapper.xml
@@ -77,6 +77,23 @@
        on e.id = ext.id
        ${ew.customSqlSegment}
    </select>
    <select id="selectSecondMaintenanceEquipmentList" resultType="org.jeecg.modules.eam.entity.EamEquipment">
        select e.*,
               ext.latest_second_maintenance,
               ext.next_second_maintenance,
               ext.technology_status,
               ext.third_maintenance_period,
               ext.technology_check_period,
               ext.latest_technology_check,
               ext.next_technology_check,
               ext.technology_generate_flag
        from eam_equipment e
                 left join eam_equipment_extend ext
                           on e.id = ext.id
            ${ew.customSqlSegment}
    </select>
    <select id="echartsList" resultType="org.jeecg.modules.eam.dto.EchartsDto">
        WITH TotalCount AS (
        SELECT COUNT(a.id) AS total_count
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentExtendService.java
@@ -47,4 +47,13 @@
     * @return
     */
    boolean updateThirdMaintenanceParam(String equipmentId, String status, Date evaluationDate, String thirdMaintenanceGenerateFlag);
    /**
     * æ›´æ–°è®¾å¤‡äºŒä¿åŠä¿å…»æ—¥æœŸ
     * @param equipmentId è®¾å¤‡ID
     * @param status ä¿å…»çŠ¶æ€
     * @param secondMaintenanceGenerateFlag äºŒä¿å·¥å•生成标识
     * @return
     */
    boolean updateSecondMaintenanceParam(String equipmentId, String status, String secondMaintenanceGenerateFlag);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentService.java
@@ -88,6 +88,11 @@
    List<EamEquipment> selectThreeMaintenanceEquipmentList();
    /**
     * èŽ·å–å¯ç”ŸæˆäºŒä¿å·¥å•çš„è®¾å¤‡åˆ—è¡¨
     */
    List<EamEquipment> selectSecondMaintenanceEquipmentList();
    /**
     * è®¾å¤‡ç®¡ç†é¦–页-技术状态
     * @return
     */
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentExtendServiceImpl.java
@@ -13,6 +13,8 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
/**
@@ -98,4 +100,28 @@
        }
        return this.getBaseMapper().updateById(entity) > 0;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateSecondMaintenanceParam(String equipmentId, String status,String secondMaintenanceGenerateFlag){
        if (StringUtils.isBlank(status) && StringUtils.isBlank(secondMaintenanceGenerateFlag)) {
            return false;
        }
        EamEquipmentExtend entity = this.getBaseMapper().selectById(equipmentId);
        UpdateWrapper<EamEquipmentExtend> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", equipmentId);
        if (StringUtils.isNotBlank(status)) {
            entity.setMaintenanceStatus(status);
        }
        //二保默认生成六个月后
        // è½¬æ¢ä¸ºLocalDate处理日期
        LocalDate localDate = DateUtils.dateToLocalDate(entity.getLatestSecondMaintenance());
        // è®¡ç®—六个月后的日期
        LocalDate sixMonthsLater = localDate.plusMonths(6);
        // è°ƒæ•´åˆ°å½“月的最后一天
        LocalDate lastDayOfMonth = sixMonthsLater.with(TemporalAdjusters.lastDayOfMonth());
        entity.setNextSecondMaintenance(DateUtils.localDateToDate(lastDayOfMonth));
        return this.getBaseMapper().updateById(entity) > 0;
    }
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java
@@ -449,6 +449,18 @@
    }
    /**
     * èŽ·å–å¯ç”ŸæˆäºŒä¿å·¥å•çš„è®¾å¤‡åˆ—è¡¨
     */
    @Override
    public List<EamEquipment> selectSecondMaintenanceEquipmentList(){
        QueryWrapper<EamEquipment> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("e.del_flag", CommonConstant.DEL_FLAG_0);
        queryWrapper.ne("ext.maintenance_status", MaintenanceStatusEnum.PROHIBITED.name());
        queryWrapper.isNotNull("ext.next_second_maintenance");
        return this.getBaseMapper().selectSecondMaintenanceEquipmentList(queryWrapper);
    }
    /**
     * è®¾å¤‡ç®¡ç†é¦–页-技术状态
     * @return
     */
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamSecondMaintenanceOrderController.java
@@ -28,6 +28,7 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@@ -514,7 +515,7 @@
     */
    @ApiOperation(value = "二保工单-执行操作", notes = "二保工单-执行操作")
    @PutMapping(value = "/approval")
    public Result<?> approval(@RequestBody EamSecondMaintenanceRequest request) {
    public Result<?> approval(@RequestBody EamSecondMaintenanceRequest request) throws ParseException {
        if (request == null) {
            return Result.error("审批的对象不能为空!");
        }
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/SecondMaintenanceOrderGenerateJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package org.jeecg.modules.eam.job;
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.constant.MaintenanceCategoryEnum;
import org.jeecg.modules.eam.constant.OrderCreationMethodEnum;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamMaintenanceStandard;
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import org.jeecg.modules.eam.entity.EamSecondMaintenanceOrderDetail;
import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest;
import org.jeecg.modules.eam.service.*;
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.ISysBusinessCodeRuleService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
 * @Author: Lyh
 * @CreateTime: 2025-09-01
 * @Description: äºŒä¿å·¥å•生成
 */
@Component
@Slf4j
public class SecondMaintenanceOrderGenerateJob implements Job {
    @Autowired
    private IEamEquipmentService equipmentService;
    @Autowired
    private IEamSecondMaintenanceOrderService eamSecondMaintenanceOrderService;
    @Autowired
    private IEamMaintenanceStandardService eamMaintenanceStandardService;
    @Autowired
    private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService;
    @Autowired
    private ISysBusinessCodeRuleService businessCodeRuleService;
    @Autowired
    private ISysQuartzLogService sysQuartzLogService;
    @Autowired
    private IQuartzJobService quartzJobService;
    @Autowired
    private IEamEquipmentExtendService equipmentExtendService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // ä»»åŠ¡æ—¥å¿—åˆå§‹åŒ–
        SysQuartzLog quartzLog = new SysQuartzLog();
        quartzLog.setCreateTime(new Date());
        List<QuartzJob> byJobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        // èŽ·å–éœ€è¦äºŒä¿çš„è®¾å¤‡åˆ—è¡¨
        List<EamEquipment> equipmentList = equipmentService.selectSecondMaintenanceEquipmentList();
        if (CollectionUtil.isEmpty(equipmentList)) {
            log.warn("没有需要生成二保工单的设备!日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get()));
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail("没有需要生成二保工单的设备");
            saveQuartzLog(quartzLog, startTime);
            return;
        }
        AtomicInteger successCount = new AtomicInteger(0);
        AtomicInteger failCount = new AtomicInteger(0);
        StringBuilder sb = new StringBuilder();
        // éåŽ†è®¾å¤‡ç”Ÿæˆå·¥å•
        for (EamEquipment equipment : equipmentList) {
            generateSecondMaintenanceOrder(
                    equipment,
                    successCount,
                    failCount,
                    sb
            );
        }
        // ä¿å­˜ä»»åŠ¡æ—¥å¿—
        quartzLog.setIsSuccess(failCount.get() > 0 ? -1 : 0);
        sb.insert(0, "二保工单生成结果:");
        sb.append("\n成功:").append(successCount.get()).append(",失败:").append(failCount.get());
        quartzLog.setExceptionDetail(sb.toString());
        saveQuartzLog(quartzLog, startTime);
    }
    private void saveQuartzLog(SysQuartzLog quartzLog, long startTime) {
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        sysQuartzLogService.save(quartzLog);
    }
    private void generateSecondMaintenanceOrder(EamEquipment equipment, AtomicInteger successCount, AtomicInteger failCount, StringBuilder sb) {
        Date nextMaintenanceDate=equipment.getNextSecondMaintenance();
        //检查是否满足生成条件,提前一天生成
        Calendar cal = Calendar.getInstance();
        cal.setTime(nextMaintenanceDate);
        cal.add(Calendar.DAY_OF_MONTH, -1);
        Date targetDate = cal.getTime();
        // èŽ·å–å½“å‰æ—¥æœŸï¼ˆä¸å«æ—¶é—´éƒ¨åˆ†ï¼‰
        Calendar today = Calendar.getInstance();
        today.set(Calendar.HOUR_OF_DAY, 0);
        today.set(Calendar.MINUTE, 0);
        today.set(Calendar.SECOND, 0);
        today.set(Calendar.MILLISECOND, 0);
        // æ¯”较日期是否匹配
        if (targetDate.equals(today.getTime())) {
            // ç”ŸæˆäºŒä¿å·¥å•
            EamMaintenanceStandard standard = eamMaintenanceStandardService.queryByEquipmentIdAndCategory(
                    equipment.getId(),
                    MaintenanceCategoryEnum.SECOND_MAINTENANCE.name()
            );
            if (standard == null) {
                handleFailure(equipment, "未配置二级保养规范", failCount, sb);
                return;
            }
            // èŽ·å–è§„èŒƒæ˜Žç»†
            List<EamMaintenanceStandardDetail> details = eamMaintenanceStandardDetailService.selectByStandardId(standard.getId());
            if (CollectionUtil.isEmpty(details)) {
                handleFailure(equipment, "未配置二级保养规范明细", failCount, sb);
                return;
            }
            // æž„建工单请求
            EamSecondMaintenanceRequest request = new EamSecondMaintenanceRequest();
            request.setOrderNum(businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.SECOND_MAINTENANCE_CODE_RULE));
            request.setEquipmentId(equipment.getId());
            request.setStandardId(standard.getId());
            request.setMaintenanceDate(nextMaintenanceDate);
            request.setCreationMethod(OrderCreationMethodEnum.AUTO.name());
            // è½¬æ¢è§„范明细
            List<EamSecondMaintenanceOrderDetail> orderDetails = details.stream()
                    .map(EamSecondMaintenanceOrderDetail::new)
                    .collect(Collectors.toList());
            request.setTableDetailList(orderDetails);
            try {
                // åˆ›å»ºå·¥å•
                eamSecondMaintenanceOrderService.addMaintenance(request);
                // æ›´æ–°è®¾å¤‡çŠ¶æ€
                equipmentExtendService.updateSecondMaintenanceParam(
                        equipment.getId(),
                        null,
                        CommonConstant.STATUS_1
                );
                successCount.incrementAndGet();
                log.info("设备 {} äºŒä¿å·¥å•生成成功", equipment.getEquipmentCode());
            } catch (Exception e) {
                handleFailure(equipment, "生成失败: " + e.getMessage(), failCount, sb);
                log.error("设备 {} äºŒä¿å·¥å•生成异常", equipment.getEquipmentCode(), e);
            }
        }
    }
    private void handleFailure(EamEquipment equipment, String reason, AtomicInteger failCount, StringBuilder sb) {
        failCount.incrementAndGet();
        sb.append("\n设备 ")
                .append(equipment.getEquipmentCode())
                .append(":")
                .append(reason);
        log.warn("设备 {} äºŒä¿å·¥å•生成失败:{}", equipment.getEquipmentCode(), reason);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java
@@ -55,20 +55,6 @@
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date maintenanceDate;
    /**
     * é”å®šå·¥å•日期
     */
    @ApiModelProperty(value = "锁定工单日期;提前55天锁定工单")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date freezeOrderDate;
    /**
     * å·¥å•过期日期
     */
    @ApiModelProperty(value = "工单过期日期;到期未做直接过期")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date orderExpirationDate;
    /**
     * å®žé™…开始时间
     */
    @ApiModelProperty(value = "实际开始时间")
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamSecondMaintenanceOrderService.java
@@ -9,6 +9,7 @@
import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest;
import org.jeecg.modules.eam.vo.EamEquipmentTree;
import java.text.ParseException;
import java.util.List;
/**
@@ -57,7 +58,7 @@
     * @param request
     * @return
     */
    EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request);
    EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request) throws ParseException;
    /**
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderAsyncService.java
ÎļþÒÑɾ³ý
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java
@@ -52,7 +52,10 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -100,8 +103,6 @@
    private BaseFactoryMapper baseFactoryMapper;
    @Autowired
    private IEamSecondMaintenanceOrderDetailService eamSecondMaintenanceOrderDetailService;
    @Autowired
    private EamSecondMaintenanceOrderAsyncService eamSecondMaintenanceOrderAsyncService;
    @Autowired
    private IEamFactorySecondMaintPlanService factorySecondMaintPlanService;
@@ -349,9 +350,9 @@
        }
        // æ’入首页二保养计划
        // ä½¿ç”¨ SimpleDateFormat ç›´æŽ¥æ ¼å¼åŒ–为“yyyyå¹´MM月”格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MM月");
        String formattedDate = sdf.format(order.getMaintenanceDate());
        factorySecondMaintPlanService.add(order.getEquipmentId(), formattedDate);
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MM月");
//        String formattedDate = sdf.format(order.getMaintenanceDate());
//        factorySecondMaintPlanService.add(order.getEquipmentId(), formattedDate);
        return true;
    }
@@ -486,7 +487,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    @EquipmentHistoryLog(operationTag = EquipmentOperationTagEnum.SECOND_MAINTENANCE, businessTable = "eam_second_maintenance_order")
    public EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request) {
    public EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request) throws ParseException {
        EamSecondMaintenanceOrder entity = eamSecondMaintenanceOrderMapper.selectById(request.getId());
        if (entity == null) {
            throw new JeecgBootException("审批的数据已删除,请刷新重试!");
@@ -683,17 +684,32 @@
        eamSecondMaintenanceOrderMapper.updateById(entity);
        //异步生成下次二保工单
        if (SecondMaintenanceStatusEnum.COMPLETE.name().equals(entity.getMaintenanceStatus())) {
            try {
                eamSecondMaintenanceOrderAsyncService.asyncGenerateNextMaintenanceOrder(entity.getId());
            } catch (Exception e) {
                log.error("触发异步生成下次工单失败,工单ID: {}", entity.getId(), e);
            }
            //填充计算下次二保日期
            EamEquipmentExtend eamEquipmentExtend=eamEquipmentExtendService.getById(entity.getEquipmentId());
            eamEquipmentExtend.setLatestSecondMaintenance(entity.getMaintenanceDate());
            eamEquipmentExtend.setNextSecondMaintenance(calculateNextMaintenanceDate(entity.getMaintenanceDate()));
            eamEquipmentExtendService.updateById(eamEquipmentExtend);
        }
        return entity;
    }
    /**
     * è®¡ç®—六个月后的当月最后一天
     * @param currentDate å½“前工单日期
     * @return å…­ä¸ªæœˆåŽçš„当月最后一天
     */
    private Date calculateNextMaintenanceDate(Date currentDate) {
        // è½¬æ¢ä¸ºLocalDate处理日期
        LocalDate localDate = DateUtils.dateToLocalDate(currentDate);
        // è®¡ç®—六个月后的日期
        LocalDate sixMonthsLater = localDate.plusMonths(6);
        // è°ƒæ•´åˆ°å½“月的最后一天
        LocalDate lastDayOfMonth = sixMonthsLater.with(TemporalAdjusters.lastDayOfMonth());
        // è½¬æ¢å›žDate类型
        return DateUtils.localDateToDate(lastDayOfMonth);
    }
    /**
     * æ‰¹é‡æ‰“印二保工单
     * @param ids
     * @return