@dazitech/cli 3.1.0 → 3.1.1
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.
- package/README.md +1 -1
- package/dist/clis/dazi-app.js +2 -2
- package/dist/clis/dazi-flow.js +2 -2
- package/dist/clis/dazi-onto.js +318 -40
- package/dist/clis/dazi.js +407 -185
- package/dist/docs/flow/flow-project-guide.md +1 -1
- package/dist/docs/guides/cli-reference.md +16 -3
- package/dist/docs/guides/troubleshooting.md +1 -1
- package/dist/docs/index.json +1 -13
- package/dist/docs/onto/dazi_script_sdk_reference.md +1 -1
- package/dist/docs/onto/dazi_script_seed_data_guide.md +1 -1
- package/dist/docs/onto/function-guide.md +6 -6
- 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 +169 -169
- 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 +3 -2
- package/dist/docs/onto//346/234/254/344/275/223/345/274/200/345/217/221/344/274/230/345/214/226/346/200/273/347/273/223.md +257 -242
- 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 +12 -12
- package/dist/docs/onto//346/234/254/344/275/223/350/247/204/345/210/222/346/214/207/345/215/227.md +14 -13
- package/dist/docs/onto//350/204/232/346/234/254/350/277/220/350/241/214/345/270/270/350/247/201/351/224/231/350/257/257/345/244/204/347/220/206.md +70 -15
- package/dist/examples/index.json +222 -6
- package/dist/examples/onto/README.md +34 -36
- package/dist/examples/onto/_templates/onto_preflight.ps1 +84 -0
- package/dist/examples/onto/index.json +53 -0
- package/dist/examples/onto/index.yaml +29 -0
- package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/README.md +23 -0
- package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/functions/save_test_arguments.ps1 +12 -11
- package/dist/{docs/onto → examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/plans}//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 +4 -4
- package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_category_mount.py +1 -1
- package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_ontology_init.py +1 -1
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/README.md +24 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_availability_analysis.py +84 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_downtime_breakdown.py +119 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_energy_intensity.py +98 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_get_summary.py +125 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_maintenance_compliance.py +77 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_mom_analysis.py +118 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_oee_analysis.py +126 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_plan_vs_actual.py +105 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_top_fault_equipment.py +104 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_unit_comparison.py +120 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/equip_ops_fn_yoy_analysis.py +115 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/save_test_arguments.ps1 +42 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.availability_analysis.json +7 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.downtime_breakdown.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.energy_intensity.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.get_summary.json +7 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.maintenance_compliance.json +7 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.mom_analysis.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.oee_analysis.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.plan_vs_actual.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.top_fault_equipment.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.unit_comparison.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/functions/test_arguments/equip_ops.fn.yoy_analysis.json +8 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/plans//345/214/226/345/267/245/350/256/276/345/244/207/350/277/220/350/220/245/345/210/206/346/236/220/346/234/254/344/275/223/346/226/271/346/241/210.md +735 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/setup/equip_ops_category_mount.py +106 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/setup/equip_ops_ontology_init.py +1077 -0
- package/dist/examples/onto//350/256/276/345/244/207/350/277/220/350/220/245/setup/equip_ops_seed_data.py +552 -0
- package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/README.md +23 -0
- package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/functions/save_test_arguments.ps1 +13 -12
- package/dist/{docs/onto → examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/plans}//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 +2 -2
- package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_category_mount.py +1 -1
- package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_ontology_init.py +1 -1
- package/dist/prompts/index.json +1 -1
- package/dist/prompts/onto/planning-design.md +226 -104
- package/dist/prompts/onto/script-publish-run.md +8 -6
- package/package.json +1 -1
|
@@ -1,242 +1,257 @@
|
|
|
1
|
-
# 本体开发优化总结
|
|
2
|
-
|
|
3
|
-
**文档 ID**:`onto/dev-optimization-summary`
|
|
4
|
-
|
|
5
|
-
> **类型**:开发总结(本轮本体 SDK、init 脚本、规划与 TRAE 引导优化)
|
|
6
|
-
> **同步路径**:`dazi docs sync` → `资源/docs/onto/本体开发优化总结.md`
|
|
7
|
-
> **前置依据**:[本体命名规范](./本体命名规范_物理表Cube与对象.md)、[本体分类规划与SDK扩展方案](./本体分类规划与SDK扩展方案.md)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 1. 本轮目标
|
|
12
|
-
|
|
13
|
-
在 本体命名规范基础上,打通 **规划文档 → init 脚本 → 平台侧栏** 三条链路,解决两类长期缺口:
|
|
14
|
-
|
|
15
|
-
1. **表/列显示名与业务说明**:侧栏、表预览不再只显示物理字段名。
|
|
16
|
-
2. **平台分类与平台分类**:规划中的「类别/分类」列能幂等挂载到 `ads_categories`,侧栏分组与规划一致。
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 2. 表显示名与列显示名
|
|
21
|
-
|
|
22
|
-
### 2.1 问题背景
|
|
23
|
-
|
|
24
|
-
此前 init 脚本普遍使用 `s.tables.register` + `s.tables.sync_columns`:
|
|
25
|
-
|
|
26
|
-
- `sync_columns` 仅从物理库同步结构;
|
|
27
|
-
- 对未显式传入的列,最多**推断** `display_name`(token 词典),**不会**写入业务 `description`;
|
|
28
|
-
- 规划文档 §3.x 中的「显示名」「说明」列无法落到平台。
|
|
29
|
-
|
|
30
|
-
### 2.2 解决方案:`TABLE_REGISTRY` + `register_with_meta`
|
|
31
|
-
|
|
32
|
-
**脚本约定**:init 顶部维护 `TABLE_REGISTRY`,与规划文档 §2.3 表清单、§3.x 字段表 **逐行对齐**。
|
|
33
|
-
|
|
34
|
-
```python
|
|
35
|
-
TABLE_REGISTRY = {
|
|
36
|
-
"dim_account": {
|
|
37
|
-
"display_name": "科目维表",
|
|
38
|
-
"description": "会计科目主数据",
|
|
39
|
-
"columns": [
|
|
40
|
-
{"name": "account_id", "display_name": "科目 ID", "description": "主键"},
|
|
41
|
-
{"name": "account_code", "display_name": "科目编码"},
|
|
42
|
-
# ...
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
for tbl_name, meta in TABLE_REGISTRY.items():
|
|
48
|
-
s.tables.register_with_meta(
|
|
49
|
-
table_name=tbl_name,
|
|
50
|
-
display_name=meta["display_name"],
|
|
51
|
-
description=meta.get("description"),
|
|
52
|
-
columns=meta["columns"],
|
|
53
|
-
force_column_meta=True, # 规划变更后重跑 init 时刷新列元数据
|
|
54
|
-
)
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**SDK API**:
|
|
58
|
-
|
|
59
|
-
| API | 作用 |
|
|
60
|
-
|-----|------|
|
|
61
|
-
| `s.tables.register_with_meta(...)` | `register` → `sync_columns` → `set_column_meta` 三步合一(**推荐**) |
|
|
62
|
-
| `s.tables.set_column_meta(table, columns, force=False)` | 单独批量写列 `display_name` / `description` / `business_role` |
|
|
63
|
-
|
|
64
|
-
**幂等规则**:
|
|
65
|
-
|
|
66
|
-
- `force_column_meta=False`(默认):仅补空显示名或与字段名相同的显示名、空 `description`;
|
|
67
|
-
- `force_column_meta=True`:按入参强制刷新(规划修订后重跑 init)。
|
|
68
|
-
|
|
69
|
-
### 2.3 平台效果
|
|
70
|
-
|
|
71
|
-
| 元数据字段 | 用户可见处 |
|
|
72
|
-
|-----------|-----------|
|
|
73
|
-
| 表 `display_name` | 侧栏表名、表列表 |
|
|
74
|
-
| 表 `description` | 表详情/预览说明 |
|
|
75
|
-
| 列 `display_name` | 表预览列标题 |
|
|
76
|
-
| 列 `description` | 列说明、规划口径 |
|
|
77
|
-
|
|
78
|
-
### 2.4 与 `sync_columns` 的分工
|
|
79
|
-
|
|
80
|
-
| 操作 | 结构同步 | 表显示名 | 列显示名 | 列说明 |
|
|
81
|
-
|------|---------|---------|---------|--------|
|
|
82
|
-
| `sync_columns` | ✅ | 推断(有限) | 推断(有限) | ❌ |
|
|
83
|
-
| `register_with_meta` + `columns` | ✅ | ✅ | ✅ | ✅ |
|
|
84
|
-
|
|
85
|
-
智能体生成 init 时须使用 `register_with_meta`,勿仅用 `sync_columns` 代替业务元数据。
|
|
86
|
-
|
|
87
|
-
### 2.5 示例
|
|
88
|
-
|
|
89
|
-
| 用途 | 路径 |
|
|
90
|
-
|------|------|
|
|
91
|
-
| 利润 init | `资源/examples/onto/利润示例/setup/profit_ontology_init.py` |
|
|
92
|
-
| 利润分类 | `.../setup/profit_category_mount.py` |
|
|
93
|
-
| 销售 init | `资源/examples/onto/销售示例/setup/sales_ontology_init.py` |
|
|
94
|
-
| 销售分类 | `.../setup/sales_category_mount.py` |
|
|
95
|
-
| 规划 |
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 3. 本体分类功能(重点)
|
|
100
|
-
|
|
101
|
-
> 详细方案见 [本体分类规划与 SDK 扩展方案](./本体分类规划与SDK扩展方案.md)。
|
|
102
|
-
|
|
103
|
-
### 3.1 两类分类,一套语言
|
|
104
|
-
|
|
105
|
-
| 维度 | 规划语义分类 | ads_categories 平台分类 |
|
|
106
|
-
|------|-------------|------------------------|
|
|
107
|
-
| 作用 | 规划自检、命名约束 | 侧栏展示、资源分组 |
|
|
108
|
-
| 对齐 | 平台 `category_name` **=** 平台标准分类中文名 | 禁止自定义别名 |
|
|
109
|
-
| 树结构 | — | 全部 **平级** 挂空间默认根下 |
|
|
110
|
-
|
|
111
|
-
### 3.2 SDK 入口
|
|
112
|
-
|
|
113
|
-
```python
|
|
114
|
-
s.categories.ensure_347(kind="table", category="维度表")
|
|
115
|
-
s.categories.assign_table("维度表", "dim_account")
|
|
116
|
-
s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
实现:`sdk_category_taxonomy.py`(字典)、`sdk_category.py`(`CategoryManager`)、`s.categories` 挂载于 `SpaceHandle`。
|
|
120
|
-
|
|
121
|
-
### 3.3 六类资源
|
|
122
|
-
|
|
123
|
-
| kind | 示例标准名 |
|
|
124
|
-
|------|-----------|
|
|
125
|
-
| `table` | 时间维、维度表、事实表、桥表、映射表、配置表、汇总表、临时表 |
|
|
126
|
-
| `cube` | 流程型、主体型、对比型、快照型 |
|
|
127
|
-
| `object` | 主数据、事务、分析、参考、配置 |
|
|
128
|
-
| `relation` | 时间关联、主数据关联、层级自关联、预实关联、桥接关联 |
|
|
129
|
-
| `link` | 归属关系、分析归因、层级关系、对比关系 |
|
|
130
|
-
| `function` | 总览分析、趋势分析、结构分析、预实分析、组织分析 |
|
|
131
|
-
|
|
132
|
-
### 3.4 `CATEGORY_REGISTRY` + `apply_registry`
|
|
133
|
-
|
|
134
|
-
独立 `setup/*_category_mount.py` 顶部字典,与规划 **附录 B** 逐行一致;在 **init + seed + 全部函数 publish 之后** 调用:
|
|
135
|
-
|
|
136
|
-
```python
|
|
137
|
-
CATEGORY_REGISTRY = {
|
|
138
|
-
"table": {"维度表": ["dim_account"], "事实表": ["fact_gl_journal_entry"]},
|
|
139
|
-
"cube": {"流程型": ["ActualCube"]},
|
|
140
|
-
"object": {"主数据": ["Account"], "事务": ["JournalEntry"]},
|
|
141
|
-
"relation": {"时间关联": [("fact_gl_journal_entry", "dim_date")]},
|
|
142
|
-
"link": {"归属关系": ["entry_belongs_account"]},
|
|
143
|
-
"function": {"总览分析": ["profit.fn.get_summary"]},
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
cat_counts = s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
`skip_missing=True` 仅跳过**成员不存在**的挂载;`ensure_347` 使用的分类名必须在 平台分类字典中存在。
|
|
150
|
-
|
|
151
|
-
### 3.5 内联挂载平台分类(SDK 参数 `category_347=`)
|
|
152
|
-
|
|
153
|
-
```python
|
|
154
|
-
s.tables.register_with_meta("dim_account", display_name="科目维表", category_347="维度表", ...)
|
|
155
|
-
s.register_cube("ActualCube", ..., category_347="流程型")
|
|
156
|
-
s.onto.define_object_type("Account", name="科目", category_347="主数据")
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
与 `apply_registry` 幂等可并存。详见 [SDK 参考 §5.6](./dazi_script_sdk_reference.md)。
|
|
160
|
-
|
|
161
|
-
### 3.6 实施四阶段(init → seed → 函数 → category_mount)
|
|
162
|
-
|
|
163
|
-
| 阶段 | 内容 |
|
|
164
|
-
|------|------|
|
|
165
|
-
| B init | 建表、元数据、关系、Cube、本体对象/链接(**不含**分类挂载) |
|
|
166
|
-
| C seed | `*_seed_data.py` 灌数 |
|
|
167
|
-
| D 函数 | `publish --register-function-id`(每个 `functions/*.py`) |
|
|
168
|
-
| E 分类 | `*_category_mount.py` 全量 `apply_registry`(**最后**,类灌数);或 `--register-platform-category` |
|
|
169
|
-
|
|
170
|
-
**TRAE 常见问题**:规划列了 function_id 但文件未齐 / 未 publish → `function list` 看不到;补发函数后**只重跑 category_mount**,**勿**为重挂分类重跑完整 init。
|
|
171
|
-
|
|
172
|
-
**推荐命令序列**:见 [脚本运行常见错误处理](./脚本运行常见错误处理.md) §6、§8。
|
|
173
|
-
|
|
174
|
-
### 3.7 规划自检(命名规范 §8.4 扩展 6a–6e 平台分类)
|
|
175
|
-
|
|
176
|
-
| # | 检查项 |
|
|
177
|
-
|---|--------|
|
|
178
|
-
| 6a | 附录 B 与 `*_category_mount.py` `CATEGORY_REGISTRY` 一致 |
|
|
179
|
-
| 6b | 每张表标注 平台标准分类中文名 |
|
|
180
|
-
| 6c | 每个 Cube 标注流程型/主体型/对比型/快照型 |
|
|
181
|
-
| 6d | 对象/链接/关系扩展类别与字典一致 |
|
|
182
|
-
| 6e | 已 run `*_category_mount.py`;侧栏与平台标准分类一致 |
|
|
183
|
-
|
|
184
|
-
### 3.8 缺陷修复:表类中文名索引
|
|
185
|
-
|
|
186
|
-
`apply_registry` 报 `平台分类字典中不存在分类: kind='table', category='维度表'` 时,根因是 `TABLE_CATEGORIES` 曾缺中文 key(非脚本 UTF-8 编码问题)。已补充中文名索引与 `resolve_category_meta` 反查兜底;须部署新版 backend。
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## 4. TRAE / 智能体引导
|
|
191
|
-
|
|
192
|
-
| 改动 | 说明 |
|
|
193
|
-
|------|------|
|
|
194
|
-
| 快速启动 §0 任务模式 | 规划 vs 实现;实施顺序含 `category_mount` |
|
|
195
|
-
| `onto/planning-design` 提示词 | 阶段门禁、附录 B、category_mount 放最后 |
|
|
196
|
-
| `onto/script-publish-run` 提示词 | §4.5 平台分类挂载 |
|
|
197
|
-
| 本体规划指南 | 五阶段实施顺序、平台分类列 |
|
|
198
|
-
| 脚本运行常见错误处理 | TRAE 踩坑与推荐命令 |
|
|
199
|
-
| SDK 参考 §5.6 | `categories` 与 `category_347` |
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## 5. 部署与验收
|
|
204
|
-
|
|
205
|
-
**测试/生产 backend 须包含**(版本低于下列能力时,init 或 category_mount 会报错):
|
|
206
|
-
|
|
207
|
-
| 能力 | 说明 |
|
|
208
|
-
|------|------|
|
|
209
|
-
| 表元数据注册 | `s.tables.register_with_meta` |
|
|
210
|
-
| 平台分类挂载 | `s.categories`、`apply_registry` |
|
|
211
|
-
| 按资源类挂载 | `apply_registry(..., kinds=[...])` |
|
|
212
|
-
| 发布时挂函数分类 | API `register_platform_category` / CLI `--register-platform-category` |
|
|
213
|
-
| 表类中文名索引 | 平台分类字典支持「维度表」「事实表」等标准名 |
|
|
214
|
-
|
|
215
|
-
**验收**:
|
|
216
|
-
|
|
217
|
-
1. 侧栏表名、列标题与规划显示名一致。
|
|
218
|
-
2. 侧栏分类名为平台标准分类中文名(含 function 段)。
|
|
219
|
-
3. init / seed 重跑幂等;`category_mount` 重跑幂等。
|
|
220
|
-
4. `CATEGORY_REGISTRY` 与附录 B 一致;`function list` 条数与规划一致。
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## 6. 相关文档
|
|
225
|
-
|
|
226
|
-
| 文档 | 说明 |
|
|
227
|
-
| ---- | ---- |
|
|
228
|
-
| [本体本体命名规范](./本体命名规范_物理表Cube与对象.md) | 命名与分类真理源 |
|
|
229
|
-
| [本体本体分类规划与SDK扩展方案](./本体分类规划与SDK扩展方案.md) | 分类 SDK 设计 |
|
|
230
|
-
| [本体脚本编写指南](./本体脚本编写指南.md) | init / seed / category_mount |
|
|
231
|
-
| [脚本运行常见错误处理](./脚本运行常见错误处理.md) | TRAE 踩坑 |
|
|
232
|
-
| [dazi_script_sdk_reference](./dazi_script_sdk_reference.md) | API 参考 |
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
**变更记录**
|
|
237
|
-
|
|
238
|
-
| 日期 | 说明 |
|
|
239
|
-
| ---- | ---- |
|
|
240
|
-
| 2026-06-06 | 首版 |
|
|
241
|
-
| 2026-06-06 | 增补函数注册门禁与 TRAE 处理说明 |
|
|
242
|
-
| 2026-06-06 | 分类挂载迁至 `*_category_mount.py`;init 不含 apply_registry |
|
|
1
|
+
# 本体开发优化总结
|
|
2
|
+
|
|
3
|
+
**文档 ID**:`onto/dev-optimization-summary`
|
|
4
|
+
|
|
5
|
+
> **类型**:开发总结(本轮本体 SDK、init 脚本、规划与 TRAE 引导优化)
|
|
6
|
+
> **同步路径**:`dazi docs sync` → `资源/docs/onto/本体开发优化总结.md`
|
|
7
|
+
> **前置依据**:[本体命名规范](./本体命名规范_物理表Cube与对象.md)、[本体分类规划与SDK扩展方案](./本体分类规划与SDK扩展方案.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 本轮目标
|
|
12
|
+
|
|
13
|
+
在 本体命名规范基础上,打通 **规划文档 → init 脚本 → 平台侧栏** 三条链路,解决两类长期缺口:
|
|
14
|
+
|
|
15
|
+
1. **表/列显示名与业务说明**:侧栏、表预览不再只显示物理字段名。
|
|
16
|
+
2. **平台分类与平台分类**:规划中的「类别/分类」列能幂等挂载到 `ads_categories`,侧栏分组与规划一致。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. 表显示名与列显示名
|
|
21
|
+
|
|
22
|
+
### 2.1 问题背景
|
|
23
|
+
|
|
24
|
+
此前 init 脚本普遍使用 `s.tables.register` + `s.tables.sync_columns`:
|
|
25
|
+
|
|
26
|
+
- `sync_columns` 仅从物理库同步结构;
|
|
27
|
+
- 对未显式传入的列,最多**推断** `display_name`(token 词典),**不会**写入业务 `description`;
|
|
28
|
+
- 规划文档 §3.x 中的「显示名」「说明」列无法落到平台。
|
|
29
|
+
|
|
30
|
+
### 2.2 解决方案:`TABLE_REGISTRY` + `register_with_meta`
|
|
31
|
+
|
|
32
|
+
**脚本约定**:init 顶部维护 `TABLE_REGISTRY`,与规划文档 §2.3 表清单、§3.x 字段表 **逐行对齐**。
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
TABLE_REGISTRY = {
|
|
36
|
+
"dim_account": {
|
|
37
|
+
"display_name": "科目维表",
|
|
38
|
+
"description": "会计科目主数据",
|
|
39
|
+
"columns": [
|
|
40
|
+
{"name": "account_id", "display_name": "科目 ID", "description": "主键"},
|
|
41
|
+
{"name": "account_code", "display_name": "科目编码"},
|
|
42
|
+
# ...
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for tbl_name, meta in TABLE_REGISTRY.items():
|
|
48
|
+
s.tables.register_with_meta(
|
|
49
|
+
table_name=tbl_name,
|
|
50
|
+
display_name=meta["display_name"],
|
|
51
|
+
description=meta.get("description"),
|
|
52
|
+
columns=meta["columns"],
|
|
53
|
+
force_column_meta=True, # 规划变更后重跑 init 时刷新列元数据
|
|
54
|
+
)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**SDK API**:
|
|
58
|
+
|
|
59
|
+
| API | 作用 |
|
|
60
|
+
|-----|------|
|
|
61
|
+
| `s.tables.register_with_meta(...)` | `register` → `sync_columns` → `set_column_meta` 三步合一(**推荐**) |
|
|
62
|
+
| `s.tables.set_column_meta(table, columns, force=False)` | 单独批量写列 `display_name` / `description` / `business_role` |
|
|
63
|
+
|
|
64
|
+
**幂等规则**:
|
|
65
|
+
|
|
66
|
+
- `force_column_meta=False`(默认):仅补空显示名或与字段名相同的显示名、空 `description`;
|
|
67
|
+
- `force_column_meta=True`:按入参强制刷新(规划修订后重跑 init)。
|
|
68
|
+
|
|
69
|
+
### 2.3 平台效果
|
|
70
|
+
|
|
71
|
+
| 元数据字段 | 用户可见处 |
|
|
72
|
+
|-----------|-----------|
|
|
73
|
+
| 表 `display_name` | 侧栏表名、表列表 |
|
|
74
|
+
| 表 `description` | 表详情/预览说明 |
|
|
75
|
+
| 列 `display_name` | 表预览列标题 |
|
|
76
|
+
| 列 `description` | 列说明、规划口径 |
|
|
77
|
+
|
|
78
|
+
### 2.4 与 `sync_columns` 的分工
|
|
79
|
+
|
|
80
|
+
| 操作 | 结构同步 | 表显示名 | 列显示名 | 列说明 |
|
|
81
|
+
|------|---------|---------|---------|--------|
|
|
82
|
+
| `sync_columns` | ✅ | 推断(有限) | 推断(有限) | ❌ |
|
|
83
|
+
| `register_with_meta` + `columns` | ✅ | ✅ | ✅ | ✅ |
|
|
84
|
+
|
|
85
|
+
智能体生成 init 时须使用 `register_with_meta`,勿仅用 `sync_columns` 代替业务元数据。
|
|
86
|
+
|
|
87
|
+
### 2.5 示例
|
|
88
|
+
|
|
89
|
+
| 用途 | 路径 |
|
|
90
|
+
|------|------|
|
|
91
|
+
| 利润 init | `资源/examples/onto/利润示例/setup/profit_ontology_init.py` |
|
|
92
|
+
| 利润分类 | `.../setup/profit_category_mount.py` |
|
|
93
|
+
| 销售 init | `资源/examples/onto/销售示例/setup/sales_ontology_init.py` |
|
|
94
|
+
| 销售分类 | `.../setup/sales_category_mount.py` |
|
|
95
|
+
| 规划 | `资源/examples/onto/*/plans/*.md`(索引 `index.json` · `dazi examples onto list`) |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 3. 本体分类功能(重点)
|
|
100
|
+
|
|
101
|
+
> 详细方案见 [本体分类规划与 SDK 扩展方案](./本体分类规划与SDK扩展方案.md)。
|
|
102
|
+
|
|
103
|
+
### 3.1 两类分类,一套语言
|
|
104
|
+
|
|
105
|
+
| 维度 | 规划语义分类 | ads_categories 平台分类 |
|
|
106
|
+
|------|-------------|------------------------|
|
|
107
|
+
| 作用 | 规划自检、命名约束 | 侧栏展示、资源分组 |
|
|
108
|
+
| 对齐 | 平台 `category_name` **=** 平台标准分类中文名 | 禁止自定义别名 |
|
|
109
|
+
| 树结构 | — | 全部 **平级** 挂空间默认根下 |
|
|
110
|
+
|
|
111
|
+
### 3.2 SDK 入口
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
s.categories.ensure_347(kind="table", category="维度表")
|
|
115
|
+
s.categories.assign_table("维度表", "dim_account")
|
|
116
|
+
s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
实现:`sdk_category_taxonomy.py`(字典)、`sdk_category.py`(`CategoryManager`)、`s.categories` 挂载于 `SpaceHandle`。
|
|
120
|
+
|
|
121
|
+
### 3.3 六类资源
|
|
122
|
+
|
|
123
|
+
| kind | 示例标准名 |
|
|
124
|
+
|------|-----------|
|
|
125
|
+
| `table` | 时间维、维度表、事实表、桥表、映射表、配置表、汇总表、临时表 |
|
|
126
|
+
| `cube` | 流程型、主体型、对比型、快照型 |
|
|
127
|
+
| `object` | 主数据、事务、分析、参考、配置 |
|
|
128
|
+
| `relation` | 时间关联、主数据关联、层级自关联、预实关联、桥接关联 |
|
|
129
|
+
| `link` | 归属关系、分析归因、层级关系、对比关系 |
|
|
130
|
+
| `function` | 总览分析、趋势分析、结构分析、预实分析、组织分析 |
|
|
131
|
+
|
|
132
|
+
### 3.4 `CATEGORY_REGISTRY` + `apply_registry`
|
|
133
|
+
|
|
134
|
+
独立 `setup/*_category_mount.py` 顶部字典,与规划 **附录 B** 逐行一致;在 **init + seed + 全部函数 publish 之后** 调用:
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
CATEGORY_REGISTRY = {
|
|
138
|
+
"table": {"维度表": ["dim_account"], "事实表": ["fact_gl_journal_entry"]},
|
|
139
|
+
"cube": {"流程型": ["ActualCube"]},
|
|
140
|
+
"object": {"主数据": ["Account"], "事务": ["JournalEntry"]},
|
|
141
|
+
"relation": {"时间关联": [("fact_gl_journal_entry", "dim_date")]},
|
|
142
|
+
"link": {"归属关系": ["entry_belongs_account"]},
|
|
143
|
+
"function": {"总览分析": ["profit.fn.get_summary"]},
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
cat_counts = s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
`skip_missing=True` 仅跳过**成员不存在**的挂载;`ensure_347` 使用的分类名必须在 平台分类字典中存在。
|
|
150
|
+
|
|
151
|
+
### 3.5 内联挂载平台分类(SDK 参数 `category_347=`)
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
s.tables.register_with_meta("dim_account", display_name="科目维表", category_347="维度表", ...)
|
|
155
|
+
s.register_cube("ActualCube", ..., category_347="流程型")
|
|
156
|
+
s.onto.define_object_type("Account", name="科目", category_347="主数据")
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
与 `apply_registry` 幂等可并存。详见 [SDK 参考 §5.6](./dazi_script_sdk_reference.md)。
|
|
160
|
+
|
|
161
|
+
### 3.6 实施四阶段(init → seed → 函数 → category_mount)
|
|
162
|
+
|
|
163
|
+
| 阶段 | 内容 |
|
|
164
|
+
|------|------|
|
|
165
|
+
| B init | 建表、元数据、关系、Cube、本体对象/链接(**不含**分类挂载) |
|
|
166
|
+
| C seed | `*_seed_data.py` 灌数 |
|
|
167
|
+
| D 函数 | `publish --register-function-id`(每个 `functions/*.py`) |
|
|
168
|
+
| E 分类 | `*_category_mount.py` 全量 `apply_registry`(**最后**,类灌数);或 `--register-platform-category` |
|
|
169
|
+
|
|
170
|
+
**TRAE 常见问题**:规划列了 function_id 但文件未齐 / 未 publish → `function list` 看不到;补发函数后**只重跑 category_mount**,**勿**为重挂分类重跑完整 init。
|
|
171
|
+
|
|
172
|
+
**推荐命令序列**:见 [脚本运行常见错误处理](./脚本运行常见错误处理.md) §6、§8。
|
|
173
|
+
|
|
174
|
+
### 3.7 规划自检(命名规范 §8.4 扩展 6a–6e 平台分类)
|
|
175
|
+
|
|
176
|
+
| # | 检查项 |
|
|
177
|
+
|---|--------|
|
|
178
|
+
| 6a | 附录 B 与 `*_category_mount.py` `CATEGORY_REGISTRY` 一致 |
|
|
179
|
+
| 6b | 每张表标注 平台标准分类中文名 |
|
|
180
|
+
| 6c | 每个 Cube 标注流程型/主体型/对比型/快照型 |
|
|
181
|
+
| 6d | 对象/链接/关系扩展类别与字典一致 |
|
|
182
|
+
| 6e | 已 run `*_category_mount.py`;侧栏与平台标准分类一致 |
|
|
183
|
+
|
|
184
|
+
### 3.8 缺陷修复:表类中文名索引
|
|
185
|
+
|
|
186
|
+
`apply_registry` 报 `平台分类字典中不存在分类: kind='table', category='维度表'` 时,根因是 `TABLE_CATEGORIES` 曾缺中文 key(非脚本 UTF-8 编码问题)。已补充中文名索引与 `resolve_category_meta` 反查兜底;须部署新版 backend。
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 4. TRAE / 智能体引导
|
|
191
|
+
|
|
192
|
+
| 改动 | 说明 |
|
|
193
|
+
|------|------|
|
|
194
|
+
| 快速启动 §0 任务模式 | 规划 vs 实现;实施顺序含 `category_mount` |
|
|
195
|
+
| `onto/planning-design` 提示词 | 阶段门禁、附录 B、category_mount 放最后 |
|
|
196
|
+
| `onto/script-publish-run` 提示词 | §4.5 平台分类挂载 |
|
|
197
|
+
| 本体规划指南 | 五阶段实施顺序、平台分类列 |
|
|
198
|
+
| 脚本运行常见错误处理 | TRAE 踩坑与推荐命令 |
|
|
199
|
+
| SDK 参考 §5.6 | `categories` 与 `category_347` |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 5. 部署与验收
|
|
204
|
+
|
|
205
|
+
**测试/生产 backend 须包含**(版本低于下列能力时,init 或 category_mount 会报错):
|
|
206
|
+
|
|
207
|
+
| 能力 | 说明 |
|
|
208
|
+
|------|------|
|
|
209
|
+
| 表元数据注册 | `s.tables.register_with_meta` |
|
|
210
|
+
| 平台分类挂载 | `s.categories`、`apply_registry` |
|
|
211
|
+
| 按资源类挂载 | `apply_registry(..., kinds=[...])` |
|
|
212
|
+
| 发布时挂函数分类 | API `register_platform_category` / CLI `--register-platform-category` |
|
|
213
|
+
| 表类中文名索引 | 平台分类字典支持「维度表」「事实表」等标准名 |
|
|
214
|
+
|
|
215
|
+
**验收**:
|
|
216
|
+
|
|
217
|
+
1. 侧栏表名、列标题与规划显示名一致。
|
|
218
|
+
2. 侧栏分类名为平台标准分类中文名(含 function 段)。
|
|
219
|
+
3. init / seed 重跑幂等;`category_mount` 重跑幂等。
|
|
220
|
+
4. `CATEGORY_REGISTRY` 与附录 B 一致;`function list` 条数与规划一致。
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 6. 相关文档
|
|
225
|
+
|
|
226
|
+
| 文档 | 说明 |
|
|
227
|
+
| ---- | ---- |
|
|
228
|
+
| [本体本体命名规范](./本体命名规范_物理表Cube与对象.md) | 命名与分类真理源 |
|
|
229
|
+
| [本体本体分类规划与SDK扩展方案](./本体分类规划与SDK扩展方案.md) | 分类 SDK 设计 |
|
|
230
|
+
| [本体脚本编写指南](./本体脚本编写指南.md) | init / seed / category_mount |
|
|
231
|
+
| [脚本运行常见错误处理](./脚本运行常见错误处理.md) | TRAE 踩坑 |
|
|
232
|
+
| [dazi_script_sdk_reference](./dazi_script_sdk_reference.md) | API 参考 |
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
**变更记录**
|
|
237
|
+
|
|
238
|
+
| 日期 | 说明 |
|
|
239
|
+
| ---- | ---- |
|
|
240
|
+
| 2026-06-06 | 首版 |
|
|
241
|
+
| 2026-06-06 | 增补函数注册门禁与 TRAE 处理说明 |
|
|
242
|
+
| 2026-06-06 | 分类挂载迁至 `*_category_mount.py`;init 不含 apply_registry |
|
|
243
|
+
| 2026-06-07 | **§352**:规划示例迁至 `examples/onto/*/plans/`;已删除 `docs/onto/规划示例_*.md` stub |
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 7. 351 补充:函数链与智能体门禁(2026-06-07)
|
|
248
|
+
|
|
249
|
+
详见内部文档 `351-Cursor智能体本体开发优化总结.md`。客户环境要点:
|
|
250
|
+
|
|
251
|
+
| 能力 | 用法 |
|
|
252
|
+
|------|------|
|
|
253
|
+
| 首次 function run | 可省略 `--params`,回退脚本 `TEST_ARGUMENTS` |
|
|
254
|
+
| save-test-arguments | `dazi onto function save-test-arguments --function-id domain.fn.xxx ...` |
|
|
255
|
+
| 函数预检 | `dazi onto script publish-preview functions/xxx.py --space <空间>` |
|
|
256
|
+
| 实施门禁 | 复制 `资源/examples/onto/_templates/onto_preflight.ps1` 到 `functions/` |
|
|
257
|
+
| init 检查 | [脚本运行常见错误处理 §1.2](./脚本运行常见错误处理.md) 五条条目 |
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
| 文档 | 说明 |
|
|
14
14
|
| ---- | ---- |
|
|
15
|
-
| **[脚本运行常见错误处理](./脚本运行常见错误处理.md)** | setup API
|
|
15
|
+
| **[脚本运行常见错误处理](./脚本运行常见错误处理.md)** | setup API 误用、bind_source 约束、`query_one` 聚合陷阱、**函数禁止 `output.print_json()`**、CLI(`function run` 回退 TEST_ARGUMENTS、`save-test-arguments --function-id`) |
|
|
16
16
|
|
|
17
17
|
`dazi docs show onto/script-run-troubleshooting` · 智能体另见提示词 **`onto/script-publish-run`**。
|
|
18
18
|
|
|
@@ -39,14 +39,15 @@
|
|
|
39
39
|
└── *.py
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
内置示例位于 **`资源/examples/onto/`**(`dazi examples sync`)。**须 `plans/` 定稿后**再借鉴或复制 init/seed(见快速启动 §0、§3;规划任务用提示词 **`onto/planning-design`**)。
|
|
42
|
+
内置示例位于 **`资源/examples/onto/`**(`dazi examples sync`)。**规划前 / 脚本前须至少阅读一个完整示例**(`README.md` + `plans/*.md`)。**须 `plans/` 定稿后**再借鉴或复制 init/seed(见快速启动 §0、§3;规划任务用提示词 **`onto/planning-design`**)。
|
|
43
43
|
|
|
44
|
-
|
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
44
|
+
| 示例 | 目录 | 规划(plans/) | 主要内容 |
|
|
45
|
+
|------|------|----------------|----------|
|
|
46
|
+
| 产品销售 | `onto/销售示例/` | `plans/规划示例_产品销售本体规划方案.md` | init、seed、7 函数、category_mount |
|
|
47
|
+
| 利润 GL | `onto/利润示例/` | `plans/规划示例_利润分析本体方案.md` | 同上 |
|
|
48
|
+
| 设备运营 | `onto/设备运营/` | `plans/化工设备运营分析本体方案.md` | 11 函数、OEE 等 |
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
索引:`资源/examples/onto/index.json` · 总览:`dazi examples show onto/readme` · 路由:`dazi examples onto suggest <关键词>`
|
|
50
51
|
|
|
51
52
|
> **不再使用** 历史路径 `onto/<space_id>/editorial/`、`editorial/functions/`、`项目/onto_<名称>/脚本/` 等作为本地开发约定。
|
|
52
53
|
|
|
@@ -96,7 +97,7 @@ s.tables.add_relationship(
|
|
|
96
97
|
|
|
97
98
|
### 表注册 `TABLE_REGISTRY` + `register_with_meta`
|
|
98
99
|
|
|
99
|
-
init 脚本顶部维护与规划文档对齐的 `TABLE_REGISTRY
|
|
100
|
+
init 脚本顶部维护与规划文档对齐的 `TABLE_REGISTRY`(本项目 `plans/*.md` 或示例 `资源/examples/onto/<名>/plans/*.md`),步骤 2 统一调用:
|
|
100
101
|
|
|
101
102
|
```python
|
|
102
103
|
TABLE_REGISTRY = {
|
|
@@ -237,7 +238,7 @@ dazi onto function run sales.fn.get_summary --space <space-id> --params '{}'
|
|
|
237
238
|
|
|
238
239
|
仅 `publish` + `function run` **不会**自动写入测试参数;侧栏 **Onto → 运行函数** 依赖函数定义上的 **`test_arguments`** 预填表单。
|
|
239
240
|
|
|
240
|
-
> **CLI
|
|
241
|
+
> **CLI 要点**:`function run` 无 `--params` 时回退 `TEST_ARGUMENTS`;`save-test-arguments` 推荐 **`--function-id`**(亦可用 `ofn_xxx`)。完整说明见 [脚本运行常见错误处理](./脚本运行常见错误处理.md)。
|
|
241
242
|
|
|
242
243
|
**本地约定(与规划文档 § 函数 / test_arguments 一致)**:
|
|
243
244
|
|
|
@@ -268,7 +269,7 @@ dazi onto function run sales.fn.get_summary --space <space-id> --params '{}'
|
|
|
268
269
|
单条保存(**须用平台内部 id `ofn_xxx`**,先 `dazi onto function list --space <space-id>` 查看;直接传 `sales.fn.xxx` 可能 **404**):
|
|
269
270
|
|
|
270
271
|
```powershell
|
|
271
|
-
dazi onto function save-test-arguments
|
|
272
|
+
dazi onto function save-test-arguments --function-id sales.fn.get_summary --space <space-id> `
|
|
272
273
|
--arguments-json-file 项目/<业务名>/本体/ontos/<实现名>/functions/test_arguments/sales.fn.get_summary.json
|
|
273
274
|
```
|
|
274
275
|
|
|
@@ -333,7 +334,6 @@ dazi onto script dedupe --space <space-id> --yes
|
|
|
333
334
|
- [本体规划指南](./本体规划指南.md)
|
|
334
335
|
- [本体函数开发指南](./function-guide.md)
|
|
335
336
|
- [本体动作开发](./action-guide.md)
|
|
336
|
-
- [
|
|
337
|
-
- [规划示例:利润分析本体(补充)](./规划示例_利润分析本体方案.md)
|
|
337
|
+
- [内置示例总览](../../examples/onto/README.md)(`资源/examples/onto/`)
|
|
338
338
|
- [本体分类规划与 SDK 扩展方案](./本体分类规划与SDK扩展方案.md)
|
|
339
339
|
- [脚本运行常见错误处理](./脚本运行常见错误处理.md)
|