From 0117d58c2b8e6799faf919599d2ea079b3b52d75 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 25 七月 2024 18:28:40 +0800
Subject: [PATCH] 工单定时任务处理超时

---
 ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java  |    2 
 ycl-server/src/main/java/com/ycl/utils/DateUtils.java                 |    8 ++
 ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml         |   13 +++
 ycl-common/src/main/java/constant/PointConfigConstants.java           |   33 ++++++++
 ycl-common/src/main/java/enumeration/OvertimeStatus.java              |   25 ++++++
 ycl-server/src/main/java/com/ycl/task/WorkOrderTask.java              |   77 +++++++++++++++++++
 ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointJobVO.java   |   40 ++++++++++
 ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java |    7 +
 8 files changed, 204 insertions(+), 1 deletions(-)

diff --git a/ycl-common/src/main/java/constant/PointConfigConstants.java b/ycl-common/src/main/java/constant/PointConfigConstants.java
new file mode 100644
index 0000000..2c3d102
--- /dev/null
+++ b/ycl-common/src/main/java/constant/PointConfigConstants.java
@@ -0,0 +1,33 @@
+package constant;
+
+/**
+ * @author锛歺p
+ * @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";
+
+    /**
+     * 閲嶇偣鐐逛綅閰嶇疆鐨刱ey
+     *
+     */
+    public final static String IMPORTANT = "important.wordkorder.time";
+
+    /**
+     * 閲嶇偣鐐逛綅鍛婅閰嶇疆鐨刱ey
+     *
+     */
+    public final static String IMPORTANT_ALARM = "important.wordkorder.alarm.time";
+
+}
diff --git a/ycl-common/src/main/java/enumeration/OvertimeStatus.java b/ycl-common/src/main/java/enumeration/OvertimeStatus.java
new file mode 100644
index 0000000..cf674de
--- /dev/null
+++ b/ycl-common/src/main/java/enumeration/OvertimeStatus.java
@@ -0,0 +1,25 @@
+package enumeration;
+
+import lombok.Getter;
+
+/**
+ * @author锛歺p
+ * @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;
+    }
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java
index 0bd7f2a..b286248 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java
+++ b/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;
 }
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointJobVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointJobVO.java
new file mode 100644
index 0000000..ef883c9
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointJobVO.java
@@ -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;
+    }
+
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
index f42af24..6f29f18 100644
--- a/ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
+++ b/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();
 }
diff --git a/ycl-server/src/main/java/com/ycl/task/WorkOrderTask.java b/ycl-server/src/main/java/com/ycl/task/WorkOrderTask.java
new file mode 100644
index 0000000..e40a3a3
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/task/WorkOrderTask.java
@@ -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锛歺p
+ * @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);
+        }
+    }
+}
diff --git a/ycl-server/src/main/java/com/ycl/utils/DateUtils.java b/ycl-server/src/main/java/com/ycl/utils/DateUtils.java
index 4ab7585..0be7f5f 100644
--- a/ycl-server/src/main/java/com/ycl/utils/DateUtils.java
+++ b/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 鏈�鍚庢椂闂�
diff --git a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
index a9387f9..1b76a6b 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
+++ b/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>

--
Gitblit v1.8.0