package org.jeecg.modules.eam.job; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.EamInspectionOrder; import org.jeecg.modules.eam.entity.EamInspectionOrderDetail; import org.jeecg.modules.eam.entity.EamMaintenanceStandard; import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail; import org.jeecg.modules.eam.request.EamInspectionOrderRequest; import org.jeecg.modules.eam.service.IEamInspectionOrderService; import org.jeecg.modules.eam.service.IEamMaintenanceStandardDetailService; import org.jeecg.modules.eam.service.IEamMaintenanceStandardService; 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.Date; import java.util.List; import java.util.stream.Collectors; @Component @Slf4j public class InspectionOrderGenerateJob implements Job { @Autowired private IEamMaintenanceStandardService eamMaintenanceStandardService; @Autowired private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService; @Autowired private IEamInspectionOrderService eamInspectionOrderService; @Autowired private ISysBusinessCodeRuleService businessCodeRuleService; @Autowired private ISysQuartzLogService sysQuartzLogService; @Autowired private IQuartzJobService quartzJobService; /** * 工单生成 * * @param jobExecutionContext * @throws JobExecutionException */ @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.POINT_INSPECTION.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 (!generateDate.equals(now)) { //加周期 do { //初始日期设置的比较早,或任务长时间没执行,必须周期到今天才会生成工单 generateDate = generateDate.plusDays(standard.getMaintenancePeriod()); } while (now.isAfter(generateDate)); if (!now.isEqual(generateDate)) { //还未到生成日期,跳过执行 continue; } } //校验生成日期是否已有工单 List list = eamInspectionOrderService.list(new LambdaQueryWrapper().eq(EamInspectionOrder::getEquipmentId, standard.getEquipmentId()).eq(EamInspectionOrder::getInspectionDate, DateUtils.localDateToDate(generateDate))); if (!CollectionUtil.isEmpty(list)) { continue; } //获取保养项明细 List standardDetailList = eamMaintenanceStandardDetailService.selectByStandardId(standard.getId()); if (CollectionUtil.isEmpty(standardDetailList)) { log.error("点检标准没有保养明细,请先配置保养明细, standard:{}", standard); continue; } //开始生成 EamInspectionOrderRequest request = new EamInspectionOrderRequest(); request.setEquipmentId(standard.getEquipmentId()); request.setStandardId(standard.getId()); request.setInspectionDate(DateUtils.localDateToDate(generateDate)); request.setExpirationTime(DateUtils.localDateToDate(generateDate.plusDays(standard.getMaintenancePeriod()))); request.setCreationMethod(OrderCreationMethodEnum.AUTO.name()); String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.INSPECTION_ORDER_CODE_RULE); request.setOrderNum(codeSeq); eamInspectionOrderService.addInspectionOrder(request); } 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); } }