| | |
| | | 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; |
| | | |
| | | /** |
| | | * 事件状态流转履历表 服务实现类 |
| | |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class GdClueEventStatusFlowServiceImpl extends BaseServiceImpl<GdClueEventStatusFlowMapper, GdClueEventStatusFlowEntity> implements IGdClueEventStatusFlowService { |
| | | |
| | | @Autowired |
| | | private IGdClueEventService gdClueEventService; |
| | | |
| | | /** |
| | | * 根据事件ID查询状态流转记录列表 |
| | |
| | | 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; |
| | | } |
| | | |
| | | } |