# 合同接收分流：邱律师批量文件交叉核对

当邱律师(QiuTing)一次性发送多份合同时，必须先交叉核对分流，再决定是否启动workflow。

## 分流四类

| 类别 | 判定方法 | 处理 |
|------|---------|------|
| ✅ 今日已交付 | xlsx有今天日期的对应条目 | 跳过 |
| 🔄 正在审查 | `uwf thread list`显示running | 等完成，不重复启动 |
| 📋 历史已审、今日重发 | xlsx有该文件但日期更早 | **报告Doro**：可能是修改稿需重审，也可能是误发 |
| ❌ 全新未处理 | xlsx无匹配条目 | 启动workflow |

## 核对步骤

### Step 1: 提取今日QiuTing文件清单
```bash
for f in ~/.hermes/cache/documents/*.meta; do
  sender=$(python3 -c "import json; d=json.load(open('$f')); print(d.get('sender_id',''))" 2>/dev/null)
  if [ "$sender" = "QiuTing" ]; then
    ts=$(python3 -c "import json; d=json.load(open('$f')); print(int(d.get('timestamp',0)))" 2>/dev/null)
    # 比对今日时间戳范围
    filename=$(basename "$f" .meta | sed 's/^doc_[a-f0-9]*_//')
    echo "$filename"
  fi
done
```
按北京时间筛选当天00:00~24:00范围内的文件。

### Step 2: 查xlsx台账匹配
```bash
sudo /home/maggie/.hermes/hermes-agent/venv/bin/python3 << 'PYEOF'
import openpyxl
xlsx = "/home/maggie/nextcloud/data/data/doro/files/Doro合同审查任务/合同审查清单.xlsx"
wb = openpyxl.load_workbook(xlsx, read_only=True, data_only=True)
ws = wb.active
# 用关键词模糊匹配文件名（去掉前缀/后缀后取核心词）
keywords = ["关键词1", "关键词2"]  # 从文件名提取
for row in ws.iter_rows(min_row=2, values_only=True):
    row_str = str(row)
    for kw in keywords:
        if kw in row_str:
            print(f"#{row[0]} | {row[1]} | {row[2]} | {row[3]} | {row[4]}")
            break
wb.close()
PYEOF
```

**匹配要点**：文件名常有微小差异（空格、下划线、版本号），用核心关键词模糊匹配，不要精确匹配全名。

### Step 3: 查uwf运行状态
```bash
/home/maggie/.hermes/node/bin/uwf thread list | grep running
```

### Step 4: 查/tmp/contract-review/和progress目录
确认是否有文件正在队列中等待。

### Step 5: 汇总报告Doro
按四类分类呈现，对「历史已审重发」类必须询问Doro：是修改稿需重审还是误发。

## 合同发送量核查协议（Doro问"发了几份/审了几份"时）

⚠️ **Doro问邱律师发了几份合同时，必须多源交叉核对，不能只查一个来源。** 2026-06-29/30教训：Doro问了三遍"邱律师发了几份"，每次agent都漏东西。根因：只查了gateway.log的inbound消息，漏了document cache的meta文件（文件消息不产生inbound text log）。

### 必查5个源（缺一不可）

| # | 数据源 | 命令 | 提取信息 |
|---|--------|------|----------|
| 1 | gateway.log inbound消息 | `grep "2026-MM-DD" gateway.log \| grep "QiuTing" \| grep "inbound"` | 文字消息+指令（合同审查等） |
| 2 | document cache meta文件 | `for f in ~/.hermes/cache/documents/*.meta; do` 读sender_id+timestamp | 实际收到的文件（⚠️文件消息在gateway.log中msg为空） |
| 3 | 待审查目录 | `sudo find .../待审查/ -type f` | 已上传但未审完的合同 |
| 4 | 任务交付目录 | `sudo find .../任务交付/ -type f -name "【修】*"` | 已审查交付的合同 |
| 5 | xlsx台账 | `sudo python3 -c "openpyxl..."` | 已pass登记的合同 |

### meta文件时间戳转换
```python
from datetime import datetime, timezone, timedelta
bj = timezone(timedelta(hours=8))
# meta的timestamp是Unix秒，转北京时间
dt = datetime.fromtimestamp(ts, tz=bj)
print(f'{dt.strftime("%m-%d %H:%M")} Beijing - {filename}')
```

### 汇总格式（给Doro的报告）
按时间顺序列出每份合同：
- 文件名 | 发送时间(北京时间) | 审查状态(已审/待审/未审) | 交付文件(有/无)
- 去重：同文件名的重发标记"重发，与XX:XX相同"
- 最终统计：N份独立合同，X份已审，Y份未审

### 关键陷阱
1. **gateway.log里文件消息的msg字段为空** — QiuTing发送文件时，gateway记录`msg=''`，看不到文件名。必须查meta文件才能知道发了什么文件
2. **服务器时区是UTC，meta时间戳是Unix秒** — 必须转UTC+8才是北京时间，不能直接显示
3. **待审查目录可能有未清理的旧文件** — 不能只看待审查目录判断今天收了几份，要按meta时间戳筛选

## 关键陷阱

1. **重发≠重审**：邱律师有时重新发送已审查过的文件（今天5/12份是这种情况），不代表需要重新审查。必须报告Doro确认。
2. **auto_notify可能漏文件**：`auto_notify_new_file.sh` 监控inotify有时不触发（进程挂掉、文件到达太快等），不能假设自动化已处理所有新文件。手动核对是必要的。
3. **xlsx需要sudo+venv Python**：文件权限属于www-data，必须用 `sudo /home/maggie/.hermes/hermes-agent/venv/bin/python3` 读取。
4. **同名不同版**：文件名相同但日期不同的可能是新版本（如 `购销合同 朱家角` 在6/27和6/29各有一份），需比较内容确认是否修改稿。
