Files
smart-crop-ui/src/PLAN_DISPATCH_START_TIME.md

14 KiB
Raw Blame History

作业方案下发 - 计划开始时间功能

🎯 功能说明

在作业方案下发功能中增加"计划开始时间"字段,便于提前规划作业时间


📦 功能更新

1 数据结构更新

DispatchRecord 接口中添加计划开始时间字段:

interface DispatchRecord {
  id: string;
  dispatchNumber: string;
  machineryId: string;
  machineryName: string;
  driverId?: string;
  driverName?: string;
  routePlanId?: string;
  routePlanName?: string;
  taskType: string;
  description: string;
  plannedStartTime?: string;  // ✅ 新增:计划开始时间
  parameters: {
    targetSpeed?: number;
    workingWidth?: number;
    workingDepth?: number;
    rowSpacing?: number;
    seedingRate?: number;
    fertilizerRate?: number;
    customParams?: Record<string, any>;
  };
  protocol: Protocol;
  status: DispatchStatus;
  dispatchedAt: string;
  receivedAt?: string;
  executedAt?: string;
  // ... 其他字段
}

2 新建下发对话框

在新建下发对话框中添加计划开始时间输入框:

<div>
  <Label>计划开始时间</Label>
  <Input
    type="datetime-local"
    value={plannedStartTime}
    onChange={(e) => setPlannedStartTime(e.target.value)}
    placeholder="选择计划开始时间(可选)"
  />
</div>

3 详情对话框显示

在下发详情中显示计划开始时间:

<div className="flex justify-between py-2 border-b">
  <span className="text-muted-foreground">计划开始时间:</span>
  <span className="text-xs">
    {selectedDispatch.plannedStartTime ? 
      new Date(selectedDispatch.plannedStartTime).toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit'
      }) : 
      <span className="text-muted-foreground">-</span>
    }
  </span>
</div>

4 示例数据更新

更新示例数据包含计划开始时间:

{
  id: 'dispatch-1',
  dispatchNumber: 'D20251017001',
  machineryName: '约翰迪尔拖拉机',
  taskType: '耕地',
  description: '深耕作业,准备春播',
  plannedStartTime: '2025-10-18T08:00:00',  // ✅ 计划明天早上8点开始
  // ...
}

🎨 界面展示

新建下发对话框

┌──────────────────────────────────────────┐
│  新建作业方案下发                         │
├──────────────────────────────────────────┤
│                                          │
│  [农机设备 *]  [约翰迪尔拖拉机 ▼]        │
│  [路线方案]    [东地1号作业路线 ▼]       │
│                                          │
│  [任务类型 *]  [耕地 ▼]                  │
│  [优先级]      [中 ▼]                    │
│                                          │
│  [任务描述]                              │
│  ┌────────────────────────────┐         │
│  │深耕作业,准备春播           │         │
│  └────────────────────────────┘         │
│                                          │
│  [计划开始时间] ✅ 新增                  │
│  ┌────────────────────────────┐         │
│  │📅 2025-10-18  🕐 08:00     │         │
│  └────────────────────────────┘         │
│                                          │
│  ---- 作业参数 ----                      │
│  [目标速率]  [5.0 km/h]                 │
│  [作业幅宽]  [2.5 m]                    │
│  [作业深度]  [25 cm]                    │
│  [行距]      [3.0 m]                    │
│                                          │
│  [通信协议]  [MQTT ▼]                   │
│                                          │
│              [取消]  [立即下发]          │
└──────────────────────────────────────────┘

下发详情对话框

┌──────────────────────────────────────────┐
│  下发详情                                 │
├──────────────────────────────────────────┤
│                                          │
│  下发编号:      D20251017001             │
│  农机设备:      约翰迪尔拖拉机           │
│  机手:          张三                     │
│  任务类型:      耕地                     │
│  路线方案:      东地1号作业路线          │
│  计划开始时间:  2025-10-18 08:00 ✅      │
│  优先级:        高                       │
│  通信协议:      MQTT                     │
│  下发时间:      2025-10-17 08:00:00     │
│  接收时间:      2025-10-17 08:01:30     │
│  执行时间:      2025-10-17 08:05:00     │
│                                          │
│  ---- 作业参数 ----                      │
│  目标速率:      5.0 km/h                │
│  作业幅宽:      2.5 m                   │
│  作业深度:      25 cm                   │
│                                          │
│  ---- 执行状态 ----                      │
│  当前状态:      已执行 ✅                │
│  设备状态:      在线 🟢                  │
│  信号强度:      85%                     │
│  重试次数:      0/3                     │
│                                          │
│              [关闭]  [导出记录]          │
└──────────────────────────────────────────┘

💡 使用场景

场景1: 提前规划明日作业

需求:
今天下午规划明天早上的耕地作业

操作:
1. 点击"新建下发"
2. 选择农机:约翰迪尔拖拉机
3. 选择任务类型:耕地
4. 设置计划开始时间:明天 08:00 ✅
5. 设置作业参数
6. 点击"立即下发"

结果:
✅ 下发指令创建成功
✅ 计划开始时间2025-10-18 08:00
✅ 机手提前知道明天的作业安排

场景2: 安排多个时间段作业

需求:
安排全天多个作业任务

上午作业:
- 计划开始时间08:00
- 任务:耕地
- 农机拖拉机1号

下午作业:
- 计划开始时间14:00
- 任务:播种
- 农机播种机2号

晚间作业:
- 计划开始时间18:00
- 任务:施肥
- 农机施肥机3号

结果:
✅ 三个任务都设置了明确的计划时间
✅ 机手可以按时间表执行
✅ 提高作业效率和组织性

场景3: 应急作业(不设置计划时间)

需求:
紧急抢收,立即作业

操作:
1. 点击"新建下发"
2. 选择农机
3. 任务类型:收获
4. 优先级:紧急
5. 计划开始时间:不填写(立即开始)✅
6. 点击"立即下发"

结果:
✅ 下发指令立即创建
✅ 计划开始时间:-(未设置)
✅ 机手收到后立即开始作业

🎯 字段特性

可选字段

计划开始时间是可选字段:
- ✅ 可以不填写(立即作业)
- ✅ 可以设置未来时间(计划作业)
- ✅ 可以设置今天稍后时间(延迟作业)

时间格式

输入格式:
datetime-local 类型

显示格式:
2025-10-18 08:00

存储格式:
ISO 8601 格式
"2025-10-18T08:00:00"

时间范围

建议范围:
- 最早:当前时间
- 最晚未来7天内

实际使用:
- 当天作业:当天时间
- 明日作业:明天时间
- 计划作业:未来任意时间

📊 数据示例

示例1: 常规计划作业

{
  "id": "dispatch-1",
  "dispatchNumber": "D20251017001",
  "machineryName": "约翰迪尔拖拉机",
  "taskType": "耕地",
  "plannedStartTime": "2025-10-18T08:00:00",
  "status": "已发送",
  "priority": "high"
}

示例2: 立即作业(未设置计划时间)

{
  "id": "dispatch-2",
  "dispatchNumber": "D20251017002",
  "machineryName": "久保田播种机",
  "taskType": "播种",
  "plannedStartTime": undefined,
  "status": "已执行",
  "priority": "urgent"
}

示例3: 下午计划作业

{
  "id": "dispatch-3",
  "dispatchNumber": "D20251017003",
  "machineryName": "雷沃施肥机",
  "taskType": "施肥",
  "plannedStartTime": "2025-10-17T14:30:00",
  "status": "待发送",
  "priority": "medium"
}

🔧 技术实现

状态管理

const [plannedStartTime, setPlannedStartTime] = useState<string>('');

输入控件

<Input
  type="datetime-local"
  value={plannedStartTime}
  onChange={(e) => setPlannedStartTime(e.target.value)}
  placeholder="选择计划开始时间(可选)"
/>

数据保存

const newDispatch: DispatchRecord = {
  // ... 其他字段
  plannedStartTime: plannedStartTime || undefined,
  // ... 
};

显示格式化

{selectedDispatch.plannedStartTime ? 
  new Date(selectedDispatch.plannedStartTime).toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit'
  }) : 
  <span className="text-muted-foreground">-</span>
}

📋 字段说明对比

更新前

下发记录字段:
- 下发编号
- 农机设备
- 机手
- 任务类型
- 路线方案
- 优先级
- 通信协议
- 下发时间      (系统自动记录)
- 接收时间      (设备反馈)
- 执行时间      (设备反馈)

更新后

下发记录字段:
- 下发编号
- 农机设备
- 机手
- 任务类型
- 路线方案
- 计划开始时间  ✅ 新增(用户设置)
- 优先级
- 通信协议
- 下发时间      (系统自动记录)
- 接收时间      (设备反馈)
- 执行时间      (设备反馈)

🎯 核心价值

1. 提前规划

价值:
✅ 可以提前安排第二天的作业
✅ 可以规划全天多个作业任务
✅ 提高作业组织性和计划性

2. 时间管理

价值:
✅ 明确的时间节点
✅ 避免时间冲突
✅ 优化资源调度

3. 灵活应对

价值:
✅ 可选字段,不强制填写
✅ 支持立即作业
✅ 支持计划作业

4. 数据追溯

价值:
✅ 记录计划时间
✅ 对比实际执行时间
✅ 分析作业准时率

🧪 测试用例

测试1: 设置明天的计划时间

操作:
1. 新建下发
2. 选择农机和任务
3. 计划开始时间:明天 08:00
4. 点击"立即下发"

预期:
✅ 下发创建成功
✅ plannedStartTime 字段保存
✅ 详情中显示 "2025-10-18 08:00"

测试2: 不设置计划时间(立即作业)

操作:
1. 新建下发
2. 选择农机和任务
3. 计划开始时间:留空
4. 点击"立即下发"

预期:
✅ 下发创建成功
✅ plannedStartTime 为 undefined
✅ 详情中显示 "-"

测试3: 设置今天下午的时间

操作:
1. 新建下发
2. 选择农机和任务
3. 计划开始时间:今天 14:30
4. 点击"立即下发"

预期:
✅ 下发创建成功
✅ plannedStartTime 保存今天下午时间
✅ 详情中显示 "2025-10-17 14:30"

测试4: 查看详情显示计划时间

操作:
1. 点击已有下发记录的"查看"
2. 打开详情对话框

预期:
✅ 显示计划开始时间字段
✅ 有值显示格式化时间
✅ 无值显示 "-"

更新清单

数据结构

  • DispatchRecord 接口添加 plannedStartTime 字段

状态管理

  • 添加 plannedStartTime 状态

新建对话框

  • 添加计划开始时间输入框
  • datetime-local 类型控件
  • 表单重置包含该字段

详情对话框

  • 显示计划开始时间
  • 格式化显示
  • 未设置时显示 "-"

数据保存

  • handleDispatch 函数保存该字段
  • localStorage 持久化

示例数据

  • 更新 mock 数据包含计划时间

📊 效果对比

更新前

操作流程:
1. 创建下发
2. 选择农机和任务
3. 设置参数
4. 立即下发

问题:
❌ 无法提前规划
❌ 只能立即作业
❌ 缺少时间计划

更新后

操作流程:
1. 创建下发
2. 选择农机和任务
3. 设置计划时间 ✅
4. 设置参数
5. 下发

优势:
✅ 可以提前规划
✅ 支持立即作业
✅ 支持计划作业
✅ 时间管理更好

🎉 总结

主要功能

  1. 新增字段 - plannedStartTime 计划开始时间
  2. 输入控件 - datetime-local 时间选择器
  3. 详情显示 - 格式化显示计划时间
  4. 可选字段 - 不填写则立即作业
  5. 数据持久化 - localStorage 保存

🎯 核心价值

  • 提前规划: 可以安排未来的作业任务
  • 时间管理: 明确的时间节点和计划
  • 灵活应对: 支持立即作业和计划作业
  • 数据追溯: 记录计划时间便于分析

📊 应用场景

  • 提前规划明日作业
  • 安排全天多时段作业
  • 应急作业立即执行
  • 优化作业时间调度

更新时间: 2025-10-17
版本: v2.4
状态: 计划开始时间功能已完成

核心改进: 作业方案下发增加计划开始时间字段,支持提前规划和时间管理!