# refresh_erp.py mtime 排序陷阱

## 问题
`refresh_erp.py` 旧代码使用 `sorted()` 按文件名排序选取"最新"ERP导出文件。但 `销售订单_2026年`（ASCII下划线=95）会排在 `销售订单导出-`（中文字符 > 128）之前，导致选了旧文件而非真正最新上传的文件。

## 修复（2026-07-20）
```python
# ❌ 错误：按文件名排序
files = sorted([f for f in os.listdir(SRC) if f.startswith('销售订单') and f.endswith('.xlsx')])
latest = files[-1]

# ✅ 正确：按 mtime 排序
files = [os.path.join(SRC,f) for f in os.listdir(SRC) if f.startswith('销售订单') and f.endswith('.xlsx')]
files.sort(key=lambda f: os.path.getmtime(f))
latest_file = files[-1]
```

## CRM Excel → MCP JSON 合并脚本
当用户上传 CRM 活动导出 Excel，而 `mcp_activities.json` 缺少当月数据时：
```python
import json, pandas as pd
from datetime import datetime

with open('数据/mcp_activities.json') as f: old = json.load(f)
df = pd.read_excel(fp, dtype=str)
df['date'] = df['创建时间'].str.strip().str[:10]

# by_month: {date: {dept: count}}
by_month = dict(old.get('by_month', {}))
for date_key, grp in df.groupby('date'):
    if date_key not in by_month: by_month[date_key] = {}
    by_month[date_key]['诊断原料销售部'] = by_month[date_key].get('诊断原料销售部',0) + len(grp)

# by_creator: {name: count}（int值，非dict）
by_creator = dict(old.get('by_creator', {}))
for name, cnt in df['创建者'].value_counts().items():
    by_creator[name] = by_creator.get(name,0) + int(cnt)

old['total'] = sum(sum(v.values()) for v in by_month.values())
old['updated'] = datetime.now().strftime('%Y-%m-%d %H:%M')
# ...
```

**注意**：CRM 导出无部门列，默认归 `诊断原料销售部`；`by_creator` 值是 int 不是 dict。
