# 任务状态流转规则说明 ## 📋 概述 本文档说明转运任务的状态流转规则,包括正常流程和兼容旧数据的特殊规则。 --- ## 🔄 状态定义 ### 标准状态(新系统) | 状态码 | 状态名称 | 说明 | 样式 | |--------|---------|------|------| | `PENDING` | 待处理 | 任务已创建,等待出发 | warning | | `DEPARTING` | 出发中 | 任务已出发,前往目的地 | primary | | `ARRIVED` | 已到达 | 已到达目的地 | primary | | `RETURNING` | 返程中 | 任务返程中 | primary | | `COMPLETED` | 已完成 | 任务已完成(终态) | success | | `CANCELLED` | 已取消 | 任务已取消(终态) | danger | ### 兼容状态(旧系统) | 状态码 | 状态名称 | 说明 | 来源 | |--------|---------|------|------| | `IN_PROGRESS` | 任务中 | 任务执行中(兼容旧数据) | 旧系统状态码6 | --- ## 🚦 状态流转规则 ### 1. 正常流程 ```mermaid graph LR A[PENDING
待处理] --> B[DEPARTING
出发中] B --> C[ARRIVED
已到达] C --> D[RETURNING
返程中] D --> E[COMPLETED
已完成] A -.取消.-> F[CANCELLED
已取消] B -.取消.-> F C -.取消.-> F ``` **流转路径**: - `PENDING` → `DEPARTING` → `ARRIVED` → `RETURNING` → `COMPLETED` - 任何状态(除COMPLETED外)→ `CANCELLED` --- ### 2. 兼容旧数据流程 ```mermaid graph TD A[IN_PROGRESS
任务中
旧数据] --> B[PENDING
待处理] A --> C[ARRIVED
已到达] A --> D[RETURNING
返程中] A --> E[COMPLETED
已完成] A --> F[CANCELLED
已取消] style A fill:#ffeaa7,stroke:#fdcb6e style B fill:#74b9ff,stroke:#0984e3 style C fill:#74b9ff,stroke:#0984e3 style D fill:#74b9ff,stroke:#0984e3 style E fill:#55efc4,stroke:#00b894 style F fill:#ff7675,stroke:#d63031 ``` **说明**: - `IN_PROGRESS` 是为了兼容旧系统的"服务中"状态(状态码6) - 允许向**5个状态**转换,提供最大灵活性 - 主要用于数据迁移和双系统并行期间 --- ## 📝 详细流转规则 ### PENDING(待处理) ✅ **允许转换到**: - `DEPARTING`(出发中)- 开始执行任务 - `CANCELLED`(已取消)- 取消任务 ❌ **不允许转换到**:其他所有状态 --- ### DEPARTING(出发中) ✅ **允许转换到**: - `ARRIVED`(已到达)- 到达目的地 - `CANCELLED`(已取消)- 取消任务 ❌ **不允许转换到**:其他所有状态 --- ### ARRIVED(已到达) ✅ **允许转换到**: - `RETURNING`(返程中)- 开始返程 ❌ **不允许转换到**:其他所有状态 **注意**:已到达后只能返程,不能直接完成或取消 --- ### RETURNING(返程中) ✅ **允许转换到**: - `COMPLETED`(已完成)- 完成返程 ❌ **不允许转换到**:其他所有状态 --- ### IN_PROGRESS(任务中)⚠️ ✅ **允许转换到**: - `PENDING`(待处理)- 数据修正 - `ARRIVED`(已到达)- 补充状态 - `RETURNING`(返程中)- 进入返程 ⭐ **新增** - `COMPLETED`(已完成)- 强制完成 - `CANCELLED`(已取消)- 取消任务 ❌ **不允许转换到**:其他所有状态 **使用场景**: 1. 旧系统数据迁移 2. 状态补偿修正 3. 特殊业务流程 --- ### COMPLETED(已完成) ✅ **允许转换到**:无 ❌ **不允许转换到**:任何状态 **说明**:终态,不允许任何变更 --- ### CANCELLED(已取消) ✅ **允许转换到**:无 ❌ **不允许转换到**:任何状态 **说明**:终态,不允许任何变更 --- ## 💻 代码实现 ### 方法1: SysTask.canChangeStatus() ```java public boolean canChangeStatus(TaskStatus newStatus) { TaskStatus currentStatus = TaskStatus.getByCode(this.taskStatus); switch (currentStatus) { case IN_PROGRESS: // 兼容旧数据:任务中 -> 已完成、已取消、待处理、已到达、返程中 return newStatus == TaskStatus.COMPLETED || newStatus == TaskStatus.CANCELLED || newStatus == TaskStatus.PENDING || newStatus == TaskStatus.ARRIVED || newStatus == TaskStatus.RETURNING; // ... 其他状态 } } ``` ### 方法2: TaskStatusValidator.canTransition() ```java // IN_PROGRESS -> COMPLETED, CANCELLED, PENDING, ARRIVED, RETURNING Set inProgressTransitions = new HashSet<>(); inProgressTransitions.add(TaskStatus.COMPLETED); inProgressTransitions.add(TaskStatus.CANCELLED); inProgressTransitions.add(TaskStatus.PENDING); inProgressTransitions.add(TaskStatus.ARRIVED); inProgressTransitions.add(TaskStatus.RETURNING); ALLOWED_TRANSITIONS.put(TaskStatus.IN_PROGRESS, inProgressTransitions); ``` --- ## 🔍 常见问题 ### Q1: 为什么IN_PROGRESS可以转换到这么多状态? **A**: 因为IN_PROGRESS是旧系统的"服务中"状态,旧系统的状态粒度较粗,无法准确对应新系统的细分状态。为了兼容旧数据和保证业务连续性,允许向多个状态转换。 ### Q2: 新建的任务会是IN_PROGRESS状态吗? **A**: 不会。新系统创建的任务初始状态是PENDING,正常流转不会经过IN_PROGRESS。IN_PROGRESS只用于: 1. 旧系统数据同步 2. 历史数据迁移 3. 数据修正场景 ### Q3: IN_PROGRESS能直接到COMPLETED吗? **A**: 可以。通过"强制完成"按钮可以直接完成任务,跳过中间状态。 ### Q4: 如何判断任务是否可以操作? **A**: 使用 `canChangeStatus(newStatus)` 方法: ```java SysTask task = ...; if (task.canChangeStatus(TaskStatus.RETURNING)) { // 允许转换到返程中 } ``` --- ## 📊 状态流转矩阵 | 当前状态 ↓ / 目标状态 → | PENDING | DEPARTING | ARRIVED | RETURNING | COMPLETED | CANCELLED | IN_PROGRESS | |------------------------|---------|-----------|---------|-----------|-----------|-----------|-------------| | **PENDING** | - | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | | **DEPARTING** | ❌ | - | ✅ | ❌ | ❌ | ✅ | ❌ | | **ARRIVED** | ❌ | ❌ | - | ✅ | ❌ | ❌ | ❌ | | **RETURNING** | ❌ | ❌ | ❌ | - | ✅ | ❌ | ❌ | | **IN_PROGRESS** ⚠️ | ✅ | ❌ | ✅ | ✅ ⭐ | ✅ | ✅ | - | | **COMPLETED** | ❌ | ❌ | ❌ | ❌ | - | ❌ | ❌ | | **CANCELLED** | ❌ | ❌ | ❌ | ❌ | ❌ | - | ❌ | **图例**: - ✅ 允许转换 - ❌ 不允许转换 - ⭐ 本次新增 - ⚠️ 兼容旧数据 --- ## 🔧 相关文件 ### 代码文件 - [SysTask.java](file:///d:/project/急救转运/code/Api/RuoYi-Vue-master/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java) - 任务实体,包含canChangeStatus方法 - [TaskStatusValidator.java](file:///d:/project/急救转运/code/Api/RuoYi-Vue-master/ruoyi-system/src/main/java/com/ruoyi/system/utils/TaskStatusValidator.java) - 状态验证器 - [TaskStatus.java](file:///d:/project/急救转运/code/Api/RuoYi-Vue-master/ruoyi-system/src/main/java/com/ruoyi/system/domain/enums/TaskStatus.java) - 状态枚举 ### SQL文件 - [update_task_status_dict.sql](file:///d:/project/急救转运/code/Api/RuoYi-Vue-master/sql/update_task_status_dict.sql) - 状态字典初始化 ### 前端文件 - [detail.vue](file:///d:/project/急救转运/code/Api/RuoYi-Vue-master/app/pagesTask/detail.vue) - 任务详情页(包含状态按钮) --- ## 📅 更新记录 | 日期 | 版本 | 说明 | 修改人 | |------|------|------|--------| | 2026-01-12 | v1.1 | 新增 IN_PROGRESS → RETURNING 流转规则 | Qoder | | 2025-01-XX | v1.0 | 初始版本,定义基础状态流转规则 | - | --- **文档版本**: v1.1 **最后更新**: 2026-01-12 **维护人**: Qoder AI Assistant