生产管理系统前端 - 更新瓦力提交的产品原型到参考目录
This commit is contained in:
610
src/PLAN_DISPATCH_START_TIME.md
Normal file
610
src/PLAN_DISPATCH_START_TIME.md
Normal file
@@ -0,0 +1,610 @@
|
||||
# ✅ 作业方案下发 - 计划开始时间功能
|
||||
|
||||
## 🎯 功能说明
|
||||
|
||||
**在作业方案下发功能中增加"计划开始时间"字段,便于提前规划作业时间**
|
||||
|
||||
---
|
||||
|
||||
## 📦 功能更新
|
||||
|
||||
### 1️⃣ **数据结构更新**
|
||||
|
||||
在 `DispatchRecord` 接口中添加计划开始时间字段:
|
||||
|
||||
```typescript
|
||||
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️⃣ **新建下发对话框**
|
||||
|
||||
在新建下发对话框中添加计划开始时间输入框:
|
||||
|
||||
```tsx
|
||||
<div>
|
||||
<Label>计划开始时间</Label>
|
||||
<Input
|
||||
type="datetime-local"
|
||||
value={plannedStartTime}
|
||||
onChange={(e) => setPlannedStartTime(e.target.value)}
|
||||
placeholder="选择计划开始时间(可选)"
|
||||
/>
|
||||
</div>
|
||||
```
|
||||
|
||||
### 3️⃣ **详情对话框显示**
|
||||
|
||||
在下发详情中显示计划开始时间:
|
||||
|
||||
```tsx
|
||||
<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️⃣ **示例数据更新**
|
||||
|
||||
更新示例数据包含计划开始时间:
|
||||
|
||||
```typescript
|
||||
{
|
||||
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: 常规计划作业
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "dispatch-1",
|
||||
"dispatchNumber": "D20251017001",
|
||||
"machineryName": "约翰迪尔拖拉机",
|
||||
"taskType": "耕地",
|
||||
"plannedStartTime": "2025-10-18T08:00:00",
|
||||
"status": "已发送",
|
||||
"priority": "high"
|
||||
}
|
||||
```
|
||||
|
||||
### 示例2: 立即作业(未设置计划时间)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "dispatch-2",
|
||||
"dispatchNumber": "D20251017002",
|
||||
"machineryName": "久保田播种机",
|
||||
"taskType": "播种",
|
||||
"plannedStartTime": undefined,
|
||||
"status": "已执行",
|
||||
"priority": "urgent"
|
||||
}
|
||||
```
|
||||
|
||||
### 示例3: 下午计划作业
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "dispatch-3",
|
||||
"dispatchNumber": "D20251017003",
|
||||
"machineryName": "雷沃施肥机",
|
||||
"taskType": "施肥",
|
||||
"plannedStartTime": "2025-10-17T14:30:00",
|
||||
"status": "待发送",
|
||||
"priority": "medium"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术实现
|
||||
|
||||
### 状态管理
|
||||
|
||||
```typescript
|
||||
const [plannedStartTime, setPlannedStartTime] = useState<string>('');
|
||||
```
|
||||
|
||||
### 输入控件
|
||||
|
||||
```tsx
|
||||
<Input
|
||||
type="datetime-local"
|
||||
value={plannedStartTime}
|
||||
onChange={(e) => setPlannedStartTime(e.target.value)}
|
||||
placeholder="选择计划开始时间(可选)"
|
||||
/>
|
||||
```
|
||||
|
||||
### 数据保存
|
||||
|
||||
```typescript
|
||||
const newDispatch: DispatchRecord = {
|
||||
// ... 其他字段
|
||||
plannedStartTime: plannedStartTime || undefined,
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
### 显示格式化
|
||||
|
||||
```typescript
|
||||
{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. 打开详情对话框
|
||||
|
||||
预期:
|
||||
✅ 显示计划开始时间字段
|
||||
✅ 有值显示格式化时间
|
||||
✅ 无值显示 "-"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 更新清单
|
||||
|
||||
### 数据结构
|
||||
- [x] ✅ DispatchRecord 接口添加 plannedStartTime 字段
|
||||
|
||||
### 状态管理
|
||||
- [x] ✅ 添加 plannedStartTime 状态
|
||||
|
||||
### 新建对话框
|
||||
- [x] ✅ 添加计划开始时间输入框
|
||||
- [x] ✅ datetime-local 类型控件
|
||||
- [x] ✅ 表单重置包含该字段
|
||||
|
||||
### 详情对话框
|
||||
- [x] ✅ 显示计划开始时间
|
||||
- [x] ✅ 格式化显示
|
||||
- [x] ✅ 未设置时显示 "-"
|
||||
|
||||
### 数据保存
|
||||
- [x] ✅ handleDispatch 函数保存该字段
|
||||
- [x] ✅ localStorage 持久化
|
||||
|
||||
### 示例数据
|
||||
- [x] ✅ 更新 mock 数据包含计划时间
|
||||
|
||||
---
|
||||
|
||||
## 📊 效果对比
|
||||
|
||||
### 更新前
|
||||
|
||||
```
|
||||
操作流程:
|
||||
1. 创建下发
|
||||
2. 选择农机和任务
|
||||
3. 设置参数
|
||||
4. 立即下发
|
||||
|
||||
问题:
|
||||
❌ 无法提前规划
|
||||
❌ 只能立即作业
|
||||
❌ 缺少时间计划
|
||||
```
|
||||
|
||||
### 更新后
|
||||
|
||||
```
|
||||
操作流程:
|
||||
1. 创建下发
|
||||
2. 选择农机和任务
|
||||
3. 设置计划时间 ✅
|
||||
4. 设置参数
|
||||
5. 下发
|
||||
|
||||
优势:
|
||||
✅ 可以提前规划
|
||||
✅ 支持立即作业
|
||||
✅ 支持计划作业
|
||||
✅ 时间管理更好
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
### ✅ 主要功能
|
||||
|
||||
1. ✅ **新增字段** - plannedStartTime 计划开始时间
|
||||
2. ✅ **输入控件** - datetime-local 时间选择器
|
||||
3. ✅ **详情显示** - 格式化显示计划时间
|
||||
4. ✅ **可选字段** - 不填写则立即作业
|
||||
5. ✅ **数据持久化** - localStorage 保存
|
||||
|
||||
### 🎯 核心价值
|
||||
|
||||
- **提前规划**: 可以安排未来的作业任务
|
||||
- **时间管理**: 明确的时间节点和计划
|
||||
- **灵活应对**: 支持立即作业和计划作业
|
||||
- **数据追溯**: 记录计划时间便于分析
|
||||
|
||||
### 📊 应用场景
|
||||
|
||||
- ✅ 提前规划明日作业
|
||||
- ✅ 安排全天多时段作业
|
||||
- ✅ 应急作业立即执行
|
||||
- ✅ 优化作业时间调度
|
||||
|
||||
---
|
||||
|
||||
**更新时间**: 2025-10-17
|
||||
**版本**: v2.4
|
||||
**状态**: ✅ **计划开始时间功能已完成**
|
||||
|
||||
**核心改进**: 作业方案下发增加计划开始时间字段,支持提前规划和时间管理!
|
||||
Reference in New Issue
Block a user