diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/DispatchEngineServiceAdapter.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/DispatchEngineServiceAdapter.java index 16ee5e3..a6433ec 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/DispatchEngineServiceAdapter.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/DispatchEngineServiceAdapter.java @@ -125,7 +125,7 @@ public class DispatchEngineServiceAdapter implements DispatchEngineService { .queueId(queueId) .operatorType(OperatorTypeEnum.ADMIN) .operatorId(assigneeId) - .reason("管理员手动派单") + .reason("手动派单") .build() ); diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusEventListener.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusEventListener.java index 99ad67f..3592acc 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusEventListener.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusEventListener.java @@ -1,6 +1,8 @@ package com.viewsh.module.ops.service.dispatch; import com.viewsh.module.ops.core.event.OrderStateChangedEvent; +import com.viewsh.module.ops.dal.dataobject.workorder.OpsOrderDO; +import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper; import com.viewsh.module.ops.enums.WorkOrderStatusEnum; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -28,6 +30,9 @@ public class UserDispatchStatusEventListener { @Resource private UserDispatchStatusService userDispatchStatusService; + @Resource + private OpsOrderMapper opsOrderMapper; + /** * 监听工单状态变更,同步更新人员调度状态 */ @@ -39,6 +44,13 @@ public class UserDispatchStatusEventListener { } Long assigneeId = event.getPayloadLong("assigneeId"); + // payload 中没有 assigneeId 时,从工单主表兜底(forceComplete 等场景) + if (assigneeId == null) { + OpsOrderDO order = opsOrderMapper.selectById(event.getOrderId()); + if (order != null) { + assigneeId = order.getAssigneeId(); + } + } if (assigneeId == null) { return; } @@ -56,12 +68,27 @@ public class UserDispatchStatusEventListener { case QUEUED -> userDispatchStatusService.onOrderQueued(assigneeId, orderId, orderType); case CONFIRMED, ARRIVED -> userDispatchStatusService.onOrderStatusAdvanced( assigneeId, orderId, newStatus.getStatus()); - case COMPLETED, CANCELLED -> userDispatchStatusService.onOrderFinished(assigneeId, orderId); + case COMPLETED, CANCELLED -> handleFinished(assigneeId, orderId, oldStatus); case PAUSED -> userDispatchStatusService.onOrderPaused(assigneeId, orderId); default -> log.debug("人员调度状态无需处理: orderId={}, status={}", orderId, newStatus); } } + /** + * 处理 COMPLETED/CANCELLED 状态: + * 如果是从 QUEUED 直接到终态(forceComplete / admin cancel), + * 需要额外减 waitingTaskCount,因为跳过了 DISPATCHED 阶段。 + */ + private void handleFinished(Long assigneeId, Long orderId, WorkOrderStatusEnum oldStatus) { + userDispatchStatusService.onOrderFinished(assigneeId, orderId); + + // QUEUED→COMPLETED/CANCELLED 跳过了 DISPATCHED,waitingTaskCount 没有被减 + if (oldStatus == WorkOrderStatusEnum.QUEUED) { + userDispatchStatusService.decrementWaitingTaskCount(assigneeId); + log.info("QUEUED 直接完成/取消,补偿减少 waitingTaskCount: assigneeId={}, orderId={}", assigneeId, orderId); + } + } + /** * 处理 DISPATCHED 状态:区分直接派发 vs 从排队派发 */ diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusService.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusService.java index f5e0ab9..bd3059f 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusService.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusService.java @@ -101,6 +101,17 @@ public interface UserDispatchStatusService { */ void onOrderResumed(Long userId, Long orderId); + /** + * 补偿减少 waitingTaskCount + *
+ * 当工单从 QUEUED 直接到 COMPLETED/CANCELLED(跳过 DISPATCHED)时,
+ * waitingTaskCount 在入队时+1 但没有经过 onQueuedOrderDispatched 减回,
+ * 需要通过此方法补偿。
+ *
+ * @param userId 执行人ID
+ */
+ void decrementWaitingTaskCount(Long userId);
+
// ==================== 读操作(调度时使用)====================
/**
diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusServiceImpl.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusServiceImpl.java
index 6803a09..4529cfb 100644
--- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusServiceImpl.java
+++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/dispatch/UserDispatchStatusServiceImpl.java
@@ -39,6 +39,7 @@ public class UserDispatchStatusServiceImpl implements UserDispatchStatusService
private DefaultRedisScript