#!/usr/bin/env python3
"""生成 2026年5月26日 ONEOS 试运行问题报告 Word 文档"""

from pathlib import Path

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.oxml.ns import qn
from docx.shared import Cm, Pt, RGBColor
from docx.enum.table import WD_TABLE_ALIGNMENT

OUT = Path("/Users/sylvawong/Desktop/ONEOS试运行问题报告_20260526.docx")
OUT_PROJ = Path("/Users/sylvawong/Desktop/CURSOR/ONE-OS/docs/ONEOS试运行问题报告_20260526.docx")

FONT_CN = "PingFang SC"
FONT_CN_FB = "Microsoft YaHei"
ACCENT = RGBColor(0, 82, 155)
GRAY = RGBColor(80, 80, 80)


def set_run_font(run, size=11, bold=False, color=None):
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.name = FONT_CN
    run._element.rPr.rFonts.set(qn("w:eastAsia"), FONT_CN_FB)
    if color:
        run.font.color.rgb = color


def add_para(doc, text, size=11, bold=False, align=None, space_after=6, color=None):
    p = doc.add_paragraph()
    if align is not None:
        p.alignment = align
    p.paragraph_format.space_after = Pt(space_after)
    p.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
    p.paragraph_format.line_spacing = 1.35
    run = p.add_run(text)
    set_run_font(run, size=size, bold=bold, color=color)
    return p


def add_heading(doc, text, level=1):
    h = doc.add_heading(level=level)
    h.clear()
    run = h.add_run(text)
    sizes = {1: 16, 2: 14, 3: 12}
    set_run_font(run, size=sizes.get(level, 12), bold=True, color=ACCENT)
    h.paragraph_format.space_before = Pt(14 if level == 1 else 10)
    h.paragraph_format.space_after = Pt(8)
    return h


def add_bullet(doc, text, level=0):
    p = doc.add_paragraph(style="List Bullet")
    p.clear()
    p.paragraph_format.left_indent = Cm(0.75 + level * 0.5)
    p.paragraph_format.space_after = Pt(4)
    p.paragraph_format.line_spacing = 1.35
    run = p.add_run(text)
    set_run_font(run, size=11)


def set_cell_text(cell, text, bold=False, size=10):
    cell.text = ""
    p = cell.paragraphs[0]
    run = p.add_run(str(text))
    set_run_font(run, size=size, bold=bold)


def add_issue_table(doc, rows):
    headers = ["序号", "模块", "问题描述", "影响", "处理状态", "备注/后续"]
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = "Table Grid"
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, h in enumerate(headers):
        set_cell_text(table.rows[0].cells[i], h, bold=True, size=10)
    for ri, row in enumerate(rows, start=1):
        for ci, val in enumerate(row):
            set_cell_text(table.rows[ri].cells[ci], val, size=9)
    doc.add_paragraph()


def build():
    doc = Document()
    sec = doc.sections[0]
    sec.top_margin = Cm(2.5)
    sec.bottom_margin = Cm(2.5)
    sec.left_margin = Cm(2.8)
    sec.right_margin = Cm(2.8)

    title = doc.add_paragraph()
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = title.add_run("ONEOS 系统试运行问题报告")
    set_run_font(r, size=20, bold=True, color=ACCENT)
    title.paragraph_format.space_after = Pt(6)

    sub = doc.add_paragraph()
    sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r2 = sub.add_run("报告日期：2026年5月26日　　试运行阶段：业务全面迁移后首日验证")
    set_run_font(r2, size=11, color=GRAY)
    sub.paragraph_format.space_after = Pt(18)

    add_heading(doc, "一、试运行概述", 1)
    add_para(
        doc,
        "本次为 ONEOS 业务全面迁移上线后的首日试运行，重点验证租赁业务主流程（合同发起→提车应收款→交车→还车→还车应结款）"
        "及客服组车辆管理、交车管理等支撑能力。整体主流程可跑通，但迁移数据质量、照片上传机制、"
        "权限配置及部分业务规则仍存在需跟进的问题。",
    )
    add_para(doc, "总体结论：", bold=True, space_after=4)
    add_bullet(doc, "租赁业务主链路：基本跑通，存在局部阻塞与体验类问题。")
    add_bullet(doc, "权限与路由：财务出纳 404 问题已临时解决，需规范默认工作台权限配置。")
    add_bullet(doc, "照片环节：交车/还车均存在上传未即时保存导致照片丢失风险，已提优化需求。")
    add_bullet(doc, "迁移数据：车辆状态、停车场、交车数量、还车应结款费用明细等存在批量准确性风险。")

    add_heading(doc, "二、租赁业务试运行情况", 1)

    add_heading(doc, "2.1 流程验证结论", 2)
    flow_rows = [
        ("1", "租赁合同发起", "流程正常，可顺利完成发起。", "无", "通过", "—"),
        ("2", "提车应收款", "整体可走通；个别合同无法生成应收款。", "中", "部分异常", "4 辆车合同需排查"),
        ("3", "交车", "主流程可走通。", "低", "通过（有小问题）", "照片上传见 2.3"),
        ("4", "还车", "主流程可走通。", "中", "通过（有小问题）", "照片及迁移展示见 2.3"),
        ("5", "还车应结款", "流程可走通，数据与展示异常较多。", "高", "待处理", "见 2.4"),
    ]
    add_issue_table(doc, flow_rows)

    add_heading(doc, "2.2 提车应收款", 2)
    add_bullet(doc, "问题：出现一个包含 4 辆车的合同无法正常生成提车应收款。")
    add_bullet(doc, "问题：财务出纳账号登录后出现 404。原因为财务出纳未配置工作台权限，登录默认路由指向工作台导致。")
    add_bullet(doc, "处理：已通过分配权限临时解决；建议统一梳理财务类角色默认路由与菜单权限模板。")

    add_heading(doc, "2.3 交车 / 还车", 2)
    add_bullet(doc, "共性问题（交车、还车）：拍摄照片环节存在「上传后未即时保存」问题；异常返回后已拍照片全部丢失。")
    add_bullet(doc, "处理：已提交产品优化需求，建议增加分张即时落库/断点续传能力。")
    add_bullet(doc, "还车专项：照片页「交车照片（迁移数据）」部位匹配不一致（如左后方显示为右前方），需开发修复映射关系。")

    add_heading(doc, "2.4 还车应结款", 2)
    add_bullet(doc, "业务服务组、运维组、能源部办理情况中，人员均错误显示为「黄桂球」。")
    add_bullet(doc, "迁移数据问题：运维组下错误迁移了部分费用明细（旧版与新版名称不一致导致误迁）。")
    add_bullet(doc, "处理：admin 已上线删除功能，可手工处理异常数据；暂缺批量排查迁移数据的工具或规则。")
    add_bullet(doc, "逻辑问题：未做还车费用的提车应结款单，错误显示为「审核完成」，需核查状态机与数据校验。")

    add_heading(doc, "三、客服组试运行情况", 1)

    add_heading(doc, "3.1 车辆管理", 2)
    add_bullet(doc, "问题：存在大量停车场未正确匹配或错误标记为「呆滞车」。")
    add_bullet(doc, "说明：「呆滞车」状态此前已暂时删除，不应再出现。")
    add_bullet(doc, "影响：运维无法正常选择车辆。")
    add_bullet(doc, "建议方案：")
    add_bullet(doc, "核对所有车辆停车场迁移准确性；排除运营状态为「租赁」外的车辆，检查停车场是否为空，空数据需补全或修正。", level=1)
    add_bullet(doc, "在车辆管理增加修改功能（停车场等字段可编辑），需求待提。", level=1)

    add_heading(doc, "3.2 交车管理", 2)
    add_bullet(doc, "问题：实际交车数量显示不正确，判断为迁移数据问题，需与交车任务/车辆状态数据交叉核对。")

    add_heading(doc, "四、问题汇总清单", 1)
    all_issues = [
        ("1", "提车应收款", "4 辆车合同无法生成提车应收款", "中", "待排查", "需定位合同/车辆绑定规则"),
        ("2", "权限", "财务出纳登录 404", "高", "已解决", "已分配工作台权限，建议固化模板"),
        ("3", "交车", "照片上传未即时保存致丢失", "中", "已提优化", "产品优化中"),
        ("4", "还车", "照片上传未即时保存致丢失", "中", "已提优化", "同交车"),
        ("5", "还车", "迁移交车照片部位映射错误", "中", "待开发", "左后/右前等错位"),
        ("6", "还车应结款", "办理人错误显示为黄桂球", "中", "待修复", "多部门均受影响"),
        ("7", "还车应结款", "运维组费用明细误迁移", "高", "可手工删", "缺批量排查方案"),
        ("8", "还车应结款", "无还车费用单却显示审核完成", "高", "待修复", "状态逻辑异常"),
        ("9", "车辆管理", "停车场空/错、呆滞车误标", "高", "待处理", "影响运维选车"),
        ("10", "车辆管理", "缺少停车场等字段修改入口", "中", "需求待提", "—"),
        ("11", "交车管理", "实际交车数量不正确", "中", "待核对", "迁移数据问题"),
    ]
    add_issue_table(doc, all_issues)

    add_heading(doc, "五、后续工作计划（建议）", 1)
    plans = [
        "【P0】修复还车应结款状态展示异常（无费用却审核完成）及办理人显示错误。",
        "【P0】开展车辆停车场、车辆状态（含呆滞车）、交车数量迁移数据专项核对与修正。",
        "【P1】排查 4 辆车合同无法生成提车应收款的具体原因并修复。",
        "【P1】修复还车迁移照片部位映射；推进交车/还车照片分张即时保存方案落地。",
        "【P1】制定还车应结款迁移数据批量校验规则（旧版/新版费用名称映射表 + 异常清单导出）。",
        "【P2】车辆管理增加停车场等字段编辑能力；统一财务类角色权限与默认路由配置。",
    ]
    for p in plans:
        add_bullet(doc, p)

    add_heading(doc, "六、附录", 1)
    add_para(doc, "本报告依据 2026 年 5 月 26 日试运行现场反馈整理，问题状态随修复进展动态更新。", color=GRAY, size=10)
    add_para(doc, "编制：试运行项目组　　　日期：2026年5月26日", color=GRAY, size=10)

    OUT.parent.mkdir(parents=True, exist_ok=True)
    doc.save(OUT)
    OUT_PROJ.parent.mkdir(parents=True, exist_ok=True)
    doc.save(OUT_PROJ)
    print(f"已生成: {OUT}")
    print(f"副本: {OUT_PROJ}")


if __name__ == "__main__":
    build()
