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

- OpsOrderService/Impl: 新增 getOrderBusinessLogs,将 OpsBusinessEventLogDO
  转换为前端友好的 OpsOrderBusinessLogRespDTO(type/title/operator/status/extra)
- OpsOrderController: 新增 GET /business-logs/{orderId} 端点
- 新增 OpsOrderBusinessLogRespDTO 和 OpsOrderBusinessLogsRespDTO

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-02-03 15:41:04 +08:00
parent fe64216286
commit 8c03253446
3 changed files with 102 additions and 0 deletions

View File

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

View File

@@ -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位随机数

View File

@@ -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<OpsOrderBusinessLogsRespDTO> getOrderBusinessLogs(@PathVariable("orderId") Long orderId) {
OpsOrderBusinessLogsRespDTO logs = opsOrderService.getOrderBusinessLogs(orderId);
return success(logs);
}
}