吉安感知网项目-后端
linwei
2026-01-31 e0f9c904ba3f97af53f83e3a91ebf13f437b419d
优化流程
7 files modified
612 ■■■■■ changed files
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdWorkOrderFlowController.java 13 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderFlowEntity.java 11 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/WorkOrderStatusEnum.java 421 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdWorkOrderFlowService.java 9 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java 19 ●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderFlowServiceImpl.java 113 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java 26 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdWorkOrderFlowController.java
@@ -17,6 +17,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
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.excel.GdWorkOrderFlowExcel;
import org.sxkj.gd.workorder.wrapper.GdWorkOrderFlowWrapper;
import org.sxkj.gd.workorder.service.IGdWorkOrderFlowService;
@@ -55,13 +56,19 @@
    }
    /**
     * 流程记录表 列表
     * 返回分层结构的流程数据,包含所有状态(已到达和未到达的)
     *
     * @param gdWorkOrderFlow 查询参数
     * @return 分层结构的流程数据
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "列表", notes = "传入gdWorkOrderFlow")
    public R<List<GdWorkOrderFlowVO>> list(@ApiIgnore @RequestParam Map<String, Object> gdWorkOrderFlow) {
        List<GdWorkOrderFlowEntity> list = gdWorkOrderFlowService.list(Condition.getQueryWrapper(gdWorkOrderFlow, GdWorkOrderFlowEntity.class));
        return R.data(GdWorkOrderFlowWrapper.build().entityVOList(list));
    public R<List<WorkOrderStageVO>> list(@ApiIgnore @RequestParam Map<String, Object> gdWorkOrderFlow) {
        // 调用服务层方法获取分层结构的流程数据
        List<WorkOrderStageVO> stages = gdWorkOrderFlowService.getHierarchicalFlow(Condition.getQueryWrapper(gdWorkOrderFlow, GdWorkOrderFlowEntity.class));
        return R.data(stages);
    }
    /**
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/entity/GdWorkOrderFlowEntity.java
@@ -45,6 +45,17 @@
     */
    @ApiModelProperty(value = "流转描述")
    private String flowDesc;
    /**
     * 流程状态
     */
    @ApiModelProperty(value = "流程状态 1.工单发布,2.接单响应,3.执行中 4.完成待验 5.验收通过 6.结算完成")
    private String flowStatus;
    /**
     * 工单状态
     */
    @ApiModelProperty(value = "工单状态工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算")
    private String workStatus;
    /**
     * 关联工单任务表ID/巡查任务ID
     */
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/WorkOrderStatusEnum.java
@@ -2,252 +2,257 @@
/**
 * 工单状态枚举
 *
 * @author lw
 * @since 2026-01-17
 */
public enum WorkOrderStatusEnum {
    /**
     * 工单阶段:工单发布
     */
    STAGE_WORK_ORDER_RELEASE("工单发布"),
    /**
     * 工单阶段:工单发布
     */
    STAGE_WORK_ORDER_RELEASE("工单发布"),
    /**
     * 工单阶段:接单响应
     */
    STAGE_ORDER_RESPONSE("接单响应"),
    /**
     * 工单阶段:接单响应
     */
    STAGE_ORDER_RESPONSE("接单响应"),
    /**
     * 工单阶段:执行中
     */
    STAGE_IN_EXECUTION("执行中"),
    /**
     * 工单阶段:执行中
     */
    STAGE_IN_EXECUTION("执行中"),
    /**
     * 工单阶段:完成待验
     */
    STAGE_COMPLETED_PENDING_INSPECTION("完成待验"),
    /**
     * 工单阶段:完成待验
     */
    STAGE_COMPLETED_PENDING_INSPECTION("完成待验"),
    /**
     * 工单阶段:验收通过
     */
    STAGE_ACCEPTED("验收通过"),
    /**
     * 工单阶段:验收通过
     */
    STAGE_ACCEPTED("验收通过"),
    /**
     * 工单阶段:结算完成
     */
    STAGE_SETTLEMENT_COMPLETED("结算完成"),
    /**
     * 工单阶段:结算完成
     */
    STAGE_SETTLEMENT_COMPLETED("结算完成"),
    // ------------------ 以下是工单状态 ------------------
    // ------------------ 以下是工单状态 ------------------
    /**
     * 草稿
     */
    DRAFT("0", "草稿", null),
    /**
     * 发布中_接单中
     */
    PUBLISHING_ACCEPTING("10", "1", "工单发布_接单中", "接单中"),
    /**
     * 发布中_接单中
     */
    PUBLISHING_ACCEPTING("10", "发布中_接单中", "工单发布"),
    /**
     * 发布中_拒绝接单
     */
    PUBLISHING_REJECTING("11", "1", "工单发布_拒绝接单", "拒绝接单"),
    /**
     * 发布中_拒绝接单
     */
    PUBLISHING_REJECTING("11", "发布中_拒绝接单", "拒绝接单"),
    /**
     * 响应中_待拆分
     */
    RESPONDING_TO_BE_SPLIT("20", "2", "接单响应_待拆分", "待拆分"),
    /**
     * 响应中_待拆分
     */
    RESPONDING_TO_BE_SPLIT("20", "响应中_待拆分", "接单响应"),
    /**
     * 响应中_申请取消
     */
    RESPONDING_APPLY_CANCEL("21", "2", "接单响应_申请取消", "申请取消"),
    /**
     * 响应中_申请取消
     */
    RESPONDING_APPLY_CANCEL("21", "响应中_申请取消", "申请取消"),
    /**
     * 响应中_申请修改
     */
    RESPONDING_APPLY_MODIFY("22", "2", "接单响应_申请修改", "申请修改"),
    /**
     * 响应中_申请修改
     */
    RESPONDING_APPLY_MODIFY("22", "响应中_申请修改", "申请修改"),
    /**
     * 响应中_已取消
     */
    RESPONDING_CANCELED("23", "2", "接单响应_已取消", "已取消"),
    /**
     * 响应中_已取消
     */
    RESPONDING_CANCELED("23", "响应中_已取消", "已取消"),
    /**
     * 执行中_待全部完成
     */
    EXECUTING_TO_BE_COMPLETED("30", "3", "执行中_待全部完成", "待全部完成"),
    /**
     * 响应中_拒绝取消
     */
    // RESPONDING_REJECT_CANCEL("24", "响应中_拒绝取消", "拒绝取消"),
    /**
     * 执行中_协商修改
     */
    EXECUTING_NEGOTIATE_MODIFY("31", "3", "执行中_协商修改", "协商修改"),
    /**
     * 响应中_拒绝修改
     */
    // RESPONDING_REJECT_MODIFY("25", "响应中_拒绝修改", "拒绝修改"),
    /**
     * 完成待验_待全部验收
     */
    COMPLETED_TO_BE_INSPECTED("40", "4", "完成待验_待全部验收", "待全部验收"),
    /**
     * 执行中_待全部完成
     */
    EXECUTING_TO_BE_COMPLETED("30", "执行中_待全部完成", "执行中"),
    /**
     * 验收通过_待结算
     */
    ACCEPTED_TO_BE_SETTLED("50", "5", "验收通过_待结算", "待结算"),
    /**
     * 执行中_协商修改
     */
    EXECUTING_NEGOTIATE_MODIFY("31", "执行中_协商修改", "执行中"),
    /**
     * 结算完成_已结算
     */
    SETTLEMENT_COMPLETED("60", "6", "结算完成_已结算", "已结算");
    /**
     * 完成待验_待全部验收
     */
    COMPLETED_TO_BE_INSPECTED("40", "完成待验_待全部验收", "完成待验"),
    private final String code;
    private final String maxCode;
    private final String desc;
    private final String stageDesc;
    private final boolean isStage;
    /**
     * 验收通过_待结算
     */
    ACCEPTED_TO_BE_SETTLED("50", "验收通过_待结算", "验收通过"),
    /**
     * 工单阶段构造函数
     */
    WorkOrderStatusEnum(String stageDesc) {
        this.code = null;
        this.maxCode = null;
        this.desc = null;
        this.stageDesc = stageDesc;
        this.isStage = true;
    }
    /**
     * 结算完成_已结算
     */
    SETTLEMENT_COMPLETED("60", "结算完成_已结算", "结算完成");
    /**
     * 工单状态构造函数
     */
    WorkOrderStatusEnum(String code, String miniCode, String desc, String stageDesc) {
        this.code = code;
        this.maxCode = miniCode;
        this.desc = desc;
        this.stageDesc = stageDesc;
        this.isStage = false;
    }
    private final String code;
    private final String desc;
    private final String stageDesc;
    private final boolean isStage;
    /**
     * 获取状态码
     *
     * @return 状态码
     */
    public String getCode() {
        return code;
    }
    /**
     * 工单阶段构造函数
     */
    WorkOrderStatusEnum(String stageDesc) {
        this.code = null;
        this.desc = null;
        this.stageDesc = stageDesc;
        this.isStage = true;
    }
    /**
     * 获取状态描述
     *
     * @return 状态描述
     */
    public String getDesc() {
        return desc;
    }
    /**
     * 工单状态构造函数
     */
    WorkOrderStatusEnum(String code, String desc, String stageDesc) {
        this.code = code;
        this.desc = desc;
        this.stageDesc = stageDesc;
        this.isStage = false;
    }
    /**
     * 获取工单阶段描述
     *
     * @return 工单阶段描述
     */
    public String getStageDesc() {
        return stageDesc;
    }
    /**
     * 获取状态码
     * @return 状态码
     */
    public String getCode() {
        return code;
    }
    public String getMaxCode() {
        return maxCode;
    }
    /**
     * 获取状态描述
     * @return 状态描述
     */
    public String getDesc() {
        return desc;
    }
    /**
     * 是否为工单阶段
     *
     * @return 是否为工单阶段
     */
    public boolean isStage() {
        return isStage;
    }
    /**
     * 获取工单阶段描述
     * @return 工单阶段描述
     */
    public String getStageDesc() {
        return stageDesc;
    }
    /**
     * 是否为工单状态
     *
     * @return 是否为工单状态
     */
    public boolean isStatus() {
        return !isStage;
    }
    /**
     * 是否为工单阶段
     * @return 是否为工单阶段
     */
    public boolean isStage() {
        return isStage;
    }
    /**
     * 根据状态码获取枚举对象
     *
     * @param code 状态码
     * @return 枚举对象
     */
    public static WorkOrderStatusEnum getByCode(String code) {
        if (code == null) {
            return null;
        }
        for (WorkOrderStatusEnum status : values()) {
            if (code.equals(status.getCode())) {
                return status;
            }
        }
        return null;
    }
    /**
     * 是否为工单状态
     * @return 是否为工单状态
     */
    public boolean isStatus() {
        return !isStage;
    }
    /**
     * 根据状态码获取状态描述
     *
     * @param code 状态码
     * @return 状态描述
     */
    public static String getDescByCode(String code) {
        WorkOrderStatusEnum status = getByCode(code);
        return status != null ? status.getDesc() : null;
    }
    /**
     * 根据状态码获取枚举对象
     * @param code 状态码
     * @return 枚举对象
     */
    public static WorkOrderStatusEnum getByCode(String code) {
        if (code == null) {
            return null;
        }
        for (WorkOrderStatusEnum status : values()) {
            if (code.equals(status.getCode())) {
                return status;
            }
        }
        return null;
    }
    /**
     * 判断状态码是否有效
     *
     * @param code 状态码
     * @return 是否有效
     */
    public static boolean isValid(String code) {
        return getByCode(code) != null;
    }
    /**
     * 根据状态码获取状态描述
     * @param code 状态码
     * @return 状态描述
     */
    public static String getDescByCode(String code) {
        WorkOrderStatusEnum status = getByCode(code);
        return status != null ? status.getDesc() : null;
    }
    /**
     * 检查当前状态是否允许指定的操作类型
     *
     * @param operationType 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消  6不同意取消 7.同意修改 8.不同意修改 9.协商修改 10.同意修改 11.结算
     * @return 是否允许操作
     */
    public boolean isAllowedOperation(Integer operationType) {
        if (operationType == null) {
            return false;
        }
    /**
     * 判断状态码是否有效
     * @param code 状态码
     * @return 是否有效
     */
    public static boolean isValid(String code) {
        return getByCode(code) != null;
    }
    /**
     * 检查当前状态是否允许指定的操作类型
     * @param operationType 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消  6不同意取消 7.同意修改 8.不同意修改 9.协商修改 10.同意修改 11.结算
     * @return 是否允许操作
     */
    public boolean isAllowedOperation(Integer operationType) {
        if (operationType == null) {
            return false;
        }
        switch (this) {
            case PUBLISHING_ACCEPTING:
                // 发布中_接单中状态允许:1接单,2拒接接单
                return operationType == 1 || operationType == 2;
            case RESPONDING_TO_BE_SPLIT:
                // 响应中_待拆分状态允许:3申请取消,4申请修改
                return operationType == 3 || operationType == 4 ;
            case RESPONDING_APPLY_CANCEL:
                // 响应中_申请取消状态允许:5同意取消,6不同意取消
                return operationType == 5 || operationType == 6;
            case RESPONDING_APPLY_MODIFY:
                // 响应中_申请修改状态允许:7同意修改,8不同意修改
                return operationType ==7 || operationType == 8 ;
            // case RESPONDING_REJECT_CANCEL:
            //     // 响应中_拒绝取消状态允许:3申请取消
            //     return operationType == 3;
            // case RESPONDING_REJECT_MODIFY:
            //     // 响应中_拒绝修改状态允许:4申请修改
            //     return operationType == 4 || operationType == 3;
        switch (this) {
            case PUBLISHING_ACCEPTING:
                // 发布中_接单中状态允许:1接单,2拒接接单
                return operationType == 1 || operationType == 2;
            case RESPONDING_TO_BE_SPLIT:
                // 响应中_待拆分状态允许:3申请取消,4申请修改
                return operationType == 3 || operationType == 4;
            case RESPONDING_APPLY_CANCEL:
                // 响应中_申请取消状态允许:5同意取消,6不同意取消
                return operationType == 5 || operationType == 6;
            case RESPONDING_APPLY_MODIFY:
                // 响应中_申请修改状态允许:7同意修改,8不同意修改
                return operationType == 7 || operationType == 8;
            // case RESPONDING_REJECT_CANCEL:
            //     // 响应中_拒绝取消状态允许:3申请取消
            //     return operationType == 3;
            // case RESPONDING_REJECT_MODIFY:
            //     // 响应中_拒绝修改状态允许:4申请修改
            //     return operationType == 4 || operationType == 3;
            case ACCEPTED_TO_BE_SETTLED:
                // 验收通过_待结算状态允许:11结算完成
                return operationType == 11;
                return operationType == 11;
            case EXECUTING_TO_BE_COMPLETED:
                // 执行中_待全部完成状态允许:9.协商修改
                return operationType == 9;
            default:
                // 其他状态不允许操作
                return false;
        }
    }
                return operationType == 9;
            case EXECUTING_NEGOTIATE_MODIFY:
                // 执行中_状态状态允许:10.同意协商修改
                return operationType == 10;
            default:
                // 其他状态不允许操作
                return false;
        }
    }
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdWorkOrderFlowService.java
@@ -19,6 +19,7 @@
import com.baomidou.mybatisplus.core.conditions.Wrapper;
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.excel.GdWorkOrderFlowExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
@@ -49,4 +50,12 @@
     */
    List<GdWorkOrderFlowExcel> exportGdWorkOrderFlow(Wrapper<GdWorkOrderFlowEntity> queryWrapper);
    /**
     * 获取分层结构的流程数据
     *
     * @param queryWrapper 查询条件
     * @return 分层结构的流程数据
     */
    List<WorkOrderStageVO> getHierarchicalFlow(Wrapper<GdWorkOrderFlowEntity> queryWrapper);
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java
@@ -139,7 +139,7 @@
            gdWorkOrderFlowEntity.setWorkOrderId(gdPatrolTaskEntity.getId());
            gdWorkOrderFlowEntity.setFlowName(PatrolTaskStatusEnum.PENDING_SIGNING.getStageDesc());
            gdWorkOrderFlowEntity.setFlowDesc(AuthUtil.getUserName() + " " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + " 发布任务,等待接单");
            gdWorkOrderFlowEntity.setOperator(AuthUtil.getUserName());
            gdWorkOrderFlowEntity.setOperator(AuthUtil.getNickName());
            gdWorkOrderFlowEntity.setType(WorkOrderTypeEnum.PATROL_TASK.getValue());
            gdWorkOrderFlowEntity.setAreaCode(gdPatrolTaskEntity.getAreaCode());
            gdWorkOrderFlowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
@@ -305,12 +305,11 @@
        flowEntity.setCreateUser(AuthUtil.getUserId());
        flowEntity.setWorkOrderId(workOrderId);
        flowEntity.setFlowName(newStatus.getStageDesc());
        flowEntity.setFlowDesc(String.format("%s %s 更新了任务信息,状态转换为:%s",
            AuthUtil.getUserName(),
            DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"),
            newStatus.getStageDesc()));
        flowEntity.setOperator(AuthUtil.getUserName());
        flowEntity.setFlowDesc(newStatus.getDesc());
        flowEntity.setOperator(AuthUtil.getNickName());
        flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue());
        flowEntity.setFlowStatus(newStatus.getMaxCode());
        flowEntity.setWorkStatus(newStatus.getCode());
        flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
        return gdWorkOrderFlowService.save(flowEntity);
    }
@@ -368,8 +367,8 @@
        flowEntity.setCreateUser(AuthUtil.getUserId());
        flowEntity.setWorkOrderId(taskEntity.getId());
        flowEntity.setFlowName(targetStatus.getDesc());
        flowEntity.setFlowDesc(AuthUtil.getUserName() + " " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + " 更新了任务信息,状态转换为:" + targetStatus.getDesc());
        flowEntity.setOperator(AuthUtil.getUserName());
        flowEntity.setFlowDesc(AuthUtil.getNickName() + " " + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + " 更新了任务信息,状态转换为:" + targetStatus.getDesc());
        flowEntity.setOperator(AuthUtil.getNickName());
        flowEntity.setType(WorkOrderTypeEnum.PATROL_TASK.getValue());
        flowEntity.setAreaCode(existingTask.getAreaCode());
        flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
@@ -452,7 +451,7 @@
        String flowDesc = buildFlowDesc(newStatus, rejectReason);
        flowEntity.setFlowDesc(flowDesc);
        flowEntity.setOperator(AuthUtil.getUserName());
        flowEntity.setOperator(AuthUtil.getNickName());
        flowEntity.setType(WorkOrderTypeEnum.PATROL_TASK.getValue());
        flowEntity.setAreaCode(areaCode);
        flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
@@ -473,7 +472,7 @@
     */
    private String buildFlowDesc(PatrolTaskStatusEnum newStatus, String rejectReason) {
        String baseDesc = String.format("%s %s ",
                AuthUtil.getUserName(),
                AuthUtil.getNickName(),
                DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
        // 拒绝类状态需要添加拒绝原因
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderFlowServiceImpl.java
@@ -18,14 +18,19 @@
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;
/**
 * 流程记录表 服务实现类
@@ -51,4 +56,112 @@
        return gdWorkOrderFlowList;
    }
    @Override
    public List<WorkOrderStageVO> getHierarchicalFlow(Wrapper<GdWorkOrderFlowEntity> queryWrapper) {
        // 1. 从数据库获取实际流程记录
        List<GdWorkOrderFlowEntity> actualFlows = list(queryWrapper);
        // 2. 构建分层结构
        return buildHierarchicalFlow(actualFlows);
    }
    /**
     * 构建分层结构的流程数据
     *
     * @param actualFlows 实际流程记录
     * @return 分层结构的流程数据
     */
    private List<WorkOrderStageVO> buildHierarchicalFlow(List<GdWorkOrderFlowEntity> actualFlows) {
        List<WorkOrderStageVO> stages = new ArrayList<>();
        // 3. 遍历所有工单阶段
        // 工单发布阶段
        stages.add(buildStage(WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getStageDesc(), Arrays.asList(
                WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getStageDesc(),
                WorkOrderStatusEnum.PUBLISHING_REJECTING.getStageDesc()
        ), actualFlows, "1"));
        // 接单响应阶段
        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, "2"));
        // 执行中阶段
        stages.add(buildStage(WorkOrderStatusEnum.STAGE_IN_EXECUTION.getStageDesc(), Arrays.asList(
                WorkOrderStatusEnum.EXECUTING_TO_BE_COMPLETED.getStageDesc(),
                WorkOrderStatusEnum.EXECUTING_NEGOTIATE_MODIFY.getStageDesc()
        ), actualFlows, "3"));
        // 完成待验阶段
        stages.add(buildStage(WorkOrderStatusEnum.STAGE_COMPLETED_PENDING_INSPECTION.getStageDesc(), Arrays.asList(
                WorkOrderStatusEnum.COMPLETED_TO_BE_INSPECTED.getStageDesc()
        ), actualFlows, "4"));
        // 验收通过阶段
        stages.add(buildStage(WorkOrderStatusEnum.STAGE_ACCEPTED.getStageDesc(), Arrays.asList(
                WorkOrderStatusEnum.ACCEPTED_TO_BE_SETTLED.getStageDesc()
        ), actualFlows, "5"));
        // 结算完成阶段
        stages.add(buildStage(WorkOrderStatusEnum.STAGE_SETTLEMENT_COMPLETED.getStageDesc(), Arrays.asList(
                WorkOrderStatusEnum.SETTLEMENT_COMPLETED.getStageDesc()
        ), actualFlows, "6"));
        return stages;
    }
    /**
     * 构建单个阶段的流程数据
     *
     * @param stageName     阶段名称
     * @param statusNames   状态名称列表
     * @param actualFlows   实际流程记录
     * @param flowStatus    流程状态码
     * @return 阶段流程数据
     */
    private WorkOrderStageVO buildStage(String stageName, List<String> statusNames, List<GdWorkOrderFlowEntity> actualFlows, String flowStatus) {
        List<WorkOrderStatusDetailVO> 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<GdWorkOrderFlowEntity> actualFlows, String statusName, String flowStatus) {
        for (GdWorkOrderFlowEntity flow : actualFlows) {
            if (flow.getFlowStatus().equals(flowStatus) && flow.getFlowName().equals(statusName)) {
                return flow;
            }
        }
        return null;
    }
}
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
@@ -1,6 +1,5 @@
package org.sxkj.gd.workorder.service.impl;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -35,7 +34,6 @@
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * 工单任务表 服务实现类
@@ -114,10 +112,6 @@
                    entity.setWorkOrderStatus(WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getCode());
                    newStatusEnum = WorkOrderStatusEnum.PUBLISHING_ACCEPTING;
                    break;
                // case "24": // 响应中_拒绝取消 → 响应中_申请取消
                //     entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getCode());
                //     newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL;
                //     break;
                case "20": // 响应中_待拆分 → 响应中_申请修改
                    entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode());
                    newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY;
@@ -126,10 +120,6 @@
                    // 直接生成快照,无需处理geom字段
                    entity.setFullSnapshot(JSON.toJSONString(orderEntity));
                    break;
                // case "25": // 响应中_拒绝修改 → 响应中_申请修改
                //     entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode());
                //     newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY;
                //     break;
            }
            saveResult = updateById(entity);
        } else {
@@ -149,9 +139,11 @@
            flowEntity.setCreateUser(AuthUtil.getUserId());
            flowEntity.setWorkOrderId(entity.getId());
            flowEntity.setFlowName(newStatusEnum.getStageDesc());
            flowEntity.setFlowDesc(String.format("%s %s", AuthUtil.getUserName(), org.springblade.core.tool.utils.DateUtil.format(now, "yyyy-MM-dd HH:mm:ss")));
            flowEntity.setOperator(AuthUtil.getUserName());
            flowEntity.setFlowDesc(newStatusEnum.getDesc());
            flowEntity.setOperator(AuthUtil.getNickName());
            flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue());
            flowEntity.setFlowStatus(newStatusEnum.getMaxCode());
            flowEntity.setWorkStatus(newStatusEnum.getCode());
            flowEntity.setAreaCode(entity.getAreaCode());
            flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
            return gdWorkOrderFlowService.save(flowEntity);
@@ -249,19 +241,21 @@
            flowEntity.setCreateUser(AuthUtil.getUserId());
            flowEntity.setWorkOrderId(workOrder.getId());
            flowEntity.setFlowName(newStatusEnum.getStageDesc());
            flowEntity.setFlowDesc(String.format("%s %s", AuthUtil.getUserName(), org.springblade.core.tool.utils.DateUtil.format(now, CommonConstant.YYYY_MM_DD_HH_MM_SS)));
            flowEntity.setOperator(AuthUtil.getUserName());
            flowEntity.setFlowDesc(newStatusEnum.getDesc());
            flowEntity.setOperator(AuthUtil.getNickName());
            flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue());
            flowEntity.setFlowStatus(newStatusEnum.getMaxCode());
            flowEntity.setWorkStatus(newStatusEnum.getCode());
            flowEntity.setAreaCode(workOrder.getAreaCode());
            flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
            return gdWorkOrderFlowService.save(flowEntity);
        }
        // 6. 把待验收的都改为待签收状态
        if (operationType == 10) {
            boolean update = gdPatrolTaskService.update(Wrappers.<GdPatrolTaskEntity>lambdaUpdate()
            return gdPatrolTaskService.update(Wrappers.<GdPatrolTaskEntity>lambdaUpdate()
                .set(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_SIGNING.getValue())
                .eq(GdPatrolTaskEntity::getWorkOrderId, workOrder.getId())
                .eq(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.PENDING_ACCEPTANCE.getValue())
                .eq(GdPatrolTaskEntity::getTaskStatus, PatrolTaskStatusEnum.AUDIT_PASSED.getValue())
            );
        }