# 农事计划-活动类型集成更新

## 更新概述

完成了农事计划模块与农事执行模块的农事类型统一，农事计划中添加活动时的活动类型现在从农事执行的农事类型库中选择，确保了系统的一致性和数据的统一管理。

## 核心改动

### 1. 创建共享农事类型数据文件

**文件位置**: `/lib/operationTypes.ts`

创建了一个共享的农事类型数据文件，包含：

- **类型定义**:
  - `OperationType` - 农事类型枚举
  - `OperationParameter` - 操作参数接口
  - `OperationTypeTemplate` - 农事类型模板接口

- **数据导出**:
  - `operationTypesData` - 9种标准农事类型数据

#### 包含的农事类型

| 序号 | 类型名称 | 图标 | 分类 | 说明 |
|------|---------|------|------|------|
| 1 | 深翻 | 🚜 | 土地整理 | 对土壤进行深层翻耕，改善土壤结构 |
| 2 | 旋耕 | 🌾 | 土地整理 | 使用旋耕机对土壤进行浅层耕作 |
| 3 | 播种 | 🌱 | 种植管理 | 进行作物种子的播种作业 |
| 4 | 撒肥 | 🌾 | 田间管理 | 施用化肥或有机肥 |
| 5 | 喷药 | 💊 | 植保管理 | 喷洒农药进行病虫害防治 |
| 6 | 灌溉 | 💧 | 田间管理 | 对作物进行灌溉作业 |
| 7 | 除草 | 🌿 | 田间管理 | 清除田间杂草 |
| 8 | 修剪 | ✂️ | 田间管理 | 对作物进行整枝修剪 |
| 9 | 采收 | 🎃 | 收获管理 | 作物成熟后的采收作业 |

### 2. 更新农事计划模块 (OperationPlanning.tsx)

#### 导入共享类型
```typescript
import { operationTypesData, OperationType } from '../../lib/operationTypes';

// 使用共享的农事类型定义
type ActivityType = OperationType;
```

#### 活动类型选择器更新

**旧实现**:
```typescript
<SelectContent>
  <SelectItem value="播种">播种</SelectItem>
  <SelectItem value="施肥">施肥</SelectItem>
  <SelectItem value="灌溉">灌溉</SelectItem>
  <SelectItem value="除草">除草</SelectItem>
  <SelectItem value="病虫害防治">病虫害防治</SelectItem>
  <SelectItem value="采收">采收</SelectItem>
</SelectContent>
```

**新实现**:
```typescript
<SelectContent>
  {operationTypesData.map((opType) => (
    <SelectItem key={opType.id} value={opType.name}>
      {opType.icon} {opType.name}
    </SelectItem>
  ))}
</SelectContent>
<p className="text-xs text-muted-foreground mt-1">
  从农事执行的农事类型库中选择
</p>
```

#### 改进特性

1. **动态选项**: 自动从农事类型库加载所有可用类型
2. **图标显示**: 每个类型都显示对应的 emoji 图标
3. **提示文本**: 明确说明数据来源于农事执行模块
4. **自动同步**: 农事执行模块的类型变化会自动反映到计划模块

### 3. 更新农事执行模块 (OperationExecution.tsx)

#### 移除重复定义
```typescript
// 移除了重复的类型定义（已迁移到共享文件）
// type OperationType = ...
// interface OperationTypeTemplate { ... }
// interface OperationParameter { ... }
```

#### 导入共享类型
```typescript
import { 
  operationTypesData, 
  OperationType, 
  OperationTypeTemplate, 
  OperationParameter 
} from '../../lib/operationTypes';
```

#### 使用共享数据
```typescript
// 旧实现：本地定义大量数据
const [operationTypes, setOperationTypes] = useState<OperationTypeTemplate[]>([
  { /* 大量硬编码数据 */ },
  // ...
]);

// 新实现：使用共享数据
const [operationTypes, setOperationTypes] = useState<OperationTypeTemplate[]>(operationTypesData);
```

## 功能特性

### 1. 数据一致性

- ✅ 两个模块使用相同的农事类型数据源
- ✅ 类型定义统一，避免不一致
- ✅ 农事类型的修改只需在一处维护

### 2. 类型详细信息

每个农事类型包含丰富的元数据：

- **基本信息**: ID、名称、分类
- **视觉元素**: 图标、颜色样式
- **文字说明**: 详细描述
- **参数配置**: 每种类型特定的操作参数
  - 参数名称
  - 数据类型 (文本、数字、选择、日期等)
  - 是否必填
  - 单位
  - 可选项
  - 默认值
  - 说明文字

### 3. 类型分类

按农业作业流程分为 5 大类：

1. **土地整理**: 深翻、旋耕
2. **种植管理**: 播种
3. **田间管理**: 撒肥、灌溉、除草、修剪
4. **植保管理**: 喷药
5. **收获管理**: 采收

### 4. 扩展性

新增农事类型的步骤：

1. 在 `/lib/operationTypes.ts` 中添加类型定义
2. 在 `operationTypesData` 数组中添加类型数据
3. 两个模块自动获得新类型（无需修改业务代码）

## 使用场景

### 农事计划模块

**创建/编辑计划时添加活动**:

1. 进入农事计划模块
2. 新建或编辑年度/季度计划
3. 点击"添加活动"
4. 在"活动类型"下拉框中选择
   - 显示所有 9 种标准农事类型
   - 每个类型带图标标识
   - 选项来自农事执行的标准库
5. 选择后继续填写活动详情

**类型选择示例**:
- 🌱 播种
- 🌾 撒肥
- 💧 灌溉
- 🌿 除草
- 💊 喷药
- 🎃 采收
- 🚜 深翻
- 🌾 旋耕
- ✂️ 修剪

### 农事执行模块

**录入操作记录时**:

1. 进入农事执行模块
2. 新建操作记录
3. 在"农事类型"下拉框中选择
   - 同样的 9 种标准类型
   - 与计划模块保持完全一致
4. 可关联已创建的农事任务
5. 记录实际执行情况

## 数据映射关系

### 计划活动 → 执行操作

当从计划生成工单/任务时：

| 计划活动类型 | 执行操作类型 | 映射关系 |
|-------------|-------------|---------|
| 深翻 | 深翻 | 1:1 直接映射 |
| 旋耕 | 旋耕 | 1:1 直接映射 |
| 播种 | 播种 | 1:1 直接映射 |
| 撒肥 | 撒肥 | 1:1 直接映射 |
| 喷药 | 喷药 | 1:1 直接映射 |
| 灌溉 | 灌溉 | 1:1 直接映射 |
| 除草 | 除草 | 1:1 直接映射 |
| 修剪 | 修剪 | 1:1 直接映射 |
| 采收 | 采收 | 1:1 直接映射 |

### 类型参数对应

每种类型的参数配置在计划和执行中保持一致，例如：

**播种类型参数**:
- 作物品种 (必填)
- 种子品牌 (必填)
- 种子批号 (选填)
- 播种量 (必填, 单位: kg)
- 播种方式 (必填, 选项: 条播/穴播/撒播/点播)
- 行距 (选填, 单位: cm)
- 株距 (选填, 单位: cm)
- 播种深度 (必填, 单位: cm)

## 技术实现

### 类型安全

TypeScript 类型定义确保类型安全：

```typescript
// 强类型约束
export type OperationType = 
  '深翻' | '旋耕' | '播种' | '撒肥' | 
  '喷药' | '灌溉' | '除草' | '修剪' | '采收';

// 接口定义
export interface OperationTypeTemplate {
  id: string;
  name: OperationType;  // 使用强类型
  category: '土地整理' | '种植管理' | '田间管理' | '植保管理' | '收获管理';
  icon: string;
  color: string;
  description: string;
  parameters: OperationParameter[];
  createdAt: string;
  updatedAt: string;
}
```

### 单一数据源

遵循 DRY (Don't Repeat Yourself) 原则：

- ✅ 数据定义在一处 (`/lib/operationTypes.ts`)
- ✅ 多处引用同一数据源
- ✅ 修改一处，全局生效

### 模块解耦

- 农事类型数据独立于业务逻辑
- 模块间通过共享数据文件通信
- 易于维护和扩展

## 测试要点

### 功能测试

1. **农事计划模块**
   - [ ] 新建计划，添加活动
   - [ ] 活动类型下拉框显示 9 种类型
   - [ ] 每个类型显示正确的图标
   - [ ] 选择类型后能正常保存
   - [ ] 编辑已有活动，类型可切换

2. **农事执行模块**
   - [ ] 新建操作记录
   - [ ] 农事类型下拉框显示 9 种类型
   - [ ] 类型选择与计划模块一致
   - [ ] 能关联到相应类型的任务

3. **数据一致性**
   - [ ] 两个模块的类型列表完全相同
   - [ ] 类型图标、名称一致
   - [ ] 类型参数配置一致

### 回归测试

1. **现有数据兼容性**
   - [ ] 旧的计划数据正常显示
   - [ ] 旧的操作记录正常显示
   - [ ] 类型映射关系正确

2. **业务流程**
   - [ ] 计划 → 工单生成正常
   - [ ] 工单 → 任务分配正常
   - [ ] 任务 → 执行记录正常

## 优势总结

### 1. 统一管理
- 农事类型在系统级别统一定义
- 避免计划和执行模块数据不一致

### 2. 维护便利
- 新增类型只需修改一个文件
- 减少代码重复，降低维护成本

### 3. 扩展性强
- 易于添加新的农事类型
- 支持自定义类型参数

### 4. 用户体验
- 图标化显示，直观易识别
- 选项统一，操作一致性好
- 数据来源明确，提升可信度

### 5. 类型安全
- TypeScript 类型约束
- 编译时错误检查
- IDE 智能提示支持

## 注意事项

### 1. 数据迁移

如果系统已有生产数据，需要注意：

- 确认旧数据中的农事类型名称与新标准一致
- 如有不一致，需要数据迁移脚本
- 建议先在测试环境验证

### 2. 自定义类型

当前版本使用固定的 9 种标准类型，如需支持用户自定义类型：

- 可在农事类型管理模块中添加
- 需要考虑与标准类型的合并展示
- 建议区分"标准类型"和"自定义类型"

### 3. 类型演化

农事类型的参数可能随业务发展而变化：

- 建议保留 `createdAt` 和 `updatedAt` 字段
- 考虑版本控制机制
- 旧版本数据需要兼容处理

## 后续扩展建议

### 1. 类型管理界面

开发专门的农事类型管理页面：

- 查看所有标准类型
- 添加自定义类型
- 编辑类型参数配置
- 类型启用/停用管理

### 2. 类型推荐

基于历史数据智能推荐：

- 根据作物种类推荐常用类型
- 根据季节推荐应季类型
- 根据地块特征推荐合适类型

### 3. 类型分析

统计分析功能：

- 各类型使用频次统计
- 各类型执行效率分析
- 类型成本分析报表

### 4. 类型标准化

进一步标准化：

- 参考农业行业标准
- 与农业专家咨询优化分类
- 支持多语言类型名称

## 总结

本次更新实现了农事计划和农事执行模块的农事类型统一管理，通过创建共享的数据源文件，确保了系统数据的一致性和可维护性。用户在制定农事计划时选择的活动类型与实际执行时的操作类型完全对应，提升了系统的专业性和易用性。

### 关键成果

✅ 创建了共享的农事类型数据文件  
✅ 统一了 9 种标准农事类型  
✅ 实现了计划和执行模块的类型同步  
✅ 改善了用户界面的一致性  
✅ 提升了代码的可维护性  

### 技术亮点

- 单一数据源原则
- TypeScript 类型安全
- 模块化设计
- 图标化界面
- 动态数据加载
