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

14 KiB
Raw Blame History

作业路线规划 - 地块选择器优化

🎯 更新说明

根据用户反馈,优化了作业路线规划的地块选择流程:

  • 在地图绘制区域顶部添加地块选择卡片
  • 创建路线后,在绘制边界前先提示选择地块
  • 选择地块后自动加载边界,禁用手动绘制按钮

📦 更新内容

1 地块选择卡片(新增)

在地图区域的顶部新增了醒目的地块选择卡片:

未选择地块时

┌────────────────────────────────────────────────────┐
│  📍 关联地块                                        │
├────────────────────────────────────────────────────┤
│                                                    │
│  💡 建议先选择地块,系统将自动加载地块边界,        │
│     无需手动绘制                                    │
│                                                    │
│  [选择地块 ▼]  或手动绘制边界                      │
│    • 手动绘制(不选择地块)                         │
│    • 📍 东一地块 (50亩 · 东区)                     │
│    • 📍 西二地块 (80亩 · 西区)                     │
│    • 📍 南三地块 (35亩 · 南区)                     │
│                                                    │
└────────────────────────────────────────────────────┘

已选择地块时

┌────────────────────────────────────────────────────┐
│  📍 关联地块                                        │
├────────────────────────────────────────────────────┤
│                                                    │
│  ✓ 已选择: 东一地块                                │
│  地块边界已自动加载                                 │
│                                                    │
└────────────────────────────────────────────────────┘

2 绘制边界按钮状态优化

选择地块后

  • "绘制边界"按钮变为"✓ 边界已加载"
  • 按钮禁用(灰色)
  • 鼠标悬停显示提示"已关联地块,边界已自动加载"

未选择地块时

  • "绘制边界"按钮可点击
  • 允许手动绘制边界

3 工作流程优化

新的推荐流程

1. 点击"新建规划"
   ↓
2. 在"选择地块"对话框中选择地块
   ↓
3. 系统创建路线并自动加载地块边界
   ↓
4. 在地图上显示地块边界
   ↓
5. (可选)标注障碍物
   ↓
6. 设置作业参数
   ↓
7. 生成作业路线
   ↓
8. 保存并导出

备选流程(不选择地块)

1. 点击"新建规划"
   ↓
2. 选择"不选择(手动绘制边界)"
   ↓
3. 在地图区域看到地块选择卡片提示
   ↓
4. 可以:
   - 在下拉框选择地块(自动加载边界)
   - 或点击"绘制边界"手动绘制

🎨 界面展示

完整界面布局

┌──────────────────────────────────────────────────────────────┐
│  作业路线规划                           [新建规划]            │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────┐  ┌────────────────────────┐  ┌──────────────┐ │
│  │ 路线列表│  │      地图区域           │  │  作业参数    │ │
│  │         │  │                        │  │              │ │
│  │ ○ 路线1 │  │  ┌──────────────────┐  │  │ 行距: 3m     │ │
│  │ ○ 路线2 │  │  │📍 关联地块       │  │  │ 方向: 0°     │ │
│  │         │  │  │💡 建议先选择地块  │  │  │ 幅宽: 2.5m   │ │
│  │         │  │  │[选择地块 ▼]      │  │  │              │ │
│  │         │  │  └──────────────────┘  │  │ [生成路线]   │ │
│  │         │  │                        │  │ [保存路线]   │ │
│  │         │  │  ┌──────────────────┐  │  │ [导出路线]   │ │
│  │         │  │  │  规划地图         │  │  │              │ │
│  │         │  │  │  ┌────────────┐  │  │  │              │ │
│  │         │  │  │  │            │  │  │  │              │ │
│  │         │  │  │  │  Canvas    │  │  │  │              │ │
│  │         │  │  │  │            │  │  │  │              │ │
│  │         │  │  │  └────────────┘  │  │  │              │ │
│  │         │  │  └──────────────────┘  │  │              │ │
│  └─────────┘  └────────────────────────┘  └──────────────┘ │
└──────────────────────────────────────────────────────────────┘

地块选择卡片详细展示

卡片样式特点

  • 🎨 渐变背景: 蓝绿渐变 (from-blue-50 to-green-50)
  • 📍 图标标识: MapPin 图标
  • 💡 智能提示: 引导用户先选择地块
  • 状态反馈: 清晰的已选择/未选择状态

下拉选择器

[选择地块 ▼]
  ├─ 手动绘制(不选择地块)
  ├─ 📍 东一地块 (50亩 · 东区)
  ├─ 📍 西二地块 (80亩 · 西区)
  ├─ 📍 南三地块 (35亩 · 南区)
  └─ 📍 北四地块 (60亩 · 北区)

🔧 技术实现

地块选择卡片代码

{selectedRoute && (
  <Card className="p-4 bg-gradient-to-r from-blue-50 to-green-50 border-blue-200">
    <div>
      <h4 className="mb-3 text-blue-900 flex items-center gap-2">
        <MapPin className="w-4 h-4" />
        关联地块
      </h4>
      {selectedRoute.fieldName ? (
        // 已选择地块
        <div className="space-y-2">
          <Badge variant="outline" className="bg-white text-green-700">
             已选择: {selectedRoute.fieldName}
          </Badge>
          <span className="text-sm text-green-700">
            地块边界已自动加载
          </span>
        </div>
      ) : (
        // 未选择地块
        <div className="space-y-3">
          <p className="text-sm text-blue-700">
            💡 建议先选择地块,系统将自动加载地块边界,无需手动绘制
          </p>
          <Select 
            value="none" 
            onValueChange={(value) => {
              // 选择地块后自动加载边界
              const field = fields.find(f => f.id === value);
              if (field) {
                const fieldBoundary = field.coordinates.map(coord => ({
                  lng: coord.lng * 10 + 100,
                  lat: coord.lat * 10 + 100,
                }));
                // 更新路线信息
                const updatedRoute = {
                  ...selectedRoute,
                  fieldId: value,
                  fieldName: field.name,
                  fieldBoundary,
                  name: `${field.name}作业路线`,
                };
                // 保存更新
                setSelectedRoute(updatedRoute);
                setHasUnsavedChanges(true);
                toast.success(`已关联地块:${field.name},边界已自动加载`);
              }
            }}
          >
            <SelectTrigger className="w-64 bg-white">
              <SelectValue placeholder="选择地块" />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="none">手动绘制(不选择地块)</SelectItem>
              {fields.map(field => (
                <SelectItem key={field.id} value={field.id}>
                  📍 {field.name} ({field.area} · {field.location})
                </SelectItem>
              ))}
            </SelectContent>
          </Select>
        </div>
      )}
    </div>
  </Card>
)}

绘制边界按钮优化

<Button
  size="sm"
  variant={drawMode === 'boundary' ? 'default' : 'outline'}
  onClick={() => {
    if (!selectedRoute) {
      toast.error('请先选择或创建一个路线规划');
      return;
    }
    if (selectedRoute.fieldName) {
      toast.info('已关联地块,边界已自动加载');
      return;
    }
    setDrawMode(drawMode === 'boundary' ? 'none' : 'boundary');
    setCurrentDrawing([]);
  }}
  disabled={!!selectedRoute?.fieldName}
  title={selectedRoute?.fieldName ? '已关联地块,边界已自动加载' : ''}
>
  <Square className="w-4 h-4 mr-1" />
  {selectedRoute?.fieldName ? '✓ 边界已加载' : '绘制边界'}
</Button>

📊 用户体验优化

更新前 vs 更新后

方面 更新前 更新后
地块选择位置 仅在创建时的对话框 创建时对话框 + 地图区域顶部
选择提示 不明显 醒目的卡片提示
选择时机 仅创建时 创建时 + 随时可选择
视觉反馈 普通 渐变背景、图标、状态标识
按钮状态 无变化 自动禁用并显示已加载
用户引导 较弱 强引导(💡 提示)

💡 用户使用指南

推荐使用方式

方式1: 创建时选择地块 推荐

1. 点击"新建规划"
2. 在对话框中选择地块
3. 边界自动加载
4. 直接设置参数生成路线

优点:

  • ✓ 一步到位
  • ✓ 自动命名
  • ✓ 省时省力

方式2: 创建后选择地块

1. 点击"新建规划"
2. 选择"不选择(手动绘制边界)"
3. 在地图区域看到地块选择卡片
4. 从下拉框选择地块
5. 边界自动加载

优点:

  • ✓ 可以先看看地图
  • ✓ 随时可以选择地块

方式3: 手动绘制边界

1. 点击"新建规划"
2. 选择"不选择(手动绘制边界)"
3. 不使用地块选择卡片
4. 点击"绘制边界"按钮
5. 在地图上手动绘制

适用场景:

  • 地块未在系统中录入
  • 临时作业区域
  • 需要特殊边界处理

功能验证

测试场景

场景1: 创建时选择地块

✅ 创建路线时选择地块
✅ 边界自动加载到地图
✅ 路线名称自动命名
✅ 地块卡片显示"已选择"状态
✅ "绘制边界"按钮变为"✓ 边界已加载"且禁用

场景2: 创建后在卡片中选择地块

✅ 创建路线时不选择地块
✅ 地图区域显示地块选择卡片
✅ 卡片显示醒目的提示信息
✅ 从下拉框选择地块
✅ 边界自动加载
✅ 路线名称自动更新
✅ 卡片状态变为"已选择"
✅ "绘制边界"按钮禁用

场景3: 手动绘制边界

✅ 不选择地块
✅ 地块卡片仍然显示
✅ "绘制边界"按钮可用
✅ 点击后可以手动绘制
✅ 绘制完成后正常工作

🎯 优化要点

1. 视觉引导

  • 渐变背景色(蓝绿)吸引注意
  • 图标标识(📍)增强识别
  • 智能提示(💡)引导操作
  • 状态徽章(✓)清晰反馈

2. 交互优化

  • 选择地块后立即生效
  • 自动加载边界
  • 自动更新路线名称
  • 按钮状态自动更新
  • Toast提示操作结果

3. 用户体验

  • 位置醒目(地图区域顶部)
  • 操作便捷(一个下拉框)
  • 引导明确(提示文字)
  • 反馈及时(即时更新)

📝 注意事项

1. 选择地块的时机

  • 建议在创建路线时就选择地块
  • 也可以创建后再选择
  • 选择后会自动加载边界并更新路线

2. 手动绘制与地块选择

  • 两者是互斥的
  • 选择地块后无法手动绘制边界
  • 想要手动绘制请不要选择地块

3. 地块数据

  • 只显示状态为"活跃"的地块
  • 需要先在地块管理系统中维护地块
  • 地块坐标会自动转换为画布坐标

🎉 总结

更新完成

  1. 地块选择卡片已添加到地图区域顶部
  2. 未选择地块时显示醒目提示
  3. 已选择地块时显示状态标识
  4. "绘制边界"按钮自动禁用
  5. 完整的用户引导流程

🎯 核心价值

  • 提高效率: 不需要在创建和地图之间切换
  • 降低门槛: 醒目的提示引导用户操作
  • 增强体验: 即时的视觉反馈和状态提示
  • 灵活选择: 支持创建时选择或创建后选择

📊 状态

功能完整,用户体验优化完成!


更新时间: 2025-10-17
版本: v1.3
状态: 已优化地块选择流程