吉安感知网项目-后端
linwei
3 days ago c929056185b25dc2e36a43a8afc8305cc37bb3ac
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);
    }
}
    /**
     * 根据事件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;
    }
}