#!/usr/bin/env python3
"""生成 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

OUT = Path("/Users/sylvawong/Desktop/ONEOS业务全面迁移通知.docx")

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


def set_run_font(run, size=11, bold=False, color=None, name=None):
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.name = name or FONT_CN
    run._element.rPr.rFonts.set(qn("w:eastAsia"), name or 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 build():
    doc = Document()
    sec = doc.sections[0]
    sec.page_height = Cm(29.7)
    sec.page_width = Cm(21)
    sec.left_margin = Cm(2.5)
    sec.right_margin = Cm(2.5)
    sec.top_margin = Cm(2.2)
    sec.bottom_margin = Cm(2.2)

    # 标题
    t = doc.add_paragraph()
    t.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = t.add_run("关于业务全面迁移至 ONEOS 系统的通知")
    set_run_font(r, size=22, bold=True, color=ACCENT)
    t.paragraph_format.space_after = Pt(16)

    add_para(
        doc,
        "各部门同事：",
        size=12,
        bold=True,
        space_after=8,
    )
    add_para(
        doc,
        "为统一业务流程、提升数据准确性与协同效率，公司自 2025年5月25日 起，相关业务全面迁移至 ONEOS 系统执行。"
        "请各部门按要求完成系统登录、密码修改及本部门功能模块的日常维护与操作。",
        space_after=12,
    )

    add_heading(doc, "一、系统登录信息", 1)

    table = doc.add_table(rows=4, cols=2)
    table.style = "Table Grid"
    rows_data = [
        ("项目", "说明"),
        ("系统地址", "https://oneos.lnh2e.com/"),
        ("用户名", "姓名拼音"),
        ("默认密码", "admin123（请第一时间修改）"),
    ]
    for i, (a, b) in enumerate(rows_data):
        row = table.rows[i]
        for j, val in enumerate([a, b]):
            cell = row.cells[j]
            cell.text = ""
            p = cell.paragraphs[0]
            run = p.add_run(val)
            set_run_font(run, size=11, bold=(i == 0 or j == 0))
            if i == 0:
                run.font.color.rgb = RGBColor(255, 255, 255)
                from docx.oxml import OxmlElement

                shading = OxmlElement("w:shd")
                shading.set(qn("w:fill"), "0052A3")
                cell._tc.get_or_add_tcPr().append(shading)
            p.paragraph_format.space_after = Pt(2)

    doc.add_paragraph()
    p_warn = add_para(
        doc,
        "重要提醒：请大家在第一时间登录并修改默认密码，勿将账号密码告知他人。",
        bold=True,
        space_after=14,
        color=RGBColor(180, 0, 0),
    )

    add_heading(doc, "二、各部门职责与功能模块", 1)

    # 客服
    add_heading(doc, "（一）客服服务部", 2)
    items_cs = [
        "业务管理 → 客户管理：客户信息录入准确；创建合同时须正确关联客户信息。",
        "业务管理 → 租赁费用模板：按车型维护各类费用明细，确保模板项目准确。",
        "财务管理 → 提车应收款：实收录入准确。",
        "业务管理 → 交还车任务：按客户约定交车日期生成交车任务（生成交车任务后，对应区域运维方可收到任务）。",
        "业务管理 → 租赁账单：运维交车后，对系统自动生成的租赁账单实收情况进行维护。",
        "业务管理 → 交还车任务：在合同下已交车任务操作列点击「查看」→ 按客户要求选择还车车辆 → 点击「还车」并填写预计还车时间，生成还车任务（生成还车任务后，对应区域运维方可收到任务）。",
        "财务管理 → 还车应结款：协同客服组、运维组、安全组、能源组完成还车应结款录入。",
        "车辆氢费明细：加氢记录录入准确。",
        "车辆成本维护：维护各车型日成本（用于租赁账单中车辆成本统计）。",
    ]
    for it in items_cs:
        add_bullet(doc, it)

    # 运维
    add_heading(doc, "（二）运维部", 2)
    add_heading(doc, "网页版 ONEOS", 3)
    items_ops_web = [
        "运维管理 → 车辆业务 → 证照管理：按车辆实际证照维护信息（证照信息须完整，否则影响交车）。",
        "运维管理 → 基本数据维护 → 停车场：按业务实际维护停车场信息。",
        "运维管理 → 基本数据维护 → 型号参数：按车辆实际维护型号参数。",
        "维修站管理 → 维修站信息：按合作情况维护维修站信息。",
        "检测服务站 → 检测服务站信息：按合作情况维护检测服务站信息。",
        "运维管理 → 车辆管理：新增车辆时导入车辆信息，并同步通知相关人员维护证照信息。",
    ]
    for it in items_ops_web:
        add_bullet(doc, it)

    add_heading(doc, "微信小程序「小羚羚」", 3)
    items_ops_wx = [
        "备车：按业务实际完成备车（新系统仅已备车车辆方可交车）。",
        "交车：按交车任务执行交车。",
        "还车：按还车任务执行还车。",
        "异动：按实际提交异动申请并记录异动情况。",
        "调拨：按实际提交调拨申请并记录调拨情况。",
        "年审：按实际录入年审记录（可多轮保存，全部完成后再点击提交闭环）。",
        "故障：按实际填写故障信息（可多轮保存，全部完成后再点击提交闭环）。",
    ]
    for it in items_ops_wx:
        add_bullet(doc, it)

    # 采购
    add_heading(doc, "（三）采购部", 2)
    for it in [
        "加氢站管理 → 站点信息：维护全部合作加氢站信息（作为氢费账单基础依据）。",
        "能源管理 → 能源账户：按实际业务创建客户账户。",
        "业务管理 → 保险采购：按实际业务导入保单数据。",
        "加氢站管理 → 加氢站打款管理（即将上线）：按实际业务导入加氢站打款情况，将自动同步至「加氢站余额管理」。",
    ]:
        add_bullet(doc, it)

    # 财务
    add_heading(doc, "（四）财务部", 2)
    for it in [
        "审批中心 → 我的待办：及时处理各类审批任务。",
        "能源管理 → 充值单：按实际业务导入客户账户充值数据。",
    ]:
        add_bullet(doc, it)

    # 法务
    add_heading(doc, "（五）法务部", 2)
    add_bullet(doc, "审批中心 → 我的待办：及时处理各类审批任务。")

    add_heading(doc, "三、优化迭代与意见反馈", 1)
    add_para(
        doc,
        "各部门此前提出的优化意见均已收到。后续将结合业务紧迫程度分批迭代上线，"
        "也欢迎在使用过程中继续提出宝贵建议。",
        space_after=8,
    )
    add_para(doc, "意见与建议反馈方式：", bold=True, space_after=6)
    add_bullet(doc, "邮箱：wangmian@lingniutech.com")
    add_bullet(doc, "钉钉联系数智部：王冕、秦蔚")

    doc.add_paragraph()
    add_para(
        doc,
        "请各部门负责人传达至本部门全员，自 5月25日 起严格执行。如有系统操作问题，请优先联系数智部协调处理。",
        space_after=20,
    )
    add_para(doc, "特此通知。", bold=True, space_after=24)

    sig = doc.add_paragraph()
    sig.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    r1 = sig.add_run("数智部\n")
    set_run_font(r1, size=12, bold=True)
    r2 = sig.add_run("2025年5月24日")
    set_run_font(r2, size=12)

    doc.save(OUT)
    print(f"已生成: {OUT}")


if __name__ == "__main__":
    build()
