from pathlib import Path
import openpyxl, math

SRC = Path('/Users/neo/.hermes/cache/documents/doc_259cbd37e734_万传安徽_V9_v2.1_R66拆3sub+12sub行全拆开_20260512.xlsx')
OUTDIR = Path('/Users/neo/.hermes/audits/cashflow-asset-hook-20260512-083049')
STAMP = '20260513-074532'
cf_md = OUTDIR / f'phase5_cf_D38_D47_formula_bottom_trace_{STAMP}.md'
cmp_md = OUTDIR / f'phase5_R29_R58_formula_compare_issues_{STAMP}.md'
summary_md = OUTDIR / f'phase5_long_asset_R29_R58_investigation_summary_{STAMP}.md'

wbf = openpyxl.load_workbook(SRC, data_only=False, read_only=False, keep_links=True)
wbv = openpyxl.load_workbook(SRC, data_only=True, read_only=False, keep_links=True)

def f(sheet, cell):
    return wbf[sheet][cell].value

def v(sheet, cell):
    return wbv[sheet][cell].value

def num(x):
    if x is None or x == '': return 0.0
    try: return float(x)
    except Exception: return float('nan')

def fmt(x):
    if x is None: return ''
    if isinstance(x, float) or isinstance(x, int):
        if math.isnan(float(x)): return 'NaN'
        return f'{float(x):,.2f}'
    return str(x)

def get_formula(sheet, cell):
    x=f(sheet,cell)
    return '' if x is None else str(x)

def line_table(rows):
    return '\n'.join(rows)

# Values for calculations
D39_terms = [
    ('试算表!B54', '固定资产净额-年初', v('试算表','B54')),
    ('试算表!B57', '在建工程净额-年初', v('试算表','B57')),
    ('试算表!B70', '无形资产净额-年初', v('试算表','B70')),
    ('试算表!B75', '长期待摊费用-年初', v('试算表','B75')),
    ('试算表!B42', '投资性房地产净额-年初', v('试算表','B42')),
    ('附注!F364', '预付购建长期资产款项-年初/其他非流动资产口径', v('附注','F364')),
    ('试算表!B71', '开发支出-年初', v('试算表','B71')),
    ('试算表!B66', '使用权资产净额-年初', v('试算表','B66')),
]
D46_terms = [
    ('试算表!H54', '固定资产净额-期末/调整后', v('试算表','H54')),
    ('试算表!H57', '在建工程净额-期末/调整后', v('试算表','H57')),
    ('试算表!H70', '无形资产净额-期末/调整后', v('试算表','H70')),
    ('试算表!H75', '长期待摊费用-期末/调整后', v('试算表','H75')),
    ('试算表!H42', '投资性房地产净额-期末/调整后', v('试算表','H42')),
    ('附注!E364', '预付购建长期资产款项-期末/其他非流动资产口径', v('附注','E364')),
    ('试算表!H71', '开发支出-期末/调整后', v('试算表','H71')),
    ('试算表!H66', '使用权资产净额-期末/调整后', v('试算表','H66')),
]
D40_components = [
    ('现金流量表!D28', '购建长期资产支付现金小计，底稿C251', v('现金流量表','D28')),
    ('-附注!C691', '扣除采购工程/设备进项税，不作为长期资产增加贡献', -num(v('附注','C691'))),
    ('-现金流量表底稿!C242', '扣除预付账款购建长期资产款期末-期初', -num(v('现金流量表底稿','C242'))),
    ('-现金流量表底稿!C243', '扣除应付购建长期资产款期初-期末', -num(v('现金流量表底稿','C243'))),
    ('-现金流量表底稿!C241', '扣除/抵消本期利息资本化底稿项', -num(v('现金流量表底稿','C241'))),
]
D40_d28_bottom = []
for r in range(238,251):
    D40_d28_bottom.append((f'现金流量表底稿!C{r}', str(v('现金流量表底稿',f'B{r}') or ''), f('现金流量表底稿',f'C{r}'), v('现金流量表底稿',f'C{r}')))
D43_d23_bottom=[]
for r in range(188,204):
    D43_d23_bottom.append((f'现金流量表底稿!C{r}', str(v('现金流量表底稿',f'B{r}') or ''), f('现金流量表底稿',f'C{r}'), v('现金流量表底稿',f'C{r}')))
D42_bottom=[
    ('现金流量表!L8', '固定资产折旧', f('现金流量表','L8'), v('现金流量表','L8'), '现金流量表底稿!C408 -> C406:C407 -> 固定资产!H30'),
    ('现金流量表!L9', '投资性房地产折旧', f('现金流量表','L9'), v('现金流量表','L9'), '现金流量表底稿!C412 -> C410:C411 -> 投资性房地产!D29'),
    ('现金流量表!L10', '使用权资产折旧', f('现金流量表','L10'), v('现金流量表','L10'), "现金流量表底稿!C416 -> C414:C415 -> '使用权资产 '!G21"),
    ('现金流量表!L11', '无形资产摊销', f('现金流量表','L11'), v('现金流量表','L11'), '现金流量表底稿!C420 -> C418:C419 -> 无形资产变动表!I27'),
    ('现金流量表!L12', '长期待摊费用摊销', f('现金流量表','L12'), v('现金流量表','L12'), '现金流量表底稿!C424 -> C422:C423 -> 长期待摊费用变动明细表!L17'),
]
D43_components = [
    ('-(现金流量表!D23)', '先扣除处置长期资产现金净额/底稿C204整体', -num(v('现金流量表','D23'))),
    ('+现金流量表底稿!C198', '应收资产处置款期初-期末加回，当前空/0', num(v('现金流量表底稿','C198'))),
    ('+现金流量表底稿!C199', '预收资产处置款期末-期初加回，当前空/0', num(v('现金流量表底稿','C199'))),
    ('-现金流量表!L13', '扣除处置损失/收益调节项；L13=-试算表Y22+附注C1067', -num(v('现金流量表','L13'))),
    ('-SUM(资产减值明细表!C23:C25)', '扣除固定/在建/无形资产减值损失，当前0', -sum(num(v('资产减值明细表',f'C{r}')) for r in [23,24,25])),
    ('+附注!C689', '加回销售固定资产设备销项税，和D23中的C197形成抵消', num(v('附注','C689'))),
]

# Manual recalcs
manual = {
    'D39': sum(num(x[2]) for x in D39_terms),
    'D40': sum(num(x[2]) for x in D40_components),
    'D42': -num(v('现金流量表','L9'))-num(v('现金流量表','L11'))-num(v('现金流量表','L12'))-num(v('现金流量表','L8'))-num(v('现金流量表','L10')),
    'D43': sum(num(x[2]) for x in D43_components),
    'D44': num(v('现金流量表','D39'))+num(v('现金流量表','D40'))+0+num(v('现金流量表','D42'))+num(v('现金流量表','D43')),
    'D46': sum(num(x[2]) for x in D46_terms),
}
manual['D47'] = manual['D44'] - manual['D46']

cf_lines=[]
cf_lines.append('# Phase 5 — 现金流量表 D38:D47 公式全量获取与底层下钻')
cf_lines.append('')
cf_lines.append(f'- 源文件：`{SRC}`')
cf_lines.append('- 口径：只读；以 `现金流量表!D38:D47` 为 ground truth，不改源表。')
cf_lines.append('- 说明：D38 是标题、D45 是空白分隔行；D41 源表无 D 列公式/金额，按 0/空处理。')
cf_lines.append('')
cf_lines.append('## 1. D38:D47 原公式与业务含义')
cf_lines.append('')
cf_lines.append('| 单元格 | 行项目 | 公式 | cached值 | 业务含义 | 公式完整性 |')
cf_lines.append('|---|---|---|---:|---|---|')
meanings={
    38:'长期资产循环校验标题行，不参与计算。',
    39:'年初长期资产账面/净额合计，来自试算表和附注中的各长期资产年初余额。',
    40:'本年增加：从购建长期资产支付现金 D28 出发，剔除进项税、预付/应付购建款、资本化利息等现金/税费/往来调整后得到的长期资产增加口径。',
    41:'其他变动：当前现金流量表 D 列没有公式/金额，视为 0。',
    42:'本年折旧摊销：固定资产折旧、投房折旧、使用权折旧、无形摊销、长摊摊销的非现金减少。',
    43:'本年减少：处置长期资产现金净额、处置损益/报废毁损、资产减值及销项税抵消后的长期资产减少口径。',
    44:'年末数：D39+D40+D41+D42+D43 的循环推算结果。',
    45:'空白分隔行，不参与计算。',
    46:'账面数：期末长期资产账面/净额合计，来自试算表和附注期末余额。',
    47:'校验：循环推算年末数 D44 与账面数 D46 的差异。',
}
for r in range(38,48):
    cell=f'D{r}'
    formula = f('现金流量表', cell)
    val = v('现金流量表', cell)
    label = v('现金流量表', f'B{r}') or ''
    complete = '公式已获取' if isinstance(formula,str) and formula.startswith('=') else ('源表空/标题，非公式行' if r in [38,41,45] else '无公式')
    cf_lines.append(f'| {cell} | {label} | `{formula if formula is not None else ""}` | {fmt(val)} | {meanings[r]} | {complete} |')
cf_lines.append('')
cf_lines.append('## 2. 底层下钻与数值验证')
cf_lines.append('')
cf_lines.append('### 2.1 D39 年初数')
cf_lines.append(f'- 原公式：`{get_formula("现金流量表","D39")}`')
cf_lines.append('- 业务含义：年初长期资产净额/账面口径合计。')
cf_lines.append('| 底层单元格 | 业务含义 | 公式/下层来源 | cached值 |')
cf_lines.append('|---|---|---|---:|')
for cell, meaning, val in D39_terms:
    sh, co = cell.split('!')
    cf_lines.append(f'| {cell} | {meaning} | `{get_formula(sh,co)}` | {fmt(val)} |')
cf_lines.append(f'- 复算：`{fmt(manual["D39"])}`；现金流量表 D39：`{fmt(v("现金流量表","D39"))}`；差异：`{fmt(manual["D39"]-num(v("现金流量表","D39")))}`。')
cf_lines.append('')
cf_lines.append('关键底层示例：固定资产年初 `试算表!B54=B51-B52-B53` = 固定资产原值 `数据源_CF小合并!F49` - 累计折旧 `F50` - 减值准备 `F51`；在建工程年初 `试算表!B57=B55-B56`，其中 `B55=数据源_CF小合并!F54`。')
cf_lines.append('')
cf_lines.append('### 2.2 D40 本年增加')
cf_lines.append(f'- 原公式：`{get_formula("现金流量表","D40")}`')
cf_lines.append('- 业务含义：从购建长期资产现金流出 D28/底稿 C251 出发，剔除不应作为长期资产增加贡献的税费与往来/资本化调整。')
cf_lines.append('| 公式项 | 业务含义 | 金额贡献 |')
cf_lines.append('|---|---|---:|')
for cell, meaning, val in D40_components:
    cf_lines.append(f'| {cell} | {meaning} | {fmt(val)} |')
cf_lines.append(f'- 复算：`{fmt(manual["D40"])}`；现金流量表 D40：`{fmt(v("现金流量表","D40"))}`；差异：`{fmt(manual["D40"]-num(v("现金流量表","D40")))}`。')
cf_lines.append('')
cf_lines.append('D28 / 底稿 C251 下钻：')
cf_lines.append('| 底稿单元格 | 行项目 | 公式 | cached值 | 在D40中的业务处理 |')
cf_lines.append('|---|---|---|---:|---|')
for cell, label, form, val in D40_d28_bottom:
    treatment = '进入D28后仍进入D40' if cell in ['现金流量表底稿!C238','现金流量表底稿!C239','现金流量表底稿!C244','现金流量表底稿!C245','现金流量表底稿!C246','现金流量表底稿!C247','现金流量表底稿!C248','现金流量表底稿!C249','现金流量表底稿!C250'] else '进入D28后又被D40公式扣除/净影响应为0'
    cf_lines.append(f'| {cell} | {label} | `{form if form is not None else ""}` | {fmt(val)} | {treatment} |')
cf_lines.append('')
cf_lines.append('### 2.3 D41 其他变动')
cf_lines.append('- 源表 `现金流量表!D41` 无公式/金额；业务含义为其他变动，当前 ground truth 是 0。')
cf_lines.append('')
cf_lines.append('### 2.4 D42 本年折旧摊销')
cf_lines.append(f'- 原公式：`{get_formula("现金流量表","D42")}`')
cf_lines.append('- 业务含义：长期资产折旧/摊销作为非现金减少，金额取负。')
cf_lines.append('| 现金流单元格 | 业务含义 | 公式 | cached值 | 底层路径 |')
cf_lines.append('|---|---|---|---:|---|')
for cell, meaning, form, val, path in D42_bottom:
    cf_lines.append(f'| {cell} | {meaning} | `{form}` | {fmt(val)} | {path} |')
cf_lines.append(f'- 复算：`{fmt(manual["D42"])}`；现金流量表 D42：`{fmt(v("现金流量表","D42"))}`；差异：`{fmt(manual["D42"]-num(v("现金流量表","D42")))}`。')
cf_lines.append('')
cf_lines.append('### 2.5 D43 本年减少')
cf_lines.append(f'- 原公式：`{get_formula("现金流量表","D43")}`')
cf_lines.append('- 业务含义：长期资产处置/减少。核心是 `D23=C204=SUM(C188:C203)`，再按现金流表公式加回应收/预收调整、扣除 L13 和资产减值，并加回销项税。')
cf_lines.append('| 公式项 | 业务含义 | 金额贡献 |')
cf_lines.append('|---|---|---:|')
for cell, meaning, val in D43_components:
    cf_lines.append(f'| {cell} | {meaning} | {fmt(val)} |')
cf_lines.append(f'- 复算：`{fmt(manual["D43"])}`；现金流量表 D43：`{fmt(v("现金流量表","D43"))}`；差异：`{fmt(manual["D43"]-num(v("现金流量表","D43")))}`。')
cf_lines.append('')
cf_lines.append('D23 / 底稿 C204 下钻：')
cf_lines.append('| 底稿单元格 | 行项目 | 公式 | cached值 | 对D43贡献/处理 |')
cf_lines.append('|---|---|---|---:|---|')
for cell, label, form, val in D43_d23_bottom:
    r=int(cell.split('C')[-1])
    if r in [198,199]:
        treatment='D43公式从D23中扣除后加回，净影响为0；当前为空/0。'
    elif r==197:
        treatment='D23中包含，D43末尾再 +附注C689，理论净影响为0；当前目标sheet未正确净额化。'
    elif r==196:
        treatment='D23中包含，需与 L13/附注C1067 路径抵消。'
    elif r==202:
        treatment='D23中包含，D43应扣减；当前目标sheet遗漏该项。'
    else:
        treatment='随D23进入D43，按 -D23 方向贡献。'
    cf_lines.append(f'| {cell} | {label} | `{form if form is not None else ""}` | {fmt(val)} | {treatment} |')
cf_lines.append('')
cf_lines.append('### 2.6 D44 / D46 / D47 派生校验')
cf_lines.append('| 单元格 | 公式 | 业务含义 | 复算值 | 源表值 | 差异 |')
cf_lines.append('|---|---|---|---:|---:|---:|')
for cell, meaning in [('D44','D39+D40+D41+D42+D43 推算年末数'), ('D46','期末账面数，来自试算表/附注期末长期资产净额'), ('D47','D44-D46 校验差异')]:
    cf_lines.append(f'| 现金流量表!{cell} | `{get_formula("现金流量表",cell)}` | {meaning} | {fmt(manual[cell])} | {fmt(v("现金流量表",cell))} | {fmt(manual[cell]-num(v("现金流量表",cell)))} |')
cf_lines.append('')
cf_lines.append('D46 下钻：')
cf_lines.append('| 底层单元格 | 业务含义 | 公式/下层来源 | cached值 |')
cf_lines.append('|---|---|---|---:|')
for cell, meaning, val in D46_terms:
    sh, co = cell.split('!')
    cf_lines.append(f'| {cell} | {meaning} | `{get_formula(sh,co)}` | {fmt(val)} |')
cf_lines.append('')
cf_lines.append('## 3. 现金流量表侧验证结论')
cf_lines.append('')
cf_lines.append('- D39/D40/D42/D43/D44/D46/D47 的公式均已获取，并用底层 cached values 复算为源表值。')
cf_lines.append('- D38 为标题、D45 为空白；D41 在源表 D 列本身为空/0，不是抽取遗漏。')
cf_lines.append('- 现金流量表侧未发现公式少取或 cached 数值不正确；后续问题集中在 `长期资产循环_全量穿透校验!R29:R58` 的拆分/父子项逻辑。')

# Compare report
wsf=wbf['长期资产循环_全量穿透校验']; wsv=wbv['长期资产循环_全量穿透校验']
cmp=[]
cmp.append('# Phase 5 — 长期资产循环_全量穿透校验 R29:R58 公式对照与问题定位')
cmp.append('')
cmp.append(f'- 源文件：`{SRC}`')
cmp.append('- 目标范围：`长期资产循环_全量穿透校验!R29:R58`。')
cmp.append('- 规则：父行必须来自下方子项的合计/净贡献；不能用现金流 D 列或旧 helper residual 直接 plug 父行。')
cmp.append('')
cmp.append('## 1. 主行数值对照')
cmp.append('| 行 | 对应CF | 项目 | 当前K | L/现金流 | 差异K-L | 状态 | 当前K公式 |')
cmp.append('|---:|---|---|---:|---:|---:|---|---|')
for r in [32,33,45,49,50,56,57,58]:
    k=wsv[f'K{r}'].value; l=wsv[f'L{r}'].value; m=wsv[f'M{r}'].value
    status='PASS' if (isinstance(m,(int,float)) and abs(m)<0.001) else ('FORMULA_MISSING/BLANK' if k is None and l is None else 'FAIL')
    cmp.append(f'| {r} | {wsv[f"A{r}"].value or ""} | {wsv[f"B{r}"].value or ""} | {fmt(k)} | {fmt(l)} | {fmt(m)} | {status} | `{wsf[f"K{r}"].value or ""}` |')
cmp.append('')
cmp.append('## 2. 子项覆盖性：现金流 ground truth vs 当前 R29:R58')
cmp.append('')
cmp.append('### 2.1 D39 年初数 / R32')
cmp.append('- 数值：当前 `K32=L32=649,442,748.26`，数值 PASS。')
cmp.append('- 但公式覆盖有结构性问题：现金流 D39 使用 `试算表!B71`（开发支出）和 `试算表!B66`（使用权资产），并使用 `附注!F364`（预付购建长期资产款项/其他非流动资产口径）。当前 R32 使用 `H32=试算表!B66`、`I32=附注!F364`、`J32=试算表!B61`，**漏了 `试算表!B71`，多了 `试算表!B61` 生产性生物资产**。当前两者都是 0，所以没产生差异，但不是完整复刻 D39 公式。')
cmp.append('')
cmp.append('### 2.2 D40 本年增加 / R33:R44')
cmp.append(f'- 当前 `K33={fmt(wsv["K33"].value)}`，现金流 `L33={fmt(wsv["L33"].value)}`，差异 `{fmt(wsv["M33"].value)}`。')
cmp.append('- 根因：R33 当前 `C33:G33` 等父项是 `SUM(34:43)`，把 R36 `进项税=附注!C691=56,238,565.00` 作为正向子项纳入；但现金流 D40 的公式是 `D28-附注!C691-C242-C243-C241`，进项税在 D28/C251 中出现后又被 D40 扣除，净贡献应为 0。')
cmp.append('- 结构性风险：R37/R38/R39 对应 `C241/C242/C243` 当前为 0，但源公式同样从 D28 后再扣除，若未来非零，当前 `SUM(C34:C43)` 会继续多/少勾稽。')
cmp.append('- 子项覆盖问题：D28/C251 包含 `C248:C250`，当前 R29:R58 没有对 `C249:C250` 的显式行；R44 写了“使用权增加(不入D40)”但没有 L/M/N，也没有纳入父项。当前这些为 0，数值暂不影响。')
cmp.append('- 判断：R33 是明确错误；且如果坚持“父行=子项合计”，R36/R37/R38/R39 应改成净贡献子项（例如进项税净影响 `C240-附注C691=0`），或增加纳入/剔除标识后父行只汇总纳入项。')
cmp.append('')
cmp.append('### 2.3 D41 其他变动 / R45:R48')
cmp.append('- 现金流 D41 源表为空/0。当前 R46:R48 均为 0，数值不出错。')
cmp.append('- 但 `K45`、`L45` 本身为空，只有 `M45=K45-L45` 和 `N45`；从公式完整性看应显式设置 `K45=SUM(K46:K48)`、`L45=现金流量表!D41` 或 0。')
cmp.append('- 判断：数值 PASS，公式结构不完整。')
cmp.append('')
cmp.append('### 2.4 D42 折旧摊销 / R49')
cmp.append('- 当前 `K49=L49=-111,393,945.36`，数值 PASS。')
cmp.append('- 现金流 D42 底层是 `-L9-L11-L12-L8-L10`，其中 L8=底稿C408=固定资产折旧111,393,945.36，其他为0。当前 R49 从资产明细取折旧/摊销，数值与现金流底稿一致。')
cmp.append('- 判断：没有发现少/多勾稽。')
cmp.append('')
cmp.append('### 2.5 D43 本年减少 / R50:R55')
cmp.append(f'- 当前 `K50={fmt(wsv["K50"].value)}`，现金流 `L50={fmt(wsv["L50"].value)}`，差异 `{fmt(wsv["M50"].value)}`。')
cmp.append('- 父子项问题：当前 `C50` 不是下面子项的直接合计，而是 `=-(N(C51)+N(C52)+N(现金流量表底稿!C201))+N(C53)-N(C55)+N(C54)`；其中 `现金流量表底稿!C201` 被父行直接引用，但不是可见子项。`K51:K55` 的简单合计也不等于 K50。')
cmp.append('- 少勾稽：`现金流量表底稿!C202=附注!C1051=453,601.92` 在 D23/C204 中，D43 应随 `-D23` 扣减；当前 R50 子项没有纳入，导致当前 K50 比源表高 `453,601.92`。')
cmp.append('- 多勾稽/抵消不完整：`现金流量表底稿!C197=附注!C689=31,111,748.07` 已在 D23 中，D43 末尾 `+附注!C689` 是抵消；当前 R54 只正向加 `附注!C689`，没有同步体现 `-C197`，导致当前 K50 比源表高 `31,111,748.07`。')
cmp.append('- 抵消路径不一致：`C196=-附注!C1067=-147,785.36` 与 `L13=-试算表Y22+附注C1067` 在源公式中共同抵消；当前 R53 使用 `试算表!Y22-附注!C1067`，相对源公式少了 `+147,785.36` 的抵消效果，使差异减少 `147,785.36`。')
cmp.append('- 差异桥：`31,111,748.07 + 453,601.92 - 147,785.36 = 31,417,564.63`，等于 R50 当前 K-L 差异。')
cmp.append('- 判断：R50 是明确错误；既有少勾稽，也有多勾稽/抵消路径错；且不满足父行只由可见子项合计。')
cmp.append('')
cmp.append('### 2.6 D44 年末数 / R56')
cmp.append(f'- 当前 `K56={fmt(wsv["K56"].value)}`，现金流 `L56={fmt(wsv["L56"].value)}`，差异 `{fmt(wsv["M56"].value)}`。')
cmp.append('- 差异来自 R33 的 `56,238,565.00` 和 R50 的 `31,417,564.63` 累积。')
cmp.append('- 公式结构问题：分资产列如 `D56=D32+D33+D45+D49+D50` 会因为中间有 `—`/空值导致 cached `#VALUE!`；应使用 `N()` 或确保子项空白为 0。K56 层面虽是主行相加，但上游错。')
cmp.append('- 判断：派生错误，应在 R33/R50 修好后自然闭环。')
cmp.append('')
cmp.append('### 2.7 D46 账面数 / R57')
cmp.append('- 当前 `K57=L57=551,090,806.85`，数值 PASS。')
cmp.append('- 结构性问题：现金流 D46 原公式包含 `试算表!H71`（开发支出期末），当前 R57 通过旧 helper `长期资产循环校验_公式明细 (2)!C131:I131` 汇总，未显式展示 `试算表!H71`；当前 H71 为 0，所以不影响数值。')
cmp.append('- 判断：数值正确，但不够完整复刻 D46 公式；如果要全面修正 R29:R58，应显式补开发支出口径，避免未来期间漏项。')
cmp.append('')
cmp.append('### 2.8 D47 校验 / R58')
cmp.append(f'- 当前 `K58={fmt(wsv["K58"].value)}`，现金流 `L58={fmt(wsv["L58"].value)}`，差异 `{fmt(wsv["M58"].value)}`。')
cmp.append('- 根因：R58 当前 `C58:J58` 引用旧 helper residual `长期资产循环校验_公式明细 (2)!C135:J135`，不是本区块内部的 `R56-R57`。')
cmp.append('- 如果本 sheet R29:R58 是现金流 D38:D47 mirror 且父行来自下方子项，R58 应由本区块内部推导：分资产列 `C58=N(C56)-N(C57)` 等，`K58=SUM(C58:J58)` 或 `K56-K57`。')
cmp.append('- 判断：R58 是明确错误，且违反“内部公式数据”原则。')
cmp.append('')
cmp.append('## 3. 问题清单（按重要性）')
cmp.append('| 优先级 | 位置 | 问题类型 | 金额影响 | 结论 |')
cmp.append('|---:|---|---|---:|---|')
cmp.append(f'| 1 | R33 本年增加 | 多勾稽 / 父项纳入错误 | {fmt(wsv["M33"].value)} | 进项税等扣除项应为净贡献0或不进父项；当前父行SUM包含R36。 |')
cmp.append(f'| 2 | R50 本年减少 | 少勾稽 + 多勾稽 + 抵消路径错 + 父行不由可见子项合计 | {fmt(wsv["M50"].value)} | 漏C202，销项税未净额抵消，C196/L13抵消路径错，父行直接引用C201。 |')
cmp.append(f'| 3 | R56 年末数 | 上游传导 | {fmt(wsv["M56"].value)} | R33+R50错误传导；列公式还有#VALUE风险。 |')
cmp.append(f'| 4 | R58 校验 | 引用旧helper残差，不是内部R56-R57 | {fmt(wsv["M58"].value)} | 应改为本区块内部 `R56-R57`。 |')
cmp.append('| 5 | R32/R57 | 公式覆盖结构不完整 | 当前0影响 | D39漏`试算表!B71`、多`B61`；D46未显式展示`H71`。 |')
cmp.append('| 6 | R45 | 公式缺失/空白 | 当前0影响 | D41为空是源表事实，但目标父行应显式 `K45=SUM(K46:K48)`、`L45=现金流D41或0`。 |')
cmp.append('')
cmp.append('## 4. 我认为 R29:R58 内部应修的方向（暂未改文件）')
cmp.append('')
cmp.append('1. **R33/R34:R44**：把 D40 子项改成“对 D40 的净贡献”，或增加纳入/剔除逻辑；父行必须从子项合计得出。至少要让进项税、C241/C242/C243 的净贡献不再进父项。')
cmp.append('2. **R50/R51:R55**：把 R51:R55 改成 signed contribution 子项，然后 `K50=SUM(K51:K55)`；必须补进 C202、把 C197/C689 做净额抵消、把 C196/L13 路径改成与源公式一致。')
cmp.append('3. **R56**：用 corrected R32/R33/R45/R49/R50 推导，列公式用 `N()` 防止 `—`/空值导致 #VALUE。')
cmp.append('4. **R58**：不用旧 helper residual，改为 `R56-R57` 的内部校验。')
cmp.append('5. **R32/R57**：补齐 D39/D46 中的开发支出 `试算表!B71/H71`，去掉或标注当前额外的生产性生物资产 B61（源公式没有该项）。')
cmp.append('')
cmp.append('> 当前这一步只做只读调研和问题定位；未改 workbook。')

summary=[]
summary.append('# Phase 5 调研摘要 — R29:R58 应修位置')
summary.append('')
summary.append(f'- 现金流公式链 MD：`{cf_md}`')
summary.append(f'- R29:R58 对照问题 MD：`{cmp_md}`')
summary.append('')
summary.append('## 结论')
summary.append('现金流量表 D38:D47 侧公式完整，底层复算与 cached values 一致；问题在 `长期资产循环_全量穿透校验!R29:R58` 的公式拆分/父子项逻辑。')
summary.append('')
summary.append('最主要问题：')
summary.append('1. R33 多勾稽进项税 56,238,565.00，并结构性错误纳入应扣除/净额为0的 C241:C243。')
summary.append('2. R50 本年减少差异 31,417,564.63：漏 C202 453,601.92；销项税 C197/C689 未净额抵消 31,111,748.07；C196/L13 抵消路径差 -147,785.36；且父行不是可见子项合计。')
summary.append('3. R56 是 R33/R50 的传导差异 87,656,129.63，并有列公式 #VALUE 风险。')
summary.append('4. R58 使用旧 helper residual，而不是本区块内部 R56-R57，差异 94,343,975.44。')
summary.append('5. R32/R57 存在零金额结构性漏项：D39 漏 `试算表!B71`、多 `试算表!B61`；D46 未显式展示 `试算表!H71`。')

cf_md.write_text('\n'.join(cf_lines), encoding='utf-8')
cmp_md.write_text('\n'.join(cmp), encoding='utf-8')
summary_md.write_text('\n'.join(summary), encoding='utf-8')
print('WROTE')
print(cf_md)
print(cmp_md)
print(summary_md)
print('manual', {k:fmt(vv) for k,vv in manual.items()})
