From 8c03253446e6211a79483723bc2a5e63b3b3d450 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 3 Feb 2026 15:41:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(ops):=20=E6=96=B0=E5=A2=9E=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E4=B8=9A=E5=8A=A1=E6=97=A5=E5=BF=97=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - OpsOrderService/Impl: 新增 getOrderBusinessLogs,将 OpsBusinessEventLogDO 转换为前端友好的 OpsOrderBusinessLogRespDTO(type/title/operator/status/extra) - OpsOrderController: 新增 GET /business-logs/{orderId} 端点 - 新增 OpsOrderBusinessLogRespDTO 和 OpsOrderBusinessLogsRespDTO Co-Authored-By: Claude Opus 4.5 --- .../ops/service/order/OpsOrderService.java | 8 ++ .../service/order/OpsOrderServiceImpl.java | 85 +++++++++++++++++++ .../controller/admin/OpsOrderController.java | 9 ++ 3 files changed, 102 insertions(+) diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderService.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderService.java index 2e30f78..98c130c 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderService.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderService.java @@ -118,4 +118,12 @@ public interface OpsOrderService { */ void updateIntegrationFields(Long orderId, String triggerSource, Long triggerDeviceId, String triggerDeviceKey); + /** + * 获取工单业务日志 + * + * @param orderId 工单ID + * @return 业务日志列表响应 + */ + OpsOrderBusinessLogsRespDTO getOrderBusinessLogs(Long orderId); + } diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderServiceImpl.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderServiceImpl.java index 22a020e..7bb5c2c 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderServiceImpl.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/order/OpsOrderServiceImpl.java @@ -48,6 +48,9 @@ public class OpsOrderServiceImpl implements OpsOrderService { @Resource private OrderLifecycleManager orderLifecycleManager; + @Resource + private com.viewsh.module.ops.dal.mysql.log.OpsBusinessEventLogMapper businessEventLogMapper; + private static final DateTimeFormatter ORDER_CODE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); @Override @@ -305,6 +308,88 @@ public class OpsOrderServiceImpl implements OpsOrderService { orderId, triggerSource, triggerDeviceId); } + @Override + public OpsOrderBusinessLogsRespDTO getOrderBusinessLogs(Long orderId) { + // 1. 查询工单 + OpsOrderDO order = opsOrderMapper.selectById(orderId); + if (order == null) { + throw new RuntimeException("工单不存在: " + orderId); + } + + // 2. 查询业务日志(按时间倒序) + var logDOList = businessEventLogMapper.selectListByOrderId(orderId); + + // 3. 转换为 DTO + var logDTOList = logDOList.stream() + .map(this::convertToBusinessLogDTO) + .toList(); + + // 4. 构建响应 + OpsOrderBusinessLogsRespDTO response = new OpsOrderBusinessLogsRespDTO(); + response.setOrderId(orderId); + response.setLogs(logDTOList); + + log.info("查询工单业务日志成功: orderId={}, logCount={}", orderId, logDTOList.size()); + + return response; + } + + /** + * 转换业务日志 DO 为 DTO + * + * @param logDO 日志 DO + * @return 日志 DTO + */ + private OpsOrderBusinessLogRespDTO convertToBusinessLogDTO(com.viewsh.module.ops.dal.dataobject.log.OpsBusinessEventLogDO logDO) { + OpsOrderBusinessLogRespDTO dto = new OpsOrderBusinessLogRespDTO(); + dto.setId(logDO.getId()); + + // type: 根据 eventDomain 映射为 system 或 user + // SYSTEM/AUDIT → system, 其他 → user + String type = "system"; + if (logDO.getEventDomain() != null) { + if ("SYSTEM".equalsIgnoreCase(logDO.getEventDomain()) || + "AUDIT".equalsIgnoreCase(logDO.getEventDomain())) { + type = "system"; + } else { + type = "user"; + } + } + dto.setType(type); + + // title: 优先使用 eventSummary,否则使用 eventType + String title = logDO.getEventSummary(); + if (title == null || title.isEmpty()) { + title = logDO.getEventType() != null ? logDO.getEventType() : "工单操作"; + } + dto.setTitle(title); + + // content: eventMessage + dto.setContent(logDO.getEventMessage()); + + // operator: 优先使用 personName,否则使用 "系统" + String operator = logDO.getPersonName(); + if (operator == null || operator.isEmpty()) { + operator = "系统"; + } + dto.setOperator(operator); + + // time: eventTime + dto.setTime(logDO.getEventTime()); + + // status: 从 eventPayload 中提取,如果没有则为 null + String status = null; + if (logDO.getEventPayload() != null && logDO.getEventPayload().containsKey("status")) { + status = String.valueOf(logDO.getEventPayload().get("status")); + } + dto.setStatus(status); + + // extra: eventPayload + dto.setExtra(logDO.getEventPayload()); + + return dto; + } + /** * 生成工单编号 * 格式:WO + yyyyMMddHHmmss + 3位随机数 diff --git a/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/OpsOrderController.java b/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/OpsOrderController.java index e1dfe7a..18c291d 100644 --- a/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/OpsOrderController.java +++ b/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/OpsOrderController.java @@ -141,4 +141,13 @@ public class OpsOrderController { return success(true); } + @GetMapping("/business-logs/{orderId}") + @Operation(summary = "获取工单业务日志") + @Parameter(name = "orderId", description = "工单ID", required = true) + @PreAuthorize("@ss.hasPermission('ops:order:query')") + public CommonResult getOrderBusinessLogs(@PathVariable("orderId") Long orderId) { + OpsOrderBusinessLogsRespDTO logs = opsOrderService.getOrderBusinessLogs(orderId); + return success(logs); + } + }