From d97125fdf6af75c79dc212c2e71139f665859d25 Mon Sep 17 00:00:00 2001 From: lzh Date: Thu, 29 Jan 2026 23:13:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(ops):=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E6=92=AD=E6=8A=A5=E8=AF=AD=E9=9F=B3=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=8C=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../constants/CleanNotificationConstants.java | 2 +- .../cleanorder/CleanOrderServiceImpl.java | 67 ++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java index ce548d0..e59ffad 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/constants/CleanNotificationConstants.java @@ -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进行清洁"; // ==================== 工单确认播报 ==================== diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/cleanorder/CleanOrderServiceImpl.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/cleanorder/CleanOrderServiceImpl.java index d8a3951..df8d3f0 100644 --- a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/cleanorder/CleanOrderServiceImpl.java +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/cleanorder/CleanOrderServiceImpl.java @@ -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 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 parents = opsBusAreaMapper.selectBatchIds(parentIdList); + Map 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(); + } }