From 23302186a81c1b6f3e5f398f21b057350bfd34e8 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期四, 16 一月 2025 12:18:08 +0800
Subject: [PATCH] 工单扣分处理时间调整逻辑

---
 ycl-server/src/main/java/com/ycl/task/ContractTask.java                |   69 +++++++++++++++++++++++++++++++---
 ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml          |   24 ++++++++++-
 ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml |    6 ++
 ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java     |    7 +++
 ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java  |    6 ++
 5 files changed, 100 insertions(+), 12 deletions(-)

diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
index e85eded..597277b 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
@@ -119,7 +119,6 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date distributeTime;
 
-    private Date auditTime;
     /** 涓嬪彂浜� */
     private String realName;
 
@@ -127,6 +126,12 @@
      * 鏄惁鎵h繃绉垎
      */
     private Boolean deduct;
+    //澶勭悊鏃堕棿鐐归泦鍚�
+    private List<Date> handleTimeList;
+    private Date handleTime;
+    //瀹℃牳鏃堕棿鐐归泦鍚�
+    private List<Date> auditTimeList;
+    private Date auditTime;
 
 
     public static WorkOrderVO getVoByEntity(@NonNull WorkOrder entity, WorkOrderVO 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 c5c646f..3c1d2c4 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
@@ -77,7 +77,7 @@
      */
     List<DeviceInfoVO> hasErrorWorkOrderList(@Param("start") Date start, @Param("end") Date end);
 
-    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("auditStatus") String auditStatus);
+    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("errorList") List<String> errorList);
 
     int addMany(@Param("workOrderList") List<WorkOrder> workOrderList);
 
@@ -117,4 +117,8 @@
 
     List<String> getOfflineWorkOrder();
 
+    List<WorkOrderVO> getAuditTimeList(@Param("workOrderNos")List<String> workOrderNos);
+
+    List<WorkOrderVO> getHandleTimeList(@Param("workOrderNos")List<String> workOrderNos);
+
 }
diff --git a/ycl-server/src/main/java/com/ycl/task/ContractTask.java b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
index d3a5c7c..b54211c 100644
--- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -194,7 +194,32 @@
         LocalDateTime endTime = LocalDateTime.now();
         // 璁$畻30澶╁墠鐨勬棩鏈�
         LocalDateTime startTime = endTime.minusDays(30);
-        List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "瀹℃牳閫氳繃");
+        //鑷姩鎵e垎鐨勫伐鍗曟晠闅滅被鍨�
+        List<String> deductErrorType = new ArrayList<>();
+        deductErrorType.add(ErrorType.OSD_ERROR.getValue());
+        deductErrorType.add(ErrorType.ABNORMAL_PIC.getValue());
+        deductErrorType.add(ErrorType.POINT_INFO_ERROR.getValue());
+        deductErrorType.add(ErrorType.CLOCK_SKEW.getValue());
+        List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(),deductErrorType);
+        //瀛樺湪鏈変袱绉嶆墸鍒嗙殑鏁呴殰 鍙墸鍑忕涓�涓晠闅�
+        Map<String, WorkOrderVO> map = workOrders.stream()
+                .collect(Collectors.toMap(
+                        WorkOrderVO::getWorkOrderNo,
+                        Function.identity(),
+                        (older, newer) -> older.getDistributeTime().compareTo(newer.getDistributeTime()) <= 0 ? older : newer
+                ));
+        workOrders = new ArrayList<>(map.values());
+        List<String> workOrderNos = workOrders.stream().map(WorkOrderVO::getWorkOrderNo).collect(Collectors.toList());
+        List<WorkOrderVO> auditTimeList = workOrderMapper.getAuditTimeList(workOrderNos);
+        Map<String, List<Date>> auditTimeMap = auditTimeList.stream()
+                .collect(Collectors.groupingBy(
+                        WorkOrderVO::getWorkOrderNo, // 鍒嗙粍鐨勯敭
+                        Collectors.mapping(WorkOrderVO::getAuditTime, Collectors.toList())));
+        List<WorkOrderVO> handleTimeList = workOrderMapper.getHandleTimeList(workOrderNos);
+        Map<String, List<Date>> handleTimeMap = handleTimeList.stream()
+                .collect(Collectors.groupingBy(
+                        WorkOrderVO::getWorkOrderNo, // 鍒嗙粍鐨勯敭
+                        Collectors.mapping(WorkOrderVO::getHandleTime, Collectors.toList())));
         for (WorkOrderVO workOrder : workOrders) {
             //妫�娴嬫槸鍚︽姤澶囪繃
             if (!CollectionUtils.isEmpty(reportNumbers)) {
@@ -227,7 +252,7 @@
 //                }
 //            }
             //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級
-            if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.CLOCK_RIGHT.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) {
+            if (ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType) || ErrorType.POINT_INFO_ERROR.getValue().equals(errorType)) {
                 if (!CollectionUtils.isEmpty(monitorRuleMap)) {
                     monitorRuleMap.forEach((contractId, rules) -> {
                         Integer unitId = rules.get(0).getUnitId();
@@ -235,8 +260,14 @@
                         if (workOrder.getUnitId().equals(unitId)) {
                             //宸ュ崟涓嬪彂鏃堕棿
                             Date createTime = workOrder.getDistributeTime();
-                            Date auditTime = workOrder.getAuditTime();
-                            double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
+                            List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo());
+                            List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo());
+                            //鎷垮埌瀹℃牳鏃堕棿
+                            long auditDuration = getAuditDuration(auditTimes, handleTimes);
+                            //瀹℃牳閫氳繃鏃堕棿
+                            Date passTime = Collections.max(auditTimes);
+                            //澶勭悊鑺辫垂鎬绘椂闀�
+                            double diffTime = (double) (passTime.getTime() - createTime.getTime() - auditDuration) / (1000 * 60 * 60);
                             //鎵惧埌瀵瑰簲瑙勫垯銆侀�夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯
                             for (CalculateRuleVO rule : rules) {
                                 if(ErrorType.OSD_ERROR.getValue().equals(errorType)){
@@ -267,8 +298,13 @@
                         if (workOrder.getUnitId().equals(unitId)) {
                             //宸ュ崟涓嬪彂鏃堕棿
                             Date createTime = workOrder.getDistributeTime();
-                            Date auditTime = workOrder.getAuditTime();
-                            double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60);
+                            List<Date> auditTimes = auditTimeMap.get(workOrder.getWorkOrderNo());
+                            List<Date> handleTimes = handleTimeMap.get(workOrder.getWorkOrderNo());
+                            //鎷垮埌瀹℃牳鏃堕棿
+                            long auditDuration = getAuditDuration(auditTimes, handleTimes);
+                            //瀹℃牳閫氳繃鏃堕棿
+                            Date passTime = Collections.max(auditTimes);
+                            double diffTime = (double) (passTime.getTime() - createTime.getTime() -auditDuration) / (1000 * 60 * 60);
                             //閫夋嫨鏃堕棿鑼冨洿鍐呯殑瑙勫垯
                             for (CalculateRuleVO rule : rules) {
                                 if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) {
@@ -302,6 +338,27 @@
         log.info("缁撴潫鎵ц宸ュ崟鎵e垎");
     }
 
+    private long getAuditDuration(List<Date> auditTimes, List<Date> handleTimes) {
+        //璁$畻鍑哄鏍哥殑鎬绘椂闂�(鐢变簬鏁呴殰绫诲瀷浼氭洿鏂板鑷村彲鑳芥彁浜ょ殑鏃堕棿鐐规暟閲忓拰瀹℃牳鐨勬椂闂寸偣鏁伴噺涓嶄竴鑷�)
+        long auditDuration = 0;
+        for (Date auditTime : auditTimes) {
+            //绂昏繖娆″鏍告渶杩戠殑涓�娆℃彁浜ゅ鐞嗘椂闂寸偣
+            Date nearestHandleTime = null;
+            long minDifference = Long.MAX_VALUE;
+            for (Date handleTime : handleTimes) {
+                if(handleTime.before(auditTime)) {
+                    long difference = Math.abs(auditTime.getTime() - handleTime.getTime());
+                    if (difference < minDifference) {
+                        minDifference = difference;
+                        nearestHandleTime = handleTime;
+                    }
+                }
+            }
+            auditDuration += auditTime.getTime()-nearestHandleTime.getTime();
+        }
+        return auditDuration;
+    }
+
 
     /**
      * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎
diff --git a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml
index ee9d42b..d2bf388 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml
@@ -98,7 +98,11 @@
     </insert>
 
     <select id="getErrorList" resultType="com.ycl.system.entity.SysDictData">
-        SELECT da.dict_value, da.dict_label FROM t_work_order_error_type oer INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value WHERE oer.work_order_no = #{workOrderNo}
+        SELECT da.dict_value, da.dict_label
+        FROM t_work_order_error_type oer
+            INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value
+        WHERE oer.work_order_no = #{workOrderNo}
+        ORDER BY oer.create_time
     </select>
 
 </mapper>
diff --git a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
index d0ecfcf..b10788e 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -359,12 +359,16 @@
     </insert>
 
     <select id="selectPassOrder" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
-        SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime,woar.create_time as auditTime
+        SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime
         FROM t_work_order wo
         LEFT JOIN t_work_order_error_type woet ON woet.work_order_no = wo.work_order_no
         LEFT JOIN t_work_order_auditing_record woar ON woar.work_order_no = wo.work_order_no
-        WHERE wo.deleted = 0 AND wo.status = #{status}  AND woar.result = #{auditStatus}
-        AND wo.deduct = 0 AND woar.create_time between #{startTime} and #{endTime}
+        WHERE wo.deleted = 0 AND wo.deduct = 0 AND wo.status = #{status}
+        AND woet.error_name in
+        <foreach collection="errorList" item="error" separator="," open="(" close=")">
+            #{error}
+        </foreach>
+        AND woar.create_time between #{startTime} and #{endTime} and woar.result = #{auditStatus}
     </select>
 
     <update id="updateMany">
@@ -467,4 +471,18 @@
             </foreach>
         </where>
     </select>
+
+    <select id="getAuditTimeList" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
+        select work_order_no ,create_time as auditTime from t_work_order_auditing_record where work_order_no in
+        <foreach collection="workOrderNos" item="no" open="(" close=")" separator=",">
+            #{no}
+        </foreach>
+    </select>
+    <select id="getHandleTimeList" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
+        select work_order_no ,create_time as handleTime from t_work_order_yw_condition_record
+        where sys_msg = 0 and  work_order_no in
+        <foreach collection="workOrderNos" item="no" open="(" close=")" separator=",">
+            #{no}
+        </foreach>
+    </select>
 </mapper>

--
Gitblit v1.8.0