Browse Source

工时修改

ouyj 3 months ago
parent
commit
544e29a5f9

+ 81 - 6
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtOrderHourServiceImpl.java

@@ -895,6 +895,7 @@ public class GxtOrderHourServiceImpl implements IGxtOrderHourService {
     /**
      * 计算维修工单的挂起时长,分为开工前和开工后两部分
      * 维修工单挂起对应的actionType是approved,恢复对应的是resume
+     * 自动挂起对应的actionType是auto_suspend,恢复对应的是auto_resume
      * 
      * @param orderId 工单ID
      * @param realStartTime 开工时间(开始打卡时间)
@@ -944,6 +945,7 @@ public class GxtOrderHourServiceImpl implements IGxtOrderHourService {
     /**
      * 计算维保工单的挂起时长,分为开工前和开工后两部分
      * 维保工单挂起对应的actionType是approved,恢复对应的是restart
+     * 自动挂起对应的actionType是auto_suspend,恢复对应的是auto_resume
      * 
      * @param orderId 工单ID
      * @param realStartTime 开工时间(开始打卡时间)
@@ -1011,12 +1013,6 @@ public class GxtOrderHourServiceImpl implements IGxtOrderHourService {
             }
         }
 
-        // 接单时长 = 接单时间 – 下发时间
-        if (order.getAcceptTime() != null && order.getAssignTime() != null) {
-            long diffMillis = order.getAcceptTime().getTime() - order.getAssignTime().getTime();
-            order.setAcceptHour(diffMillis / (1000.0 * 60 * 60));
-        }
-
         // 挂起时长 = 恢复时间 - 挂起时间
         long[] suspensionTimes = new long[3]; // 总挂起时长, 开工前挂起时长, 开工挂起后时长
         if (order.getOrderType() == 1) { // 维修工单
@@ -1030,6 +1026,17 @@ public class GxtOrderHourServiceImpl implements IGxtOrderHourService {
         order.setBeforeStartSuspendHour(suspensionTimes[1] / (1000.0 * 60 * 60));
         order.setAfterStartSuspendHour(suspensionTimes[2] / (1000.0 * 60 * 60));
 
+        // 接单时长 = 接单时间 – 下发时间 - 夜间工单的自动挂起时长
+        // 计算接单期间的自动挂起时长(夜间工单挂起)
+        long acceptSuspensionTime = 0;
+        if (order.getAcceptTime() != null && order.getAssignTime() != null) {
+            // 计算接单期间的自动挂起时长
+            acceptSuspensionTime = calculateOrderAcceptSuspensionTime(order.getId(), order.getAssignTime(), order.getAcceptTime(), order.getOrderType());
+            
+            long diffMillis = order.getAcceptTime().getTime() - order.getAssignTime().getTime();
+            order.setAcceptHour((diffMillis - acceptSuspensionTime) / (1000.0 * 60 * 60));
+        }
+
         // 准备时长 = 开始打卡时间 – 下发时间 - 开工前挂起时长
         if (order.getRealStartTime() != null && order.getAssignTime() != null) {
             long diffMillis = order.getRealStartTime().getTime() - order.getAssignTime().getTime() - suspensionTimes[1] ;
@@ -1125,6 +1132,74 @@ public class GxtOrderHourServiceImpl implements IGxtOrderHourService {
 
     }
     
+    /**
+     * 计算工单在指定时间段内的自动挂起时长
+     * 
+     * @param orderId 工单ID
+     * @param startTime 段开始时间
+     * @param endTime 段结束时间
+     * @param orderType 工单类型:1为维修工单,2为维保工单
+     * @return 自动挂起时长(毫秒)
+     */
+    private long calculateOrderAcceptSuspensionTime(Long orderId, Date startTime, Date endTime, int orderType) {
+        if (startTime == null || endTime == null || startTime.after(endTime)) {
+            return 0;
+        }
+        
+        long suspensionTime = 0;
+        Date suspendTime = null;
+        
+        if (orderType == 1) { // 维修工单
+            List<GxtRepairOrderFlow> repairFlows = gxtRepairOrderFlowMapper.selectGxtRepairOrderFlowListByOrderId(orderId);
+            
+            // 按时间顺序处理流转记录
+            repairFlows.sort((f1, f2) -> f1.getActionTime().compareTo(f2.getActionTime()));
+            
+            for (GxtRepairOrderFlow flow : repairFlows) {
+                if ("auto_suspend".equals(flow.getActionType())) {
+                    // 检查挂起时间是否在指定时间段内
+                    if (flow.getActionTime().after(startTime) && flow.getActionTime().before(endTime)) {
+                        suspendTime = flow.getActionTime();
+                    }
+                } else if ("auto_resume".equals(flow.getActionType()) && suspendTime != null) {
+                    // 检查恢复时间是否在指定时间段内
+                    if (flow.getActionTime().after(startTime) && flow.getActionTime().before(endTime)) {
+                        long duration = flow.getActionTime().getTime() - suspendTime.getTime();
+                        if (duration > 0) {
+                            suspensionTime += duration;
+                        }
+                    }
+                    suspendTime = null; // 重置挂起时间
+                }
+            }
+        } else if (orderType == 2) { // 维保工单
+            List<GxtWorkOrderFlow> workFlows = gxtWorkOrderFlowMapper.selectGxtWorkOrderFlowByOrderId(orderId);
+            
+            // 按时间顺序处理流转记录
+            workFlows.sort((f1, f2) -> f1.getActionTime().compareTo(f2.getActionTime()));
+            
+            for (GxtWorkOrderFlow flow : workFlows) {
+                if ("auto_suspend".equals(flow.getActionType())) {
+                    // 检查挂起时间是否在指定时间段内
+                    if (flow.getActionTime().after(startTime) && flow.getActionTime().before(endTime)) {
+                        suspendTime = flow.getActionTime();
+                    }
+                } else if ("auto_resume".equals(flow.getActionType()) && suspendTime != null) {
+                    // 检查恢复时间是否在指定时间段内
+                    if (flow.getActionTime().after(startTime) && flow.getActionTime().before(endTime)) {
+                        long duration = flow.getActionTime().getTime() - suspendTime.getTime();
+                        if (duration > 0) {
+                            suspensionTime += duration;
+                        }
+                    }
+                    suspendTime = null; // 重置挂起时间
+                }
+            }
+        }
+        
+        return suspensionTime;
+    }
+    
     /**
      * 计算工单的作业时长(用于统计和排名)
      * 作业时长 = 结束打卡时间 - 开始打卡时间 - 开工后挂起时长