/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.sxkj.gd.workorder.service.impl; import org.sxkj.gd.workorder.entity.GdWorkOrderFlowEntity; import org.sxkj.gd.workorder.vo.GdWorkOrderFlowVO; import org.sxkj.gd.workorder.vo.WorkOrderStageVO; import org.sxkj.gd.workorder.vo.WorkOrderStatusDetailVO; import org.sxkj.gd.workorder.excel.GdWorkOrderFlowExcel; import org.sxkj.gd.workorder.mapper.GdWorkOrderFlowMapper; import org.sxkj.gd.workorder.service.IGdWorkOrderFlowService; import org.sxkj.gd.workorder.enums.WorkOrderStatusEnum; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import java.util.List; import java.util.ArrayList; import java.util.Arrays; /** * 流程记录表 服务实现类 * * @author lw * @since 2026-01-14 */ @Service public class GdWorkOrderFlowServiceImpl extends BaseServiceImpl implements IGdWorkOrderFlowService { @Override public IPage selectGdWorkOrderFlowPage(IPage page, GdWorkOrderFlowVO gdWorkOrderFlow) { return page.setRecords(baseMapper.selectGdWorkOrderFlowPage(page, gdWorkOrderFlow)); } @Override public List exportGdWorkOrderFlow(Wrapper queryWrapper) { List gdWorkOrderFlowList = baseMapper.exportGdWorkOrderFlow(queryWrapper); //gdWorkOrderFlowList.forEach(gdWorkOrderFlow -> { // gdWorkOrderFlow.setTypeName(DictCache.getValue(DictEnum.YES_NO, GdWorkOrderFlow.getType())); //}); return gdWorkOrderFlowList; } @Override public List getHierarchicalFlow(Wrapper queryWrapper) { // 1. 从数据库获取实际流程记录 List actualFlows = list(queryWrapper); // 2. 构建分层结构 return buildHierarchicalFlow(actualFlows); } /** * 构建分层结构的流程数据 * * @param actualFlows 实际流程记录 * @return 分层结构的流程数据 */ private List buildHierarchicalFlow(List actualFlows) { List stages = new ArrayList<>(); // 3. 遍历所有工单阶段 // 工单发布阶段 stages.add(buildStage(WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getStageDesc(), Arrays.asList( WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getStageDesc(), WorkOrderStatusEnum.PUBLISHING_REJECTING.getStageDesc() ), actualFlows, WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getMaxCode())); // 接单响应阶段 stages.add(buildStage(WorkOrderStatusEnum.STAGE_ORDER_RESPONSE.getStageDesc(), Arrays.asList( WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT.getStageDesc(), WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getStageDesc(), WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getStageDesc(), WorkOrderStatusEnum.RESPONDING_CANCELED.getStageDesc() ), actualFlows, WorkOrderStatusEnum.STAGE_ORDER_RESPONSE.getMaxCode())); // 执行中阶段 stages.add(buildStage(WorkOrderStatusEnum.STAGE_IN_EXECUTION.getStageDesc(), Arrays.asList( WorkOrderStatusEnum.EXECUTING_TO_BE_COMPLETED.getStageDesc(), WorkOrderStatusEnum.EXECUTING_NEGOTIATE_MODIFY.getStageDesc() ), actualFlows, WorkOrderStatusEnum.STAGE_IN_EXECUTION.getMaxCode())); // 完成待验阶段 stages.add(buildStage(WorkOrderStatusEnum.STAGE_COMPLETED_PENDING_INSPECTION.getStageDesc(), Arrays.asList( WorkOrderStatusEnum.COMPLETED_TO_BE_INSPECTED.getStageDesc() ), actualFlows, WorkOrderStatusEnum.STAGE_COMPLETED_PENDING_INSPECTION.getMaxCode())); // 验收通过阶段 stages.add(buildStage(WorkOrderStatusEnum.STAGE_ACCEPTED.getStageDesc(), Arrays.asList( WorkOrderStatusEnum.ACCEPTED_TO_BE_SETTLED.getStageDesc() ), actualFlows, WorkOrderStatusEnum.STAGE_ACCEPTED.getMaxCode())); // 结算完成阶段 stages.add(buildStage(WorkOrderStatusEnum.STAGE_SETTLEMENT_COMPLETED.getStageDesc(), Arrays.asList( WorkOrderStatusEnum.SETTLEMENT_COMPLETED.getStageDesc() ), actualFlows, WorkOrderStatusEnum.STAGE_SETTLEMENT_COMPLETED.getMaxCode())); return stages; } /** * 构建单个阶段的流程数据 * * @param stageName 阶段名称 * @param statusNames 状态名称列表 * @param actualFlows 实际流程记录 * @param flowStatus 流程状态码 * @return 阶段流程数据 */ private WorkOrderStageVO buildStage(String stageName, List statusNames, List actualFlows, String flowStatus) { List statuses = new ArrayList<>(); // 遍历该阶段的所有状态 for (String statusName : statusNames) { // 查找是否有对应的实际流程记录 GdWorkOrderFlowEntity matchingFlow = findMatchingFlow(actualFlows, statusName, flowStatus); if (matchingFlow != null) { // 已到达的状态 statuses.add(new WorkOrderStatusDetailVO( statusName, true, matchingFlow.getOperator(), matchingFlow.getCreateTime() )); } else { // 未到达的状态 statuses.add(new WorkOrderStatusDetailVO(statusName)); } } return new WorkOrderStageVO(stageName, statuses); } /** * 查找匹配的流程记录 * * @param actualFlows 实际流程记录 * @param statusName 状态名称 * @param flowStatus 流程状态码 * @return 匹配的流程记录,没有则返回null */ private GdWorkOrderFlowEntity findMatchingFlow(List actualFlows, String statusName, String flowStatus) { for (GdWorkOrderFlowEntity flow : actualFlows) { if (flow.getFlowStatus().equals(flowStatus) && flow.getFlowName().equals(statusName)) { return flow; } } return null; } }