#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""诊断：飞书「关联一级课题组」覆盖率极低（1.5%），看与科研单的重合度，并找课题组的其它落点。"""
import io
import json
from collections import Counter

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
KT = json.load(io.open(ROOT + '/数据/order_ketizu_map.json', encoding='utf-8'))
D = json.load(io.open(ROOT + '/销售分析/科研销售_按人与区域_20260820-20260930.json', encoding='utf-8'))

ls_nos = {str(r['单据编号']).strip() for r in D['raw']}
print('科研单数（本报告口径）: %d' % len(ls_nos))
have = {k: v for k, v in KT['map'].items() if v}
print('飞书有课题组的单据: %d ｜ 课题组数 %d' % (len(have), len(set(have.values()))))
inter = ls_nos & set(have.keys())
print('两者交集（科研单且有课题组）: %d' % len(inter))
for no in sorted(inter):
    amt = [r['价税合计'] for r in D['raw'] if str(r['单据编号']).strip() == no]
    who = [r['销售员'] for r in D['raw'] if str(r['单据编号']).strip() == no]
    cust = [r['客户'] for r in D['raw'] if str(r['单据编号']).strip() == no]
    print('  %-16s %-12s %10.2f 元 ｜ %s ｜ %s' % (no, have[no], sum(amt), who[0] if who else '', cust[0][:22] if cust else ''))
print()
print('有课题组但不在科研口径的单据（属其它部门）: %d' % len(set(have) - ls_nos))
print('  课题组分布:', dict(Counter(have.values())))

print('\n=== 课题组的其它可能落点 ===')
# 活动里客户 → 是否带课题组？活动字段无课题组；拜访计划有 field_5a29f8
print('  ① 拜访计划-生命科学专用.field_5a29f8 拜访计划关联课题组 → 指向商机(story)')
print('  ② 商机(story) 本身 = 课题组，带 field_d3c543 课题组模式(一类/二类/三类)、field_2c3bee 一级课题组')
print('  ③ 销售订单.field_2e119c 关联一级课题组 → 实测覆盖率 1.5%（几乎没填）')
print('\n  → 结论：课题组台账在「商机(story)」里，但订单几乎没挂课题组，无法从订单侧归集。')
