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