# 📊 作业数据分析 - 平均质量计算说明

## 🎯 当前计算方式

### 简单算术平均

**代码位置**: `/components/machinery/data/OperationAnalysis.tsx`

```typescript
const aggregatedMetrics = useMemo(() => {
  if (filteredData.length === 0) return null;

  // 当前计算方式：简单算术平均
  const avgQuality = filteredData.reduce((sum, item) => sum + item.quality, 0) / filteredData.length;

  return {
    avgQuality: avgQuality.toFixed(1), // 平均质量（分）
    // ... 其他指标
  };
}, [filteredData]);
```

---

## 📐 计算公式

### 当前公式（简单平均）

```
平均质量 = Σ(每次作业质量) / 作业次数

示例：
作业1: 质量 92分，面积 85亩
作业2: 质量 95分，面积 78亩
作业3: 质量 88分，面积 62亩

平均质量 = (92 + 95 + 88) / 3 = 91.67 分
```

---

## ⚠️ 当前方式的问题

### 问题1: 未考虑作业面积

```
场景：
作业A: 质量 95分，面积 200亩（大面积，高质量）
作业B: 质量 80分，面积 10亩（小面积，低质量）

简单平均 = (95 + 80) / 2 = 87.5 分

问题：
- 10亩的低质量作业与200亩的高质量作业权重相同
- 不能真实反映整体质量水平
```

---

### 问题2: 未区分作业类型

```
场景：
耕地作业: 质量 90分
播种作业: 质量 85分
收获作业: 质量 92分

简单平均 = (90 + 85 + 92) / 3 = 89 分

问题：
- 不同作业类型的质量评价标准不同
- 耕地、播种、收获不能直接平均
```

---

### 问题3: 未考虑质量维度

```
播种作业的质量包含：
- 播种均匀度: 85分
- 深浅一致性: 90分
- 综合质量: 88分

问题：
- 只使用综合质量，丢失了细节信息
- 无法针对性地改进
```

---

## ✅ 推荐计算方式

### 方式1: 面积加权平均（推荐）⭐⭐⭐⭐⭐

**公式**:
```
平均质量 = Σ(作业质量 × 作业面积) / Σ(作业面积)
```

**代码实现**:
```typescript
const avgQuality = useMemo(() => {
  const totalArea = filteredData.reduce((sum, item) => sum + item.area, 0);
  const weightedQualitySum = filteredData.reduce((sum, item) => 
    sum + (item.quality * item.area), 0
  );
  
  return totalArea > 0 ? (weightedQualitySum / totalArea).toFixed(1) : '0';
}, [filteredData]);
```

**示例**:
```
作业1: 质量 95分，面积 200亩
作业2: 质量 80分，面积 10亩

加权平均 = (95×200 + 80×10) / (200 + 10)
        = (19000 + 800) / 210
        = 94.29 分

✅ 更合理地反映了整体质量水平
```

---

### 方式2: 分类型计算平均

**公式**:
```
每种作业类型分别计算平均质量

耕地平均质量 = Σ(耕地作业质量 × 面积) / Σ(耕地面积)
播种平均质量 = Σ(播种作业质量 × 面积) / Σ(播种面积)
收获平均质量 = Σ(收获作业质量 × 面积) / Σ(收获面积)
```

**代码实现**:
```typescript
const qualityByType = useMemo(() => {
  const typeMap = new Map();
  
  filteredData.forEach(item => {
    if (!typeMap.has(item.operationType)) {
      typeMap.set(item.operationType, { qualitySum: 0, areaSum: 0 });
    }
    const data = typeMap.get(item.operationType);
    data.qualitySum += item.quality * item.area;
    data.areaSum += item.area;
  });

  return Array.from(typeMap.entries()).map(([type, data]) => ({
    type,
    avgQuality: (data.qualitySum / data.areaSum).toFixed(1),
  }));
}, [filteredData]);
```

---

### 方式3: 多维度质量评估

**公式**:
```
综合质量 = 基础质量维度的加权平均

播种作业:
  综合质量 = 播种均匀度 × 0.5 + 深浅一致性 × 0.5

耕地作业:
  综合质量 = 深浅一致性 × 1.0
```

**代码实现**:
```typescript
const calculateCompositeQuality = (item: OperationData) => {
  if (item.operationType === '播种') {
    if (item.seedingUniformity && item.depthConsistency) {
      return item.seedingUniformity * 0.5 + item.depthConsistency * 0.5;
    }
  }
  
  if (item.operationType === '耕地') {
    if (item.depthConsistency) {
      return item.depthConsistency;
    }
  }
  
  return item.quality;
};

const avgQuality = useMemo(() => {
  const totalArea = filteredData.reduce((sum, item) => sum + item.area, 0);
  const weightedQualitySum = filteredData.reduce((sum, item) => {
    const compositeQuality = calculateCompositeQuality(item);
    return sum + (compositeQuality * item.area);
  }, 0);
  
  return totalArea > 0 ? (weightedQualitySum / totalArea).toFixed(1) : '0';
}, [filteredData]);
```

---

## 📊 计算方式对比

### 示例数据

```typescript
const operations = [
  { type: '耕地', quality: 92, area: 85 },
  { type: '耕地', quality: 95, area: 78 },
  { type: '播种', quality: 88, area: 62 },
  { type: '播种', quality: 85, area: 70 },
  { type: '收获', quality: 90, area: 95 },
];
```

---

### 计算结果对比

| 计算方式 | 结果 | 说明 |
|---------|------|------|
| **简单平均** | 90.0 分 | (92+95+88+85+90)/5 |
| **面积加权** | 89.7 分 | 更准确反映整体质量 |
| **分类型平均** | 耕地 93.4<br>播种 86.4<br>收获 90.0 | 便于分析不同作业 |

---

## 🔄 实施建议

### 阶段1: 使用面积加权平均（立即实施）

**优势**:
- ✅ 更准确地反映整体质量
- ✅ 实施简单
- ✅ 向后兼容

**修改代码**:
```typescript
// 在 aggregatedMetrics 中修改
const totalArea = filteredData.reduce((sum, item) => sum + item.area, 0);
const weightedQualitySum = filteredData.reduce((sum, item) => 
  sum + (item.quality * item.area), 0
);
const avgQuality = totalArea > 0 
  ? (weightedQualitySum / totalArea).toFixed(1) 
  : '0';
```

---

### 阶段2: 增加分类型质量分析（推荐）

**展示方式**:
```
总体平均质量: 89.7 分（面积加权）

按作业类型:
- 耕地: 93.4 分（163 亩）
- 播种: 86.4 分（132 亩）
- 收获: 90.0 分（95 亩）
```

---

### 阶段3: 多维度质量评估（高级）

**展示方式**:
```
播种作业质量详情:
- 播种均匀度: 85.2 分
- 深浅一致性: 87.6 分
- 综合质量: 86.4 分

改进建议:
⚠️ 播种均匀度偏低，建议检查播种机械
```

---

## 💡 使用场景

### 场景1: 整体质量监控

```
需求：了解一段时间内的总体作业质量

计算方式：面积加权平均

展示：
总体平均质量: 89.7 分
覆盖面积: 390 亩
作业次数: 5 次
```

---

### 场景2: 对比不同机型

```
需求：对比不同农机的作业质量

计算方式：每台机型分别计算面积加权平均

展示：
约翰迪尔8R: 92.3 分（200 亩）
久保田M7: 88.5 分（150 亩）
雷沃欧豹: 87.2 分（100 亩）
```

---

### 场景3: 分析作业类型质量

```
需求：了解不同作业类型的质量表现

计算方式：分类型加权平均

展示：
耕地作业: 93.4 分 ✅ 优秀
播种作业: 86.4 分 ⚠️ 需改进
收获作业: 90.0 分 ✅ 良好
```

---

## 🎯 质量评价标准

### 评分等级

```
优秀：≥ 90 分
良好：85-89 分
一般：80-84 分
需改进：< 80 分
```

---

### 质量维度权重建议

#### 播种作业

```
播种均匀度: 50%
深浅一致性: 50%

综合质量 = 播种均匀度 × 0.5 + 深浅一致性 × 0.5
```

#### 耕地作业

```
深浅一致性: 100%

综合质量 = 深浅一致性
```

#### 收获作业

```
损失率: 60%
清洁度: 40%

综合质量 = (100-损失率) × 0.6 + 清洁度 × 0.4
```

---

## 📝 实施代码

### 完整实现（面积加权平均）

```typescript
// 计算平均质量
const aggregatedMetrics = useMemo(() => {
  if (filteredData.length === 0) return null;

  const totalArea = filteredData.reduce((sum, item) => sum + item.area, 0);
  const totalDuration = filteredData.reduce((sum, item) => sum + item.duration, 0);
  const totalCost = filteredData.reduce((sum, item) => sum + item.cost, 0);
  const totalFuel = filteredData.reduce((sum, item) => sum + item.fuelConsumption, 0);
  
  // ⭐ 面积加权平均质量
  const weightedQualitySum = filteredData.reduce((sum, item) => 
    sum + (item.quality * item.area), 0
  );
  const avgQuality = totalArea > 0 
    ? (weightedQualitySum / totalArea).toFixed(1) 
    : '0';

  return {
    avgEfficiency: (totalArea / totalDuration).toFixed(2),
    avgCostPerArea: (totalCost / totalArea).toFixed(2),
    avgQuality: avgQuality,  // 面积加权平均质量
    totalHours: totalDuration.toFixed(1),
    totalArea: totalArea.toFixed(1),
    totalCost: totalCost.toFixed(0),
    avgFuelPerArea: (totalFuel / totalArea).toFixed(2),
  };
}, [filteredData]);
```

---

### 分作业类型的质量统计

```typescript
// 按作业类型统计质量
const qualityByOperationType = useMemo(() => {
  const typeMap = new Map();
  
  filteredData.forEach(item => {
    if (!typeMap.has(item.operationType)) {
      typeMap.set(item.operationType, { 
        qualitySum: 0, 
        areaSum: 0,
        count: 0 
      });
    }
    const data = typeMap.get(item.operationType);
    data.qualitySum += item.quality * item.area;
    data.areaSum += item.area;
    data.count += 1;
  });

  return Array.from(typeMap.entries()).map(([type, data]) => ({
    type,
    avgQuality: (data.qualitySum / data.areaSum).toFixed(1),
    area: data.areaSum.toFixed(1),
    count: data.count,
  }));
}, [filteredData]);

// 展示
{qualityByOperationType.map(item => (
  <div key={item.type} className="flex justify-between p-3 border-b">
    <span>{item.type}</span>
    <div className="flex gap-4">
      <span>{item.avgQuality} 分</span>
      <span className="text-muted-foreground">({item.area} 亩)</span>
    </div>
  </div>
))}
```

---

## 📈 展示建议

### KPI卡片展示

```tsx
<Card className="p-4">
  <div className="flex items-center gap-3">
    <div className="p-2 rounded-lg bg-purple-100">
      <Target className="w-5 h-5 text-purple-600" />
    </div>
    <div>
      <div className="text-sm text-muted-foreground">平均质量（加权）</div>
      <div className="mt-1">{aggregatedMetrics.avgQuality} 分</div>
      <div className="text-xs text-muted-foreground mt-1">
        基于作业面积加权计算
      </div>
    </div>
  </div>
</Card>
```

---

### 详细质量分析卡片

```tsx
<Card className="p-6">
  <h3 className="mb-4">质量分析详情</h3>
  
  <div className="space-y-4">
    {/* 总体质量 */}
    <div className="flex justify-between items-center p-3 bg-gray-50 rounded">
      <div>
        <div className="text-sm text-muted-foreground">总体平均质量</div>
        <div className="text-xs text-muted-foreground mt-1">面积加权</div>
      </div>
      <div className="text-2xl text-purple-600">
        {aggregatedMetrics.avgQuality} 分
      </div>
    </div>

    {/* 分类型质量 */}
    <div>
      <h4 className="mb-2 text-sm">按作业类型</h4>
      {qualityByOperationType.map(item => (
        <div key={item.type} className="flex justify-between py-2 border-b">
          <span>{item.type}</span>
          <div className="flex items-center gap-2">
            <span className="font-medium">{item.avgQuality} 分</span>
            <Badge variant="outline">{item.area} 亩</Badge>
          </div>
        </div>
      ))}
    </div>
  </div>
</Card>
```

---

## ✅ 总结

### 当前方式

```
简单算术平均 = Σ(质量) / 作业次数
```

**问题**:
- ❌ 未考虑作业面积
- ❌ 未区分作业类型
- ❌ 不能准确反映整体质量

---

### 推荐方式

```
面积加权平均 = Σ(质量 × 面积) / Σ(面积)
```

**优势**:
- ✅ 考虑作业面积权重
- ✅ 更准确反映实际情况
- ✅ 符合行业标准

---

### 实施建议

1. **立即**: 改用面积加权平均（5分钟）
2. **短期**: 增加分作业类型统计（30分钟）
3. **长期**: 实现多维度质量评估（2小时）

---

**关键改进**: 将简单平均改为面积加权平均，更科学地评估作业质量！

**修改文件**: `/components/machinery/data/OperationAnalysis.tsx`

**修改位置**: `aggregatedMetrics` 中的 `avgQuality` 计算
