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.*; import org.jeecg.modules.eam.request.EamThirdMaintenanceRequest; 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.entity.SysParams; import org.jeecg.modules.system.service.ISysBusinessCodeRuleService; import org.jeecg.modules.system.service.ISysParamsService; 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.time.LocalDate; import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * @Author: Lius * @CreateTime: 2025-07-29 * @Description: 三保工单生成 */ @Component @Slf4j public class ThirdMaintenanceOrderGenerateJob implements Job { @Autowired private IEamEquipmentService equipmentService; @Autowired private ISysParamsService paramsService; @Autowired private IEamThirdMaintenanceOrderService eamThirdMaintenanceOrderService; @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 byJobClassName = quartzJobService.findByJobClassName(this.getClass().getName()); if (byJobClassName != null && !byJobClassName.isEmpty()) { quartzLog.setJobId(byJobClassName.get(0).getId()); } long startTime = System.currentTimeMillis(); //获取三保系统配置参数 SysParams threeYearMaintOrderPreGenerationDaysParam = paramsService.getSysPramBySettingKey("three_year_maint_order_pre_generation_days"); if (threeYearMaintOrderPreGenerationDaysParam == null) { log.error("未配置3~4年期提前生成工单的系统参数,日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get())); quartzLog.setIsSuccess(-1); long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); quartzLog.setExceptionDetail("未配置3~4年期提前生成工单的系统参数,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get())); sysQuartzLogService.save(quartzLog); return; } int threeYearMaintOrderPreGenerationDays = Integer.parseInt(threeYearMaintOrderPreGenerationDaysParam.getSettingValue()); SysParams oneYearMaintOrderPreGenerationDaysParam = paramsService.getSysPramBySettingKey("one_year_maint_order_pre_generation_days"); if (oneYearMaintOrderPreGenerationDaysParam == null) { log.error("未配置3~4年期提前生成工单的系统参数,日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get())); quartzLog.setIsSuccess(-1); long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); quartzLog.setExceptionDetail("未配置3~4年期提前生成工单的系统参数,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get())); sysQuartzLogService.save(quartzLog); return; } int oneYearMaintOrderPreGenerationDays = Integer.parseInt(oneYearMaintOrderPreGenerationDaysParam.getSettingValue()); SysParams threeYearMaintOrderPreLockDaysParam = paramsService.getSysPramBySettingKey("three_year_maint_order_pre_lock_days"); if (threeYearMaintOrderPreLockDaysParam == null) { log.error("未配置3~4年期提前锁定工单的系统参数,日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get())); quartzLog.setIsSuccess(-1); long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); quartzLog.setExceptionDetail("未配置3~4年期提前锁定工单的系统参数,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get())); sysQuartzLogService.save(quartzLog); return; } int threeYearMaintOrderPreLockDays = Integer.parseInt(threeYearMaintOrderPreLockDaysParam.getSettingValue()); SysParams oneYearMaintOrderPreLockDaysParam = paramsService.getSysPramBySettingKey("one_year_maint_order_pre_lock_days"); if (oneYearMaintOrderPreLockDaysParam == null) { log.error("未配置1年期提前锁定工单的系统参数,日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get())); quartzLog.setIsSuccess(-1); long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); quartzLog.setExceptionDetail("未配置1年期提前锁定工单的系统参数,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get())); sysQuartzLogService.save(quartzLog); return; } int oneYearMaintOrderPreLockDays = Integer.parseInt(oneYearMaintOrderPreLockDaysParam.getSettingValue()); //获取设备列表 List equipmentList = equipmentService.selectThreeMaintenanceEquipmentList(); if (CollectionUtil.isEmpty(equipmentList)) { log.warn("没有需要生成三保工单的设备!日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get())); quartzLog.setIsSuccess(-1); long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); quartzLog.setExceptionDetail("没有需要生成三保工单的设备,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get())); sysQuartzLogService.save(quartzLog); return; } AtomicInteger successCount = new AtomicInteger(0); AtomicInteger failCount = new AtomicInteger(0); StringBuilder sb = new StringBuilder(); for (EamEquipment eamEquipment : equipmentList) { //判断是否为1年的三保周期 if (eamEquipment.getThirdMaintenancePeriod() == 1) { //1年期 generateThirdMaintenanceOrder(oneYearMaintOrderPreGenerationDays, oneYearMaintOrderPreLockDays, eamEquipment, successCount, failCount, sb); } else if (eamEquipment.getThirdMaintenancePeriod() == 3 || eamEquipment.getThirdMaintenancePeriod() == 4) { //3~4年期 generateThirdMaintenanceOrder(threeYearMaintOrderPreGenerationDays, threeYearMaintOrderPreLockDays, eamEquipment, successCount, failCount, sb); } } quartzLog.setIsSuccess(0); if (failCount.get() > 0) { quartzLog.setIsSuccess(-1); } sb.append("三保工单生成:【成功:").append(successCount.get()).append(",失败:").append(failCount.get()).append("】"); quartzLog.setExceptionDetail(sb.toString()); long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); sysQuartzLogService.save(quartzLog); } private void generateThirdMaintenanceOrder(int orderPreGenerationDays, int orderPreLockDays, EamEquipment equipment, AtomicInteger successCount, AtomicInteger failCount, StringBuilder sb) { LocalDate nextThirdMaintenanceDate = DateUtils.dateToLocalDate(equipment.getNextThirdMaintenance()); LocalDate generateDate = nextThirdMaintenanceDate.minusDays(orderPreGenerationDays); LocalDate lockDate = nextThirdMaintenanceDate.minusDays(orderPreLockDays); if (!LocalDate.now().isBefore(generateDate) && !CommonConstant.STATUS_1.equals(equipment.getThirdMaintenanceGenerateFlag())) { //计算当天需要生成 EamMaintenanceStandard standard = eamMaintenanceStandardService.queryByEquipmentIdAndCategory(equipment.getId(), MaintenanceCategoryEnum.THIRD_MAINTENANCE.name()); if (standard == null) { log.warn("设备:{},未配置三级保养规范,无法生成三保工单!日期:{}", equipment.getEquipmentCode(), DateUtils.date2Str(DateUtils.date_sdf.get())); failCount.incrementAndGet(); sb.append("设备:").append(equipment.getEquipmentCode()).append(",未配置三级保养规范,无法生成三保工单!"); return; } List eamMaintenanceStandardDetailList = eamMaintenanceStandardDetailService.selectByStandardId(standard.getId()); if (CollectionUtil.isEmpty(eamMaintenanceStandardDetailList)) { log.warn("设备:{},未配置三级保养规范明细,无法生成三保工单!日期:{}", equipment.getEquipmentCode(), DateUtils.date2Str(DateUtils.date_sdf.get())); failCount.incrementAndGet(); sb.append("设备:").append(equipment.getEquipmentCode()).append(",未配置三级保养规范明细,无法生成三保工单!"); return; } EamThirdMaintenanceRequest request = new EamThirdMaintenanceRequest(); String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.THIRD_MAINTENANCE_CODE_RULE); request.setOrderNum(codeSeq); request.setEquipmentId(equipment.getId()); request.setStandardId(standard.getId()); request.setMaintenanceDate(generateDate.toString()); request.setFreezeOrderDate(DateUtils.localDateToDate(lockDate)); request.setOrderExpirationDate(equipment.getNextThirdMaintenance()); request.setCreationMethod(OrderCreationMethodEnum.AUTO.name()); List tableDetailList = eamMaintenanceStandardDetailList.stream().map(EamThirdMaintenanceOrderDetail::new).collect(Collectors.toList()); request.setTableDetailList(tableDetailList); try { eamThirdMaintenanceOrderService.addMaintenance(request); successCount.incrementAndGet(); //更新扩展表中的生成标识 equipmentExtendService.updateThirdMaintenanceParam(equipment.getId(), null, null, CommonConstant.STATUS_1); } catch (Exception e) { log.error("设备:{},生成三保工单失败,原因:{}", equipment.getEquipmentCode(), e.getMessage(), e); failCount.incrementAndGet(); sb.append("设备:").append(equipment.getEquipmentCode()).append(",生成三保工单失败,原因:").append(e.getMessage()).append("!"); } } } }