# ✅ 调度管理 - 新增任务与状态监控功能完成

## 📋 功能概述

为AI作物模型精准决策系统-调度管理新增了**调度任务创建**和**执行状态监控**功能，实现完整的任务调度生命周期管理。

## 🎯 实现功能

### 1️⃣ **新增调度任务**

#### 功能入口
- 在"调度规则"Tab页
- 新增绿色按钮："▶ 新增调度任务"
- 位于"新建规则"按钮旁边

#### 配置项目

##### 📝 任务基本信息
- **任务名称**：必填，描述性名称
- **优先级**：紧急/高/中/低

##### 🔧 应用选择
- **关联应用**：从可用应用列表选择
  - 智能灌溉策略生成
  - 病虫害智能预警
  - 精准施肥推荐
  - 作物产量预测

##### 💾 输入参数数据源配置

根据选择的应用，动态显示其所有输入字段，为每个字段配置数据源：

**示例：智能灌溉策略生成**
| 输入字段 | 数据源选项 |
|---------|----------|
| 土壤湿度 | 传感器实时数据 / 数据库查询 / 手动输入 / ... |
| 温度 | 传感器实时数据 / 气象站 / ... |
| 降水预报 | 第三方API / 气象站 / ... |
| 作物类型 | 配置文件 / 数据库查询 / ... |
| 生长阶段 | 数据库查询 / 手动输入 / ... |

**数据源选项**：
- 传感器实时数据
- 数据库查询
- 手动输入
- 第三方API
- 历史数据
- 配置文件
- IoT设备
- 气象站

##### ⏰ 时间策略

**1. 每天定时**
- 选择每天执行的时间（如：08:00）
- 适合日常例行任务

**2. 周期执行**
- 设置执行间隔（分钟）
- 适合频繁监测任务

**3. Cron表达式**
- 使用标准Cron格式
- 灵活自定义执行时间
- 示例：`0 8 * * *`（每天8点）

##### ⚡ 手动执行
- 对话框底部"手动执行"按钮
- 无需等待定时调度
- 立即触发任务运行
- 用于测试和紧急执行

#### 保存流程

1. 填写所有必填信息
2. 验证：
   - 任务名称不能为空
   - 必须选择应用
   - 所有输入字段必须配置数据源
3. 生成调度规则
4. 添加到调度规则列表
5. 显示成功提示

### 2️⃣ **任务详情与执行状态监控**

#### 功能入口
- 等待队列中的任务卡片 - "👁️ 查看详情"按钮
- 正在执行的任务卡片 - "👁️ 查看详情"按钮

#### 详情内容

##### 📋 任务基本信息
显示在顶部渐变卡片中：
- 任务编号（唯一标识）
- 任务名称
- 关联应用
- 优先级标签

##### 📊 执行状态监控（实时）

**三大监控指标卡片**：

**1. 当前状态**
- 动态图标（运行中时闪烁）
- 状态徽章
- 颜色编码：
  - 运行中：蓝色 + 动画
  - 已完成：绿色
  - 失败：红色
  - 等待中：灰色

**2. 执行时长**
- 实时显示已执行秒数
- 计时器图标

**3. 重试次数**
- 当前重试次数
- 最大重试限制
- 格式：`2 / 3`

**执行进度条**：
- 仅在"运行中"状态显示
- 百分比指示
- 动态更新

##### ⏰ 时间信息

四个时间维度：
- 计划执行时间（调度时间）
- 实际开始时间（任务启动）
- 实际结束时间（任务完成）
- 触发方式（Cron定时/周期间隔/...）

##### 📈 执行结果

根据任务状态显示不同内容：

**✓ 执行成功**
- 绿色成功标记
- 执行结果详情
- 白色卡片展示

**✗ 执行失败**
- 红色失败标记
- 错误信息详情
- 红色文本显示

**⏳ 正在执行**
- 蓝色动画图标
- "任务正在执行中，请等待..."
- 动画效果

**⌛ 等待中**
- 灰色时钟图标
- "任务等待执行中..."

##### 🎮 操作按钮

**运行中任务**：
- 黄色警告卡片
- 暂停按钮
- 取消按钮

**失败任务**：
- 红色警告卡片
- 重新执行按钮

## 💻 技术实现

### 数据结构

#### 新增任务表单数据
```typescript
const [newTaskData, setNewTaskData] = useState({
  name: '',                           // 任务名称
  applicationId: '',                  // 应用ID
  inputDataSources: {} as Record<string, string>,  // 字段->数据源映射
  priority: 'medium' as Priority,     // 优先级
  timeStrategy: 'cron' as 'cron' | 'interval' | 'daily',  // 时间策略
  cronExpression: '',                 // Cron表达式
  intervalMinutes: 60,                // 间隔分钟
  dailyTime: '08:00',                 // 每日时间
});
```

#### 可用应用列表
```typescript
const [availableApplications] = useState([
  {
    id: 'app-1',
    name: '智能灌溉策略生成',
    inputFields: ['土壤湿度', '温度', '降水预报', '作物类型', '生长阶段'],
  },
  // ... 更多应用
]);
```

#### 数据源选项
```typescript
const [dataSourceOptions] = useState([
  '传感器实时数据',
  '数据库查询',
  '手动输入',
  '第三方API',
  '历史数据',
  '配置文件',
  'IoT设备',
  '气象站',
]);
```

### 核心函数

#### 1. 打开新增任务对话框
```typescript
const handleOpenCreateTask = () => {
  setNewTaskData({
    name: '',
    applicationId: '',
    inputDataSources: {},
    priority: 'medium',
    timeStrategy: 'cron',
    cronExpression: '0 8 * * *',
    intervalMinutes: 60,
    dailyTime: '08:00',
  });
  setShowCreateTaskDialog(true);
};
```

#### 2. 保存调度任务
```typescript
const handleSaveTask = () => {
  // 1. 验证基本信息
  if (!newTaskData.name) {
    toast.error('请输入任务名称');
    return;
  }
  if (!newTaskData.applicationId) {
    toast.error('请选择应用');
    return;
  }

  // 2. 验证数据源配置
  const selectedApp = availableApplications.find(
    app => app.id === newTaskData.applicationId
  );
  if (selectedApp) {
    const missingFields = selectedApp.inputFields.filter(
      field => !newTaskData.inputDataSources[field]
    );
    if (missingFields.length > 0) {
      toast.error(`请为以下字段配置数据源：${missingFields.join('、')}`);
      return;
    }
  }

  // 3. 生成触发配置
  let triggerType: TriggerType = 'cron';
  let triggerConfig: any = {};

  if (newTaskData.timeStrategy === 'cron') {
    triggerType = 'cron';
    triggerConfig = { cron: newTaskData.cronExpression };
  } else if (newTaskData.timeStrategy === 'interval') {
    triggerType = 'interval';
    triggerConfig = { interval: newTaskData.intervalMinutes };
  } else if (newTaskData.timeStrategy === 'daily') {
    triggerType = 'cron';
    const [hour, minute] = newTaskData.dailyTime.split(':');
    triggerConfig = { cron: `${minute} ${hour} * * *` };
  }

  // 4. 创建调度规则
  const newRule: ScheduleRule = {
    id: `rule-${Date.now()}`,
    name: newTaskData.name,
    description: `任务数据源：${Object.entries(newTaskData.inputDataSources)
      .map(([k, v]) => `${k}=${v}`)
      .join(', ')}`,
    applicationId: newTaskData.applicationId,
    applicationName: selectedApp?.name || '',
    triggerType,
    triggerConfig,
    priority: newTaskData.priority,
    enabled: true,
    maxRetry: 3,
    retryStrategy: 'exponential',
    timeout: 300,
    concurrent: false,
    createdAt: new Date().toLocaleString('zh-CN'),
    updatedAt: new Date().toLocaleString('zh-CN'),
    totalRuns: 0,
    successRuns: 0,
    failedRuns: 0,
  };

  setScheduleRules([...scheduleRules, newRule]);
  setShowCreateTaskDialog(false);
  toast.success(`调度任务"${newTaskData.name}"创建成功！`);
};
```

#### 3. 手动执行任务
```typescript
const handleManualExecute = () => {
  if (!newTaskData.name) {
    toast.error('请输入任务名称');
    return;
  }
  if (!newTaskData.applicationId) {
    toast.error('请选择应用');
    return;
  }

  const selectedApp = availableApplications.find(
    app => app.id === newTaskData.applicationId
  );
  toast.success(`已手动触发任务："${newTaskData.name}"，应用：${selectedApp?.name}`);
};
```

#### 4. 查看任务详情
```typescript
const handleViewTaskDetail = (task: ScheduleTask) => {
  setSelectedTask(task);
  setShowTaskDetailDialog(true);
};
```

## 🎨 界面设计

### 新增调度任务对话框

```
╔═══════════════════════════════════════════════════╗
║ ▶ 新增调度任务                                     ║
║ 创建自动化调度任务，配置输入数据源和执行策略         ║
╠═══════════════════════════════════════════════════╣
║                                                   ║
║ 📄 任务基本信息                                    ║
║ ┌──────────────┐  ┌──────────────┐              ║
║ │ 任务名称 *    │  │ 优先级 *      │              ║
║ │ [输入框]      │  │ [中] ▼        │              ║
║ └──────────────┘  └──────────────┘              ║
║                                                   ║
║ 🔧 选择应用                                        ║
║ ┌───────────────────────────────┐                ║
║ │ 关联应用 *                     │                ║
║ │ [选择应用] ▼                   │                ║
║ └───────────────────────────────┘                ║
║                                                   ║
║ 💾 配置输入参数数据源                              ║
║ ┌─────────────┬─────────────────┐                ║
║ │ 土壤湿度 *   │ [选择数据源] ▼   │                ║
║ ├─────────────┼─────────────────┤                ║
║ │ 温度 *       │ [选择数据源] ▼   │                ║
║ ├─────────────┼─────────────────┤                ║
║ │ 降水预报 *   │ [选择数据源] ▼   │                ║
║ └─────────────┴─────────────────┘                ║
║                                                   ║
║ ⏰ 时间策略                                        ║
║ ┌───────────────────────────────┐                ║
║ │ 执行策略 *                     │                ║
║ │ [每天定时] ▼                   │                ║
║ └───────────────────────────────┘                ║
║ ┌───────────────────────────────┐                ║
║ │ 执行时间                       │                ║
║ │ [08:00] (时间选择器)            │                ║
║ └───────────────────────────────┘                ║
║                                                   ║
║ ⚠️ 保存后可以通过"手动触发"按钮立即执行任务         ║
║                                                   ║
╠═══════════════════════════════════════════════════╣
║ [⚡ 手动执行]       [取消]  [✓ 保存任务]           ║
╚═══════════════════════════════════════════════════╝
```

### 任务详情对话框

```
╔═══════════════════════════════════════════════════╗
║ 👁️ 任务执行详情                                    ║
║ 查看任务的详细信息和执行状态监控                     ║
╠═══════════════════════════════════════════════════╣
║                                                   ║
║ 📋 任务基本信息                                    ║
║ ┌────────────────────────────────────────────┐   ║
║ │ T202410230001 │ 土壤检测任务 │ 智能灌溉 │ 高 │   ║
║ └────────────────────────────────────────────┘   ║
║                                                   ║
║ 📊 执行状态监控                                    ║
║ ┌─────────┐ ┌─────────┐ ┌─────────┐            ║
║ │● 运行中  │ │⏱ 执行   │ │🔄 重试  │            ║
║ │         │ │  32秒   │ │  1/3   │            ║
║ └─────────┘ └─────────┘ └─────────┘            ║
║                                                   ║
║ ━━━━━━━━━━━━━━━━ 68% ━━━━━━━━━━━━━━━━            ║
║                                                   ║
║ ⏰ 时间信息                                        ║
║ ┌──────────────┬──────────────┐                 ║
║ │ 计划: 08:00  │ 开始: 08:00  │                 ║
║ ├──────────────┼──────────────┤                 ║
║ │ 结束: -      │ 触发: Cron   │                 ║
║ └──────────────┴──────────────┘                 ║
║                                                   ║
║ 📈 执行结果                                        ║
║ ┌────────────────────────────────────────────┐   ║
║ │ ⏳ 任务正在执行中，请等待...                   │   ║
║ └────────────────────────────────────────────┘   ║
║                                                   ║
║ ⚠️ 任务正在执行       [⏸ 暂停]  [⏹ 取消]         ║
║                                                   ║
╠═══════════════════════════════════════════════════╣
║                                      [关闭]        ║
╚═══════════════════════════════════════════════════╝
```

## 🧪 测试步骤

### 测试1: 新增调度任务 - 智能灌溉

**场景**：创建每天早上8点的土壤检测任务

**步骤**：
1. 访问 **AI作物模型** → **调度管理** → **调度规则** Tab
2. 点击 **"▶ 新增调度任务"** 按钮（绿色）
3. **基本信息**：
   - 任务名称：`每日土壤检测任务`
   - 优先级：`高`
4. **选择应用**：
   - 选择：`智能灌溉策略生成`
5. **配置数据源**（自动显示5个输入字段）：
   - 土壤湿度 → `传感器实时数据`
   - 温度 → `传感器实时数据`
   - 降水预报 → `第三方API`
   - 作物类型 → `配置文件`
   - 生长阶段 → `数据库查询`
6. **时间策略**：
   - 执行策略：`每天定时`
   - 执行时间：`08:00`
7. 点击 **"✓ 保存任务"**

**预期结果**：
- [ ] 显示成功提示：`调度任务"每日土壤检测任务"创建成功！`
- [ ] 对话框关闭
- [ ] 调度规则列表新增一条规则
- [ ] 规则名称：`每日土壤检测任务`
- [ ] 应用：`智能灌溉策略生成`
- [ ] 触发类型：`Cron定时`
- [ ] 优先级：`高`（橙色）
- [ ] 状态：`已启用`（绿色开关）

### 测试2: 配置周期执行任务

**场景**：创建每小时执行的病虫害监测任务

**步骤**：
1. 点击 **"▶ 新增调度任务"**
2. 任务名称：`病虫害实时监测`
3. 优先级：`紧急`
4. 选择应用：`病虫害智能预警`
5. 配置数据源：
   - 作物图像 → `IoT设备`
   - 温湿度 → `传感器实时数据`
   - 历史病害记录 → `数据库查询`
6. 时间策略：
   - 执行策略：`周期执行`
   - 执行间隔：`60` 分钟
7. 保存任务

**预期结果**：
- [ ] 创建成功
- [ ] 规则触发类型：`周期间隔`
- [ ] 优先级：`紧急`（红色）

### 测试3: 使用Cron表达式

**场景**：每周一早上8点执行施肥推荐

**步骤**：
1. 点击 **"▶ 新增调度任务"**
2. 任务名称：`周一施肥计划`
3. 选择应用：`精准施肥推荐`
4. 配置数据源（5个字段）：
   - N含量 → `数据库查询`
   - P含量 → `数据库查询`
   - K含量 → `数据库查询`
   - 作物品种 → `配置文件`
   - pH值 → `传感器实时数据`
5. 时间策略：
   - 执行策略：`Cron表达式`
   - Cron表达式：`0 8 * * 1`
6. 保存任务

**预期结果**：
- [ ] 创建成功
- [ ] 规则描述包含数据源信息

### 测试4: 验证数据源必填

**场景**：测试验证逻辑

**步骤**：
1. 点击 **"▶ 新增调度任务"**
2. 任务名称：`测试任务`
3. 选择应用：`智能灌溉策略生成`
4. **不配置任何数据源**
5. 直接点击 **"✓ 保存任务"**

**预期结果**：
- [ ] 显示错误提示：`请为以下字段配置数据源：土壤湿度、温度、降水预报、作物类型、生长阶段`
- [ ] 任务不保存
- [ ] 对话框保持打开

### 测试5: 手动执行功能

**场景**：测试手动触发任务

**步骤**：
1. 打开新增任务对话框
2. 任务名称：`手动测试任务`
3. 选择应用：`病虫害智能预警`
4. 配置所有数据源
5. **点击左下角 "⚡ 手动执行" 按钮**

**预期结果**：
- [ ] 显示成功提示：`已手动触发任务："手动测试任务"，应用：病虫害智能预警`
- [ ] 对话框保持打开（可以继续编辑）
- [ ] 任务未保存到列表（仅执行一次）

### 测试6: 查看任务详情 - 等待中任务

**场景**：查看等待队列中的任务详情

**步骤**：
1. 切换到 **"任务队列"** Tab
2. 在等待队列中找到一个任务
3. 点击任务卡片上的 **"👁️ 查看详情"** 按钮

**预期结果**：
- [ ] 打开任务详情对话框
- [ ] 显示任务基本信息（编号、名称、应用、优先级）
- [ ] 执行状态监控：
  - [ ] 当前状态：`⌛ 等待中`（灰色）
  - [ ] 执行时长：`0 秒`
  - [ ] 重试次数：`0 / 3`
- [ ] 时间信息：
  - [ ] 计划执行时间：已显示
  - [ ] 实际开始时间：`-`
  - [ ] 实际结束时间：`-`
  - [ ] 触发方式：显示具体类型
- [ ] 执行结果：`⌛ 任务等待执行中...`
- [ ] 无操作按钮

### 测试7: 查看任务详情 - 运行中任务

**场景**：查看正在执行的任务详情

**步骤**：
1. 切换到 **"概览"** Tab
2. 在"正在执行的任务"区域找到一个任务
3. 点击任务卡片上的 **"👁️ 查看详情"** 按钮

**预期结果**：
- [ ] 打开任务详情对话框
- [ ] 执行状态监控：
  - [ ] 当前状态：`● 运行中`（蓝色 + 闪烁动画）
  - [ ] 执行时长：动态数字（如 `32 秒`）
  - [ ] 重试次数：显示当前次数
  - [ ] **执行进度条**：显示百分比和动画
- [ ] 时间信息：
  - [ ] 实际开始时间：已显示
  - [ ] 实际结束时间：`-`
- [ ] 执行结果：`⏳ 任务正在执行中，请等待...`（蓝色 + 动画）
- [ ] 黄色操作卡片：
  - [ ] 显示 `⚠️ 任务正在执行`
  - [ ] [⏸ 暂停] 按钮
  - [ ] [⏹ 取消] 按钮

### 测试8: 查看任务详情 - 失败任务

**场景**：查看失败队列中的任务详情

**步骤**：
1. 切换到 **"任务队列"** Tab
2. 在失败任务区域找到一个红色背景的任务
3. 点击重试按钮旁边的 **查看详情**（需要先添加按钮）

或者：
1. 手动设置一个任务状态为 `failed`
2. 查看其详情

**预期结果**：
- [ ] 执行状态监控：
  - [ ] 当前状态：`✗ 失败`（红色）
  - [ ] 执行时长：显示失败时的时长
  - [ ] 重试次数：显示已重试次数
  - [ ] 无进度条
- [ ] 时间信息：
  - [ ] 实际开始时间：已显示
  - [ ] 实际结束时间：已显示
- [ ] 执行结果：
  - [ ] `✗ 执行失败`（红色标题）
  - [ ] 错误信息：红色文本显示具体错误
- [ ] 红色操作卡片：
  - [ ] 显示 `✗ 任务执行失败`
  - [ ] [🔄 重新执行] 按钮

### 测试9: 查看任务详情 - 已完成任务

**场景**：查看成功完成的任务详情

**步骤**：
1. 查看一个状态为 `completed` 的任务详情

**预期结果**：
- [ ] 执行状态监控：
  - [ ] 当前状态：`✓ 已完成`（绿色）
  - [ ] 执行时长：显示总执行时间
  - [ ] 重试次数：显示（一般为0）
  - [ ] 无进度条
- [ ] 时间信息：全部显示
- [ ] 执行结果：
  - [ ] `✓ 执行成功`（绿色标题）
  - [ ] 结果详情：白色背景
- [ ] 无操作按钮

## 💡 使用示例

### 示例1: 创建智能灌溉定时任务

**需求**：每天早晚两次检测土壤并生成灌溉方案

**配置**：
```
任务名称: 智能灌溉定时调度
应用: 智能灌溉策略生成
数据源:
  - 土壤湿度: 传感器实时数据
  - 温度: 传感器实时数据
  - 降水预报: 第三方API
  - 作物类型: 配置文件
  - 生长阶段: 数据库查询
优先级: 高
时间策略: Cron表达式
Cron: 0 6,18 * * * (每天6点和18点)
```

**结果**：系统每天自动在早上6点和晚上6点执行灌溉策略生成

### 示例2: 创建病虫害实时监测

**需求**：每小时检测一次病虫害情况

**配置**：
```
任务名称: 病虫害实时监测
应用: 病虫害智能预警
数据源:
  - 作物图像: IoT设备
  - 温湿度: 传感器实时数据
  - 历史病害记录: 数据库查询
优先级: 紧急
时间策略: 周期执行
间隔: 60 分钟
```

**结果**：系统每小时自动执行病虫害检测

### 示例3: 手动执行紧急任务

**场景**：发现异常需要立即运行分析

**操作**：
1. 打开新增任务对话框
2. 配置任务信息和数据源
3. 点击"⚡ 手动执行"按钮
4. 系统立即触发任务运行
5. 无需保存任务规则

## 🎯 功能特性

### ✅ 已实现

**新增调度任务**：
- [x] 任务基本信息配置
- [x] 应用选择（4个可用应用）
- [x] 动态输入参数列表
- [x] 数据源配置（8种数据源选项）
- [x] 优先级设置（4个级别）
- [x] 时间策略配置（3种策略）
- [x] 每天定时执行
- [x] 周期间隔执行
- [x] Cron表达式执行
- [x] 手动执行功能
- [x] 完整的输入验证
- [x] 保存到调度规则列表

**任务详情监控**：
- [x] 任务基本信息展示
- [x] 执行状态实时监控
- [x] 三大监控指标卡片
- [x] 动态状态图标和动画
- [x] 执行进度条（运行中）
- [x] 时间信息四维度
- [x] 执行结果展示
- [x] 状态化内容显示
- [x] 运行中任务操作（暂停/取消）
- [x] 失败任务重试
- [x] 查看详情按钮集成

### 🎨 用户体验优化

- 分步骤清晰的信息组织
- 彩色卡片区分不同配置区域
- 动态表单（根据应用显示字段）
- 实时验证和错误提示
- 成功/警告/错误的视觉反馈
- 状态化的图标和颜色
- 动画效果（运行中任务）
- 大尺寸对话框（易于操作）
- 完整的操作按钮
- 响应式布局

## 📝 注意事项

### 数据源配置
- 每个应用的输入字段不同
- 必须为所有字段配置数据源
- 数据源选项是预定义的8种类型
- 可以根据实际情况扩展数据源类型

### 时间策略
- **每天定时**：简单易用，适合日常任务
- **周期执行**：频繁监测，适合实时场景
- **Cron表达式**：最灵活，适合复杂场景

### 手动执行
- 手动执行不会保存任务规则
- 适用于测试和临时任务
- 仍需配置完整的数据源

### 状态监控
- 运行中状态有动画效果
- 进度条仅在运行中显示
- 失败任务显示错误详情
- 操作按钮根据状态动态显示

## 🔄 数据流程

### 创建任务流程
```
1. 点击"新增调度任务"
   ↓
2. 填写任务名称和优先级
   ↓
3. 选择应用
   ↓
4. 系统显示该应用的输入字段列表
   ↓
5. 为每个字段选择数据源
   ↓
6. 配置时间策略
   ↓
7. （可选）点击"手动执行"立即运行
   ↓
8. 点击"保存任务"
   ↓
9. 验证输入完整性
   ↓
10. 生成调度规则
   ↓
11. 添加到规则列表
   ↓
12. 显示成功提示
```

### 查看详情流程
```
1. 在任务队列或执行列表中找到任务
   ↓
2. 点击"查看详情"按钮
   ↓
3. 打开任务详情对话框
   ↓
4. 显示任务基本信息
   ↓
5. 实时更新执行状态监控
   ↓
6. 显示时间信息
   ↓
7. 根据状态显示执行结果
   ↓
8. 根据状态显示操作按钮
   ↓
9. 用户可以执行操作（暂停/取消/重试）
   ↓
10. 关闭对话框
```

## 🎉 完成状态

**✅ 调度管理功能已全面升级！**

现在用户可以：
1. ✅ 通过直观的对话框创建调度任务
2. ✅ 选择应用并配置输入参数的数据源
3. ✅ 灵活配置时间策略（定时/周期/每天）
4. ✅ 手动执行任务进行测试
5. ✅ 查看任务的完整执行详情
6. ✅ 实时监控任务执行状态
7. ✅ 对运行中和失败的任务执行操作

---

**最后更新时间**: 2024-10-23  
**功能状态**: ✅ 已完成  
**测试状态**: ⏳ 待测试
