11 KiB
11 KiB
✅ 作业路线规划 - 强制关联地块
🎯 重大更新
作业路线规划现在必须关联地块,不再允许手动绘制边界
📦 更新内容
1️⃣ 强制选择地块
- ✅ 创建路线时必须选择地块
- ✅ 移除"不选择地块"/"手动绘制边界"选项
- ✅ 未选择地块时无法创建路线
2️⃣ 移除手动绘制功能
- ❌ 移除"绘制边界"按钮功能
- ✅ 地块边界完全由系统自动加载
- ✅ "绘制边界"按钮改为"✓ 边界已加载"(禁用状态)
3️⃣ 界面优化
- ✅ 页面标题添加"必须关联地块"徽章
- ✅ 对话框说明更新为必选提示
- ✅ 地块选择标记为必填项(*)
- ✅ 未选择地块时显示警告提示
🎨 界面展示
页面标题
┌──────────────────────────────────────────────┐
│ 作业路线规划 │
│ 基于地块信息智能规划全覆盖无重复的作业路线 │
│ [必须关联地块] ← 橙色徽章提示 │
└──────────────────────────────────────────────┘
地块选择对话框
┌─────────────────────────────────────────┐
│ 选择地块 │
│ 作业路线规划必须关联地块, │
│ 请从地块管理系统中选择一个地块 │
├─────────────────────────────────────────┤
│ │
│ 选择地块 * ← 必填标记 │
│ [请选择地块 ▼] │
│ • 📍 东一地块 (50亩 · 东区) │
│ • 📍 西二地块 (80亩 · 西区) │
│ • 📍 南三地块 (35亩 · 南区) │
│ │
│ ┌───────────────────────────────────┐ │
│ │ 📍 地块信息 │ │
│ │ 地块名称: 东一地块 │ │
│ │ 地块面积: 50 亩 │ │
│ │ 所在位置: 东区 │ │
│ │ 土壤类型: 壤土 │ │
│ └───────────────────────────────────┘ │
│ │
│ [取消] [✓ 确认创建] │
└─────────────────────────────────────────┘
未选择地块时的警告
┌─────────────────────────────────────────┐
│ ⚠️ 请选择地块, │
│ 作业路线规划必须关联地块信息 │
└─────────────────────────────────────────┘
无可用地块时的错误提示
┌─────────────────────────────────────────┐
│ ❌ 暂无可用地块, │
│ 请先在地块管理系统中添加地块 │
└─────────────────────────────────────────┘
地图区域
┌────────────────────────────────────────┐
│ 📍 关联地块 │
│ ✓ 东一地块 │
│ 地块边界已自动加载 │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ 规划地图 │
│ ✓ 东一地块 - 地块边界已加载 │
│ │
│ [✓ 边界已加载] [标注障碍] │ ← 绘制边界按钮禁用
└────────────────────────────────────────┘
🔧 技术实现
创建路线验证
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, // 必须有
// ...
};
};
地块选择下拉框
<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>
确认按钮禁用逻辑
<Button
onClick={confirmCreateRoute}
disabled={
!selectedFieldId ||
selectedFieldId === 'none' ||
fields.filter(f => f.status === 'active').length === 0
}
>
<CheckCircle className="w-4 h-4 mr-2" />
确认创建
</Button>
绘制边界按钮(禁用)
<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: 没有可用地块
❌ 显示: "暂无可用地块,请先在地块管理系统中添加地块"
→ 确认按钮禁用
→ 需要先去地块管理添加地块
✅ 验证清单
创建路线时
- ✅ 对话框说明为"必须关联地块"
- ✅ 地块选择标记为必填(*)
- ✅ 无"不选择地块"选项
- ✅ 未选择地块时显示警告
- ✅ 未选择地块时确认按钮禁用
- ✅ 选择地块后显示地块信息
- ✅ 确认创建后边界自动加载
地图区域
- ✅ 显示关联地块信息卡片
- ✅ "绘制边界"按钮改为"✓ 边界已加载"
- ✅ "绘制边界"按钮禁用
- ✅ 悬停显示"地块边界已自动加载"
页面标题
- ✅ 显示"必须关联地块"徽章
- ✅ 徽章为橙色,醒目提示
路线列表
- ✅ 所有路线都显示地块名称
- ✅ 所有路线都有地块ID关联
🚨 重要提醒
1. 必须先维护地块
⚠️ 使用路线规划功能前:
1. 进入"地块管理"系统
2. 添加至少一个地块
3. 录入地块边界坐标
4. 保存地块信息
2. 地块状态要求
⚠️ 只有"活跃"状态的地块可用:
- 状态为"active"的地块会显示
- 状态为"inactive"的地块不显示
- 状态为"pending"的地块不显示
3. 不能更改关联
⚠️ 路线创建后地块关联不可更改:
- 地块边界是路线的基础
- 更改地块会导致路线失效
- 如需更换地块,请创建新路线
📝 数据要求
地块数据必备字段
interface Field {
id: string; // ✅ 必须
name: string; // ✅ 必须
area: number; // ✅ 必须
location: string; // ✅ 必须
coordinates: GeoCoordinate[]; // ✅ 必须(边界坐标)
status: 'active'; // ✅ 必须为 active
// 其他字段...
}
路线数据保证
interface RoutePlan {
id: string;
name: string;
fieldId: string; // ✅ 100% 有值
fieldName: string; // ✅ 100% 有值
fieldBoundary: RoutePoint[]; // ✅ 100% 有边界
// 其他字段...
}
🎉 总结
✅ 更新完成
- ✅ 强制要求选择地块
- ✅ 移除手动绘制边界选项
- ✅ 禁用绘制边界按钮
- ✅ 100%地块关联保证
- ✅ 完善的验证和提示
🎯 核心价值
- 数据完整性: 100%路线-地块关联
- 管理规范性: 统一的数据标准
- 业务合理性: 符合实际生产需求
- 系统集成性: 与地块系统深度集成
📊 影响范围
- ✅ 新建路线:必须选择地块
- ✅ 地块边界:100%自动加载
- ✅ 数据质量:100%可追溯
- ✅ 用户操作:流程更规范
更新时间: 2025-10-17
版本: v2.0
状态: ✅ 强制关联地块已生效
重要: 从此版本开始,作业路线规划必须关联地块,不再支持手动绘制边界。