Lius
6 天以前 d59198dda60c6009b801930acd67faad89d128d9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
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<QuartzJob> 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<EamEquipment> 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<EamMaintenanceStandardDetail> 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<EamThirdMaintenanceOrderDetail> 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("!");
            }
 
        }
    }
}