#!/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()