_bid_gen_figs.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. # -*- coding: utf-8 -*-
  2. """生成投标技术方案的总体架构类配图(8 张)。"""
  3. import sys
  4. sys.path.insert(0, __file__.rsplit("\\", 1)[0] if "\\" in __file__ else ".")
  5. sys.stdout.reconfigure(encoding="utf-8", errors="replace")
  6. from _bid_fig_kit import C, Fig, row
  7. # ==================================================================== 图1
  8. def fig_otd_blueprint():
  9. f = Fig("Ai-DOP 制造业数据智能运营平台 OTD 端到端总体业务蓝图",
  10. w=13.6, h=10.4,
  11. sub="以销售订单为主线,贯通 S0~S9 全流程;下层数据中台完成「采—存—治—用」,上层实现指标测量、智能诊断与改善闭环")
  12. # --- S0 运营建模(基座)
  13. f.panel(3, 90, 94, 9.0, "S0 运营建模(主数据与流程标准化)", tone="gray")
  14. s0 = row(6, 87.4, 20.5, 4.6, 4, 2.6,
  15. ["客户/供应商主数据", "物料主数据\n(18位统一编码)",
  16. "工艺主数据\n(标准工序库·工艺路线)", "订单模板与流程SOP"], f,
  17. tone="gray", fs=8.4)
  18. # --- OTD 业务主线
  19. f.panel(3, 79, 94, 22.0, "OTD 业务主线(订单接收 → 产品交付)", tone="blue")
  20. r1 = row(6, 75.6, 13.6, 5.0, 6, 2.2,
  21. ["销售订单接收\nS1", "订单评审\n交期评估 S1", "交付承诺与\n全流程跟踪 S1",
  22. "主生产计划\n产能平衡 S2", "作业计划下达\nS2", "物料需求计划\nMRP S3"], f,
  23. tone="blue", fs=8.4)
  24. r2 = row(6, 66.4, 13.6, 5.0, 6, 2.2,
  25. ["采购申请\n采购订单 S3", "供应商交货\n执行 S4", "来料检验IQC\n入库 S5",
  26. "生产执行\n过程检验 S6", "成品入库\nFQC 检验 S7", "销售发货\n交付客户 S1/S7"], f,
  27. tone="green", fs=8.4)
  28. f.chain(r1)
  29. f.chain(r2)
  30. wrap_y = 68.5
  31. f.arrow(r1[5]["b"], (r1[5]["c"][0], wrap_y), style="-")
  32. f.arrow((r1[5]["c"][0], wrap_y), (r2[0]["c"][0], wrap_y), style="-")
  33. f.arrow((r2[0]["c"][0], wrap_y), r2[0]["t"])
  34. f.note(6, 58.8, "变更管理:节点进度滞后 10% / 30% 或确认无法按期交付 → 自动预警 → 交付变更审批 → 与客户协商新交期并同步订单状态",
  35. fs=8.0, color="#404040")
  36. # --- S8 异常监控
  37. f.panel(3, 55.5, 94, 9.5, "S8 全流程异常监控", tone="orange")
  38. s8 = row(6, 52.4, 20.5, 5.0, 4, 2.6,
  39. ["异常识别与提报\n(系统自动 / 人工)", "分级响应\n一般·重要·紧急(≤1h)",
  40. "处理闭环\n措施与结果录入", "AI 智能体集群\n7×24 感知与预警驱动"], f,
  41. tone="orange", fs=8.4)
  42. f.chain(s8)
  43. # --- S9 运营绩效
  44. f.panel(3, 44.5, 94, 11.0, "S9 运营绩效指标测量与智能运营", tone="purple")
  45. s9 = row(6, 41.0, 16.2, 5.4, 5, 2.5,
  46. ["KPI 定义与日批计算\nOTD·OEE·交付率·合格率·周转",
  47. "九宫格智慧运营看板\n部门看板 · L1–L4 下钻",
  48. "运营问题诊断\n7 维根因溯源",
  49. "改善闭环\n建档·派单·跟踪·复盘",
  50. "ChatBI 智能报表\n自然语言问数"], f, tone="purple", fs=8.2)
  51. f.chain(s9[:4])
  52. f.arrow(s9[1]["b"], (s9[4]["c"][0], s9[1]["b"][1] - 1.6), style="-", dashed=True)
  53. f.arrow((s9[4]["c"][0], s9[1]["b"][1] - 1.6), s9[4]["b"], dashed=True)
  54. # --- 数据中台
  55. f.panel(3, 32.5, 94, 11.5, "数据中台(采 · 存 · 治 · 用)", tone="teal")
  56. dt = row(6, 28.8, 16.2, 5.0, 5, 2.5,
  57. ["STG 贴源层\n原样落地", "STD 标准层\n清洗·编码统一", "DWD 明细宽表\n主题化关联",
  58. "DWS / KPI 指标层\n日批聚合", "应用消费\n看板·诊断·ChatBI"], f,
  59. tone="teal", fs=8.2)
  60. f.chain(dt)
  61. f.note(6, 22.2, "数据治理:字段标准化、空值过滤、异常值标记、编码统一;数据质量准确率 ≥ 98%,主数据与单据状态同步延迟 ≤ 5 分钟",
  62. fs=8.0, color="#404040")
  63. # --- 系统集成
  64. f.panel(3, 20.0, 94, 17.5,
  65. "系统集成层(多源异构接入采集 ↑ 入站 · 业务结果 ↓ 出站回写)", tone="red")
  66. src = row(6, 16.6, 13.6, 4.4, 6, 2.2,
  67. ["ERP", "MES", "QMS / IQC", "SRM / 供应商门户", "WMS / 仓储", "CRM · TMS · OA"], f,
  68. tone="red", fs=8.6)
  69. f.note(6, 10.0,
  70. "接入方式:数据库直连 · HTTP-API · WebService · FTP 文件 · MQ 消息 · 物联网网关(6 种) | "
  71. "同步模式:定时同步 + 实时同步",
  72. fs=8.2, color="#404040")
  73. f.note(6, 6.6,
  74. "出站回写:统一 Outbox 事务表 → API 推送 → 回执核对 → 失败重试 / 断点续传,不重复入库、不丢数据",
  75. fs=8.2, color="#404040")
  76. f.note(6, 3.2,
  77. "移动端应用:生产执行 · 仓储物流 · 质量管理 · 协同决策(订单进度、供应商协同、决策看板与下钻)",
  78. fs=8.2, color="#404040")
  79. return f.save("fig_otd_blueprint")
  80. # ==================================================================== 图2
  81. def fig_application():
  82. f = Fig("应用架构", w=13.0, h=9.2,
  83. sub="五层分域架构:接入展现 — 业务应用 — 领域服务 — 数据服务 — 集成适配,横向贯穿安全与运维两大支撑体系")
  84. f.panel(3, 88, 78, 11.0, "① 接入与展现层", tone="blue")
  85. row(6, 84.6, 16.6, 5.2, 4, 2.6,
  86. ["PC 门户\nVue3 + Element Plus", "管理层大屏\n九宫格 / 部门看板",
  87. "移动端应用\n生产·仓储·质量·决策", "ChatBI 对话入口\n浮窗 / 独立页"], f,
  88. tone="blue", fs=8.4)
  89. f.panel(3, 75.5, 78, 15.0, "② 业务应用层(S0~S9)", tone="green")
  90. row(6, 72.1, 10.6, 4.8, 6, 1.9,
  91. ["S0 运营建模", "S1 产销协同", "S2 制造协同", "S3 供应协同",
  92. "S4 采购执行", "S5 物料仓储"], f, tone="green", fs=8.2)
  93. row(6, 65.7, 10.6, 4.8, 6, 1.9,
  94. ["S6 生产执行", "S7 成品仓储", "S8 异常监控", "S9 指标看板",
  95. "运营诊断", "改善闭环"], f, tone="green", fs=8.2)
  96. f.panel(3, 59.0, 78, 14.0, "③ 领域服务层(可复用业务能力)", tone="purple")
  97. row(6, 55.6, 13.6, 5.0, 5, 2.2,
  98. ["订单与交付\n评审·承诺·跟踪", "计划与排程\nMPS·MRP·产能",
  99. "采购与供应\n申请·订单·交货", "质量与追溯\nIQC·IPQC·FQC",
  100. "指标与诊断\nKPI·根因·改善"], f, tone="purple", fs=8.2)
  101. row(6, 49.1, 13.6, 4.0, 5, 2.2,
  102. ["工作流与审批", "消息与预警", "报表与导出", "任务调度", "多租户与权限"], f,
  103. tone="purple", fs=8.2)
  104. f.panel(3, 43.5, 78, 12.5, "④ 数据服务层(数据中台)", tone="teal")
  105. row(6, 40.1, 13.6, 5.0, 5, 2.2,
  106. ["贴源 STG", "标准 STD", "明细宽表 DWD", "指标 DWS / KPI", "主数据 MDM"], f,
  107. tone="teal", fs=8.4)
  108. f.note(6, 33.4, "数据治理:标准化 · 去重 · 空值过滤 · 异常标记 · 编码统一 · 血缘与质量稽核",
  109. fs=8.2, color="#404040")
  110. f.panel(3, 29.5, 78, 14.0, "⑤ 集成适配层", tone="red")
  111. row(6, 26.1, 10.6, 4.6, 6, 1.9,
  112. ["DB 直连", "HTTP-API", "WebService", "FTP 文件", "MQ 消息", "IoT 网关"], f,
  113. tone="red", fs=8.4)
  114. row(6, 20.2, 16.6, 4.6, 4, 2.6,
  115. ["可视化通道配置", "定时 / 实时调度", "同步监控与告警", "Outbox 出站回写"], f,
  116. tone="red", fs=8.4)
  117. f.panel(3, 14.0, 78, 13.0, "外部业务系统", tone="gray")
  118. row(6, 10.6, 10.6, 4.6, 6, 1.9,
  119. ["ERP", "MES", "QMS", "SRM", "WMS", "CRM / TMS / OA"], f,
  120. tone="gray", fs=8.6)
  121. f.note(6, 3.6, "工业互联网平台:OAuth2.0 单点登录(SSO),员工一次登录即可访问 Ai-DOP",
  122. fs=8.4, color="#404040")
  123. # 右侧纵向支撑体系
  124. f.box(83, 88, 6.5, 87.0, "安\n全\n体\n系\n\n数\n据\n·\n应\n用\n·\n网\n络\n·\n审\n计",
  125. tone="blue_d", fs=8.8)
  126. f.box(90.5, 88, 6.5, 87.0, "运\n维\n体\n系\n\n监\n控\n·\n日\n志\n·\n备\n份\n·\n扩\n容",
  127. tone="gold", fs=8.8)
  128. f.crop(0)
  129. return f.save("fig_application")
  130. # ==================================================================== 图3
  131. def fig_data():
  132. f = Fig("数据架构:数据中台「采—存—治—用」", w=13.4, h=7.4,
  133. sub="统一数据底座支撑 KPI 测量、智能诊断、BI 可视化与 AI 应用;主数据「一处修改、全系统同步」")
  134. f.panel(3, 90, 17, 56, "采(多源采集)", tone="red")
  135. row(5, 85.5, 13, 6.0, 1, 0, ["ERP\n主数据·订单·库存"], f, tone="red", fs=8.4)
  136. row(5, 78.0, 13, 6.0, 1, 0, ["MES\n工单·工序·设备"], f, tone="red", fs=8.4)
  137. row(5, 70.5, 13, 6.0, 1, 0, ["QMS\nIQC·IPQC·FQC"], f, tone="red", fs=8.4)
  138. row(5, 63.0, 13, 6.0, 1, 0, ["SRM / WMS\n交货·出入库"], f, tone="red", fs=8.4)
  139. row(5, 55.5, 13, 6.0, 1, 0, ["CRM·TMS·OA·IoT"], f, tone="red", fs=8.4)
  140. f.note(5, 46.0, "直连 / API /\nWebService /\nFTP / MQ /\nIoT 网关", fs=8.2)
  141. f.panel(22, 90, 34, 56, "存 + 治(分层建模与治理)", tone="teal")
  142. a = f.box(24.5, 85.5, 29, 6.0, "STG 贴源层 原样落地 · 不做业务改写", tone="teal", fs=8.6)
  143. b = f.box(24.5, 76.5, 29, 6.0, "STD 标准层 字段标准化 · 编码统一 · 空值过滤 · 异常标记",
  144. tone="teal", fs=8.0)
  145. c = f.box(24.5, 67.5, 29, 6.0, "DWD 明细宽表 按订单主线主题化关联", tone="teal", fs=8.6)
  146. d = f.box(24.5, 58.5, 29, 6.0, "DWS / KPI 指标层 日批聚合 · L1–L4 分层指标",
  147. tone="teal", fs=8.4)
  148. for x, y in zip([a, b, c], [b, c, d]):
  149. f.arrow(x["b"], y["t"])
  150. f.obox(24.5, 49.5, 14, 6.0, "MDM 主数据\n客户·供应商·物料·工艺", tone="teal", fs=8.0)
  151. f.obox(39.5, 49.5, 14, 6.0, "元数据 · 血缘\n质量稽核规则", tone="teal", fs=8.0)
  152. f.note(24.5, 40.5, "质量目标:数据准确率 ≥ 98%;主数据与单据状态同步延迟 ≤ 5 分钟(异常 ≤ 15 分钟)",
  153. fs=8.2, color="#404040")
  154. f.panel(57, 90, 40, 56, "用(数据消费)", tone="purple")
  155. u1 = f.box(59.5, 85.5, 16.5, 6.0, "九宫格智慧运营看板", tone="purple", fs=8.6)
  156. u2 = f.box(78, 85.5, 16.5, 6.0, "部门看板 / 自助下钻", tone="purple", fs=8.6)
  157. u3 = f.box(59.5, 76.5, 16.5, 6.0, "运营问题诊断", tone="purple", fs=8.6)
  158. u4 = f.box(78, 76.5, 16.5, 6.0, "改善闭环与效果验证", tone="purple", fs=8.4)
  159. u5 = f.box(59.5, 67.5, 16.5, 6.0, "ChatBI 智能报表", tone="purple", fs=8.6)
  160. u6 = f.box(78, 67.5, 16.5, 6.0, "S8 异常预警与 AI 智能体", tone="purple", fs=8.0)
  161. f.box(59.5, 58.5, 35, 6.0, "Outbox 出站回写 → ERP / MES 等业务系统", tone="orange", fs=8.6)
  162. f.note(59.5, 49.0,
  163. "KPI 示例口径:\n"
  164. "· 产销协同 OTD 交付率 = 按时交付订单数 / 总订单数 × 100%\n"
  165. "· 生产执行 OEE = 可用率 × 表现率 × 质量率 × 100%\n"
  166. "· 采购供应 供应商交付率 = 按时交付批数 / 总采购批数 × 100%\n"
  167. "· 质量   成品合格率 = 合格成品数 / 总生产数 × 100%\n"
  168. "· 库存周转 库存周转天数 = 库存数量 / 日均用量",
  169. fs=8.0, color="#404040", va="top")
  170. f.arrow((20.0, 60), (24.0, 60), lw=1.6)
  171. f.arrow((54.0, 60), (58.5, 60), lw=1.6)
  172. f.crop(30)
  173. return f.save("fig_data")
  174. # ==================================================================== 图4
  175. def fig_tech():
  176. f = Fig("技术架构", w=13.0, h=7.6,
  177. sub="主流开源技术栈 + 容器化部署;前后端分离、服务可水平扩展、支持信创环境适配")
  178. f.panel(3, 91, 94, 12.5, "客户端", tone="blue")
  179. row(6, 87.6, 21.5, 5.4, 4, 2.4,
  180. ["浏览器\nChrome / Edge / 国产浏览器", "移动端\n企业微信 / 钉钉 / H5",
  181. "大屏终端\n看板一体机", "开放 API 调用方"], f, tone="blue", fs=8.2)
  182. f.note(6, 80.6, "HTTPS / TLS 1.2+", fs=8.2)
  183. f.panel(3, 77.5, 94, 8.0, "接入层", tone="gray")
  184. row(6, 74.6, 21.5, 4.6, 4, 2.4,
  185. ["Nginx 反向代理 · 负载均衡", "API 网关 · 统一鉴权限流",
  186. "OAuth2.0 / JWT · SSO", "静态资源 CDN / 缓存"], f, tone="gray", fs=8.2)
  187. f.panel(3, 68.5, 94, 15.0, "应用层", tone="green")
  188. row(6, 65.2, 13.6, 5.4, 6, 2.2,
  189. ["前端\nVue 3 + TypeScript\nElement Plus · ECharts",
  190. "后端\n.NET 8 + Admin.NET\n分层架构",
  191. "ORM\nSqlSugar\n多库适配",
  192. "工作流\n审批流引擎",
  193. "任务调度\n日批 / 定时同步",
  194. "集成执行器\nDB Pull · API Push"], f, tone="green", fs=7.8)
  195. row(6, 57.4, 21.5, 4.6, 4, 2.4,
  196. ["多租户隔离", "RBAC 权限与数据权限", "操作 / 登录审计日志", "AI 能力接入(LLM)"], f,
  197. tone="green", fs=8.2)
  198. f.panel(3, 52.0, 94, 13.5, "数据层", tone="teal")
  199. row(6, 48.6, 17.4, 5.4, 5, 2.4,
  200. ["MySQL 8\n业务库", "MySQL 8\n数据中台库(MDP)",
  201. "Redis\n缓存 · 会话 · 分布式锁", "对象存储 / 文件服务\n附件·标签·报表",
  202. "SQL Server / 达梦\n源库只读适配"], f, tone="teal", fs=8.0)
  203. f.note(6, 41.6, "读写分离与索引优化;大表分区与归档;备份策略:全量日备 + 增量,异地留存",
  204. fs=8.2, color="#404040")
  205. f.panel(3, 38.5, 94, 12.0, "运行与部署", tone="orange")
  206. row(6, 35.2, 17.4, 5.4, 5, 2.4,
  207. ["Docker 容器化", "Docker Compose /\nK8s 编排", "多环境\n开发·测试·UAT·生产",
  208. "CI/CD 流水线", "灰度发布与回滚"], f, tone="orange", fs=8.0)
  209. f.note(6, 28.2, "可用性目标:全年 ≥ 99%;关键组件高可用部署;重大故障力争 48 小时内恢复",
  210. fs=8.2, color="#404040")
  211. f.panel(3, 25.0, 94, 14.5, "监控 · 安全 · 运维", tone="red")
  212. row(6, 21.6, 13.6, 5.0, 6, 2.2,
  213. ["应用与接口监控", "同步任务监控告警", "集中日志检索",
  214. "数据加密与脱敏", "漏洞扫描与补丁", "备份恢复演练"], f, tone="red", fs=8.0)
  215. f.note(6, 14.6,
  216. "性能目标:常规页面与查询 ≤ 30 秒,复杂查询 / 多图联动 ≤ 60 秒,接口成功率 ≥ 99%;"
  217. "约 1000 人在线、400 人并发;超大导出与 AI 任务按异步任务处理",
  218. fs=8.2, color="#404040")
  219. f.crop(7)
  220. return f.save("fig_tech")
  221. # ==================================================================== 图5
  222. def fig_integration():
  223. f = Fig("系统集成与接口架构", w=13.2, h=7.2,
  224. sub="6 种接入方式 × 定时/实时双模式;可视化配置新增一套第三方系统 ≤ 4 小时,无需大量编码")
  225. f.panel(3, 90, 21, 74, "源系统", tone="gray")
  226. names = ["ERP\n主数据·订单·库存·财务", "MES\n工单·工序·设备·报工",
  227. "QMS\n来料·过程·成品检验", "SRM / 供应商门户\n交货计划·发货单",
  228. "WMS\n出入库·库存·盘点", "CRM · TMS · OA · IoT"]
  229. srcs = []
  230. for i, t in enumerate(names):
  231. srcs.append(f.box(5.5, 85.5 - i * 11.5, 16, 7.6, t, tone="gray", fs=7.8))
  232. f.panel(26, 90, 30, 74, "集成通道(采集与治理)", tone="red")
  233. ways = f.box(28.5, 85.5, 25, 12.0,
  234. "接入方式(6 种)\n数据库直连 · HTTP-API · WebService\nFTP 文件 · MQ 消息 · 物联网网关",
  235. tone="red", fs=8.2)
  236. mode = f.box(28.5, 71.0, 25, 8.0, "同步模式\n定时同步(夜间批量) · 实时同步", tone="red", fs=8.4)
  237. cfg = f.box(28.5, 60.5, 25, 8.0, "可视化通道配置\n数据源 · 实体映射 · 调度策略", tone="red", fs=8.2)
  238. cln = f.box(28.5, 50.0, 25, 9.5,
  239. "清洗与标准化\n字段标准化 · 空值过滤\n异常值标记 · 编码统一", tone="red", fs=8.2)
  240. mon = f.box(28.5, 37.5, 25, 9.5,
  241. "监控与容错\n同步日志 · 异常告警\n断点续传 · 重试去重", tone="red", fs=8.2)
  242. for a, b in zip([ways, mode, cfg, cln], [mode, cfg, cln, mon]):
  243. f.arrow(a["b"], b["t"])
  244. for s in srcs:
  245. f.arrow(s["r"], (27.6, s["r"][1]), lw=0.9)
  246. f.panel(58, 90, 18, 74, "统一数据底座", tone="teal")
  247. st = [f.box(60, 85.5, 14, 8.0, "STG 贴源", tone="teal", fs=8.8),
  248. f.box(60, 74.5, 14, 8.0, "STD 标准", tone="teal", fs=8.8),
  249. f.box(60, 63.5, 14, 8.0, "DWD 宽表", tone="teal", fs=8.8),
  250. f.box(60, 52.5, 14, 8.0, "DWS / KPI", tone="teal", fs=8.8)]
  251. for a, b in zip(st, st[1:]):
  252. f.arrow(a["b"], b["t"])
  253. f.arrow(mon["r"], (59.2, mon["r"][1]), lw=1.4)
  254. f.box(60, 40.0, 14, 9.5, "mdp_outbox\n出站事务表", tone="orange", fs=8.4)
  255. f.panel(78, 90, 19, 74, "上层应用 / 回写", tone="purple")
  256. ups = ["九宫格看板", "部门看板与下钻", "运营问题诊断", "改善闭环",
  257. "ChatBI 智能报表", "S8 异常预警"]
  258. for i, t in enumerate(ups):
  259. f.box(80, 85.5 - i * 8.0, 15, 6.0, t, tone="purple", fs=8.4)
  260. f.arrow(st[3]["r"], (79.2, st[3]["r"][1]), lw=1.4)
  261. ob = f.box(80, 37.0, 15, 8.5, "API 推送回写\nERP / MES 回执核对", tone="orange", fs=8.2)
  262. f.arrow((74.2, 35.2), ob["l"], lw=1.4)
  263. f.note(4, 13.5,
  264. "性能与适配指标:实时同步业务数据变更推送时延 ≤ 2–5 秒;夜间批量 1000 万条明细传输 + 清洗转换 ≤ 30 分钟;"
  265. "网络中断恢复后自动断点续传,不重复入库、不丢失数据;\n"
  266. "适配主流国产及通用 ERP / MES / WMS;凭据加密托管,前端不明文展示密钥;"
  267. "外部系统超时或不可用导致的延迟不计入本平台性能指标。",
  268. fs=8.4, color="#404040", va="top")
  269. f.crop(2)
  270. return f.save("fig_integration")
  271. # ==================================================================== 图6
  272. def fig_diagnosis():
  273. f = Fig("智能诊断与分析架构", w=13.2, h=7.0,
  274. sub="以销售订单为主线贯通全链路;实时类问题识别 ≤ 3 分钟,周期类问题每日定时分析;支持 7 个维度根因下钻")
  275. f.panel(3, 90, 94, 15.0, "① 端到端数据链路(以销售订单为主线)", tone="blue")
  276. ch = row(5.5, 86.6, 10.6, 5.6, 8, 1.4,
  277. ["需求预测", "销售订单", "采购计划", "来料入库",
  278. "车间生产", "半成品流转", "成品入库", "发货配送"], f, tone="blue", fs=8.2)
  279. f.chain(ch)
  280. f.note(5.5, 78.6, "断点识别:任一节点缺失前序单据、状态未流转或时间倒挂,即判定为链路断点",
  281. fs=8.2, color="#404040")
  282. f.panel(3, 74.0, 46, 26.0, "② 异常识别(规则 + 模型)", tone="orange")
  283. ex = ["断点\n单据链中断", "滞后\n节点超时效", "损耗\n物料/工时异常",
  284. "供需失衡\n计划与产能错配", "库存积压\n呆滞与周转恶化", "交付延期\nOTD 未达标",
  285. "产能浪费\n设备与人效低", "物流低效\n发运与配送滞后"]
  286. for i, t in enumerate(ex):
  287. f.box(5.5 + (i % 4) * 10.6, 70.6 - (i // 4) * 8.6, 9.4, 6.6, t,
  288. tone="orange", fs=7.8)
  289. f.note(5.5, 53.0,
  290. "实时类(缺料 · 生产停滞 · 发货延迟)识别延迟 ≤ 3 分钟\n"
  291. "周期类(库存积压 · 供需失衡 · 产能利用率)每日定时执行分析",
  292. fs=8.2, color="#404040", va="top")
  293. f.panel(51, 74.0, 46, 26.0, "③ 根因溯源(7 维下钻)", tone="purple")
  294. dims = ["订单", "物料", "供应商", "产线", "仓库", "时间段", "人员"]
  295. for i, t in enumerate(dims):
  296. f.box(53.5 + (i % 4) * 10.6, 70.6 - (i // 4) * 8.6, 9.4, 6.6, t,
  297. tone="purple", fs=9.4)
  298. f.box(85.3, 62.0, 9.4, 6.6, "多维关联\n算法", tone="purple", fs=8.0)
  299. f.note(53.5, 53.0,
  300. "从指标 → 明细单据 → 责任维度逐级下钻,每条结论均可追溯到订单主线或指标编码,保留证据快照",
  301. fs=8.2, color="#404040", va="top")
  302. f.panel(3, 46.0, 94, 16.0, "④ 诊断输出与改善闭环", tone="green")
  303. out = row(5.5, 42.6, 16.6, 6.6, 5, 2.6,
  304. ["运营诊断报告\n结论·根因·证据", "改善策略建议\n可落地措施清单",
  305. "问题建档\n生成改善任务", "整改派单与跟踪\n责任人·行动项·进度",
  306. "效果量化复盘\n基线 vs 当前 KPI"], f, tone="green", fs=8.0)
  307. f.chain(out)
  308. f.note(5.5, 33.0,
  309. "闭环规则:改善单必须关联诊断问题或指标编码,保证端到端可追溯;效果验证须保留基线值、目标值与验证结论;"
  310. "复盘通过后沉淀为标准化管控规则并回写运营建模(S0)。",
  311. fs=8.2, color="#404040", va="top")
  312. f.panel(3, 26.0, 94, 12.0, "⑤ 支撑能力", tone="teal")
  313. row(5.5, 22.6, 16.6, 5.6, 5, 2.6,
  314. ["统一数据抽取\nSTG→STD→DWD", "指标计算引擎\n日批 + 触发式",
  315. "阈值与规则库\n可配置", "AI 智能体集群\n7×24 感知预警",
  316. "ChatBI\n自然语言追问"], f, tone="teal", fs=8.0)
  317. f.crop(11)
  318. return f.save("fig_diagnosis")
  319. # ==================================================================== 图7
  320. def fig_kanban():
  321. f = Fig("九宫格智慧运营看板与指标下钻结构", w=12.4, h=7.4,
  322. sub="管理层一屏总览 → 部门看板 → 指标下钻 → 明细证据 → 诊断改善,五级贯通")
  323. f.panel(3, 90, 45, 72, "九宫格智慧运营看板(管理层大屏)", tone="blue")
  324. grid = [("S1 产销协同", "OTD 交付率"), ("S2 制造协同", "计划达成率"),
  325. ("S3 供应协同", "物料齐套率"), ("S4 采购执行", "供应商交付率"),
  326. ("S5 物料仓储", "库存周转天数"), ("S6 生产执行", "设备 OEE"),
  327. ("S7 成品仓储", "成品合格率"), ("S8 异常监控", "异常闭环率"),
  328. ("S9 运营指标", "综合运营指数")]
  329. for i, (m, k) in enumerate(grid):
  330. f.box(5.5 + (i % 3) * 13.8, 85.5 - (i // 3) * 18.0, 12.6, 15.0,
  331. f"{m}\n\n{k}\n\n● 红 / 黄 / 绿", tone="blue", fs=8.2)
  332. f.note(5.5, 30.5,
  333. "红黄绿状态由指标阈值判定;点击任一格子进入对应部门看板或模块详情看板;\n"
  334. "顶栏统一展示异常预警摘要与待办改善任务数。",
  335. fs=8.2, color="#404040", va="top")
  336. f.panel(50, 90, 22, 72, "部门看板", tone="green")
  337. dept = [("生产部", "工单进度\n设备 OEE\n工序瓶颈分析"),
  338. ("采购部", "供应商交付排行\n物料齐套率\n逾期订单"),
  339. ("质量部", "各环节不合格率\n成品与半成品不良率")]
  340. for i, (d, k) in enumerate(dept):
  341. f.box(52.5, 85.5 - i * 19.5, 17, 16.5, f"{d}\n\n{k}", tone="green", fs=8.2)
  342. f.note(52.5, 30.5, "按角色与数据权限\n分发;空数据友好提示", fs=8.2, va="top")
  343. f.panel(74, 90, 23, 72, "指标下钻与自助分析", tone="purple")
  344. lv = [("L1", "模块级核心 KPI"), ("L2", "维度分解指标"),
  345. ("L3", "过程 / 工序级指标"), ("L4", "单据 · 批次明细")]
  346. boxes = []
  347. for i, (l, t) in enumerate(lv):
  348. boxes.append(f.box(76.5, 85.5 - i * 11.0, 18, 8.0, f"{l} {t}",
  349. tone="purple", fs=8.6))
  350. for a, b in zip(boxes, boxes[1:]):
  351. f.arrow(a["b"], b["t"])
  352. f.box(76.5, 41.5, 18, 8.0, "进入运营问题诊断", tone="orange", fs=8.8)
  353. f.arrow(boxes[3]["b"], (85.5, 41.5))
  354. f.note(76.5, 30.5,
  355. "支持按时间、产品、客户、\n供应商等条件自助筛选;\n"
  356. "示例:成品合格率 → 某工序\n不合格明细。",
  357. fs=8.2, va="top")
  358. f.crop(14)
  359. return f.save("fig_kanban")
  360. # ==================================================================== 图8
  361. def fig_closedloop():
  362. f = Fig("异常发现 → 诊断 → 改善 → 验证 闭环管理逻辑", w=12.6, h=6.6,
  363. sub="PDCA 闭环:任何一次异常都必须走完「发现—定位—整改—验证—固化」,未验证通过不得关闭")
  364. steps = [
  365. ("① 发现\n异常识别与提报", "orange",
  366. "系统自动触发 / 人工提报\n实时类 ≤ 3 分钟"),
  367. ("② 定级\n分级响应", "orange",
  368. "一般 · 重要 · 紧急\n紧急异常 ≤ 1 小时响应"),
  369. ("③ 诊断\n根因溯源", "purple",
  370. "7 维下钻取证\n输出运营诊断报告"),
  371. ("④ 建档\n改善任务生成", "green",
  372. "关联指标与诊断结论\n明确目标值与期限"),
  373. ("⑤ 派单\n责任人与行动项", "green",
  374. "复用平台审批流\n进入责任人待办"),
  375. ("⑥ 执行\n过程跟踪", "green",
  376. "行动项状态更新\n进度可视、超期提醒"),
  377. ("⑦ 验证\n效果量化复盘", "blue",
  378. "基线值 vs 当前 KPI\n未达标退回继续改善"),
  379. ("⑧ 固化\n标准规则沉淀", "blue",
  380. "回写 S0 运营建模\n形成 SOP 与管控规则"),
  381. ]
  382. xs = [4, 28, 52, 76]
  383. ys = [82, 50]
  384. nodes = []
  385. for i, (t, tone, desc) in enumerate(steps):
  386. x, y = xs[i % 4], ys[i // 4]
  387. n = f.box(x, y, 20, 13.0, t, tone=tone, fs=9.6)
  388. f.note(x + 10, y - 16.0, desc, fs=8.2, ha="center", color="#404040")
  389. nodes.append(n)
  390. for i in range(3):
  391. f.arrow(nodes[i]["r"], nodes[i + 1]["l"], lw=1.4)
  392. f.arrow(nodes[i + 4]["r"], nodes[i + 5]["l"], lw=1.4)
  393. f.arrow(nodes[3]["b"], (nodes[3]["c"][0], 62.0), style="-", lw=1.4)
  394. f.arrow((nodes[3]["c"][0], 62.0), (nodes[4]["c"][0], 62.0), style="-", lw=1.4)
  395. f.arrow((nodes[4]["c"][0], 62.0), nodes[4]["t"], lw=1.4)
  396. # 回环:沿左侧外缘回到 ①,避免与 ④→⑤ 折线共用同一列
  397. lx = 1.6
  398. f.arrow(nodes[7]["b"], (nodes[7]["c"][0], 26.0), style="-", lw=1.4, dashed=True)
  399. f.arrow((nodes[7]["c"][0], 26.0), (lx, 26.0), style="-", lw=1.4, dashed=True)
  400. f.arrow((lx, 26.0), (lx, 88.5), style="-", lw=1.4, dashed=True)
  401. f.arrow((lx, 88.5), (nodes[0]["c"][0], 88.5), style="-", lw=1.4, dashed=True)
  402. f.arrow((nodes[0]["c"][0], 88.5), nodes[0]["t"], lw=1.4, dashed=True)
  403. f.note(52, 23.0, "持续治理:规则固化后回到监控环节,形成螺旋上升的运营改善循环",
  404. fs=8.6, ha="center", color="#404040")
  405. f.panel(4, 18.0, 92, 13.0, "闭环刚性约束", tone="gray")
  406. f.note(6, 14.0,
  407. "· 改善单必须关联诊断问题或指标编码,端到端可追溯  · 派单复用平台审批流,不另建孤立任务系统\n"
  408. "· 效果验证须保留基线值、目标值与验证结论      · 验证未通过的改善单不得关闭,自动退回继续改善\n"
  409. "· 所有异常与改善记录留痕,支持按周期统计闭环率与平均闭环时长",
  410. fs=8.4, color="#404040", va="top")
  411. f.crop(2)
  412. return f.save("fig_closedloop")
  413. if __name__ == "__main__":
  414. print("生成技术方案配图:")
  415. fig_otd_blueprint()
  416. fig_application()
  417. fig_data()
  418. fig_tech()
  419. fig_integration()
  420. fig_diagnosis()
  421. fig_kanban()
  422. fig_closedloop()
  423. print("完成。")