# 驾驶员任务管理 - 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. 用户点击接收按钮