zhangherong
2025-04-18 1800c05a61a53d528e4f137fa42413cb0bf26734
art: 设备管理-周保工单-自动生成周保,周保过期未保养标记过期
已重命名1个文件
已添加2个文件
已修改11个文件
322 ■■■■■ 文件已修改
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/WeekMaintenanceStatusEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/WeekMaintenanceOrderExpiredJob.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/WeekMaintenanceOrderGenerateJob.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamMaintenanceStandardDetailService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamMaintenanceStandardService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamWeekMaintenanceOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardDetailServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/IFlowMyBusinessService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/impl/FlowMyBusinessServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/ThrowableUtil.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java
@@ -5,6 +5,8 @@
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
@@ -764,8 +766,21 @@
        return dateFormat.format(date);
    }
    /**
     * Date è½¬ LocalDate
     * @param date
     * @return
     */
    public static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }
    /**
     * LocalDate è½¬ Date
     * @param localDate
     * @return
     */
    public static Date localDateToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/WeekMaintenanceStatusEnum.java
@@ -8,6 +8,7 @@
    WAIT_FINAL_ACCEPTANCE, //待终验
    COMPLETE,  //已完成
    ABOLISH, //已作废
    EXPIRED, //已过期
    ;
    public static WeekMaintenanceStatusEnum getInstance(String code) {
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamWeekMaintenanceOrderDetail.java
@@ -64,4 +64,13 @@
    /**报修标记*/
    @ApiModelProperty(value = "报修标记")
    private String reportFlag;
    public EamWeekMaintenanceOrderDetail(){}
    public EamWeekMaintenanceOrderDetail(EamMaintenanceStandardDetail detail) {
        this.itemCode = detail.getItemCode();
        this.itemName = detail.getItemName();
        this.subItemName = detail.getSubItemName();
        this.itemDemand = detail.getItemDemand();
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/WeekMaintenanceOrderExpiredJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package org.jeecg.modules.eam.job;
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.eam.constant.WeekMaintenanceStatusEnum;
import org.jeecg.modules.eam.entity.EamWeekMaintenanceOrder;
import org.jeecg.modules.eam.service.IEamWeekMaintenanceOrderService;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.mdc.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.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;
@Component
@Slf4j
public class WeekMaintenanceOrderExpiredJob implements Job {
    @Autowired
    private IEamWeekMaintenanceOrderService eamWeekMaintenanceOrderService;
    @Autowired
    private IFlowMyBusinessService flowMyBusinessService;
    @Autowired
    private IFlowTaskService flowTaskService;
    @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> byJobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        LocalDate now = LocalDate.now();
        try {
            List<EamWeekMaintenanceOrder> unCompleteOrderList = eamWeekMaintenanceOrderService.selectUnCompleteOrder(now.toString());
            if (CollectionUtil.isEmpty(unCompleteOrderList)) {
                //没有需要处理的数据
                return;
            }
            for (EamWeekMaintenanceOrder order : unCompleteOrderList) {
                if (WeekMaintenanceStatusEnum.WAIT_MAINTENANCE.name().equals(order.getMaintenanceStatus())) {
                    order.setMaintenanceStatus(WeekMaintenanceStatusEnum.EXPIRED.name());
                } else if (WeekMaintenanceStatusEnum.UNDER_MAINTENANCE.name().equals(order.getMaintenanceStatus())) {
                    //已经被接单 ä½†æœªæ‰§è¡Œå®Œæˆ
                    order.setMaintenanceStatus(WeekMaintenanceStatusEnum.EXPIRED.name());
                    //强制结束流程 åˆ é™¤ç”¨æˆ·çš„æ­¤å¾…办任务
                    FlowMyBusiness flowMyBusiness = flowMyBusinessService.selectByDataId(order.getId());
                    if (flowMyBusiness != null) {
                        flowTaskService.end(flowMyBusiness.getProcessInstanceId(), "过期删除");
                    }
                }
            }
            eamWeekMaintenanceOrderService.updateBatchById(unCompleteOrderList);
            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);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/WeekMaintenanceOrderGenerateJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
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.entity.EamMaintenanceStandard;
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import org.jeecg.modules.eam.entity.EamWeekMaintenanceOrderDetail;
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.IEamWeekMaintenanceOrderService;
import org.jeecg.modules.mdc.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 WeekMaintenanceOrderGenerateJob implements Job {
    @Autowired
    private IEamMaintenanceStandardService eamMaintenanceStandardService;
    @Autowired
    private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService;
    @Autowired
    private IEamWeekMaintenanceOrderService eamWeekMaintenanceOrderService;
    @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<QuartzJob> byJobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        /**
         * èŽ·å– é…ç½®äº† å‘¨ä¿æ ‡å‡†çš„ ä¿¡æ¯
         */
        List<EamMaintenanceStandard> standardList = eamMaintenanceStandardService.queryListByCategory(MaintenanceCategoryEnum.WEEK_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.compareTo(generateDate) != 0) {
                    //还未到生成日期,跳过执行
                    continue;
                }
                //获取保养项明细
                List<EamMaintenanceStandardDetail> standardDetailList = eamMaintenanceStandardDetailService.selectByStandardId(standard.getId());
                if(CollectionUtil.isEmpty(standardDetailList)) {
                    log.error("周保标准没有保养明细,请先配置保养明细, standard:{}", standard);
                    continue;
                }
                //开始生成
                EamWeekMaintenanceRequest request = new EamWeekMaintenanceRequest();
                request.setEquipmentId(standard.getEquipmentId());
                request.setStandardId(standard.getId());
                request.setMaintenanceDate(DateUtils.localDateToDate(generateDate));
                String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.WEEK_MAINTENANCE_CODE_RULE);
                request.setOrderNum(codeSeq);
                List<EamWeekMaintenanceOrderDetail> collect = standardDetailList.stream().map(EamWeekMaintenanceOrderDetail::new).collect(Collectors.toList());
                request.setTableDetailList(collect);
                eamWeekMaintenanceOrderService.addWeekMaintenance(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);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamMaintenanceStandardDetailService.java
@@ -3,6 +3,8 @@
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * @Description: ä¿å…»æ ‡å‡†æ˜Žç»†
 * @Author: jeecg-boot
@@ -10,5 +12,10 @@
 * @Version: V1.0
 */
public interface IEamMaintenanceStandardDetailService extends IService<EamMaintenanceStandardDetail> {
    /**
     * èŽ·å–æ ‡å‡†ä¸‹æ˜Žç»†é¡¹ä¿¡æ¯
     * @param standardId
     * @return
     */
    List<EamMaintenanceStandardDetail> selectByStandardId(String standardId);
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamMaintenanceStandardService.java
@@ -57,4 +57,11 @@
     * @return
     */
    List<EamMaintenanceStandard> queryListByKeywordAndCategory(String keyword, String equipmentId, Integer pageSize, String maintenanceCategory);
    /**
     * æŸ¥è¯¢ä¿å…»ç±»åž‹ä¸‹æ­£å¸¸çš„保养标准
     * @param maintenanceCategory ä¿å…»ç±»åž‹
     * @return
     */
    List<EamMaintenanceStandard> queryListByCategory(String maintenanceCategory);
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamWeekMaintenanceOrderService.java
@@ -7,6 +7,8 @@
import org.jeecg.modules.eam.request.EamWeekMaintenanceQuery;
import org.jeecg.modules.eam.request.EamWeekMaintenanceRequest;
import java.util.List;
/**
 * @Description: å‘¨ä¿å·¥å•
 * @Author: jeecg-boot
@@ -50,4 +52,11 @@
     * @return
     */
    boolean approval(EamWeekMaintenanceRequest request);
    /**
     * èŽ·å–ä»Šå¤©ä¹‹å‰æœªä¿å…»å®Œæˆçš„å·¥å•
     * @param expiredDate è¿‡æœŸæ—¥æœŸ
     * @return
     */
    List<EamWeekMaintenanceOrder> selectUnCompleteOrder(String expiredDate);
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardDetailServiceImpl.java
@@ -1,11 +1,17 @@
package org.jeecg.modules.eam.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import org.jeecg.modules.eam.mapper.EamMaintenanceStandardDetailMapper;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardDetailService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
/**
 * @Description: ä¿å…»æ ‡å‡†æ˜Žç»†
@@ -15,5 +21,14 @@
 */
@Service
public class EamMaintenanceStandardDetailServiceImpl extends ServiceImpl<EamMaintenanceStandardDetailMapper, EamMaintenanceStandardDetail> implements IEamMaintenanceStandardDetailService {
    @Resource
    private EamMaintenanceStandardDetailMapper emMaintenanceStandardDetailMapper;
    @Override
    public List<EamMaintenanceStandardDetail> selectByStandardId(String standardId) {
        LambdaQueryWrapper<EamMaintenanceStandardDetail> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EamMaintenanceStandardDetail::getStandardId, standardId);
        queryWrapper.orderByAsc(EamMaintenanceStandardDetail::getItemCode);
        return emMaintenanceStandardDetailMapper.selectList(queryWrapper);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java
@@ -28,6 +28,7 @@
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -283,4 +284,13 @@
        IPage<EamMaintenanceStandard> pageData = this.queryPageList(page, query);
        return pageData.getRecords();
    }
    @Override
    public List<EamMaintenanceStandard> queryListByCategory(String maintenanceCategory) {
        LambdaQueryWrapper<EamMaintenanceStandard> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EamMaintenanceStandard::getDelFlag, CommonConstant.DEL_FLAG_0);
        queryWrapper.eq(EamMaintenanceStandard::getMaintenanceCategory, maintenanceCategory);
        queryWrapper.eq(EamMaintenanceStandard::getStandardStatus, MaintenanceStandardStatusEnum.NORMAL.name());
        return eamMaintenanceStandardMapper.selectList(queryWrapper);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java
@@ -3,6 +3,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -461,6 +462,18 @@
        return true;
    }
    @Override
    public List<EamWeekMaintenanceOrder> selectUnCompleteOrder(String expiredDate) {
        LambdaQueryWrapper<EamWeekMaintenanceOrder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.lt(EamWeekMaintenanceOrder::getMaintenanceDate, expiredDate);
        List<String> unCompleteStatus = new ArrayList<>();
        unCompleteStatus.add(WeekMaintenanceStatusEnum.WAIT_MAINTENANCE.name());
        unCompleteStatus.add(WeekMaintenanceStatusEnum.UNDER_MAINTENANCE.name());
        queryWrapper.in(EamWeekMaintenanceOrder::getMaintenanceStatus, unCompleteStatus);
        queryWrapper.orderByAsc(EamWeekMaintenanceOrder::getMaintenanceDate);
        return eamWeekMaintenanceOrderMapper.selectList(queryWrapper);
    }
    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
        return todoUsers != null && todoUsers.contains(user.getUsername());
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/IFlowMyBusinessService.java
@@ -11,9 +11,16 @@
public interface IFlowMyBusinessService extends IService<FlowMyBusiness> {
    /**
     * æ ¹æ®æµç¨‹å®žä¾‹id èŽ·å– æˆ‘的待办
     * æ ¹æ®æµç¨‹å®žä¾‹id èŽ·å– æµç¨‹å®žä¾‹
     * @param instanceId æµç¨‹å®žä¾‹id
     * @return
     */
    FlowMyBusiness getFlowMyBusiness(String instanceId);
    /**
     * èŽ·å–æµç¨‹å®žä¾‹
     * @param dataId ä¸šåŠ¡Id
     * @return
     */
    FlowMyBusiness selectByDataId(String dataId);
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/impl/FlowMyBusinessServiceImpl.java
@@ -132,4 +132,11 @@
                new QueryWrapper<FlowMyBusiness>().eq("process_instance_id", instanceId));
        return businessList.isEmpty() ? null : businessList.get(0);
    }
    @Override
    public FlowMyBusiness selectByDataId(String dataId) {
        List<FlowMyBusiness> businessList = super.list(
                new QueryWrapper<FlowMyBusiness>().eq("data_id", dataId));
        return businessList.isEmpty() ? null : businessList.get(0);
    }
}
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/ThrowableUtil.java