xiangpei
2024-07-25 0117d58c2b8e6799faf919599d2ea079b3b52d75
工单定时任务处理超时
4个文件已修改
4个文件已添加
205 ■■■■■ 已修改文件
ycl-common/src/main/java/constant/PointConfigConstants.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/enumeration/OvertimeStatus.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointJobVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/WorkOrderTask.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/DateUtils.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/PointConfigConstants.java
New file
@@ -0,0 +1,33 @@
package constant;
/**
 * @author:xp
 * @date:2024/7/25 14:27
 */
public class PointConfigConstants {
    /**
     * 普通点位配置的key
     *
     */
    public final static String NORMAL = "normal.workorder.time";
    /**
     * 普通点位告警配置的key
     *
     */
    public final static String NORMAL_ALARM = "normal.wordkorder.alarm.time";
    /**
     * 重点点位配置的key
     *
     */
    public final static String IMPORTANT = "important.wordkorder.time";
    /**
     * 重点点位告警配置的key
     *
     */
    public final static String IMPORTANT_ALARM = "important.wordkorder.alarm.time";
}
ycl-common/src/main/java/enumeration/OvertimeStatus.java
New file
@@ -0,0 +1,25 @@
package enumeration;
import lombok.Getter;
/**
 * @author:xp
 * @date:2024/7/25 16:54
 */
@Getter
public enum OvertimeStatus {
    NOT(0, "未超时"),
    ALARM(1, "警告"),
    YES(2, "超时"),
    ;
    private final Integer value;
    private final String desc;
    OvertimeStatus(Integer value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java
@@ -70,7 +70,7 @@
    @TableField("processing_period")
    private Integer processingPeriod;
    @ApiModelProperty("是否超时,0没有 1超时")
    @ApiModelProperty("是否超时,0没有 1警告 2超时")
    @TableField("overtime")
    private Integer overtime;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointJobVO.java
New file
@@ -0,0 +1,40 @@
package com.ycl.platform.domain.vo;
import com.ycl.platform.base.AbsVo;
import com.ycl.platform.domain.entity.YwPoint;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.beans.BeanUtils;
import org.springframework.lang.NonNull;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * 定时任务处理工单时效
 *
 * @author xp
 * @since 2024-03-05
 */
@Data
public class YwPointJobVO {
    private Integer id;
    /** 点位名称 */
    private Date createTime;
    /** 点位标签 */
    private String [] pointTags;
    private String pointTagString;
    public static YwPointJobVO getVoByEntity(@NonNull YwPoint entity, YwPointJobVO vo) {
        if(vo == null) {
            vo = new YwPointJobVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -10,6 +10,7 @@
import java.util.List;
import com.ycl.platform.domain.vo.WorkOrderYwConditionRecordVO;
import com.ycl.platform.domain.vo.YwPointJobVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -26,4 +27,10 @@
    IPage<WorkOrderVO> distributePage(IPage page, @Param("query") DistributeWorkOrderQuery query);
    /**
     * 处理中的工单
     *
     * @return
     */
    List<YwPointJobVO> handlingWorkOrderList();
}
ycl-server/src/main/java/com/ycl/task/WorkOrderTask.java
New file
@@ -0,0 +1,77 @@
package com.ycl.task;
import com.ycl.platform.domain.entity.WorkOrder;
import com.ycl.platform.domain.vo.YwPointJobVO;
import com.ycl.platform.mapper.WorkOrderMapper;
import com.ycl.system.domain.SysConfig;
import com.ycl.system.mapper.SysConfigMapper;
import com.ycl.utils.DateUtils;
import constant.PointConfigConstants;
import enumeration.OvertimeStatus;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
/**
 * @author:xp
 * @date:2024/7/25 13:36
 */
@Slf4j
@RequiredArgsConstructor
@Component("workOrderTask")
public class WorkOrderTask {
    private final WorkOrderMapper workOrderMapper;
    private final SysConfigMapper configMapper;
    private final static String IMPORTANT = "important";
    private final static String NORMAL = "normal";
    /**
     * 处理工单有效时间,超时状态
     *
     */
    public void handleTime() {
        List<YwPointJobVO> handlingWorkOrderList = workOrderMapper.handlingWorkOrderList();
        SysConfig config = new SysConfig();
        config.setConfigKey(PointConfigConstants.IMPORTANT);
        Integer importantTime = Integer.valueOf(configMapper.selectConfig(config).getConfigValue());
        config.setConfigKey(PointConfigConstants.NORMAL);
        Integer normalTime = Integer.valueOf(configMapper.selectConfig(config).getConfigValue());
        config.setConfigKey(PointConfigConstants.NORMAL_ALARM);
        Integer normalAlarmTime = Integer.valueOf(configMapper.selectConfig(config).getConfigValue());
        config.setConfigKey(PointConfigConstants.IMPORTANT_ALARM);
        Integer importantAlarmTime = Integer.valueOf(configMapper.selectConfig(config).getConfigValue());
        Date now = new Date();
        handlingWorkOrderList.stream().forEach(workOrder -> {
            int diffHours = DateUtils.differentHoursByMillisecond(now, workOrder.getCreateTime());
            if (StringUtils.hasText(workOrder.getPointTagString()) && workOrder.getPointTagString().contains(IMPORTANT)) {
                this.handleOverTime(workOrder.getId(), diffHours, importantTime, importantAlarmTime);
            } else {
                this.handleOverTime(workOrder.getId(), diffHours, normalTime, normalAlarmTime);
            }
        });
        log.info("工单超时状态任务执行完成");
    }
    private void handleOverTime(Integer id, Integer diffHours, Integer time, Integer alarmTime) {
        if (diffHours <= time) {
            if (time - diffHours < alarmTime) {
                WorkOrder wo = new WorkOrder();
                wo.setId(id);
                wo.setOvertime(OvertimeStatus.ALARM.getValue());
                workOrderMapper.updateById(wo);
            }
        } else {
            WorkOrder wo = new WorkOrder();
            wo.setId(id);
            wo.setOvertime(OvertimeStatus.YES.getValue());
            workOrderMapper.updateById(wo);
        }
    }
}
ycl-server/src/main/java/com/ycl/utils/DateUtils.java
@@ -145,6 +145,14 @@
    }
    /**
     * 计算相差小时
     */
    public static int differentHoursByMillisecond(Date date1, Date date2)
    {
        return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600)));
    }
    /**
     * 计算时间差
     *
     * @param endDate 最后时间
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -62,4 +62,17 @@
        ORDER BY wo.create_time DESC
    </select>
    <select id="handlingWorkOrderList" resultType="com.ycl.platform.domain.vo.YwPointJobVO">
        SELECT
             wo.id,
             wod.create_time,
             yp.point_tag
        FROM
             t_work_order wo
                INNER JOIN t_yw_point yp ON yp.id = wo.point_id AND yp.deleted = 0
                INNER JOIN t_work_order_distribute_record wod ON wod.work_order_id = wo.id
        WHERE
             wo.status = 'DISTRIBUTED' AND wo.deleted = 0
    </select>
</mapper>