feat(ops): 手动派单遵循执行人忙碌状态,忙碌时入队等待
ManualOrderActionFacade.dispatch: - 新增 strategy.isAssigneeIdle() 判断,空闲→DISPATCHED,忙碌→QUEUED - 不再无条件直接派发 OrderBusinessStrategy: - 新增 isAssigneeIdle() 默认方法,默认返回 true CleanOrderBusinessStrategy: - isAssigneeIdle 通过 BadgeDeviceStatusService.isBusy() 判断设备忙碌 SecurityOrderBusinessStrategy: - isAssigneeIdle 通过 UserDispatchStatusService.isIdle() 判断人员忙碌 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,10 +68,14 @@ public class ManualOrderActionFacade {
|
||||
OrderBusinessStrategy strategy = resolveStrategy(cmd.getBusinessType());
|
||||
strategy.validateDispatch(cmd, order);
|
||||
|
||||
// 3. 状态变更
|
||||
// 3. 判断执行人是否空闲,决定目标状态
|
||||
boolean idle = strategy.isAssigneeIdle(cmd, order);
|
||||
WorkOrderStatusEnum targetStatus = idle ? WorkOrderStatusEnum.DISPATCHED : WorkOrderStatusEnum.QUEUED;
|
||||
|
||||
// 4. 状态变更
|
||||
OrderTransitionRequest request = OrderTransitionRequest.builder()
|
||||
.orderId(cmd.getOrderId())
|
||||
.targetStatus(WorkOrderStatusEnum.DISPATCHED)
|
||||
.targetStatus(targetStatus)
|
||||
.assigneeId(cmd.getAssigneeId())
|
||||
.assigneeName(cmd.getAssigneeName())
|
||||
.assigneePhone(cmd.getAssigneePhone())
|
||||
@@ -85,18 +89,19 @@ public class ManualOrderActionFacade {
|
||||
throw new IllegalStateException("手动派单失败: " + result.getMessage());
|
||||
}
|
||||
|
||||
// 4. 更新主表执行人(只更新 assignee 字段,避免覆盖状态机已写入的 status)
|
||||
// 5. 更新主表执行人(只更新 assignee 字段,避免覆盖状态机已写入的 status)
|
||||
OpsOrderDO assigneeUpdate = new OpsOrderDO();
|
||||
assigneeUpdate.setId(cmd.getOrderId());
|
||||
assigneeUpdate.setAssigneeId(cmd.getAssigneeId());
|
||||
assigneeUpdate.setAssigneeName(cmd.getAssigneeName());
|
||||
opsOrderMapper.updateById(assigneeUpdate);
|
||||
|
||||
// 5. 条线后置
|
||||
// 6. 条线后置
|
||||
// 注:业务日志由生命周期事件 → 条线 EventListener 统一记录,此处不重复写
|
||||
strategy.afterDispatch(cmd, order);
|
||||
|
||||
log.info("[ManualOrderActionFacade] 手动派单完成: orderId={}, assigneeId={}", cmd.getOrderId(), cmd.getAssigneeId());
|
||||
log.info("[ManualOrderActionFacade] 手动派单完成: orderId={}, assigneeId={}, targetStatus={}",
|
||||
cmd.getOrderId(), cmd.getAssigneeId(), targetStatus);
|
||||
}
|
||||
|
||||
// ==================== 手动升级优先级 ====================
|
||||
|
||||
@@ -20,6 +20,20 @@ public interface OrderBusinessStrategy {
|
||||
*/
|
||||
boolean supports(String businessType);
|
||||
|
||||
// ==================== 派单决策 ====================
|
||||
|
||||
/**
|
||||
* 判断执行人是否空闲,决定手动派单的目标状态。
|
||||
* <p>
|
||||
* 空闲返回 true → DISPATCHED(直接派发);
|
||||
* 忙碌返回 false → QUEUED(入队等待)。
|
||||
* <p>
|
||||
* 默认返回 true(直接派发),条线按需覆写。
|
||||
*/
|
||||
default boolean isAssigneeIdle(DispatchOrderCommand cmd, OpsOrderDO order) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// ==================== 前置校验 ====================
|
||||
|
||||
default void validateDispatch(DispatchOrderCommand cmd, OpsOrderDO order) {}
|
||||
|
||||
Reference in New Issue
Block a user