# 首页任务操作按钮统一说明 ## 修改背景 首页(`index.vue`)中的任务操作按钮逻辑需要与任务列表页(`task/index.vue`)保持一致,确保用户体验的统一性和操作逻辑的准确性。 ## 修改内容 ### 一、操作按钮显示逻辑 #### 修改前(旧逻辑) - 所有按钮都显示(出发、已到达、返程、结算、已完成) - 通过 `isActionDisabled()` 方法判断按钮是否禁用 - 禁用的按钮显示为灰色但仍然可见 - 有"结算"按钮(跳转到结算页面) #### 修改后(新逻辑) 根据任务状态**动态显示对应的操作按钮**,不显示不可用的按钮: | 任务状态 | 显示按钮 | 说明 | |---------|---------|------| | PENDING(待处理) | 出发、取消 | 初始状态,可以出发执行任务或取消任务 | | DEPARTING(出发中) | 已到达、强制结束 | 前往目的地途中,可以标记到达或强制结束 | | ARRIVED(已到达) | 已返程 | 已到达目的地,可以开始返程 | | RETURNING(返程中) | 已完成 | 返程途中,可以标记任务完成 | | COMPLETED(已完成) | 无按钮 | 任务已完成,不显示操作按钮 | | CANCELLED(已取消) | 无按钮 | 任务已取消,不显示操作按钮 | ### 二、代码实现 #### 1. 模板部分 **修改前:** ```html ``` **修改后:** ```html ``` #### 2. JavaScript 部分 **删除了:** ```javascript // 判断操作按钮是否禁用 isActionDisabled(task, action) { const taskStatus = task.taskStatus switch (action) { case 'depart': return taskStatus !== 'PENDING' case 'arrive': return taskStatus !== 'DEPARTING' case 'return': return taskStatus !== 'ARRIVED' case 'settle': return !['ARRIVED', 'RETURNING'].includes(taskStatus) case 'complete': return taskStatus !== 'RETURNING' default: return false } } ``` **修改了:** ```javascript // 处理任务操作 handleTaskAction(task, action) { switch (action) { case 'depart': // 出发 -> 状态变为出发中 this.$modal.confirm('确定要出发吗?').then(() => { this.updateTaskStatus(task.taskId, 'DEPARTING', '任务已出发') }).catch(() => {}); break; case 'cancel': // 取消 -> 二次确认后状态变为已取消 this.$modal.confirm('确定要取消此任务吗?').then(() => { this.updateTaskStatus(task.taskId, 'CANCELLED', '任务已取消') }).catch(() => {}); break; case 'arrive': // 已到达 -> 状态变为已到达 this.$modal.confirm('确认已到达目的地?').then(() => { this.updateTaskStatus(task.taskId, 'ARRIVED', '已到达目的地') }).catch(() => {}); break; case 'forceCancel': // 强制结束 -> 状态变为已取消 this.$modal.confirm('确定要强制结束此任务吗?').then(() => { this.updateTaskStatus(task.taskId, 'CANCELLED', '任务已强制结束') }).catch(() => {}); break; case 'return': // 已返程 -> 状态变为返程中 this.$modal.confirm('确认开始返程?').then(() => { this.updateTaskStatus(task.taskId, 'RETURNING', '已开始返程') }).catch(() => {}); break; case 'complete': // 已完成 -> 状态变为已完成 this.$modal.confirm('确认任务已完成?').then(() => { this.updateTaskStatus(task.taskId, 'COMPLETED', '任务已完成') }).catch(() => {}); break; } } ``` #### 3. 样式部分 新增了 `cancel` 按钮样式(红色背景): ```scss .action-btn { // ... 其他样式 &.primary { background-color: #007AFF; color: white; } &.cancel { background-color: #ff3b30; color: white; } } ``` ### 三、主要改进 #### 1. 用户体验优化 - ✅ **按钮更精简**:只显示当前状态可执行的操作,避免用户混淆 - ✅ **视觉清晰**:不显示禁用的灰色按钮,界面更整洁 - ✅ **操作明确**:每个状态下的操作路径清晰 #### 2. 逻辑一致性 - ✅ **与任务列表页一致**:首页和任务列表页的操作逻辑完全相同 - ✅ **状态流转明确**:遵循标准的任务状态流转:待处理→出发中→已到达→返程中→已完成 - ✅ **取消逻辑统一**:待处理状态可以"取消",出发中状态可以"强制结束" #### 3. 功能完善 - ✅ **新增取消功能**:待处理状态可以取消任务 - ✅ **新增强制结束**:出发中状态可以强制结束任务 - ✅ **移除结算按钮**:简化流程,结算功能可以在详情页处理 ### 四、操作流程图 ``` [待处理 PENDING] ├─ 出发 → [出发中 DEPARTING] └─ 取消 → [已取消 CANCELLED] [出发中 DEPARTING] ├─ 已到达 → [已到达 ARRIVED] └─ 强制结束 → [已取消 CANCELLED] [已到达 ARRIVED] └─ 已返程 → [返程中 RETURNING] [返程中 RETURNING] └─ 已完成 → [已完成 COMPLETED] [已完成 COMPLETED] (无操作) [已取消 CANCELLED] (无操作) ``` ### 五、GPS定位功能保留 所有状态变更操作都会: 1. 尝试获取GPS位置信息 2. 如果定位成功,将位置信息一并提交 3. 如果定位失败,询问用户是否继续更新状态 GPS信息包括: - 经纬度(latitude, longitude) - 地址信息(province, city, district, street) - GPS精度(gpsAccuracy) - 海拔(altitude) - 速度(speed) - 方向(heading) ### 六、测试建议 #### 功能测试 1. **待处理状态测试** - 点击"出发"按钮,确认状态变为"出发中" - 点击"取消"按钮,确认状态变为"已取消" 2. **出发中状态测试** - 点击"已到达"按钮,确认状态变为"已到达" - 点击"强制结束"按钮,确认状态变为"已取消" 3. **已到达状态测试** - 点击"已返程"按钮,确认状态变为"返程中" 4. **返程中状态测试** - 点击"已完成"按钮,确认状态变为"已完成" 5. **已完成/已取消状态测试** - 确认不显示任何操作按钮 #### GPS定位测试 1. 在有GPS信号的环境测试,确认位置信息正确提交 2. 在无GPS信号的环境测试,确认提示用户是否继续 3. 查看数据库中GPS信息是否正确保存 #### 一致性测试 1. 对比首页和任务列表页的按钮显示是否一致 2. 对比首页和任务列表页的操作流程是否一致 3. 对比首页和任务列表页的提示文字是否一致 ### 七、相关文件 - `app/pages/index.vue` - 首页(已修改) - `app/pages/task/index.vue` - 任务列表页(参考标准) - `app/api/task.js` - 任务API接口 ### 八、版本历史 - **v1.0** (2025-10-19): 统一首页和任务列表页的操作按钮逻辑 - 根据状态动态显示按钮 - 新增取消和强制结束功能 - 移除结算按钮 - 优化提示文字 - 新增cancel按钮样式