2 Commits

Author SHA1 Message Date
lzh
d97125fdf6 feat(ops): 优化工单播报语音内容,自动生成区域完整路径
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. 语音播报模板改为"工单来啦,请前往XXX进行清洁"
2. 工单创建时自动根据areaId从ops_bus_area构建完整路径
3. 使用parentPath批量查询上级区域,避免N+1问题

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
2026-01-29 23:13:50 +08:00
lzh
3ec7590e12 fix(ops): 修复派单时未更新工单 assigneeId 的问题
工单派发(PENDING -> DISPATCHED)时,更新工单表的 assigneeId 字段,
确保 BadgeDeviceStatusEventListener 能正确获取执行人设备ID并更新 Redis 缓存。

Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
2026-01-29 23:04:43 +08:00
3 changed files with 77 additions and 2 deletions

View File

@@ -89,7 +89,7 @@ public class CleanNotificationConstants {
* 新工单播报(完整版)
* 参数: {areaName} - 区域名称, {orderTitle} - 工单标题(截断)
*/
public static final String NEW_ORDER_FULL = "新工单%s作业区域%s";
public static final String NEW_ORDER_FULL = "新工单来啦,请前往%s进行清洁";
// ==================== 工单确认播报 ====================

View File

@@ -8,7 +8,9 @@ import com.viewsh.module.ops.core.event.OrderCreatedEvent;
import com.viewsh.module.ops.core.event.OrderEventPublisher;
import com.viewsh.module.ops.core.lifecycle.OrderLifecycleManager;
import com.viewsh.module.ops.core.lifecycle.model.OrderTransitionRequest;
import com.viewsh.module.ops.dal.dataobject.area.OpsBusAreaDO;
import com.viewsh.module.ops.dal.dataobject.workorder.OpsOrderDO;
import com.viewsh.module.ops.dal.mysql.area.OpsBusAreaMapper;
import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper;
import com.viewsh.module.ops.enums.OperatorTypeEnum;
import com.viewsh.module.ops.enums.PriorityEnum;
@@ -27,6 +29,11 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 保洁工单服务实现(重构版)
@@ -79,6 +86,9 @@ public class CleanOrderServiceImpl implements CleanOrderService {
@Resource
private ObjectMapper objectMapper;
@Resource
private OpsBusAreaMapper opsBusAreaMapper;
// ==================== 工单创建 ====================
@Override
@@ -98,7 +108,7 @@ public class CleanOrderServiceImpl implements CleanOrderService {
.priority(createReq.getPriority() != null ? createReq.getPriority() : PriorityEnum.P2.getPriority())
.status(WorkOrderStatusEnum.PENDING.getStatus())
.areaId(createReq.getAreaId())
.location(createReq.getLocation())
.location(buildAreaPath(createReq.getAreaId()))
.sourceType(createReq.getSourceType() != null ? createReq.getSourceType() : "TRAFFIC")
// IoT集成字段
.triggerSource(createReq.getTriggerSource())
@@ -393,4 +403,59 @@ public class CleanOrderServiceImpl implements CleanOrderService {
log.debug("记录完成时间: orderId={}", orderId);
}
}
/**
* 根据区域ID构建完整路径如"园区A栋B层电梯厅"
*/
private String buildAreaPath(Long areaId) {
if (areaId == null) {
return null;
}
OpsBusAreaDO area = opsBusAreaMapper.selectById(areaId);
if (area == null) {
return null;
}
String parentPath = area.getParentPath();
if (parentPath == null || parentPath.isEmpty()) {
return area.getAreaName();
}
String[] parentIds = parentPath.split("/");
if (parentIds.length == 0) {
return area.getAreaName();
}
// 收集有效的父级ID
List<Long> parentIdList = new ArrayList<>();
for (String pid : parentIds) {
if (!pid.isEmpty()) {
try {
parentIdList.add(Long.parseLong(pid));
} catch (NumberFormatException e) {
log.warn("解析父级区域ID失败: pid={}", pid);
}
}
}
if (parentIdList.isEmpty()) {
return area.getAreaName();
}
// 批量查询所有父级,避免 N+1 查询
List<OpsBusAreaDO> parents = opsBusAreaMapper.selectBatchIds(parentIdList);
Map<Long, OpsBusAreaDO> parentMap = parents.stream()
.collect(Collectors.toMap(OpsBusAreaDO::getId, Function.identity()));
// 按 parentPath 顺序拼接
StringBuilder sb = new StringBuilder();
for (Long pid : parentIdList) {
OpsBusAreaDO parent = parentMap.get(pid);
if (parent != null) {
sb.append(parent.getAreaName());
}
}
sb.append(area.getAreaName());
return sb.toString();
}
}

View File

@@ -151,6 +151,16 @@ public class OrderLifecycleManagerImpl implements OrderLifecycleManager {
// 设置目标状态
request.setTargetStatus(WorkOrderStatusEnum.DISPATCHED);
// 派单时更新工单的 assigneeId从 PENDING -> DISPATCHED
if (request.getAssigneeId() != null) {
OpsOrderDO order = opsOrderMapper.selectById(request.getOrderId());
if (order != null && order.getAssigneeId() == null) {
order.setAssigneeId(request.getAssigneeId());
opsOrderMapper.updateById(order);
log.debug("派发时更新工单执行人: orderId={}, assigneeId={}", request.getOrderId(), request.getAssigneeId());
}
}
// 执行状态转换
return transition(request);
}