# 工单生成功能更新说明

## 更新时间
2025年10月20日

## 更新内容

### 1. 🗓️ 新增计划日期字段
每个工单现在可以独立设置：
- **计划开始日期**：默认为活动的开始日期
- **计划结束日期**：默认为活动的结束日期
- 可手动调整每个工单的执行时间段

### 2. 📦 优化农资选择方式
**移除**：原有的"添加农资"下拉按钮

**新增**：直接列表式农资选择
- 直接显示农资系统中的所有可用农资
- 每个农资显示当前库存量
- 直接在农资行输入用量
- 输入大于0的用量自动添加到工单
- 无需额外点击添加/删除按钮

### 3. 🎯 改进用户体验
- 更简洁的界面布局
- 一目了然的农资清单
- 更快速的配置流程
- 智能过滤：只有用量>0的农资才会添加到工单

## 界面布局

### 每个活动的配置区域分为两部分：

#### 上方：基本信息（2x2网格）
```
┌─────────────────┬─────────────────┐
│   选择地块      │   分配人员      │
├─────────────────┼─────────────────┤
│ 计划开始日期    │ 计划结束日期    │
└─────────────────┴─────────────────┘
```

#### 下方：农资配置（列表）
```
┌────────────────────────────────────┐
│ 农资配置                           │
├────────────────────────────────────┤
│ 有机肥      库存:10000kg  [___]kg │
│ 复合肥      库存:5000kg   [___]kg │
│ 尿素        库存:3000kg   [___]kg │
│ 杀虫剂      库存:200L     [___]L  │
│ ...                                │
└────────────────────────────────────┘
💡 直接输入用量，大于0自动添加到工单
```

## 使用流程

### 步骤1：基本信息配置
1. **选择地块**
   - 从下拉列表选择地块
   - 自动显示地块面积和预计工时

2. **分配人员**
   - 从下拉列表选择负责人
   - 自动显示所属班组

3. **设置日期**
   - 调整计划开始日期（默认为活动开始日期）
   - 调整计划结束日期（默认为活动结束日期）

### 步骤2：农资配置
1. 浏览农资列表（自动从农资系统加载）
2. 在需要的农资行直接输入用量
3. 系统自动记录用量>0的农资

### 步骤3：生成工单
1. 确认所有活动配置完成
2. 点击"生成工单"按钮
3. 系统创建工单并自动过滤用量为0的农资

## 数据来源

### 地块数据
- 来源：`localStorage.smart_agriculture_fields`
- 显示：地块名称 + 面积

### 员工数据
- 来源：`localStorage.smart_agriculture_employees`
- 过滤：只显示在职员工
- 显示：员工姓名 + 班组/岗位

### 农资数据
- 来源：`localStorage.smart_agriculture_materials`
- 过滤：只显示库存>0的农资
- 显示：农资名称 + 当前库存 + 单位

## 工单字段说明

每个工单包含：
```typescript
{
  id: string;                    // 工单ID
  planId: string;                // 关联计划ID
  planName: string;              // 计划名称
  activityType: ActivityType;    // 活动类型
  fieldId: string;               // 地块ID
  fieldName: string;             // 地块名称
  assignedTo: string;            // 负责人姓名
  teamName: string;              // 班组名称
  scheduledDate: string;         // 计划开始日期 ⭐新增
  area: number;                  // 地块面积
  estimatedHours: number;        // 预计工时
  estimatedMaterials: Array<{    // 农资清单（自动过滤用量=0）
    name: string;
    amount: number;
    unit: string;
  }>;
  status: WorkOrderStatus;       // 工单状态
}
```

## 智能计算

### 自动工时计算
根据活动类型和地块面积：
- 播种：0.5小时/亩
- 施肥：0.3小时/亩
- 灌溉：0.15小时/亩
- 除草：0.4小时/亩
- 病虫害防治：0.25小时/亩
- 采收：0.8小时/亩

### 农资用量
- 由用户根据实际情况输入
- 可参考地块面积和活动类型
- 系统不自动推荐，由用户完全控制

## 优势对比

### 旧版本
- ❌ 需要点击"添加农资"按钮
- ❌ 下拉选择后才能输入用量
- ❌ 需要手动删除不需要的农资
- ❌ 操作步骤多

### 新版本
- ✅ 所有农资直接展示
- ✅ 直接输入用量即可
- ✅ 不需要的农资留空即可
- ✅ 操作步骤少，效率高

## 验证规则

生成工单前系统验证：
1. ✅ 所有活动必须选择地块
2. ✅ 所有活动必须分配人员
3. ✅ 开始日期不能晚于结束日期（可选验证）
4. ✅ 自动过滤用量为0的农资

## 注意事项

1. **日期默认值**
   - 默认使用活动的开始/结束日期
   - 可根据实际情况调整
   - 建议开始日期≤结束日期

2. **农资库存**
   - 系统只显示库存>0的农资
   - 不会自动扣减库存
   - 输入用量时注意不要超过库存

3. **用量为0**
   - 农资用量为0不会添加到工单
   - 可以先输入用量再改为0来移除

4. **工时计算**
   - 工时根据地块面积自动计算
   - 当前版本不支持手动修改工时

## 技术实现

### 核心组件
- **组件名称**：`WorkOrderGenerateDialog`
- **文件位置**：`/components/operation/OperationPlanning.tsx`

### 关键函数
```typescript
// 农资选择和用量设置（合并原有的添加和修改函数）
handleMaterialSelect(activityId, materialId, amount)

// 日期变更处理
handleDateChange(activityId, field, value)

// 工单生成（自动过滤用量为0的农资）
handleGenerate()
```

### 状态结构
```typescript
{
  activityId: string;
  fieldId: string;
  fieldName: string;
  area: number;
  assignedTo: string;
  teamName: string;
  scheduledStartDate: string;  // ⭐新增
  scheduledEndDate: string;    // ⭐新增
  estimatedHours: number;
  materials: Array<{
    id: string;
    name: string;
    amount: number;
    unit: string;
  }>;
}
```

## 后续优化建议

- [ ] 支持手动调整预计工时
- [ ] 添加农资用量建议功能
- [ ] 增加农资库存预警
- [ ] 支持农资快捷选择（按活动类型预设）
- [ ] 添加工单日期冲突检测
- [ ] 支持批量复制配置到其他活动

## 更新日志

### v2.0 - 2025年10月20日
- ✅ 添加计划开始日期和结束日期字段
- ✅ 移除"添加农资"下拉按钮
- ✅ 改为直接列表式农资选择
- ✅ 优化界面布局为上下结构
- ✅ 自动过滤用量为0的农资
- ✅ 简化操作流程

### v1.0 - 2025年10月19日
- 初始版本
- 基本的地块、人员、农资配置
- 自动工时计算
- 智能农资推荐
