#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""重写《呈总经理》第四节「集团口径」，补定制码映射；只在集团口径内出现基灵，不与单体混算。"""
import os
import shutil

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor

P = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/销售分析/西安佰奥莱博_近三年经营简报_呈总经理_20261021.docx'
shutil.copy(P, P.replace('.docx', '_bak_before_group.docx'))
doc = Document(P)

head = next(p for p in doc.paragraphs if p.text.strip().startswith('四、集团口径'))
nxt = next(p for p in doc.paragraphs if p.text.strip().startswith('五、风险台账'))
head.text = '四、集团口径：西安掉的部分，基灵用定制码接走了'
BLUE = '0D47A1'
GREY = RGBColor(0x6B, 0x7C, 0x8F)

# 删除旧正文与旧表
body = doc.element.body
el = head._p.getnext()
while el is not None and el is not nxt._p:
    nxt_el = el.getnext()
    body.remove(el)
    el = nxt_el


def para(text, size=10.5, bold=False, color=None, after=4, italic=False):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(0)
    p.paragraph_format.space_after = Pt(after)
    r = p.add_run(text)
    r.font.size = Pt(size); r.font.name = '微软雅黑'
    r._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
    r.font.bold = bold; r.font.italic = italic
    if color is not None:
        r.font.color.rgb = color
    return p


def table(headers, rows):
    t = doc.add_table(rows=1, cols=len(headers))
    t.style = 'Table Grid'
    for j, h in enumerate(headers):
        c = t.rows[0].cells[j]; c.text = ''
        pp = c.paragraphs[0]; pp.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = pp.add_run(h); r.font.size = Pt(9); r.font.bold = True
        r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF); r.font.name = '微软雅黑'
        r._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        sh = OxmlElement('w:shd'); sh.set(qn('w:val'), 'clear'); sh.set(qn('w:color'), 'auto'); sh.set(qn('w:fill'), BLUE)
        c._tc.get_or_add_tcPr().append(sh)
    for row in rows:
        cells = t.add_row().cells
        for j, v in enumerate(row):
            c = cells[j]; c.text = ''
            pp = c.paragraphs[0]
            pp.alignment = WD_ALIGN_PARAGRAPH.LEFT if j == 0 or j == 2 else WD_ALIGN_PARAGRAPH.CENTER
            r = pp.add_run(str(v)); r.font.size = Pt(9); r.font.name = '微软雅黑'
            r._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
    return t


items = []
items.append(para('集团口径只回答一个问题：西安单体掉下去的这部分，是丢了，还是换了个抬头在做。答案是后者。按 1–10 月同口径，西安 106.36 万 → 46.33 万（−56.4%），基灵三家 0.27 万 → 17.40 万（新增），集团合计 106.63 万 → 63.73 万（−40.2%）。集团跌幅比单体小 16 个百分点。', after=6))
items.append(para('表 4-1　集团口径：2025 vs 2026（1–10 月，万元）', size=9, bold=True, after=2))
items.append(table(['主体', '2025（1–10 月，万元）', '2026（1–10 月，万元）', '同比'],
                   [['西安佰奥莱博', '106.36', '46.33', '−56.4%'],
                    ['基灵（西安）', '0.27', '15.58', '新增'],
                    ['上海基灵生物', '0.00', '1.82', '新增'],
                    ['上海基灵动物医学检验实验室', '0.00', '0.00', '—'],
                    ['西安瑞佰', '0.00', '0.00', '—'],
                    ['集团合计', '106.63', '63.73', '−40.2%']]))
items.append(para('表 4-2　基灵 2026 年定制码：客户下单码 → 我方实际货号', size=9, bold=True, after=2))
items.append(table(['客户下单码', '2026 金额（万元）', '对应我方实际货号'],
                   [['FM513-007701-5P', '8.82', 'FMD5084-000901（5×Fast Direct RT Premix-UNG）'],
                    ['FM513-007702-FP', '3.83', 'FM5144-007701-TP（5×FastAmpli RT Premix-UNG）'],
                    ['FM507-007701', '1.89', 'FMD2011（2×Superstart Direct Premix-UNG）'],
                    ['FMD5084-007702-5P', '0.35', 'FMD5084-000901（007702 规格）'],
                    ['其余通用码', '2.51', 'FM513、FMD5084-000901、FM5144-007701-TP、FM507、E07']]))
items.append(para('注：映射依据《西安基灵下单货号品名定制对照表-2026V02》；-5P/-FP 为包装或浓度尾缀。2025 年 ERP 全表没有任何 007701 / 007702 定制码；2026 年 007701 命中 46 行、007702 命中 40 行。定制码金额 14.89 万元，占基灵 2026 年 85.6%。', size=8.5, color=GREY, after=6))
items.append(para('判断：', bold=True, after=2))
items.append(para('1）集团口径没有单体那么差：63.73 万对 106.63 万，降 40.2%，不是 56.4%。对外报集团数时要用这一组。', after=2))
items.append(para('2）基灵的量不是新增需求，是同一个项目换了抬头、换了码：三条定制码分别对应 FMD5084、FM5144-007701-TP、FMD2011，和西安在做的体系是同一批。', after=2))
items.append(para('3）两个抬头必须分账考核：否则同一笔生意会在西安和基灵各算一次，激励和库存都会重复。', after=8))

cursor = head._p
for el in items:
    node = el._tbl if getattr(el, '_tbl', None) is not None else el._p
    cursor.addnext(node)
    cursor = node

doc.save(P)
print('SAVED', P, os.path.getsize(P))
