From c929056185b25dc2e36a43a8afc8305cc37bb3ac Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Fri, 31 Jul 2026 14:02:41 +0800
Subject: [PATCH] feat(workorder): 添加事件状态时间线功能

---
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java |   92 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 91 insertions(+), 1 deletions(-)

diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java
index 03e9432..8f87889 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdClueEventStatusFlowServiceImpl.java
@@ -19,16 +19,21 @@
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.sxkj.gd.workorder.entity.GdClueEventEntity;
 import org.sxkj.gd.workorder.entity.GdClueEventStatusFlowEntity;
 import org.sxkj.gd.workorder.enums.EventStatusEnum;
 import org.sxkj.gd.workorder.mapper.GdClueEventStatusFlowMapper;
+import org.sxkj.gd.workorder.service.IGdClueEventService;
 import org.sxkj.gd.workorder.service.IGdClueEventStatusFlowService;
 import org.sxkj.gd.workorder.vo.GdClueEventStatusFlowVO;
 import org.springframework.stereotype.Service;
 import org.springblade.core.mp.base.BaseServiceImpl;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 事件状态流转履历表 服务实现类
@@ -40,6 +45,9 @@
 @Service
 @AllArgsConstructor
 public class GdClueEventStatusFlowServiceImpl extends BaseServiceImpl<GdClueEventStatusFlowMapper, GdClueEventStatusFlowEntity> implements IGdClueEventStatusFlowService {
+
+	@Autowired
+    private  IGdClueEventService gdClueEventService;
 
     /**
      * 根据事件ID查询状态流转记录列表
@@ -123,4 +131,86 @@
         return save(flowEntity);
     }
 
-}
\ No newline at end of file
+    /**
+     * 根据事件ID查询状态时间线
+     * <p>
+     * 步骤:
+     * 1. 参数校验
+     * 2. 查询事件当前状态
+     * 3. 查询状态流转记录
+     * 4. 构建已到达状态集合
+     * 5. 生成完整的状态时间线
+     * </p>
+     *
+     * @param eventId 事件ID
+     * @return 状态时间线列表(按状态编码升序)
+     */
+    @Override
+    public List<GdClueEventStatusFlowVO> getStatusTimeline(Long eventId) {
+        // 1. 参数校验
+        if (eventId == null) {
+            throw new RuntimeException("事件ID不能为空");
+        }
+
+        // 2. 查询事件当前状态
+        GdClueEventEntity event = gdClueEventService.getById(eventId);
+        if (event == null) {
+            throw new RuntimeException("事件不存在");
+        }
+
+        // 3. 查询状态流转记录
+        List<GdClueEventStatusFlowVO> flows = baseMapper.selectStatusFlowsByEventId(eventId);
+
+        // 4. 构建每个状态的最后流转记录
+        // key: 状态编码, value: 最后的流转记录
+        Map<Integer, GdClueEventStatusFlowVO> lastFlowMap = new HashMap<>();
+        if (flows != null && !flows.isEmpty()) {
+            for (GdClueEventStatusFlowVO flow : flows) {
+                // 记录目标状态的最后流转
+                if (flow.getNewStatus() != null) {
+                    lastFlowMap.put(flow.getNewStatus(), flow);
+                }
+                // 记录源状态的最后流转
+                if (flow.getOldStatus() != null) {
+                    lastFlowMap.put(flow.getOldStatus(), flow);
+                }
+            }
+        }
+
+        // 5. 生成完整的状态时间线
+        List<GdClueEventStatusFlowVO> timeline = new java.util.ArrayList<>();
+        for (Integer statusCode : EventStatusEnum.getAllStatusCodes()) {
+            GdClueEventStatusFlowVO item = new GdClueEventStatusFlowVO();
+            // 使用 newStatus 字段存储当前状态编码
+            item.setNewStatus(statusCode);
+            item.setNewStatusName(EventStatusEnum.getNameByCode(statusCode));
+
+            GdClueEventStatusFlowVO lastFlow = lastFlowMap.get(statusCode);
+            if (lastFlow != null) {
+                // 根据最后流转记录判断是否已到达
+                // 如果目标是该状态,则已到达
+                // 如果源是该状态(目标不是),则未到达(已离开)
+                boolean isReached = lastFlow.getNewStatus().equals(statusCode);
+                item.setIsReached(isReached);
+
+                if (isReached) {
+                    // 已到达状态:设置操作信息
+                    item.setOperateUser(lastFlow.getOperateUser());
+                    item.setOperateUserName(lastFlow.getOperateUserName());
+                    item.setOperateDept(lastFlow.getOperateDept());
+                    item.setOperateDeptName(lastFlow.getOperateDeptName());
+                    item.setOperateContent(lastFlow.getOperateContent());
+                    item.setOperateTime(lastFlow.getOperateTime());
+                }
+            } else {
+                // 没有流转记录,未到达
+                item.setIsReached(false);
+            }
+
+            timeline.add(item);
+        }
+
+        return timeline;
+    }
+
+}

--
Gitblit v1.9.3