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:
lzh
2026-02-02 22:34:00 +08:00
parent bccf992848
commit e95080dc8a
9 changed files with 35 additions and 14 deletions

View File

@@ -31,6 +31,11 @@ public class BadgeDeviceStatusDTO {
*/
private String deviceCode;
/**
* 设备昵称(用户可读的显示名称,如"张三的工牌"
*/
private String nickname;
/**
* 设备状态
*/

View File

@@ -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紧急任务派单")

View File

@@ -62,6 +62,11 @@ public class OrderDispatchContext {
*/
private Long recommendedAssigneeId;
/**
* 推荐的执行人姓名(冗余写入工单表)
*/
private String recommendedAssigneeName;
/**
* 分配的设备ID冗余字段
* <p>

View File

@@ -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());

View File

@@ -40,6 +40,11 @@ public class OrderTransitionRequest {
*/
private Long assigneeId;
/**
* 执行人姓名(可选,冗余写入工单表)
*/
private String assigneeName;
/**
* 操作人类型(可选)
*/

View File

@@ -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;

View File

@@ -82,6 +82,10 @@ public class OpsOrderDO extends BaseDO {
* 当前执行人ID
*/
private Long assigneeId;
/**
* 当前执行人姓名(冗余,便于查询)
*/
private String assigneeName;
/**
* 巡检员ID发起人
*/

View File

@@ -66,6 +66,11 @@ public class OrderSummaryVO {
*/
private String location;
/**
* 触发来源TRAFFIC/INSPECTION/MANUAL/SCHEDULE
*/
private String sourceType;
/**
* 当前执行人ID
*/

View File

@@ -161,6 +161,7 @@ public class OpsOrderServiceImpl implements OpsOrderService {
// 2. 设置执行人
order.setAssigneeId(assignReq.getAssigneeId());
order.setAssigneeName(assignReq.getAssigneeName());
// 3. 通过状态机执行状态转换
orderStateMachine.transition(