| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728 |
- #!/usr/bin/env python3
- """Generate the Henan Industrial Internet manufacturing operations platform deck."""
- from __future__ import annotations
- import base64
- import re
- from io import BytesIO
- from pathlib import Path
- from PIL import Image
- from pptx import Presentation
- from pptx.dml.color import RGBColor
- from pptx.enum.dml import MSO_LINE_DASH_STYLE
- from pptx.enum.shapes import MSO_AUTO_SHAPE_TYPE, MSO_CONNECTOR
- from pptx.enum.text import MSO_ANCHOR, PP_ALIGN
- from pptx.util import Inches, Pt
- ROOT = Path(__file__).resolve().parents[1]
- SYSTEM_NAME = "河南产互联制造业数据智能运营平台"
- OUTPUT = ROOT / "doc" / f"{SYSTEM_NAME}_系统介绍.pptx"
- LOGO_SVG = ROOT / "Web" / "src" / "assets" / "logo-mini.svg"
- DASHBOARD_SHOTS = ROOT / "doc" / "plan" / "UAT留证" / "2026-08-15-S2-S7看板刷新重算统一架构" / "screenshots"
- FLOW_SHOTS = ROOT / "doc" / "plan" / "UAT留证" / "2026-08-09-S1起真人测试" / "screenshots"
- IQC_SHOTS = ROOT / "doc" / "plan" / "UAT留证" / "2026-08-11-IQC-P0取证" / "screenshots"
- SYSTEM_SHOTS = ROOT / "doc" / "ppt-assets" / "system-screenshots"
- BID_SHOTS = ROOT / "doc" / "_bid_assets"
- W = 13.333
- H = 7.5
- FONT = "Microsoft YaHei"
- NAVY = RGBColor(11, 31, 58)
- BLUE = RGBColor(35, 105, 190)
- CYAN = RGBColor(21, 151, 166)
- TEAL = RGBColor(21, 132, 119)
- AMBER = RGBColor(226, 155, 45)
- RED = RGBColor(196, 65, 79)
- GREEN = RGBColor(55, 145, 91)
- WHITE = RGBColor(255, 255, 255)
- INK = RGBColor(35, 47, 62)
- MUTED = RGBColor(98, 111, 126)
- LIGHT = RGBColor(244, 247, 250)
- PALE_BLUE = RGBColor(231, 240, 250)
- PALE_TEAL = RGBColor(230, 244, 242)
- PALE_AMBER = RGBColor(250, 241, 221)
- PALE_RED = RGBColor(250, 232, 235)
- LINE = RGBColor(213, 221, 230)
- def logo_stream() -> BytesIO | None:
- if not LOGO_SVG.exists():
- return None
- raw = LOGO_SVG.read_text(encoding="utf-8")
- match = re.search(r"base64,([^\"']+)", raw, re.S)
- if not match:
- return None
- return BytesIO(base64.b64decode(re.sub(r"\s+", "", match.group(1))))
- def add_rect(slide, x, y, w, h, fill=WHITE, line=None, radius=True):
- kind = MSO_AUTO_SHAPE_TYPE.ROUNDED_RECTANGLE if radius else MSO_AUTO_SHAPE_TYPE.RECTANGLE
- shp = slide.shapes.add_shape(kind, Inches(x), Inches(y), Inches(w), Inches(h))
- shp.fill.solid()
- shp.fill.fore_color.rgb = fill
- shp.line.color.rgb = line or fill
- return shp
- def add_text(
- slide,
- text,
- x,
- y,
- w,
- h,
- size=18,
- color=INK,
- bold=False,
- align=PP_ALIGN.LEFT,
- valign=MSO_ANCHOR.TOP,
- margin=0.04,
- ):
- box = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
- tf = box.text_frame
- tf.clear()
- tf.word_wrap = True
- tf.margin_left = Inches(margin)
- tf.margin_right = Inches(margin)
- tf.margin_top = Inches(margin)
- tf.margin_bottom = Inches(margin)
- tf.vertical_anchor = valign
- p = tf.paragraphs[0]
- p.alignment = align
- run = p.add_run()
- run.text = text
- run.font.name = FONT
- run.font.size = Pt(size)
- run.font.bold = bold
- run.font.color.rgb = color
- return box
- def add_bullets(slide, items, x, y, w, h, size=16, color=INK, spacing=8, accent=CYAN):
- box = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
- tf = box.text_frame
- tf.clear()
- tf.word_wrap = True
- tf.margin_left = Inches(0.02)
- tf.margin_right = Inches(0.02)
- tf.margin_top = Inches(0.02)
- tf.margin_bottom = Inches(0.02)
- for i, item in enumerate(items):
- p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
- p.space_after = Pt(spacing)
- p.level = 0
- p.text = f"● {item}"
- p.font.name = FONT
- p.font.size = Pt(size)
- p.font.color.rgb = color
- for run in p.runs:
- run.font.name = FONT
- run.font.size = Pt(size)
- run.font.color.rgb = color
- if p.runs:
- p.runs[0].font.color.rgb = accent
- return box
- def add_notes(slide, text):
- slide.notes_slide.notes_text_frame.text = text
- def add_brand(slide, dark=False):
- add_text(slide, SYSTEM_NAME, 0.48, 0.26, 4.7, 0.34, 11, WHITE if dark else NAVY, True)
- def add_footer(slide, page, source=None, dark=False):
- color = RGBColor(190, 202, 214) if dark else MUTED
- add_text(slide, SYSTEM_NAME, 0.48, 7.12, 4.8, 0.2, 8, color)
- if source:
- add_text(slide, source, 4.1, 7.12, 8.2, 0.2, 7, color, align=PP_ALIGN.RIGHT)
- add_text(slide, f"{page:02d}", 12.45, 7.08, 0.42, 0.25, 9, color, True, PP_ALIGN.RIGHT)
- def base_slide(prs, title, page, subtitle=None, dark=False, source=None):
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- bg = slide.background.fill
- bg.solid()
- bg.fore_color.rgb = NAVY if dark else WHITE
- add_brand(slide, dark=dark)
- add_text(slide, title, 0.48, 0.78, 12.2, 0.62, 25, WHITE if dark else NAVY, True)
- if subtitle:
- add_text(slide, subtitle, 0.5, 1.39, 12.0, 0.38, 12, RGBColor(206, 218, 231) if dark else MUTED)
- add_footer(slide, page, source=source, dark=dark)
- return slide
- def section_slide(prs, number, title, subtitle, page):
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_brand(slide, dark=True)
- add_text(slide, number, 0.58, 1.55, 2.0, 1.2, 56, CYAN, True)
- add_text(slide, title, 2.0, 1.65, 10.3, 0.9, 31, WHITE, True)
- add_rect(slide, 2.02, 2.72, 1.2, 0.06, CYAN, CYAN, False)
- add_text(slide, subtitle, 2.02, 3.05, 9.8, 1.1, 18, RGBColor(206, 218, 231))
- add_footer(slide, page, dark=True)
- return slide
- def add_pill(slide, text, x, y, w, color=CYAN, text_color=WHITE, size=11):
- add_rect(slide, x, y, w, 0.36, color, color)
- add_text(slide, text, x + 0.05, y + 0.02, w - 0.1, 0.3, size, text_color, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- def card(slide, title, body, x, y, w, h, accent=CYAN, number=None):
- add_rect(slide, x, y, w, h, LIGHT, LINE)
- if number is not None:
- add_text(slide, str(number), x + 0.18, y + 0.15, 0.5, 0.38, 18, accent, True)
- tx = x + 0.72
- tw = w - 0.9
- else:
- add_rect(slide, x + 0.18, y + 0.2, 0.07, 0.42, accent, accent, False)
- tx = x + 0.38
- tw = w - 0.58
- add_text(slide, title, tx, y + 0.13, tw, 0.48, 16, NAVY, True)
- add_text(slide, body, x + 0.22, y + 0.72, w - 0.44, h - 0.84, 11.5, MUTED)
- def flow(slide, steps, y=3.0, x0=0.65, width=12.0, colors=None, font_size=12):
- gap = 0.13
- n = len(steps)
- step_w = (width - gap * (n - 1)) / n
- for i, step in enumerate(steps):
- color = (colors or [CYAN, BLUE, TEAL, AMBER])[i % len(colors or [CYAN, BLUE, TEAL, AMBER])]
- x = x0 + i * (step_w + gap)
- add_rect(slide, x, y, step_w, 0.82, color, color)
- add_text(slide, step, x + 0.06, y + 0.08, step_w - 0.12, 0.62, font_size, WHITE, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- if i < n - 1:
- add_text(slide, "›", x + step_w - 0.02, y + 0.21, 0.18, 0.34, 18, WHITE, True, PP_ALIGN.CENTER)
- def add_image_contain(slide, path, x, y, w, h):
- add_rect(slide, x, y, w, h, LIGHT, LINE, False)
- with Image.open(path) as image:
- ratio = image.width / image.height
- box_ratio = w / h
- if ratio >= box_ratio:
- pw = w - 0.08
- ph = pw / ratio
- else:
- ph = h - 0.08
- pw = ph * ratio
- px = x + (w - pw) / 2
- py = y + (h - ph) / 2
- slide.shapes.add_picture(str(path), Inches(px), Inches(py), Inches(pw), Inches(ph))
- def screenshot_pair_slide(prs, page, title, subtitle, left, left_caption, right, right_caption, source=None):
- slide = base_slide(prs, title, page, subtitle, source=source)
- add_image_contain(slide, left, 0.62, 1.82, 6.0, 4.42)
- add_image_contain(slide, right, 6.72, 1.82, 6.0, 4.42)
- add_pill(slide, left_caption, 1.12, 6.38, 5.0, NAVY, WHITE, 11)
- add_pill(slide, right_caption, 7.22, 6.38, 5.0, CYAN, WHITE, 11)
- return slide
- def screenshot_quad_slide(prs, page, title, subtitle, items, source=None):
- """Show four real product screens on one overview slide."""
- slide = base_slide(prs, title, page, subtitle, source=source)
- positions = [(0.58, 1.72), (6.78, 1.72), (0.58, 4.18), (6.78, 4.18)]
- accents = [NAVY, BLUE, CYAN, TEAL]
- for i, ((image, caption), (x, y)) in enumerate(zip(items, positions)):
- add_image_contain(slide, image, x, y, 5.97, 1.96)
- add_pill(slide, caption, x + 0.62, y + 1.68, 4.73, accents[i], WHITE, 10.5)
- return slide
- def module_slide(prs, page, code, name, tagline, capabilities, values, example, accent):
- slide = base_slide(prs, f"{code}|{name}", page, tagline)
- add_pill(slide, "核心能力", 0.58, 1.85, 1.25, accent)
- add_pill(slide, "客户价值", 6.95, 1.85, 1.25, NAVY)
- add_rect(slide, 0.58, 2.35, 5.95, 3.65, LIGHT, LINE)
- add_bullets(slide, capabilities, 0.9, 2.7, 5.25, 2.95, 15, accent=accent)
- add_rect(slide, 6.8, 2.35, 5.95, 3.65, PALE_BLUE, LINE)
- add_bullets(slide, values, 7.12, 2.7, 5.25, 2.95, 15, accent=NAVY)
- add_rect(slide, 0.58, 6.2, 12.17, 0.62, WHITE, accent)
- add_text(slide, "销售场景", 0.82, 6.34, 1.0, 0.24, 11, accent, True)
- add_text(slide, example, 1.85, 6.28, 10.55, 0.36, 12, INK)
- add_notes(slide, f"{name}:{tagline}。销售讲解时先讲场景,再选择 2–3 个功能点展开,不需要逐项念菜单。")
- return slide
- def scenario_value_slide(prs, page, title, values, accent=TEAL):
- slide = base_slide(prs, title, page, "把功能翻译成客户能感知、能量化的业务结果")
- for i, (head, body) in enumerate(values):
- x = 0.72 + (i % 2) * 6.22
- y = 1.95 + (i // 2) * 2.15
- card(slide, head, body, x, y, 5.65, 1.72, accent, i + 1)
- return slide
- def scenario_background_slide(prs, page, title, context, traditional, roles, accent=AMBER):
- slide = base_slide(prs, title, page, "先让客户代入日常工作,再展示系统如何改变协同方式")
- add_pill(slide, "业务背景", 0.62, 1.85, 1.25, accent)
- add_rect(slide, 0.62, 2.32, 5.85, 3.7, LIGHT, LINE)
- add_bullets(slide, context, 0.92, 2.72, 5.22, 2.9, 15, accent=accent)
- add_pill(slide, "传统方式的卡点", 6.86, 1.85, 1.75, RED)
- add_rect(slide, 6.72, 2.32, 6.0, 3.7, PALE_RED, LINE)
- add_bullets(slide, traditional, 7.05, 2.72, 5.3, 2.9, 15, accent=RED)
- add_text(slide, "涉及角色", 0.72, 6.33, 0.85, 0.28, 10, MUTED, True)
- x = 1.65
- for role in roles:
- w = max(0.82, 0.22 + len(role) * 0.19)
- add_pill(slide, role, x, 6.28, w, NAVY, WHITE, 10)
- x += w + 0.12
- return slide
- def scenario_flow_slide(prs, page, title, steps, capabilities, result, accent=CYAN):
- slide = base_slide(prs, title, page, "让上一步的业务结果成为下一步的输入")
- flow(slide, steps, 2.05, 0.58, 12.2, [accent, BLUE, TEAL, AMBER], 10.5)
- add_rect(slide, 0.72, 3.45, 7.8, 2.5, LIGHT, LINE)
- add_text(slide, "平台在其中做什么", 1.02, 3.72, 3.2, 0.42, 16, NAVY, True)
- add_bullets(slide, capabilities, 1.0, 4.22, 7.08, 1.45, 13.5, accent=accent)
- add_rect(slide, 8.82, 3.45, 3.9, 2.5, PALE_TEAL, accent)
- add_text(slide, "业务结果", 9.12, 3.72, 2.2, 0.42, 16, accent, True)
- add_text(slide, result, 9.12, 4.28, 3.28, 1.25, 17, NAVY, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- return slide
- def add_metric(slide, value, label, x, y, w, accent=CYAN, note=None):
- add_rect(slide, x, y, w, 1.42, LIGHT, LINE)
- add_text(slide, value, x + 0.12, y + 0.16, w - 0.24, 0.58, 29, accent, True, PP_ALIGN.CENTER)
- add_text(slide, label, x + 0.12, y + 0.82, w - 0.24, 0.28, 11, NAVY, True, PP_ALIGN.CENTER)
- if note:
- add_text(slide, note, x + 0.12, y + 1.12, w - 0.24, 0.2, 8, MUTED, align=PP_ALIGN.CENTER)
- def screenshot_feature_slide(
- prs,
- page,
- title,
- subtitle,
- image,
- capability_title,
- capabilities,
- value_title,
- values,
- accent=CYAN,
- source=None,
- ):
- """One-page feature introduction led by a real system screenshot."""
- slide = base_slide(prs, title, page, subtitle, source=source)
- add_image_contain(slide, image, 0.55, 1.78, 7.35, 4.92)
- add_pill(slide, capability_title, 8.18, 1.82, 1.65, accent)
- add_bullets(slide, capabilities, 8.18, 2.35, 4.45, 1.62, 12.5, spacing=5, accent=accent)
- add_pill(slide, value_title, 8.18, 4.22, 1.42, NAVY)
- add_bullets(slide, values, 8.18, 4.74, 4.45, 1.58, 12.5, spacing=5, accent=NAVY)
- return slide
- def scenario_case_slide(
- prs,
- page,
- title,
- subtitle,
- image,
- problem,
- steps,
- values,
- accent=CYAN,
- source=None,
- ):
- """Combine scenario background, process, screenshot and value on one slide."""
- slide = base_slide(prs, title, page, subtitle, source=source)
- add_image_contain(slide, image, 0.55, 1.8, 7.15, 4.78)
- add_pill(slide, "业务问题", 7.98, 1.82, 1.28, RED)
- add_text(slide, problem, 7.98, 2.32, 4.55, 0.78, 12.5, INK, True)
- add_pill(slide, "平台闭环", 7.98, 3.25, 1.28, accent)
- add_bullets(slide, steps, 7.98, 3.75, 4.55, 1.32, 11.5, spacing=4, accent=accent)
- add_pill(slide, "客户价值", 7.98, 5.18, 1.28, NAVY)
- add_text(slide, " · ".join(values), 7.98, 5.68, 4.55, 0.68, 12.5, NAVY, True)
- return slide
- def build():
- prs = Presentation()
- prs.slide_width = Inches(W)
- prs.slide_height = Inches(H)
- prs.core_properties.title = f"{SYSTEM_NAME}系统业务价值介绍(销售完整版)"
- prs.core_properties.subject = "面向销售、售前与非技术客户的业务介绍"
- prs.core_properties.author = SYSTEM_NAME
- prs.core_properties.comments = f"{SYSTEM_NAME}制造运营协同与智慧改善业务介绍"
- page = 1
- # 01 Cover
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_brand(slide, dark=True)
- add_pill(slide, "销售完整版", 0.62, 1.25, 1.35, CYAN)
- add_text(slide, SYSTEM_NAME, 0.62, 2.05, 11.4, 0.85, 30, WHITE, True)
- add_text(slide, "制造运营协同与智慧改善平台", 0.62, 2.85, 10.8, 0.8, 29, WHITE, True)
- add_text(slide, "让订单、计划、供应、生产、质量与交付在同一条运营链上协同", 0.65, 3.86, 10.8, 0.55, 18, RGBColor(204, 219, 234))
- add_rect(slide, 0.65, 4.72, 5.95, 0.06, CYAN, CYAN, False)
- add_text(slide, "从发现问题,到推动问题解决", 0.65, 5.12, 7.0, 0.55, 20, CYAN, True)
- add_text(slide, "面向销售、售前与业务推广人员", 0.65, 6.28, 4.5, 0.3, 11, RGBColor(190, 202, 214))
- add_footer(slide, page, dark=True)
- add_notes(slide, f"开场不要先讲模块。先说明:{SYSTEM_NAME}解决的不是单点信息化,而是工厂跨部门运营协同和持续改善。")
- page += 1
- # 02 Pain points
- slide = base_slide(prs, "制造企业真正难的,不是“没有系统”", page, "系统很多,但业务仍然靠人把信息串起来")
- pains = [
- ("信息分散", "订单、计划、采购、仓库、生产、质量各自有数据,管理者看到的却不是同一条业务链。"),
- ("风险发现太晚", "缺料、延期、质量和设备问题往往到现场或客户催单时才被发现。"),
- ("协同依赖人工", "会议、电话、群聊和 Excel 承担跨部门协调,优先级与责任边界不清。"),
- ("看板没有闭环", "红灯能看见,但原因、责任人、行动项和改善效果没有统一跟踪。"),
- ]
- for i, (head, body) in enumerate(pains):
- card(slide, head, body, 0.7 + (i % 2) * 6.2, 1.9 + (i // 2) * 2.2, 5.75, 1.78, [BLUE, AMBER, RED, CYAN][i], i + 1)
- add_notes(slide, "这页用客户熟悉的日常问题建立共鸣。重点不是批评客户现有系统,而是指出跨系统、跨部门的运营断点。")
- page += 1
- # 03 Positioning
- slide = base_slide(prs, "平台定位", page, "在业务系统之上,建立工厂运营协同层")
- layers = [
- ("经营决策", "九宫格 · 我的工作台 · 智慧诊断 · 改善台账", NAVY, WHITE),
- ("跨部门协同", "订单 · 计划 · 供应 · 生产 · 质量 · 交付 · 异常", CYAN, WHITE),
- ("数据与系统连接", "现有业务系统 · 数据中台 · DWD/KPI", PALE_BLUE, NAVY),
- ]
- for i, (head, body, color, tc) in enumerate(layers):
- x = 1.05 + i * 0.55
- y = 1.95 + i * 1.42
- w = 11.2 - i * 1.1
- add_rect(slide, x, y, w, 1.08, color, color)
- add_text(slide, head, x + 0.25, y + 0.14, 2.0, 0.32, 15, tc, True)
- add_text(slide, body, x + 2.4, y + 0.12, w - 2.7, 0.55, 15, tc, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- add_text(slide, "不是替代所有系统,而是把现有能力组织成一条可运营、可改善的业务链", 1.15, 6.35, 11.0, 0.36, 16, NAVY, True, PP_ALIGN.CENTER)
- add_notes(slide, f"遇到客户问是否替代 ERP/MES 时:{SYSTEM_NAME}可以独立运行,也可以连接现有系统,核心价值是跨系统运营协同。")
- page += 1
- # 04 End-to-end loop
- slide = base_slide(prs, "一条完整的工厂运营闭环", page, "所有业务结果最终都能回到订单、客户与经营指标")
- flow(slide, ["运营建模", "订单评审", "工单排程", "物料齐套", "采购到货", "仓储检验", "生产执行"], 2.15, 0.48, 12.4, font_size=10.5)
- flow(slide, ["成品检验", "入库发运", "异常处置", "指标诊断", "改善审批", "行动执行", "效果验证"], 3.42, 0.48, 12.4, [TEAL, BLUE, AMBER, RED], 10.5)
- add_rect(slide, 1.35, 5.12, 10.65, 1.05, PALE_TEAL, CYAN)
- add_text(slide, "上一步的结果成为下一步的输入,现场变化能够反向影响计划和客户承诺", 1.65, 5.4, 10.05, 0.45, 17, NAVY, True, PP_ALIGN.CENTER)
- add_notes(slide, "这页是整份 PPT 的主线,后续所有模块和场景都围绕这条链展开。")
- page += 1
- # 05 S0-S9 grid
- slide = base_slide(prs, "系统功能全景:S0–S9", page, "从业务建模到经营改善,覆盖工厂运营主链")
- modules = [
- ("S0", "运营建模", "主数据 · 规则 · 指标", NAVY),
- ("S1", "产销协同", "订单 · 评审 · 交付", BLUE),
- ("S2", "制造协同", "排程 · 日计划 · 追踪", CYAN),
- ("S3", "供应协同", "需求 · 齐套 · 采购", TEAL),
- ("S4", "采购执行", "交货 · 发货 · 退货", AMBER),
- ("S5", "物料仓储", "IQC · 库存 · 领退料", BLUE),
- ("S6", "生产执行", "投产 · 报工 · IPQC", CYAN),
- ("S7", "成品仓储", "FQC · 入库 · 发运", TEAL),
- ("S8", "异常监控", "发现 · 分派 · 升级", RED),
- ("S9", "智慧运营", "看板 · 诊断 · 改善", NAVY),
- ]
- for i, (code, name, desc, color) in enumerate(modules):
- x = 0.55 + (i % 5) * 2.53
- y = 1.85 + (i // 5) * 2.35
- add_rect(slide, x, y, 2.26, 1.88, LIGHT, LINE)
- add_text(slide, code, x + 0.18, y + 0.15, 0.55, 0.4, 18, color, True)
- add_text(slide, name, x + 0.18, y + 0.62, 1.88, 0.36, 15, NAVY, True)
- add_text(slide, desc, x + 0.18, y + 1.17, 1.88, 0.44, 10, MUTED)
- add_notes(slide, "只用这页讲全景,不逐个念功能。根据客户痛点选择后续重点模块。")
- page += 1
- # 06-15 Modules
- module_slide(
- prs, page, "S0", "运营建模", "先把工厂的业务语言、标准和规则统一",
- ["客户、供应商、物料与 BOM", "工艺、工序、产线与生产日历", "库位与 IQC/IPQC/FQC 质量规则", "组织、角色与业务权限"],
- ["减少部门间口径差异", "让新产品、新产线可复制", "为计划、质量、仓储提供可信基础", "让指标计算有统一来源"],
- "新产品导入时,一次建立 BOM、工艺、产线和检验标准,后续评审、排程和质量自动复用。", NAVY,
- )
- page += 1
- module_slide(
- prs, page, "S1", "产销协同", "让销售承诺建立在可交付能力之上",
- ["产品设计、合同评审、订单评审", "订单优先级与交期评估", "工单下达、需求核验、计划联动", "订单交付跟踪与发货管理"],
- ["多部门围绕同一订单协同", "交期承诺有业务依据", "订单状态全过程可追溯", "提前识别交付风险"],
- "客户插单时,同步评估设计、物料、产能和现有订单影响,再给出可解释的交期。", BLUE,
- )
- page += 1
- module_slide(
- prs, page, "S2", "制造协同", "把订单变成真正可执行的生产计划",
- ["生产排程、排产异常、可执行日计划", "产线日历、节假日、加班和休息时间", "工单物料、工序和执行追踪", "制造协同与工单进度看板"],
- ["计划考虑产能、工序和日历", "异常有原因、有记录", "看清当前工序、在制与末道完成", "计划变化可追踪、可解释"],
- "订单优先级改变后,计划员能看到受影响工单、产线和交期,而不是只改一个日期。", CYAN,
- )
- page += 1
- module_slide(
- prs, page, "S3", "供应协同", "把缺料救火前移为供应计划",
- ["物料需求计划与交货计划", "工单物料齐套与缺料识别", "采购申请与采购订单", "库存、在途与供应交期协同"],
- ["从工单和 BOM 计算真实需求", "缺料追溯到订单、工单和供应商", "计划与采购共享优先级", "提前争取催交、替代与调序窗口"],
- "关键物料延期时,按受影响客户订单排序处理,而不是按采购员自己的表格催单。", TEAL,
- )
- page += 1
- module_slide(
- prs, page, "S4", "采购执行", "让采购从催单转向供应商交付协同",
- ["供应商交货计划与交货管理", "供应商发货、到货与部分到货", "采购收货与 IQC 衔接", "采购退货与延期跟踪"],
- ["提前发现延期与关键欠料", "供应风险向订单和计划传导", "质量退货与补货形成闭环", "采购执行状态透明可追踪"],
- "同一供应商部分到货时,系统展示剩余量、承诺日以及影响的工单和订单。", AMBER,
- )
- page += 1
- module_slide(
- prs, page, "S5", "物料仓储", "让物料数量、批次和质量状态全程可追溯",
- ["采购收货、IQC 与待检管理", "合格入库与不合格处置", "库存、批次与库位管理", "生产领料与退料"],
- ["数量、批次和质量状态统一", "仓库动作关联采购与生产需求", "避免不合格物料误入生产", "物料流向全程可追溯"],
- "来料到厂后,从收货、待检、质量判定到入库和领料,每一步都保留数量、批次和状态。", BLUE,
- )
- page += 1
- module_slide(
- prs, page, "S6", "生产执行", "把投产、报工和过程质量及时反馈给计划",
- ["生产指令与工单投产", "工序报工与执行实绩", "IPQC 过程检验", "生产异常与恢复反馈"],
- ["计划持续获取执行反馈", "生产偏差和质量问题及时暴露", "过程结果可追溯到工单与工序", "进度反向更新交付风险"],
- "某工序进度落后或发生质量异常时,计划和交付侧可以及时看到影响并协同处置。", CYAN,
- )
- page += 1
- module_slide(
- prs, page, "S7", "成品仓储", "守住成品质量与客户交付的最后关口",
- ["成品报检与 FQC 任务", "检验录入、判定与复检", "生产入库与成品库存", "销售发运与订单交付"],
- ["不合格产品受控进入交付", "成品库存与客户订单关联", "检验结果与入库数量一致", "发运状态透明可跟踪"],
- "客户催发货时,可以同时确认 FQC 结果、成品库存、发运进度和订单状态。", TEAL,
- )
- page += 1
- module_slide(
- prs, page, "S8", "异常监控", "把异常变成可管理、可追踪的业务对象",
- ["规则持续监控订单、供应、质量、生产和设备", "发现问题后自动生成异常事件", "按场景和等级向责任角色发送预警", "认领、分派、处理、验证、关闭和超时升级"],
- ["风险无需等待人工汇报", "在线实时提醒,离线登录仍可恢复", "从异常下钻到订单、工单、物料和产线", "责任、时限和处理记录全程留痕"],
- "供应延期、设备停机或质量异常出现后,系统自动建单并向配置的责任角色发送预警。", RED,
- )
- page += 1
- module_slide(
- prs, page, "S9", "智慧运营", "从看经营走向改经营",
- ["九宫格、个人工作台与模块看板", "红黄绿指标、趋势与业务下钻", "交付、供应、质量、制造智慧诊断", "改善任务、审批、效果评价与台账", "DWD/KPI 构建与五类 ChartBI 看板"],
- ["管理者看全局,责任人看自己的任务", "用业务事实解释指标变化", "问题有人负责、有人跟踪", "改善效果可验证、经验可沉淀"],
- "厂长发现交付指标转黄,沿指标下钻到缺料工单,直接形成跨部门改善计划。", NAVY,
- )
- page += 1
- # 16 cockpit
- slide = base_slide(prs, "不是一块静态大屏,而是可下钻的经营驾驶舱", page, "不同角色看到同一个问题的不同层次")
- levels = [
- ("全局", "九宫格健康度", "厂长 / 总经理", NAVY),
- ("模块", "交付、制造、供应、质量", "运营负责人", BLUE),
- ("指标", "目标、现状、趋势、偏差", "部门经理", CYAN),
- ("事实", "订单、工单、物料、检验单", "业务人员", TEAL),
- ("行动", "责任人、时限、审批、验证", "执行与改善团队", AMBER),
- ]
- for i, (level, content, role, color) in enumerate(levels):
- y = 1.85 + i * 0.93
- add_rect(slide, 0.82 + i * 0.42, y, 11.45 - i * 0.84, 0.68, color, color)
- add_text(slide, level, 1.05 + i * 0.42, y + 0.11, 1.0, 0.34, 13, WHITE, True)
- add_text(slide, content, 2.42 + i * 0.42, y + 0.1, 5.3 - i * 0.25, 0.34, 13, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, role, 9.2, y + 0.11, 2.25 - i * 0.08, 0.34, 10, WHITE, align=PP_ALIGN.RIGHT)
- add_notes(slide, "强调同一套数据对不同角色呈现不同粒度,避免管理层看明细、一线只看汇总。")
- page += 1
- # 17 cockpit + workbench
- slide = base_slide(
- prs,
- "双入口:管理者看全局,每个人办自己的事",
- page,
- "同一套业务事实,按角色提供经营驾驶舱与个人工作台",
- )
- add_rect(slide, 0.62, 1.85, 5.72, 2.32, PALE_BLUE, BLUE)
- add_pill(slide, "经营视角", 0.92, 2.1, 1.18, BLUE)
- add_text(slide, "九宫格经营驾驶舱", 0.92, 2.65, 4.9, 0.46, 20, NAVY, True)
- add_bullets(
- slide,
- ["查看全厂健康与红黄灯", "下钻模块、指标和业务事实", "适合厂长与运营管理层"],
- 0.94, 3.18, 4.95, 0.78, 11.5, spacing=3, accent=BLUE,
- )
- add_rect(slide, 6.98, 1.85, 5.72, 2.32, PALE_TEAL, TEAL)
- add_pill(slide, "个人视角", 7.28, 2.1, 1.18, TEAL)
- add_text(slide, "我的工作台", 7.28, 2.65, 4.9, 0.46, 20, NAVY, True)
- add_bullets(
- slide,
- ["聚合我的行动项、审批与 S8 任务", "统一显示未读消息和到期提醒", "适合部门长、工程师与业务人员"],
- 7.3, 3.18, 4.95, 0.78, 11.5, spacing=3, accent=TEAL,
- )
- flow(
- slide,
- ["异常 / 改善 / 审批", "持久化站内信", "在线实时提醒", "工作台同步刷新", "深链直达处理", "结果留痕"],
- 4.78, 0.62, 12.08, [RED, AMBER, CYAN, TEAL, BLUE, NAVY], 10.5,
- )
- add_text(
- slide,
- "在线时即时提醒,离线后重新登录仍能看到未读与待办;任务只进入明确责任人的工作台。",
- 1.05, 5.94, 11.2, 0.52, 13.5, NAVY, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE,
- )
- add_notes(
- slide,
- "不要把两个入口讲成两套系统。九宫格回答“工厂哪里有问题”,我的工作台回答“我现在需要做什么”。",
- )
- page += 1
- screenshot_pair_slide(
- prs, page, "实际界面|动态运营看板",
- "统一筛选、分层指标、红黄绿状态与智慧诊断入口",
- DASHBOARD_SHOTS / "S1-dashboard.png", "S1 产销协同看板",
- DASHBOARD_SHOTS / "S3-dashboard.png", "S3 供应协同看板",
- )
- page += 1
- # 17 diagnosis
- slide = base_slide(prs, "智慧诊断:用事实解释指标为什么变差", page, "不只告诉客户“红了”,还告诉客户“哪些业务对象造成了影响”")
- flow(slide, ["选择指标", "目标与现状", "识别偏差", "下钻事实", "确认根因"], 2.0, 0.72, 11.9, [NAVY, BLUE, CYAN, TEAL, AMBER], 13)
- sources = [
- ("交付", "订单 / 工单排程"),
- ("供应", "供应商交付 / 缺料"),
- ("制造", "排程 / 报工 / 在制"),
- ("质量", "IQC / FQC"),
- ("异常", "S8 事件"),
- ]
- for i, (head, body) in enumerate(sources):
- x = 0.75 + i * 2.5
- add_rect(slide, x, 3.48, 2.18, 1.42, LIGHT, LINE)
- add_text(slide, head, x + 0.12, 3.7, 1.94, 0.32, 14, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, body, x + 0.12, 4.18, 1.94, 0.36, 10, MUTED, align=PP_ALIGN.CENTER)
- add_rect(slide, 1.18, 5.48, 10.95, 0.78, PALE_AMBER, AMBER)
- add_text(slide, "每条诊断结论都可回到订单、工单、物料、检验单和异常事件进行验证。", 1.45, 5.7, 10.4, 0.34, 14, NAVY, True, PP_ALIGN.CENTER)
- add_notes(slide, "销售讲解重点:指标偏差能够关联到实际业务对象,管理人员可以沿证据链快速确认问题原因。")
- page += 1
- # 18 improvement loop
- slide = base_slide(prs, "改善闭环:从红灯到结果验证", page, "问题不是关闭在会议纪要里,而是沉淀为可审计、可评价的改善记录")
- flow(slide, ["发现偏差", "确认事实", "创建计划", "正式审批", "自动派发", "行动执行", "效果评价", "关闭归档"], 2.0, 0.55, 12.25, [RED, AMBER, BLUE, CYAN, TEAL, GREEN, NAVY], 10.5)
- features = [
- ("分级审批", "黄单、红单、跨部门使用不同审批路径。"),
- ("自动派发", "指定责任人后,自动生成任务并发送站内信。"),
- ("统一工作台", "行动项、审批、S8 任务与消息集中到个人。"),
- ("到期提醒", "临近到期、逾期和状态变化自动提醒。"),
- ("验证台账", "改善前后效果、行动和日志集中追溯。"),
- ]
- for i, (head, body) in enumerate(features):
- x = 0.62 + i * 2.52
- card(slide, head, body, x, 3.45, 2.22, 2.05, [RED, AMBER, BLUE, TEAL, NAVY][i])
- add_notes(slide, "智慧诊断与审批、任务、效果评价连接,让问题从发现、处置到验证形成完整闭环。")
- page += 1
- # 19 dual mode
- slide = base_slide(prs, "双模式:既能独立运行,也能连接现有系统", page, "客户不需要一次性替换全部系统")
- add_rect(slide, 0.68, 1.85, 5.85, 3.9, PALE_BLUE, BLUE)
- add_text(slide, "独立作业模式", 1.0, 2.12, 5.2, 0.48, 21, BLUE, True, PP_ALIGN.CENTER)
- add_bullets(slide, ["在平台内维护主数据与业务规则", "完成计划、协同、执行、异常和改善", "适合新工厂、试点场景和快速上线"], 1.12, 2.88, 4.95, 1.9, 15, accent=BLUE)
- add_rect(slide, 6.82, 1.85, 5.85, 3.9, PALE_TEAL, TEAL)
- add_text(slide, "集成协同模式", 7.14, 2.12, 5.2, 0.48, 21, TEAL, True, PP_ALIGN.CENTER)
- add_bullets(slide, ["连接客户现有业务系统", "汇聚订单、生产、采购、库存和质量数据", "通过数据中台完成标准化、对账与指标构建"], 7.26, 2.88, 4.95, 1.9, 15, accent=TEAL)
- add_rect(slide, 2.02, 6.12, 9.3, 0.58, NAVY, NAVY)
- add_text(slide, "从一个高价值场景开始,按客户现状逐步连接和扩展", 2.2, 6.25, 8.95, 0.28, 14, WHITE, True, PP_ALIGN.CENTER)
- add_notes(slide, "这页用于消除客户对替换现有系统、实施周期过长的顾虑。")
- page += 1
- # Section 2
- slide = section_slide(prs, "02", "用业务场景讲价值", "从客户每天遇到的问题出发,展示功能如何协同,而不是逐页介绍菜单。", page)
- add_notes(slide, "进入场景部分。建议根据客户痛点选择其中 1–2 个重点讲,其余快速带过。")
- page += 1
- # Scenario 1
- scenario_background_slide(
- prs, page, "场景一|客户插单,能不能承诺交期?",
- ["销售接到高优先级订单", "客户要求快速确认交期", "需要同时判断设计、物料、产能和现有订单影响"],
- ["多部门分别查表、开会、口头确认", "承诺慢,且很难说明依据", "插单影响到现场才逐步暴露"],
- ["销售", "项目经理", "计划", "采购", "生产"], BLUE,
- )
- page += 1
- scenario_flow_slide(
- prs, page, "场景一|平台如何协同",
- ["客户订单", "多维评审", "需求核验", "工单下达", "产能排程", "物料齐套", "交付跟踪"],
- ["S1 统一订单评审、优先级和交期", "S2 根据产线能力和日历形成计划", "S3 提前识别缺料,S8 监控异常", "S9 持续观察准交、周期和达成率"],
- "给出有依据的承诺\n变化影响可追踪\n风险提前预警", BLUE,
- )
- page += 1
- screenshot_pair_slide(
- prs, page, "实际界面|订单评审与工单执行追踪",
- "订单评审生成工单后,可继续追踪当前工序、末道工序与在制数量",
- FLOW_SHOTS / "S1-04c-review-with-wo.png", "订单评审与工单生成",
- FLOW_SHOTS / "S2-09-aidop-progress-dashboard.png", "工单执行进度看板",
- )
- page += 1
- scenario_value_slide(
- prs, page, "场景一|从“拍脑袋承诺”到“有依据交付”",
- [("更快承诺", "评审对象和依据集中,不再逐部门追问。"),
- ("承诺更可信", "交期同时参考物料、产能、工艺和现有负荷。"),
- ("变化可追踪", "插单影响哪些工单、物料和客户一目了然。"),
- ("交付可预警", "在客户催单之前,提前看到风险和处置窗口。")], BLUE,
- )
- page += 1
- # Scenario 2
- scenario_background_slide(
- prs, page, "场景二|关键物料延期,生产会不会停?",
- ["关键供应商只能部分到货", "两张工单争用同一种关键物料", "采购已知道延期,但计划尚未调整"],
- ["缺料到领料时才暴露", "采购、计划、仓库各有一份清单", "优先级不一致,催交与生产需求脱节"],
- ["计划", "采购", "供应商", "仓库", "销售"], AMBER,
- )
- page += 1
- scenario_flow_slide(
- prs, page, "场景二|平台如何协同",
- ["工单/BOM", "齐套检查", "缺料清单", "采购计划", "供应商交付", "IQC/库存", "排程调整"],
- ["从工单和 BOM 计算真实需求", "结合库存、在途和交货计划判断风险", "按订单影响确定催交和替代优先级", "处置结果回到交付风险和经营指标"],
- "缺料从现场前移到计划\n供应与订单优先级统一\n减少停线风险", AMBER,
- )
- page += 1
- scenario_value_slide(
- prs, page, "场景二|从“缺料救火”到“供应风险前置”",
- [("缺料前置", "在仓库无料可发之前,就在计划阶段发现缺口。"),
- ("优先级统一", "采购处理顺序与受影响客户订单挂钩。"),
- ("协同透明", "供应商、采购、计划、仓库共享同一风险清单。"),
- ("减少停线", "用催交、替代、调序争取可执行的处置窗口。")], AMBER,
- )
- page += 1
- # Scenario 3
- scenario_background_slide(
- prs, page, "场景三|质量异常如何避免重复发生?",
- ["关键来料 IQC 不合格", "物料已影响生产齐套", "过程质量偏差与成品 FQC 需要重点关注"],
- ["IQC、IPQC、FQC 各自处理", "难以关联供应商、物料、工单和订单", "关闭问题后缺少效果验证,容易重复发生"],
- ["质量", "采购", "仓库", "生产", "运营"], RED,
- )
- page += 1
- scenario_flow_slide(
- prs, page, "场景三|平台如何形成质量闭环",
- ["采购到货", "IQC", "隔离/退货", "生产/IPQC", "FQC", "S8异常", "改善验证"],
- ["S0 统一质量标准和抽样规则", "S5/S6/S7 管理来料、过程和成品质量", "S8 汇聚跨阶段异常并分派处置", "S9 关联指标、行动项和改善效果"],
- "质量问题可追溯\n库存状态受控\n整改效果可验证", RED,
- )
- page += 1
- screenshot_pair_slide(
- prs, page, "实际界面|IQC 检验与质量看板",
- "来料检验结果进入审批与关单,质量结果同步进入模块看板和智慧诊断",
- IQC_SHOTS / "20260811-2306-提交检验结果合格-IQC202608110002.png", "IQC 检验结果与审批",
- DASHBOARD_SHOTS / "S7-dashboard.png", "S7 成品仓储看板",
- )
- page += 1
- scenario_value_slide(
- prs, page, "场景三|从“处理一张不合格单”到“降低重复发生”",
- [("质量可追溯", "从批次追到供应商、物料、工单和订单。"),
- ("库存受控", "待检、不合格、合格状态清晰,避免误领误发。"),
- ("责任闭环", "整改有审批、有负责人、有时限和过程记录。"),
- ("改善可验证", "用后续质量和交付数据判断整改是否真正有效。")], RED,
- )
- page += 1
- # Scenario 4 management
- slide = base_slide(prs, "场景四|指标变红,如何通过智慧诊断找到根因?", page, "平台把“看见问题”升级为“推动问题解决”")
- add_text(slide, "传统看板", 0.8, 1.82, 5.2, 0.45, 20, RED, True, PP_ALIGN.CENTER)
- add_rect(slide, 0.72, 2.32, 5.55, 3.75, PALE_RED, RED)
- add_bullets(slide, ["指标变红", "临时组织会议", "原因和行动散落在纪要", "一段时间后无法确认是否解决"], 1.12, 2.88, 4.75, 2.45, 16, accent=RED)
- add_text(slide, "平台闭环", 7.0, 1.82, 5.2, 0.45, 20, TEAL, True, PP_ALIGN.CENTER)
- add_rect(slide, 6.82, 2.32, 5.82, 3.75, PALE_TEAL, TEAL)
- add_bullets(slide, ["九宫格发现风险", "智慧诊断定位事实", "计划审批与任务分派", "自动评价改善前后效果", "台账沉淀组织经验"], 7.22, 2.78, 5.02, 2.75, 16, accent=TEAL)
- add_text(slide, "›", 6.26, 3.72, 0.55, 0.62, 38, NAVY, True, PP_ALIGN.CENTER)
- add_notes(slide, "销售收束场景时强调:系统价值不止是可视化,而是运营闭环。")
- page += 1
- slide = base_slide(prs, "场景四|四类智慧诊断链", page, "同一个红灯,沿不同业务事实找到可验证的原因和行动")
- diagnosis_chains = [
- ("交付诊断", "准交率下降", "缺料 / 设备异常\n受影响订单与工单", "调整计划 · 催交 · 替代供应", BLUE),
- ("供应诊断", "到货及时率下降", "延期 / 部分到货\n供应商与关键物料", "供应协同 · 交货重排", AMBER),
- ("质量诊断", "IQC / FQC 合格率下降", "异常批次\n供应商、工单与订单", "隔离退货 · 复检 · 整改", RED),
- ("制造诊断", "计划达成率下降", "产线异常 / 进度落后\n工序与在制工单", "恢复生产 · 调整优先级", TEAL),
- ]
- for i, (head, metric, facts, action, color) in enumerate(diagnosis_chains):
- x = 0.7 + (i % 2) * 6.25
- y = 1.85 + (i // 2) * 2.42
- add_rect(slide, x, y, 5.68, 1.96, LIGHT, LINE)
- add_pill(slide, head, x + 0.18, y + 0.16, 1.22, color, WHITE, 10)
- add_text(slide, metric, x + 1.58, y + 0.16, 3.82, 0.34, 15, NAVY, True)
- add_text(slide, facts, x + 0.22, y + 0.7, 2.65, 0.82, 11, MUTED, align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
- add_text(slide, "›", x + 2.82, y + 0.94, 0.3, 0.36, 20, color, True, PP_ALIGN.CENTER)
- add_text(slide, action, x + 3.18, y + 0.76, 2.2, 0.62, 11.5, color, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- add_notes(slide, "四条诊断链分别对应交付、供应、质量和制造场景,所有结论都能够下钻到业务对象并形成改善行动。")
- page += 1
- # Data
- slide = base_slide(
- prs, "业务演示案例数据全景", page,
- "覆盖从订单、计划、供应、质量到异常改善的完整制造运营链路",
- )
- add_metric(slide, "3", "业务场景数据集", 0.62, 1.82, 2.25, NAVY)
- add_metric(slide, "169", "每组 KPI 指标", 3.08, 1.82, 2.25, BLUE)
- add_metric(slide, "55", "销售订单(约)", 5.54, 1.82, 2.25, CYAN)
- add_metric(slide, "238", "工单(约)", 8.0, 1.82, 2.25, TEAL)
- add_metric(slide, "55", "采购订单(约)", 10.46, 1.82, 2.25, AMBER)
- add_metric(slide, "100+", "生产报工", 0.62, 3.55, 2.25, BLUE)
- add_metric(slide, "30+", "质量检验结果", 3.08, 3.55, 2.25, TEAL)
- add_metric(slide, "约 40", "S8 异常", 5.54, 3.55, 2.25, RED)
- add_metric(slide, "4", "智慧诊断链", 8.0, 3.55, 2.25, NAVY)
- add_metric(slide, "5", "ChartBI 主题", 10.46, 3.55, 2.25, CYAN)
- add_rect(slide, 0.78, 5.53, 11.8, 0.9, PALE_TEAL, TEAL)
- add_text(slide, "订单交付 · 物料供应 · 生产执行 · 质量管理 · 异常改善", 1.05, 5.82, 11.25, 0.34, 14, NAVY, True, PP_ALIGN.CENTER)
- add_notes(slide, "本页用于说明演示案例覆盖的业务对象和场景复杂度。")
- page += 1
- # Roles
- slide = base_slide(prs, "谁会使用本平台", page, "不同角色围绕同一条业务链协同")
- roles = [
- ("总经理 / 厂长", "经营健康、交付风险、改善结果", NAVY),
- ("运营负责人", "跨模块指标、异常和改善台账", BLUE),
- ("销售 / 项目", "订单评审、交期、交付跟踪", CYAN),
- ("计划 / 采购", "排程、齐套、供应商交付", TEAL),
- ("仓库 / 生产", "收发存、报工、执行进度", AMBER),
- ("质量 / 设备", "IQC/IPQC/FQC、设备异常", RED),
- ]
- for i, (role, focus, color) in enumerate(roles):
- x = 0.72 + (i % 3) * 4.18
- y = 1.85 + (i // 3) * 2.35
- add_rect(slide, x, y, 3.72, 1.85, LIGHT, LINE)
- add_rect(slide, x + 0.22, y + 0.2, 0.62, 0.62, color, color)
- add_text(slide, str(i + 1), x + 0.22, y + 0.28, 0.62, 0.3, 15, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, role, x + 1.02, y + 0.18, 2.4, 0.38, 16, NAVY, True)
- add_text(slide, focus, x + 0.25, y + 1.02, 3.18, 0.5, 11, MUTED, align=PP_ALIGN.CENTER)
- add_rect(slide, 2.25, 6.05, 8.83, 0.6, NAVY, NAVY)
- add_text(slide, "同一套数据 · 不同视角 · 统一责任 · 协同处置", 2.5, 6.18, 8.35, 0.28, 14, WHITE, True, PP_ALIGN.CENTER)
- page += 1
- scenario_flow_slide(
- prs, page, "角色场景|厂长:每天先看全局,再抓最关键问题",
- ["九宫格总览", "发现红黄灯", "智慧诊断", "跨部门行动", "查看改善结果"],
- ["查看全厂经营健康和交付风险", "下钻受影响订单、工单和关键事实", "推动责任部门协同并查看改善前后趋势"],
- "少听汇报\n快速抓重点\n基于事实决策", NAVY,
- )
- page += 1
- scenario_flow_slide(
- prs, page, "角色场景|部门长:把预警转成责任明确的行动",
- ["模块看板", "指标偏差", "业务事实", "S8预警", "分派责任", "跟踪结果"],
- ["查看本部门目标、现状和趋势", "接收S8预警并确认责任对象", "明确责任人和时限,跟踪处理、验证与超时"],
- "统一部门重点\n过程透明可控\n问题按时闭环", BLUE,
- )
- page += 1
- scenario_flow_slide(
- prs, page, "角色场景|工程师:收到任务后快速定位并处理",
- ["实时提醒", "打开工作台", "深链到任务", "核对业务事实", "执行改善措施", "反馈处理证据", "验证效果"],
- ["工作台聚合行动项、审批、S8 任务和未读消息", "通知包含计划号、截止日期和详情入口", "临近到期、逾期和状态变化继续自动提醒"],
- "减少查数时间\n明确任务期限\n处理经验可追溯", TEAL,
- )
- page += 1
- # Value
- slide = base_slide(prs, "客户最终获得的,不是“更多报表”", page, "五类能够持续积累的制造运营能力")
- vals = [
- ("01", "交付更可预测", "订单、物料、产能和执行联动", BLUE),
- ("02", "库存更可控", "按真实需求组织采购、收货和领退料", TEAL),
- ("03", "质量更可追溯", "来料、过程、成品和供应商闭环", RED),
- ("04", "异常响应更快", "自动发现、责任分派、超时升级", AMBER),
- ("05", "管理持续改善", "指标、事实、行动和效果统一沉淀", NAVY),
- ]
- for i, (num, head, body, color) in enumerate(vals):
- x = 0.7 + i * 2.5
- add_rect(slide, x, 1.95, 2.2, 3.9, LIGHT, LINE)
- add_text(slide, num, x + 0.18, 2.15, 1.84, 0.55, 26, color, True, PP_ALIGN.CENTER)
- add_rect(slide, x + 0.55, 2.88, 1.1, 0.07, color, color, False)
- add_text(slide, head, x + 0.18, 3.25, 1.84, 0.7, 16, NAVY, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- add_text(slide, body, x + 0.25, 4.35, 1.7, 0.9, 11, MUTED, align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
- add_notes(slide, "如果客户要求 ROI,下一步应使用客户自己的基线数据,为这五类价值分别设定量化指标。")
- page += 1
- # Fit
- slide = base_slide(prs, "什么样的客户最适合本平台", page, "从高频运营痛点切入,比从模块清单切入更容易形成共识")
- fits = [
- ("业务复杂", "多品种、小批量、订单变化频繁"),
- ("系统分散", "已有 ERP/MES/WMS,但跨系统仍靠 Excel"),
- ("痛点明确", "交付、缺料、质量、在制透明度不足"),
- ("希望渐进", "先场景试点,再扩展到全工厂"),
- ("组织扩张", "多工厂、多组织,需要统一口径与隔离"),
- ("重视改善", "不满足于看板,希望形成行动闭环"),
- ]
- for i, (head, body) in enumerate(fits):
- x = 0.7 + (i % 3) * 4.18
- y = 1.85 + (i // 3) * 2.25
- card(slide, head, body, x, y, 3.72, 1.72, [NAVY, BLUE, CYAN, TEAL, AMBER, RED][i], i + 1)
- page += 1
- # Sales questions
- slide = base_slide(prs, "建议的销售切入方式", page, "不要先问“客户要哪些模块”,先问四个业务问题")
- questions = [
- "哪类订单最容易延期?通常到哪个环节才发现?",
- "缺料清单由谁维护?计划、采购和仓库是否一致?",
- "质量异常关闭后,如何确认没有再次发生?",
- "管理看板上的红灯,能否追到单据、责任人和行动?",
- ]
- for i, q in enumerate(questions):
- y = 1.8 + i * 1.05
- add_rect(slide, 0.8, y, 8.1, 0.78, LIGHT, LINE)
- add_text(slide, f"{i + 1}", 1.02, y + 0.17, 0.46, 0.32, 16, CYAN, True, PP_ALIGN.CENTER)
- add_text(slide, q, 1.62, y + 0.12, 6.92, 0.42, 15, NAVY, True)
- add_rect(slide, 9.28, 1.8, 3.42, 3.95, PALE_TEAL, TEAL)
- add_text(slide, "销售策略", 9.58, 2.12, 2.82, 0.45, 20, TEAL, True, PP_ALIGN.CENTER)
- add_bullets(slide, ["找到可量化的高价值场景", "用客户自己的业务对象演示", "先做闭环,再扩展模块", "把价值指标写进试点目标"], 9.63, 2.92, 2.72, 2.1, 13, accent=TEAL)
- add_notes(slide, "销售人员可以直接使用这四个问题做首次访谈。答案会自然指向交付、缺料、质量或异常改善场景。")
- page += 1
- # Implementation
- slide = base_slide(prs, "典型落地路径", page, "从一个高价值场景开始,逐步建立可复制的制造运营能力")
- stages = [
- ("1", "业务诊断", "确认痛点、角色、指标", NAVY),
- ("2", "运营建模", "统一主数据、规则和口径", BLUE),
- ("3", "场景试点", "打通一条端到端闭环", CYAN),
- ("4", "系统连接", "按需连接现有系统", TEAL),
- ("5", "运营推广", "扩展模块、看板和异常", AMBER),
- ("6", "持续优化", "用评价和台账积累经验", RED),
- ]
- for i, (num, head, body, color) in enumerate(stages):
- x = 0.62 + i * 2.08
- add_rect(slide, x, 2.05, 1.78, 3.58, LIGHT, LINE)
- add_rect(slide, x + 0.5, 2.32, 0.78, 0.78, color, color)
- add_text(slide, num, x + 0.5, 2.5, 0.78, 0.3, 17, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, head, x + 0.15, 3.38, 1.48, 0.5, 15, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, body, x + 0.18, 4.28, 1.42, 0.75, 10.5, MUTED, align=PP_ALIGN.CENTER)
- if i < len(stages) - 1:
- add_text(slide, "›", x + 1.77, 3.43, 0.28, 0.4, 20, color, True, PP_ALIGN.CENTER)
- add_rect(slide, 1.28, 6.05, 10.75, 0.62, NAVY, NAVY)
- add_text(slide, "试点不是“先上一套系统”,而是先证明一个场景能产生业务结果", 1.55, 6.18, 10.2, 0.3, 14, WHITE, True, PP_ALIGN.CENTER)
- page += 1
- # Demo route
- slide = base_slide(prs, "推荐现场演示路线", page, "控制在 20–30 分钟,围绕一个问题完成一次完整下钻")
- route = [
- ("01", "九宫格", "看整体健康"),
- ("02", "模块看板", "选黄/红指标"),
- ("03", "智慧诊断", "看目标与事实"),
- ("04", "改善计划", "明确责任时限"),
- ("05", "我的工作台", "看个人待办"),
- ("06", "通知深链", "直达业务处理"),
- ("07", "效果台账", "看结果与留痕"),
- ]
- for i, (num, head, body) in enumerate(route):
- x = 0.46 + i * 1.82
- add_rect(slide, x, 2.1, 1.54, 3.65, [PALE_BLUE, PALE_BLUE, PALE_TEAL, LIGHT, PALE_AMBER, PALE_TEAL, PALE_BLUE][i], LINE)
- add_text(slide, num, x + 0.14, 2.35, 1.26, 0.42, 17, [NAVY, BLUE, CYAN, TEAL, AMBER, GREEN, NAVY][i], True, PP_ALIGN.CENTER)
- add_text(slide, head, x + 0.1, 3.18, 1.34, 0.6, 13.5, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, body, x + 0.12, 4.28, 1.3, 0.62, 10, MUTED, align=PP_ALIGN.CENTER)
- if i < len(route) - 1:
- add_text(slide, "›", x + 1.53, 3.55, 0.28, 0.42, 22, CYAN, True, PP_ALIGN.CENTER)
- add_notes(slide, "演示时不要在菜单里漫游。始终围绕一个业务问题,从总览到事实再到行动闭环。")
- page += 1
- # Closing
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_brand(slide, dark=True)
- add_text(slide, "让工厂从“事后解释”", 0.78, 1.55, 11.8, 0.65, 30, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, "走向“事前预警 · 协同处置 · 持续改善”", 0.78, 2.42, 11.8, 0.72, 30, CYAN, True, PP_ALIGN.CENTER)
- add_rect(slide, 3.25, 3.58, 6.85, 0.07, CYAN, CYAN, False)
- add_text(slide, "从一个高价值场景开始", 2.0, 4.12, 9.35, 0.52, 20, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, "建立可复制的制造运营能力", 2.0, 4.76, 9.35, 0.52, 20, WHITE, True, PP_ALIGN.CENTER)
- add_pill(slide, "河南产互联", 5.25, 5.9, 2.83, CYAN, WHITE, 17)
- add_footer(slide, page, dark=True)
- add_notes(slide, "结束时回到客户场景:建议下一步选择一条真实订单或一个高频痛点,安排业务诊断与场景演示。")
- OUTPUT.parent.mkdir(parents=True, exist_ok=True)
- prs.save(OUTPUT)
- print(OUTPUT)
- print(f"slides={len(prs.slides)}")
- def build_compact():
- """Generate the compact, screenshot-led sales presentation."""
- prs = Presentation()
- prs.slide_width = Inches(W)
- prs.slide_height = Inches(H)
- prs.core_properties.title = f"{SYSTEM_NAME}系统介绍"
- prs.core_properties.subject = "面向销售、售前与制造企业管理者的业务价值介绍"
- prs.core_properties.author = SYSTEM_NAME
- prs.core_properties.comments = "真实系统截图、业务场景与制造运营闭环介绍"
- page = 1
- # 01 Cover
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_pill(slide, "系统介绍", 0.68, 1.72, 1.25, CYAN)
- add_text(slide, SYSTEM_NAME, 0.68, 2.35, 11.9, 1.08, 31, WHITE, True)
- add_text(slide, "连接数据、业务与责任,让制造运营从看见问题走向闭环改善", 0.72, 3.62, 11.3, 0.62, 19, RGBColor(204, 219, 234))
- add_rect(slide, 0.72, 4.55, 6.4, 0.06, CYAN, CYAN, False)
- add_text(slide, "订单协同 · 计划执行 · 供应保障 · 质量追溯 · 异常处置 · 智慧运营", 0.72, 4.92, 11.6, 0.5, 16, CYAN, True)
- add_text(slide, "销售 / 售前 / 客户业务交流版", 0.72, 6.25, 4.8, 0.3, 11, RGBColor(190, 202, 214))
- add_footer(slide, page, dark=True)
- add_notes(slide, "开场先讲制造企业跨系统、跨部门的运营断点,再说明平台如何把问题、责任和结果串成闭环。")
- page += 1
- # 02 Pain + positioning
- slide = base_slide(prs, "为什么需要制造业数据智能运营平台", page, "企业并不缺系统,缺的是跨系统、跨部门的统一运营闭环")
- pains = [
- ("数据分散", "订单、计划、供应、仓储、生产和质量口径不一致。", BLUE),
- ("风险滞后", "缺料、延期、质量与设备问题到现场才暴露。", AMBER),
- ("协同靠人", "会议、群聊和 Excel 承担责任分派与进度跟踪。", RED),
- ("看板不闭环", "红灯能看见,但根因、任务和改善效果无法持续追踪。", TEAL),
- ]
- for i, (head, body, color) in enumerate(pains):
- card(slide, head, body, 0.55 + i * 3.15, 1.72, 2.85, 1.52, color, i + 1)
- layers = [
- ("经营决策层", "九宫格 · 我的工作台 · 智慧诊断 · 改善台账", NAVY, WHITE),
- ("业务协同层", "订单 · 计划 · 供应 · 生产 · 质量 · 仓储 · 异常", CYAN, WHITE),
- ("数据连接层", "现有 ERP / MES / WMS · 数据中台 · DWD / KPI", PALE_BLUE, NAVY),
- ]
- for i, (head, body, color, tc) in enumerate(layers):
- x = 0.92 + i * 0.45
- y = 3.62 + i * 0.88
- w = 11.5 - i * 0.9
- add_rect(slide, x, y, w, 0.68, color, color)
- add_text(slide, head, x + 0.2, y + 0.1, 1.62, 0.35, 12, tc, True)
- add_text(slide, body, x + 1.92, y + 0.09, w - 2.15, 0.38, 12.5, tc, True, PP_ALIGN.CENTER)
- add_notes(slide, "定位不是替代全部业务系统,而是在其上建立统一的制造运营协同层。")
- page += 1
- # 03 End-to-end loop
- slide = base_slide(prs, "一条完整的制造运营闭环", page, "上一步的结果成为下一步的输入,现场变化反向影响计划与客户承诺")
- flow(slide, ["运营建模", "订单评审", "工单排程", "物料齐套", "采购到货", "仓储检验", "生产执行"], 1.9, 0.48, 12.4, font_size=10.5)
- flow(slide, ["成品检验", "入库发运", "异常处置", "指标诊断", "改善审批", "行动执行", "效果验证"], 3.12, 0.48, 12.4, [TEAL, BLUE, AMBER, RED], 10.5)
- add_rect(slide, 0.85, 4.62, 11.65, 1.52, PALE_TEAL, CYAN)
- add_text(slide, "业务结果", 1.1, 4.92, 1.3, 0.38, 15, TEAL, True)
- add_text(slide, "订单交期更可信 · 缺料风险更前置 · 生产执行更透明 · 质量问题更可追溯", 2.25, 4.86, 9.8, 0.48, 15, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, "管理结果", 1.1, 5.56, 1.3, 0.38, 15, TEAL, True)
- add_text(slide, "异常有人接 · 任务有人办 · 到期有人催 · 改善结果有人验证", 2.25, 5.5, 9.8, 0.48, 15, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 04 Module map
- slide = base_slide(prs, "系统功能全景:S0–S9", page, "从业务建模到经营改善,覆盖制造运营主链")
- modules = [
- ("S0", "运营建模", "主数据 · 规则 · 指标", NAVY),
- ("S1", "产销协同", "订单 · 评审 · 交付", BLUE),
- ("S2", "制造协同", "排程 · 日计划 · 追踪", CYAN),
- ("S3", "供应协同", "需求 · 齐套 · 采购", TEAL),
- ("S4", "采购执行", "交货 · 到货 · 退货", AMBER),
- ("S5", "物料仓储", "IQC · 库存 · 领退料", BLUE),
- ("S6", "生产执行", "投产 · 报工 · IPQC", CYAN),
- ("S7", "成品仓储", "FQC · 入库 · 发运", TEAL),
- ("S8", "异常监控", "发现 · 分派 · 升级", RED),
- ("S9", "智慧运营", "看板 · 诊断 · 改善", NAVY),
- ]
- for i, (code, name, desc, color) in enumerate(modules):
- x = 0.55 + (i % 5) * 2.53
- y = 1.75 + (i // 5) * 2.35
- add_rect(slide, x, y, 2.26, 1.88, LIGHT, LINE)
- add_text(slide, code, x + 0.18, y + 0.15, 0.55, 0.4, 18, color, True)
- add_text(slide, name, x + 0.18, y + 0.62, 1.88, 0.36, 15, NAVY, True)
- add_text(slide, desc, x + 0.18, y + 1.17, 1.88, 0.44, 10, MUTED)
- add_rect(slide, 1.15, 6.32, 11.05, 0.42, NAVY, NAVY)
- add_text(slide, "按客户痛点组合能力,不要求一次性上线全部模块", 1.35, 6.38, 10.65, 0.24, 12, WHITE, True, PP_ALIGN.CENTER)
- page += 1
- # 05 Foundation
- slide = base_slide(prs, "S0|先统一业务语言,再让系统协同", page, "主数据、业务规则、组织权限与指标口径是后续自动化的共同基础")
- foundation = [
- ("业务对象", "客户、供应商、物料、BOM、订单、工单", BLUE),
- ("制造资源", "工艺、工序、产线、设备、日历与班次", CYAN),
- ("质量标准", "IQC / IPQC / FQC 规则、抽样与判定", TEAL),
- ("运营规则", "优先级、预警、审批、KPI 与责任角色", AMBER),
- ]
- for i, (head, body, color) in enumerate(foundation):
- x = 0.72 + (i % 2) * 6.18
- y = 1.82 + (i // 2) * 2.1
- card(slide, head, body, x, y, 5.68, 1.66, color, i + 1)
- add_rect(slide, 1.18, 6.18, 10.95, 0.55, PALE_BLUE, BLUE)
- add_text(slide, "一次建模,多模块复用:减少口径争议,让计划、质量、仓储和指标计算使用同一份可信基础", 1.42, 6.29, 10.45, 0.28, 12.5, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 06 S1-S2
- screenshot_feature_slide(
- prs, page, "S1–S2|从客户订单到可执行生产计划",
- "订单评审不是单独审批,而是同时评估交期、物料、产能与执行影响",
- FLOW_SHOTS / "S1-04c-review-with-wo.png",
- "系统能力",
- ["订单评审、优先级与交期评估", "评审后生成工单并联动需求", "结合产线日历形成可执行排程"],
- "客户价值",
- ["交期承诺有业务依据", "插单影响可追踪、可解释", "订单到工单全过程贯通"],
- BLUE, "系统 UAT 实测界面",
- )
- page += 1
- # 07 S2-S3
- screenshot_feature_slide(
- prs, page, "S2–S3|计划、齐套与供应风险协同",
- "把生产排程和物料保障放在同一条业务链上,提前识别停线风险",
- DASHBOARD_SHOTS / "S3-dashboard.png",
- "系统能力",
- ["工单排程与执行进度追踪", "按 BOM、库存和在途计算齐套", "缺料下钻到订单、工单与供应商"],
- "客户价值",
- ["缺料从现场前移到计划阶段", "采购与计划共享同一优先级", "争取催交、替代与调序窗口"],
- TEAL, "系统 UAT 实测界面",
- )
- page += 1
- # 08 S4-S5
- screenshot_feature_slide(
- prs, page, "S4–S5|采购到货、IQC 与库存状态贯通",
- "从供应商交付到来料检验、入库和领料,每一步保留数量、批次与质量状态",
- IQC_SHOTS / "20260811-2306-提交检验结果合格-IQC202608110002.png",
- "系统能力",
- ["采购交货、部分到货与延期跟踪", "IQC 检验、判定、复检与审批", "库存、批次、库位及生产领退料"],
- "客户价值",
- ["避免不合格物料误入生产", "质量退货与补货形成闭环", "库存流向可追溯到业务来源"],
- AMBER, "系统 UAT 实测界面",
- )
- page += 1
- # 09 S6-S7
- screenshot_feature_slide(
- prs, page, "S6–S7|生产执行、成品质量与交付反馈",
- "投产、报工、过程检验、成品检验和发运结果持续反馈给计划与交付",
- DASHBOARD_SHOTS / "S6-dashboard.png",
- "系统能力",
- ["工序报工、在制与末道完成跟踪", "IPQC / FQC 质量判定与复检", "成品入库、库存和销售发运"],
- "客户价值",
- ["执行偏差及时暴露", "进度反向更新交付风险", "客户催单时能回答当前真实状态"],
- CYAN, "系统 UAT 实测界面",
- )
- page += 1
- # 10 S8-S9
- screenshot_feature_slide(
- prs, page, "S8–S9|从经营红灯到责任明确的改善行动",
- "看板、异常监控、智慧诊断、个人任务和改善台账形成完整管理闭环",
- DASHBOARD_SHOTS / "S9-dashboard.png",
- "系统能力",
- ["规则监控并自动生成异常事件", "九宫格、模块看板与事实下钻", "诊断后创建计划、审批与行动项"],
- "客户价值",
- ["风险无需等待人工汇报", "责任、时限和处理过程全程留痕", "改善前后效果可验证、可沉淀"],
- RED, "系统 UAT 实测界面",
- )
- page += 1
- # 11 Dual entry
- slide = base_slide(prs, "双入口:管理者看全局,每个人办自己的事", page, "同一套业务事实,按角色提供经营驾驶舱与个人工作台")
- add_rect(slide, 0.62, 1.78, 5.72, 2.25, PALE_BLUE, BLUE)
- add_pill(slide, "经营视角", 0.92, 2.03, 1.18, BLUE)
- add_text(slide, "九宫格经营驾驶舱", 0.92, 2.58, 4.9, 0.46, 20, NAVY, True)
- add_bullets(slide, ["查看全厂健康与红黄灯", "下钻模块、指标和业务事实", "面向厂长与运营管理层"], 0.94, 3.08, 4.95, 0.72, 11.5, spacing=3, accent=BLUE)
- add_rect(slide, 6.98, 1.78, 5.72, 2.25, PALE_TEAL, TEAL)
- add_pill(slide, "个人视角", 7.28, 2.03, 1.18, TEAL)
- add_text(slide, "我的工作台", 7.28, 2.58, 4.9, 0.46, 20, NAVY, True)
- add_bullets(slide, ["聚合行动项、审批与 S8 任务", "显示未读消息和到期提醒", "面向部门长、工程师与业务人员"], 7.3, 3.08, 4.95, 0.72, 11.5, spacing=3, accent=TEAL)
- flow(slide, ["异常 / 改善 / 审批", "持久化站内信", "在线实时提醒", "工作台刷新", "深链处理", "结果留痕"], 4.52, 0.62, 12.08, [RED, AMBER, CYAN, TEAL, BLUE, NAVY], 10.5)
- add_text(slide, "在线即时提醒,离线后重新登录仍能看到未读和待办;任务只进入明确责任人的工作台。", 1.05, 5.68, 11.2, 0.56, 13.5, NAVY, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- page += 1
- # 12 Dashboard screenshots
- screenshot_pair_slide(
- prs, page, "实际界面|动态运营看板",
- "统一筛选、分层指标、红黄绿状态和业务下钻,让管理层与业务人员看到同一事实",
- DASHBOARD_SHOTS / "S1-dashboard.png", "S1 产销协同看板",
- DASHBOARD_SHOTS / "S3-dashboard.png", "S3 供应协同看板",
- "系统 UAT 实测界面",
- )
- page += 1
- # 13 Diagnosis + improvement
- slide = base_slide(prs, "智慧诊断与改善闭环", page, "不只告诉管理者“红了”,还要说明原因、责任和改善结果")
- flow(slide, ["发现偏差", "下钻事实", "确认根因", "创建计划", "正式审批", "自动派发", "执行反馈", "效果评价"], 1.82, 0.5, 12.35, [RED, AMBER, BLUE, CYAN, TEAL, GREEN, NAVY], 10)
- loop_cards = [
- ("事实可验证", "诊断结论回到订单、工单、物料、检验单和异常事件。", BLUE),
- ("责任可落实", "行动项明确系统用户、截止日期,并进入个人工作台。", TEAL),
- ("过程可提醒", "在线实时通知,离线保留未读,到期与逾期持续提醒。", AMBER),
- ("结果可评价", "改善前后指标、执行证据、审批和日志统一沉淀。", NAVY),
- ]
- for i, (head, body, color) in enumerate(loop_cards):
- x = 0.72 + (i % 2) * 6.18
- y = 3.22 + (i // 2) * 1.62
- card(slide, head, body, x, y, 5.68, 1.26, color, i + 1)
- page += 1
- # 14 Integration mode
- slide = base_slide(prs, "既能独立运行,也能连接现有系统", page, "从一个高价值场景开始,按客户现状逐步连接和扩展")
- add_rect(slide, 0.68, 1.82, 5.85, 3.72, PALE_BLUE, BLUE)
- add_text(slide, "独立作业模式", 1.0, 2.08, 5.2, 0.48, 21, BLUE, True, PP_ALIGN.CENTER)
- add_bullets(slide, ["在平台内维护主数据与业务规则", "完成计划、协同、执行、异常和改善", "适合新工厂、试点场景和快速上线"], 1.12, 2.82, 4.95, 1.88, 15, accent=BLUE)
- add_rect(slide, 6.82, 1.82, 5.85, 3.72, PALE_TEAL, TEAL)
- add_text(slide, "集成协同模式", 7.14, 2.08, 5.2, 0.48, 21, TEAL, True, PP_ALIGN.CENTER)
- add_bullets(slide, ["连接客户现有 ERP / MES / WMS", "汇聚订单、生产、采购、库存和质量数据", "通过数据中台标准化、对账并构建指标"], 7.26, 2.82, 4.95, 1.88, 15, accent=TEAL)
- add_rect(slide, 1.72, 5.98, 9.9, 0.65, NAVY, NAVY)
- add_text(slide, "不要求一次性替换全部系统,优先证明一个场景能够产生业务结果", 1.95, 6.13, 9.45, 0.3, 14, WHITE, True, PP_ALIGN.CENTER)
- page += 1
- # 15 Order scenario
- scenario_case_slide(
- prs, page, "场景一|客户插单,能不能承诺交期?",
- "一页看清业务背景、平台处理过程、真实界面和客户价值",
- FLOW_SHOTS / "S1-04c-review-with-wo.png",
- "高优先级订单要求快速确认交期,但设计、物料、产能和现有订单影响分散在不同部门。",
- ["统一订单评审、优先级与交期依据", "生成工单并联动需求、排程和齐套", "持续跟踪执行进度与交付风险"],
- ["承诺更快", "依据更可信", "变化可追踪", "风险可预警"],
- BLUE, "系统 UAT 实测界面",
- )
- page += 1
- # 16 Material scenario
- scenario_case_slide(
- prs, page, "场景二|关键物料延期,生产会不会停?",
- "把缺料救火前移为供应风险协同",
- DASHBOARD_SHOTS / "S3-dashboard.png",
- "关键供应商部分到货,多张工单争用同一物料,采购知道延期但计划尚未调整。",
- ["按工单和 BOM 计算真实需求", "结合库存、在途和交货计划识别缺口", "按受影响订单确定催交、替代和调序优先级"],
- ["缺料前置", "优先级统一", "协同透明", "减少停线"],
- AMBER, "系统 UAT 实测界面",
- )
- page += 1
- # 17 Quality scenario
- scenario_case_slide(
- prs, page, "场景三|质量异常如何避免重复发生?",
- "来料、过程、成品质量与异常改善形成同一条证据链",
- IQC_SHOTS / "20260811-2306-提交检验结果合格-IQC202608110002.png",
- "关键来料 IQC 不合格并影响生产齐套,后续 IPQC、FQC 也需要持续关注。",
- ["统一检验规则、批次和质量状态", "异常关联供应商、物料、工单与订单", "整改进入审批、责任分派和效果验证"],
- ["质量可追溯", "库存受控", "责任闭环", "改善可验证"],
- RED, "系统 UAT 实测界面",
- )
- page += 1
- # 18 Management scenario
- scenario_case_slide(
- prs, page, "场景四|指标变红,如何找到根因并推动解决?",
- "从经营驾驶舱下钻到业务事实,再把事实转成责任明确的改善行动",
- DASHBOARD_SHOTS / "S1-dashboard.png",
- "传统看板只能显示红灯,原因和行动散落在会议纪要,过一段时间无法确认是否真正解决。",
- ["九宫格发现风险,模块看板定位指标", "智慧诊断关联订单、工单、物料和异常", "形成改善计划、个人任务、提醒和效果评价"],
- ["少听汇报", "快速抓重点", "基于事实决策", "经验可沉淀"],
- TEAL, "系统 UAT 实测界面",
- )
- page += 1
- # 19 Demo data + users
- slide = base_slide(prs, "业务演示数据与使用角色", page, "演示覆盖真实业务对象,不是只有静态看板")
- metrics = [("3", "业务场景数据集"), ("169", "每组 KPI"), ("55", "销售订单"), ("238", "工单"), ("约 40", "S8 异常")]
- for i, (value, label) in enumerate(metrics):
- add_metric(slide, value, label, 0.55 + i * 2.53, 1.72, 2.25, [NAVY, BLUE, CYAN, TEAL, RED][i])
- roles = [
- ("厂长 / 运营", "经营健康、风险和改善结果"),
- ("销售 / 计划", "订单评审、交期和排程"),
- ("采购 / 仓库", "齐套、交付、收发存"),
- ("生产 / 质量", "报工、检验和异常处置"),
- ]
- for i, (role, focus) in enumerate(roles):
- x = 0.72 + i * 3.12
- card(slide, role, focus, x, 3.72, 2.82, 1.7, [NAVY, BLUE, AMBER, RED][i], i + 1)
- add_rect(slide, 1.48, 5.92, 10.38, 0.62, PALE_TEAL, TEAL)
- add_text(slide, "同一套数据 · 不同角色视角 · 统一责任 · 协同处置", 1.72, 6.07, 9.9, 0.28, 14, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 20 Role journeys
- slide = base_slide(prs, "三个典型角色,每天如何使用平台", page, "管理层看全局、部门长抓闭环、工程师办任务")
- journeys = [
- ("厂长", ["九宫格看健康", "下钻关键红灯", "查看改善结果"], "少听汇报,快速抓重点", NAVY),
- ("部门长", ["模块看板看偏差", "确认 S8 责任", "分派并跟踪结果"], "统一部门重点,过程透明", BLUE),
- ("工程师", ["工作台接收任务", "深链核对事实", "反馈证据与结果"], "减少查数,明确期限", TEAL),
- ]
- for i, (role, steps, result, color) in enumerate(journeys):
- x = 0.62 + i * 4.22
- add_rect(slide, x, 1.82, 3.75, 4.68, LIGHT, LINE)
- add_pill(slide, role, x + 0.95, 2.08, 1.85, color, WHITE, 13)
- for j, step in enumerate(steps):
- add_rect(slide, x + 0.42, 2.88 + j * 0.82, 2.92, 0.58, WHITE, color)
- add_text(slide, f"{j + 1} {step}", x + 0.58, 2.99 + j * 0.82, 2.58, 0.3, 11.5, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, result, x + 0.42, 5.55, 2.92, 0.52, 13, color, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- page += 1
- # 21 Customer value
- slide = base_slide(prs, "客户最终获得的,不是“更多报表”", page, "五类能够持续积累、可以用客户基线量化的制造运营能力")
- vals = [
- ("01", "交付更可预测", "订单、物料、产能和执行联动", BLUE),
- ("02", "库存更可控", "按真实需求组织采购、收货和领退料", TEAL),
- ("03", "质量更可追溯", "来料、过程、成品和供应商闭环", RED),
- ("04", "异常响应更快", "自动发现、责任分派、超时升级", AMBER),
- ("05", "管理持续改善", "指标、事实、行动和效果统一沉淀", NAVY),
- ]
- for i, (num, head, body, color) in enumerate(vals):
- x = 0.7 + i * 2.5
- add_rect(slide, x, 1.82, 2.2, 4.08, LIGHT, LINE)
- add_text(slide, num, x + 0.18, 2.08, 1.84, 0.55, 26, color, True, PP_ALIGN.CENTER)
- add_rect(slide, x + 0.55, 2.82, 1.1, 0.07, color, color, False)
- add_text(slide, head, x + 0.18, 3.22, 1.84, 0.7, 16, NAVY, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- add_text(slide, body, x + 0.25, 4.38, 1.7, 0.9, 11, MUTED, align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
- add_text(slide, "建议用客户自己的交期、停线、库存、质量和异常关闭基线,设定试点量化目标。", 1.05, 6.28, 11.2, 0.34, 12.5, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 22 Fit + discovery questions
- slide = base_slide(prs, "适合的客户与销售切入问题", page, "从高频运营痛点切入,比从模块清单切入更容易形成共识")
- add_pill(slide, "典型客户特征", 0.62, 1.75, 1.65, BLUE)
- fits = [
- ("业务复杂", "多品种、小批量、订单变化频繁"),
- ("系统分散", "已有 ERP / MES / WMS,跨系统仍靠 Excel"),
- ("痛点明确", "交付、缺料、质量和在制透明度不足"),
- ("重视改善", "不满足于看板,希望形成行动闭环"),
- ]
- for i, (head, body) in enumerate(fits):
- x = 0.62 + (i % 2) * 3.05
- y = 2.3 + (i // 2) * 1.72
- card(slide, head, body, x, y, 2.72, 1.35, [NAVY, BLUE, CYAN, TEAL][i], i + 1)
- add_pill(slide, "首次访谈四问", 6.92, 1.75, 1.65, TEAL)
- questions = [
- "哪类订单最容易延期?通常到哪个环节才发现?",
- "缺料清单由谁维护?计划、采购和仓库是否一致?",
- "质量异常关闭后,如何确认没有再次发生?",
- "看板红灯能否追到单据、责任人和行动?",
- ]
- for i, q in enumerate(questions):
- y = 2.28 + i * 0.92
- add_rect(slide, 6.92, y, 5.72, 0.7, LIGHT, LINE)
- add_text(slide, str(i + 1), 7.12, y + 0.16, 0.42, 0.3, 14, TEAL, True, PP_ALIGN.CENTER)
- add_text(slide, q, 7.68, y + 0.12, 4.62, 0.4, 12.5, NAVY, True)
- add_rect(slide, 7.22, 6.12, 5.12, 0.52, NAVY, NAVY)
- add_text(slide, "找到可量化场景 → 用客户业务对象演示 → 写入试点目标", 7.4, 6.23, 4.76, 0.26, 10.5, WHITE, True, PP_ALIGN.CENTER)
- page += 1
- # 23 Implementation + demo route
- slide = base_slide(prs, "典型落地路径与现场演示路线", page, "先证明一个场景产生业务结果,再逐步复制和扩展")
- add_pill(slide, "落地路径", 0.58, 1.72, 1.22, BLUE)
- stages = [("1", "业务诊断"), ("2", "运营建模"), ("3", "场景试点"), ("4", "系统连接"), ("5", "运营推广"), ("6", "持续优化")]
- for i, (num, head) in enumerate(stages):
- x = 0.58 + i * 2.08
- add_rect(slide, x, 2.24, 1.75, 1.28, LIGHT, LINE)
- add_text(slide, num, x + 0.12, 2.4, 0.42, 0.34, 15, [NAVY, BLUE, CYAN, TEAL, AMBER, RED][i], True, PP_ALIGN.CENTER)
- add_text(slide, head, x + 0.48, 2.38, 1.1, 0.38, 12, NAVY, True, PP_ALIGN.CENTER)
- if i < len(stages) - 1:
- add_text(slide, "›", x + 1.73, 2.6, 0.3, 0.36, 18, CYAN, True, PP_ALIGN.CENTER)
- add_pill(slide, "20–30 分钟演示路线", 0.58, 4.02, 2.05, TEAL)
- route = ["九宫格", "模块看板", "智慧诊断", "改善计划", "我的工作台", "通知深链", "效果台账"]
- flow(slide, route, 4.58, 0.58, 12.18, [NAVY, BLUE, CYAN, TEAL, AMBER, GREEN, NAVY], 10.5)
- add_rect(slide, 1.25, 5.88, 10.82, 0.68, PALE_TEAL, TEAL)
- add_text(slide, "现场演示始终围绕一个真实业务问题,从总览下钻到事实,再回到责任人与改善结果。", 1.5, 6.05, 10.32, 0.3, 13, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 24 Closing
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_text(slide, "让制造运营从“事后解释”", 0.78, 2.12, 11.8, 0.65, 30, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, "走向“事前预警 · 协同处置 · 持续改善”", 0.78, 2.98, 11.8, 0.72, 30, CYAN, True, PP_ALIGN.CENTER)
- add_rect(slide, 3.25, 4.05, 6.85, 0.07, CYAN, CYAN, False)
- add_text(slide, "从一个高价值场景开始,建立可复制的制造运营能力", 1.35, 4.58, 10.65, 0.58, 20, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, SYSTEM_NAME, 1.0, 5.72, 11.35, 0.48, 17, RGBColor(204, 219, 234), True, PP_ALIGN.CENTER)
- add_footer(slide, page, dark=True)
- OUTPUT.parent.mkdir(parents=True, exist_ok=True)
- prs.save(OUTPUT)
- print(OUTPUT)
- print(f"slides={len(prs.slides)}")
- def build_layered():
- """Generate the layered, screenshot-led system introduction."""
- prs = Presentation()
- prs.slide_width = Inches(W)
- prs.slide_height = Inches(H)
- prs.core_properties.title = f"{SYSTEM_NAME}系统介绍"
- prs.core_properties.subject = "经营决策、业务协同、数据连接与典型场景"
- prs.core_properties.author = SYSTEM_NAME
- prs.core_properties.comments = "按三层功能架构组织,全部功能介绍使用真实系统界面"
- page = 1
- # 01 Cover
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_pill(slide, "系统介绍", 0.68, 1.72, 1.25, CYAN)
- add_text(slide, SYSTEM_NAME, 0.68, 2.35, 11.9, 1.08, 31, WHITE, True)
- add_text(slide, "连接数据、业务与责任,让制造运营从看见问题走向闭环改善", 0.72, 3.62, 11.3, 0.62, 19, RGBColor(204, 219, 234))
- add_rect(slide, 0.72, 4.55, 6.4, 0.06, CYAN, CYAN, False)
- add_text(slide, "经营决策 · 业务协同 · 数据连接 · 场景闭环", 0.72, 4.92, 11.6, 0.5, 16, CYAN, True)
- add_text(slide, "销售 / 售前 / 客户业务交流版", 0.72, 6.25, 4.8, 0.3, 11, RGBColor(190, 202, 214))
- add_footer(slide, page, dark=True)
- page += 1
- # 02 Directory
- slide = base_slide(prs, "目录", page, "从平台定位到三层功能,再用典型场景说明业务价值")
- sections = [
- ("01", "平台定位与全景", "为什么建设 · 三层架构 · 运营闭环", "03–05", NAVY),
- ("02", "经营决策层", "九宫格 · S9 · 工作台 · 诊断 · 改善", "06–11", BLUE),
- ("03", "业务协同层", "订单 · 计划 · 供应 · 生产 · 质量 · 仓储 · 异常", "12–19", CYAN),
- ("04", "数据连接层", "ERP/MES/WMS · 数据中台 · DWD/KPI", "20–23", TEAL),
- ("05", "场景与落地", "四类典型场景 · 使用角色 · 建设路径", "24–29", AMBER),
- ]
- for i, (num, head, body, pages, color) in enumerate(sections):
- x = 0.72 + (i % 3) * 4.18
- y = 1.72 + (i // 3) * 2.28
- w = 3.78 if i < 3 else 5.85
- if i >= 3:
- x = 0.72 + (i - 3) * 6.18
- add_rect(slide, x, y, w, 1.72, LIGHT, LINE)
- add_text(slide, num, x + 0.2, y + 0.2, 0.7, 0.45, 20, color, True)
- add_text(slide, head, x + 0.92, y + 0.18, w - 1.55, 0.42, 16, NAVY, True)
- add_text(slide, body, x + 0.25, y + 0.78, w - 0.5, 0.5, 10.5, MUTED, align=PP_ALIGN.CENTER)
- add_pill(slide, pages, x + w - 0.82, y + 0.2, 0.58, color, WHITE, 9)
- page += 1
- # 03 Why
- slide = base_slide(prs, "为什么需要制造业数据智能运营平台", page, "企业并不缺系统,缺的是跨系统、跨部门的统一运营闭环")
- pains = [
- ("数据分散", "订单、计划、供应、仓储、生产和质量口径不一致。", BLUE),
- ("风险滞后", "缺料、延期、质量与设备问题到现场才暴露。", AMBER),
- ("协同靠人", "会议、群聊和 Excel 承担责任分派与进度跟踪。", RED),
- ("看板不闭环", "红灯能看见,但根因、任务和改善效果无法持续追踪。", TEAL),
- ]
- for i, (head, body, color) in enumerate(pains):
- card(slide, head, body, 0.55 + i * 3.15, 1.72, 2.85, 1.52, color, i + 1)
- add_rect(slide, 0.95, 3.75, 11.42, 2.2, PALE_BLUE, BLUE)
- add_text(slide, "平台定位", 1.22, 4.02, 1.25, 0.38, 15, BLUE, True)
- add_text(slide, "不是替代 ERP、MES、WMS,而是在现有系统之上建立统一的制造运营协同层", 2.35, 3.96, 9.45, 0.52, 18, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, "统一事实 → 提前预警 → 跨部门协同 → 责任闭环 → 持续改善", 1.35, 4.92, 10.75, 0.48, 16, TEAL, True, PP_ALIGN.CENTER)
- page += 1
- # 04 Functional architecture
- slide = base_slide(prs, "系统功能划分:三层能力共同形成运营闭环", page, "每层解决不同问题,三层使用同一套业务事实与责任链路")
- layers = [
- ("经营决策层", "九宫格 · 我的工作台 · 智慧诊断 · 改善台账", NAVY, WHITE, "看全局、抓重点、推改善"),
- ("业务协同层", "订单 · 计划 · 供应 · 生产 · 质量 · 仓储 · 异常", CYAN, WHITE, "跨部门围绕同一业务对象协同"),
- ("数据连接层", "现有 ERP / MES / WMS · 数据中台 · DWD / KPI", PALE_BLUE, NAVY, "接入、治理、建模并形成可信指标"),
- ]
- for i, (head, body, color, tc, value) in enumerate(layers):
- x = 0.82 + i * 0.46
- y = 1.72 + i * 1.45
- w = 11.7 - i * 0.92
- add_rect(slide, x, y, w, 1.05, color, color)
- add_text(slide, head, x + 0.22, y + 0.16, 1.8, 0.34, 14, tc, True)
- add_text(slide, body, x + 2.08, y + 0.13, w - 4.0, 0.42, 14, tc, True, PP_ALIGN.CENTER)
- add_text(slide, value, x + w - 2.12, y + 0.18, 1.86, 0.5, 9.5, tc, True, PP_ALIGN.CENTER)
- add_rect(slide, 1.62, 6.22, 10.12, 0.5, PALE_TEAL, TEAL)
- add_text(slide, "数据成为事实,事实驱动协同,协同产生行动,行动回写经营结果", 1.88, 6.33, 9.6, 0.26, 13, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 05 Loop
- slide = base_slide(prs, "一条完整的制造运营闭环", page, "上一步结果成为下一步输入,现场变化反向影响计划与客户承诺")
- flow(slide, ["订单评审", "工单排程", "物料齐套", "采购到货", "仓储检验", "生产执行", "成品发运"], 1.82, 0.48, 12.4, font_size=10.5)
- flow(slide, ["异常发现", "责任分派", "业务处置", "指标诊断", "改善审批", "行动执行", "效果验证"], 3.12, 0.48, 12.4, [RED, AMBER, BLUE, CYAN, TEAL, GREEN, NAVY], 10.5)
- add_rect(slide, 0.85, 4.62, 11.65, 1.52, PALE_TEAL, CYAN)
- add_text(slide, "业务结果", 1.1, 4.92, 1.3, 0.38, 15, TEAL, True)
- add_text(slide, "订单交期更可信 · 缺料风险更前置 · 生产执行更透明 · 质量问题更可追溯", 2.25, 4.86, 9.8, 0.48, 15, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, "管理结果", 1.1, 5.56, 1.3, 0.38, 15, TEAL, True)
- add_text(slide, "异常有人接 · 任务有人办 · 到期有人催 · 改善结果有人验证", 2.25, 5.5, 9.8, 0.48, 15, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 06 Decision overview
- screenshot_quad_slide(
- prs, page, "经营决策层|从全局态势到个人行动",
- "四类真实系统界面共同完成“看见问题—定位原因—推动行动—验证结果”",
- [
- (SYSTEM_SHOTS / "decision-grid.png", "九宫格经营驾驶舱"),
- (SYSTEM_SHOTS / "decision-workbench.png", "我的工作台"),
- (SYSTEM_SHOTS / "decision-diagnosis.png", "智慧诊断"),
- (SYSTEM_SHOTS / "decision-improvement-ledger.png", "改善计划台账"),
- ],
- "系统 Demo 实测界面",
- )
- page += 1
- # 07 Grid
- screenshot_feature_slide(
- prs, page, "九宫格|整厂经营态势一屏掌握",
- "把 S1–S9 关键状态、异常趋势和经营指标集中到统一驾驶舱",
- SYSTEM_SHOTS / "decision-grid.png",
- "系统能力", ["模块红黄绿状态总览", "关键指标、异常趋势与风险分布", "一键下钻模块看板和业务事实"],
- "管理价值", ["减少逐部门收集汇报", "快速识别跨模块风险", "统一当天经营重点"],
- BLUE, "系统 Demo 实测界面",
- )
- page += 1
- # 08 S9
- screenshot_feature_slide(
- prs, page, "S9|整厂宏观运营指标看板",
- "S9 面向整厂经营管理,不是单一业务模块看板",
- DASHBOARD_SHOTS / "S9-dashboard.png",
- "宏观指标", ["质量损耗率、订单交付周期", "订单准时满足率、生产效率", "全库利用率及整厂级目标差距"],
- "管理价值", ["统一厂级指标口径", "跨模块观察经营结果", "从宏观偏差进入诊断与改善"],
- NAVY, "系统 UAT 实测界面",
- )
- page += 1
- # 09 Workbench
- screenshot_feature_slide(
- prs, page, "我的工作台|每个人只处理自己的任务",
- "行动项、审批、S8 事项和未读消息按责任人统一聚合",
- SYSTEM_SHOTS / "decision-workbench.png",
- "任务聚合", ["改善行动项与到期状态", "审批待办、S8 事项和未读消息", "通知深链直接进入业务处理页"],
- "使用价值", ["减少跨系统找任务", "责任和截止日期清晰", "在线提醒、离线登录仍可恢复"],
- TEAL, "系统 Demo 实测界面",
- )
- page += 1
- # 10 Diagnosis
- screenshot_feature_slide(
- prs, page, "智慧诊断|从指标偏差下钻到主要问题",
- "以指标目标与现状为起点,形成问题定位、改善计划和效果验证链路",
- SYSTEM_SHOTS / "decision-diagnosis.png",
- "诊断链路", ["目标与现状差距量化", "定位责任部门与主要问题", "关联预警、事实明细和下层指标"],
- "使用价值", ["避免只看红灯不知原因", "用统一事实支持讨论", "诊断结果直接进入改善闭环"],
- CYAN, "系统 Demo 实测界面",
- )
- page += 1
- # 11 Improvement
- screenshot_feature_slide(
- prs, page, "改善台账|让改善计划、行动与评价持续留痕",
- "从诊断结果创建计划,经过审批、任务分派、执行反馈和自动评价",
- SYSTEM_SHOTS / "decision-improvement-ledger.png",
- "闭环能力", ["计划状态、责任部门和到期日", "行动项分派、提醒与执行证据", "审批记录、逾期标识和效果评价"],
- "管理价值", ["改善事项不再散落", "过程责任可追踪", "改善前后结果可验证、可复用"],
- TEAL, "系统 Demo 实测界面",
- )
- page += 1
- # 12 Collaboration overview
- slide = base_slide(prs, "业务协同层|围绕订单贯通七类业务能力", page, "订单是需求起点,计划、供应、生产、质量、仓储和异常共同影响最终交付")
- chain = [
- ("01", "订单", "评审 · 承诺 · 交付", BLUE),
- ("02", "计划", "排程 · 日计划 · 追踪", CYAN),
- ("03", "供应", "需求 · 齐套 · 采购", TEAL),
- ("04", "生产", "投产 · 报工 · 在制", BLUE),
- ("05", "质量", "IQC · IPQC · FQC", RED),
- ("06", "仓储", "库存 · 领退料 · 发运", AMBER),
- ("07", "异常", "发现 · 分派 · 升级", NAVY),
- ]
- for i, (num, head, body, color) in enumerate(chain):
- x = 0.48 + i * 1.82
- add_rect(slide, x, 2.05, 1.58, 2.55, LIGHT, LINE)
- add_text(slide, num, x + 0.14, 2.25, 1.3, 0.42, 19, color, True, PP_ALIGN.CENTER)
- add_text(slide, head, x + 0.14, 2.95, 1.3, 0.42, 16, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, body, x + 0.16, 3.65, 1.26, 0.62, 10, MUTED, align=PP_ALIGN.CENTER)
- add_rect(slide, 0.85, 5.25, 11.65, 0.78, PALE_TEAL, TEAL)
- add_text(slide, "统一业务对象:订单号 · 工单号 · 物料 · 批次 · 检验单 · 异常事件", 1.15, 5.46, 11.05, 0.35, 14, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 13 Order
- screenshot_feature_slide(
- prs, page, "订单协同|从订单评审到交付跟踪",
- "把设计、物料、产能和交期依据放在同一订单决策过程",
- FLOW_SHOTS / "S1-04c-review-with-wo.png",
- "核心功能", ["订单与合同评审", "交期确认、优先级与插单影响", "评审后生成工单并跟踪交付"],
- "业务价值", ["承诺有依据", "订单状态透明", "变化影响可追踪"],
- BLUE, "系统 UAT 实测界面",
- )
- page += 1
- # 14 Planning
- screenshot_feature_slide(
- prs, page, "计划协同|把工单转成可执行日计划",
- "综合产线能力、日历、物料齐套和优先级形成可执行排程",
- FLOW_SHOTS / "S2-13-T3-schedule-ui.png",
- "核心功能", ["工单工序排程", "产线日历与可执行日计划", "计划下达、异常记录和执行追踪"],
- "业务价值", ["计划更可执行", "插单影响可解释", "计划与现场进度一致"],
- CYAN, "系统 UAT 实测界面",
- )
- page += 1
- # 15 Supply
- screenshot_feature_slide(
- prs, page, "供应协同|缺料风险前移到计划阶段",
- "按订单和工单计算需求,结合库存、在途与交货计划识别真实缺口",
- DASHBOARD_SHOTS / "S3-dashboard.png",
- "核心功能", ["物料需求与交货计划", "齐套计算、缺料和供应商风险", "采购申请、订单、委外与催交"],
- "业务价值", ["减少临停救火", "采购优先级统一", "供应影响可下钻"],
- TEAL, "系统 UAT 实测界面",
- )
- page += 1
- # 16 Production
- screenshot_feature_slide(
- prs, page, "生产协同|透明跟踪投产、报工与在制",
- "让计划、车间和交付共同看到工单真实执行状态",
- DASHBOARD_SHOTS / "S6-dashboard.png",
- "核心功能", ["生产指令、工序与报工", "在制、末道完成和执行偏差", "车间效率、设备 OEE 与工时"],
- "业务价值", ["现场状态透明", "偏差及时暴露", "进度反向更新交付风险"],
- CYAN, "系统 UAT 实测界面",
- )
- page += 1
- # 17 Quality
- screenshot_feature_slide(
- prs, page, "质量协同|贯通来料、过程与成品质量",
- "检验规则、批次、判定、复检和审批形成完整证据链",
- IQC_SHOTS / "20260811-2306-提交检验结果合格-IQC202608110002.png",
- "核心功能", ["IQC / IPQC / FQC 检验任务", "结果录入、审核、退回与关单", "关联物料、供应商、工单和批次"],
- "业务价值", ["质量状态受控", "问题来源可追溯", "整改与效果评价闭环"],
- RED, "系统 UAT 实测界面",
- )
- page += 1
- # 18 Warehouse
- screenshot_feature_slide(
- prs, page, "仓储协同|库存、批次与收发运全程可追溯",
- "从采购收货、生产领退料到成品入库和发运统一数量与状态",
- BID_SHOTS / "ui_s5_stock.png",
- "核心功能", ["库存、批次、库位和状态查询", "采购收货、领料、退料与入库", "备料、发料、成品库存和发运"],
- "业务价值", ["库存去向清楚", "质量状态隔离", "仓储结果反馈计划与交付"],
- AMBER, "系统实际界面",
- )
- page += 1
- # 19 Exception
- screenshot_feature_slide(
- prs, page, "异常协同|发现、分派、处置、验证和关闭",
- "S8 汇聚交付、供应、生产、质量等异常,按角色形成责任闭环",
- SYSTEM_SHOTS / "collaboration-exception-dashboard.png",
- "核心功能", ["规则监控和主动提报", "认领、分派、转派、升级与驳回", "处理反馈、验证、关闭和时效统计"],
- "业务价值", ["异常不再依赖人工汇报", "责任与时限明确", "全过程可追踪、可复盘"],
- RED, "系统 Demo 实测界面",
- )
- page += 1
- # 20 Data overview
- screenshot_feature_slide(
- prs, page, "数据连接层|从外部系统到业务消费与回写",
- "数据地图展示来源、接入、治理、服务和业务消费的完整链路",
- SYSTEM_SHOTS / "data-platform-map.png",
- "连接范围", ["ERP / SAP、MES、WMS 等外部系统", "数据库同步、API 入站与文件接入", "API 出站、业务查询、看板与回写"],
- "平台价值", ["保留现有系统投资", "形成统一数据路径", "异常和同步状态可观察"],
- BLUE, "系统 Demo 实测界面",
- )
- page += 1
- # 21 ERP/MES/WMS
- screenshot_pair_slide(
- prs, page, "现有 ERP / MES / WMS|标准化接入而非整体替换",
- "通过数据库、API 和文件方式接入订单、生产、采购、库存与质量数据",
- SYSTEM_SHOTS / "data-platform-sources.png", "数据源管理:连接与健康状态",
- FLOW_SHOTS / "WMS-01-备料列表-SM20260810001.png", "WMS 实际业务界面:生产备料",
- "系统 Demo / UAT 实测界面",
- )
- page += 1
- # 22 Data platform
- screenshot_pair_slide(
- prs, page, "数据中台|统一管理接入、同步、日志与质量",
- "数据接入不是一次性接口工程,而是可配置、可调度、可追踪的持续能力",
- SYSTEM_SHOTS / "data-platform-overview.png", "数据中台工作台",
- SYSTEM_SHOTS / "data-platform-sync-tasks.png", "同步配置中心",
- "系统 Demo 实测界面",
- )
- page += 1
- # 23 DWD/KPI
- screenshot_pair_slide(
- prs, page, "DWD / KPI|把原始数据变成可信运营指标",
- "标准层统一业务对象,指标主数据定义层级、口径、责任与诊断关系",
- SYSTEM_SHOTS / "data-kpi-master.png", "运营指标主数据与分层指标树",
- DASHBOARD_SHOTS / "S9-dashboard.png", "整厂宏观运营指标结果",
- "系统 Demo / UAT 实测界面",
- )
- page += 1
- # 24 Scenario 1
- scenario_case_slide(
- prs, page, "场景一|业务协同层·订单承诺与交付协同环节",
- "类型:跨部门订单协同场景|核心问题:客户插单后能否可信承诺交期",
- FLOW_SHOTS / "S1-04c-review-with-wo.png",
- "高优先级订单要求快速确认交期,但设计、物料、产能和现有订单影响分散在不同部门。",
- ["统一评审交期、优先级和影响依据", "生成工单并联动需求、排程与齐套", "持续跟踪执行进度和交付风险"],
- ["承诺更快", "依据更可信", "变化可追踪", "风险可预警"],
- BLUE, "系统 UAT 实测界面",
- )
- page += 1
- # 25 Scenario 2
- scenario_case_slide(
- prs, page, "场景二|业务协同层·供应缺料保障环节",
- "类型:计划与供应协同场景|核心问题:关键物料延期是否会造成停线",
- DASHBOARD_SHOTS / "S3-dashboard.png",
- "关键供应商部分到货,多张工单争用同一物料,采购知道延期但计划尚未调整。",
- ["按工单和 BOM 计算真实需求", "结合库存、在途和交货计划识别缺口", "按受影响订单确定催交、替代和调序优先级"],
- ["缺料前置", "优先级统一", "协同透明", "减少停线"],
- AMBER, "系统 UAT 实测界面",
- )
- page += 1
- # 26 Scenario 3
- scenario_case_slide(
- prs, page, "场景三|业务协同层·质量异常闭环环节",
- "类型:质量追溯与整改场景|核心问题:如何避免同类质量问题重复发生",
- IQC_SHOTS / "20260811-2306-提交检验结果合格-IQC202608110002.png",
- "关键来料出现质量问题并影响生产齐套,后续过程检验和成品检验也需要持续关注。",
- ["统一检验规则、批次和质量状态", "异常关联供应商、物料、工单与订单", "整改进入审批、责任分派和效果验证"],
- ["质量可追溯", "库存受控", "责任闭环", "改善可验证"],
- RED, "系统 UAT 实测界面",
- )
- page += 1
- # 27 Scenario 4
- scenario_case_slide(
- prs, page, "场景四|经营决策层·整厂运营决策环节",
- "类型:管理驾驶舱与持续改善场景|核心问题:整厂指标变红后如何找到根因并推动解决",
- SYSTEM_SHOTS / "decision-grid.png",
- "传统看板只能显示红灯,原因和行动散落在会议纪要,过一段时间无法确认是否真正解决。",
- ["九宫格识别风险,S9 查看整厂指标", "智慧诊断关联事实、责任部门和主要问题", "形成改善计划、个人任务、提醒和效果评价"],
- ["少听汇报", "快速抓重点", "基于事实决策", "经验可沉淀"],
- TEAL, "系统 Demo 实测界面",
- )
- page += 1
- # 28 Roles
- slide = base_slide(prs, "三个典型角色,每天如何使用平台", page, "管理层看全局、部门长抓闭环、工程师办任务")
- journeys = [
- ("厂长 / 运营", ["九宫格看整厂健康", "S9 识别宏观偏差", "查看改善结果"], "少听汇报,快速抓重点", NAVY),
- ("部门负责人", ["模块看板看偏差", "确认异常与根因", "分派并跟踪行动"], "统一重点,过程透明", BLUE),
- ("业务工程师", ["工作台接收任务", "深链核对业务事实", "反馈证据与结果"], "减少查数,明确期限", TEAL),
- ]
- for i, (role, steps, result, color) in enumerate(journeys):
- x = 0.62 + i * 4.22
- add_rect(slide, x, 1.82, 3.75, 4.68, LIGHT, LINE)
- add_pill(slide, role, x + 0.72, 2.08, 2.3, color, WHITE, 13)
- for j, step in enumerate(steps):
- add_rect(slide, x + 0.42, 2.88 + j * 0.82, 2.92, 0.58, WHITE, color)
- add_text(slide, f"{j + 1} {step}", x + 0.52, 2.99 + j * 0.82, 2.72, 0.3, 11, NAVY, True, PP_ALIGN.CENTER)
- add_text(slide, result, x + 0.42, 5.55, 2.92, 0.52, 13, color, True, PP_ALIGN.CENTER, MSO_ANCHOR.MIDDLE)
- page += 1
- # 29 Implementation + value
- slide = base_slide(prs, "从一个高价值场景开始,逐步形成整厂运营能力", page, "先建立基线并证明业务结果,再连接系统、复制场景和持续优化")
- stages = [
- ("1", "业务诊断"), ("2", "基线建模"), ("3", "场景试点"),
- ("4", "系统连接"), ("5", "运营推广"), ("6", "持续优化"),
- ]
- for i, (num, head) in enumerate(stages):
- x = 0.58 + i * 2.08
- add_rect(slide, x, 1.85, 1.75, 1.18, LIGHT, LINE)
- add_text(slide, num, x + 0.12, 2.18, 0.42, 0.34, 15, [NAVY, BLUE, CYAN, TEAL, AMBER, RED][i], True, PP_ALIGN.CENTER)
- add_text(slide, head, x + 0.48, 2.15, 1.1, 0.38, 12, NAVY, True, PP_ALIGN.CENTER)
- values = [
- ("交付", "订单承诺更可信", BLUE),
- ("供应", "缺料风险更前置", TEAL),
- ("质量", "问题来源可追溯", RED),
- ("异常", "响应与关闭更快", AMBER),
- ("管理", "改善结果可验证", NAVY),
- ]
- for i, (head, body, color) in enumerate(values):
- x = 0.72 + i * 2.5
- add_rect(slide, x, 3.72, 2.18, 1.72, LIGHT, LINE)
- add_text(slide, head, x + 0.2, 4.02, 1.78, 0.38, 17, color, True, PP_ALIGN.CENTER)
- add_text(slide, body, x + 0.18, 4.62, 1.82, 0.4, 11, NAVY, True, PP_ALIGN.CENTER)
- add_rect(slide, 1.25, 5.98, 10.82, 0.62, PALE_TEAL, TEAL)
- add_text(slide, "建议以客户自己的交期、停线、库存、质量和异常关闭基线设定试点目标", 1.5, 6.12, 10.32, 0.3, 13, NAVY, True, PP_ALIGN.CENTER)
- page += 1
- # 30 Closing
- slide = prs.slides.add_slide(prs.slide_layouts[6])
- slide.background.fill.solid()
- slide.background.fill.fore_color.rgb = NAVY
- add_text(slide, "让制造运营从“事后解释”", 0.78, 2.12, 11.8, 0.65, 30, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, "走向“事前预警 · 协同处置 · 持续改善”", 0.78, 2.98, 11.8, 0.72, 30, CYAN, True, PP_ALIGN.CENTER)
- add_rect(slide, 3.25, 4.05, 6.85, 0.07, CYAN, CYAN, False)
- add_text(slide, "从一个高价值场景开始,建立可复制的制造运营能力", 1.35, 4.58, 10.65, 0.58, 20, WHITE, True, PP_ALIGN.CENTER)
- add_text(slide, SYSTEM_NAME, 1.0, 5.72, 11.35, 0.48, 17, RGBColor(204, 219, 234), True, PP_ALIGN.CENTER)
- add_footer(slide, page, dark=True)
- OUTPUT.parent.mkdir(parents=True, exist_ok=True)
- prs.save(OUTPUT)
- print(OUTPUT)
- print(f"slides={len(prs.slides)}")
- if __name__ == "__main__":
- build_layered()
|