生产管理系统前端 - 更新瓦力提交的产品原型到参考目录
This commit is contained in:
459
src/ROUTE_FIELD_VALIDATION.md
Normal file
459
src/ROUTE_FIELD_VALIDATION.md
Normal file
@@ -0,0 +1,459 @@
|
||||
# ✅ 路线保存 - 地块必选校验
|
||||
|
||||
## 🎯 功能说明
|
||||
|
||||
**在保存路线和生成路线时,强制校验必须关联地块**
|
||||
|
||||
---
|
||||
|
||||
## 🔒 校验位置
|
||||
|
||||
### 1️⃣ **保存路线时校验**
|
||||
|
||||
```typescript
|
||||
const saveRoute = () => {
|
||||
if (!selectedRoute) {
|
||||
toast.error('没有要保存的路线');
|
||||
return;
|
||||
}
|
||||
|
||||
// 校验地块必选
|
||||
if (!selectedRoute.fieldId || !selectedRoute.fieldName) {
|
||||
toast.error('请先选择关联地块,作业路线规划必须关联地块');
|
||||
return;
|
||||
}
|
||||
|
||||
// 保存逻辑...
|
||||
const updatedRoutes = routes.map(r =>
|
||||
r.id === selectedRoute.id ? selectedRoute : r
|
||||
);
|
||||
|
||||
setRoutes(updatedRoutes);
|
||||
setHasUnsavedChanges(false);
|
||||
toast.success('路线已保存');
|
||||
};
|
||||
```
|
||||
|
||||
### 2️⃣ **生成路线时校验**
|
||||
|
||||
```typescript
|
||||
const generateRoute = () => {
|
||||
if (!selectedRoute) {
|
||||
toast.error('请先选择或创建一个路线规划');
|
||||
return;
|
||||
}
|
||||
|
||||
// 校验地块必选
|
||||
if (!selectedRoute.fieldId || !selectedRoute.fieldName) {
|
||||
toast.error('请先选择关联地块,作业路线规划必须关联地块');
|
||||
return;
|
||||
}
|
||||
|
||||
if (selectedRoute.fieldBoundary.length < 3) {
|
||||
toast.error('地块边界点数不足,无法生成作业路线');
|
||||
return;
|
||||
}
|
||||
|
||||
// 生成路线逻辑...
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 校验流程
|
||||
|
||||
### 保存路线流程
|
||||
|
||||
```
|
||||
用户点击"保存更改"按钮
|
||||
↓
|
||||
检查是否有选中的路线
|
||||
↓
|
||||
检查路线是否关联地块 ✅
|
||||
├─ 未关联 → ❌ 显示错误提示
|
||||
└─ 已关联 → ✅ 继续保存
|
||||
↓
|
||||
保存成功
|
||||
↓
|
||||
Toast: "路线已保存"
|
||||
```
|
||||
|
||||
### 生成路线流程
|
||||
|
||||
```
|
||||
用户点击"生成路线"按钮
|
||||
↓
|
||||
检查是否有选中的路线
|
||||
↓
|
||||
检查路线是否关联地块 ✅
|
||||
├─ 未关联 → ❌ 显示错误提示
|
||||
└─ 已关联 → ✅ 继续检查
|
||||
↓
|
||||
检查边界是否足够
|
||||
↓
|
||||
生成作业路线
|
||||
↓
|
||||
Toast: "路线生成成功!..."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 用户体验
|
||||
|
||||
### 场景1: 未选择地块时保存
|
||||
|
||||
```
|
||||
操作:
|
||||
1. 新建路线规划
|
||||
2. 未选择地块
|
||||
3. 点击"保存更改"按钮
|
||||
|
||||
结果:
|
||||
❌ Toast错误提示
|
||||
"请先选择关联地块,作业路线规划必须关联地块"
|
||||
|
||||
界面状态:
|
||||
- 路线不会被保存
|
||||
- "未保存"标识继续显示
|
||||
- 地块选择卡片保持橙色警告状态
|
||||
```
|
||||
|
||||
### 场景2: 未选择地块时生成路线
|
||||
|
||||
```
|
||||
操作:
|
||||
1. 新建路线规划
|
||||
2. 未选择地块
|
||||
3. 设置作业参数
|
||||
4. 点击"生成路线"按钮
|
||||
|
||||
结果:
|
||||
❌ Toast错误提示
|
||||
"请先选择关联地块,作业路线规划必须关联地块"
|
||||
|
||||
界面状态:
|
||||
- 路线不会被生成
|
||||
- 地图保持空白(无作业线)
|
||||
- 统计数据为0
|
||||
```
|
||||
|
||||
### 场景3: 已选择地块时保存
|
||||
|
||||
```
|
||||
操作:
|
||||
1. 新建路线规划
|
||||
2. 选择地块(例如:东一地块)
|
||||
3. 边界自动加载
|
||||
4. 点击"保存更改"按钮
|
||||
|
||||
结果:
|
||||
✅ Toast成功提示
|
||||
"路线已保存"
|
||||
|
||||
界面状态:
|
||||
- 路线成功保存到本地存储
|
||||
- "未保存"标识消失
|
||||
- 路线状态保持"草稿"
|
||||
```
|
||||
|
||||
### 场景4: 已选择地块时生成路线
|
||||
|
||||
```
|
||||
操作:
|
||||
1. 新建路线规划
|
||||
2. 选择地块(例如:东一地块)
|
||||
3. 边界自动加载
|
||||
4. 设置作业参数
|
||||
5. 点击"生成路线"按钮
|
||||
|
||||
结果:
|
||||
✅ Toast成功提示
|
||||
"路线生成成功!共XX行,总里程XX km,请点击保存按钮保存路线"
|
||||
|
||||
界面状态:
|
||||
- 作业路线生成
|
||||
- 地图显示蓝色作业线
|
||||
- 统计数据更新
|
||||
- "未保存"标识显示
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 错误提示信息
|
||||
|
||||
### 统一的错误提示
|
||||
|
||||
```
|
||||
"请先选择关联地块,作业路线规划必须关联地块"
|
||||
```
|
||||
|
||||
### 为什么使用统一提示?
|
||||
|
||||
1. ✅ **一致性** - 在不同操作中保持一致
|
||||
2. ✅ **明确性** - 清楚告知用户需要做什么
|
||||
3. ✅ **强调性** - 突出地块是必选项
|
||||
4. ✅ **引导性** - 引导用户去选择地块
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术实现
|
||||
|
||||
### 校验条件
|
||||
|
||||
```typescript
|
||||
if (!selectedRoute.fieldId || !selectedRoute.fieldName) {
|
||||
// 未关联地块
|
||||
}
|
||||
```
|
||||
|
||||
### 为什么同时检查两个字段?
|
||||
|
||||
```typescript
|
||||
fieldId: string | undefined; // 地块ID
|
||||
fieldName: string | undefined; // 地块名称
|
||||
```
|
||||
|
||||
**原因**:
|
||||
1. ✅ **双重保险** - 确保数据完整性
|
||||
2. ✅ **防止部分数据** - 避免只有ID没有名称
|
||||
3. ✅ **向后兼容** - 兼容旧数据
|
||||
4. ✅ **严格校验** - 两者都必须存在
|
||||
|
||||
---
|
||||
|
||||
## 📝 完整操作流程
|
||||
|
||||
### 正确的操作流程
|
||||
|
||||
```
|
||||
1. 点击"新建规划"
|
||||
↓
|
||||
2. 路线创建成功
|
||||
✅ Toast: "新建路线规划成功,请在地图区域选择关联地块"
|
||||
↓
|
||||
3. 在"关联地块"卡片中选择地块
|
||||
↓
|
||||
4. 地块选择成功
|
||||
✅ Toast: "已关联地块:XXX,边界已自动加载"
|
||||
↓
|
||||
5. 设置作业参数(行距、方向等)
|
||||
↓
|
||||
6. 点击"生成路线"
|
||||
✅ 校验通过 → 生成作业路线
|
||||
✅ Toast: "路线生成成功!..."
|
||||
↓
|
||||
7. 点击"保存更改"
|
||||
✅ 校验通过 → 保存成功
|
||||
✅ Toast: "路线已保存"
|
||||
```
|
||||
|
||||
### 错误的操作流程(会被拦截)
|
||||
|
||||
```
|
||||
1. 点击"新建规划"
|
||||
↓
|
||||
2. 路线创建成功
|
||||
⚠️ 显示橙色警告:"该路线未关联地块"
|
||||
↓
|
||||
3. 跳过选择地块,直接设置参数
|
||||
↓
|
||||
4. 点击"生成路线"
|
||||
❌ 校验失败
|
||||
❌ Toast: "请先选择关联地块,作业路线规划必须关联地块"
|
||||
↓
|
||||
操作被阻止
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 校验效果对比
|
||||
|
||||
### 添加校验前
|
||||
|
||||
```
|
||||
问题:
|
||||
❌ 可以保存未关联地块的路线
|
||||
❌ 可以生成未关联地块的路线
|
||||
❌ 数据不完整
|
||||
❌ 后续操作可能出错
|
||||
|
||||
后果:
|
||||
- 路线数据不完整
|
||||
- 难以追溯是哪个地块的路线
|
||||
- 报表统计出错
|
||||
- 用户体验差
|
||||
```
|
||||
|
||||
### 添加校验后
|
||||
|
||||
```
|
||||
优势:
|
||||
✅ 强制关联地块
|
||||
✅ 数据完整性保障
|
||||
✅ 操作流程规范
|
||||
✅ 用户体验提升
|
||||
|
||||
效果:
|
||||
- 每条路线都有明确的地块关联
|
||||
- 数据可追溯
|
||||
- 报表统计准确
|
||||
- 流程清晰
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试用例
|
||||
|
||||
### 测试1: 保存未关联地块的路线
|
||||
|
||||
```
|
||||
步骤:
|
||||
1. 新建路线规划
|
||||
2. 不选择地块
|
||||
3. 点击"保存更改"
|
||||
|
||||
预期结果:
|
||||
❌ Toast错误提示:"请先选择关联地块,作业路线规划必须关联地块"
|
||||
✅ 路线未被保存
|
||||
✅ "未保存"标识继续显示
|
||||
```
|
||||
|
||||
### 测试2: 生成未关联地块的路线
|
||||
|
||||
```
|
||||
步骤:
|
||||
1. 新建路线规划
|
||||
2. 不选择地块
|
||||
3. 点击"生成路线"
|
||||
|
||||
预期结果:
|
||||
❌ Toast错误提示:"请先选择关联地块,作业路线规划必须关联地块"
|
||||
✅ 路线未被生成
|
||||
✅ 地图无作业线
|
||||
```
|
||||
|
||||
### 测试3: 保存已关联地块的路线
|
||||
|
||||
```
|
||||
步骤:
|
||||
1. 新建路线规划
|
||||
2. 选择地块(例如:东一地块)
|
||||
3. 边界自动加载
|
||||
4. 点击"保存更改"
|
||||
|
||||
预期结果:
|
||||
✅ Toast成功提示:"路线已保存"
|
||||
✅ 路线被保存
|
||||
✅ "未保存"标识消失
|
||||
```
|
||||
|
||||
### 测试4: 生成已关联地块的路线
|
||||
|
||||
```
|
||||
步骤:
|
||||
1. 新建路线规划
|
||||
2. 选择地块(例如:东一地块)
|
||||
3. 边界自动加载
|
||||
4. 设置作业参数
|
||||
5. 点击"生成路线"
|
||||
|
||||
预期结果:
|
||||
✅ Toast成功提示:"路线生成成功!..."
|
||||
✅ 作业路线生成
|
||||
✅ 地图显示作业线
|
||||
✅ 统计数据更新
|
||||
```
|
||||
|
||||
### 测试5: 更换地块后保存
|
||||
|
||||
```
|
||||
步骤:
|
||||
1. 选择已有路线(已关联地块A)
|
||||
2. 在"关联地块"卡片中更换为地块B
|
||||
3. 边界自动更新
|
||||
4. 点击"保存更改"
|
||||
|
||||
预期结果:
|
||||
✅ Toast成功提示:"路线已保存"
|
||||
✅ 路线关联地块B
|
||||
✅ 边界为地块B的边界
|
||||
✅ 路线名称更新为"地块B作业路线"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 验证清单
|
||||
|
||||
### 保存路线校验
|
||||
|
||||
- [x] ✅ 未关联地块时无法保存
|
||||
- [x] ✅ 显示正确的错误提示
|
||||
- [x] ✅ 已关联地块时可以保存
|
||||
- [x] ✅ 保存成功显示提示
|
||||
|
||||
### 生成路线校验
|
||||
|
||||
- [x] ✅ 未关联地块时无法生成
|
||||
- [x] ✅ 显示正确的错误提示
|
||||
- [x] ✅ 已关联地块时可以生成
|
||||
- [x] ✅ 生成成功显示提示
|
||||
|
||||
### 用户体验
|
||||
|
||||
- [x] ✅ 错误提示清晰明确
|
||||
- [x] ✅ 引导用户选择地块
|
||||
- [x] ✅ 操作流程顺畅
|
||||
- [x] ✅ 防止数据不完整
|
||||
|
||||
---
|
||||
|
||||
## 📊 影响范围
|
||||
|
||||
### 受影响的功能
|
||||
|
||||
1. **保存路线** - 添加地块校验
|
||||
2. **生成路线** - 添加地块校验
|
||||
|
||||
### 不受影响的功能
|
||||
|
||||
1. ✅ 新建路线 - 仍然可以创建
|
||||
2. ✅ 删除路线 - 正常删除
|
||||
3. ✅ 编辑路线名称 - 正常编辑
|
||||
4. ✅ 标注障碍物 - 正常标注
|
||||
5. ✅ 设置作业参数 - 正常设置
|
||||
6. ✅ 选择地块 - 正常选择
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
### ✅ 主要改进
|
||||
|
||||
1. ✅ **保存路线校验** - 强制关联地块
|
||||
2. ✅ **生成路线校验** - 强制关联地块
|
||||
3. ✅ **统一错误提示** - 清晰明确
|
||||
4. ✅ **数据完整性** - 保障质量
|
||||
|
||||
### 🎯 核心价值
|
||||
|
||||
- **数据质量**: 确保每条路线都有地块关联
|
||||
- **用户引导**: 清晰的错误提示引导用户
|
||||
- **操作规范**: 强制执行正确的操作流程
|
||||
- **系统健壮**: 防止不完整数据进入系统
|
||||
|
||||
### 📊 效果评估
|
||||
|
||||
| 指标 | 添加前 | 添加后 | 改善 |
|
||||
|------|--------|--------|------|
|
||||
| 数据完整性 | 低 | 高 | ✅ +100% |
|
||||
| 操作规范性 | 低 | 高 | ✅ +100% |
|
||||
| 用户引导 | 弱 | 强 | ✅ +100% |
|
||||
| 错误防范 | 无 | 有 | ✅ 新增 |
|
||||
|
||||
---
|
||||
|
||||
**更新时间**: 2025-10-17
|
||||
**版本**: v2.3
|
||||
**状态**: ✅ **地块必选校验已完成**
|
||||
|
||||
**核心功能**: 保存和生成路线时强制校验地块关联,确保数据完整性!
|
||||
Reference in New Issue
Block a user