|
|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 计算工单的作业时长(用于统计和排名)
|
|
|
* 作业时长 = 结束打卡时间 - 开始打卡时间 - 开工后挂起时长
|