# 驾驶员任务管理 - AlertDialog 二次确认更新 ## 📅 更新时间 2025-10-16 ## 🎯 更新概述 将驾驶员任务管理中的关键操作从浏览器原生 `confirm` 弹窗升级为系统内的 **AlertDialog** 组件,提供更统一、更美观的用户体验。 ## ✨ 主要变更 ### 1. 替换浏览器原生确认 **变更前** ❌: ```javascript if (confirm(`确定要取消任务 ${task.taskNumber} 吗?`)) { handleUpdateStatus(taskId, '已取消'); } ``` - 使用浏览器原生 `confirm()` 函数 - 样式无法定制 - 与系统UI风格不一致 **变更后** ✅: ```tsx 确认取消任务 ... 我再想想 确认取消 ``` - 使用 ShadCN AlertDialog 组件 - 统一的系统UI风格 - 可定制的样式和交互 ### 2. 涉及的操作 #### ✅ 接收任务 **触发条件**: 点击待接收任务的"接收"按钮(CheckCircle 图标) **确认对话框**: - **标题**: 确认接收任务 - **内容**: 确定要接收任务 T202510160001 吗?接收后将由您负责执行此任务。 - **按钮**: - 取消(灰色) - 确认接收(绿色,bg-green-600) **操作流程**: ``` 点击接收按钮 ↓ 显示 AlertDialog ↓ 用户确认 ↓ 任务状态: 待接收 → 已接收 ↓ Toast 提示: "任务状态更新成功" ``` #### ❌ 取消任务 **触发条件**: 点击待接收或已接收任务的"取消"按钮(XCircle 图标,红色) **确认对话框**: - **标题**: 确认取消任务 - **内容**: 确定要取消任务 T202510160001 吗?**取消后将无法恢复,请谨慎操作。** - **按钮**: - 我再想想(灰色) - 确认取消(红色,bg-red-600) **操作流程**: ``` 点击取消按钮 ↓ 显示 AlertDialog(红色警告) ↓ 用户确认 ↓ 任务状态: 待接收/已接收 → 已取消 ↓ Toast 提示: "任务状态更新成功" ``` #### ✅ 完成任务 **触发条件**: 点击进行中任务的"完成"按钮 **确认对话框**: - **标题**: 确认完成任务 - **内容**: 确定要将任务 T202510160001 标记为已完成吗?完成后将自动记录实际结束时间并计算工时。 - **按钮**: - 取消(灰色) - 确认完成(紫色,bg-purple-600) **操作流程**: ``` 点击完成按钮 ↓ 显示 AlertDialog ↓ 用户确认 ↓ 任务状态: 进行中 → 已完成 记录结束时间 计算工时 ↓ Toast 提示: "任务状态更新成功" ``` ## 🎨 视觉设计 ### AlertDialog 样式规范 #### 接收任务对话框 ``` ┌─────────────────────────────────────┐ │ 确认接收任务 │ ├─────────────────────────────────────┤ │ 确定要接收任务 T202510160001 吗? │ │ 接收后将由您负责执行此任务。 │ ├─────────────────────────────────────┤ │ [取消] [确认接收] │ │ └─ 绿色 │ └─────────────────────────────────────┘ ``` #### 取消任务对话框 ``` ┌─────────────────────────────────────┐ │ 确认取消任务 │ ├─────────────────────────────────────┤ │ 确定要取消任务 T202510160001 吗? │ │ ⚠️ 取消后将无法恢复,请谨慎操作。 │ │ └─ 红色加粗强调 │ ├─────────────────────────────────────┤ │ [我再想想] [确认取消] │ │ └─ 红色 │ └─────────────────────────────────────┘ ``` #### 完成任务对话框 ``` ┌─────────────────────────────────────┐ │ 确认完成任务 │ ├─────────────────────────────────────┤ │ 确定要将任务 T202510160001 标记为 │ │ 已完成吗? │ │ 完成后将自动记录实际结束时间并计算 │ │ 工时。 │ ├─────────────────────────────────────┤ │ [取消] [确认完成] │ │ └─ 紫色 │ └─────────────────────────────────────┘ ``` ### 颜色规范 | 操作 | 按钮颜色 | Tailwind 类 | 语义 | |------|---------|-------------|------| | 接收任务 | 绿色 | bg-green-600 hover:bg-green-700 | 正向操作 | | 取消任务 | 红色 | bg-red-600 hover:bg-red-700 | 危险操作 | | 完成任务 | 紫色 | bg-purple-600 hover:bg-purple-700 | 完成状态 | ## 📁 修改文件 ### 1. `/components/machinery/driver/DriverTask.tsx` #### 新增导入 ```tsx import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '../../ui/alert-dialog'; ``` #### 新增状态 ```tsx // AlertDialog 状态 const [showAcceptConfirm, setShowAcceptConfirm] = useState(false); const [showCancelConfirm, setShowCancelConfirm] = useState(false); const [showCompleteConfirm, setShowCompleteConfirm] = useState(false); const [pendingTaskId, setPendingTaskId] = useState(null); ``` #### 新增函数 ```tsx // 接收任务确认 const handleAcceptTask = (taskId: string) => { setPendingTaskId(taskId); setShowAcceptConfirm(true); }; const confirmAcceptTask = () => { if (pendingTaskId) { handleUpdateStatus(pendingTaskId, '已接收'); } setShowAcceptConfirm(false); setPendingTaskId(null); }; // 取消任务确认 const handleCancelTask = (taskId: string) => { setPendingTaskId(taskId); setShowCancelConfirm(true); }; const confirmCancelTask = () => { if (pendingTaskId) { handleUpdateStatus(pendingTaskId, '已取消'); } setShowCancelConfirm(false); setPendingTaskId(null); }; // 完成任务确认 const handleCompleteTask = (taskId: string) => { setPendingTaskId(taskId); setShowCompleteConfirm(true); }; const confirmCompleteTask = () => { if (pendingTaskId) { handleUpdateStatus(pendingTaskId, '已完成'); } setShowCompleteConfirm(false); setPendingTaskId(null); }; ``` #### 更新按钮点击事件 ```tsx // 接收按钮 onClick={() => handleAcceptTask(task.id)} // 原: handleUpdateStatus(task.id, '已接收') // 取消按钮 onClick={() => handleCancelTask(task.id)} // 保持不变,但内部逻辑改为显示对话框 // 完成按钮 onClick={() => handleCompleteTask(task.id)} // 原: handleUpdateStatus(task.id, '已完成') ``` #### 新增 AlertDialog 组件 在组件 return 的末尾(所有 Dialog 之后)添加三个 AlertDialog。 ## 🔄 工作流程 ### 状态管理流程 ``` 用户点击操作按钮 ↓ 设置 pendingTaskId ↓ 显示对应的 AlertDialog ↓ 用户选择: ├─ 点击取消 → 关闭对话框,清空 pendingTaskId └─ 点击确认 → 执行操作,更新任务状态,关闭对话框,清空 pendingTaskId ``` ### 代码执行流程 ```typescript // 1. 用户点击接收按钮