feat(ops): 工单引擎增加 assigneeName 冗余字段
在工单核心引擎各层级增加 assigneeName 冗余字段,存储执行人的可读名称(优先使用 nickname,降级为 deviceCode), 避免查询时关联 IoT 设备表,提升查询性能。 变更范围: - OpsOrderDO: 新增 assigneeName 字段 - OrderTransitionRequest: 新增 assigneeName 参数 - OrderDispatchContext: 新增 recommendedAssigneeName 字段 - DispatchEngineImpl: 派单/入队/打断时透传 assigneeName - OrderLifecycleManagerImpl: 分配/派发/入队时写入 assigneeName - OpsOrderAssignReqDTO: 新增 assigneeName 参数 - OrderSummaryVO: 新增 sourceType、assigneeName 字段 - BadgeDeviceStatusDTO: 新增 nickname 字段 影响模块:Ops Biz、Ops API Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,11 @@ public class BadgeDeviceStatusDTO {
|
||||
*/
|
||||
private String deviceCode;
|
||||
|
||||
/**
|
||||
* 设备昵称(用户可读的显示名称,如"张三的工牌")
|
||||
*/
|
||||
private String nickname;
|
||||
|
||||
/**
|
||||
* 设备状态
|
||||
*/
|
||||
|
||||
@@ -107,6 +107,7 @@ public class DispatchEngineImpl implements DispatchEngine {
|
||||
|
||||
Long assigneeId = recommendation.getAssigneeId();
|
||||
context.setRecommendedAssigneeId(assigneeId);
|
||||
context.setRecommendedAssigneeName(recommendation.getAssigneeName());
|
||||
|
||||
log.info("分配决策完成: orderId={}, assigneeId={}, assigneeName={}, reason={}",
|
||||
context.getOrderId(), assigneeId, recommendation.getAssigneeName(), recommendation.getReason());
|
||||
@@ -399,6 +400,7 @@ public class DispatchEngineImpl implements DispatchEngine {
|
||||
.orderId(context.getOrderId())
|
||||
.targetStatus(WorkOrderStatusEnum.DISPATCHED)
|
||||
.assigneeId(assigneeId)
|
||||
.assigneeName(context.getRecommendedAssigneeName())
|
||||
.queueId(queueDTO != null ? queueDTO.getId() : null)
|
||||
.operatorType(OperatorTypeEnum.SYSTEM)
|
||||
.operatorId(assigneeId)
|
||||
@@ -448,6 +450,7 @@ public class DispatchEngineImpl implements DispatchEngine {
|
||||
OrderTransitionRequest enqueueRequest = OrderTransitionRequest.builder()
|
||||
.orderId(context.getOrderId())
|
||||
.assigneeId(assigneeId)
|
||||
.assigneeName(context.getRecommendedAssigneeName())
|
||||
.operatorType(OperatorTypeEnum.SYSTEM)
|
||||
.operatorId(assigneeId)
|
||||
.reason("执行人忙碌,任务入队")
|
||||
@@ -477,6 +480,7 @@ public class DispatchEngineImpl implements DispatchEngine {
|
||||
OrderTransitionRequest request = OrderTransitionRequest.builder()
|
||||
.orderId(context.getOrderId())
|
||||
.assigneeId(assigneeId)
|
||||
.assigneeName(context.getRecommendedAssigneeName())
|
||||
.operatorType(OperatorTypeEnum.SYSTEM)
|
||||
.operatorId(assigneeId)
|
||||
.reason("执行人忙碌,任务入队")
|
||||
@@ -515,6 +519,7 @@ public class DispatchEngineImpl implements DispatchEngine {
|
||||
.orderId(context.getOrderId())
|
||||
.targetStatus(WorkOrderStatusEnum.DISPATCHED)
|
||||
.assigneeId(assigneeId)
|
||||
.assigneeName(context.getRecommendedAssigneeName())
|
||||
.operatorType(OperatorTypeEnum.SYSTEM)
|
||||
.operatorId(assigneeId)
|
||||
.reason("P0紧急任务派单")
|
||||
|
||||
@@ -62,6 +62,11 @@ public class OrderDispatchContext {
|
||||
*/
|
||||
private Long recommendedAssigneeId;
|
||||
|
||||
/**
|
||||
* 推荐的执行人姓名(冗余写入工单表)
|
||||
*/
|
||||
private String recommendedAssigneeName;
|
||||
|
||||
/**
|
||||
* 分配的设备ID(冗余字段)
|
||||
* <p>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
package com.viewsh.module.ops.core.lifecycle;
|
||||
|
||||
import com.viewsh.module.ops.api.queue.OrderQueueDTO;
|
||||
import com.viewsh.module.ops.api.queue.OrderQueueService;
|
||||
import com.viewsh.module.ops.core.event.OrderEventPublisher;
|
||||
import com.viewsh.module.ops.core.event.OrderStateChangedEvent;
|
||||
import com.viewsh.module.ops.core.lifecycle.handler.EventPublishHandler;
|
||||
import com.viewsh.module.ops.core.lifecycle.handler.QueueSyncHandler;
|
||||
import com.viewsh.module.ops.core.lifecycle.handler.StateTransitionHandler;
|
||||
@@ -19,7 +15,6 @@ import com.viewsh.module.ops.enums.WorkOrderStatusEnum;
|
||||
import com.viewsh.module.ops.infrastructure.log.enumeration.EventDomain;
|
||||
import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecord;
|
||||
import com.viewsh.module.ops.infrastructure.log.recorder.EventLogRecorder;
|
||||
import com.viewsh.module.ops.service.fsm.OrderStateMachine;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -28,7 +23,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 工单生命周期管理器实现
|
||||
@@ -50,17 +44,9 @@ import java.util.Objects;
|
||||
@Service
|
||||
public class OrderLifecycleManagerImpl implements OrderLifecycleManager {
|
||||
|
||||
@Resource
|
||||
private OrderStateMachine orderStateMachine;
|
||||
|
||||
@Resource
|
||||
private OrderQueueService orderQueueService;
|
||||
|
||||
@Resource
|
||||
private OpsOrderMapper opsOrderMapper;
|
||||
|
||||
@Resource
|
||||
private OrderEventPublisher eventPublisher;
|
||||
|
||||
@Resource
|
||||
private StateTransitionHandler stateTransitionHandler;
|
||||
@@ -137,6 +123,7 @@ public class OrderLifecycleManagerImpl implements OrderLifecycleManager {
|
||||
// 先更新工单的执行人
|
||||
OpsOrderDO order = getOrderByOrderId(request.getOrderId());
|
||||
order.setAssigneeId(request.getAssigneeId());
|
||||
order.setAssigneeName(request.getAssigneeName());
|
||||
order.setAssigneeDeviceId(request.getAssigneeId()); // 同时设置设备ID,用于查询工单
|
||||
opsOrderMapper.updateById(order);
|
||||
|
||||
@@ -158,6 +145,7 @@ public class OrderLifecycleManagerImpl implements OrderLifecycleManager {
|
||||
OpsOrderDO order = opsOrderMapper.selectById(request.getOrderId());
|
||||
if (order != null && order.getAssigneeId() == null) {
|
||||
order.setAssigneeId(request.getAssigneeId());
|
||||
order.setAssigneeName(request.getAssigneeName());
|
||||
order.setAssigneeDeviceId(request.getAssigneeId()); // 同时设置设备ID,用于查询工单
|
||||
opsOrderMapper.updateById(order);
|
||||
log.debug("派发时更新工单执行人: orderId={}, assigneeId={}", request.getOrderId(), request.getAssigneeId());
|
||||
|
||||
@@ -40,6 +40,11 @@ public class OrderTransitionRequest {
|
||||
*/
|
||||
private Long assigneeId;
|
||||
|
||||
/**
|
||||
* 执行人姓名(可选,冗余写入工单表)
|
||||
*/
|
||||
private String assigneeName;
|
||||
|
||||
/**
|
||||
* 操作人类型(可选)
|
||||
*/
|
||||
|
||||
@@ -22,6 +22,9 @@ public class OpsOrderAssignReqDTO {
|
||||
@NotNull(message = "执行人ID不能为空")
|
||||
private Long assigneeId;
|
||||
|
||||
@Schema(description = "执行人姓名", example = "张师傅")
|
||||
private String assigneeName;
|
||||
|
||||
@Schema(description = "分配备注", example = "张师傅负责该区域")
|
||||
private String remark;
|
||||
|
||||
|
||||
@@ -82,6 +82,10 @@ public class OpsOrderDO extends BaseDO {
|
||||
* 当前执行人ID
|
||||
*/
|
||||
private Long assigneeId;
|
||||
/**
|
||||
* 当前执行人姓名(冗余,便于查询)
|
||||
*/
|
||||
private String assigneeName;
|
||||
/**
|
||||
* 巡检员ID(发起人)
|
||||
*/
|
||||
|
||||
@@ -66,6 +66,11 @@ public class OrderSummaryVO {
|
||||
*/
|
||||
private String location;
|
||||
|
||||
/**
|
||||
* 触发来源(TRAFFIC/INSPECTION/MANUAL/SCHEDULE)
|
||||
*/
|
||||
private String sourceType;
|
||||
|
||||
/**
|
||||
* 当前执行人ID
|
||||
*/
|
||||
|
||||
@@ -161,6 +161,7 @@ public class OpsOrderServiceImpl implements OpsOrderService {
|
||||
|
||||
// 2. 设置执行人
|
||||
order.setAssigneeId(assignReq.getAssigneeId());
|
||||
order.setAssigneeName(assignReq.getAssigneeName());
|
||||
|
||||
// 3. 通过状态机执行状态转换
|
||||
orderStateMachine.transition(
|
||||
|
||||
Reference in New Issue
Block a user