| | |
| | | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | 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()); |
| | |
| | | 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); |
| | | } |
| | | |
| | | |
| | | } |