#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
大客户岗客户分派（2026-09-20 用户裁定）— 统一改派脚本
================================================================
裁定内容：
  · 大客户1 → 刘子研；大客户2 → 赵云浩（沿用）
  · 郑州纳克智造、中道集团：大客户3(刘新元) → 大客户2 / 赵云浩
  · 艾康生物（杭州）：华东区/王昕伟(离职) → 浙江 / 杨天雄
  · 陆军军医大学第一附属医院：华东区/王昕伟(离职) → 大客户1 / 刘子研
  · 迈克生物：大客户2/赵云浩 → 华西 / 陈溪子
  · 深圳锦瑞、深圳朗瑞：大客户2/赵云浩 → 华南2 / 林潇
  · 武汉千湖上品：→ 大客户2 / 赵云浩（原挂李江辉）
同步文件（全部留 .bak_before_ka_assign_20260920）：
  数据/pricing/_cust_sp.json         客户→销售员
  数据/pricing/_cust_meta.json       客户→{dept,sp}
  数据/pricing/_key_customers.json   页面/AI判权/价格查询归属（缺则补条目）
  数据/customer_sp_map.json          ERP 兜底映射
  数据/客户区域销售对应清单_诊断.csv   岗位/区域 权威清单
  数据/customer_360.json             客户360 卡片归属
  数据/price_index.json              价格查询 权限归属
  数据/workbench_data.json           工作台客户名单
  数据/diag_customers.json           诊断客户维度
"""
import json, io, os, csv, shutil, sys

HERE = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
BAK = '.bak_before_ka_assign_20260920'
TODAY = '2026-09-20'

# 客户 → (区域/岗位, 销售员)。GROUP 规则按 group 字段命中其全部成员。
ASSIGN = {
    '郑州纳克智造生物科技有限公司': ('大客户2', '赵云浩'),
    '郑州中道生物技术有限公司': ('大客户2', '赵云浩'),
    '艾康生物技术（杭州）有限公司': ('浙江', '杨天雄'),
    '中国人民解放军陆军军医大学第一附属医院': ('大客户1', '刘子研'),
    '迈克生物股份有限公司': ('华西', '陈溪子'),
    '深圳市锦瑞生物科技股份有限公司': ('华南2', '林潇'),
    '深圳市朗瑞生物科技有限公司': ('华南2', '林潇'),
    '武汉千湖上品水产有限公司': ('大客户2', '赵云浩'),
}
GROUP_ASSIGN = {'中道集团': ('大客户2', '赵云浩')}
DEPT_OF = {'大客户1': '大客户部', '大客户2': '大客户部', '大客户3': '大客户部',
           '浙江': '销售拓展部', '华西': '销售拓展部', '华南2': '销售拓展部'}
# 需要补进 _key_customers 的客户（原来根本不在该文件里）
ADD_TO_KKEY = ['深圳市锦瑞生物科技股份有限公司', '深圳市朗瑞生物科技有限公司', '武汉千湖上品水产有限公司']

def path(rel): return os.path.join(HERE, rel)

def backup(rel):
    p = path(rel)
    if os.path.exists(p) and not os.path.exists(p + BAK):
        shutil.copy(p, p + BAK)
        return True
    return False

log = []

def load(rel):
    return json.load(io.open(path(rel), encoding='utf-8'))

def save(rel, obj):
    io.open(path(rel), 'w', encoding='utf-8').write(json.dumps(obj, ensure_ascii=False, indent=1))

# ── ① _cust_sp.json：客户→销售员 ──
rel = '数据/pricing/_cust_sp.json'
backup(rel); d = load(rel); n = 0
for k, (area, sp) in ASSIGN.items():
    if k in d:
        if d[k] != sp:
            d[k] = sp; n += 1
save(rel, d); log.append(('_cust_sp.json', n))

# ── ② _cust_meta.json：客户→{dept,sp} ──
rel = '数据/pricing/_cust_meta.json'
backup(rel); d = load(rel); n = 0
for k, (area, sp) in ASSIGN.items():
    if k in d:
        want = {'dept': DEPT_OF.get(area, d[k].get('dept', '')), 'sp': sp}
        if d[k] != want:
            d[k] = want; n += 1
save(rel, d); log.append(('_cust_meta.json', n))

# ── ③ _key_customers.json：sales/salesperson（缺则补）──
rel = '数据/pricing/_key_customers.json'
backup(rel); d = load(rel); n = 0; exist = {c['name'] for c in d}
for c in d:
    hit = ASSIGN.get(c['name']) or GROUP_ASSIGN.get((c.get('group') or '').strip())
    if hit:
        if c.get('sales') != hit[1] or c.get('salesperson') != hit[1]:
            c['sales'] = hit[1]; c['salesperson'] = hit[1]; n += 1
for name in ADD_TO_KKEY:
    if name not in exist:
        area, sp = ASSIGN[name]
        d.append({'name': name, 'file': name, 'group': '', 'group_name': '',
                  'sales': sp, 'salesperson': sp, 'total': 0, 'orders': 0, 'products': 0,
                  'latest_date': '', 'contacts': 0, 'opps': 0, 'projects': 0, 'complaints': 0,
                  'decision_url': False, 'sales_2024': 0, 'sales_2025': 0, 'sales_2026': 0,
                  '_note': '2026-09-20 分派新增'})
        n += 1
save(rel, d); log.append(('_key_customers.json', n))

# ── ④ customer_sp_map.json：map ──
rel = '数据/customer_sp_map.json'
backup(rel); d = load(rel); n = 0
for k, (area, sp) in ASSIGN.items():
    if d['map'].get(k) != sp:
        d['map'][k] = sp; n += 1
d['note_reassign_20260920'] = '大客户岗分派：纳克智造/中道→赵云浩，艾康→杨天雄，陆军军医大一附院→刘子研，迈克→陈溪子，锦瑞/朗瑞→林潇，千湖上品→赵云浩'
save(rel, d); log.append(('customer_sp_map.json', n))

# ── ⑤ 客户区域销售对应清单_诊断.csv ──
rel = '数据/客户区域销售对应清单_诊断.csv'
backup(rel); n = 0
rows = list(csv.DictReader(io.open(path(rel), encoding='utf-8-sig')))
for r in rows:
    hit = ASSIGN.get(r['客户']) or GROUP_ASSIGN.get(r['客户'])
    if hit and (r['区域'] != hit[0] or r['销售员'] != hit[1]):
        r['区域'], r['销售员'], r['部门'] = hit[0], hit[1], DEPT_OF.get(hit[0], r['部门']); n += 1
with io.open(path(rel), 'w', encoding='utf-8-sig', newline='') as f:
    w = csv.DictWriter(f, fieldnames=['客户', '区域', '部门', '销售员'])
    w.writeheader(); w.writerows(rows)
log.append(('客户区域销售对应清单_诊断.csv', n))

# ── ⑥ customer_360.json：sales 字段 ──
rel = '数据/customer_360.json'
if os.path.exists(path(rel)):
    backup(rel)
    raw = io.open(path(rel), encoding='utf-8').read()
    d = json.loads(raw); n = 0
    for c in (d.get('customers') or d if isinstance(d, list) else []):
        if isinstance(c, dict) and c.get('name') in ASSIGN:
            sp = ASSIGN[c['name']][1]
            if c.get('sales') != sp:
                c['sales'] = sp; c['sales_source'] = 'ka_assign_20260920'; n += 1
    save(rel, d); log.append(('customer_360.json', n))

# ── ⑦ price_index.json：递归修所有 customer+salespersons / sales ──
rel = '数据/price_index.json'
if os.path.exists(path(rel)):
    backup(rel)
    d = load(rel); n = 0
    def walk(o):
        global n
        if isinstance(o, dict):
            if o.get('customer') in ASSIGN:
                sp = ASSIGN[o['customer']][1]
                if 'salespersons' in o and o['salespersons'] != [sp]:
                    o['salespersons'] = [sp]; n += 1
                if 'sales' in o and o['sales'] != sp:
                    o['sales'] = sp; n += 1
            for v in o.values(): walk(v)
        elif isinstance(o, list):
            for v in o: walk(v)
    walk(d); save(rel, d); log.append(('price_index.json', n))

# ── ⑧ workbench_data.json：customers 数组的 sales/salesperson ──
rel = '数据/workbench_data.json'
if os.path.exists(path(rel)):
    backup(rel)
    d = load(rel); n = 0
    for c in (d.get('customers') or []):
        if isinstance(c, dict) and c.get('name') in ASSIGN:
            sp = ASSIGN[c['name']][1]
            if c.get('sales') != sp or c.get('salesperson') != sp:
                c['sales'] = sp; c['salesperson'] = sp; n += 1
    save(rel, d); log.append(('workbench_data.json', n))

# ── ⑨ diag_customers.json：salespeople ──
rel = '数据/diag_customers.json'
if os.path.exists(path(rel)):
    backup(rel)
    d = load(rel); n = 0
    _lst = d if isinstance(d, list) else (d.get('customers') or [])
    for c in _lst:
        if isinstance(c, dict) and c.get('name') in ASSIGN and c.get('salespeople') != [ASSIGN[c['name']][1]]:
            c['salespeople'] = [ASSIGN[c['name']][1]]; n += 1
    save(rel, d); log.append(('diag_customers.json', n))

print('  文件                        改动')
for f, n in log:
    print('  %-34s %s' % (f, ('%d 处' % n) if n else '已是最新'))
print('\n  备份后缀:', BAK)
