lyh
3 天以前 f71cea3609c4c7bf0b70c77b2c9d8c571586df33
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/SecondMaintenanceOrderGenerateJob.java
@@ -2,18 +2,17 @@
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.*;
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.request.EamWeekMaintenanceRequest;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardDetailService;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardService;
import org.jeecg.modules.eam.service.IEamSecondMaintenanceOrderService;
import org.jeecg.modules.eam.service.IEamWeekMaintenanceOrderService;
import org.jeecg.common.util.ThrowableUtil;
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;
@@ -26,16 +25,23 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.ArrayList;
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
@@ -48,12 +54,13 @@
    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());
@@ -61,79 +68,118 @@
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        /**
         * 获取 配置了 二保标准的 信息
         */
        List<EamMaintenanceStandard> standardList = eamMaintenanceStandardService.queryListByCategory(MaintenanceCategoryEnum.SECOND_MAINTENANCE.name());
        if (CollectionUtil.isEmpty(standardList)) {
            log.warn("没有配置任何二保标准,任务结束");
        // 获取需要二保的设备列表
        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;
        }
        //当前日期
        LocalDate now = LocalDate.now();
        try {
            for (EamMaintenanceStandard standard : standardList) {
                if (standard.getMaintenancePeriod() == null || standard.getMaintenancePeriod() < 1) {
                    log.error("二保标准周期设置错误,请先配置标准周期, standard:{}", standard);
                    continue;
                }
                if (standard.getInitialDate() == null) {
                    //设置初始日期为前一天
                    standard.setInitialDate(DateUtils.localDateToDate(now.minusDays(1)));
                }
                LocalDate generateDate = DateUtils.dateToLocalDate(standard.getInitialDate());
//                if (standard.getLastGenerateTime() != null) {
//                    generateDate = DateUtils.dateToLocalDate(standard.getLastGenerateTime());
//                }
                //加周期
                do {
                    //初始日期设置的比较早,或任务长时间没执行,必须周期到今天才会生成工单
                    generateDate = generateDate.plusDays(standard.getMaintenancePeriod());
                } while (now.isAfter(generateDate));
                if(!now.isEqual(generateDate)) {
                    //还未到生成日期,跳过执行
                    continue;
                }
                //获取保养项明细
                List<EamMaintenanceStandardDetail> standardDetailList = eamMaintenanceStandardDetailService.selectByStandardId(standard.getId());
                if(CollectionUtil.isEmpty(standardDetailList)) {
                    log.error("二保标准没有保养明细,请先配置保养明细, standard:{}", standard);
                    continue;
                }
                //开始生成
                EamSecondMaintenanceRequest request = new EamSecondMaintenanceRequest();
                request.setEquipmentId(standard.getEquipmentId());
                request.setStandardId(standard.getId());
                request.setMaintenanceDate(DateUtils.localDateToDate(generateDate));
                String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.SECOND_MAINTENANCE_CODE_RULE);
                request.setOrderNum(codeSeq);
                request.setCreationMethod(OrderCreationMethodEnum.AUTO.name());
                List<EamSecondMaintenanceOrderDetail> tableDetailList = new ArrayList<>();
                for (EamMaintenanceStandardDetail msd : standardDetailList) {
                    EamSecondMaintenanceOrderDetail sod = new EamSecondMaintenanceOrderDetail();
                    sod.setItemCode(msd.getItemCode());
                    sod.setItemName(msd.getItemName());
                    sod.setItemDemand(msd.getItemDemand());
                    sod.setItemPart(msd.getItemPart());
                    tableDetailList.add(sod);
                }
//                List<EamSecondMaintenanceOrderDetail> collect = standardDetailList.stream().map(EamSecondMaintenanceOrderDetail::new).collect(Collectors.toList());
                request.setTableDetailList(tableDetailList);
                eamSecondMaintenanceOrderService.addMaintenance(request);
        AtomicInteger successCount = new AtomicInteger(0);
        AtomicInteger failCount = new AtomicInteger(0);
        StringBuilder sb = new StringBuilder();
//                standard.setLastGenerateTime(new Date());
                eamMaintenanceStandardService.updateById(standard);
            }
            quartzLog.setIsSuccess(0);
        } catch (Exception e) {
            log.error("二保生成执行定时任务失败,{}", e.getMessage(), e);
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
        // 遍历设备生成工单
        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);
    }
}