# -*- coding: utf-8 -*- """生成投标技术方案的总体架构类配图(8 张)。""" import sys sys.path.insert(0, __file__.rsplit("\\", 1)[0] if "\\" in __file__ else ".") sys.stdout.reconfigure(encoding="utf-8", errors="replace") from _bid_fig_kit import C, Fig, row # ==================================================================== 图1 def fig_otd_blueprint(): f = Fig("Ai-DOP 制造业数据智能运营平台 OTD 端到端总体业务蓝图", w=13.6, h=10.4, sub="以销售订单为主线,贯通 S0~S9 全流程;下层数据中台完成「采—存—治—用」,上层实现指标测量、智能诊断与改善闭环") # --- S0 运营建模(基座) f.panel(3, 90, 94, 9.0, "S0 运营建模(主数据与流程标准化)", tone="gray") s0 = row(6, 87.4, 20.5, 4.6, 4, 2.6, ["客户/供应商主数据", "物料主数据\n(18位统一编码)", "工艺主数据\n(标准工序库·工艺路线)", "订单模板与流程SOP"], f, tone="gray", fs=8.4) # --- OTD 业务主线 f.panel(3, 79, 94, 22.0, "OTD 业务主线(订单接收 → 产品交付)", tone="blue") r1 = row(6, 75.6, 13.6, 5.0, 6, 2.2, ["销售订单接收\nS1", "订单评审\n交期评估 S1", "交付承诺与\n全流程跟踪 S1", "主生产计划\n产能平衡 S2", "作业计划下达\nS2", "物料需求计划\nMRP S3"], f, tone="blue", fs=8.4) r2 = row(6, 66.4, 13.6, 5.0, 6, 2.2, ["采购申请\n采购订单 S3", "供应商交货\n执行 S4", "来料检验IQC\n入库 S5", "生产执行\n过程检验 S6", "成品入库\nFQC 检验 S7", "销售发货\n交付客户 S1/S7"], f, tone="green", fs=8.4) f.chain(r1) f.chain(r2) wrap_y = 68.5 f.arrow(r1[5]["b"], (r1[5]["c"][0], wrap_y), style="-") f.arrow((r1[5]["c"][0], wrap_y), (r2[0]["c"][0], wrap_y), style="-") f.arrow((r2[0]["c"][0], wrap_y), r2[0]["t"]) f.note(6, 58.8, "变更管理:节点进度滞后 10% / 30% 或确认无法按期交付 → 自动预警 → 交付变更审批 → 与客户协商新交期并同步订单状态", fs=8.0, color="#404040") # --- S8 异常监控 f.panel(3, 55.5, 94, 9.5, "S8 全流程异常监控", tone="orange") s8 = row(6, 52.4, 20.5, 5.0, 4, 2.6, ["异常识别与提报\n(系统自动 / 人工)", "分级响应\n一般·重要·紧急(≤1h)", "处理闭环\n措施与结果录入", "AI 智能体集群\n7×24 感知与预警驱动"], f, tone="orange", fs=8.4) f.chain(s8) # --- S9 运营绩效 f.panel(3, 44.5, 94, 11.0, "S9 运营绩效指标测量与智能运营", tone="purple") s9 = row(6, 41.0, 16.2, 5.4, 5, 2.5, ["KPI 定义与日批计算\nOTD·OEE·交付率·合格率·周转", "九宫格智慧运营看板\n部门看板 · L1–L4 下钻", "运营问题诊断\n7 维根因溯源", "改善闭环\n建档·派单·跟踪·复盘", "ChatBI 智能报表\n自然语言问数"], f, tone="purple", fs=8.2) f.chain(s9[:4]) f.arrow(s9[1]["b"], (s9[4]["c"][0], s9[1]["b"][1] - 1.6), style="-", dashed=True) f.arrow((s9[4]["c"][0], s9[1]["b"][1] - 1.6), s9[4]["b"], dashed=True) # --- 数据中台 f.panel(3, 32.5, 94, 11.5, "数据中台(采 · 存 · 治 · 用)", tone="teal") dt = row(6, 28.8, 16.2, 5.0, 5, 2.5, ["STG 贴源层\n原样落地", "STD 标准层\n清洗·编码统一", "DWD 明细宽表\n主题化关联", "DWS / KPI 指标层\n日批聚合", "应用消费\n看板·诊断·ChatBI"], f, tone="teal", fs=8.2) f.chain(dt) f.note(6, 22.2, "数据治理:字段标准化、空值过滤、异常值标记、编码统一;数据质量准确率 ≥ 98%,主数据与单据状态同步延迟 ≤ 5 分钟", fs=8.0, color="#404040") # --- 系统集成 f.panel(3, 20.0, 94, 17.5, "系统集成层(多源异构接入采集 ↑ 入站 · 业务结果 ↓ 出站回写)", tone="red") src = row(6, 16.6, 13.6, 4.4, 6, 2.2, ["ERP", "MES", "QMS / IQC", "SRM / 供应商门户", "WMS / 仓储", "CRM · TMS · OA"], f, tone="red", fs=8.6) f.note(6, 10.0, "接入方式:数据库直连 · HTTP-API · WebService · FTP 文件 · MQ 消息 · 物联网网关(6 种) | " "同步模式:定时同步 + 实时同步", fs=8.2, color="#404040") f.note(6, 6.6, "出站回写:统一 Outbox 事务表 → API 推送 → 回执核对 → 失败重试 / 断点续传,不重复入库、不丢数据", fs=8.2, color="#404040") f.note(6, 3.2, "移动端应用:生产执行 · 仓储物流 · 质量管理 · 协同决策(订单进度、供应商协同、决策看板与下钻)", fs=8.2, color="#404040") return f.save("fig_otd_blueprint") # ==================================================================== 图2 def fig_application(): f = Fig("应用架构", w=13.0, h=9.2, sub="五层分域架构:接入展现 — 业务应用 — 领域服务 — 数据服务 — 集成适配,横向贯穿安全与运维两大支撑体系") f.panel(3, 88, 78, 11.0, "① 接入与展现层", tone="blue") row(6, 84.6, 16.6, 5.2, 4, 2.6, ["PC 门户\nVue3 + Element Plus", "管理层大屏\n九宫格 / 部门看板", "移动端应用\n生产·仓储·质量·决策", "ChatBI 对话入口\n浮窗 / 独立页"], f, tone="blue", fs=8.4) f.panel(3, 75.5, 78, 15.0, "② 业务应用层(S0~S9)", tone="green") row(6, 72.1, 10.6, 4.8, 6, 1.9, ["S0 运营建模", "S1 产销协同", "S2 制造协同", "S3 供应协同", "S4 采购执行", "S5 物料仓储"], f, tone="green", fs=8.2) row(6, 65.7, 10.6, 4.8, 6, 1.9, ["S6 生产执行", "S7 成品仓储", "S8 异常监控", "S9 指标看板", "运营诊断", "改善闭环"], f, tone="green", fs=8.2) f.panel(3, 59.0, 78, 14.0, "③ 领域服务层(可复用业务能力)", tone="purple") row(6, 55.6, 13.6, 5.0, 5, 2.2, ["订单与交付\n评审·承诺·跟踪", "计划与排程\nMPS·MRP·产能", "采购与供应\n申请·订单·交货", "质量与追溯\nIQC·IPQC·FQC", "指标与诊断\nKPI·根因·改善"], f, tone="purple", fs=8.2) row(6, 49.1, 13.6, 4.0, 5, 2.2, ["工作流与审批", "消息与预警", "报表与导出", "任务调度", "多租户与权限"], f, tone="purple", fs=8.2) f.panel(3, 43.5, 78, 12.5, "④ 数据服务层(数据中台)", tone="teal") row(6, 40.1, 13.6, 5.0, 5, 2.2, ["贴源 STG", "标准 STD", "明细宽表 DWD", "指标 DWS / KPI", "主数据 MDM"], f, tone="teal", fs=8.4) f.note(6, 33.4, "数据治理:标准化 · 去重 · 空值过滤 · 异常标记 · 编码统一 · 血缘与质量稽核", fs=8.2, color="#404040") f.panel(3, 29.5, 78, 14.0, "⑤ 集成适配层", tone="red") row(6, 26.1, 10.6, 4.6, 6, 1.9, ["DB 直连", "HTTP-API", "WebService", "FTP 文件", "MQ 消息", "IoT 网关"], f, tone="red", fs=8.4) row(6, 20.2, 16.6, 4.6, 4, 2.6, ["可视化通道配置", "定时 / 实时调度", "同步监控与告警", "Outbox 出站回写"], f, tone="red", fs=8.4) f.panel(3, 14.0, 78, 13.0, "外部业务系统", tone="gray") row(6, 10.6, 10.6, 4.6, 6, 1.9, ["ERP", "MES", "QMS", "SRM", "WMS", "CRM / TMS / OA"], f, tone="gray", fs=8.6) f.note(6, 3.6, "工业互联网平台:OAuth2.0 单点登录(SSO),员工一次登录即可访问 Ai-DOP", fs=8.4, color="#404040") # 右侧纵向支撑体系 f.box(83, 88, 6.5, 87.0, "安\n全\n体\n系\n\n数\n据\n·\n应\n用\n·\n网\n络\n·\n审\n计", tone="blue_d", fs=8.8) f.box(90.5, 88, 6.5, 87.0, "运\n维\n体\n系\n\n监\n控\n·\n日\n志\n·\n备\n份\n·\n扩\n容", tone="gold", fs=8.8) f.crop(0) return f.save("fig_application") # ==================================================================== 图3 def fig_data(): f = Fig("数据架构:数据中台「采—存—治—用」", w=13.4, h=7.4, sub="统一数据底座支撑 KPI 测量、智能诊断、BI 可视化与 AI 应用;主数据「一处修改、全系统同步」") f.panel(3, 90, 17, 56, "采(多源采集)", tone="red") row(5, 85.5, 13, 6.0, 1, 0, ["ERP\n主数据·订单·库存"], f, tone="red", fs=8.4) row(5, 78.0, 13, 6.0, 1, 0, ["MES\n工单·工序·设备"], f, tone="red", fs=8.4) row(5, 70.5, 13, 6.0, 1, 0, ["QMS\nIQC·IPQC·FQC"], f, tone="red", fs=8.4) row(5, 63.0, 13, 6.0, 1, 0, ["SRM / WMS\n交货·出入库"], f, tone="red", fs=8.4) row(5, 55.5, 13, 6.0, 1, 0, ["CRM·TMS·OA·IoT"], f, tone="red", fs=8.4) f.note(5, 46.0, "直连 / API /\nWebService /\nFTP / MQ /\nIoT 网关", fs=8.2) f.panel(22, 90, 34, 56, "存 + 治(分层建模与治理)", tone="teal") a = f.box(24.5, 85.5, 29, 6.0, "STG 贴源层 原样落地 · 不做业务改写", tone="teal", fs=8.6) b = f.box(24.5, 76.5, 29, 6.0, "STD 标准层 字段标准化 · 编码统一 · 空值过滤 · 异常标记", tone="teal", fs=8.0) c = f.box(24.5, 67.5, 29, 6.0, "DWD 明细宽表 按订单主线主题化关联", tone="teal", fs=8.6) d = f.box(24.5, 58.5, 29, 6.0, "DWS / KPI 指标层 日批聚合 · L1–L4 分层指标", tone="teal", fs=8.4) for x, y in zip([a, b, c], [b, c, d]): f.arrow(x["b"], y["t"]) f.obox(24.5, 49.5, 14, 6.0, "MDM 主数据\n客户·供应商·物料·工艺", tone="teal", fs=8.0) f.obox(39.5, 49.5, 14, 6.0, "元数据 · 血缘\n质量稽核规则", tone="teal", fs=8.0) f.note(24.5, 40.5, "质量目标:数据准确率 ≥ 98%;主数据与单据状态同步延迟 ≤ 5 分钟(异常 ≤ 15 分钟)", fs=8.2, color="#404040") f.panel(57, 90, 40, 56, "用(数据消费)", tone="purple") u1 = f.box(59.5, 85.5, 16.5, 6.0, "九宫格智慧运营看板", tone="purple", fs=8.6) u2 = f.box(78, 85.5, 16.5, 6.0, "部门看板 / 自助下钻", tone="purple", fs=8.6) u3 = f.box(59.5, 76.5, 16.5, 6.0, "运营问题诊断", tone="purple", fs=8.6) u4 = f.box(78, 76.5, 16.5, 6.0, "改善闭环与效果验证", tone="purple", fs=8.4) u5 = f.box(59.5, 67.5, 16.5, 6.0, "ChatBI 智能报表", tone="purple", fs=8.6) u6 = f.box(78, 67.5, 16.5, 6.0, "S8 异常预警与 AI 智能体", tone="purple", fs=8.0) f.box(59.5, 58.5, 35, 6.0, "Outbox 出站回写 → ERP / MES 等业务系统", tone="orange", fs=8.6) f.note(59.5, 49.0, "KPI 示例口径:\n" "· 产销协同 OTD 交付率 = 按时交付订单数 / 总订单数 × 100%\n" "· 生产执行 OEE = 可用率 × 表现率 × 质量率 × 100%\n" "· 采购供应 供应商交付率 = 按时交付批数 / 总采购批数 × 100%\n" "· 质量   成品合格率 = 合格成品数 / 总生产数 × 100%\n" "· 库存周转 库存周转天数 = 库存数量 / 日均用量", fs=8.0, color="#404040", va="top") f.arrow((20.0, 60), (24.0, 60), lw=1.6) f.arrow((54.0, 60), (58.5, 60), lw=1.6) f.crop(30) return f.save("fig_data") # ==================================================================== 图4 def fig_tech(): f = Fig("技术架构", w=13.0, h=7.6, sub="主流开源技术栈 + 容器化部署;前后端分离、服务可水平扩展、支持信创环境适配") f.panel(3, 91, 94, 12.5, "客户端", tone="blue") row(6, 87.6, 21.5, 5.4, 4, 2.4, ["浏览器\nChrome / Edge / 国产浏览器", "移动端\n企业微信 / 钉钉 / H5", "大屏终端\n看板一体机", "开放 API 调用方"], f, tone="blue", fs=8.2) f.note(6, 80.6, "HTTPS / TLS 1.2+", fs=8.2) f.panel(3, 77.5, 94, 8.0, "接入层", tone="gray") row(6, 74.6, 21.5, 4.6, 4, 2.4, ["Nginx 反向代理 · 负载均衡", "API 网关 · 统一鉴权限流", "OAuth2.0 / JWT · SSO", "静态资源 CDN / 缓存"], f, tone="gray", fs=8.2) f.panel(3, 68.5, 94, 15.0, "应用层", tone="green") row(6, 65.2, 13.6, 5.4, 6, 2.2, ["前端\nVue 3 + TypeScript\nElement Plus · ECharts", "后端\n.NET 8 + Admin.NET\n分层架构", "ORM\nSqlSugar\n多库适配", "工作流\n审批流引擎", "任务调度\n日批 / 定时同步", "集成执行器\nDB Pull · API Push"], f, tone="green", fs=7.8) row(6, 57.4, 21.5, 4.6, 4, 2.4, ["多租户隔离", "RBAC 权限与数据权限", "操作 / 登录审计日志", "AI 能力接入(LLM)"], f, tone="green", fs=8.2) f.panel(3, 52.0, 94, 13.5, "数据层", tone="teal") row(6, 48.6, 17.4, 5.4, 5, 2.4, ["MySQL 8\n业务库", "MySQL 8\n数据中台库(MDP)", "Redis\n缓存 · 会话 · 分布式锁", "对象存储 / 文件服务\n附件·标签·报表", "SQL Server / 达梦\n源库只读适配"], f, tone="teal", fs=8.0) f.note(6, 41.6, "读写分离与索引优化;大表分区与归档;备份策略:全量日备 + 增量,异地留存", fs=8.2, color="#404040") f.panel(3, 38.5, 94, 12.0, "运行与部署", tone="orange") row(6, 35.2, 17.4, 5.4, 5, 2.4, ["Docker 容器化", "Docker Compose /\nK8s 编排", "多环境\n开发·测试·UAT·生产", "CI/CD 流水线", "灰度发布与回滚"], f, tone="orange", fs=8.0) f.note(6, 28.2, "可用性目标:全年 ≥ 99%;关键组件高可用部署;重大故障力争 48 小时内恢复", fs=8.2, color="#404040") f.panel(3, 25.0, 94, 14.5, "监控 · 安全 · 运维", tone="red") row(6, 21.6, 13.6, 5.0, 6, 2.2, ["应用与接口监控", "同步任务监控告警", "集中日志检索", "数据加密与脱敏", "漏洞扫描与补丁", "备份恢复演练"], f, tone="red", fs=8.0) f.note(6, 14.6, "性能目标:常规页面与查询 ≤ 30 秒,复杂查询 / 多图联动 ≤ 60 秒,接口成功率 ≥ 99%;" "约 1000 人在线、400 人并发;超大导出与 AI 任务按异步任务处理", fs=8.2, color="#404040") f.crop(7) return f.save("fig_tech") # ==================================================================== 图5 def fig_integration(): f = Fig("系统集成与接口架构", w=13.2, h=7.2, sub="6 种接入方式 × 定时/实时双模式;可视化配置新增一套第三方系统 ≤ 4 小时,无需大量编码") f.panel(3, 90, 21, 74, "源系统", tone="gray") names = ["ERP\n主数据·订单·库存·财务", "MES\n工单·工序·设备·报工", "QMS\n来料·过程·成品检验", "SRM / 供应商门户\n交货计划·发货单", "WMS\n出入库·库存·盘点", "CRM · TMS · OA · IoT"] srcs = [] for i, t in enumerate(names): srcs.append(f.box(5.5, 85.5 - i * 11.5, 16, 7.6, t, tone="gray", fs=7.8)) f.panel(26, 90, 30, 74, "集成通道(采集与治理)", tone="red") ways = f.box(28.5, 85.5, 25, 12.0, "接入方式(6 种)\n数据库直连 · HTTP-API · WebService\nFTP 文件 · MQ 消息 · 物联网网关", tone="red", fs=8.2) mode = f.box(28.5, 71.0, 25, 8.0, "同步模式\n定时同步(夜间批量) · 实时同步", tone="red", fs=8.4) cfg = f.box(28.5, 60.5, 25, 8.0, "可视化通道配置\n数据源 · 实体映射 · 调度策略", tone="red", fs=8.2) cln = f.box(28.5, 50.0, 25, 9.5, "清洗与标准化\n字段标准化 · 空值过滤\n异常值标记 · 编码统一", tone="red", fs=8.2) mon = f.box(28.5, 37.5, 25, 9.5, "监控与容错\n同步日志 · 异常告警\n断点续传 · 重试去重", tone="red", fs=8.2) for a, b in zip([ways, mode, cfg, cln], [mode, cfg, cln, mon]): f.arrow(a["b"], b["t"]) for s in srcs: f.arrow(s["r"], (27.6, s["r"][1]), lw=0.9) f.panel(58, 90, 18, 74, "统一数据底座", tone="teal") st = [f.box(60, 85.5, 14, 8.0, "STG 贴源", tone="teal", fs=8.8), f.box(60, 74.5, 14, 8.0, "STD 标准", tone="teal", fs=8.8), f.box(60, 63.5, 14, 8.0, "DWD 宽表", tone="teal", fs=8.8), f.box(60, 52.5, 14, 8.0, "DWS / KPI", tone="teal", fs=8.8)] for a, b in zip(st, st[1:]): f.arrow(a["b"], b["t"]) f.arrow(mon["r"], (59.2, mon["r"][1]), lw=1.4) f.box(60, 40.0, 14, 9.5, "mdp_outbox\n出站事务表", tone="orange", fs=8.4) f.panel(78, 90, 19, 74, "上层应用 / 回写", tone="purple") ups = ["九宫格看板", "部门看板与下钻", "运营问题诊断", "改善闭环", "ChatBI 智能报表", "S8 异常预警"] for i, t in enumerate(ups): f.box(80, 85.5 - i * 8.0, 15, 6.0, t, tone="purple", fs=8.4) f.arrow(st[3]["r"], (79.2, st[3]["r"][1]), lw=1.4) ob = f.box(80, 37.0, 15, 8.5, "API 推送回写\nERP / MES 回执核对", tone="orange", fs=8.2) f.arrow((74.2, 35.2), ob["l"], lw=1.4) f.note(4, 13.5, "性能与适配指标:实时同步业务数据变更推送时延 ≤ 2–5 秒;夜间批量 1000 万条明细传输 + 清洗转换 ≤ 30 分钟;" "网络中断恢复后自动断点续传,不重复入库、不丢失数据;\n" "适配主流国产及通用 ERP / MES / WMS;凭据加密托管,前端不明文展示密钥;" "外部系统超时或不可用导致的延迟不计入本平台性能指标。", fs=8.4, color="#404040", va="top") f.crop(2) return f.save("fig_integration") # ==================================================================== 图6 def fig_diagnosis(): f = Fig("智能诊断与分析架构", w=13.2, h=7.0, sub="以销售订单为主线贯通全链路;实时类问题识别 ≤ 3 分钟,周期类问题每日定时分析;支持 7 个维度根因下钻") f.panel(3, 90, 94, 15.0, "① 端到端数据链路(以销售订单为主线)", tone="blue") ch = row(5.5, 86.6, 10.6, 5.6, 8, 1.4, ["需求预测", "销售订单", "采购计划", "来料入库", "车间生产", "半成品流转", "成品入库", "发货配送"], f, tone="blue", fs=8.2) f.chain(ch) f.note(5.5, 78.6, "断点识别:任一节点缺失前序单据、状态未流转或时间倒挂,即判定为链路断点", fs=8.2, color="#404040") f.panel(3, 74.0, 46, 26.0, "② 异常识别(规则 + 模型)", tone="orange") ex = ["断点\n单据链中断", "滞后\n节点超时效", "损耗\n物料/工时异常", "供需失衡\n计划与产能错配", "库存积压\n呆滞与周转恶化", "交付延期\nOTD 未达标", "产能浪费\n设备与人效低", "物流低效\n发运与配送滞后"] for i, t in enumerate(ex): f.box(5.5 + (i % 4) * 10.6, 70.6 - (i // 4) * 8.6, 9.4, 6.6, t, tone="orange", fs=7.8) f.note(5.5, 53.0, "实时类(缺料 · 生产停滞 · 发货延迟)识别延迟 ≤ 3 分钟\n" "周期类(库存积压 · 供需失衡 · 产能利用率)每日定时执行分析", fs=8.2, color="#404040", va="top") f.panel(51, 74.0, 46, 26.0, "③ 根因溯源(7 维下钻)", tone="purple") dims = ["订单", "物料", "供应商", "产线", "仓库", "时间段", "人员"] for i, t in enumerate(dims): f.box(53.5 + (i % 4) * 10.6, 70.6 - (i // 4) * 8.6, 9.4, 6.6, t, tone="purple", fs=9.4) f.box(85.3, 62.0, 9.4, 6.6, "多维关联\n算法", tone="purple", fs=8.0) f.note(53.5, 53.0, "从指标 → 明细单据 → 责任维度逐级下钻,每条结论均可追溯到订单主线或指标编码,保留证据快照", fs=8.2, color="#404040", va="top") f.panel(3, 46.0, 94, 16.0, "④ 诊断输出与改善闭环", tone="green") out = row(5.5, 42.6, 16.6, 6.6, 5, 2.6, ["运营诊断报告\n结论·根因·证据", "改善策略建议\n可落地措施清单", "问题建档\n生成改善任务", "整改派单与跟踪\n责任人·行动项·进度", "效果量化复盘\n基线 vs 当前 KPI"], f, tone="green", fs=8.0) f.chain(out) f.note(5.5, 33.0, "闭环规则:改善单必须关联诊断问题或指标编码,保证端到端可追溯;效果验证须保留基线值、目标值与验证结论;" "复盘通过后沉淀为标准化管控规则并回写运营建模(S0)。", fs=8.2, color="#404040", va="top") f.panel(3, 26.0, 94, 12.0, "⑤ 支撑能力", tone="teal") row(5.5, 22.6, 16.6, 5.6, 5, 2.6, ["统一数据抽取\nSTG→STD→DWD", "指标计算引擎\n日批 + 触发式", "阈值与规则库\n可配置", "AI 智能体集群\n7×24 感知预警", "ChatBI\n自然语言追问"], f, tone="teal", fs=8.0) f.crop(11) return f.save("fig_diagnosis") # ==================================================================== 图7 def fig_kanban(): f = Fig("九宫格智慧运营看板与指标下钻结构", w=12.4, h=7.4, sub="管理层一屏总览 → 部门看板 → 指标下钻 → 明细证据 → 诊断改善,五级贯通") f.panel(3, 90, 45, 72, "九宫格智慧运营看板(管理层大屏)", tone="blue") grid = [("S1 产销协同", "OTD 交付率"), ("S2 制造协同", "计划达成率"), ("S3 供应协同", "物料齐套率"), ("S4 采购执行", "供应商交付率"), ("S5 物料仓储", "库存周转天数"), ("S6 生产执行", "设备 OEE"), ("S7 成品仓储", "成品合格率"), ("S8 异常监控", "异常闭环率"), ("S9 运营指标", "综合运营指数")] for i, (m, k) in enumerate(grid): f.box(5.5 + (i % 3) * 13.8, 85.5 - (i // 3) * 18.0, 12.6, 15.0, f"{m}\n\n{k}\n\n● 红 / 黄 / 绿", tone="blue", fs=8.2) f.note(5.5, 30.5, "红黄绿状态由指标阈值判定;点击任一格子进入对应部门看板或模块详情看板;\n" "顶栏统一展示异常预警摘要与待办改善任务数。", fs=8.2, color="#404040", va="top") f.panel(50, 90, 22, 72, "部门看板", tone="green") dept = [("生产部", "工单进度\n设备 OEE\n工序瓶颈分析"), ("采购部", "供应商交付排行\n物料齐套率\n逾期订单"), ("质量部", "各环节不合格率\n成品与半成品不良率")] for i, (d, k) in enumerate(dept): f.box(52.5, 85.5 - i * 19.5, 17, 16.5, f"{d}\n\n{k}", tone="green", fs=8.2) f.note(52.5, 30.5, "按角色与数据权限\n分发;空数据友好提示", fs=8.2, va="top") f.panel(74, 90, 23, 72, "指标下钻与自助分析", tone="purple") lv = [("L1", "模块级核心 KPI"), ("L2", "维度分解指标"), ("L3", "过程 / 工序级指标"), ("L4", "单据 · 批次明细")] boxes = [] for i, (l, t) in enumerate(lv): boxes.append(f.box(76.5, 85.5 - i * 11.0, 18, 8.0, f"{l} {t}", tone="purple", fs=8.6)) for a, b in zip(boxes, boxes[1:]): f.arrow(a["b"], b["t"]) f.box(76.5, 41.5, 18, 8.0, "进入运营问题诊断", tone="orange", fs=8.8) f.arrow(boxes[3]["b"], (85.5, 41.5)) f.note(76.5, 30.5, "支持按时间、产品、客户、\n供应商等条件自助筛选;\n" "示例:成品合格率 → 某工序\n不合格明细。", fs=8.2, va="top") f.crop(14) return f.save("fig_kanban") # ==================================================================== 图8 def fig_closedloop(): f = Fig("异常发现 → 诊断 → 改善 → 验证 闭环管理逻辑", w=12.6, h=6.6, sub="PDCA 闭环:任何一次异常都必须走完「发现—定位—整改—验证—固化」,未验证通过不得关闭") steps = [ ("① 发现\n异常识别与提报", "orange", "系统自动触发 / 人工提报\n实时类 ≤ 3 分钟"), ("② 定级\n分级响应", "orange", "一般 · 重要 · 紧急\n紧急异常 ≤ 1 小时响应"), ("③ 诊断\n根因溯源", "purple", "7 维下钻取证\n输出运营诊断报告"), ("④ 建档\n改善任务生成", "green", "关联指标与诊断结论\n明确目标值与期限"), ("⑤ 派单\n责任人与行动项", "green", "复用平台审批流\n进入责任人待办"), ("⑥ 执行\n过程跟踪", "green", "行动项状态更新\n进度可视、超期提醒"), ("⑦ 验证\n效果量化复盘", "blue", "基线值 vs 当前 KPI\n未达标退回继续改善"), ("⑧ 固化\n标准规则沉淀", "blue", "回写 S0 运营建模\n形成 SOP 与管控规则"), ] xs = [4, 28, 52, 76] ys = [82, 50] nodes = [] for i, (t, tone, desc) in enumerate(steps): x, y = xs[i % 4], ys[i // 4] n = f.box(x, y, 20, 13.0, t, tone=tone, fs=9.6) f.note(x + 10, y - 16.0, desc, fs=8.2, ha="center", color="#404040") nodes.append(n) for i in range(3): f.arrow(nodes[i]["r"], nodes[i + 1]["l"], lw=1.4) f.arrow(nodes[i + 4]["r"], nodes[i + 5]["l"], lw=1.4) f.arrow(nodes[3]["b"], (nodes[3]["c"][0], 62.0), style="-", lw=1.4) f.arrow((nodes[3]["c"][0], 62.0), (nodes[4]["c"][0], 62.0), style="-", lw=1.4) f.arrow((nodes[4]["c"][0], 62.0), nodes[4]["t"], lw=1.4) # 回环:沿左侧外缘回到 ①,避免与 ④→⑤ 折线共用同一列 lx = 1.6 f.arrow(nodes[7]["b"], (nodes[7]["c"][0], 26.0), style="-", lw=1.4, dashed=True) f.arrow((nodes[7]["c"][0], 26.0), (lx, 26.0), style="-", lw=1.4, dashed=True) f.arrow((lx, 26.0), (lx, 88.5), style="-", lw=1.4, dashed=True) f.arrow((lx, 88.5), (nodes[0]["c"][0], 88.5), style="-", lw=1.4, dashed=True) f.arrow((nodes[0]["c"][0], 88.5), nodes[0]["t"], lw=1.4, dashed=True) f.note(52, 23.0, "持续治理:规则固化后回到监控环节,形成螺旋上升的运营改善循环", fs=8.6, ha="center", color="#404040") f.panel(4, 18.0, 92, 13.0, "闭环刚性约束", tone="gray") f.note(6, 14.0, "· 改善单必须关联诊断问题或指标编码,端到端可追溯  · 派单复用平台审批流,不另建孤立任务系统\n" "· 效果验证须保留基线值、目标值与验证结论      · 验证未通过的改善单不得关闭,自动退回继续改善\n" "· 所有异常与改善记录留痕,支持按周期统计闭环率与平均闭环时长", fs=8.4, color="#404040", va="top") f.crop(2) return f.save("fig_closedloop") if __name__ == "__main__": print("生成技术方案配图:") fig_otd_blueprint() fig_application() fig_data() fig_tech() fig_integration() fig_diagnosis() fig_kanban() fig_closedloop() print("完成。")