@dazitech/cli 3.0.7 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +1 -1
  2. package/dist/clis/dazi-app.js +1 -1
  3. package/dist/clis/dazi-flow.js +1 -1
  4. package/dist/clis/dazi-onto.js +73 -22
  5. package/dist/clis/dazi.js +266 -171
  6. package/dist/docs/flow/flow-project-guide.md +1 -1
  7. package/dist/docs/guides/quickstart.md +18 -4
  8. package/dist/docs/guides/troubleshooting.md +12 -1
  9. package/dist/docs/guides/workspace-v3.md +43 -23
  10. package/dist/docs/index.json +28 -3
  11. package/dist/docs/onto/action-guide.md +3 -3
  12. package/dist/docs/onto/dazi_script_sdk_reference.md +244 -174
  13. package/dist/docs/onto/dazi_script_seed_data_guide.md +158 -155
  14. package/dist/docs/onto/function-guide.md +82 -27
  15. package/dist/docs/onto/space-management.md +3 -1
  16. package/dist/docs/onto//346/234/254/344/275/223/345/210/206/347/261/273/350/247/204/345/210/222/344/270/216SDK/346/211/251/345/261/225/346/226/271/346/241/210.md +168 -0
  17. package/dist/docs/onto//346/234/254/344/275/223/345/221/275/345/220/215/350/247/204/350/214/203_/347/211/251/347/220/206/350/241/250Cube/344/270/216/345/257/271/350/261/241.md +402 -0
  18. package/dist/docs/onto//346/234/254/344/275/223/350/204/232/346/234/254/347/274/226/345/206/231/346/214/207/345/215/227.md +200 -34
  19. package/dist/docs/onto//346/234/254/344/275/223/350/247/204/345/210/222/346/214/207/345/215/227.md +188 -38
  20. package/dist/docs/onto//350/204/232/346/234/254/350/277/220/350/241/214/347/272/240/351/224/231_/345/225/206/345/212/241/346/210/220/346/234/254/346/226/271/346/241/210/345/274/200/345/217/221/350/277/207/347/250/213.md +213 -0
  21. package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/344/272/247/345/223/201/351/224/200/345/224/256/346/234/254/344/275/223/350/247/204/345/210/222/346/226/271/346/241/210.md +620 -0
  22. package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/345/210/251/346/266/246/345/210/206/346/236/220/346/234/254/344/275/223/346/226/271/346/241/210.md +680 -541
  23. package/dist/examples/index.json +208 -22
  24. package/dist/examples/onto/README.md +51 -0
  25. package/dist/examples/onto/_templates/ontology_function_template.py +50 -0
  26. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_account_breakdown.py +62 -0
  27. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_budget_vs_actual.py +69 -0
  28. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_cost_center_profit.py +64 -0
  29. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_get_summary.py +61 -0
  30. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_mom_analysis.py +82 -0
  31. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_top_accounts.py +61 -0
  32. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/profit_fn_yoy_analysis.py +79 -0
  33. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/save_test_arguments.ps1 +38 -0
  34. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.account_breakdown.json +1 -0
  35. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.budget_vs_actual.json +1 -0
  36. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.cost_center_profit.json +1 -0
  37. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.get_summary.json +1 -0
  38. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.mom_analysis.json +1 -0
  39. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.top_accounts.json +1 -0
  40. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/test_arguments/profit.fn.yoy_analysis.json +1 -0
  41. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_ontology_init.py +679 -0
  42. package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_seed_data.py +216 -0
  43. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_channel_mix.py +89 -0
  44. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_customer_segmentation.py +121 -0
  45. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_get_summary.py +78 -0
  46. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_mom_analysis.py +89 -0
  47. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_region_breakdown.py +84 -0
  48. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_top_products.py +98 -0
  49. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/sales_fn_yoy_analysis.py +87 -0
  50. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/save_test_arguments.ps1 +38 -0
  51. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.channel_mix.json +5 -0
  52. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.customer_segmentation.json +5 -0
  53. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.get_summary.json +5 -0
  54. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.mom_analysis.json +5 -0
  55. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.region_breakdown.json +5 -0
  56. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.top_products.json +5 -0
  57. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/test_arguments/sales.fn.yoy_analysis.json +5 -0
  58. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_ontology_init.py +539 -0
  59. package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_seed_data.py +163 -0
  60. package/dist/prompts/index.json +2 -2
  61. package/dist/prompts/onto/action-design.md +4 -1
  62. package/dist/prompts/onto/function-design.md +46 -19
  63. package/dist/prompts/onto/rule-seed.md +5 -1
  64. package/dist/prompts/onto/script-publish-run.md +87 -25
  65. package/package.json +1 -1
  66. package/dist/examples/onto/function/profit_fn_customer_segmentation.py +0 -117
  67. package/dist/examples/onto/function/profit_fn_mom_analysis.py +0 -89
  68. package/dist/examples/onto/function/profit_fn_top_products.py +0 -89
  69. package/dist/examples/onto/function/profit_fn_yoy_analysis.py +0 -89
  70. package/dist/examples/onto/setup/profit_ontology_init.py +0 -388
@@ -0,0 +1,620 @@
1
+ # 规划示例 · 产品销售本体方案
2
+
3
+ **文档 ID**: `onto/planning-example-product-sales`
4
+
5
+ > **推荐**:本体规划阶段**首选参考示例**。覆盖物理表、**表间关系**、Cube、本体链接、函数与 **test_arguments** 完整落地;表/Cube/对象命名遵循 [本体命名规范](./本体命名规范_物理表Cube与对象.md)。
6
+ > 补充示例(利润分析域):[规划示例_利润分析本体方案.md](./规划示例_利润分析本体方案.md)
7
+
8
+ **占位符**(复制到工作区 `plans/` 后替换为实际值):
9
+
10
+ | 占位符 | 含义 | 权威来源 |
11
+ | ------ | ---- | -------- |
12
+ | `<space-id>` | 数据空间 ID | `项目/<业务名>/本体/ontos/<实现名>/README.md` |
13
+ | `<业务名>` | 业务项目目录名 | 工作区 `项目/` 下文件夹 |
14
+ | `<实现名>` | 本体实现单元名 | 如 `产品销售本体方案` |
15
+ | `<item-path>` | 实现单元根路径 | `项目/<业务名>/本体/ontos/<实现名>` |
16
+
17
+ ---
18
+
19
+ ## 一、空间概述
20
+
21
+ | 项目 | 说明 |
22
+ | -------- | ---- |
23
+ | 空间 ID | `<space-id>`(示例:`space__acme`) |
24
+ | 空间名称 | `<空间名称>`(与平台数据空间显示名一致) |
25
+ | 空间状态 | 空白空间(无表、无 Cube、无本体)或已有他域表共存 |
26
+ | 规划日期 | (填写定稿日期) |
27
+ | 实现单元 | `<item-path>/` |
28
+
29
+ ---
30
+
31
+ ## 二、需求分析
32
+
33
+ ### 2.1 业务背景
34
+
35
+ 某制造企业(示例)产品销售场景,需构建**产品销售本体**,以业务语言描述「产品」「销售订单」及其关系,支撑:
36
+
37
+ - 按产品大类、SKU 的销售量与销售额分析
38
+ - 按区域、客户类型、渠道的销售分布
39
+ - 同比、环比趋势与 Top N 产品排行
40
+ - 客户分层与渠道结构分析
41
+
42
+ ### 2.2 核心业务问题
43
+
44
+ | 问题 | 说明 |
45
+ | -------------- | ---------------------------- |
46
+ | 卖了多少 | 销量、销售额、订单数 |
47
+ | 哪些产品卖得好 | 产品排行、品类结构、动销 SKU |
48
+ | 谁在买 | 客户/区域贡献、客户分层 |
49
+ | 通过什么渠道卖 | 直销/经销/电商等渠道占比 |
50
+ | 趋势如何 | 同比、环比、季节性 |
51
+
52
+ ### 2.3 规划范围说明
53
+
54
+ **物理表清单**(命名见 [命名规范 §2](./本体命名规范_物理表Cube与对象.md#2-物理表类别与前缀)):
55
+
56
+ | 表名 | 前缀类别 | **347 分类** | 显示名 | 说明 | 角色 |
57
+ | ---- | -------- | ------------ | ------ | ---- | ---- |
58
+ | **`dim_date`** | 时间维(**强制**) | **时间维** | 日期维表 | 全空间共享;PK **`date_key`** | 时间维 |
59
+ | `dim_product` | dim | **维度表** | 产品维表 | 可售产品主数据 | dim |
60
+ | `dim_customer` | dim | **维度表** | 客户维表 | 购买方主数据 | dim |
61
+ | `dim_channel` | dim | **维度表** | 渠道维表 | 销售渠道主数据 | dim |
62
+ | **`fact_sales_order_line`** | fact | **事实表** | 销售订单行事实表 | 订单行粒度销售流水;含 **`date_key`** | fact |
63
+
64
+ > 规划原则:**先**定义业务对象(Product、SalesOrder 等)与链接,**再**反推 Cube 与物理表。事实表通过 `date_key` 关联 `dim_date`,支撑同比/环比与时间层次分析。
65
+ > init 脚本 `资源/examples/onto/销售示例/setup/sales_ontology_init.py` 顶部 **`TABLE_REGISTRY`** 与上表及 §3.x 字段 **显示名/说明** 一一对应,经 `s.tables.register_with_meta` 注册;**`CATEGORY_REGISTRY`** 与 [附录 B](#附录-b347-分类挂载对照表category_registry) 及 `apply_registry` 步骤对齐。
66
+
67
+ ---
68
+
69
+ ## 三、物理层设计
70
+
71
+ ### 3.0 时间维:dim_date(强制)
72
+
73
+ **用途**:全空间共享日历;事实表通过 **`date_key`** 关联;Cube 时间维与 YoY/MoM 函数优先基于本表。
74
+
75
+ | 字段名 | 类型 | 显示名 | 说明 |
76
+ | ------ | ---- | ------ | ---- |
77
+ | **date_key** | Int32 | 日期键 | YYYYMMDD,主键 |
78
+ | calendar_date | Date | 自然日 | |
79
+ | year | Int16 | 公历年 | |
80
+ | quarter | Int8 | 季度 | 1–4 |
81
+ | month | Int8 | 月 | 1–12 |
82
+ | week_of_year | Int8 | 周 | |
83
+ | day_of_week | Int8 | 星期 | |
84
+ | is_weekend | UInt8 | 是否周末 | 0/1 |
85
+ | year_month | String | 年月 | 如 2025-06 |
86
+
87
+ **排序键**:`ORDER BY (date_key)` · **引擎**:`MergeTree()`
88
+
89
+ ### 3.1 维度表:dim_product
90
+
91
+ **用途**:可售产品(油品、化工品等)主数据。
92
+
93
+ | 字段名 | 类型 | 显示名 | 说明 |
94
+ | ------ | ---- | ------ | ---- |
95
+ | product_id | String | 产品 ID | 主键 |
96
+ | product_code | String | 产品编码 | |
97
+ | product_name | String | 产品名称 | |
98
+ | product_category | String | 产品大类 | |
99
+ | product_subcategory | String | 产品小类 | |
100
+ | brand | String | 品牌 | |
101
+ | unit | String | 计量单位 | |
102
+ | list_price | Float64 | 挂牌价 | |
103
+ | cost_price | Float64 | 成本单价 | |
104
+ | status | String | 状态 | 在售/停售 |
105
+ | created_at | DateTime | 创建时间 | |
106
+ | updated_at | DateTime | 更新时间 | |
107
+
108
+ **排序键**:`ORDER BY (product_id)`
109
+
110
+ ### 3.2 事实表:fact_sales_order_line
111
+
112
+ **用途**:订单行粒度销售流水;Cube 与 SalesOrder 对象的主事实源。
113
+
114
+ | 字段名 | 类型 | 显示名 | 说明 |
115
+ | ------ | ---- | ------ | ---- |
116
+ | order_id | String | 订单 ID | |
117
+ | order_line_id | String | 订单行 ID | 主键组合 |
118
+ | **date_key** | Int32 | 日期键 | 关联 dim_date |
119
+ | order_date | Date | 订单日期 | |
120
+ | product_id | String | 产品 ID | 关联 dim_product |
121
+ | product_category | String | 产品大类 | 冗余 |
122
+ | customer_id | String | 客户 ID | 关联 dim_customer |
123
+ | customer_region | String | 销售区域 | 冗余 |
124
+ | customer_type | String | 客户类型 | 冗余 |
125
+ | channel_id | String | 渠道 ID | 关联 dim_channel |
126
+ | quantity | Int32 | 销售数量 | |
127
+ | unit_price | Float64 | 成交单价 | |
128
+ | discount_amount | Float64 | 折扣金额 | |
129
+ | sales_amount | Float64 | 销售金额 | |
130
+ | currency | String | 币种 | |
131
+ | order_status | String | 订单状态 | |
132
+
133
+ **排序键**:`ORDER BY (date_key, order_id, order_line_id)`
134
+
135
+ **业务规则**:
136
+
137
+ - 灌数:`date_key = toYYYYMMDD(order_date)`
138
+ - 分析默认过滤 `order_status IN ('已完成', '已发货')`
139
+ - `sales_amount` 与 `quantity * unit_price - discount_amount` 口径一致
140
+
141
+ ### 3.3 维度表:dim_customer、dim_channel
142
+
143
+ #### dim_customer
144
+
145
+ | 字段名 | 类型 | 显示名 | 说明 |
146
+ | ------ | ---- | ------ | ---- |
147
+ | customer_id | String | 客户 ID | 主键 |
148
+ | customer_code | String | 客户编码 | |
149
+ | customer_name | String | 客户名称 | |
150
+ | customer_region | String | 销售区域 | |
151
+ | customer_type | String | 客户类型 | |
152
+ | industry | String | 所属行业 | |
153
+ | created_at | DateTime | 创建时间 | |
154
+
155
+ #### dim_channel
156
+
157
+ | 字段名 | 类型 | 显示名 | 说明 |
158
+ | ------ | ---- | ------ | ---- |
159
+ | channel_id | String | 渠道 ID | 主键 |
160
+ | channel_code | String | 渠道编码 | |
161
+ | channel_name | String | 渠道名称 | |
162
+ | channel_type | String | 渠道类型 | |
163
+
164
+ ### 3.4 表间关系设计(物理层 · 数据空间)
165
+
166
+ > **与本体链接的区别**:本节描述 **ClickHouse 物理表之间的 FK/JOIN 关系**,写入数据空间 `ads_dataspace_relationships`,供侧栏 **数据资源 → 表间关系** 展示,并支撑流程节点多表 JOIN、AI 读空间上下文。
167
+ > **本体层链接**(第五节 `define_link_type`)描述业务对象语义,二者应 **一一对应、分层不混用**。
168
+
169
+ **关系模型(星型)**:以 **`fact_sales_order_line`** 为事实表,关联 **`dim_date`** 与三张业务维表。
170
+
171
+ ```text
172
+ dim_date
173
+ (date_key PK)
174
+
175
+ │ many_to_one
176
+
177
+ dim_product ◄─────────────┼─────────────► dim_customer
178
+ (product_id PK) │ (customer_id PK)
179
+ ▲ │ ▲
180
+ │ │ │
181
+ │ fact_sales_order_line │
182
+ │ (order_line) │
183
+ └──────────────────┼────────────────────┘
184
+
185
+
186
+ dim_channel
187
+ (channel_id PK)
188
+ ```
189
+
190
+ **关系清单(5 条)**:
191
+
192
+ | 关系 ID | **347 分类** | 类型 | 从表 | 到表 | join_keys | 说明 |
193
+ | ------- | ------------ | ---- | ---- | ---- | --------- | ---- |
194
+ | rel_sales_date | **时间关联** | many_to_one | fact_sales_order_line | dim_date | date_key → date_key | 订单行关联日历 |
195
+ | rel_sales_product | **主数据关联** | many_to_one | fact_sales_order_line | dim_product | product_id → product_id | 订单行关联产品 |
196
+ | rel_sales_customer | **主数据关联** | many_to_one | fact_sales_order_line | dim_customer | customer_id → customer_id | 订单行关联客户 |
197
+ | rel_sales_channel | **主数据关联** | many_to_one | fact_sales_order_line | dim_channel | channel_id → channel_id | 订单行关联渠道 |
198
+
199
+ **join_sql 示例**:
200
+
201
+ | 关系 | join_sql |
202
+ | ---- | -------- |
203
+ | rel_sales_date | `fact_sales_order_line.date_key = dim_date.date_key` |
204
+ | rel_sales_product | `fact_sales_order_line.product_id = dim_product.product_id` |
205
+ | rel_sales_customer | `fact_sales_order_line.customer_id = dim_customer.customer_id` |
206
+ | rel_sales_channel | `fact_sales_order_line.channel_id = dim_channel.channel_id` |
207
+
208
+ **实施 API**(`setup/sales_ontology_init.py`,表 register 之后、Cube 之前):
209
+
210
+ ```python
211
+ s.tables.add_relationship(
212
+ from_table="fact_sales_order_line",
213
+ to_table="dim_product",
214
+ join_sql="fact_sales_order_line.product_id = dim_product.product_id",
215
+ join_keys=[{"from": "product_id", "to": "product_id"}],
216
+ relationship_type="many_to_one",
217
+ description="销售订单行关联产品",
218
+ )
219
+ ```
220
+
221
+ **冗余列说明**(不单独建关系):`product_category`、`customer_region`、`customer_type` 为事实表冗余,与维表字段重复便于聚合。
222
+
223
+ **与本体链接对照**:
224
+
225
+ | 物理表关系 | 对应本体链接 |
226
+ | ---------- | ------------ |
227
+ | rel_sales_product | order_contains_product |
228
+ | rel_sales_customer | order_belongs_customer |
229
+ | rel_sales_channel | order_via_channel |
230
+ | rel_sales_date | (时间维,函数/Cube 层 JOIN,可无独立链接类型) |
231
+
232
+ ---
233
+
234
+ ## 四、Cube 层设计
235
+
236
+ ### 4.0 Cube 清单与类别
237
+
238
+ | Cube | 类别 | **347 分类** | 事实源 | 时间维 | 支撑对象 |
239
+ | ---- | ---- | ------------ | ------ | ------ | -------- |
240
+ | **SalesCube** | Process | **流程型** | fact_sales_order_line | dim_date(year/month/quarter) | SalesOrder, SalesAnalysis |
241
+ | **ProductSalesCube** | Subject | **主体型** | fact_sales_order_line | 同上 | Product |
242
+ | **CustomerSalesCube** | Subject | **主体型** | fact_sales_order_line | 同上 | Customer |
243
+ | **ChannelSalesCube** | Subject | **主体型** | fact_sales_order_line | 同上 | SalesChannel |
244
+
245
+ > 时间智能 **不单独建 Cube**;`SalesCube` 维度含 `date_key` 及自 `dim_date` JOIN 的 `year`、`month`、`year_month`、`quarter`(见 [命名规范 §4.2](./本体命名规范_物理表Cube与对象.md#42-cube-类别))。
246
+
247
+ 所有 Cube 均以 **`fact_sales_order_line`** 为事实源;产品名称等可在函数 SQL 中 LEFT JOIN **`dim_product`**。
248
+
249
+ ### 4.1 SalesCube(Process · 销售分析主 Cube)
250
+
251
+ **目的**:全局销售分析、SalesOrder / SalesAnalysis 读模型
252
+
253
+ **维度**:order_id, order_line_id, date_key, order_date, year, month, year_month, quarter, product_id, product_category, customer_id, customer_region, customer_type, channel_id
254
+
255
+ **度量**:
256
+
257
+ | 度量名 | 列名 | 聚合 | 说明 |
258
+ | ----------- | ---------------- | ----- | -------- |
259
+ | quantity | quantity | sum | 销售数量 |
260
+ | sales_amount| sales_amount | sum | 销售金额 |
261
+ | discount | discount_amount | sum | 折扣金额 |
262
+ | order_count | order_id | uniq | 订单数 |
263
+ | line_count | order_line_id | uniq | 订单行数 |
264
+
265
+ **派生度量**:
266
+
267
+ | 度量名 | 表达式 | 说明 |
268
+ | --------------- | --------------------------------------------------- | -------- |
269
+ | avg_unit_price | if(quantity>0, sales_amount/quantity, 0) | 平均单价 |
270
+ | avg_order_value | if(order_count>0, sales_amount/order_count, 0) | 客单价 |
271
+
272
+ ### 4.2 ProductSalesCube(Subject · 产品销售)
273
+
274
+ **目的**:Product 对象 bind_source;按产品聚合
275
+
276
+ **维度**:product_id, product_category, year, month(来自 dim_date)
277
+
278
+ **度量**:quantity, sales_amount, order_count
279
+
280
+ **派生度量**:avg_unit_price
281
+
282
+ ### 4.3 CustomerSalesCube(Subject · 客户销售)
283
+
284
+ **维度**:customer_id, customer_region, customer_type, year, month
285
+
286
+ **度量**:quantity, sales_amount, order_count
287
+
288
+ **派生度量**:avg_order_value
289
+
290
+ ### 4.4 ChannelSalesCube(Subject · 渠道销售)
291
+
292
+ **维度**:channel_id, year, month
293
+
294
+ **度量**:quantity, sales_amount, order_count
295
+
296
+ ---
297
+
298
+ ## 五、本体层设计
299
+
300
+ ### 5.1 对象类型(5 种)
301
+
302
+ | code | 分类 | **347 分类** | 名称 | bind_source | 主物理支撑 |
303
+ | ---- | ---- | ------------ | ---- | ------------- | ---------- |
304
+ | Product | Master | **主数据** | 产品 | ProductSalesCube | dim_product |
305
+ | Customer | Master | **主数据** | 客户 | CustomerSalesCube | dim_customer |
306
+ | SalesChannel | Reference | **参考** | 销售渠道 | ChannelSalesCube | dim_channel |
307
+ | SalesOrder | Transaction | **事务** | 销售订单 | SalesCube | fact_sales_order_line |
308
+ | SalesAnalysis | Analytical | **分析** | 销售分析 | SalesCube | fact_sales_order_line |
309
+
310
+ > 对象 **`code` 无前缀**(Palantir 式业务名);分类写入规划表,不写入 `code`。详见 [命名规范 §5](./本体命名规范_物理表Cube与对象.md#5-本体对象palantir-思想与分类)。
311
+
312
+ ### 5.2 对象属性(摘要)
313
+
314
+ #### Product(Master)
315
+
316
+ | 属性 code | 名称 | semantic_role | qualified_name |
317
+ | --------- | ---- | ------------- | -------------- |
318
+ | id | 产品 ID | dimension | ProductSalesCube.product_id |
319
+ | category | 产品大类 | dimension | ProductSalesCube.product_category |
320
+ | quantity | 累计销量 | measure | ProductSalesCube.quantity |
321
+ | sales_amount | 累计销售额 | measure | ProductSalesCube.sales_amount |
322
+ | order_count | 订单数 | measure | ProductSalesCube.order_count |
323
+ | avg_unit_price | 平均单价 | measure | ProductSalesCube.avg_unit_price |
324
+
325
+ #### SalesOrder(Transaction)
326
+
327
+ | 属性 code | 名称 | semantic_role | qualified_name |
328
+ | --------- | ---- | ------------- | -------------- |
329
+ | id | 订单 ID | dimension | SalesCube.order_id |
330
+ | line_id | 订单行 | dimension | SalesCube.order_line_id |
331
+ | date | 订单日期 | dimension | SalesCube.order_date |
332
+ | quantity | 数量 | measure | SalesCube.quantity |
333
+ | sales_amount | 销售金额 | measure | SalesCube.sales_amount |
334
+ | unit_price | 成交单价 | measure | SalesCube.avg_unit_price |
335
+
336
+ #### Customer / SalesChannel / SalesAnalysis
337
+
338
+ 与 `销售示例/setup/sales_ontology_init.py` 中属性映射一致(约 29 个属性);实施时改 `space_id`,**表名按本规划**(脚本示例可能仍为旧表名,迁移中)。
339
+
340
+ ### 5.3 链接类型(8 种)
341
+
342
+ | 链接 code | **347 分类** | 名称 | from | to | 说明 |
343
+ | ---------------------- | ------------ | -------------- | ------------- | ------------- | -------------------- |
344
+ | order_contains_product | **归属关系** | 订单包含产品 | SalesOrder | Product | 订单行对应产品 |
345
+ | order_belongs_customer | **归属关系** | 订单归属客户 | SalesOrder | Customer | 订单归属客户 |
346
+ | order_via_channel | **归属关系** | 订单经渠道成交 | SalesOrder | SalesChannel | 订单销售渠道 |
347
+ | product_has_orders | **归属关系** | 产品有订单 | Product | SalesOrder | 产品被哪些订单购买 |
348
+ | customer_places_orders | **归属关系** | 客户下单 | Customer | SalesOrder | 客户历史订单 |
349
+ | analysis_by_product | **分析归因** | 分析归因产品 | SalesAnalysis | Product | 指标按产品切片 |
350
+ | analysis_by_customer | **分析归因** | 分析归因客户 | SalesAnalysis | Customer | 指标按客户切片 |
351
+ | analysis_by_channel | **分析归因** | 分析归因渠道 | SalesAnalysis | SalesChannel | 指标按渠道切片 |
352
+
353
+ ### 5.4 三层对照总表
354
+
355
+ | 对象 code | 分类 | Cube | 主 fact / dim |
356
+ | --------- | ---- | ---- | ------------- |
357
+ | Product | Master | ProductSalesCube | dim_product |
358
+ | Customer | Master | CustomerSalesCube | dim_customer |
359
+ | SalesChannel | Reference | ChannelSalesCube | dim_channel |
360
+ | SalesOrder | Transaction | SalesCube | fact_sales_order_line |
361
+ | SalesAnalysis | Analytical | SalesCube | fact_sales_order_line |
362
+ | (时间) | — | SalesCube 时间维 | dim_date |
363
+
364
+ ---
365
+
366
+ ## 六、本体函数设计
367
+
368
+ ### 6.1 函数清单
369
+
370
+ | 函数 ID | **347 分类** | 功能 | 参数 |
371
+ | --------------------------------- | ------------ | ------------ | ------------------------------------------------- |
372
+ | sales.fn.get_summary | **总览分析** | 销售总览 | start_date, end_date(可选) |
373
+ | sales.fn.yoy_analysis | **趋势分析** | 同比分析 | start_date, end_date |
374
+ | sales.fn.mom_analysis | **趋势分析** | 环比分析 | start_date, end_date |
375
+ | sales.fn.top_products | **结构分析** | 产品排行 | limit, metric, start_date, end_date |
376
+ | sales.fn.customer_segmentation | **结构分析** | 客户分层 | metric, method, start_date, end_date |
377
+ | sales.fn.region_breakdown | **组织分析** | 区域销售分布 | start_date, end_date |
378
+ | sales.fn.channel_mix | **结构分析** | 渠道结构 | start_date, end_date |
379
+
380
+ ### 6.2 函数示例:sales.fn.get_summary
381
+
382
+ **功能**:指定时间范围内销售总览
383
+
384
+ **返回值**:
385
+
386
+ | 字段名 | 类型 | 说明 |
387
+ | --------------- | ------- | ------------ |
388
+ | total_sales | Float64 | 总销售额 |
389
+ | total_quantity | Int | 总销量 |
390
+ | order_count | Int | 订单数 |
391
+ | avg_order_value | Float64 | 客单价 |
392
+ | product_count | Int | 动销 SKU 数 |
393
+
394
+ ### 6.3 函数示例:sales.fn.top_products
395
+
396
+ **功能**:按销售额或销量 Top N;JOIN **`dim_product`** 补全 product_name
397
+
398
+ **参数**:limit(默认 10), metric(sales_amount / quantity), start_date, end_date
399
+
400
+ **返回值**:rank, product_id, product_name, product_category, sales_amount, quantity, share_pct
401
+
402
+ > 参考实现:`资源/examples/onto/销售示例/functions/sales_fn_*.py`(复制到 `<item-path>/functions/`)。
403
+
404
+ ### 6.4 测试参数(test_arguments)
405
+
406
+ 发布并验证函数后,**必须**将默认测试入参写入函数定义,供侧栏 **Onto → 运行函数** 预填。
407
+
408
+ | 函数 ID | test_arguments 文件 | 默认 arguments |
409
+ | ------- | --------------------- | -------------- |
410
+ | sales.fn.get_summary | `functions/test_arguments/sales.fn.get_summary.json` | start_date, end_date |
411
+ | sales.fn.yoy_analysis | `.../sales.fn.yoy_analysis.json` | 同上 |
412
+ | sales.fn.mom_analysis | `.../sales.fn.mom_analysis.json` | 同上 |
413
+ | sales.fn.top_products | `.../sales.fn.top_products.json` | limit=5, metric=sales_amount, 日期 |
414
+ | sales.fn.customer_segmentation | `.../sales.fn.customer_segmentation.json` | metric, method=quartile, 日期 |
415
+ | sales.fn.region_breakdown | `.../sales.fn.region_breakdown.json` | 日期 |
416
+ | sales.fn.channel_mix | `.../sales.fn.channel_mix.json` | 日期 |
417
+
418
+ 批量入库(dazi-work 根):
419
+
420
+ ```powershell
421
+ .\<item-path>\functions\save_test_arguments.ps1
422
+ ```
423
+
424
+ JSON 格式须含 `v`、`arguments`、`object_type_code`(与平台函数定义一致);各 `.py` 内 `TEST_ARGUMENTS` 常量与 JSON **保持同步**。
425
+
426
+ ---
427
+
428
+ ## 七、实施计划
429
+
430
+ > **dazi-vscode v3** · 空间 `<space-id>` · 脚本目录 `setup/`、`functions/`
431
+ > 发布示例:
432
+ > `dazi onto script publish <item-path>/setup/sales_ontology_init.py --space <space-id> --type setup`
433
+
434
+ ### 7.1 阶段一:物理层(高)
435
+
436
+ | 步骤 | 任务 | 说明 |
437
+ | ---- | ---- | ---- |
438
+ | 1 | 创建 **dim_date** | 时间维(强制) |
439
+ | 2 | 创建 dim_product | 产品维表 |
440
+ | 3 | 创建 **fact_sales_order_line** | 含 **date_key** |
441
+ | 4 | 创建 dim_customer、dim_channel | 业务维表 |
442
+ | 5 | 注册表到空间 | **TABLE_REGISTRY** + `register_with_meta` |
443
+ | 6 | **注册表间关系(4 条)** | 含 fact → dim_date |
444
+
445
+ ### 7.2 阶段二:Cube 层(高)
446
+
447
+ | 步骤 | 任务 |
448
+ | ---- | ---- |
449
+ | 7 | 注册 SalesCube / ProductSalesCube 等 **4 个 Cube**(无独立 Time Cube) |
450
+ | 8 | 配置派生度量;SalesCube 含 dim_date 时间维 |
451
+
452
+ ### 7.3 阶段三:本体层(高)
453
+
454
+ | 步骤 | 任务 |
455
+ | ---- | ------------------------------------------------------------ |
456
+ | 9 | define_object_type(5 种) |
457
+ | 10 | bind_source |
458
+ | 11 | define_property(约 29 个) |
459
+ | 12 | define_link_type(8 种) |
460
+ | 13 | sync_metric_refs |
461
+ | 14 | **CATEGORY_REGISTRY** + `s.categories.apply_registry`(347 对齐) |
462
+
463
+ ### 7.4 阶段四:函数与数据(中)
464
+
465
+ | 步骤 | 任务 |
466
+ | ---- | -------------------------------------------------------------------- |
467
+ | 14 | 从 `销售示例/functions/sales_fn_*.py` 复制并适配(SQL 表名按本规划) |
468
+ | 15 | seed 灌数:**dim_date** + 维表 + fact(写入 date_key) |
469
+ | 16 | publish + run 验证 |
470
+ | 17 | **`save-test-arguments`** 写入各函数 `test_arguments`(侧栏预填;见 §6.4) |
471
+
472
+ ### 7.5 快速实施路径
473
+
474
+ 本仓库 **`资源/examples/onto/销售示例/setup/sales_ontology_init.py`** 含完整 init 逻辑(含 **`TABLE_REGISTRY`** 与 `register_with_meta`),与本文 §2.3、§3.x 对齐:
475
+
476
+ 1. 复制 `sales_ontology_init.py`、`sales_seed_data.py` → 实现单元 `setup/`(`dazi examples sync` 或侧栏 **帮助 → 示例**)
477
+ 2. 将 init/seed 内 `space_id` 改为 README 中的 `<space-id>`
478
+ 3. 按 [快速启动](./本体规划指南.md) 发布执行
479
+
480
+ ---
481
+
482
+ ## 八、风险与验收
483
+
484
+ ### 8.1 风险
485
+
486
+ | 等级 | 风险 | 缓解措施 |
487
+ | ---- | ------------------ | ---------------------------- |
488
+ | 中 | 空间为空,无现网表 | 按本方案建表或对接 ERP 导数 |
489
+ | 低 | 产品表与销售表口径 | 种子数据脚本统一生成 |
490
+ | 低 | 函数与 Cube 不同步 | init 末尾 `sync_metric_refs` |
491
+
492
+ ### 8.2 验收标准
493
+
494
+ | 验收项 | 标准 |
495
+ | ------ | ---- |
496
+ | dim_date | 可查询,**date_key** 连续覆盖 seed 日期范围 |
497
+ | fact_sales_order_line | 可查询,**date_key** 与 dim_date 可 JOIN |
498
+ | 维表 | dim_product / dim_customer / dim_channel 完整 |
499
+ | 表/列元数据 | 侧栏与表预览显示名、说明与 §3.x 一致 |
500
+ | **表间关系** | **4 条**(含 fact → dim_date) |
501
+ | Cube | **4 个** Cube;SalesCube 含时间维 |
502
+ | 对象类型 | 5 种 + 分类列;8 种链接 |
503
+ | **347 平台分类** | 侧栏分类名与附录 B 一致;init 重跑幂等 |
504
+ | 函数 | get_summary、top_products 可运行 |
505
+ | test_arguments | 各 function_id 已 save-test-arguments |
506
+ | 数据 | 种子灌入后指标与手工 SQL 一致 |
507
+
508
+ ---
509
+
510
+ ## 九、预期成果
511
+
512
+ | 分析能力 | 说明 |
513
+ | ---------- | ------------------------------ |
514
+ | 产品销售 | SKU/品类销量、销售额、排行 |
515
+ | 客户价值 | 区域分布、客户分层 |
516
+ | 渠道结构 | 各渠道销售占比 |
517
+ | 趋势分析 | 同比、环比 |
518
+ | 业务语义 | 产品—订单—客户—渠道链接可导航 |
519
+
520
+ ---
521
+
522
+ ## 附录 B:347 分类挂载对照表(CATEGORY_REGISTRY)
523
+
524
+ 与 `销售示例/setup/sales_ontology_init.py` 顶部 **`CATEGORY_REGISTRY`** 一一对应;平台 `category_name` **=** 347 标准中文名(见 [349 方案](./本体分类规划与SDK扩展方案.md))。
525
+
526
+ ### B.1 物理表(table)
527
+
528
+ | 347 分类 | 表名 |
529
+ | -------- | ---- |
530
+ | 时间维 | dim_date |
531
+ | 维度表 | dim_product, dim_customer, dim_channel |
532
+ | 事实表 | fact_sales_order_line |
533
+
534
+ ### B.2 Cube(cube)
535
+
536
+ | 347 分类 | Cube |
537
+ | -------- | ---- |
538
+ | 流程型 | SalesCube |
539
+ | 主体型 | ProductSalesCube, CustomerSalesCube, ChannelSalesCube |
540
+
541
+ ### B.3 对象类型(object)
542
+
543
+ | 347 分类 | code |
544
+ | -------- | ---- |
545
+ | 主数据 | Product, Customer |
546
+ | 参考 | SalesChannel |
547
+ | 事务 | SalesOrder |
548
+ | 分析 | SalesAnalysis |
549
+
550
+ ### B.4 表间关系(relation)
551
+
552
+ | 347 分类 | 从表 → 到表 |
553
+ | -------- | ----------- |
554
+ | 时间关联 | fact_sales_order_line → dim_date |
555
+ | 主数据关联 | fact_sales_order_line → dim_product / dim_customer / dim_channel |
556
+
557
+ ### B.5 链接类型(link)
558
+
559
+ | 347 分类 | link code |
560
+ | -------- | --------- |
561
+ | 归属关系 | order_contains_product, order_belongs_customer, order_via_channel, product_has_orders, customer_places_orders |
562
+ | 分析归因 | analysis_by_product, analysis_by_customer, analysis_by_channel |
563
+
564
+ ### B.6 本体函数(function)
565
+
566
+ init 脚本**不**注册函数;函数发布后单独执行 `apply_registry` 的 `function` 段,或 `skip_missing=True` 跳过。建议分类:
567
+
568
+ | 347 分类 | function_id |
569
+ | -------- | ----------- |
570
+ | 总览分析 | sales.fn.get_summary |
571
+ | 趋势分析 | sales.fn.yoy_analysis, sales.fn.mom_analysis |
572
+ | 结构分析 | sales.fn.top_products, sales.fn.customer_segmentation, sales.fn.channel_mix |
573
+ | 组织分析 | sales.fn.region_breakdown |
574
+
575
+ ---
576
+
577
+ ## 附录:规划完整性自检清单
578
+
579
+ 定稿前逐项勾选(完整说明见 [本体规划指南 · 规划文档完整性自检清单](./本体规划指南.md#规划文档完整性自检清单))。
580
+
581
+ | # | 检查项 | 本方案 |
582
+ | - | ------ | ------ |
583
+ | 1 | 业务场景 | ☑ |
584
+ | 2 | 物理表 | ☑(dim_date + fact + 3 dim) |
585
+ | 2a | dim_date / date_key | ☑(§3.0、§3.2) |
586
+ | 2b | fact 含 date_key | ☑ |
587
+ | 2c | 表前缀规范 | ☑(fact_/dim_) |
588
+ | 3 | 表间关系 | ☑(**4 条**) |
589
+ | 4 | Cube 层 | ☑(**4 个**,§4.0 含类别) |
590
+ | 4a–4b | Cube 类别/命名 | ☑ |
591
+ | 5 | 对象类型 | ☑(5 种 + 分类) |
592
+ | 5a–5c | 对象分类/三层对照 | ☑(§5.1、§5.4) |
593
+ | 6 | bind_source | ☑ |
594
+ | 7 | 链接类型 | ☑(8 种) |
595
+ | 8 | 函数清单 | ☑ |
596
+ | 9 | test_arguments | ☑ |
597
+ | 10 | 实施与验收 | ☑ |
598
+ | 6a–6e | 347 平台分类 | ☑(附录 B + init 步骤 10) |
599
+
600
+ ---
601
+
602
+ ## 十、相关文档
603
+
604
+ | 文档 | 路径 |
605
+ | ---- | ---- |
606
+ | 本体命名规范 | [本体命名规范_物理表Cube与对象.md](./本体命名规范_物理表Cube与对象.md) |
607
+ | 本体规划指南 | [本体规划指南.md](./本体规划指南.md) |
608
+ | 本体脚本编写指南 | [本体脚本编写指南.md](./本体脚本编写指南.md) |
609
+ | 函数开发 | [function-guide.md](./function-guide.md) |
610
+ | 参考实现(init/seed/函数) | `资源/examples/onto/销售示例/` → 复制到 `<item-path>/` |
611
+ | **内置脚本示例** | `资源/examples/onto/销售示例/`(`dazi examples sync` 后复制到实现单元) |
612
+ | 补充示例(利润) | [规划示例_利润分析本体方案.md](./规划示例_利润分析本体方案.md) · `资源/examples/onto/利润示例/` |
613
+ | 349 · 分类方案 | [本体分类规划与 SDK 扩展方案](./本体分类规划与SDK扩展方案.md) |
614
+
615
+ ---
616
+
617
+ **方案版本**:v1.3(表/Cube/对象命名对齐 [命名规范](./本体命名规范_物理表Cube与对象.md))
618
+ **创建日期**:(定稿日)
619
+ **适用**:复制到 `<item-path>/plans/`;`<space-id>` 以该实现单元 `README.md` 为准
620
+ **状态**:规划示例(公共模板)