package org.jeecg.modules.eam.job; import cn.hutool.core.collection.CollectionUtil; import lombok.extern.slf4j.Slf4j; 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.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.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.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Component @Slf4j public class SecondMaintenanceOrderGenerateJob implements Job { @Autowired private IEamSecondMaintenanceOrderService eamSecondMaintenanceOrderService; @Autowired private IEamMaintenanceStandardService eamMaintenanceStandardService; @Autowired private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService; @Autowired private ISysBusinessCodeRuleService businessCodeRuleService; @Autowired private ISysQuartzLogService sysQuartzLogService; @Autowired private IQuartzJobService quartzJobService; @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(); /** * 获取 配置了 二保标准的 信息 */ List standardList = eamMaintenanceStandardService.queryListByCategory(MaintenanceCategoryEnum.SECOND_MAINTENANCE.name()); if (CollectionUtil.isEmpty(standardList)) { log.warn("没有配置任何二保标准,任务结束"); 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 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 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 collect = standardDetailList.stream().map(EamSecondMaintenanceOrderDetail::new).collect(Collectors.toList()); request.setTableDetailList(tableDetailList); eamSecondMaintenanceOrderService.addMaintenance(request); // 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)); } long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); sysQuartzLogService.save(quartzLog); } }