_gen_delivery_sys_docs.py 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. # -*- coding: utf-8 -*-
  2. """生成系统总纲 4 份,并补齐诊断/改善/ChatBI/系统集成的详设与手册;重写已有需求/蓝图。"""
  3. from __future__ import annotations
  4. import shutil
  5. import sys
  6. from pathlib import Path
  7. from docx import Document
  8. from docx.enum.text import WD_ALIGN_PARAGRAPH
  9. from docx.shared import Cm, RGBColor
  10. HERE = Path(__file__).resolve().parent
  11. sys.path.insert(0, str(HERE))
  12. from _gen_s9_diag_impr_int_delivery import ( # noqa: E402
  13. BASE,
  14. add_cover,
  15. add_para,
  16. heading1,
  17. heading2,
  18. heading3,
  19. set_cell_text,
  20. shade_cell,
  21. write_bbp,
  22. write_brd,
  23. )
  24. from _gen_s9_modules_data import MODULES # noqa: E402
  25. TMP = HERE / "_tmp_docx_out"
  26. SYS_DIR_NAME = "00-系统总纲"
  27. MODULE_INDEX = [
  28. ("S0 运营建模", "S0",
  29. "S0-运营建模-业务需求描述-V0.8.docx",
  30. "S0-运营建模-业务蓝图设计方案-V0.8.docx",
  31. "S0运营建模模块详细设计说明书-V1.2.docx",
  32. "S0-运营建模-用户操作手册-V1.2.docx"),
  33. ("S1 产销协同", "S1",
  34. "S1产销协同业务需求描述-V0.4.docx",
  35. "S1产销协同模块蓝图设计方案-V2.2.docx",
  36. "S1产销协同模块详细设计说明书-V1.2.docx",
  37. "S1产销协同模块用户操作手册-V1.2.docx"),
  38. ("S2 制造协同", "S2",
  39. "S2制造协同业务需求描述-V0.4.docx",
  40. "S2制造协同模块蓝图设计方案-V0.4.docx",
  41. "S2制造协同模块详细设计说明书-V1.2.docx",
  42. "S2制造协同模块用户操作手册-V1.2.docx"),
  43. ("S3 供应协同", "S3",
  44. "S3供应协同业务需求描述-V0.4.docx",
  45. "S3供应协同模块蓝图设计方案-V0.4.docx",
  46. "S3供应协同模块详细设计说明书-V1.2.docx",
  47. "S3供应协同模块用户操作手册-V1.2.docx"),
  48. ("S4 采购执行", "S4",
  49. "S4采购执行业务需求描述-V0.4.docx",
  50. "S4采购执行模块蓝图设计方案-V0.4.docx",
  51. "S4采购执行模块详细设计说明书-V1.2.docx",
  52. "S4采购执行模块用户操作手册-V1.2.docx"),
  53. ("S5 物料仓储", "S5",
  54. "S5-物料仓储-业务需求描述-V1.2.docx",
  55. "S5-物料仓储-业务蓝图设计方案-V0.3.docx",
  56. "S5物料仓储模块详细设计说明书-V1.2.docx",
  57. "S5-物料仓储-用户操作手册-V1.2.docx"),
  58. ("S6 生产执行", "S6",
  59. "S6-生产执行-业务需求描述-V1.2.docx",
  60. "S6-生产执行-业务蓝图设计方案-V0.3.docx",
  61. "S6生产执行模块详细设计说明书-V1.2.docx",
  62. "S6-生产执行-用户操作手册-V1.2.docx"),
  63. ("S7 成品仓储", "S7",
  64. "S7-成品仓储-业务需求描述-V1.2.docx",
  65. "S7-成品仓储-业务蓝图设计方案-V0.3.docx",
  66. "S7成品仓储模块详细设计说明书-V1.2.docx",
  67. "S7-成品仓储-用户操作手册-V1.2.docx"),
  68. ("S8 异常监控", "S8",
  69. "S8-异常监控-业务需求描述-V1.2.docx",
  70. "S8-异常监控-业务蓝图设计方案-V0.3.docx",
  71. "S8异常监控模块详细设计说明书-V1.2.docx",
  72. "S8-异常监控-用户操作手册-V1.2.docx"),
  73. ("九宫格智慧运营看板(含 S9 全场关键指标看板)", "S9",
  74. "九宫格智慧运营看板业务需求描述-V0.4.docx",
  75. "九宫格智慧运营看板模块蓝图设计方案-V0.4.docx",
  76. "九宫格智慧运营看板业务需求描述-V0.4.docx",
  77. "九宫格智慧运营看板模块蓝图设计方案-V0.4.docx"),
  78. ("运营诊断", "运营诊断",
  79. "运营诊断业务需求描述-V0.4.docx",
  80. "运营诊断模块蓝图设计方案-V0.4.docx",
  81. "运营诊断模块详细设计说明书-V0.4.docx",
  82. "运营诊断-用户操作手册-V0.4.docx"),
  83. ("运营改善", "运营改善",
  84. "运营改善业务需求描述-V0.4.docx",
  85. "运营改善模块蓝图设计方案-V0.4.docx",
  86. "运营改善模块详细设计说明书-V0.4.docx",
  87. "运营改善-用户操作手册-V0.4.docx"),
  88. ("ChatBI智能报表", "ChatBI",
  89. "ChatBI智能报表业务需求描述-V0.4.docx",
  90. "ChatBI智能报表模块蓝图设计方案-V0.4.docx",
  91. "ChatBI智能报表模块详细设计说明书-V0.4.docx",
  92. "ChatBI智能报表-用户操作手册-V0.4.docx"),
  93. ("系统集成(含数据对接服务)", "系统集成",
  94. "系统集成业务需求描述-V0.4.docx",
  95. "系统集成模块蓝图设计方案-V0.4.docx",
  96. "系统集成模块详细设计说明书-V0.4.docx",
  97. "系统集成-用户操作手册-V0.4.docx"),
  98. ]
  99. DDS_UM_KEYS = {
  100. "运营诊断": ("OD-DDS-001", "OD-UM-001", "运营诊断模块详细设计说明书.docx", "运营诊断-用户操作手册.docx"),
  101. "运营改善": ("OI-DDS-001", "OI-UM-001", "运营改善模块详细设计说明书.docx", "运营改善-用户操作手册.docx"),
  102. "ChatBI": ("CBI-DDS-001", "CBI-UM-001", "ChatBI智能报表模块详细设计说明书.docx", "ChatBI智能报表-用户操作手册.docx"),
  103. "系统集成": ("INT-DDS-001", "INT-UM-001", "系统集成模块详细设计说明书.docx", "系统集成-用户操作手册.docx"),
  104. }
  105. # 详设:业务检查(可写技术词);手册:同一逻辑的业务说法
  106. LOGIC = {
  107. "运营诊断": {
  108. "dds": [
  109. "进入诊断必须带有模块编码;无模块编码时按默认模块打开,不得报错退出。",
  110. "诊断结论必须能追溯到指标编码或订单主线;页面展示红/黄/绿,无异常时给良好态或空问题列表。",
  111. "下钻受当前租户与数据权限约束;无明细时提示空结果,不弹出技术异常。",
  112. "从九宫格或 S9 全场关键指标看板进入时,保留指标与筛选上下文,避免用户重新选择后对不上。",
  113. "实时类识别时效以对接数据已刷新为前提;外部系统延迟不记为本模块缺陷。",
  114. "转改善时必须带上问题名称、模块、指标与目标/实际值,供改善建档使用。",
  115. ],
  116. "um": [
  117. "从九宫格或看板点未达标指标进入诊断,原来看的指标和日期会跟着带过来。",
  118. "各环节用红黄绿表示是否有问题;全绿或没有问题列表,说明这段时间没有识别到异常。",
  119. "点开一条问题,可以按订单、物料、供应商等再往下看依据;没有明细时提示暂无数据即可。",
  120. "确认是问题后,用「转改善」生成改善计划,不要在诊断页直接改业务单据。",
  121. ],
  122. },
  123. "运营改善": {
  124. "dds": [
  125. "建档:模块编码、问题名称必填;缺一不可保存。计划号按日生成且租户内唯一。",
  126. "责任人必须是当前租户有效用户,否则拒绝保存或分派。",
  127. "状态机:草稿可提交审批;审批中/已通过/执行中/待验证/已关闭不可再提交审批。",
  128. "开始执行:仅审批通过或已在执行中允许;未审批不得开工。",
  129. "提交验证:仅执行中或待验证允许;人工结论与自动评价不一致时必须填写理由。",
  130. "关闭:仅待验证允许;仍有未完成行动项不得关闭。",
  131. "行动项仅计划负责人、行动项负责人或创建人可改;他人提示无权修改。",
  132. "到期日前一日提醒、逾期提醒;未关闭且到期日早于今天计为逾期。",
  133. ],
  134. "um": [
  135. "建改善计划时至少要写清问题和所属模块,否则保不住。",
  136. "责任人必须是本企业里能登录的人,不能随便填一个外面的名字。",
  137. "写好后先送审批;没批过不能当已经在执行。",
  138. "执行中才能去做有效性验证;如果您的结论和系统自动评价不一样,必须写明理由。",
  139. "还有没做完的行动项,计划不能关闭。",
  140. "只有计划负责人或行动项负责人能改自己的任务进度。",
  141. ],
  142. },
  143. "ChatBI": {
  144. "dds": [
  145. "提问先走意图分类,再在当前模块已发布 KPI 中匹配焦点指标;匹配不到则降级为通用说明。",
  146. "问答基于已计算的运营指标日结果作答,不读取业务单据明细。",
  147. "大模型不可用或超时,回退本地模板答案,并标明为回退。",
  148. "回答可带跳转九宫格/模块看板/智慧诊断的动作;跳转须带当前模块上下文。",
  149. "问答必须带当前租户与数据权限,禁止跨租户取数。",
  150. ],
  151. "um": [
  152. "在九宫格或看板里打开问答窗口,用平常说话问指标即可,也可点建议问题。",
  153. "现在只能根据已算好的指标作答,不会替您去翻订单明细。",
  154. "问不到对应指标时,会给提示而不是报错。",
  155. "网络或智能服务暂时不可用时,仍会给一份基本说明,您可以再问一次或去看板查看。",
  156. "需要查原因时,按提示进入看板或诊断,不要把问答结果当成已改单。",
  157. ],
  158. },
  159. "系统集成": {
  160. "dds": [
  161. "入站:数据源地址/账号、同步对象映射未配齐不得启用任务。",
  162. "源系统不可达时任务记失败并写日志,不得把失败当成成功。",
  163. "清洗:字段标准化、空值过滤、异常值标记、编码统一;无法标准化的记录标记后跳过或进异常桶。",
  164. "出站:业务回写必须进回写队列,禁止无记录直连外写;失败可重试,避免重复入库或丢数。",
  165. "凭据不得在页面明文回显。",
  166. ],
  167. "um": [
  168. "数据对接服务用来配置从第三方系统取数和回写,一般由实施或运维操作。",
  169. "没配好地址和对照关系,任务不能启用。",
  170. "对面系统连不上时,任务会显示失败,可在日志里看原因,不会假装成功。",
  171. "业务上需要回写第三方系统的操作,会先进入回写队列;失败了可以重试,不要自己在库里改。",
  172. "打不开数据对接服务菜单时,请联系管理员核对权限。",
  173. ],
  174. },
  175. }
  176. def new_doc():
  177. doc = Document()
  178. sec = doc.sections[0]
  179. sec.top_margin = Cm(2)
  180. sec.bottom_margin = Cm(2)
  181. sec.left_margin = Cm(2.5)
  182. sec.right_margin = Cm(2.5)
  183. return doc
  184. def save_doc(doc: Document, dest: Path):
  185. from _delivery_docx_polish import force_all_text_black, rebuild_static_toc
  186. rebuild_static_toc(doc)
  187. force_all_text_black(doc)
  188. dest.parent.mkdir(parents=True, exist_ok=True)
  189. TMP.mkdir(exist_ok=True)
  190. tmp = TMP / "out.docx"
  191. doc.save(str(tmp))
  192. shutil.copy2(tmp, dest)
  193. print("WROTE", dest)
  194. def add_index_table(doc):
  195. table = doc.add_table(rows=1 + len(MODULE_INDEX), cols=5)
  196. table.style = "Table Grid"
  197. headers = ["模块", "需求描述", "蓝图设计", "详细设计", "操作手册"]
  198. for c, h in enumerate(headers):
  199. set_cell_text(table.rows[0].cells[c], h, bold=True, color=RGBColor(0, 0, 0), center=True, size=9)
  200. shade_cell(table.rows[0].cells[c], "D6E3F0")
  201. for r, row in enumerate(MODULE_INDEX, 1):
  202. name, folder, brd, bbp, dds, um = row
  203. vals = [name, f"{folder}\\{brd}", f"{folder}\\{bbp}", f"{folder}\\{dds}" if not dds.startswith("(") else dds, f"{folder}\\{um}" if not um.startswith("(") else um]
  204. for c, v in enumerate(vals):
  205. set_cell_text(table.rows[r].cells[c], v, size=8)
  206. def write_sys_brd():
  207. doc = new_doc()
  208. add_cover(doc, "Ai-DOP智慧运营管理系统", "业务需求描述(总纲)", "SYS-BRD-001")
  209. heading1(doc, "1 文档目的与范围")
  210. add_para(doc, "本文是全系统业务需求总纲,只写跨模块共性要求,并列出各模块《业务需求描述》文件名。模块个性需求以各模块分册为准。")
  211. add_para(doc, "系统名称:Ai-DOP智慧运营管理系统。需求基准:项目合同里的技术规范「项目需求」详细实施内容。")
  212. heading1(doc, "2 建设目标")
  213. add_para(doc, "建设覆盖运营建模到异常监控的 OTD 全流程协同平台,并以九宫格智慧运营看板作为管理层总览入口。")
  214. add_para(doc, "S9 全场关键指标看板是九宫格中的全场关键指标页,不是九宫格的上级模块。")
  215. add_para(doc, "外部系统取数与回写统一走系统集成中的数据对接服务,保证一处配置、全流程共用。")
  216. heading1(doc, "3 模块与分册索引")
  217. add_index_table(doc)
  218. add_para(doc, "九宫格需求/蓝图现存放在交付目录 S9 文件夹,文件名已按「九宫格智慧运营看板」命名。")
  219. heading1(doc, "4 跨模块共性需求")
  220. heading2(doc, "4.1 组织与权限")
  221. add_para(doc, "用户只能看到本租户数据;无菜单权限不展示对应功能。管理层以只读总览为主,业务岗维护本职单据,实施/运维配置数据对接服务。")
  222. heading2(doc, "4.2 主数据引用")
  223. add_para(doc, "业务单据引用的物料、客户、供应商、产线等以 S0 运营建模为准。被下游占用的主数据不得删除;业务编码新增时手工录入,进入编辑后锁定。")
  224. heading2(doc, "4.3 审批与待办")
  225. add_para(doc, "需要审批的业务(如订单变更、改善计划)走统一审批中心;未通过不得进入下一业务状态。")
  226. heading2(doc, "4.4 指标口径")
  227. add_para(doc, "九宫格与 S9 全场关键指标看板、诊断、改善验证使用同一套指标定义;页面不得另写互相冲突的计算公式。")
  228. heading1(doc, "5 端到端主线")
  229. add_para(doc, "S0 建好主数据 → S1 评审与承诺交期 → S2 排产 → S3 算料 → S4 采购 → S5 来料与仓储 → S6 生产执行 → S7 成品与发运 → S8 监控异常。")
  230. add_para(doc, "九宫格汇总各环节是否达标;点 S9 格子看全场关键指标;未达标进入运营诊断;确认问题后进入运营改善闭环。")
  231. add_para(doc, "ChatBI 嵌在九宫格/看板中,用自然语言问已算好的指标,不替代各模块单据操作。")
  232. heading1(doc, "6 数据对接服务(系统集成)")
  233. add_para(doc, "数据对接服务负责与第三方系统的取数、清洗和回写。业务人员日常不在此配置,由实施或运维维护。")
  234. add_para(doc, "入站失败必须可见;回写必须留队列记录。具体页面与检查见《系统集成业务需求描述》。")
  235. heading1(doc, "7 编号与追溯")
  236. add_para(doc, "需求 REQ-Sn-nnn、功能 FUNC-Sn-nnn、测试 TC-Sn-nnn,通过各模块三联对照表串联。禁止改写已分配编号。")
  237. heading1(doc, "8 性能要求")
  238. add_para(doc, "以下性能要求依据委托开发合同相关条款,仅在本总纲列示,各模块分册不再重复。")
  239. add_para(doc, "• 常规页面加载、普通查询及常规操作响应不超过 30 秒;复杂查询、多表关联、大数据量列表、看板多图联动不超过 60 秒。")
  240. add_para(doc, "• 超大数据量导出、全量重算、智能问答按异步任务处理,任务状态可查询。")
  241. add_para(doc, "• 常规业务接口平均响应不超过 30 秒;复杂聚合接口平均响应不超过 60 秒。")
  242. add_para(doc, "• 最大支持约 1000 人同时在线、约 400 人并发操作。")
  243. add_para(doc, "• 主数据及业务单据状态同步目标延迟不超过 5 分钟;指标日批按日调度完成。")
  244. add_para(doc, "• 全年可用性不低于 99%;接口调用成功率不低于 99%(第三方拒绝与网络故障除外)。")
  245. save_doc(doc, BASE / SYS_DIR_NAME / "SYS-业务需求描述-总纲.docx")
  246. def write_sys_bbp():
  247. doc = new_doc()
  248. add_cover(doc, "Ai-DOP智慧运营管理系统", "业务蓝图设计方案(总纲)", "SYS-BBP-001")
  249. heading1(doc, "1 目标和宗旨")
  250. add_para(doc, "把合同范围内的模块连成一条可运营的蓝图:主数据统一、单据可追溯、指标可看、问题可改。")
  251. add_para(doc, "九宫格是运营总览;S9 全场关键指标看板是九宫格里的全场指标页。")
  252. heading1(doc, "2 总体业务路径")
  253. add_para(doc, "数据对接服务采集/回写 → 各业务模块处理单据 → 指标日批计算 → 九宫格总览 →(可选)S9 全场关键指标看板 → 智慧诊断 → 改善计划审批与验证。")
  254. heading1(doc, "3 跨模块流程规则")
  255. add_para(doc, "• 下游引用上游主数据与单据状态,不得跳过必经节点(例如不合格按合格入库)。")
  256. add_para(doc, "• 指标只读展示日批结果;改数在业务模块或对接任务中完成,不在看板上改。")
  257. add_para(doc, "• 诊断不改单;改善改的是整改任务,不是直接改历史单据。")
  258. heading1(doc, "4 系统接口原则")
  259. add_para(doc, "外部系统一律经数据对接服务:直连库或 HTTP API。出站回写进队列。凭据不落页面明文。")
  260. heading1(doc, "5 各模块蓝图索引")
  261. add_index_table(doc)
  262. save_doc(doc, BASE / SYS_DIR_NAME / "SYS-业务蓝图设计方案-总纲.docx")
  263. def write_sys_dds():
  264. doc = new_doc()
  265. add_cover(doc, "Ai-DOP智慧运营管理系统", "详细设计说明书(总纲)", "SYS-DDS-001")
  266. heading1(doc, "1 文档概述")
  267. heading2(doc, "1.1 编写目的")
  268. add_para(doc, "说明跨模块技术架构与必须统一遵守的业务检查。模块内表结构、页面与接口以各模块详细设计说明书为准。")
  269. heading2(doc, "1.2 设计范围")
  270. add_para(doc, "覆盖 S0~S8、九宫格(含 S9 全场关键指标看板)、运营诊断、运营改善、ChatBI、系统集成。")
  271. heading1(doc, "2 总体设计")
  272. heading2(doc, "2.1 技术栈")
  273. add_para(doc, "后端 .NET / Admin.NET;前端 Vue3 + Element Plus;数据库 MySQL 8.0(utf8mb4);可选 Redis。运行环境见合同附件《项目运行环境及责任边界清单》。")
  274. heading2(doc, "2.2 总体架构")
  275. add_para(doc, "业务服务处理各模块单据;数据对接服务完成贴源采集、标准清洗、明细汇总、指标日批与出站回写队列;看板/诊断/ChatBI 只读消费指标与明细。")
  276. heading2(doc, "2.3 模块划分")
  277. add_para(doc, "S0 主数据;S1~S8 业务执行;九宫格与 S9 全场关键指标看板为展示;诊断与改善为闭环;系统集成承载数据对接服务。")
  278. heading1(doc, "3 跨模块业务检查(必须统一)")
  279. add_para(doc, "• 所有读写带租户条件;禁止把租户写成固定 0 或跨租户查询。")
  280. add_para(doc, "• 主数据删除前检查占用;编码编辑态锁定。")
  281. add_para(doc, "• 审批未通过不得进入下一状态。")
  282. add_para(doc, "• 指标口径以运营指标主数据为准,看板不得硬编码另一套公式。")
  283. add_para(doc, "• 出站必须进回写队列;入站失败必须落日志。")
  284. heading2(doc, "3.1 各业务模块主要检查(摘要)")
  285. bullets = [
  286. "S0:编码手填且编辑后不可改;被引用不可删。",
  287. "S1:交期评审看产能与齐套;交付变更需审批;发货需成品可发。",
  288. "S2:排程受工作日历与产能约束;冻结范围内已执行计划不随意作废。",
  289. "S3:净需求考虑库存与在途;齐套结论与库存口径一致。",
  290. "S4:采购数量来自需求;收货必须经过约定质检节点。",
  291. "S5:检验不合格不得按合格入库;现存查询以对接后的库存为准。",
  292. "S6:报工与工单未完数量相符;异常提报后按等级限时响应。",
  293. "S7:入库关联工单与检验;出库关联发货通知。",
  294. "S8:紧急异常限时响应;无处理结果不得闭环。",
  295. "九宫格 / S9:无数据给空态;未达标可下钻诊断。",
  296. ]
  297. for b in bullets:
  298. add_para(doc, "• " + b)
  299. heading1(doc, "4 数据对接服务设计")
  300. add_para(doc, "分层:贴源层保存外部原样;标准层统一编码与空值;明细层按订单/工单/物料汇总;指标层按日计算 KPI。")
  301. add_para(doc, "通道:数据库直连、HTTP API;定时或实时。新增一套外部系统以可视化配置为目标,避免大量改代码。")
  302. add_para(doc, "监控:任务日志、动作日志、出站队列状态(待发送/成功/失败/重试)。")
  303. add_para(doc, "数据对接服务操作页为 FUNC-S9-010~016,用于数据源、同步配置、任务与动作日志、出站回写队列。")
  304. heading1(doc, "5 安全与多租户")
  305. add_para(doc, "认证走平台登录。接口鉴权,ChatBI 问答必须带当前租户。")
  306. heading1(doc, "6 SaaS 部署与运维设计")
  307. heading2(doc, "6.1 部署模式和环境")
  308. add_para(doc, "Ai-DOP智慧运营管理系统采用统一 SaaS 多租户部署,不按模块单独建库;开发、预发、生产环境配置隔离。")
  309. add_para(doc, "系统部署于合同约定的服务器、数据库与网络环境;运行环境见合同附件《项目运行环境及责任边界清单》。客户端使用 Chrome 或 Edge 近两个正式版访问。")
  310. heading2(doc, "6.2 部署架构")
  311. add_para(doc, "采用容器化部署:反向代理 + 前端静态资源 + .NET API + MySQL + Redis。各业务模块随平台一同发布。")
  312. heading2(doc, "6.3 租户开通和初始化")
  313. add_para(doc, "新租户开通后初始化组织、角色与菜单权限;业务数据按租户隔离,禁止跨租户可见。")
  314. heading2(doc, "6.4 发布、升级和回滚")
  315. add_para(doc, "发版随平台版本号发布;升级失败按平台回滚策略回退至上一可用版本,保留业务数据。")
  316. heading2(doc, "6.5 监控、备份和恢复")
  317. add_para(doc, "按平台策略监控运行状态与任务失败;数据库按平台策略备份,恢复后核对关键业务数据。")
  318. add_para(doc, "部署与运维为跨模块共性内容,各模块分册不再单列。")
  319. heading1(doc, "7 各模块详设索引")
  320. add_index_table(doc)
  321. save_doc(doc, BASE / SYS_DIR_NAME / "SYS-详细设计说明书-总纲.docx")
  322. def write_sys_um():
  323. doc = new_doc()
  324. add_cover(doc, "Ai-DOP智慧运营管理系统", "用户操作手册(总纲)", "SYS-UM-001")
  325. heading1(doc, "1 登录与工作台")
  326. add_para(doc, "在浏览器打开系统地址,输入账号密码后进入工作台。左侧是功能菜单,顶部是已打开的页签。")
  327. add_para(doc, "请使用 Chrome 或 Edge 近两个正式版。")
  328. heading1(doc, "2 通用操作")
  329. add_para(doc, "多数列表都是:上面筛选,中间表格,下面翻页。点查询看结果,点重置清空条件。")
  330. add_para(doc, "新增或编辑后点保存。删除前会再确认一次;如果这条已经被后面的业务用到,系统不会让您删。")
  331. add_para(doc, "需要审批的单据,提交后到「审批中心」处理;没通过之前,下一环节做不了。")
  332. heading1(doc, "3 从哪里看全局")
  333. add_para(doc, "日常先看九宫格:一屏看各模块是否达标。要看全场关键指标,点九宫格里的 S9。")
  334. add_para(doc, "某个指标不好,点进去做诊断;确认是问题再开改善计划。问数可以用看板上的问答窗口,它只解释已有指标,不会替您改单。")
  335. heading1(doc, "4 跨模块使用注意")
  336. add_para(doc, "先在运营建模里把物料、客户、产线等基础资料维护好,后面订单和排产才找得到。")
  337. add_para(doc, "各模块颜色和数字应能对上;对不上时先看筛选日期是不是一致,再找实施核对数据对接服务是否已跑完。")
  338. heading1(doc, "5 各模块操作手册")
  339. add_index_table(doc)
  340. add_para(doc, "具体按钮和字段以各模块手册为准。本总纲只讲共用习惯和先后顺序。")
  341. save_doc(doc, BASE / SYS_DIR_NAME / "SYS-用户操作手册-总纲.docx")
  342. def write_module_dds(key: str, mod: dict):
  343. no, _um_no, dds_name, _um_name = DDS_UM_KEYS[key]
  344. doc = new_doc()
  345. add_cover(doc, mod["module_title"], "详细设计说明书", no)
  346. heading1(doc, "1 文档概述")
  347. heading2(doc, "1.1 编写目的")
  348. add_para(doc, f"说明「{mod['module_title']}」的功能处理与业务检查,供开发、测试与验收对照。")
  349. heading2(doc, "1.2 设计范围")
  350. add_para(doc, f"报价范围:{mod['quote_scope']}。共性架构见《SYS-详细设计说明书-总纲》。")
  351. if mod.get("intro"):
  352. add_para(doc, mod["intro"])
  353. heading1(doc, "2 总体设计")
  354. add_para(doc, "本模块前后端与权限模型同总纲。下列功能按实际菜单实现。")
  355. heading1(doc, "3 功能详细设计")
  356. heading2(doc, "3.1 模块级业务检查逻辑")
  357. add_para(doc, "下列检查对全模块生效,实施与测试按此拦截。")
  358. for t in LOGIC[key]["dds"]:
  359. add_para(doc, "• " + t)
  360. features = [f for f in mod["features"] if f.get("impl_status") != "未实现"]
  361. for i, feat in enumerate(features, 2):
  362. heading2(doc, f"3.{i} {feat['name']}({feat['func']})")
  363. heading3(doc, "业务流程")
  364. for t in feat["biz_desc"]:
  365. add_para(doc, t)
  366. heading3(doc, "功能处理")
  367. for t in feat["func_desc"]:
  368. add_para(doc, t)
  369. heading3(doc, "本功能规则")
  370. for t in feat.get("rules", []):
  371. add_para(doc, "• " + t)
  372. heading3(doc, "页面与验证")
  373. add_para(doc, f"路径:{feat['path']}。")
  374. heading1(doc, "4 接口设计")
  375. for feat in features:
  376. add_para(doc, f"{feat['name']}:{feat['interfaces']}")
  377. heading1(doc, "5 安全与多租户")
  378. add_para(doc, "查询与写操作必须带当前租户。改善、对接配置等写操作校验操作者权限。")
  379. save_doc(doc, BASE / mod["folder"] / dds_name)
  380. def write_module_um(key: str, mod: dict):
  381. _dds_no, no, _dds_name, um_name = DDS_UM_KEYS[key]
  382. doc = new_doc()
  383. add_cover(doc, mod["module_title"], "用户操作手册", no)
  384. heading1(doc, "1 写给谁看")
  385. add_para(doc, "给业务人员和管理层看。登录、筛选、保存等通用操作见《SYS-用户操作手册-总纲》,这里只写本模块怎么用。")
  386. if mod.get("intro"):
  387. add_para(doc, mod["intro"])
  388. heading1(doc, "2 先做什么")
  389. if key == "运营诊断":
  390. add_para(doc, "建议先在九宫格里看到未达标,再点进来。也可以从菜单直接打开智慧诊断。")
  391. elif key == "运营改善":
  392. add_para(doc, "建议从诊断页的问题生成改善计划,这样问题和指标会对得上。")
  393. elif key == "ChatBI":
  394. add_para(doc, "打开九宫格或任一模块看板,点问答窗口即可,没有单独菜单也不影响使用。")
  395. else:
  396. add_para(doc, "数据对接服务由实施或运维配置。业务人员一般只需知道:数没来、回写失败时找运维查日志。")
  397. heading1(doc, "3 主要操作")
  398. for i, feat in enumerate([f for f in mod["features"] if f.get("impl_status") != "未实现"], 1):
  399. heading2(doc, f"3.{i} {feat['name']}")
  400. for t in feat["biz_desc"]:
  401. add_para(doc, t)
  402. heading1(doc, "4 系统会拦下来的情况")
  403. add_para(doc, "下面这些是本模块最常见的检查,用业务话说明「什么时候做不成」。")
  404. for t in LOGIC[key]["um"]:
  405. add_para(doc, "• " + t)
  406. heading1(doc, "5 和别的模块怎么配合")
  407. if key == "运营诊断":
  408. add_para(doc, "上看九宫格和 S9 全场关键指标,下转改善计划。诊断本身不改订单、不改库存。")
  409. elif key == "运营改善":
  410. add_para(doc, "计划要挂在诊断问题上。关闭前先做完行动项并完成验证。")
  411. elif key == "ChatBI":
  412. add_para(doc, "问答只解释指标。要改业务,请回到对应的 S1~S8 功能。")
  413. else:
  414. add_para(doc, "对接跑完后,S0~S8 和九宫格才能看到数。回写队列处理的是本系统写回第三方系统的单据。")
  415. save_doc(doc, BASE / mod["folder"] / um_name)
  416. def rewrite_existing_brd_bbp():
  417. for key in ("S9", "运营诊断", "运营改善", "ChatBI", "系统集成"):
  418. mod = MODULES[key]
  419. folder = BASE / mod["folder"]
  420. write_brd(mod, folder / mod["brd_name"])
  421. write_bbp(mod, folder / mod["bbp_name"])
  422. old_s9 = [
  423. BASE / "S9" / "S9运营指标与智慧看板业务需求描述.docx",
  424. BASE / "S9" / "S9运营指标与智慧看板模块蓝图设计方案.docx",
  425. ]
  426. for p in old_s9:
  427. if p.exists() and p.name != MODULES["S9"]["brd_name"] and p.name != MODULES["S9"]["bbp_name"]:
  428. p.unlink()
  429. print("REMOVED", p)
  430. def main():
  431. BASE.mkdir(parents=True, exist_ok=True)
  432. rewrite_existing_brd_bbp()
  433. write_sys_brd()
  434. write_sys_bbp()
  435. write_sys_dds()
  436. write_sys_um()
  437. for key in ("运营诊断", "运营改善", "ChatBI", "系统集成"):
  438. write_module_dds(key, MODULES[key])
  439. write_module_um(key, MODULES[key])
  440. print("DONE")
  441. if __name__ == "__main__":
  442. main()