建立可移交的 AI 软件交付规划文档仓库。

纳入截至 2026-10-13 会议回写后的产品基线与会议图源。
This commit is contained in:
mdszxy committed 2026-10-13 22:27:58 +08:00
commit 638d3541bf
55 files changed
+3484

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>AI 软件交付平台 · G01–G05 会议图集</title><style>
*{box-sizing:border-box}body{margin:0;background:#f2f5fa;color:#17233a;font-family:"Microsoft YaHei",Arial,sans-serif;font-size:16px}header{background:#fff;padding:20px 28px;border-bottom:1px solid #dce3ed}header p{margin:4px 0;color:#526176}nav{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}button{font:inherit;border:1px solid #cbd5e1;border-radius:6px;background:#fff;padding:10px 14px;color:#17233a;cursor:pointer}button[aria-pressed=true]{background:#253f6b;color:#fff;border-color:#253f6b}main{padding:24px 28px}h1{font-size:28px;margin:0 0 12px}h2{font-size:19px;margin:0 0 12px}.lead{line-height:1.8;margin:0 0 10px}.links{font-size:14px;line-height:1.8}a{color:#245b98}article{background:white;border-radius:8px;padding:20px;margin:20px 0;border:1px solid #dce3ed}.diagram{overflow:auto}.diagram>svg{width:100%;height:auto;min-width:1000px;display:block}footer{color:#526176;font-size:14px;line-height:1.8;margin-top:20px}@media(max-width:700px){header,main{padding:16px}article{padding:12px}h1{font-size:24px}}@media print{nav,header,.links{display:none}body,main{background:white;padding:0}section[hidden]{display:block!important}article{break-inside:avoid;page-break-after:always;border:0;padding:0}.diagram{overflow:visible}.diagram>svg{min-width:0}footer{display:none}}
</style></head><body><header><strong>AI 软件交付与持续服务平台 · 会议图集</strong><p>G01–G05 · 2026-10-12 · 业务基线 0.14 · 图集 0.17</p><nav aria-label="选择图表"><button type="button" data-index="0" aria-pressed="true">G01 产品业务全景</button><button type="button" data-index="1" aria-pressed="false">G02 领域概念关系</button><button type="button" data-index="2" aria-pressed="false">G03 购买与开通</button><button type="button" data-index="3" aria-pressed="false">G04 定制工单处理</button><button type="button" data-index="4" aria-pressed="false">G05 收费与权益</button></nav></header><main><section id="panel0" ><h1>G01 产品业务全景</h1><p class="lead">我们销售可稳定运行的应用技术封装,以及 AI 和团队的定制开发能力;基础服务保障交付和成本覆盖。</p><p class="links"><a href="G01-产品业务全景.md">阅读 Markdown 与编辑源</a> · <a href="G01-产品业务全景.svg">产品业务全景 SVG</a> · <a href="G01-产品业务全景.png">PNG</a></p><article><h2>产品业务全景</h2><div class="diagram"><svg xmlns="http://www.w3.org/2000/svg" width="1657" height="1082" viewBox="0 0 1657 1082" role="img" aria-labelledby="G01-产品业务全景Title G01-产品业务全景Desc"><title id="G01-产品业务全景Title">G01 产品业务全景 · 产品业务全景</title><desc id="G01-产品业务全景Desc">我们销售可稳定运行的应用技术封装,以及 AI 和团队的定制开发能力;基础服务保障交付和成本覆盖。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G01 产品业务全景</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 主图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram01x0" width="1592.15625" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="910" viewBox="0 -1 1592.15625 910" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram01x0{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram01x0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram01x0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram01x0 .error-icon{fill:#ffffff;}#diagram01x0 .error-text{fill:#000000;stroke:#000000;}#diagram01x0 .edge-thickness-normal{stroke-width:1px;}#diagram01x0 .edge-thickness-thick{stroke-width:3.5px;}#diagram01x0 .edge-pattern-solid{stroke-dasharray:0;}#diagram01x0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram01x0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram01x0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram01x0 .marker{fill:#60718a;stroke:#60718a;}#diagram01x0 .marker.cross{stroke:#60718a;}#diagram01x0 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram01x0 p{margin:0;}#diagram01x0 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram01x0 .cluster-label text{fill:#000000;}#diagram01x0 .cluster-label span{color:#000000;}#diagram01x0 .cluster-label span p{background-color:transparent;}#diagram01x0 .label text,#diagram01x0 span{fill:#17233a;color:#17233a;}#diagram01x0 .node rect,#diagram01x0 .node circle,#diagram01x0 .node ellipse,#diagram01x0 .node polygon,#diagram01x0 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram01x0 .rough-node .label text,#diagram01x0 .node .label text,#diagram01x0 .image-shape .label,#diagram01x0 .icon-shape .label{text-anchor:middle;}#diagram01x0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram01x0 .rough-node .label,#diagram01x0 .node .label,#diagram01x0 .image-shape .label,#diagram01x0 .icon-shape .label{text-align:center;}#diagram01x0 .node.clickable{cursor:pointer;}#diagram01x0 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram01x0 .arrowheadPath{fill:#0b0b0b;}#diagram01x0 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram01x0 .flowchart-link{stroke:#60718a;fill:none;}#diagram01x0 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram01x0 .edgeLabel p{background-color:#f3f8f6;}#diagram01x0 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram01x0 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram01x0 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram01x0 .cluster text{fill:#000000;}#diagram01x0 .cluster span{color:#000000;}#diagram01x0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;paddiLine truncated
+69
View File
@@ -0,0 +1,69 @@
# G01 产品业务全景
2026-10-13 · 业务基线 0.15 · 图集版本 0.18。按 D085–D088 修订文字。标记“后续”的能力不代表当前交付承诺。投影用 SVG 尚未按本次文字重绘。
**我们销售可稳定运行的应用技术封装,以及 AI 和团队的定制开发能力;基础服务保障交付和成本覆盖。**
![产品业务全景](G01-产品业务全景.svg)
```mermaid
flowchart TB
product["AI 软件交付与持续服务平台"]
subgraph audience["客户与入口"]
direction LR
familiar["首期:熟客普通账户
中介也按普通客户使用"]
publicEntry["长期:公开服务网站
案例、应用目录、SEO、广告"]
familiar ~~~ publicEntry
end
subgraph value["核心销售与配套服务"]
direction LR
packaging["经验证的应用技术封装
自有模板 / 开源应用"]
customization["核心价值:二次开发定制
有限自动 AI / 人工团队使用 AI"]
annual["年付开发与运行套餐
资源、域名、邮箱可按需选配"]
apiService["目标能力:公共 API 服务
独立订阅;接入版本待定"]
packaging ~~~ customization ~~~ annual ~~~ apiService
end
subgraph journey["客户使用路径"]
direction LR
choose["选应用并配置项目
普通向导 / 高级组合"]
operate["查看部署与管理应用
受保护预览 / 正式域名"]
request["工单提交明确改动需求
文字和附件;自动或人工"]
deliver["核验后更新运行版本
回执、版本记录、持续维护"]
choose --> operate --> request --> deliver
end
subgraph support["统一产品的内部支撑能力"]
direction LR
catalog["应用预设与资源绑定
应用指功能,如邮箱应用
初级不选组件;域名资源另购"]
execution["每次工单创建一个版本
恢复就用这个版本"]
business["账户、年付订单、积分与权益
供应商账号池、客服 / TG 沟通"]
catalog ~~~ execution ~~~ business
end
audience --> product --> value --> journey --> support
classDef future fill:#f4f4f5,stroke:#71717a,stroke-dasharray:5 4;
class apiService future;
```
读图时说明:
- 各框表示业务能力,不代表独立微服务、数据库或已经完成的功能。
- 应用目录可以跨行业扩展,但必须先接入、调通并验证。金融机构展示官网、纯前端站点、Web+worker、仅邮箱是代表场景;并非所有场景首期都自动化。
- 应用指功能,邮箱应用是例子。初级版本不让客户选择 Web、API、worker。域名是需要购买的资源。高级版本的组件选择以后再做。
- 不单独做任务执行、自动能力与人工接续这一层。每一次工单创建一个版本,恢复使用该版本。自动路径先 AI 验收,失败达到 x 次再转人工,x 未定。
- 工单承载改动任务和系统回执。沟通与价格协商通过客服或 TG,人工工单额外确认金额。计费按客户分模式,暂时只记用户报价模式和用户自由模式,见 G05。
- 标准开源应用部署不额外收开发费;资源等基础费用仍须覆盖成本。定制能力是核心销售,不能把平台理解成单纯出售 VPS。
依据:[01 产品定位](../01-立项与产品定位.md)、[02 业务流程](../02-业务流程与产品需求.md)、[05 商业模式](../05-商业模式与成本指标.md)。[返回图集](README.md)。
+47
View File
@@ -0,0 +1,47 @@
flowchart TB
product["AI 软件交付与持续服务平台"]
subgraph audience["客户与入口"]
direction LR
familiar["首期:熟客普通账户
中介也按普通客户使用"]
publicEntry["长期:公开服务网站
案例、应用目录、SEO、广告"]
familiar ~~~ publicEntry
end
subgraph value["核心销售与配套服务"]
direction LR
packaging["经验证的应用技术封装
自有模板 / 开源应用"]
customization["核心价值:二次开发定制
有限自动 AI / 人工团队使用 AI"]
annual["年付开发与运行套餐
资源、域名、邮箱可按需选配"]
apiService["目标能力:公共 API 服务
独立订阅;接入版本待定"]
packaging ~~~ customization ~~~ annual ~~~ apiService
end
subgraph journey["客户使用路径"]
direction LR
choose["选应用并配置项目
普通向导 / 高级组合"]
operate["查看部署与管理应用
受保护预览 / 正式域名"]
request["工单提交明确改动需求
文字和附件;自动或人工"]
deliver["核验后更新运行版本
回执、版本记录、持续维护"]
choose --> operate --> request --> deliver
end
subgraph support["统一产品的内部支撑能力"]
direction LR
catalog["应用预设与资源绑定
Web、API、worker 等组件"]
execution["任务执行、版本与恢复
自动能力与人工接续"]
business["账户、年付订单、积分与权益
供应商账号池、客服 / TG 沟通"]
catalog ~~~ execution ~~~ business
end
audience --> product --> value --> journey --> support
classDef future fill:#f4f4f5,stroke:#71717a,stroke-dasharray:5 4;
class apiService future;
Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1657" height="1082" viewBox="0 0 1657 1082" role="img" aria-labelledby="G01-产品业务全景Title G01-产品业务全景Desc"><title id="G01-产品业务全景Title">G01 产品业务全景 · 产品业务全景</title><desc id="G01-产品业务全景Desc">我们销售可稳定运行的应用技术封装,以及 AI 和团队的定制开发能力;基础服务保障交付和成本覆盖。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G01 产品业务全景</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 主图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram01x0" width="1592.15625" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="910" viewBox="0 -1 1592.15625 910" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram01x0{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram01x0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram01x0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram01x0 .error-icon{fill:#ffffff;}#diagram01x0 .error-text{fill:#000000;stroke:#000000;}#diagram01x0 .edge-thickness-normal{stroke-width:1px;}#diagram01x0 .edge-thickness-thick{stroke-width:3.5px;}#diagram01x0 .edge-pattern-solid{stroke-dasharray:0;}#diagram01x0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram01x0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram01x0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram01x0 .marker{fill:#60718a;stroke:#60718a;}#diagram01x0 .marker.cross{stroke:#60718a;}#diagram01x0 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram01x0 p{margin:0;}#diagram01x0 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram01x0 .cluster-label text{fill:#000000;}#diagram01x0 .cluster-label span{color:#000000;}#diagram01x0 .cluster-label span p{background-color:transparent;}#diagram01x0 .label text,#diagram01x0 span{fill:#17233a;color:#17233a;}#diagram01x0 .node rect,#diagram01x0 .node circle,#diagram01x0 .node ellipse,#diagram01x0 .node polygon,#diagram01x0 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram01x0 .rough-node .label text,#diagram01x0 .node .label text,#diagram01x0 .image-shape .label,#diagram01x0 .icon-shape .label{text-anchor:middle;}#diagram01x0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram01x0 .rough-node .label,#diagram01x0 .node .label,#diagram01x0 .image-shape .label,#diagram01x0 .icon-shape .label{text-align:center;}#diagram01x0 .node.clickable{cursor:pointer;}#diagram01x0 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram01x0 .arrowheadPath{fill:#0b0b0b;}#diagram01x0 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram01x0 .flowchart-link{stroke:#60718a;fill:none;}#diagram01x0 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram01x0 .edgeLabel p{background-color:#f3f8f6;}#diagram01x0 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram01x0 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram01x0 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram01x0 .cluster text{fill:#000000;}#diagram01x0 .cluster span{color:#000000;}#diagram01x0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram01x0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram01x0 rect.text{fill:none;stroke-width:0;}#diagram01x0 .icon-shape,#diagram01x0 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram01x0 .icon-shape p,#diagram01x0 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram01x0 .icon-shape rect,#diagram01x0 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram01x0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram01x0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram01x0 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}#diagram01x0 .future rect{fill:#f4f4f5!important;stroke:#71717a!important;stroke-dasharray:5 4!important;}#diagram01x0 .future polygon{fill:#f4f4f5!important;stroke:#71717a!important;stroke-dasharray:5 4!important;}#diagram01x0 .future ellipse{fill:#f4f4f5!importLine truncated

After

Width:  |  Height:  |  Size: 27 KiB

+18
View File
@@ -0,0 +1,18 @@
flowchart TB
scope["项目:工单的业务范围"]
workOrder["工单属于一个项目
可修改该项目多个 APP"]
version["项目发布组合
关联涉及 APP 的代码、产物、配置版本"]
software["APP:完整软件实例"]
runtime["运行组件与配置档位"]
resources["明确归属的数据库 / 存储
可被多个组件显式引用"]
items["购买项:独立计费对象
组件资源分别计费;共享资源只计一份"]
scope --> workOrder --> version
version -->|"记录版本"| software
software -->|"由组件运行"| runtime
runtime -->|"显式引用"| resources
runtime -->|"配置费用"| items
resources -->|"对应购买项"| items
Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1298" viewBox="0 0 1000 1298" role="img" aria-labelledby="G02-工单与购买项Title G02-工单与购买项Desc"><title id="G02-工单与购买项Title">G02 领域概念关系 · 工单与购买项</title><desc id="G02-工单与购买项Desc">项目代表业务目标,APP 代表完整软件;组件运行软件,资源由显式绑定关联。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G02 · 工单与购买项</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 展开图 · 技术选型未定</text><g transform="translate(270,124)"><svg id="diagram02x1" width="460.29296875" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="1126" viewBox="0 0 460.29296875 1126" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram02x1{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram02x1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram02x1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram02x1 .error-icon{fill:#ffffff;}#diagram02x1 .error-text{fill:#000000;stroke:#000000;}#diagram02x1 .edge-thickness-normal{stroke-width:1px;}#diagram02x1 .edge-thickness-thick{stroke-width:3.5px;}#diagram02x1 .edge-pattern-solid{stroke-dasharray:0;}#diagram02x1 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram02x1 .edge-pattern-dashed{stroke-dasharray:3;}#diagram02x1 .edge-pattern-dotted{stroke-dasharray:2;}#diagram02x1 .marker{fill:#60718a;stroke:#60718a;}#diagram02x1 .marker.cross{stroke:#60718a;}#diagram02x1 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram02x1 p{margin:0;}#diagram02x1 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram02x1 .cluster-label text{fill:#000000;}#diagram02x1 .cluster-label span{color:#000000;}#diagram02x1 .cluster-label span p{background-color:transparent;}#diagram02x1 .label text,#diagram02x1 span{fill:#17233a;color:#17233a;}#diagram02x1 .node rect,#diagram02x1 .node circle,#diagram02x1 .node ellipse,#diagram02x1 .node polygon,#diagram02x1 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram02x1 .rough-node .label text,#diagram02x1 .node .label text,#diagram02x1 .image-shape .label,#diagram02x1 .icon-shape .label{text-anchor:middle;}#diagram02x1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram02x1 .rough-node .label,#diagram02x1 .node .label,#diagram02x1 .image-shape .label,#diagram02x1 .icon-shape .label{text-align:center;}#diagram02x1 .node.clickable{cursor:pointer;}#diagram02x1 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram02x1 .arrowheadPath{fill:#0b0b0b;}#diagram02x1 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram02x1 .flowchart-link{stroke:#60718a;fill:none;}#diagram02x1 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram02x1 .edgeLabel p{background-color:#f3f8f6;}#diagram02x1 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram02x1 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram02x1 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram02x1 .cluster text{fill:#000000;}#diagram02x1 .cluster span{color:#000000;}#diagram02x1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram02x1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram02x1 rect.text{fill:none;stroke-width:0;}#diagram02x1 .icon-shape,#diagram02x1 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram02x1 .icon-shape p,#diagram02x1 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram02x1 .icon-shape rect,#diagram02x1 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram02x1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram02x1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram02x1 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}</style><g><marker id="diagram02x1_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroLine truncated

After

Width:  |  Height:  |  Size: 17 KiB

+28
View File
@@ -0,0 +1,28 @@
flowchart TB
subgraph financial["例 1:金融官网"]
financeApp["金融官网 APP"]
financeWeb["Web 与后台组件"]
financeDb["必需:数据库"]
financePvc["必需:PVC 文件存储"]
financeApp --> financeWeb
financeWeb --> financeDb
financeWeb --> financePvc
end
subgraph collecting["例 2:Web 与采集"]
collectApp["一个 APP 也可同时包含"]
collectWeb["Web 组件"]
collectWorker["worker 组件"]
sharedDb["同一数据库:显式授权共用"]
collectApp --> collectWeb
collectApp --> collectWorker
collectWeb --> sharedDb
collectWorker --> sharedDb
end
subgraph cooperation["例 3:跨项目 API"]
review["项目 A:评价网
独立 APP 和数据库"]
content["项目 B:内容中心
独立 APP 和数据库"]
content -->|"通过 API 提供数据"| review
end
financial ~~~ collecting ~~~ cooperation
Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1107" height="887" viewBox="0 0 1107 887" role="img" aria-labelledby="G02-项目组成例子Title G02-项目组成例子Desc"><title id="G02-项目组成例子Title">G02 领域概念关系 · 项目组成例子</title><desc id="G02-项目组成例子Desc">项目代表业务目标,APP 代表完整软件;组件运行软件,资源由显式绑定关联。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G02 · 项目组成例子</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 展开图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram02x2" width="1042.84375" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="715" viewBox="0 -1 1042.84375 715" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram02x2{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram02x2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram02x2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram02x2 .error-icon{fill:#ffffff;}#diagram02x2 .error-text{fill:#000000;stroke:#000000;}#diagram02x2 .edge-thickness-normal{stroke-width:1px;}#diagram02x2 .edge-thickness-thick{stroke-width:3.5px;}#diagram02x2 .edge-pattern-solid{stroke-dasharray:0;}#diagram02x2 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram02x2 .edge-pattern-dashed{stroke-dasharray:3;}#diagram02x2 .edge-pattern-dotted{stroke-dasharray:2;}#diagram02x2 .marker{fill:#60718a;stroke:#60718a;}#diagram02x2 .marker.cross{stroke:#60718a;}#diagram02x2 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram02x2 p{margin:0;}#diagram02x2 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram02x2 .cluster-label text{fill:#000000;}#diagram02x2 .cluster-label span{color:#000000;}#diagram02x2 .cluster-label span p{background-color:transparent;}#diagram02x2 .label text,#diagram02x2 span{fill:#17233a;color:#17233a;}#diagram02x2 .node rect,#diagram02x2 .node circle,#diagram02x2 .node ellipse,#diagram02x2 .node polygon,#diagram02x2 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram02x2 .rough-node .label text,#diagram02x2 .node .label text,#diagram02x2 .image-shape .label,#diagram02x2 .icon-shape .label{text-anchor:middle;}#diagram02x2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram02x2 .rough-node .label,#diagram02x2 .node .label,#diagram02x2 .image-shape .label,#diagram02x2 .icon-shape .label{text-align:center;}#diagram02x2 .node.clickable{cursor:pointer;}#diagram02x2 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram02x2 .arrowheadPath{fill:#0b0b0b;}#diagram02x2 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram02x2 .flowchart-link{stroke:#60718a;fill:none;}#diagram02x2 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram02x2 .edgeLabel p{background-color:#f3f8f6;}#diagram02x2 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram02x2 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram02x2 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram02x2 .cluster text{fill:#000000;}#diagram02x2 .cluster span{color:#000000;}#diagram02x2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram02x2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram02x2 rect.text{fill:none;stroke-width:0;}#diagram02x2 .icon-shape,#diagram02x2 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram02x2 .icon-shape p,#diagram02x2 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram02x2 .icon-shape rect,#diagram02x2 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram02x2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram02x2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram02x2 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}</style><g><marker id="diagram02x2_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dashaLine truncated

After

Width:  |  Height:  |  Size: 22 KiB

+110
View File
@@ -0,0 +1,110 @@
# G02 领域概念关系
2026-10-13 · 业务基线 0.15 · 图集版本 0.18。概念图不等于数据库 ER 图或部署架构。投影用 SVG 尚未按本次文字重绘。
**项目代表业务目标。应用指功能,例如邮箱应用。初级版本不选择组件。域名是需要购买的资源。**
![领域概念关系](G02-领域概念关系.svg)
```mermaid
flowchart TB
account["客户账户"]
grouping["项目组:可选、单层
一个项目最多属于一个组"]
project["项目:一个业务目标
稳定 ID;不依赖人工编号"]
app["应用:一项功能
例如邮箱应用"]
preset["应用预设
初级版本不让客户改选组件"]
component["运行组件:Web / API / worker
初级按预设固定;高级版本以后再选"]
resource["数据库、持久化存储等资源
明确归属与使用引用"]
service["域名资源
需要购买,不包含在应用里"]
account -->|"拥有多个"| project
project -->|"可归入一个组;不产生互通授权"| grouping
project -->|"包含"| app
preset -->|"实例化并约束配置"| app
app -->|"由组件运行"| component
component -->|"显式引用,可共享"| resource
project -->|"购买"| service
```
主图中的关系有五个边界:
- 应用指功能。邮箱应用是一种应用,不再把仅邮箱理解成零应用。初级版本不提供组件选择,Web、API、worker 按预设固定带上。高级版本以后用界面选择这个项目要不要组件。
- 域名是需要购买的资源,不包含在应用里。
- 同集群、同环境的同项目 APP 默认使用同一个 namespace;namespace 不等于数据库,也不自动授予共享权限。项目可有零到多个数据库。
- 数据库、卷、供应商实例和购买项是不同对象。数据库共享需明确引用和权限;PVC 直接引用受 namespace 约束,外部数据库用连接授权。仓库、项目、数据库与 namespace 不要求同名。
- 项目组只是客户整理工具,与后台用于定价的“价格客户组”不同。跨项目 API 协作需另外授权。
- 零引用资源进入待释放处理:移除最后一个引用时提示用户,释放前复核引用和任务;恢复引用应取消释放。三天延迟只是候选参数。独立服务不随 APP 删除自动取消。
## 工单、发布与购买项
![工单与购买项](G02-工单与购买项.svg)
```mermaid
flowchart TB
scope["项目:工单的业务范围"]
workOrder["工单属于一个项目
可修改该项目多个 APP"]
version["项目发布组合
关联涉及 APP 的代码、产物、配置版本"]
software["APP:完整软件实例"]
runtime["运行组件与配置档位"]
resources["明确归属的数据库 / 存储
可被多个组件显式引用"]
items["购买项:独立计费对象
组件资源分别计费;共享资源只计一份"]
scope --> workOrder --> version
version -->|"记录版本"| software
software -->|"由组件运行"| runtime
runtime -->|"显式引用"| resources
runtime -->|"配置费用"| items
resources -->|"对应购买项"| items
```
发布组合表达一组实际版本,不要求多个仓库拥有同一个提交号;业务范围、技术组件和购买项不应合并成一个对象。
## 三个具体例子
![项目组成例子](G02-项目组成例子.svg)
```mermaid
flowchart TB
subgraph financial["例 1:金融官网"]
financeApp["金融官网 APP"]
financeWeb["Web 与后台组件"]
financeDb["必需:数据库"]
financePvc["必需:PVC 文件存储"]
financeApp --> financeWeb
financeWeb --> financeDb
financeWeb --> financePvc
end
subgraph collecting["例 2:Web 与采集"]
collectApp["一个 APP 也可同时包含"]
collectWeb["Web 组件"]
collectWorker["worker 组件"]
sharedDb["同一数据库:显式授权共用"]
collectApp --> collectWeb
collectApp --> collectWorker
collectWeb --> sharedDb
collectWorker --> sharedDb
end
subgraph cooperation["例 3:跨项目 API"]
review["项目 A:评价网
独立 APP 和数据库"]
content["项目 B:内容中心
独立 APP 和数据库"]
content -->|"通过 API 提供数据"| review
end
financial ~~~ collecting ~~~ cooperation
```
worker 是否单独成为 APP,取决于它是否是独立软件实例,不能仅因它需要独立 Deployment 就按一个 APP 处理。纯前端应用可以不需要数据库/PVC,必需资源由具体应用预设决定。
平台自有新闻 API 是平台部署的公共应用,客户购买 API 使用权益;不为每个客户复制整套公共应用。外部 RDS、云存储及公共 API 接入的供应商和实施版本仍待讨论。
依据:[03 领域模型](../03-系统架构与领域模型.md)、[05 费用组成](../05-商业模式与成本指标.md)。[返回图集](README.md)。
+23
View File
@@ -0,0 +1,23 @@
flowchart TB
account["客户账户"]
grouping["项目组:可选、单层
一个项目最多属于一个组"]
project["项目:一个业务目标
稳定 ID;不依赖人工编号"]
app["APP:完整软件实例
项目包含 0 到多个 APP"]
preset["应用目录 / 版本预设
声明必需与可选依赖"]
component["运行组件:Web / API / worker
一个 APP 可有多个组件"]
resource["数据库、持久化存储等资源
明确归属与使用引用"]
service["独立服务:域名 / 邮箱
各自的订购与存续周期"]
account -->|"拥有多个"| project
project -->|"可归入一个组;不产生互通授权"| grouping
project -->|"包含"| app
preset -->|"实例化并约束配置"| app
app -->|"由组件运行"| component
component -->|"显式引用,可共享"| resource
project -->|"关联,可仅购买邮箱"| service
Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1062" height="1012" viewBox="0 0 1062 1012" role="img" aria-labelledby="G02-领域概念关系Title G02-领域概念关系Desc"><title id="G02-领域概念关系Title">G02 领域概念关系 · 领域概念关系</title><desc id="G02-领域概念关系Desc">项目代表业务目标,APP 代表完整软件;组件运行软件,资源由显式绑定关联。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G02 领域概念关系</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 主图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram02x0" width="997.6640625" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="840" viewBox="0 0 997.6640625 840" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram02x0{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram02x0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram02x0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram02x0 .error-icon{fill:#ffffff;}#diagram02x0 .error-text{fill:#000000;stroke:#000000;}#diagram02x0 .edge-thickness-normal{stroke-width:1px;}#diagram02x0 .edge-thickness-thick{stroke-width:3.5px;}#diagram02x0 .edge-pattern-solid{stroke-dasharray:0;}#diagram02x0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram02x0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram02x0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram02x0 .marker{fill:#60718a;stroke:#60718a;}#diagram02x0 .marker.cross{stroke:#60718a;}#diagram02x0 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram02x0 p{margin:0;}#diagram02x0 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram02x0 .cluster-label text{fill:#000000;}#diagram02x0 .cluster-label span{color:#000000;}#diagram02x0 .cluster-label span p{background-color:transparent;}#diagram02x0 .label text,#diagram02x0 span{fill:#17233a;color:#17233a;}#diagram02x0 .node rect,#diagram02x0 .node circle,#diagram02x0 .node ellipse,#diagram02x0 .node polygon,#diagram02x0 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram02x0 .rough-node .label text,#diagram02x0 .node .label text,#diagram02x0 .image-shape .label,#diagram02x0 .icon-shape .label{text-anchor:middle;}#diagram02x0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram02x0 .rough-node .label,#diagram02x0 .node .label,#diagram02x0 .image-shape .label,#diagram02x0 .icon-shape .label{text-align:center;}#diagram02x0 .node.clickable{cursor:pointer;}#diagram02x0 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram02x0 .arrowheadPath{fill:#0b0b0b;}#diagram02x0 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram02x0 .flowchart-link{stroke:#60718a;fill:none;}#diagram02x0 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram02x0 .edgeLabel p{background-color:#f3f8f6;}#diagram02x0 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram02x0 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram02x0 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram02x0 .cluster text{fill:#000000;}#diagram02x0 .cluster span{color:#000000;}#diagram02x0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram02x0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram02x0 rect.text{fill:none;stroke-width:0;}#diagram02x0 .icon-shape,#diagram02x0 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram02x0 .icon-shape p,#diagram02x0 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram02x0 .icon-shape rect,#diagram02x0 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram02x0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram02x0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram02x0 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}</style><g><marker id="diagram02x0_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharraLine truncated

After

Width:  |  Height:  |  Size: 18 KiB

+51
View File
@@ -0,0 +1,51 @@
# G03 购买与开通
2026-10-12 · 业务基线 0.14 · 图集版本 0.17。泳道按参与方分列;这是首期正式购买路径,后续新客测试赠送另见 G05。
**普通向导减少信息量,高级配置支持多 APP;购买完成后还须核验实际开通结果。**
![购买与开通](G03-购买与开通.svg)
```mermaid
sequenceDiagram
participant customer as 客户
participant platform as 平台业务
participant provisioning as 自动开通能力
participant staff as 内部人员
customer->>platform: 案例快捷建立同类项目 / 从应用目录建立项目
alt 普通向导
platform-->>customer: 单 APP:选择必需资源档位,再选择域名、邮箱等
else 高级配置
platform-->>customer: 同项目配置多个 APP、组件和资源绑定
end
customer->>platform: 确认配置,查看年付套餐和积分总价
opt 真实充值积分不足
customer->>platform: 充值到账后继续
end
customer->>platform: 确认购买并消耗真实充值积分
platform->>provisioning: 建立开通任务,按购买项分别执行
platform-->>customer: 展示正在执行、等待人工或失败等任务状态
opt 供应商账号等步骤需要人工准备
provisioning->>staff: 请求人工准备或排查
staff-->>provisioning: 更新处理结果,继续开通
end
provisioning->>provisioning: 核验应用健康和各服务实际开通结果
alt 应用已可用
provisioning-->>platform: 更新成功项与访问入口;其他服务独立显示状态
platform-->>customer: 受保护预览地址 / 已绑定的正式域名;发送成功邮件
else 开通失败或结果不明
provisioning-->>platform: 保留失败或待核查状态,避免重复开通 / 重复扣费
platform->>staff: 人工核查与修复
platform-->>customer: 显示原因与处理进度
end
```
讲解时补充:
- 应用预设始终校验必需依赖,高级模式也不能随意删除应用所需数据库等资源。仅邮箱场景只开通购买的服务。
- 案例快捷入口复制的是可交付模板选择,不是别的客户的私有代码、数据或素材。已有项目可以继续添加 APP。
- 应用、域名、邮箱分别跟踪实际结果;不能因扣款成功就称全部开通成功。供应商结果不明时先核查,再决定重试。
- 默认建站域仅用于受保护预览;正式访问可以绑定客户自有域名或平台代购域名,不要求另买第二套服务器。验证码/声明不是法律免责保证。
- 开通成功邮件发送失败应重试通知,不把健康运行的应用改成开通失败。首期无系统内退款流程,特殊情况通过人工线下处理。
依据:[02 购买与开通](../02-业务流程与产品需求.md)、[05 年付与积分](../05-商业模式与成本指标.md)。[返回图集](README.md)。
+31
View File
@@ -0,0 +1,31 @@
sequenceDiagram
participant customer as 客户
participant platform as 平台业务
participant provisioning as 自动开通能力
participant staff as 内部人员
customer->>platform: 案例快捷建立同类项目 / 从应用目录建立项目
alt 普通向导
platform-->>customer: 单 APP:选择必需资源档位,再选择域名、邮箱等
else 高级配置
platform-->>customer: 同项目配置多个 APP、组件和资源绑定
end
customer->>platform: 确认配置,查看年付套餐和积分总价
opt 真实充值积分不足
customer->>platform: 充值到账后继续
end
customer->>platform: 确认购买并消耗真实充值积分
platform->>provisioning: 建立开通任务,按购买项分别执行
platform-->>customer: 展示正在执行、等待人工或失败等任务状态
opt 供应商账号等步骤需要人工准备
provisioning->>staff: 请求人工准备或排查
staff-->>provisioning: 更新处理结果,继续开通
end
provisioning->>provisioning: 核验应用健康和各服务实际开通结果
alt 应用已可用
provisioning-->>platform: 更新成功项与访问入口;其他服务独立显示状态
platform-->>customer: 受保护预览地址 / 已绑定的正式域名;发送成功邮件
else 开通失败或结果不明
provisioning-->>platform: 保留失败或待核查状态,避免重复开通 / 重复扣费
platform->>staff: 人工核查与修复
platform-->>customer: 显示原因与处理进度
end
Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1294" height="1667" viewBox="0 0 1294 1667" role="img" aria-labelledby="G03-购买与开通Title G03-购买与开通Desc"><title id="G03-购买与开通Title">G03 购买与开通 · 购买与开通</title><desc id="G03-购买与开通Desc">普通向导减少信息量,高级配置支持多 APP;购买完成后还须核验实际开通结果。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G03 购买与开通</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 主图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram03x0" width="1230" xmlns="http://www.w3.org/2000/svg" height="1495" viewBox="-30 -20 1230 1495" role="graphics-document document" aria-roledescription="sequence"><g><line id="actor3" x1="1050" y1="65" x2="1050" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="staff"></line><g id="root-3"><rect x="930" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="staff" rx="3" ry="3" class="actor actor-top"></rect><text x="1050" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="1050" dy="0">内部人员</tspan></text></g></g><g><line id="actor2" x1="748" y1="65" x2="748" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="provisioning"></line><g id="root-2"><rect x="628" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="provisioning" rx="3" ry="3" class="actor actor-top"></rect><text x="748" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="748" dy="0">自动开通能力</tspan></text></g></g><g><line id="actor1" x1="434" y1="65" x2="434" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="platform"></line><g id="root-1"><rect x="314" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="platform" rx="3" ry="3" class="actor actor-top"></rect><text x="434" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="434" dy="0">平台业务</tspan></text></g></g><g><line id="actor0" x1="120" y1="65" x2="120" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="customer"></line><g id="root-0"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="customer" rx="3" ry="3" class="actor actor-top"></rect><text x="120" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="120" dy="0">客户</tspan></text></g></g><style>#diagram03x0{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram03x0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram03x0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram03x0 .error-icon{fill:#ffffff;}#diagram03x0 .error-text{fill:#000000;stroke:#000000;}#diagram03x0 .edge-thickness-normal{stroke-width:1px;}#diagram03x0 .edge-thickness-thick{stroke-width:3.5px;}#diagram03x0 .edge-pattern-solid{stroke-dasharray:0;}#diagram03x0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram03x0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram03x0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram03x0 .marker{fill:#60718a;stroke:#60718a;}#diagram03x0 .marker.cross{stroke:#60718a;}#diagram03x0 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram03x0 p{margin:0;}#diagram03x0 .actor{stroke:#8198bb;fill:#edf3fb;}#diagram03x0 text.actor&gt;tspan{fill:#17233a;stroke:none;}#diagram03x0 .actor-line{stroke:#8198bb;}#diagram03x0 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#diagram03x0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#334155;}#diagram03x0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#334155;}#diagram03x0 #arrowhead path{fill:#334155;stroke:#334155;}#diagram03x0 .sequenceNumber{fill:#9f8e75;}#diagram03x0 #sequencenumber{fill:#334155;}#diagram03x0 #crosshead path{fill:#334155;strLine truncated

After

Width:  |  Height:  |  Size: 32 KiB

+35
View File
@@ -0,0 +1,35 @@
flowchart LR
attempt["执行一次工单尝试
固定需求修订与执行基准"]
conditions{"满足执行条件?"}
waiting["等待资源 / 用量 / 充值
停止新调用,保留任务;已有年付服务继续"]
work["开发与内部检查
有限修复;到次数或预算上限停止"]
checked{"内部检查通过?"}
unchanged["发布前失败
保留原运行版本"]
deploy["发布涉及的 APP 组合"]
healthy{"实际运行健康?"}
success["成功回执
改动摘要、版本、预览地址"]
recover["新版无法运行
恢复此前有效版本并核验"]
restored{"恢复成功?"}
failure["失败回执
原因、当前有效版本、重试 / 人工入口"]
intervention["恢复异常:人工接管
如实显示服务故障"]
retry["同范围:新增需求修订与尝试
旧尝试结束后重试;不覆盖原件"]
attempt --> conditions
conditions -->|"否"| waiting
waiting -->|"条件补足后"| attempt
conditions -->|"是"| work --> checked
checked -->|"否"| unchanged --> failure
checked -->|"是"| deploy --> healthy
healthy -->|"是"| success
healthy -->|"否"| recover --> restored
restored -->|"是"| failure
restored -->|"否"| intervention
failure -->|"客户选择再次尝试"| retry --> attempt
Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="3685" height="751" viewBox="0 0 3685 751" role="img" aria-labelledby="G04-失败与恢复Title G04-失败与恢复Desc"><title id="G04-失败与恢复Title">G04 定制工单处理 · 失败与恢复</title><desc id="G04-失败与恢复Desc">一个工单固定一次改动需求,自动或人工执行后直接更新运行版本;人工模式增加金额确认。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G04 · 失败与恢复</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 展开图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram04x1" width="3620.390625" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="579" viewBox="0 0 3620.390625 579" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram04x1{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram04x1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram04x1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram04x1 .error-icon{fill:#ffffff;}#diagram04x1 .error-text{fill:#000000;stroke:#000000;}#diagram04x1 .edge-thickness-normal{stroke-width:1px;}#diagram04x1 .edge-thickness-thick{stroke-width:3.5px;}#diagram04x1 .edge-pattern-solid{stroke-dasharray:0;}#diagram04x1 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram04x1 .edge-pattern-dashed{stroke-dasharray:3;}#diagram04x1 .edge-pattern-dotted{stroke-dasharray:2;}#diagram04x1 .marker{fill:#60718a;stroke:#60718a;}#diagram04x1 .marker.cross{stroke:#60718a;}#diagram04x1 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram04x1 p{margin:0;}#diagram04x1 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram04x1 .cluster-label text{fill:#000000;}#diagram04x1 .cluster-label span{color:#000000;}#diagram04x1 .cluster-label span p{background-color:transparent;}#diagram04x1 .label text,#diagram04x1 span{fill:#17233a;color:#17233a;}#diagram04x1 .node rect,#diagram04x1 .node circle,#diagram04x1 .node ellipse,#diagram04x1 .node polygon,#diagram04x1 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram04x1 .rough-node .label text,#diagram04x1 .node .label text,#diagram04x1 .image-shape .label,#diagram04x1 .icon-shape .label{text-anchor:middle;}#diagram04x1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram04x1 .rough-node .label,#diagram04x1 .node .label,#diagram04x1 .image-shape .label,#diagram04x1 .icon-shape .label{text-align:center;}#diagram04x1 .node.clickable{cursor:pointer;}#diagram04x1 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram04x1 .arrowheadPath{fill:#0b0b0b;}#diagram04x1 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram04x1 .flowchart-link{stroke:#60718a;fill:none;}#diagram04x1 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram04x1 .edgeLabel p{background-color:#f3f8f6;}#diagram04x1 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram04x1 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram04x1 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram04x1 .cluster text{fill:#000000;}#diagram04x1 .cluster span{color:#000000;}#diagram04x1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram04x1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram04x1 rect.text{fill:none;stroke-width:0;}#diagram04x1 .icon-shape,#diagram04x1 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram04x1 .icon-shape p,#diagram04x1 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram04x1 .icon-shape rect,#diagram04x1 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram04x1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram04x1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram04x1 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}</style><g><marker id="diagram04x1_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-daLine truncated

After

Width:  |  Height:  |  Size: 30 KiB

+101
View File
@@ -0,0 +1,101 @@
# G04 定制工单处理
2026-10-13 · 业务基线 0.15 · 图集文字 0.18。主图文字已加入 AI 验收;失败达到 x 次才转人工。x 未定。投影用 SVG 尚未重绘。执行器、Git 服务及实现参数尚未选择。
**一个工单固定一次改动需求,自动或人工执行后直接更新运行版本;人工模式增加金额确认。**
![定制工单主流程](G04-定制工单处理.svg)
```mermaid
sequenceDiagram
participant customer as 客户
participant ticket as 平台工单
participant ai as AI 执行能力
participant human as 人工团队
participant publish as 发布与运行核验
customer->>ticket: 单项目提交文字与附件,选择自动或人工
ticket->>ticket: 固定需求修订;核对执行基准、权限及费用条件
alt 自动模式
ticket->>ai: 执行需求分析与开发;每次真实 AI 调用均计消耗
ai->>ai: AI 验收;未通过则修改后再验收
alt 验收通过
ai-->>ticket: 合格改动成果
else 验收失败达到 x 次
ai-->>ticket: 此时才转原工单人工模式,保留需求、成果和消耗
end
end
opt 人工模式,包括由自动模式转入
ticket->>human: 内部评估并设置本次人工服务金额
human-->>ticket: 提交报价
ticket-->>customer: 系统提示金额:同意 / 拒绝
alt 同意且满足消费条件
customer->>ticket: 确认报价
ticket->>human: 执行开发与验证;真实 AI 辅助同样计消耗
human-->>ticket: 合格改动成果 / 失败原因
else 拒绝或未满足消费条件
ticket-->>customer: 拒绝则停止改动;缺少消费条件则等待,不停已有服务
end
end
opt 已产生合格成果且允许发布
ticket->>publish: 发布涉及的 APP 版本,核验实际运行
publish-->>ticket: 实际发布 / 健康 / 恢复结果
ticket-->>customer: 成功摘要、版本和预览地址;或失败原因与下一步
end
```
2026-10-13 会上补充:自动路径里,转人工之前先做 AI 验收。验收失败未达到 x 次时继续修改并再次验收;达到 x 次才转入原工单人工模式。x 的具体次数未定。这里的 AI 验收不是客户逐次验收后才允许上线。
自动开发失败未产生合格成果时,也必须在工单写入失败回执;详见下面的异常图。验收失败次数用尽后走转人工,不把未达次数的一次失败直接当成已经转人工。
## 失败、恢复与再试
![失败与恢复](G04-失败与恢复.svg)
```mermaid
flowchart LR
attempt["执行一次工单尝试
固定需求修订与执行基准"]
conditions{"满足执行条件?"}
waiting["等待资源 / 用量 / 充值
停止新调用,保留任务;已有年付服务继续"]
work["开发与内部检查
有限修复;到次数或预算上限停止"]
checked{"内部检查通过?"}
unchanged["发布前失败
保留原运行版本"]
deploy["发布涉及的 APP 组合"]
healthy{"实际运行健康?"}
success["成功回执
改动摘要、版本、预览地址"]
recover["新版无法运行
恢复此前有效版本并核验"]
restored{"恢复成功?"}
failure["失败回执
原因、当前有效版本、重试 / 人工入口"]
intervention["恢复异常:人工接管
如实显示服务故障"]
retry["同范围:新增需求修订与尝试
旧尝试结束后重试;不覆盖原件"]
attempt --> conditions
conditions -->|"否"| waiting
waiting -->|"条件补足后"| attempt
conditions -->|"是"| work --> checked
checked -->|"否"| unchanged --> failure
checked -->|"是"| deploy --> healthy
healthy -->|"是"| success
healthy -->|"否"| recover --> restored
restored -->|"是"| failure
restored -->|"否"| intervention
failure -->|"客户选择再次尝试"| retry --> attempt
```
必须保留的规则:
- 项目创建后可提交工单,实际执行要等必要应用/基准与消费条件满足。还没初始版本时,不能虚构“修改前版本”。
- 一个工单只涉及一个项目,但可修改多个 APP。跨项目分别提交;多个 APP 发布不天然原子完成,部分失败的恢复策略由技术设计落实。
- 客服/TG 负责沟通、协商及反馈。工单保存需求原件、追加修订、尝试、系统回执和工程关联;新增业务范围或方向另开工单。
- 所有实际项目 AI 调用,包括分析、失败、修复、转人工及人工辅助,都先消耗套餐内含 AI 用量,超额扣真实积分。回退不撤销真实消耗;同一调用不得重复计费。见 [G05](G05-收费与权益.md)。
- 平台工单为业务主记录,Git Issue/PR/提交是工程关联。引擎返回成功、Issue 关闭或代码提交不等于线上健康。
- 默认代码回退保留业务数据并检查兼容性。涉及数据库/文件数据恢复时使用保护检查点并提示丢失新增数据风险,不把每次普通改动都画成整库回滚;实现与保留参数待技术评审。
依据:[02 工单流程](../02-业务流程与产品需求.md)、[03 发布与恢复](../03-系统架构与领域模型.md)、[04 工作流草案](../04-模板与AI工作流.md)、[05 消耗规则](../05-商业模式与成本指标.md)。[返回图集](README.md)。
+34
View File
@@ -0,0 +1,34 @@
sequenceDiagram
participant customer as 客户
participant ticket as 平台工单
participant ai as AI 执行能力
participant human as 人工团队
participant publish as 发布与运行核验
customer->>ticket: 单项目提交文字与附件,选择自动或人工
ticket->>ticket: 固定需求修订;核对执行基准、权限及费用条件
alt 自动模式
ticket->>ai: 执行需求分析;每次真实 AI 调用均计消耗
alt 适合自动处理
ai->>ai: 开发与内部验收;预算内有限修复
ai-->>ticket: 合格改动成果 / 失败原因
else 判断需要人工
ai-->>ticket: 转原工单人工模式,保留需求、成果和消耗
end
end
opt 人工模式,包括由自动模式转入
ticket->>human: 内部评估并设置本次人工服务金额
human-->>ticket: 提交报价
ticket-->>customer: 系统提示金额:同意 / 拒绝
alt 同意且满足消费条件
customer->>ticket: 确认报价
ticket->>human: 执行开发与验证;真实 AI 辅助同样计消耗
human-->>ticket: 合格改动成果 / 失败原因
else 拒绝或未满足消费条件
ticket-->>customer: 拒绝则停止改动;缺少消费条件则等待,不停已有服务
end
end
opt 已产生合格成果且允许发布
ticket->>publish: 发布涉及的 APP 版本,核验实际运行
publish-->>ticket: 实际发布 / 健康 / 恢复结果
ticket-->>customer: 成功摘要、版本和预览地址;或失败原因与下一步
end
Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1596" height="1744" viewBox="0 0 1596 1744" role="img" aria-labelledby="G04-定制工单处理Title G04-定制工单处理Desc"><title id="G04-定制工单处理Title">G04 定制工单处理 · 定制工单主流程</title><desc id="G04-定制工单处理Desc">一个工单固定一次改动需求,自动或人工执行后直接更新运行版本;人工模式增加金额确认。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G04 定制工单处理</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 主图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram04x0" width="1532" xmlns="http://www.w3.org/2000/svg" height="1572" viewBox="-30 -20 1532 1572" role="graphics-document document" aria-roledescription="sequence"><g><line id="actor8" x1="1352" y1="65" x2="1352" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="publish"></line><g id="root-8"><rect x="1232" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="publish" rx="3" ry="3" class="actor actor-top"></rect><text x="1352" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="1352" dy="0">发布与运行核验</tspan></text></g></g><g><line id="actor7" x1="1050" y1="65" x2="1050" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="human"></line><g id="root-7"><rect x="930" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="human" rx="3" ry="3" class="actor actor-top"></rect><text x="1050" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="1050" dy="0">人工团队</tspan></text></g></g><g><line id="actor6" x1="748" y1="65" x2="748" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="ai"></line><g id="root-6"><rect x="628" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="ai" rx="3" ry="3" class="actor actor-top"></rect><text x="748" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="748" dy="0">AI 执行能力</tspan></text></g></g><g><line id="actor5" x1="434" y1="65" x2="434" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="ticket"></line><g id="root-5"><rect x="314" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="ticket" rx="3" ry="3" class="actor actor-top"></rect><text x="434" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="434" dy="0">平台工单</tspan></text></g></g><g><line id="actor4" x1="120" y1="65" x2="120" y2="2000" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="customer"></line><g id="root-4"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="240" height="65" name="customer" rx="3" ry="3" class="actor actor-top"></rect><text x="120" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Microsoft YaHei&quot;, Arial, sans-serif;"><tspan x="120" dy="0">客户</tspan></text></g></g><style>#diagram04x0{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram04x0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram04x0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram04x0 .error-icon{fill:#ffffff;}#diagram04x0 .error-text{fill:#000000;stroke:#000000;}#diagram04x0 .edge-thickness-normal{stroke-width:1px;}#diagram04x0 .edge-thickness-thick{stroke-width:3.5px;}#diagram04x0 .edge-pattern-solid{stroke-dasharray:0;}#diagram04x0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram04x0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram04x0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram04x0 .marker{fill:#60718a;stroke:#60718a;}#diagram04x0 .marker.cross{stroke:#60718a;}#diagram04x0 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-sLine truncated

After

Width:  |  Height:  |  Size: 33 KiB

+20
View File
@@ -0,0 +1,20 @@
flowchart LR
aiCall["一次真实项目 AI 调用
自动 / 人工辅助 / 失败 / 修复 / 转人工"]
cost["核对供应商实际消耗成本
记录调用与计费规则,防重复记账"]
allowance{"套餐内含 AI 用量可抵扣?"}
deduct["抵扣套餐内含用量"]
excess["剩余超额部分
按成本、可配置加价及积分汇率结算"]
example["例:全部属于超额
成本 1 USD × 1.20 × 100 = 120 积分"]
gate["下一次调用前检查预算 / 权益
不足则停止新调用并提示充值"]
aiCall --> cost --> allowance
allowance -->|"有"| deduct
deduct -->|"如有超额部分"| excess
allowance -->|"无"| excess
excess --> example
deduct --> gate
excess --> gate
Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2569" height="486" viewBox="0 0 2569 486" role="img" aria-labelledby="G05-AI消耗记账Title G05-AI消耗记账Desc"><title id="G05-AI消耗记账Title">G05 收费与权益 · AI 实际消耗记账</title><desc id="G05-AI消耗记账Desc">真实充值、套餐内含 AI 用量、未来测试赠送是三类不同权益;年付服务与 AI 实际消耗分开计量。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G05 · AI 实际消耗记账</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 展开图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram05x1" width="2504.796875" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="313.796875" viewBox="0 0 2504.796875 313.796875" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram05x1{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram05x1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram05x1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram05x1 .error-icon{fill:#ffffff;}#diagram05x1 .error-text{fill:#000000;stroke:#000000;}#diagram05x1 .edge-thickness-normal{stroke-width:1px;}#diagram05x1 .edge-thickness-thick{stroke-width:3.5px;}#diagram05x1 .edge-pattern-solid{stroke-dasharray:0;}#diagram05x1 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram05x1 .edge-pattern-dashed{stroke-dasharray:3;}#diagram05x1 .edge-pattern-dotted{stroke-dasharray:2;}#diagram05x1 .marker{fill:#60718a;stroke:#60718a;}#diagram05x1 .marker.cross{stroke:#60718a;}#diagram05x1 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram05x1 p{margin:0;}#diagram05x1 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram05x1 .cluster-label text{fill:#000000;}#diagram05x1 .cluster-label span{color:#000000;}#diagram05x1 .cluster-label span p{background-color:transparent;}#diagram05x1 .label text,#diagram05x1 span{fill:#17233a;color:#17233a;}#diagram05x1 .node rect,#diagram05x1 .node circle,#diagram05x1 .node ellipse,#diagram05x1 .node polygon,#diagram05x1 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram05x1 .rough-node .label text,#diagram05x1 .node .label text,#diagram05x1 .image-shape .label,#diagram05x1 .icon-shape .label{text-anchor:middle;}#diagram05x1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram05x1 .rough-node .label,#diagram05x1 .node .label,#diagram05x1 .image-shape .label,#diagram05x1 .icon-shape .label{text-align:center;}#diagram05x1 .node.clickable{cursor:pointer;}#diagram05x1 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram05x1 .arrowheadPath{fill:#0b0b0b;}#diagram05x1 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram05x1 .flowchart-link{stroke:#60718a;fill:none;}#diagram05x1 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram05x1 .edgeLabel p{background-color:#f3f8f6;}#diagram05x1 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram05x1 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram05x1 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram05x1 .cluster text{fill:#000000;}#diagram05x1 .cluster span{color:#000000;}#diagram05x1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram05x1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram05x1 rect.text{fill:none;stroke-width:0;}#diagram05x1 .icon-shape,#diagram05x1 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram05x1 .icon-shape p,#diagram05x1 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram05x1 .icon-shape rect,#diagram05x1 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram05x1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram05x1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram05x1 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}</style><g><marker id="diagram05x1_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stLine truncated

After

Width:  |  Height:  |  Size: 18 KiB

+98
View File
@@ -0,0 +1,98 @@
# G05 收费与权益
2026-10-13 · 业务基线 0.15 · 图集版本 0.18。投影用 SVG 尚未按本次文字重绘。
**计费按客户使用不同模式。暂时只记用户报价模式和用户自由模式。下面原图是改模式之前的年付与积分基线,两种模式如何衔接尚未写完。**
```mermaid
flowchart LR
customer["不同客户使用不同模式"]
quote["用户报价模式
创建时选择并报价
后台查看后决定是否启动"]
free["用户自由模式
自选配置和 token 数量
从预充值扣除"]
customer --> quote
customer --> free
```
2026-10-12 原图仍保留作对照:真实充值、套餐内含 AI 用量、未来测试赠送是三类不同权益。
![收费与权益](G05-收费与权益.svg)
```mermaid
flowchart TB
recharge["客户真实充值
默认 1 USD = 100 积分;允许小数"]
paid["真实充值积分余额"]
annual["正式年付套餐
可包含初始开发、运维、运行资源"]
independent["独立选配年度服务
域名:成本加服务费
邮箱:共享 / 独享"]
manual["新增人工定制服务
评估金额,客户确认后消费"]
included["套餐内含 AI 用量
正式项目可用;不是测试赠送"]
usage["真实项目 AI 消耗
先用内含用量,超额扣真实积分"]
trial["后续:新客测试赠送权益
独立记录,不可转真实余额"]
preview["仅测试部署与受保护预览
禁正式域名;可撤销和销毁"]
pricing["后台可配置价格政策
档位、费率、账户固定服务费、内含用量"]
recharge --> paid
paid -->|"购买"| annual
paid -->|"购买"| independent
paid -->|"确认金额后支付"| manual
annual -->|"授予"| included
included -->|"优先抵扣"| usage
paid -->|"只支付超出包含用量的部分"| usage
trial -.->|"仅限"| preview
pricing --- annual
pricing --- independent
pricing --- manual
pricing --- usage
classDef future fill:#f4f4f5,stroke:#71717a,stroke-dasharray:5 4;
class trial,preview future;
```
## AI 调用如何记账
![AI 实际消耗记账](G05-AI消耗记账.svg)
```mermaid
flowchart LR
aiCall["一次真实项目 AI 调用
自动 / 人工辅助 / 失败 / 修复 / 转人工"]
cost["核对供应商实际消耗成本
记录调用与计费规则,防重复记账"]
allowance{"套餐内含 AI 用量可抵扣?"}
deduct["抵扣套餐内含用量"]
excess["剩余超额部分
按成本、可配置加价及积分汇率结算"]
example["例:全部属于超额
成本 1 USD × 1.20 × 100 = 120 积分"]
gate["下一次调用前检查预算 / 权益
不足则停止新调用并提示充值"]
aiCall --> cost --> allowance
allowance -->|"有"| deduct
deduct -->|"如有超额部分"| excess
allowance -->|"无"| excess
excess --> example
deduct --> gate
excess --> gate
```
会议说明:
- 熟客账户可配置固定项目服务费,与正常套餐/选配合计匹配既有合作价。套餐可含初始开发,不能理解为只卖计算资源,也不等于所有未来开发免费。
- 包含用量可以覆盖部分 AI 消耗;只对剩余超额结算。实际成本按供应商模型用量核对,不用“普通 token 总数”统一单价,不以客户满意或产出文件数作为计费依据。
- 人工服务金额与超额 AI 消耗分别展示。同一项 AI 费用不得重复包含/另扣;没有 AI 调用的固定运维不能凭空收费为 token。
- 域名、邮箱按独立年度服务计算;共享数据库/存储只记一份购买项。共享邮箱池与独享账号的成本、容量及人工准备方式不同,具体价目在后台配置。
- 首期年付,不建系统内退款或按月提前退役退款;退役释放运行数据资源但保留代码/启动配置,不退年费。特殊差额线下处理。年付运行权益不会因为 AI 余额不足而中途停止。
- 未来测试赠送只能测试预览,**不能支付正式套餐、购买域名/邮箱、绑定正式域名或兑换真实积分**。平台可销毁试用资源;授予额度、期限与反滥用细则不属于本轮定案。
依据:[05 商业模式](../05-商业模式与成本指标.md)、[07 决策 D073–D080](../07-待确认问题与决策记录.md)。Mermaid 用法参考 [官方文档](https://mermaid.js.org/config/usage.html)。[返回图集](README.md)。
+35
View File
@@ -0,0 +1,35 @@
flowchart TB
recharge["客户真实充值
默认 1 USD = 100 积分;允许小数"]
paid["真实充值积分余额"]
annual["正式年付套餐
可包含初始开发、运维、运行资源"]
independent["独立选配年度服务
域名:成本加服务费
邮箱:共享 / 独享"]
manual["新增人工定制服务
评估金额,客户确认后消费"]
included["套餐内含 AI 用量
正式项目可用;不是测试赠送"]
usage["真实项目 AI 消耗
先用内含用量,超额扣真实积分"]
trial["后续:新客测试赠送权益
独立记录,不可转真实余额"]
preview["仅测试部署与受保护预览
禁正式域名;可撤销和销毁"]
pricing["后台可配置价格政策
档位、费率、账户固定服务费、内含用量"]
recharge --> paid
paid -->|"购买"| annual
paid -->|"购买"| independent
paid -->|"确认金额后支付"| manual
annual -->|"授予"| included
included -->|"优先抵扣"| usage
paid -->|"只支付超出包含用量的部分"| usage
trial -.->|"仅限"| preview
pricing --- annual
pricing --- independent
pricing --- manual
pricing --- usage
classDef future fill:#f4f4f5,stroke:#71717a,stroke-dasharray:5 4;
class trial,preview future;
Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1465" height="1132" viewBox="0 0 1465 1132" role="img" aria-labelledby="G05-收费与权益Title G05-收费与权益Desc"><title id="G05-收费与权益Title">G05 收费与权益 · 收费与权益</title><desc id="G05-收费与权益Desc">真实充值、套餐内含 AI 用量、未来测试赠送是三类不同权益;年付服务与 AI 实际消耗分开计量。;2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">G05 收费与权益</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · 主图 · 技术选型未定</text><g transform="translate(32,124)"><svg id="diagram05x0" width="1400.75" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="960" viewBox="0 0 1400.75 960" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#diagram05x0{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;fill:#17233a;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram05x0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram05x0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram05x0 .error-icon{fill:#ffffff;}#diagram05x0 .error-text{fill:#000000;stroke:#000000;}#diagram05x0 .edge-thickness-normal{stroke-width:1px;}#diagram05x0 .edge-thickness-thick{stroke-width:3.5px;}#diagram05x0 .edge-pattern-solid{stroke-dasharray:0;}#diagram05x0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram05x0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram05x0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram05x0 .marker{fill:#60718a;stroke:#60718a;}#diagram05x0 .marker.cross{stroke:#60718a;}#diagram05x0 svg{font-family:Microsoft YaHei,Arial,sans-serif;font-size:20px;}#diagram05x0 p{margin:0;}#diagram05x0 .label{font-family:Microsoft YaHei,Arial,sans-serif;color:#17233a;}#diagram05x0 .cluster-label text{fill:#000000;}#diagram05x0 .cluster-label span{color:#000000;}#diagram05x0 .cluster-label span p{background-color:transparent;}#diagram05x0 .label text,#diagram05x0 span{fill:#17233a;color:#17233a;}#diagram05x0 .node rect,#diagram05x0 .node circle,#diagram05x0 .node ellipse,#diagram05x0 .node polygon,#diagram05x0 .node path{fill:#eef5ff;stroke:#8198bb;stroke-width:1px;}#diagram05x0 .rough-node .label text,#diagram05x0 .node .label text,#diagram05x0 .image-shape .label,#diagram05x0 .icon-shape .label{text-anchor:middle;}#diagram05x0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram05x0 .rough-node .label,#diagram05x0 .node .label,#diagram05x0 .image-shape .label,#diagram05x0 .icon-shape .label{text-align:center;}#diagram05x0 .node.clickable{cursor:pointer;}#diagram05x0 .root .anchor path{fill:#60718a!important;stroke-width:0;stroke:#60718a;}#diagram05x0 .arrowheadPath{fill:#0b0b0b;}#diagram05x0 .edgePath .path{stroke:#60718a;stroke-width:2.0px;}#diagram05x0 .flowchart-link{stroke:#60718a;fill:none;}#diagram05x0 .edgeLabel{background-color:#f3f8f6;text-align:center;}#diagram05x0 .edgeLabel p{background-color:#f3f8f6;}#diagram05x0 .edgeLabel rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram05x0 .labelBkg{background-color:rgba(243, 248, 246, 0.5);}#diagram05x0 .cluster rect{fill:#f8fafc;stroke:#cbd5e1;stroke-width:1px;}#diagram05x0 .cluster text{fill:#000000;}#diagram05x0 .cluster span{color:#000000;}#diagram05x0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:Microsoft YaHei,Arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#diagram05x0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#17233a;}#diagram05x0 rect.text{fill:none;stroke-width:0;}#diagram05x0 .icon-shape,#diagram05x0 .image-shape{background-color:#f3f8f6;text-align:center;}#diagram05x0 .icon-shape p,#diagram05x0 .image-shape p{background-color:#f3f8f6;padding:2px;}#diagram05x0 .icon-shape rect,#diagram05x0 .image-shape rect{opacity:0.5;background-color:#f3f8f6;fill:#f3f8f6;}#diagram05x0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram05x0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram05x0 :root{--mermaid-font-family:Microsoft YaHei,Arial,sans-serif;}#diagram05x0 .future rect{fill:#f4f4f5!important;stroke:#71717a!important;stroke-dasharray:5 4!important;}#diagram05x0 .future polygon{fill:#f4f4f5!important;stroke:#71717a!important;stroke-dasharray:5 4!important;}#diagram05x0 .future ellipse{fill:#f4f4f5!important;stroke:#71717a!important;stroke-Line truncated

After

Width:  |  Height:  |  Size: 24 KiB

+32
View File
@@ -0,0 +1,32 @@
# G01–G05 产品会议图集
2026-10-13 · 业务基线 0.15 · 目录协作版本 0.18。
**可编辑 Markdown 已按 D085–D088 改过。离线会议图集里的 SVG 仍是 2026-10-12 的图,和文字不一致的地方以 Markdown 为准。** 打开 [离线会议图集](G01-G05-会议图集.html) 时请配合各图 Markdown 的补充说明。
| 图号 | 表达的结论 | 可编辑 Markdown |
| --- | --- | --- |
| G01 | 销售应用技术封装和定制能力,基础服务支持交付与成本覆盖 | [产品业务全景](G01-产品业务全景.md) |
| G02 | 项目、APP、组件、资源和服务分开建模,通过显式关系关联 | [领域概念关系](G02-领域概念关系.md) |
| G03 | 普通向导与高级配置分开,扣款后跟踪实际开通结果 | [购买与开通](G03-购买与开通.md) |
| G04 | 明确需求的单项目工单,自动/人工接续,核验后直接更新运行版本 | [定制工单处理](G04-定制工单处理.md) |
| G05 | 年付、真实积分、套餐内含 AI 和测试赠送按不同规则消费 | [收费与权益](G05-收费与权益.md) |
这五个主题足以说明当前产品概念,不能替代全部正文。G06 生命周期、G07 首期边界、G08 数据流仍在 [图表计划](../10-会议图表与可视化计划.md)中,尚未生成;数据库、执行器和部署技术架构也未定案。
## 阅读、分享与修改
- `.md` 是唯一编辑源:含 Mermaid 代码块、图形预览、业务边界和依据。支持 Mermaid 的 Markdown 阅读器可直接渲染代码块;不支持时仍可阅读文字及已导出的图形。
- `.svg` 是可缩放展示图,`.png` 适合插入会议材料;`.mmd` 是从 Markdown 提取的绘图源,避免另行修改导致两份内容不一致。
- 主图之外,G02 有工单/费用关系与三个项目例子,G04 有失败/恢复,G05 有实际 AI 消耗记账。需要时展开,不要求第一遍逐个解释。
- 实线表达确认关系;虚线框/线和“后续 / 待定”文字表示未来或候选。泳道中的虚线返回箭头表示结果反馈,不表示该流程未确认。不可只凭颜色判断状态。
- 图中模块是业务能力,概念关系不是数据库表关系;年度套餐、默认积分汇率等也不是已经实施的系统。发现图与正文差异,应按人类决定核查并同步修订。
- 给同事发送整个 `ai-web-delivery` 目录,保留规范、源文档、07/08 和交接记录;不要只发 PNG。新 AI 从上级 README/AGENTS 恢复,随后读取本图集。
## 重新生成
修改 `.md` 中 Mermaid 代码后,使用 `render-diagrams.cjs` 重新生成展示文件;需要 Node.js、Playwright 与 Chromium 浏览器。脚本默认使用本机已存在的运行依赖和 Edge,可用 `DIAGRAM_NODE_MODULES`、`DIAGRAM_BROWSER` 指定其他电脑的依赖/浏览器绝对路径。缺少渲染依赖只影响重新导出,不影响阅读 Markdown 和现有离线图集。
渲染器固定 Mermaid 11.12.0;首次重绘会下载该版本的官方 npm 分发文件至 `.render-cache`。缓存和检查截图不是业务资料,可不随目录移交。`render-manifest.json` 记录图集版本与实际导出尺寸;业务/格式校验及摘要见 [H0003](../handoffs/H0003-2026-10-12-G01至G05会议图集.md)。
[返回项目入口](../README.md) · [当前讨论状态](../08-当前讨论状态.md)
+93
View File
@@ -0,0 +1,93 @@
const fs = require('node:fs');
const path = require('node:path');
// 文档是唯一编辑源;本脚本只生成图集和展示文件。
const root = __dirname;
const bundlePackages = process.env.DIAGRAM_NODE_MODULES || 'C:/Users/mk/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules';
const { chromium } = require(path.join(bundlePackages, 'playwright'));
const escapeHtml = text => text.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;');
const files = fs.readdirSync(root).filter(name => /^G0[1-5]-.+\.md$/.test(name)).sort();
async function main() {
const cache = path.join(root, '.render-cache');
fs.mkdirSync(cache, { recursive: true });
const library = path.join(cache, 'mermaid-11.12.0.min.js');
if (!fs.existsSync(library)) {
const response = await fetch('https://cdn.jsdelivr.net/npm/[email protected]/dist/mermaid.min.js');
if (!response.ok) throw new Error(`Mermaid download: ${response.status}`);
fs.writeFileSync(library, await response.text());
}
const executablePath = process.env.DIAGRAM_BROWSER || 'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe';
const browser = await chromium.launch({ executablePath, headless: true });
const page = await browser.newPage({ viewport: { width: 1800, height: 1200 }, deviceScaleFactor: 1.5 });
await page.setContent('<!doctype html><html lang="zh-CN"><meta charset="utf-8"><style>body{margin:0;font-family:"Microsoft YaHei",sans-serif}#canvas{background:white}svg{display:block}</style><div id="canvas"></div></html>');
await page.addScriptTag({ path: library });
await page.evaluate(() => mermaid.initialize({
startOnLoad: false, securityLevel: 'strict', theme: 'base',
fontFamily: 'Microsoft YaHei, Arial, sans-serif',
themeVariables: {
fontSize: '20px', primaryColor: '#eef5ff', primaryTextColor: '#17233a', primaryBorderColor: '#8198bb',
lineColor: '#60718a', secondaryColor: '#f3f8f6', tertiaryColor: '#ffffff',
clusterBkg: '#f8fafc', clusterBorder: '#cbd5e1', actorBkg: '#edf3fb', actorBorder: '#8198bb',
actorTextColor: '#17233a', signalColor: '#334155', signalTextColor: '#17233a',
labelBoxBkgColor: '#f3f6fa', labelBoxBorderColor: '#9aabc1', labelTextColor: '#17233a',
loopTextColor: '#17233a', noteBkgColor: '#fffbea', noteBorderColor: '#d4c79f', noteTextColor: '#17233a'
},
flowchart: { htmlLabels: false, useMaxWidth: false, nodeSpacing: 32, rankSpacing: 58, padding: 18, wrappingWidth: 310, curve: 'basis' },
sequence: { useMaxWidth: false, wrap: true, width: 240, actorMargin: 62, diagramMarginX: 30, diagramMarginY: 20, messageMargin: 40, boxMargin: 14, mirrorActors: false }
}));
const manifest = [];
for (const file of files) {
const md = fs.readFileSync(path.join(root, file), 'utf8');
const title = md.match(/^# (.+)$/m)[1];
const conclusion = md.match(/^\*\*(.+)\*\*$/m)[1];
const sources = [...md.matchAll(/```mermaid\r?\n([\s\S]+?)\r?\n```/g)];
const images = [...md.matchAll(/!\[([^\]]+)\]\(([^)]+)\.svg\)/g)];
if (sources.length !== images.length) throw new Error(`${file}: sources and images differ`);
const diagrams = [];
for (let index = 0; index < sources.length; index++) {
const name = images[index][2];
const source = sources[index][1];
fs.writeFileSync(path.join(root, `${name}.mmd`), source + '\n');
const rendered = await page.evaluate(async ({ source, id }) => {
const { svg } = await mermaid.render(id, source);
document.getElementById('canvas').innerHTML = svg;
const element = document.querySelector('#canvas svg');
const view = element.viewBox.baseVal;
return { svg, width: view.width, height: view.height };
}, { source, id: `diagram${file.slice(1, 3)}x${index}` });
if (!rendered.width || !rendered.height || /Syntax error/.test(rendered.svg)) throw new Error(`${name}: invalid render`);
const header = 124;
const width = Math.max(1000, Math.ceil(rendered.width + 64));
const height = Math.ceil(rendered.height + header + 48);
const wrapped = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img" aria-labelledby="${name}Title ${name}Desc"><title id="${name}Title">${escapeHtml(title)} · ${escapeHtml(images[index][1])}</title><desc id="${name}Desc">${escapeHtml(conclusion)};2026-10-12,业务基线 0.14,图集版本 0.17</desc><rect width="100%" height="100%" fill="#fff"/><text x="32" y="42" font-family="Microsoft YaHei,Arial,sans-serif" font-size="28" font-weight="600" fill="#17233a">${escapeHtml(index ? `${title.slice(0, 3)} · ${images[index][1]}` : title)}</text><text x="32" y="79" font-family="Microsoft YaHei,Arial,sans-serif" font-size="18" fill="#526176">2026-10-12 · 业务基线 0.14 · 图集 0.17 · ${index ? '展开图' : '主图'} · 技术选型未定</text><g transform="translate(${Math.round((width - rendered.width) / 2)},${header})">${rendered.svg}</g></svg>`;
fs.writeFileSync(path.join(root, `${name}.svg`), wrapped);
await page.evaluate(svg => { document.getElementById('canvas').innerHTML = svg; }, wrapped);
const scale = Math.min(1, 2200 / width);
await page.evaluate(({ width, height }) => {
const svg = document.querySelector('#canvas > svg');
svg.style.width = `${width}px`;
svg.style.height = `${height}px`;
document.getElementById('canvas').style.width = `${width}px`;
}, { width: Math.ceil(width * scale), height: Math.ceil(height * scale) });
await page.locator('#canvas').screenshot({ path: path.join(root, `${name}.png`) });
diagrams.push({ name, label: images[index][1], width, height, svg: wrapped });
console.log(`${name}: ${width}x${height}`);
}
manifest.push({ file, title, conclusion, diagrams });
}
const menu = manifest.map((entry, index) => `<button type="button" data-index="${index}" aria-pressed="${index === 0}">${escapeHtml(entry.title)}</button>`).join('');
const panels = manifest.map((entry, index) => `<section id="panel${index}" ${index ? 'hidden' : ''}><h1>${escapeHtml(entry.title)}</h1><p class="lead">${escapeHtml(entry.conclusion)}</p><p class="links"><a href="${escapeHtml(entry.file)}">阅读 Markdown 与编辑源</a>${entry.diagrams.map(graph => ` · <a href="${escapeHtml(graph.name)}.svg">${escapeHtml(graph.label)} SVG</a> · <a href="${escapeHtml(graph.name)}.png">PNG</a>`).join('')}</p>${entry.diagrams.map(graph => `<article><h2>${escapeHtml(graph.label)}</h2><div class="diagram">${graph.svg}</div></article>`).join('')}</section>`).join('');
const html = `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>AI 软件交付平台 · G01–G05 会议图集</title><style>
*{box-sizing:border-box}body{margin:0;background:#f2f5fa;color:#17233a;font-family:"Microsoft YaHei",Arial,sans-serif;font-size:16px}header{background:#fff;padding:20px 28px;border-bottom:1px solid #dce3ed}header p{margin:4px 0;color:#526176}nav{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}button{font:inherit;border:1px solid #cbd5e1;border-radius:6px;background:#fff;padding:10px 14px;color:#17233a;cursor:pointer}button[aria-pressed=true]{background:#253f6b;color:#fff;border-color:#253f6b}main{padding:24px 28px}h1{font-size:28px;margin:0 0 12px}h2{font-size:19px;margin:0 0 12px}.lead{line-height:1.8;margin:0 0 10px}.links{font-size:14px;line-height:1.8}a{color:#245b98}article{background:white;border-radius:8px;padding:20px;margin:20px 0;border:1px solid #dce3ed}.diagram{overflow:auto}.diagram>svg{width:100%;height:auto;min-width:1000px;display:block}footer{color:#526176;font-size:14px;line-height:1.8;margin-top:20px}@media(max-width:700px){header,main{padding:16px}article{padding:12px}h1{font-size:24px}}@media print{nav,header,.links{display:none}body,main{background:white;padding:0}section[hidden]{display:block!important}article{break-inside:avoid;page-break-after:always;border:0;padding:0}.diagram{overflow:visible}.diagram>svg{min-width:0}footer{display:none}}
</style></head><body><header><strong>AI 软件交付与持续服务平台 · 会议图集</strong><p>G01–G05 · 2026-10-12 · 业务基线 0.14 · 图集 0.17</p><nav aria-label="选择图表">${menu}</nav></header><main>${panels}<footer>虚线及“后续 / 待定”文字表示目标能力或候选,不代表首期承诺。图表达业务与概念,技术架构未定案。完整规则及图内省略的分支请查看对应 Markdown;附图用于会中展开。此图集已内嵌图形,可离线打开。</footer></main><script>document.querySelectorAll('nav button').forEach(button=>button.addEventListener('click',()=>{document.querySelectorAll('nav button').forEach(peer=>peer.setAttribute('aria-pressed',String(peer===button)));document.querySelectorAll('main section').forEach((panel,index)=>panel.hidden=index!==Number(button.dataset.index));}));</script></body></html>`;
fs.writeFileSync(path.join(root, 'G01-G05-会议图集.html'), html);
fs.writeFileSync(path.join(root, 'render-manifest.json'), JSON.stringify({ date: '2026-10-12', baseline: '0.14', version: '0.17', mermaid: '11.12.0', diagrams: manifest.map(({ file, title, diagrams }) => ({ file, title, diagrams: diagrams.map(({ svg, ...graph }) => graph) })) }, null, 2) + '\n');
await page.goto('file:///' + path.join(root, 'G01-G05-会议图集.html').replaceAll('\\', '/'));
for (let index = 0; index < manifest.length; index++) {
await page.locator(`button[data-index="${index}"]`).click();
await page.screenshot({ path: path.join(cache, `review-G0${index + 1}.png`), fullPage: true });
}
await browser.close();
}
main().catch(error => { console.error(error); process.exit(1); });
+92
View File
@@ -0,0 +1,92 @@
{
"date": "2026-10-12",
"baseline": "0.14",
"version": "0.17",
"mermaid": "11.12.0",
"diagrams": [
{
"file": "G01-产品业务全景.md",
"title": "G01 产品业务全景",
"diagrams": [
{
"name": "G01-产品业务全景",
"label": "产品业务全景",
"width": 1657,
"height": 1082
}
]
},
{
"file": "G02-领域概念关系.md",
"title": "G02 领域概念关系",
"diagrams": [
{
"name": "G02-领域概念关系",
"label": "领域概念关系",
"width": 1062,
"height": 1012
},
{
"name": "G02-工单与购买项",
"label": "工单与购买项",
"width": 1000,
"height": 1298
},
{
"name": "G02-项目组成例子",
"label": "项目组成例子",
"width": 1107,
"height": 887
}
]
},
{
"file": "G03-购买与开通.md",
"title": "G03 购买与开通",
"diagrams": [
{
"name": "G03-购买与开通",
"label": "购买与开通",
"width": 1294,
"height": 1667
}
]
},
{
"file": "G04-定制工单处理.md",
"title": "G04 定制工单处理",
"diagrams": [
{
"name": "G04-定制工单处理",
"label": "定制工单主流程",
"width": 1596,
"height": 1744
},
{
"name": "G04-失败与恢复",
"label": "失败与恢复",
"width": 3685,
"height": 751
}
]
},
{
"file": "G05-收费与权益.md",
"title": "G05 收费与权益",
"diagrams": [
{
"name": "G05-收费与权益",
"label": "收费与权益",
"width": 1465,
"height": 1132
},
{
"name": "G05-AI消耗记账",
"label": "AI 实际消耗记账",
"width": 2569,
"height": 486
}
]
}
]
}