已修改15个文件
522 ■■■■■ 文件已修改
db/430设备管理数据库设计.pdma.json 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentExtend.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentExtendService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentExtendServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamTechnicalStatusEvaluationOrderController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/TechnicalStatusEvaluationExpiredJob.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/TechnicalStatusEvaluationGenerateJob.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/TechnicalStatusEvaluationLockedJob.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamTechnicalStatusEvaluationOrderRequest.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamTechnicalStatusEvaluationOrderService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamTechnicalStatusEvaluationOrderServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/430É豸¹ÜÀíÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -4,7 +4,7 @@
  "avatar": "",
  "version": "4.9.2",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-7-18 10:53:30",
  "updatedTime": "2025-7-21 18:29:46",
  "dbConns": [],
  "profile": {
    "default": {
@@ -2326,6 +2326,42 @@
          "extProps": {},
          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
          "id": "951E3090-8A27-4E30-A5F0-308B3E9F8E6D"
        },
        {
          "defKey": "technology_genarate_flag",
          "defName": "技术状态鉴定生成标记",
          "comment": "1 å·²ç”Ÿæˆ 0 ä¸‹æ¬¡å¾…生成",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
          "id": "0F8E5A79-4399-42B0-B893-254A6D9DEFAD"
        },
        {
          "defKey": "third_maintenance_genarate_flag",
          "defName": "三保生成标记",
          "comment": "1 å·²ç”Ÿæˆ 0 ä¸‹æ¬¡å¾…生成",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
          "id": "0BACB829-115B-472B-B205-812ABA028344"
        }
      ],
      "correlations": [],
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java
@@ -203,9 +203,6 @@
    public static String date2Str(SimpleDateFormat dateSdf) {
        synchronized (dateSdf) {
            Date date = getDate();
            if (null == date) {
                return null;
            }
            return dateSdf.format(date);
        }
    }
@@ -691,6 +688,7 @@
        calendar.setTime(getDate());
        return calendar.get(Calendar.YEAR);
    }
    public static String getDayStr(Date date) {
        Calendar calendar = getCalendar();
        calendar.setTime(date);// æŠŠå½“前时间赋给日历
@@ -698,15 +696,16 @@
        String dayStr = day < 10 ? "0" + day : day + "";
        return dayStr;
    }
    /**
     * å°†å­—符串转成时间
     * @param str
     * @return
     */
    public static Date parseDatetime(String str){
    public static Date parseDatetime(String str) {
        try {
            return datetimeFormat.get().parse(str);
        }catch (Exception e){
        } catch (Exception e) {
        }
        return null;
    }
@@ -714,7 +713,7 @@
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´ä¹‹åŽçš„å‡ å¹´ qsw
     */
    public static Date getYearAfter(Date data,int number) {
    public static Date getYearAfter(Date data, int number) {
        Calendar c = Calendar.getInstance();
        c.setTime(data);
        c.add(Calendar.YEAR, number);
@@ -727,7 +726,7 @@
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´ä¹‹åŽçš„å‡ å¤© qsw
     */
    public static Date getDayAfter(Date data,int number) {
    public static Date getDayAfter(Date data, int number) {
        Calendar c = Calendar.getInstance();
        c.setTime(data);
        c.add(Calendar.DAY_OF_MONTH, number);
@@ -740,7 +739,7 @@
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´ä¹‹åŽçš„å‡ åˆ†é’Ÿ qsw
     */
    public static Date getMinAfter(Date data,int number) {
    public static Date getMinAfter(Date data, int number) {
        Calendar c = Calendar.getInstance();
        c.setTime(data);
        c.add(Calendar.MINUTE, number);
@@ -751,7 +750,7 @@
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´ä¹‹åŽçš„å‡ å°æ—¶ qsw
     */
    public static Date getHourAfter(Date data,int number) {
    public static Date getHourAfter(Date data, int number) {
        Calendar c = Calendar.getInstance();
        c.setTime(data);
        c.add(Calendar.HOUR_OF_DAY, number);
@@ -784,6 +783,16 @@
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }
    /**
     * æ—¥æœŸåŠ å¹´
     * @param date
     * @param year
     * @return
     */
    public static Date addYear(Date date, int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, year);
        return calendar.getTime();
    }
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java
@@ -453,6 +453,15 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    /** æŠ€æœ¯çŠ¶æ€é‰´å®šç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "技术状态鉴定生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    @TableField(exist = false)
    private String technologyGenerateFlag;
    /** ä¸‰ä¿ç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "三保生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    @TableField(exist = false)
    private String thirdMaintenanceGenerateFlag;
    public void setFactoryOrgCode(String factoryOrgCode){
        this.factoryOrgCode = factoryOrgCode;
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentExtend.java
@@ -91,4 +91,10 @@
    /**技术鉴定周期(å¹´)*/
    @ApiModelProperty(value = "技术鉴定周期(å¹´)")
    private Integer technologyCheckPeriod;
    /** æŠ€æœ¯çŠ¶æ€é‰´å®šç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "技术状态鉴定生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    private String technologyGenerateFlag;
    /** ä¸‰ä¿ç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "三保生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    private String thirdMaintenanceGenerateFlag;
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentMapper.xml
@@ -52,7 +52,9 @@
               ext.third_maintenance_period,
               ext.technology_check_period,
               ext.latest_technology_check,
               ext.next_technology_check
               ext.next_technology_check,
               ext.technology_genarate_flag,
               ext.third_maintenance_genarate_flag
        from eam_equipment e
        left join eam_equipment_extend ext
        on e.id = ext.id
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentExtendService.java
@@ -3,6 +3,8 @@
import org.jeecg.modules.eam.entity.EamEquipmentExtend;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date;
/**
 * @Description: è®¾å¤‡å°è´¦æ‰©å±•表
 * @Author: jeecg-boot
@@ -25,4 +27,14 @@
     * @return
     */
    boolean updateEquipmentRepairStatus(String equipmentId, String status);
    /**
     * æ›´æ–°è®¾å¤‡æŠ€æœ¯çŠ¶æ€åŠé‰´å®šæ—¥æœŸ
     * @param equipmentId è®¾å¤‡ID
     * @param status æŠ€æœ¯çŠ¶æ€
     * @param evaluationDate é‰´å®šå®Œæˆæ—¥æœŸ
     * @param technologyGenerateFlag æŠ€æœ¯çŠ¶æ€é‰´å®šå·¥å•ç”Ÿæˆæ ‡è¯†
     * @return
     */
    boolean updateTechnologyParam(String equipmentId, String status, Date evaluationDate, String technologyGenerateFlag);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentExtendServiceImpl.java
@@ -1,5 +1,9 @@
package org.jeecg.modules.eam.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.eam.entity.EamEquipmentExtend;
import org.jeecg.modules.eam.mapper.EamEquipmentExtendMapper;
import org.jeecg.modules.eam.service.IEamEquipmentExtendService;
@@ -9,6 +13,7 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
/**
 * @Description: è®¾å¤‡å°è´¦æ‰©å±•表
@@ -45,4 +50,28 @@
        eamEquipmentExtendMapper.updateById(entity);
        return true;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateTechnologyParam(String equipmentId, String status, Date evaluationDate, String technologyGenerateFlag) {
        if (StringUtils.isBlank(status) && StringUtils.isBlank(technologyGenerateFlag) && evaluationDate == null) {
            return false;
        }
        EamEquipmentExtend entity = this.getBaseMapper().selectById(equipmentId);
        UpdateWrapper<EamEquipmentExtend> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", equipmentId);
        if (StringUtils.isNotBlank(status)) {
            entity.setTechnologyStatus(status);
        }
        if (StringUtils.isNotBlank(technologyGenerateFlag)) {
            entity.setTechnologyGenerateFlag(technologyGenerateFlag);
        }
        if (evaluationDate != null) {
            entity.setLatestTechnologyCheck(evaluationDate);
            if (entity.getTechnologyCheckPeriod() != null) {
                entity.setNextTechnologyCheck(DateUtils.addYear(entity.getLatestTechnologyCheck(), entity.getTechnologyCheckPeriod()));
            }
        }
        return this.getBaseMapper().updateById(entity) > 0;
    }
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java
@@ -410,7 +410,7 @@
        queryWrapper.eq("e.del_flag", CommonConstant.DEL_FLAG_0);
        queryWrapper.ne("ext.technology_status", TechnologyStatusEnum.PROHIBITED.name());
        queryWrapper.isNotNull("ext.technology_check_period");
        queryWrapper.isNotNull("e.next_technology_check");
        queryWrapper.isNotNull("ext.next_technology_check");
        return this.getBaseMapper().selectTechnicalEquipmentList(queryWrapper);
    }
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamTechnicalStatusEvaluationOrderController.java
@@ -15,6 +15,7 @@
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.util.TranslateDictTextUtils;
import org.jeecg.modules.eam.constant.OrderCreationMethodEnum;
import org.jeecg.modules.eam.entity.EamTechnicalStatusEvaluationOrder;
import org.jeecg.modules.eam.request.EamTechnicalStatusEvaluationOrderQuery;
import org.jeecg.modules.eam.request.EamTechnicalStatusEvaluationOrderRequest;
@@ -74,6 +75,7 @@
        if (CollectionUtil.isEmpty(request.getTableDetailList())) {
            return Result.error("检查项不能为空!");
        }
        request.setCreationMethod(OrderCreationMethodEnum.MANUAL.name());
        boolean b = eamTechnicalStatusEvaluationOrderService.addTechnicalStatusEvaluationOrder(request);
        if (!b) {
            return Result.error("添加失败!");
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/TechnicalStatusEvaluationExpiredJob.java
@@ -1,4 +1,80 @@
package org.jeecg.modules.eam.job;
public class TechnicalStatusEvaluationExpiredJob {
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.eam.constant.TechnicalStatusEvaluationOrderStatusEnum;
import org.jeecg.modules.eam.constant.TechnologyStatusEnum;
import org.jeecg.modules.eam.entity.EamEquipmentExtend;
import org.jeecg.modules.eam.entity.EamTechnicalStatusEvaluationOrder;
import org.jeecg.modules.eam.service.IEamEquipmentExtendService;
import org.jeecg.modules.eam.service.IEamTechnicalStatusEvaluationOrderService;
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.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.util.Date;
import java.util.List;
@Component
@Slf4j
public class TechnicalStatusEvaluationExpiredJob implements Job {
    @Autowired
    private IEamTechnicalStatusEvaluationOrderService evaluationOrderService;
    @Autowired
    private IEamEquipmentExtendService equipmentExtendService;
    @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<QuartzJob> jobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (jobClassName != null && !jobClassName.isEmpty()) {
            quartzLog.setJobId(jobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        List<EamTechnicalStatusEvaluationOrder> list = evaluationOrderService.selectUncompletedEvaluationOrderList();
        if (CollectionUtil.isEmpty(list)) {
            log.info("没有需要过期的工单!日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get()));
            quartzLog.setIsSuccess(0);
            long endTime = System.currentTimeMillis();
            quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
            quartzLog.setExceptionDetail("没有需要过期的工单,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get()));
            sysQuartzLogService.save(quartzLog);
            return;
        }
        int expiredCount = 0;
        for (EamTechnicalStatusEvaluationOrder order : list) {
            EamEquipmentExtend extend = equipmentExtendService.getById(order.getEquipmentId());
            if (extend == null) {
                log.error("设备信息不存在,请检查! è®¾å¤‡ID:{}, æ—¥æœŸï¼š{}", order.getEquipmentId(), DateUtils.date2Str(DateUtils.date_sdf.get()));
                continue;
            }
            if (TechnicalStatusEvaluationOrderStatusEnum.WAIT_EVALUATION.name().equals(order.getEvaluationStatus()) || TechnicalStatusEvaluationOrderStatusEnum.LOCKED.name().equals(order.getEvaluationStatus())) {
                order.setEvaluationStatus(TechnicalStatusEvaluationOrderStatusEnum.EXPIRED.name());
                evaluationOrderService.updateById(order);
                expiredCount++;
            }
            extend.setTechnologyStatus(TechnologyStatusEnum.PROHIBITED.name());
            equipmentExtendService.updateById(extend);
        }
        quartzLog.setIsSuccess(0);
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        quartzLog.setExceptionDetail("过期了{" + expiredCount + "}个工单,还有{" + (list.size() - expiredCount) + "}个工单正在执行中,禁用了{" + list.size() + "}台设备, æ—¥æœŸï¼š" + DateUtils.date2Str(DateUtils.date_sdf.get()));
        sysQuartzLogService.save(quartzLog);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/TechnicalStatusEvaluationGenerateJob.java
@@ -1,37 +1,174 @@
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.OrderCreationMethodEnum;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamTechnicalStatusEvaluationStandard;
import org.jeecg.modules.eam.request.EamTechnicalStatusEvaluationOrderRequest;
import org.jeecg.modules.eam.service.IEamEquipmentExtendService;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEamTechnicalStatusEvaluationStandardDetailService;
import org.jeecg.modules.eam.service.IEamTechnicalStatusEvaluationOrderService;
import org.jeecg.modules.eam.service.IEamTechnicalStatusEvaluationStandardService;
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.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;
@Component
@Slf4j
public class TechnicalStatusEvaluationGenerateJob implements Job {
    @Autowired
    private IEamEquipmentService equipmentService;
    @Autowired
    private IEamEquipmentExtendService equipmentExtendService;
    @Autowired
    private IEamTechnicalStatusEvaluationStandardService evaluationStandardService;
    @Autowired
    private IEamTechnicalStatusEvaluationStandardDetailService evaluationStandardDetailService;
    @Autowired
    private ISysParamsService paramsService;
    @Autowired
    private IEamTechnicalStatusEvaluationOrderService evaluationOrderService;
    @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> jobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (jobClassName != null && !jobClassName.isEmpty()) {
            quartzLog.setJobId(jobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        //获取技术状态鉴定系统配置参数
        SysParams threeYearOrderPreGenerationDaysParam = paramsService.getSysPramBySettingKey("three_year_order_pre_generation_days");
        if (threeYearOrderPreGenerationDaysParam == 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 threeYearOrderPreGenerationDays = Integer.parseInt(threeYearOrderPreGenerationDaysParam.getSettingValue());
        SysParams oneYearOrderPreGenerationDaysParam = paramsService.getSysPramBySettingKey("one_year_order_pre_generation_days");
        if (oneYearOrderPreGenerationDaysParam == 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 oneYearOrderPreGenerationDays = Integer.parseInt(oneYearOrderPreGenerationDaysParam.getSettingValue());
        SysParams threeYearOrderPreLockDaysParam = paramsService.getSysPramBySettingKey("three_year_order_pre_lock_days");
        if (threeYearOrderPreLockDaysParam == 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 threeYearOrderPreLockDays = Integer.parseInt(threeYearOrderPreLockDaysParam.getSettingValue());
        SysParams oneYearOrderPreLockDaysParam = paramsService.getSysPramBySettingKey("one_year_order_pre_lock_days");
        if (oneYearOrderPreLockDaysParam == 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 oneYearOrderPreLockDays = Integer.parseInt(oneYearOrderPreLockDaysParam.getSettingValue());
        //获取设备列表
        List<EamEquipment> equipmentList = equipmentService.selectTechnicalEquipmentList();
        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 equipment : equipmentList) {
            //判断是否为1年的技术状态鉴定周期
            if (equipment.getTechnologyCheckPeriod() == 1) {
                //1年期
                generateTechnicalStatusEvaluationOrder(oneYearOrderPreGenerationDays, oneYearOrderPreLockDays, equipment, successCount, failCount, sb);
            } else if (equipment.getTechnologyCheckPeriod() == 3 || equipment.getTechnologyCheckPeriod() == 4) {
                //3~4年期
                generateTechnicalStatusEvaluationOrder(threeYearOrderPreGenerationDays, threeYearOrderPreLockDays, equipment, 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 generateTechnicalStatusEvaluationOrder(int orderPreGenerationDays, int orderPreLockDays, EamEquipment equipment, AtomicInteger successCount, AtomicInteger failCount, StringBuilder sb) {
        LocalDate nextTechnologyCheckDate = DateUtils.dateToLocalDate(equipment.getNextTechnologyCheck());
        LocalDate generateDate = nextTechnologyCheckDate.minusDays(orderPreGenerationDays);
        LocalDate lockDate = nextTechnologyCheckDate.minusDays(orderPreLockDays);
        if (!LocalDate.now().isBefore(generateDate) && !CommonConstant.STATUS_1.equals(equipment.getTechnologyGenerateFlag())) {
            //计算当天需要生成
            EamTechnicalStatusEvaluationStandard standard = evaluationStandardService.queryEnableStandard(equipment.getId());
            if (standard == null) {
                log.warn("设备:{},未配置技术状态鉴定规范,无法生成技术鉴定工单!日期:{}", equipment.getEquipmentCode(), DateUtils.date2Str(DateUtils.date_sdf.get()));
                failCount.incrementAndGet();
                sb.append("设备:").append(equipment.getEquipmentCode()).append(",未配置技术状态鉴定规范,无法生成技术鉴定工单!");
                return;
            }
            EamTechnicalStatusEvaluationOrderRequest request = new EamTechnicalStatusEvaluationOrderRequest();
            request.setEquipmentId(equipment.getId());
            request.setStandardId(standard.getId());
            request.setEvaluationDate(DateUtils.localDateToDate(generateDate));
            request.setFreezeOrderDate(DateUtils.localDateToDate(lockDate));
            request.setOrderExpirationDate(equipment.getNextTechnologyCheck());
            request.setCreationMethod(OrderCreationMethodEnum.AUTO.name());
            try {
                evaluationOrderService.addTechnicalStatusEvaluationOrder(request);
                successCount.incrementAndGet();
                //更新扩展表中的生成标识
                equipmentExtendService.updateTechnologyParam(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("!");
            }
        }
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/TechnicalStatusEvaluationLockedJob.java
@@ -1,4 +1,65 @@
package org.jeecg.modules.eam.job;
public class TechnicalStatusEvaluationLockedJob {
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.eam.constant.TechnicalStatusEvaluationOrderStatusEnum;
import org.jeecg.modules.eam.entity.EamTechnicalStatusEvaluationOrder;
import org.jeecg.modules.eam.service.IEamTechnicalStatusEvaluationOrderService;
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.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.util.Date;
import java.util.List;
@Component
@Slf4j
public class TechnicalStatusEvaluationLockedJob implements Job {
    @Autowired
    private IEamTechnicalStatusEvaluationOrderService evaluationOrderService;
    @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<QuartzJob> jobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (jobClassName != null && !jobClassName.isEmpty()) {
            quartzLog.setJobId(jobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        List<EamTechnicalStatusEvaluationOrder> list = evaluationOrderService.selectWaitEvaluationOrderList();
        if (CollectionUtil.isEmpty(list)) {
            log.info("没有需要锁定的工单!日期:{}", DateUtils.date2Str(DateUtils.date_sdf.get()));
            quartzLog.setIsSuccess(0);
            long endTime = System.currentTimeMillis();
            quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
            quartzLog.setExceptionDetail("没有需要锁定的工单,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get()));
            sysQuartzLogService.save(quartzLog);
            return;
        }
        for (EamTechnicalStatusEvaluationOrder order : list) {
            order.setEvaluationStatus(TechnicalStatusEvaluationOrderStatusEnum.LOCKED.name());
            evaluationOrderService.updateById(order);
        }
        quartzLog.setIsSuccess(0);
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        quartzLog.setExceptionDetail("锁定了{" + list.size() + "}条工单,日期:" + DateUtils.date2Str(DateUtils.date_sdf.get()));
        sysQuartzLogService.save(quartzLog);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamTechnicalStatusEvaluationOrderRequest.java
@@ -37,6 +37,16 @@
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date evaluationDate;
    /**锁定工单日期;提前55天锁定工单*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "锁定工单日期;提前55天锁定工单")
    private Date freezeOrderDate;
    /**工单过期日期;到期未做直接过期,并修改设备技术状态为禁用*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "工单过期日期;到期未做直接过期,并修改设备技术状态为禁用")
    private Date orderExpirationDate;
    /**鉴定人*/
    @ApiModelProperty(value = "鉴定人")
    private String evaluator;
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamTechnicalStatusEvaluationOrderService.java
@@ -7,6 +7,8 @@
import org.jeecg.modules.eam.request.EamTechnicalStatusEvaluationOrderQuery;
import org.jeecg.modules.eam.request.EamTechnicalStatusEvaluationOrderRequest;
import java.util.List;
/**
 * @Description: æŠ€æœ¯çŠ¶æ€é‰´å®šå·¥å•
 * @Author: jeecg-boot
@@ -51,4 +53,16 @@
     * @return
     */
    boolean updateEvaluationStatus(String orderId, String evaluationStatus);
    /**
     * èŽ·å–å¾…é‰´å®šçš„å·¥å•ï¼Œé”å®šå¤„ç†ä½¿ç”¨
     * @return
     */
    List<EamTechnicalStatusEvaluationOrder> selectWaitEvaluationOrderList();
    /**
     * èŽ·å–æœªå®Œæˆçš„å·¥å•ä¿¡æ¯ï¼Œè¿‡æœŸå¤„ç†ä½¿ç”¨
     * @return
     */
    List<EamTechnicalStatusEvaluationOrder> selectUncompletedEvaluationOrderList();
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamTechnicalStatusEvaluationOrderServiceImpl.java
@@ -17,6 +17,7 @@
import org.jeecg.common.constant.DataBaseConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.eam.constant.*;
import org.jeecg.modules.eam.entity.*;
@@ -41,6 +42,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
@@ -165,14 +167,20 @@
        if (CollectionUtil.isEmpty(standardDetailList)) {
            throw new JeecgBootException("技术状态鉴定规范检查项为空,添加失败!");
        }
        EamTechnicalStatusEvaluationOrder unCompleted = checkDuplicate(request.getEquipmentId());
        if(unCompleted != null) {
            throw new JeecgBootException("设备已存在未完成的技术状态鉴定工单,无法再次新增!");
        }
        EamTechnicalStatusEvaluationOrder order = new EamTechnicalStatusEvaluationOrder();
        order.setEquipmentId(request.getEquipmentId());
        order.setStandardId(request.getStandardId());
        order.setEvaluationDate(request.getEvaluationDate());
        order.setFreezeOrderDate(request.getFreezeOrderDate());
        order.setOrderExpirationDate(request.getOrderExpirationDate());
        order.setRemark(request.getRemark());
        String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.TECHNICAL_STATUS_EVALUATION_ORDER_CODE_RULE);
        order.setOrderNum(codeSeq);
        order.setCreationMethod(OrderCreationMethodEnum.MANUAL.name());
        order.setCreationMethod(request.getCreationMethod());
        //状态初始化
        order.setEvaluationStatus(TechnicalStatusEvaluationOrderStatusEnum.WAIT_EVALUATION.name());
        //删除标记
@@ -330,7 +338,7 @@
        List<UserSelector> userSelectors;
        switch (status) {
            case UNDER_EVALUATION:
                if(CollectionUtil.isEmpty(request.getTableDetailList())) {
                if (CollectionUtil.isEmpty(request.getTableDetailList())) {
                    throw new JeecgBootException("检查明细信息为空!");
                }
                boolean parallelCompletion = flowTaskService.checkParallelCompletion(flowMyBusiness.getTaskId());
@@ -494,8 +502,6 @@
                    values.put("NextAssignee", userApprovalList);
                    entity.setEvaluationStatus(TechnicalStatusEvaluationOrderStatusEnum.REPAIRER_SIGNING.name());
                }
//                //更新设备保养状态
//                eamEquipmentExtendService.updateEquipmentMaintenanceStatus(entity.getEquipmentId(), EquipmentMaintenanceStatus.NORMAL.name());
                break;
            case PROCESS_TECHNICIAN_SIGNING:
                //工艺员签字
@@ -555,6 +561,11 @@
                entity.setInspectorComment(request.getInspectorComment());
                entity.setEvaluationResult(request.getEvaluationResult());
                entity.setEvaluationReason(request.getEvaluationReason());
                //更新设备技术状态
                // æŒ‰ç…§å¡«æŠ¥å®Œæˆæ—¥æœŸè®¡ç®—本次三保日期,去除时分秒
                Date evaluationDate = DateUtils.localDateToDate(DateUtils.dateToLocalDate(entity.getActualEndTime()));
                equipmentExtendService.updateTechnologyParam(equipment.getId(), entity.getEvaluationResult(),
                        evaluationDate, CommonConstant.STATUS_0);
                break;
        }
        request.setValues(values);
@@ -581,6 +592,60 @@
        return update > 0;
    }
    @Override
    public List<EamTechnicalStatusEvaluationOrder> selectWaitEvaluationOrderList() {
        LambdaQueryWrapper<EamTechnicalStatusEvaluationOrder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EamTechnicalStatusEvaluationOrder::getEvaluationStatus, TechnicalStatusEvaluationOrderStatusEnum.WAIT_EVALUATION.name());
        queryWrapper.isNotNull(EamTechnicalStatusEvaluationOrder::getFreezeOrderDate);
        queryWrapper.eq(EamTechnicalStatusEvaluationOrder::getDelFlag, CommonConstant.DEL_FLAG_0);
        LocalDate localDate = LocalDate.now();
        queryWrapper.lt(EamTechnicalStatusEvaluationOrder::getFreezeOrderDate, localDate.toString());
        return this.getBaseMapper().selectList(queryWrapper);
    }
    @Override
    public List<EamTechnicalStatusEvaluationOrder> selectUncompletedEvaluationOrderList() {
        LambdaQueryWrapper<EamTechnicalStatusEvaluationOrder> queryWrapper = new LambdaQueryWrapper<>();
        List<String> statusList = Arrays.asList(TechnicalStatusEvaluationOrderStatusEnum.WAIT_EVALUATION.name(),
                TechnicalStatusEvaluationOrderStatusEnum.UNDER_EVALUATION.name(),
                TechnicalStatusEvaluationOrderStatusEnum.REPAIRER_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.REPAIR_MANAGER_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.PROCESS_TECHNICIAN_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.DEPART_TECHNICAL_LEADER_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.INSPECTOR_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.LOCKED.name()
        );
        queryWrapper.in(EamTechnicalStatusEvaluationOrder::getEvaluationStatus, statusList);
        queryWrapper.isNotNull(EamTechnicalStatusEvaluationOrder::getOrderExpirationDate);
        queryWrapper.eq(EamTechnicalStatusEvaluationOrder::getDelFlag, CommonConstant.DEL_FLAG_0);
        LocalDate localDate = LocalDate.now();
        queryWrapper.lt(EamTechnicalStatusEvaluationOrder::getOrderExpirationDate, localDate.toString());
        return this.getBaseMapper().selectList(queryWrapper);
    }
    private EamTechnicalStatusEvaluationOrder checkDuplicate(String equipmentId) {
        LambdaQueryWrapper<EamTechnicalStatusEvaluationOrder> queryWrapper = new LambdaQueryWrapper<>();
        List<String> statusList = Arrays.asList(TechnicalStatusEvaluationOrderStatusEnum.WAIT_EVALUATION.name(),
                TechnicalStatusEvaluationOrderStatusEnum.UNDER_EVALUATION.name(),
                TechnicalStatusEvaluationOrderStatusEnum.REPAIRER_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.REPAIR_MANAGER_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.PROCESS_TECHNICIAN_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.DEPART_TECHNICAL_LEADER_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.INSPECTOR_SIGNING.name(),
                TechnicalStatusEvaluationOrderStatusEnum.LOCKED.name(),
                TechnicalStatusEvaluationOrderStatusEnum.CHANGING.name()
        );
        queryWrapper.in(EamTechnicalStatusEvaluationOrder::getEvaluationStatus, statusList);
        queryWrapper.eq(EamTechnicalStatusEvaluationOrder::getDelFlag, CommonConstant.DEL_FLAG_0);
        queryWrapper.eq(EamTechnicalStatusEvaluationOrder::getEquipmentId, equipmentId);
        List<EamTechnicalStatusEvaluationOrder> list = this.getBaseMapper().selectList(queryWrapper);
        if (CollectionUtil.isEmpty(list)) {
            return null;
        }
        return list.get(0);
    }
    private void checkDetailResult(List<EamTechnicalStatusEvaluationOrderDetail> detailList, TechnicalStatusEvaluationCheckCategoryEnum checkCategory) {
        boolean b;
        switch (checkCategory) {