#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""抽取生产代码里的 _clean_block / _block_empty 原样执行，验证新字段是否会被丢弃。
   不写任何生产数据。"""
import io, os, textwrap

SRC = os.path.expanduser('~/Desktop/Hermes输出-工作类/脚本/销售工作台服务.py')
s = io.open(SRC, encoding='utf-8').read()

i = s.find('def _clean_block(b):')
k = s.find('def _block_empty(bb):')
j = s.find('blocks = [_clean_block(b) for b in raw_blocks]')
assert i > 0 and k > i and j > k, "定位失败"
seg = textwrap.dedent(s[i:k]) + "\n" + textwrap.dedent(s[k:j])
ns = {}
exec(compile(seg, '<extracted>', 'exec'), ns)
_clean_block = ns['_clean_block']
_block_empty = ns['_block_empty']

print("=" * 74)
print("① 场景 A：只填【旧字段】—— 基线（应保留）")
print("=" * 74)
old = {'opp': '甲乙流项目', 'need': '荧光定量酶', 'decision': [{'name': '张总', 'title': '研发总监', 'role': '决策人'}]}
r = _clean_block(old)
print(f"  输出 keys: {sorted(r.keys())}")
print(f"  _block_empty → {_block_empty(r)}   （False = 块被保留 ✅）")

print()
print("=" * 74)
print("② 场景 B：只填【新字段】（草图 P0）—— 关键验证")
print("=" * 74)
new = {
    'founded_year': '2015', 'registered_capital_wan': '5000',
    'corp_nature': '人医', 'strategy_focus': ['呼吸道感染为主', '肿瘤为主'],
    'financing_status': '已上市（科创板 / 创业板）', 'headcount_scale': '200 ~ 500 人',
    'license_status': '已有注册证', 'license_count': '12',
    'risk_notes': '回款放缓', 'risk_note_source': '客户访谈 2026-08',
    'price_priority': '性能优先', 'vendor_decider': '研发决定',
    'negotiation_rounds': '2 轮（研发谈价 + 采购再砍）', 'pain_notes': '降本 15%',
    'segment': 'IVD 注册', 'product_line': '呼吸道6重',
    'annual_volume_t': '300', 'reaction_system': '25ul 全预混',
    'incumbent_brand': '诺唯赞', 'test_status': '测试中',
    'test_feedback': 'CV 略高', 'opportunity': '2027 报 7 重',
}
r2 = _clean_block(new)
print(f"  输入 {len(new)} 个新字段")
print(f"  输出 keys: {sorted(r2.keys())}")
survived = [k for k in new if k in r2 and r2[k]]
dropped = [k for k in new if k not in r2 or not r2[k]]
print(f"  ✅ 存活: {len(survived)} 个 → {survived}")
print(f"  ❌ 丢弃: {len(dropped)} 个 → {dropped}")
print(f"  _block_empty → {_block_empty(r2)}   （True = 整块被丢弃 🔴）")

print()
print("=" * 74)
print("③ 场景 C：新字段 + decision[] 行内新子字段")
print("=" * 74)
mixed = {'opp': 'x', 'decision': [{'name': '李工', 'influence_tier': '技术把关',
                                   'reports_to': '张总', 'attitude': '支持',
                                   'comm_pref': '只认数据', 'focus_point': '批间差'}]}
r3 = _clean_block(mixed)
d = (r3.get('decision') or [{}])[0]
print(f"  decision[] 输出子字段: {sorted(d.keys())}")
lost = [k for k in ('influence_tier', 'reports_to', 'attitude', 'comm_pref', 'focus_point') if k not in d]
print(f"  ❌ 丢失的子字段: {lost}")

print()
print("=" * 74)
print("④ 结论")
print("=" * 74)
print(f"  新块级字段存活率: {len(survived)}/{len(new)}")
print(f"  只填新字段时整块是否被判空: {_block_empty(r2)}")
print(f"  decision 新子字段存活率: {5-len(lost)}/5")
