#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""在《西安佰奥莱博_近三年经营简报_呈总经理》中插入「价格与交付」一节，并按写作规范回填动作。
只动西安佰奥莱博单一主体；不改已有数字口径。
"""
import copy
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_price.docx'))

doc = Document(P)
target = next(p for p in doc.paragraphs if p.text.strip().startswith('四、集团口径'))

BLUE = '0D47A1'
GREY = RGBColor(0x6B, 0x7C, 0x8F)


def shade(cell, hexcolor):
    el = OxmlElement('w:shd')
    el.set(qn('w:val'), 'clear'); el.set(qn('w:color'), 'auto'); el.set(qn('w:fill'), hexcolor)
    cell._tc.get_or_add_tcPr().append(el)


def add_para(text, size=10.5, bold=False, color=None, style=None, space_after=4, italic=False):
    p = doc.add_paragraph(style=style)
    p.paragraph_format.space_before = Pt(0)
    p.paragraph_format.space_after = Pt(space_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 add_table(headers, rows, widths=None, note=None):
    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'), '微软雅黑')
        shade(c, BLUE)
        if widths:
            c.width = widths[j]
    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 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'), '微软雅黑')
            if widths:
                c.width = widths[j]
    return t


items = []

p = add_para('四、价格与交付：量没掉，价掉了一半', style='Heading 1', space_after=6)
items.append(p)

p = add_para('先把结论说清楚：2026 年不是量掉，是价掉。按 T(50μl) 口径，2026 年 1–10 月卖了 58.7 万 T，已经接近 2025 年全年的 58.6 万 T；但加权成交单价从 1.36 元/T 降到 0.77 元/T（−43.2%），T 口径金额从 79.7 万降到 45.4 万。交付端没有问题：2026 年 14 张单全部 7 天内发货，平均 3.4 天。', space_after=6)
items.append(p)

p = add_para('表 4-1　成交单价：2025 年小幅上行，2026 年整体下调', size=9, bold=True, space_after=2)
items.append(p)
t = add_table(['口径', '2024（元/T，全年）', '2025（元/T，全年）', '2026（元/T，1–10 月）'],
              [['加权均价', '1.27', '1.36', '0.77'],
               ['中位价', '1.49', '1.31', '0.85'],
               ['成交区间', '0.77–2.50', '0.65–2.43', '0.42–0.85'],
               ['T 口径销量', '27.6 万 T', '58.6 万 T', '58.7 万 T'],
               ['T 口径金额', '35.1 万元', '79.7 万元', '45.4 万元']])
items.append(t)

p = add_para('表 4-2　分货号均价（元/T）：主力货号 2026 年全线下调', size=9, bold=True, space_after=2)
items.append(p)
t = add_table(['货号', '2025（元/T，全年）', '2026（元/T，1–10 月）', '变化'],
              [['FMD5084-000901', '1.96', '0.85', '−56.6%'],
               ['FM513', '1.15', '0.84', '−27.0%'],
               ['FM5144', '1.31', '0.85', '−35.1%'],
               ['FM507', '0.65', '0.43', '−33.8%'],
               ['FMD2011', '未成交', '0.66', '新增'],
               ['FM5144-007701-TP', '未成交', '0.85', '新增']])
items.append(t)

p = add_para('表 4-3　平均交付周期：全部 7 天内发货', size=9, bold=True, space_after=2)
items.append(p)
t = add_table(['年度', '可统计单据', '均值（天）', '中位（天）', 'P90（天）', '最长（天）', '≤7 天占比'],
              [['2024', '21', '4.0', '4', '5', '7', '100%'],
               ['2025', '—', '—', '—', '—', '—', '导出无合同日期，无法计算'],
               ['2026（1–10 月）', '14', '3.4', '4', '6', '6', '100%']])
items.append(t)

p = add_para('注：单价取含税单价，仅统计 T(50μl) 行，按销量加权；交付周期＝发货日期−合同日期，按单据去重。2025 年导出文件缺少「合同日期」字段，交付周期不可比，不做估算。', size=8.5, color=GREY, space_after=6)
items.append(p)

p = add_para('判断：', size=10.5, bold=True, space_after=2)
items.append(p)
p = add_para('1）2026 年让价集中在 FMD5084-000901（−57%）与 FM5144（−35%）两个主力，量持平、价腰斩，是今年金额下降的直接原因；不是客户流失。', space_after=2)
items.append(p)
p = add_para('2）交付不是短板：三年所有可统计单据都在 7 天内发出，2026 年均值 3.4 天。价格与回款才是要处理的问题。', space_after=8)
items.append(p)

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

# 章节重编号：四→五 … 八→九；5.x→6.x
renum = [('四、集团口径', '五、集团口径'), ('五、风险台账', '六、风险台账'),
         ('5.1 回款', '6.1 回款'), ('5.2 客诉', '6.2 客诉'), ('5.3 履约', '6.3 履约'),
         ('六、机会盘点', '七、机会盘点'), ('七、行动建议', '八、行动建议'), ('八、数据口径', '九、数据口径')]
for p in doc.paragraphs:
    t = p.text
    for a, b in renum:
        if t.startswith(a):
            for r in p.runs:
                if a in r.text:
                    r.text = r.text.replace(a, b, 1)
                    break
            break
    if '见第七节行动建议' in t:
        for r in p.runs:
            if '第七节' in r.text:
                r.text = r.text.replace('第七节', '第八节')

# 追加一条价格动作
act = next(t for t in doc.tables if any('验收标准' in c.text for c in t.rows[0].cells))
ncol = len(act.columns)
row = act.add_row().cells
vals = ['7', '价格复盘：按货号核算 2026 让价幅度，锁定 2027 价格底线', '刘子研', '刘新元', '11 月中',
        '四个主力货号 2027 年单价不低于 2026 年均价，让价需书面审批'][:ncol]
for j, v in enumerate(vals):
    row[j].text = ''
    pp = row[j].paragraphs[0]
    r = pp.add_run(v); r.font.size = Pt(9); r.font.name = '微软雅黑'
    r._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

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