生产管理系统前端 - 更新瓦力提交的产品原型到参考目录
This commit is contained in:
409
src/ROUTE_PLANNING_FIELD_REQUIRED.md
Normal file
409
src/ROUTE_PLANNING_FIELD_REQUIRED.md
Normal file
@@ -0,0 +1,409 @@
|
||||
# ✅ 作业路线规划 - 强制关联地块
|
||||
|
||||
## 🎯 重大更新
|
||||
|
||||
**作业路线规划现在必须关联地块,不再允许手动绘制边界**
|
||||
|
||||
---
|
||||
|
||||
## 📦 更新内容
|
||||
|
||||
### 1️⃣ **强制选择地块**
|
||||
|
||||
- ✅ 创建路线时必须选择地块
|
||||
- ✅ 移除"不选择地块"/"手动绘制边界"选项
|
||||
- ✅ 未选择地块时无法创建路线
|
||||
|
||||
### 2️⃣ **移除手动绘制功能**
|
||||
|
||||
- ❌ 移除"绘制边界"按钮功能
|
||||
- ✅ 地块边界完全由系统自动加载
|
||||
- ✅ "绘制边界"按钮改为"✓ 边界已加载"(禁用状态)
|
||||
|
||||
### 3️⃣ **界面优化**
|
||||
|
||||
- ✅ 页面标题添加"必须关联地块"徽章
|
||||
- ✅ 对话框说明更新为必选提示
|
||||
- ✅ 地块选择标记为必填项(*)
|
||||
- ✅ 未选择地块时显示警告提示
|
||||
|
||||
---
|
||||
|
||||
## 🎨 界面展示
|
||||
|
||||
### 页面标题
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────┐
|
||||
│ 作业路线规划 │
|
||||
│ 基于地块信息智能规划全覆盖无重复的作业路线 │
|
||||
│ [必须关联地块] ← 橙色徽章提示 │
|
||||
└──────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 地块选择对话框
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ 选择地块 │
|
||||
│ 作业路线规划必须关联地块, │
|
||||
│ 请从地块管理系统中选择一个地块 │
|
||||
├─────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 选择地块 * ← 必填标记 │
|
||||
│ [请选择地块 ▼] │
|
||||
│ • 📍 东一地块 (50亩 · 东区) │
|
||||
│ • 📍 西二地块 (80亩 · 西区) │
|
||||
│ • 📍 南三地块 (35亩 · 南区) │
|
||||
│ │
|
||||
│ ┌───────────────────────────────────┐ │
|
||||
│ │ 📍 地块信息 │ │
|
||||
│ │ 地块名称: 东一地块 │ │
|
||||
│ │ 地块面积: 50 亩 │ │
|
||||
│ │ 所在位置: 东区 │ │
|
||||
│ │ 土壤类型: 壤土 │ │
|
||||
│ └───────────────────────────────────┘ │
|
||||
│ │
|
||||
│ [取消] [✓ 确认创建] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 未选择地块时的警告
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ ⚠️ 请选择地块, │
|
||||
│ 作业路线规划必须关联地块信息 │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 无可用地块时的错误提示
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ ❌ 暂无可用地块, │
|
||||
│ 请先在地块管理系统中添加地块 │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 地图区域
|
||||
|
||||
```
|
||||
┌────────────────────────────────────────┐
|
||||
│ 📍 关联地块 │
|
||||
│ ✓ 东一地块 │
|
||||
│ 地块边界已自动加载 │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
┌────────────────────────────────────────┐
|
||||
│ 规划地图 │
|
||||
│ ✓ 东一地块 - 地块边界已加载 │
|
||||
│ │
|
||||
│ [✓ 边界已加载] [标注障碍] │ ← 绘制边界按钮禁用
|
||||
└────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术实现
|
||||
|
||||
### 创建路线验证
|
||||
|
||||
```typescript
|
||||
const confirmCreateRoute = () => {
|
||||
// 强制要求选择地块
|
||||
if (!selectedFieldId || selectedFieldId === 'none') {
|
||||
toast.error('请选择地块,作业路线规划必须关联地块');
|
||||
return;
|
||||
}
|
||||
|
||||
// 使用选中的地块边界
|
||||
const selectedField = fields.find(f => f.id === selectedFieldId);
|
||||
if (!selectedField) {
|
||||
toast.error('未找到选中的地块');
|
||||
return;
|
||||
}
|
||||
|
||||
// 自动加载地块边界
|
||||
const fieldBoundary = selectedField.coordinates.map(coord => ({
|
||||
lng: coord.lng * 10 + 100,
|
||||
lat: coord.lat * 10 + 100,
|
||||
}));
|
||||
|
||||
// 创建路线(必须有地块信息)
|
||||
const newRoute: RoutePlan = {
|
||||
id: `route-${Date.now()}`,
|
||||
name: `${selectedField.name}作业路线`,
|
||||
fieldId: selectedField.id, // 必须有
|
||||
fieldName: selectedField.name, // 必须有
|
||||
fieldBoundary, // 必须有
|
||||
// ...
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
### 地块选择下拉框
|
||||
|
||||
```tsx
|
||||
<Select value={selectedFieldId} onValueChange={setSelectedFieldId}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="请选择地块" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{/* 移除了 "不选择地块" 选项 */}
|
||||
{fields.filter(f => f.status === 'active').map(field => (
|
||||
<SelectItem key={field.id} value={field.id}>
|
||||
📍 {field.name} ({field.area}亩 · {field.location})
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
```
|
||||
|
||||
### 确认按钮禁用逻辑
|
||||
|
||||
```tsx
|
||||
<Button
|
||||
onClick={confirmCreateRoute}
|
||||
disabled={
|
||||
!selectedFieldId ||
|
||||
selectedFieldId === 'none' ||
|
||||
fields.filter(f => f.status === 'active').length === 0
|
||||
}
|
||||
>
|
||||
<CheckCircle className="w-4 h-4 mr-2" />
|
||||
确认创建
|
||||
</Button>
|
||||
```
|
||||
|
||||
### 绘制边界按钮(禁用)
|
||||
|
||||
```tsx
|
||||
<Button
|
||||
size="sm"
|
||||
variant="outline"
|
||||
disabled
|
||||
title="地块边界已自动加载"
|
||||
>
|
||||
<Square className="w-4 h-4 mr-1" />
|
||||
✓ 边界已加载
|
||||
</Button>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 更新前 vs 更新后
|
||||
|
||||
| 功能 | 更新前 | 更新后 |
|
||||
|------|--------|--------|
|
||||
| 地块选择 | 可选 | **必选** ✅ |
|
||||
| 手动绘制边界 | 支持 | **不支持** ❌ |
|
||||
| "不选择地块"选项 | 有 | **已移除** ❌ |
|
||||
| 绘制边界按钮 | 可用 | **禁用** ❌ |
|
||||
| 地块边界加载 | 可选 | **强制自动加载** ✅ |
|
||||
| 无地块时创建 | 允许 | **不允许** ❌ |
|
||||
| 路线-地块关联 | 可选 | **100%关联** ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 强制关联的好处
|
||||
|
||||
### 1. 数据完整性
|
||||
|
||||
- ✅ 每条路线都有明确的地块信息
|
||||
- ✅ 数据可追溯性100%
|
||||
- ✅ 消除孤立的路线数据
|
||||
|
||||
### 2. 管理规范性
|
||||
|
||||
- ✅ 统一的数据管理标准
|
||||
- ✅ 地块-路线-作业完整链条
|
||||
- ✅ 便于后续数据分析
|
||||
|
||||
### 3. 业务合理性
|
||||
|
||||
- ✅ 符合农业生产实际
|
||||
- ✅ 路线必定对应实际地块
|
||||
- ✅ 避免虚拟或临时路线
|
||||
|
||||
### 4. 系统集成性
|
||||
|
||||
- ✅ 与地块管理系统深度集成
|
||||
- ✅ 数据流转更顺畅
|
||||
- ✅ 便于跨系统查询
|
||||
|
||||
---
|
||||
|
||||
## 📋 用户操作流程
|
||||
|
||||
### 标准流程(唯一流程)
|
||||
|
||||
```
|
||||
1. 确保地块管理系统中已有地块
|
||||
↓
|
||||
2. 点击"新建规<E5BBBA><E8A784>"
|
||||
↓
|
||||
3. 在对话框中选择地块(必选)
|
||||
↓
|
||||
4. 查看地块信息预览
|
||||
↓
|
||||
5. 点击"确认创建"
|
||||
↓
|
||||
6. 地块边界自动加载
|
||||
↓
|
||||
7. 路线自动命名为"{地块名称}作业路线"
|
||||
↓
|
||||
8. 标注障碍物(可选)
|
||||
↓
|
||||
9. 设置作业参数
|
||||
↓
|
||||
10. 生成作业路线
|
||||
↓
|
||||
11. 保存并导出
|
||||
```
|
||||
|
||||
### 异常处理
|
||||
|
||||
#### 情况1: 未选择地块直接点确认
|
||||
|
||||
```
|
||||
❌ 提示: "请选择地块,作业路线规划必须关联地块"
|
||||
→ 无法创建路线
|
||||
→ 必须选择地块后才能继续
|
||||
```
|
||||
|
||||
#### 情况2: 没有可用地块
|
||||
|
||||
```
|
||||
❌ 显示: "暂无可用地块,请先在地块管理系统中添加地块"
|
||||
→ 确认按钮禁用
|
||||
→ 需要先去地块管理添加地块
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 验证清单
|
||||
|
||||
### 创建路线时
|
||||
|
||||
- [x] ✅ 对话框说明为"必须关联地块"
|
||||
- [x] ✅ 地块选择标记为必填(*)
|
||||
- [x] ✅ 无"不选择地块"选项
|
||||
- [x] ✅ 未选择地块时显示警告
|
||||
- [x] ✅ 未选择地块时确认按钮禁用
|
||||
- [x] ✅ 选择地块后显示地块信息
|
||||
- [x] ✅ 确认创建后边界自动加载
|
||||
|
||||
### 地图区域
|
||||
|
||||
- [x] ✅ 显示关联地块信息卡片
|
||||
- [x] ✅ "绘制边界"按钮改为"✓ 边界已加载"
|
||||
- [x] ✅ "绘制边界"按钮禁用
|
||||
- [x] ✅ 悬停显示"地块边界已自动加载"
|
||||
|
||||
### 页面标题
|
||||
|
||||
- [x] ✅ 显示"必须关联地块"徽章
|
||||
- [x] ✅ 徽章为橙色,醒目提示
|
||||
|
||||
### 路线列表
|
||||
|
||||
- [x] ✅ 所有路线都显示地块名称
|
||||
- [x] ✅ 所有路线都有地块ID关联
|
||||
|
||||
---
|
||||
|
||||
## 🚨 重要提醒
|
||||
|
||||
### 1. 必须先维护地块
|
||||
|
||||
```
|
||||
⚠️ 使用路线规划功能前:
|
||||
1. 进入"地块管理"系统
|
||||
2. 添加至少一个地块
|
||||
3. 录入地块边界坐标
|
||||
4. 保存地块信息
|
||||
```
|
||||
|
||||
### 2. 地块状态要求
|
||||
|
||||
```
|
||||
⚠️ 只有"活跃"状态的地块可用:
|
||||
- 状态为"active"的地块会显示
|
||||
- 状态为"inactive"的地块不显示
|
||||
- 状态为"pending"的地块不显示
|
||||
```
|
||||
|
||||
### 3. 不能更改关联
|
||||
|
||||
```
|
||||
⚠️ 路线创建后地块关联不可更改:
|
||||
- 地块边界是路线的基础
|
||||
- 更改地块会导致路线失效
|
||||
- 如需更换地块,请创建新路线
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 数据要求
|
||||
|
||||
### 地块数据必备字段
|
||||
|
||||
```typescript
|
||||
interface Field {
|
||||
id: string; // ✅ 必须
|
||||
name: string; // ✅ 必须
|
||||
area: number; // ✅ 必须
|
||||
location: string; // ✅ 必须
|
||||
coordinates: GeoCoordinate[]; // ✅ 必须(边界坐标)
|
||||
status: 'active'; // ✅ 必须为 active
|
||||
// 其他字段...
|
||||
}
|
||||
```
|
||||
|
||||
### 路线数据保证
|
||||
|
||||
```typescript
|
||||
interface RoutePlan {
|
||||
id: string;
|
||||
name: string;
|
||||
fieldId: string; // ✅ 100% 有值
|
||||
fieldName: string; // ✅ 100% 有值
|
||||
fieldBoundary: RoutePoint[]; // ✅ 100% 有边界
|
||||
// 其他字段...
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
### ✅ 更新完成
|
||||
|
||||
1. ✅ 强制要求选择地块
|
||||
2. ✅ 移除手动绘制边界选项
|
||||
3. ✅ 禁用绘制边界按钮
|
||||
4. ✅ 100%地块关联保证
|
||||
5. ✅ 完善的验证和提示
|
||||
|
||||
### 🎯 核心价值
|
||||
|
||||
- **数据完整性**: 100%路线-地块关联
|
||||
- **管理规范性**: 统一的数据标准
|
||||
- **业务合理性**: 符合实际生产需求
|
||||
- **系统集成性**: 与地块系统深度集成
|
||||
|
||||
### 📊 影响范围
|
||||
|
||||
- ✅ 新建路线:必须选择地块
|
||||
- ✅ 地块边界:100%自动加载
|
||||
- ✅ 数据质量:100%可追溯
|
||||
- ✅ 用户操作:流程更规范
|
||||
|
||||
---
|
||||
|
||||
**更新时间**: 2025-10-17
|
||||
**版本**: v2.0
|
||||
**状态**: ✅ **强制关联地块已生效**
|
||||
|
||||
**重要**: 从此版本开始,作业路线规划必须关联地块,不再支持手动绘制边界。
|
||||
Reference in New Issue
Block a user