# 三部门KPI目标文件格式

## 文件结构

三个Excel文件，每个对应一个部门：
- `1、2026上半年月度数据-诊断原料大客户销售部.xlsx`
- `2、2026上半年月度数据-诊断原料销售拓展部.xlsx`
- `3、2026上半年月度数据-生命科学销售部.xlsx`

## Sheet布局

每个文件Sheet1包含两个主要区域：

### 区域一：部门年度目标达成统计表
- 行3: 标题 "一、部门年度目标每月达成统计表"
- 行4: 表头（A=部门, C=月份, D~I=1~6月, P=年度目标）
- 行5: 部门月度目标（A=部门名, C=月度目标, D~I=各月数字, P=年目标）
- 行6: 实际完成（A为空!, C=实际完成, D~I=各月实际, P=H1合计）
- 行7: 达成率

### 区域二：个人年度目标达成统计表
- 行N: "二、个人年度目标达成统计表"
- 行N+1: 表头（A=销售人员, C=月份）
- 随后每3行为一组：月度目标行/实际完成行/达成率行

每组个人数据：
- 行X: A=姓名, C=月度目标, D~I=各月目标, P=年目标
- 行X+1: A=空!, C=实际完成, D~I=各月实际, P=H1合计
- 行X+2: C=达成率

## 解析Pitfalls

### 1. 部门名检测
"诊断原料销售拓展部"中不包含"销售部"子串！正确检测：`'销售' in a`

### 2. 合并单元格
"实际完成"行A列为空（因上面"月度目标"行合并了A列）。必须跟踪`current_person`状态。

### 3. 姓名后缀
销售拓展部文件中姓名带后缀，如"李江辉（承接华西区域）""黄文才（承接龙友波）"。
清理：`re.sub(r'[（(][^)）]*[)）]', '', name).strip()`

### 4. 重复条目（过程KPI区）
文件后半部分可能有过程KPI数据（拜访次数等），用相同姓名但数值很小（0.833/2/1 vs 数十万）。
解决：只保留`annual`目标值最高的那条记录（营收数据远大于过程指标）。

### 5. 年目标读取
年目标在P列（年度达成情况列），值可能是整数如26500000或34000000。
某些人P列为空，需从月度目标之和估算（×2）。

### 6. 达成率计算
H1达成率 = H1实际完成 / 全年目标（不是半年目标！）
例如：年目标3400w, H1实际1354w → 达成率=39.8%（非79.6%）

### 7. 离职人员
跳过含"离职"字样的行。如"黄明月（离职）"。

## KPI JSON输出格式

```json
{
  "period": "2026年H1",
  "total_target": 69500000,
  "total_h1": 21640000,
  "total_h1_rate": 31.1,
  "h1_labels": ["1月","2月","3月","4月","5月","6月"],
  "depts": [
    {"dept":"销售拓展部","target":34000000,"h1_months":[3437599,...],"h1_total":13536399,"h1_rate":39.8,...}
  ],
  "people": [
    {"name":"刘虹晶","dept":"销售拓展部","target":3400000,"h1_months":[478815,...],"h1_total":2430335,"h1_rate":71.5,...}
  ]
}
```

注意：部门条目用`dept`字段，个人条目用`name`字段。两者都有`dept`（部门归属）。
前端渲染时使用`data[0].name`（而非`data[0].dept`）区分部门/个人表。
