_refresh_release_v05_docs.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # -*- coding: utf-8 -*-
  2. """
  3. 按 2026-09-14 最新代码核对结论,刷新「Release产互联/待确认」交付文档:
  4. 1. 重新生成 系统集成、运营改善 两个模块的 需求/蓝图/详设/手册(内容修订,升 V0.5)。
  5. 2. 新生成 九宫格智慧运营看板《详细设计说明书》《用户操作手册》(初版 V0.1,补齐四大文档)。
  6. 3. 用仓库 9/14 版《Ai-DOP第三方对接业务数据详表-业务页.docx》覆盖待确认目录旧版。
  7. 旧版文件移入 待确认/_backup_V0.4_20260904/ 备份。
  8. """
  9. from __future__ import annotations
  10. import shutil
  11. import sys
  12. from pathlib import Path
  13. HERE = Path(__file__).resolve().parent
  14. sys.path.insert(0, str(HERE))
  15. from _gen_s9_diag_impr_int_delivery import write_brd, write_bbp, set_cell_text # noqa: E402
  16. from _gen_delivery_sys_docs import write_module_dds, write_module_um # noqa: E402
  17. from _gen_s9_modules_data import MODULES # noqa: E402
  18. STAGING = HERE / "_tmp_docx_out" / "v05_release_candidate"
  19. TARGET = Path(r"C:\Users\skygu\OneDrive\Projects\AIDOP\项目\项目管理\产互联项目管理\交付文档\Release产互联\待确认")
  20. BACKUP = TARGET / "_backup_V0.4_20260904"
  21. REPO_DETAIL_DOCX = HERE / "plan" / "系统集成" / "Ai-DOP第三方对接业务数据详表-业务页.docx"
  22. TODAY = "2026-09-14"
  23. # (生成键, 文档类别, 生成文件名, 交付文件名, 版本记录变更说明)
  24. JOBS = [
  25. ("系统集成", "brd", "系统集成业务需求描述.docx", "系统集成业务需求描述-V0.5.docx",
  26. "按最新代码核对:补充第三方标准 API 推数入站(方式丙);日志查询菜单名称对齐系统"),
  27. ("系统集成", "bbp", "系统集成模块蓝图设计方案.docx", "系统集成模块蓝图设计方案-V0.5.docx",
  28. "按最新代码核对:修正日志查询路由;补充方式丙推数入站接入方式"),
  29. ("系统集成", "dds", "系统集成模块详细设计说明书.docx", "系统集成模块详细设计说明书-V0.5.docx",
  30. "按最新代码核对:接口设计补充方式丙推数入站;模块检查逻辑同步"),
  31. ("系统集成", "um", "系统集成-用户操作手册.docx", "系统集成-用户操作手册-V0.5.docx",
  32. "按最新代码核对:补充方式丙推数入站运维提示"),
  33. ("运营改善", "brd", "运营改善业务需求描述.docx", "运营改善业务需求描述-V0.5.docx",
  34. "按最新代码核对:补充改善计划台账入口"),
  35. ("运营改善", "bbp", "运营改善模块蓝图设计方案.docx", "运营改善模块蓝图设计方案-V0.5.docx",
  36. "按最新代码核对:补充改善计划台账入口"),
  37. ("运营改善", "dds", "运营改善模块详细设计说明书.docx", "运营改善模块详细设计说明书-V0.5.docx",
  38. "按最新代码核对:补充改善计划台账入口"),
  39. ("运营改善", "um", "运营改善-用户操作手册.docx", "运营改善-用户操作手册-V0.5.docx",
  40. "按最新代码核对:补充改善计划台账入口"),
  41. ]
  42. # 九宫格新文档(初版 V0.1)
  43. NEW_JOBS = [
  44. ("S9", "dds", "九宫格智慧运营看板模块详细设计说明书.docx", "九宫格智慧运营看板模块详细设计说明书-V0.1.docx"),
  45. ("S9", "um", "九宫格智慧运营看板-用户操作手册.docx", "九宫格智慧运营看板-用户操作手册-V0.1.docx"),
  46. ]
  47. def find_cover_table(doc):
  48. for t in doc.tables:
  49. if t.rows and t.rows[0].cells[0].text.strip() == "文档编号":
  50. return t
  51. return None
  52. def find_version_table(doc):
  53. for t in doc.tables:
  54. hdr = [c.text.strip() for c in t.rows[0].cells]
  55. if hdr[:4] == ["日期", "版本", "修订人", "变更说明"]:
  56. return t
  57. return None
  58. def set_cover(doc, version: str, date: str):
  59. t = find_cover_table(doc)
  60. assert t is not None, "未找到封面信息表"
  61. for row in t.rows:
  62. key = row.cells[0].text.strip()
  63. if key == "版本":
  64. set_cell_text(row.cells[1], version, center=True)
  65. elif key == "编制日期":
  66. set_cell_text(row.cells[1], date, center=True)
  67. def bump_version(doc, note: str):
  68. set_cover(doc, "V0.5", TODAY)
  69. t = find_version_table(doc)
  70. assert t is not None, "未找到版本记录表"
  71. row = t.add_row()
  72. for c, val in enumerate((TODAY, "V0.5", "智造易项目组", note)):
  73. set_cell_text(row.cells[c], val, center=True)
  74. def reset_version_new_doc(doc):
  75. set_cover(doc, "V0.1", TODAY)
  76. t = find_version_table(doc)
  77. assert t is not None, "未找到版本记录表"
  78. # 生成器写入的 V0.1~V0.4 历史行对本新文档不成立,整体替换为单一初版行
  79. for row in list(t.rows)[1:]:
  80. t._tbl.remove(row._tr)
  81. row = t.add_row()
  82. for c, val in enumerate((TODAY, "V0.1", "智造易项目组", "初版建立(按最新代码补齐九宫格模块四大文档)")):
  83. set_cell_text(row.cells[c], val, center=True)
  84. def generate(kind: str, key: str, staging_name: str) -> Path:
  85. mod = MODULES[key]
  86. out = STAGING / staging_name
  87. if kind == "brd":
  88. write_brd(mod, out)
  89. elif kind == "bbp":
  90. write_bbp(mod, out)
  91. elif kind == "dds":
  92. write_module_dds(key, mod, dest=out)
  93. elif kind == "um":
  94. write_module_um(key, mod, dest=out)
  95. else:
  96. raise ValueError(kind)
  97. return out
  98. def main():
  99. from docx import Document
  100. STAGING.mkdir(parents=True, exist_ok=True)
  101. BACKUP.mkdir(parents=True, exist_ok=True)
  102. installed = []
  103. for key, kind, staging_name, final_name, note in JOBS:
  104. src = generate(kind, key, staging_name)
  105. doc = Document(str(src))
  106. bump_version(doc, note)
  107. doc.save(str(src))
  108. old = TARGET / final_name.replace("-V0.5.docx", "-V0.4.docx")
  109. if old.exists():
  110. shutil.move(str(old), str(BACKUP / old.name))
  111. shutil.copy2(str(src), str(TARGET / final_name))
  112. installed.append(final_name)
  113. print("V0.5", final_name)
  114. for key, kind, staging_name, final_name in NEW_JOBS:
  115. src = generate(kind, key, staging_name)
  116. doc = Document(str(src))
  117. reset_version_new_doc(doc)
  118. doc.save(str(src))
  119. shutil.copy2(str(src), str(TARGET / final_name))
  120. installed.append(final_name)
  121. print("V0.1", final_name)
  122. # 第三方对接业务数据详表:用仓库 9/14 版覆盖(含方式丙 entityCode 勾稽)
  123. detail_target = TARGET / REPO_DETAIL_DOCX.name
  124. if detail_target.exists():
  125. shutil.move(str(detail_target), str(BACKUP / detail_target.name))
  126. shutil.copy2(str(REPO_DETAIL_DOCX), str(detail_target))
  127. installed.append(REPO_DETAIL_DOCX.name + "(同步仓库 2026-09-14 版)")
  128. print("SYNC", REPO_DETAIL_DOCX.name)
  129. print("DONE", len(installed), "files")
  130. if __name__ == "__main__":
  131. main()