@stalfh233/omc-cli 0.4.15 → 0.4.17
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/LICENSE +21 -21
- package/README.md +297 -297
- package/coverage/m1-coverage-manifest-v1.json +1278 -1277
- package/dist/args.js +0 -0
- package/dist/artifacts.js +0 -0
- package/dist/bench/call-face-eval.js +0 -0
- package/dist/bench/context-attribution.js +0 -0
- package/dist/bench/discovery-cost-eval.js +0 -0
- package/dist/bench/driver.js +0 -0
- package/dist/bench/evals.js +0 -0
- package/dist/bench/fake-http-server.js +0 -0
- package/dist/bench/instrument.js +0 -0
- package/dist/bench/intent-face-eval.js +40 -40
- package/dist/bench/run.js +0 -0
- package/dist/bench/scenario.js +0 -0
- package/dist/bench/types.js +0 -0
- package/dist/bi-wire.js +0 -0
- package/dist/bizservice-config.js +38 -13
- package/dist/call.js +0 -0
- package/dist/capability-absences.js +0 -0
- package/dist/capability-overview.js +2 -2
- package/dist/capability-shape.js +0 -0
- package/dist/cli-contract.js +0 -0
- package/dist/cli-output.js +41 -15
- package/dist/cli.js +24 -2
- package/dist/code-rules.js +0 -0
- package/dist/command-transport.js +0 -0
- package/dist/config-store.js +4 -0
- package/dist/context.js +0 -0
- package/dist/contract-consistency.js +0 -0
- package/dist/contract-resources.js +0 -0
- package/dist/coverage-consistency.js +0 -0
- package/dist/coverage-registry.js +0 -0
- package/dist/coverage.js +0 -0
- package/dist/data-list-filter.js +0 -0
- package/dist/discovery.js +0 -0
- package/dist/endpoints.js +2 -0
- package/dist/environment-policy.js +0 -0
- package/dist/execution-metadata.js +4 -4
- package/dist/fake/app.js +0 -0
- package/dist/fake/b2-registration.js +26 -0
- package/dist/fake/businessrule.js +0 -0
- package/dist/fake/datarule.js +0 -0
- package/dist/fake/dictionary.js +0 -0
- package/dist/fake/environment.js +0 -0
- package/dist/fake/field.js +0 -0
- package/dist/fake/form.js +0 -0
- package/dist/fake/index.js +0 -0
- package/dist/fake/list-view.js +0 -0
- package/dist/fake/model.js +0 -0
- package/dist/fake/online-js.js +0 -0
- package/dist/fake/report.js +0 -0
- package/dist/fake/routes.js +0 -0
- package/dist/fake/rule-lifecycle.js +0 -0
- package/dist/fake/runtime-data.js +0 -0
- package/dist/fake/state.js +0 -0
- package/dist/fake/workflow.js +0 -0
- package/dist/field-change.js +0 -0
- package/dist/field-families.js +48 -0
- package/dist/form-layout.js +0 -0
- package/dist/form-support.js +12 -2
- package/dist/goal-routes.js +0 -0
- package/dist/governed-execution.js +0 -0
- package/dist/human-summary.js +0 -0
- package/dist/identity.js +0 -0
- package/dist/intent/baseline.js +0 -0
- package/dist/intent/capabilities/bizservice.js +0 -0
- package/dist/intent/capabilities/businessrule.js +0 -0
- package/dist/intent/capabilities/datarule.js +0 -0
- package/dist/intent/capabilities/field.js +0 -0
- package/dist/intent/capabilities/form.js +0 -0
- package/dist/intent/capabilities/index.js +0 -0
- package/dist/intent/capabilities/listview.js +0 -0
- package/dist/intent/capabilities/model.js +0 -0
- package/dist/intent/capabilities/onlinejs.js +0 -0
- package/dist/intent/capabilities/report.js +0 -0
- package/dist/intent/capabilities/workflow.js +0 -0
- package/dist/intent/capability.js +0 -0
- package/dist/intent/cli.js +0 -0
- package/dist/intent/compare.js +0 -0
- package/dist/intent/compiler.js +0 -0
- package/dist/intent/dsl.js +0 -0
- package/dist/intent/plan-file.js +0 -0
- package/dist/intent/readback.js +0 -0
- package/dist/intent/schema.js +0 -0
- package/dist/intent/validation.js +0 -0
- package/dist/intent/yaml.js +0 -0
- package/dist/json-column.js +0 -0
- package/dist/lanes/app-contract.js +0 -0
- package/dist/lanes/app-coverage.js +0 -0
- package/dist/lanes/app.js +0 -0
- package/dist/lanes/apply-changes.js +14 -1
- package/dist/lanes/b2-registration-contract.js +5 -0
- package/dist/lanes/b2-registration-coverage.js +1 -0
- package/dist/lanes/b2-registration.js +55 -6
- package/dist/lanes/businessrule-contract.js +0 -0
- package/dist/lanes/businessrule-coverage.js +0 -0
- package/dist/lanes/businessrule.js +0 -0
- package/dist/lanes/contract-support.js +0 -0
- package/dist/lanes/coverage-declaration.js +0 -0
- package/dist/lanes/datarule-contract.js +0 -0
- package/dist/lanes/datarule-coverage.js +0 -0
- package/dist/lanes/datarule-protocol.js +0 -0
- package/dist/lanes/datarule.js +0 -0
- package/dist/lanes/dictionary-contract.js +0 -0
- package/dist/lanes/dictionary-coverage.js +0 -0
- package/dist/lanes/dictionary.js +0 -0
- package/dist/lanes/environment-contract.js +0 -0
- package/dist/lanes/environment-coverage.js +0 -0
- package/dist/lanes/environment.js +0 -0
- package/dist/lanes/field-contract.js +3 -2
- package/dist/lanes/field-coverage.js +0 -0
- package/dist/lanes/field.js +268 -172
- package/dist/lanes/form-contract.js +2 -2
- package/dist/lanes/form-coverage.js +0 -0
- package/dist/lanes/form.js +4 -0
- package/dist/lanes/lane-ids.js +0 -0
- package/dist/lanes/list-view-contract.js +0 -0
- package/dist/lanes/list-view-coverage.js +0 -0
- package/dist/lanes/list-view-shapes.js +0 -0
- package/dist/lanes/list-view.js +0 -0
- package/dist/lanes/meta-contract.js +0 -0
- package/dist/lanes/meta.js +11 -1
- package/dist/lanes/model-contract.js +0 -0
- package/dist/lanes/model-coverage.js +0 -0
- package/dist/lanes/model.js +1 -1
- package/dist/lanes/online-js-contract.js +0 -0
- package/dist/lanes/online-js-coverage.js +0 -0
- package/dist/lanes/online-js.js +0 -0
- package/dist/lanes/report-contract.js +0 -0
- package/dist/lanes/report-coverage.js +0 -0
- package/dist/lanes/report.js +0 -0
- package/dist/lanes/rule-graph.js +0 -0
- package/dist/lanes/rule-lifecycle-contract.js +0 -0
- package/dist/lanes/rule-lifecycle-coverage.js +0 -0
- package/dist/lanes/rule-lifecycle.js +0 -0
- package/dist/lanes/runtime-data-contract.js +0 -0
- package/dist/lanes/runtime-data-coverage.js +0 -0
- package/dist/lanes/runtime-data.js +0 -0
- package/dist/lanes/workflow-contract.js +0 -0
- package/dist/lanes/workflow-coverage.js +0 -0
- package/dist/lanes/workflow.js +2 -0
- package/dist/omc-core-lazy.js +6 -0
- package/dist/online-js-layout.js +0 -0
- package/dist/online-js-source.js +28 -28
- package/dist/package-tool.js +0 -0
- package/dist/package.js +0 -0
- package/dist/plan.js +11 -1
- package/dist/read.js +0 -0
- package/dist/redact.js +0 -0
- package/dist/rule-support.js +0 -0
- package/dist/runtime-support.js +0 -0
- package/dist/service-doctor.js +28 -0
- package/dist/session-manager.js +14 -2
- package/dist/session.js +68 -13
- package/dist/skills.js +0 -0
- package/dist/sqlite-warning-filter.js +27 -0
- package/dist/support.js +0 -0
- package/dist/token-cache.js +65 -0
- package/dist/tool-types.js +0 -0
- package/dist/tools.js +0 -0
- package/dist/usage-log.js +4 -0
- package/dist/wire.js +0 -0
- package/dist/workflow-support.js +0 -0
- package/dist/write-lease.js +0 -0
- package/dist/write-lock.js +0 -0
- package/dist/write.js +24 -2
- package/dist/zip.js +0 -0
- package/docs/tool-surface-map.md +42 -42
- package/package.json +71 -71
- package/skills/omc-acceptance-criteria.md +47 -47
- package/skills/omc-business-configuration.md +258 -257
- package/skills/omc-capabilities.md +197 -197
- package/skills/omc-capability-scouting.md +55 -55
- package/skills/omc-config-draft-review.md +171 -171
- package/skills/omc-five-piece-flow.md +35 -35
- package/skills/omc-glossary.md +86 -86
- package/skills/omc-refusals.md +110 -110
- package/skills/omc-requirement-analysis.md +161 -161
- package/skills/omc-requirement-vocabulary.md +51 -51
- package/skills/omc-start-here.md +82 -82
- package/skills/omc-tool-selection.md +119 -119
- package/skills/omc-write-hazards.md +88 -87
- package/dist/approval-token.js +0 -102
- package/dist/server.js +0 -92
|
@@ -1,257 +1,258 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: omc-business-configuration
|
|
3
|
-
description: 中文 CloudPivot 业务配置 runbook。用于把模型、字段、表单、视图、子表、流程权限、业务规则、按钮、在线 JS 和现存业务集成方法按需求落地并验收。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# CloudPivot 业务配置 Runbook
|
|
7
|
-
|
|
8
|
-
本技能讲业务需求如何落成配置包;底层 wire 形状和白屏陷阱见 `omc-write-hazards`。
|
|
9
|
-
|
|
10
|
-
## 入口
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
CLI="packages/omc-cli/dist/cli.js"
|
|
14
|
-
node "$CLI" commands --json
|
|
15
|
-
node "$CLI" describe <tool>
|
|
16
|
-
node "$CLI" contract <lane>
|
|
17
|
-
node "$CLI" call discover_environment --env <env> --args '{}'
|
|
18
|
-
node "$CLI" help omc-config-draft-review
|
|
19
|
-
node "$CLI" help omc-five-piece-flow
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## 需求五维
|
|
23
|
-
|
|
24
|
-
把需求拆成五个维度(注意:这是**需求维度**,不同于 `omc-five-piece-flow` 的"五件套"执行五阶段):
|
|
25
|
-
|
|
26
|
-
1. **模型**:主对象、应用、业务 code。
|
|
27
|
-
2. **字段**:类型、选项、关联目标、模型可空性。
|
|
28
|
-
3. **表单与视图**:控件、子表 Sheet201、列表列、排序、筛选、按钮。
|
|
29
|
-
4. **流程**:节点、参与人、每节点字段权限。
|
|
30
|
-
5. **自动化**:规则、流程绑定、按钮、业务集成、在线 JS。
|
|
31
|
-
|
|
32
|
-
## 标准顺序
|
|
33
|
-
|
|
34
|
-
**配置顺序以 `omc-config-draft-review` §8 为唯一真相**(模型 → 字段 → 发布 → 表单 → 视图 → 规则 → 流程);执行阶段见 `omc-five-piece-flow`。本 runbook 只补充业务侧要点:
|
|
35
|
-
|
|
36
|
-
1. 读环境基线:应用、模型、字段、表单、视图、流程、规则、服务。
|
|
37
|
-
2. 出中文草稿(`omc-config-draft-review`):环境、应用、资源 code、字段表、流程图、映射、按钮、清理方案。
|
|
38
|
-
3. 取得用户明确确认;确认前不写环境。
|
|
39
|
-
4. 需求包含运行行为时,用 CLI 真实触发;测试数据的保留/清理要写进草稿。
|
|
40
|
-
|
|
41
|
-
完成标准:每项资源有 readback;每个运行写入有 delivery 状态;每个映射字段都有目标值;失败步骤、已完成步骤和清理动作可追踪。
|
|
42
|
-
|
|
43
|
-
## 模型与字段
|
|
44
|
-
|
|
45
|
-
- 模型层字段默认可空;必填、只读、可见性在表单和流程节点配置。
|
|
46
|
-
- `propertyEmpty` 默认 `false`,不要把业务必填硬编码在数据模型。
|
|
47
|
-
- 关联单选优先读目标模型已发布字段,明确显示字段;无映射不要写空数组字符串。
|
|
48
|
-
|
|
49
|
-
## 子表
|
|
50
|
-
|
|
51
|
-
一个主表可以有多个子表,但子表不能嵌套子表。
|
|
52
|
-
|
|
53
|
-
创建父字段:
|
|
54
|
-
|
|
55
|
-
```json
|
|
56
|
-
{
|
|
57
|
-
"schemaCode": "expense",
|
|
58
|
-
"code": "expense_items",
|
|
59
|
-
"name": "费用明细",
|
|
60
|
-
"propertyType": "CHILD_TABLE",
|
|
61
|
-
"subFields": [
|
|
62
|
-
{ "code": "item_name", "name": "费用项目", "propertyType": "SHORT_TEXT" },
|
|
63
|
-
{ "code": "item_amount", "name": "金额", "propertyType": "NUMERICAL" },
|
|
64
|
-
{ "code": "item_date", "name": "发生日期", "propertyType": "DATE" }
|
|
65
|
-
]
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
子列像主表字段一样 CRUD,但 schemaCode 是父字段 code:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
|
|
73
|
-
omc call field.
|
|
74
|
-
omc call field.
|
|
75
|
-
omc call field.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
-
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
- rebuild
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
|
177
|
-
|
|
|
178
|
-
|
|
|
179
|
-
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
-
|
|
189
|
-
-
|
|
190
|
-
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
201
|
-
-
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
-
|
|
209
|
-
- `
|
|
210
|
-
-
|
|
211
|
-
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
-
|
|
229
|
-
-
|
|
230
|
-
-
|
|
231
|
-
- `
|
|
232
|
-
-
|
|
233
|
-
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
- `
|
|
239
|
-
-
|
|
240
|
-
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
1
|
+
---
|
|
2
|
+
name: omc-business-configuration
|
|
3
|
+
description: 中文 CloudPivot 业务配置 runbook。用于把模型、字段、表单、视图、子表、流程权限、业务规则、按钮、在线 JS 和现存业务集成方法按需求落地并验收。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CloudPivot 业务配置 Runbook
|
|
7
|
+
|
|
8
|
+
本技能讲业务需求如何落成配置包;底层 wire 形状和白屏陷阱见 `omc-write-hazards`。
|
|
9
|
+
|
|
10
|
+
## 入口
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
CLI="packages/omc-cli/dist/cli.js"
|
|
14
|
+
node "$CLI" commands --json
|
|
15
|
+
node "$CLI" describe <tool>
|
|
16
|
+
node "$CLI" contract <lane>
|
|
17
|
+
node "$CLI" call discover_environment --env <env> --args '{}'
|
|
18
|
+
node "$CLI" help omc-config-draft-review
|
|
19
|
+
node "$CLI" help omc-five-piece-flow
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 需求五维
|
|
23
|
+
|
|
24
|
+
把需求拆成五个维度(注意:这是**需求维度**,不同于 `omc-five-piece-flow` 的"五件套"执行五阶段):
|
|
25
|
+
|
|
26
|
+
1. **模型**:主对象、应用、业务 code。
|
|
27
|
+
2. **字段**:类型、选项、关联目标、模型可空性。
|
|
28
|
+
3. **表单与视图**:控件、子表 Sheet201、列表列、排序、筛选、按钮。
|
|
29
|
+
4. **流程**:节点、参与人、每节点字段权限。
|
|
30
|
+
5. **自动化**:规则、流程绑定、按钮、业务集成、在线 JS。
|
|
31
|
+
|
|
32
|
+
## 标准顺序
|
|
33
|
+
|
|
34
|
+
**配置顺序以 `omc-config-draft-review` §8 为唯一真相**(模型 → 字段 → 发布 → 表单 → 视图 → 规则 → 流程);执行阶段见 `omc-five-piece-flow`。本 runbook 只补充业务侧要点:
|
|
35
|
+
|
|
36
|
+
1. 读环境基线:应用、模型、字段、表单、视图、流程、规则、服务。
|
|
37
|
+
2. 出中文草稿(`omc-config-draft-review`):环境、应用、资源 code、字段表、流程图、映射、按钮、清理方案。
|
|
38
|
+
3. 取得用户明确确认;确认前不写环境。
|
|
39
|
+
4. 需求包含运行行为时,用 CLI 真实触发;测试数据的保留/清理要写进草稿。
|
|
40
|
+
|
|
41
|
+
完成标准:每项资源有 readback;每个运行写入有 delivery 状态;每个映射字段都有目标值;失败步骤、已完成步骤和清理动作可追踪。
|
|
42
|
+
|
|
43
|
+
## 模型与字段
|
|
44
|
+
|
|
45
|
+
- 模型层字段默认可空;必填、只读、可见性在表单和流程节点配置。
|
|
46
|
+
- `propertyEmpty` 默认 `false`,不要把业务必填硬编码在数据模型。
|
|
47
|
+
- 关联单选优先读目标模型已发布字段,明确显示字段;无映射不要写空数组字符串。
|
|
48
|
+
|
|
49
|
+
## 子表
|
|
50
|
+
|
|
51
|
+
一个主表可以有多个子表,但子表不能嵌套子表。
|
|
52
|
+
|
|
53
|
+
创建父字段:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"schemaCode": "expense",
|
|
58
|
+
"code": "expense_items",
|
|
59
|
+
"name": "费用明细",
|
|
60
|
+
"propertyType": "CHILD_TABLE",
|
|
61
|
+
"subFields": [
|
|
62
|
+
{ "code": "item_name", "name": "费用项目", "propertyType": "SHORT_TEXT" },
|
|
63
|
+
{ "code": "item_amount", "name": "金额", "propertyType": "NUMERICAL" },
|
|
64
|
+
{ "code": "item_date", "name": "发生日期", "propertyType": "DATE" }
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
子列像主表字段一样 CRUD,但 schemaCode 是父字段 code:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# --env 在单环境项目(.omc-env 在位)可省;显式写出仅为多环境演示
|
|
73
|
+
omc call field.create --env local --args '{"schemaCode":"expense_items","code":"item_note","name":"明细备注","propertyType":"LONG_TEXT"}'
|
|
74
|
+
omc call field.update --env local --args '{"schemaCode":"expense_items","code":"item_note","name":"备注"}'
|
|
75
|
+
omc call field.delete --env local --args '{"schemaCode":"expense_items","code":"item_note"}'
|
|
76
|
+
omc call field.publish --env local --args '{"schemaCode":"expense"}'
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
父表单重建后,Sheet201 控件应有业务子列,子列 key 不应出现在普通 `viewJson`。
|
|
80
|
+
|
|
81
|
+
声明式面同样支持子表(`intent.yaml`),子列写在父字段的 `subFields` 下;子列只接受标量族,不能嵌套子表/关联/公式:
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
models:
|
|
85
|
+
- code: expense
|
|
86
|
+
name: 费用报销单
|
|
87
|
+
fields:
|
|
88
|
+
- code: expense_items
|
|
89
|
+
name: 费用明细
|
|
90
|
+
type: CHILD_TABLE
|
|
91
|
+
subFields:
|
|
92
|
+
- code: item_name
|
|
93
|
+
name: 费用项目
|
|
94
|
+
type: SHORT_TEXT
|
|
95
|
+
- code: item_amount
|
|
96
|
+
name: 金额
|
|
97
|
+
type: NUMERICAL
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`intent plan/apply/readback` 会把子列的缺失、改名、类型漂移当成独立差异(`subfield:` 资源);新增子列自动编译成 `field.create --schemaCode <父字段 code>` 并触发模型级 `field.publish`。父字段本身改名仍用 `field.update`,`field.update` 不接受 `subFields`。
|
|
101
|
+
|
|
102
|
+
`intent apply` 默认在交付后自动做一次最终读回等价确认:等价则 `verification.status:"ok"`;不等价则整体 `refused` + `blocker:"intent-readback-mismatch"`(exit 12),**绝不当作成功**——按 `verification.differences` 定位后重新 `intent plan`,不要盲重试。`--no-verify` 可关闭该确认(只在你已单独跑 readback 时)。
|
|
103
|
+
|
|
104
|
+
业务规则也进了声明式面(`models[].rules[]`)。常用数据事件规则用紧凑 `actions`,编译器合成 nodeGraph;复杂图用 `nodeGraph` 原样透传(二选一):
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
rules:
|
|
108
|
+
- code: Update # 平台预置码(Create/Update/Delete…)或自定义码
|
|
109
|
+
name: 更新归档
|
|
110
|
+
enabled: true # true → 额外 rule.enable(publish+启用);false → 已启用则 rule.disable
|
|
111
|
+
actions:
|
|
112
|
+
- type: UPDATE
|
|
113
|
+
target: archive_model # 同模型可省略 target(默认本模型);跨模型才必须写
|
|
114
|
+
filter:
|
|
115
|
+
- field: source_no
|
|
116
|
+
from: doc_no # from = 动态(触发字段);或比较键:equals/notEquals/gt/gte/lt/lte: <标量>
|
|
117
|
+
set:
|
|
118
|
+
- field: amount
|
|
119
|
+
from: total # from = 动态;也可 value: <字面量>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- **每个 filter 项必须有且只有一个条件来源**:`from`(动态 EQ)或一个比较键(`equals`/`notEquals`/`gt`/`gte`/`lt`/`lte` + 标量)。缺来源 `intent-rule-leaf-source-missing` 拒绝;**绝不**静默成 `EQ null`。
|
|
123
|
+
- 动作节点的条件分「定位数据」与「执行门」两类,**别混**(详见下「规则图的触发条件」)。
|
|
124
|
+
- **跨模型写(`targetObjectCode`≠规则模型)平台支持、可运行时生效**(2026-09-28 真机复核)。两个前提:① 承载它的规则必须真的触发——`Create` 规则在提交时触发;`Update` 规则只在 `data.update` 触发,**submit 不执行它**(放进 `Update` 是典型静默空转,lint 警告 `rule-graph-cross-model-update-trigger-inert`;也可绑定流程事件如 `end`)。② 目标行必须已提交——目标查询不匹配 DRAFT 行,`data.save` 未 submit 的行不回写。
|
|
125
|
+
- 关联字段:`type: WORK_SHEET` + `relativeCode: <目标模型>` + `options.displayField`,与 `field.create` 行形状一致。(键名是 `relativeCode`,wire 键 `relativeSchemaCode`,别混。)
|
|
126
|
+
- 节点显示名用 activity 级的 `name`(`participant.name` 只作参与者说明,平台不认作节点名;`{type: Originator, name: 部门负责人}` 会被工具提升为节点名)。
|
|
127
|
+
- **字段级数据规则**(`models[].datarules[]`,`dataRuleType` 1校验/2计算/3拼接/4必填/5只读)——注意是 `dataRuleType`(不是 `type`):
|
|
128
|
+
```yaml
|
|
129
|
+
datarules:
|
|
130
|
+
- { propertyCode: order_note, dataRuleType: 4, options: { requiredFormula: '{amount} 大于 {"valueType":"custom","value":5000}' }, name: 金额超5000说明必填 }
|
|
131
|
+
```
|
|
132
|
+
⚠️ **type 3/4/5 不驱动门户表单控件**(真机复核):平台存成 bizdatarule,只镜像进控件 `historyOpt`,运行时门户读的是控件 `options`。门户条件(如「金额>5000 时必填」)必须写在 `fields[].options`(`requiredFormula`/`readonlyCondition`/`shortTextStitch`);写进 `datarules[]` 设计器可见但门户不拦(validate/plan 给 `datarule-not-portal-facing` 警告)。datarule 只用于服务端引擎(校验/计算)。
|
|
133
|
+
|
|
134
|
+
- 规则排在字段发布之后(编译器按能力排序:先建全部模型/字段,再跑规则)。
|
|
135
|
+
- `rule.save` 只写草稿;`enabled` 由 `rule.enable` 保证(publish+启用)——readback 用 `enabled` 和**语义图摘要**(忽略画布几何)判等价。
|
|
136
|
+
|
|
137
|
+
## 表单与视图
|
|
138
|
+
|
|
139
|
+
- 新字段加入已有表单:`form.publish --args '{...,"rebuild":true}'` 一步(重建脚手架+强制提拔);或分步 `form.draft --rebuild` → `form.publish`。
|
|
140
|
+
- rebuild 会保留已识别的关系映射、显示和布局 options;Sheet201 columns 按最新子表字段刷新。
|
|
141
|
+
- **配置列表视图用 `listview.configure`(省略 `code` 即平台自动生成的默认视图 code=schemaCode),不要先 `listview.create`——那会多出一个视图。** 只有确实要第二个视图才 create;两者职责分开。
|
|
142
|
+
- 数值控件:`scale` 是小数位数(0=整数,1=1位,2=2位…);「金额两位小数」用 `scale:2`。列表列 displayFormat 由 scale 推导。
|
|
143
|
+
- **列表列只放业务字段**:平台 `listview.create` 会预置系统列(`name/creater/createdTime/sequenceNo`)和一条 `createdTime` 默认筛选;intent 的 `fieldCodes` 是权威集合,编译器用 `replaceColumns:true + hideDefaultSystemFields:true + conditions:[]` 清掉预置项。要展示某系统列/筛选就显式点名。
|
|
144
|
+
- 筛选条件默认显示:`conditions[].visible` 不传也应为 true。
|
|
145
|
+
- 配置默认视图后即可用 `data.list`;否则部分 8.6.26 读面业务列可能为 null,单行用 `data.load` 核对。
|
|
146
|
+
- 读回视图用 `listview.get`(默认回列/排序/条件/动作紧凑清单)与 `listview.list`。
|
|
147
|
+
|
|
148
|
+
## 流程字段权限
|
|
149
|
+
|
|
150
|
+
新增字段后,必须重新检查每个参与节点的 `propertyPermissions`:
|
|
151
|
+
|
|
152
|
+
- 填写节点:需求要求的字段可编辑,必要字段必填。
|
|
153
|
+
- 审批节点:通常 `visible:true, editable:false, required:false`。
|
|
154
|
+
- 不需要展示的字段明确 `visible:false`。
|
|
155
|
+
|
|
156
|
+
**怎么配**(没有单独的权限工具,别把「找不到入口」当不支持→假阻塞):`workflow.get_draft --full` 读节点正文,改目标
|
|
157
|
+
`ParticipantActivity.propertyPermissions[]`(`{propertyCode, visible, editable, required, summary, subPropertyPermissions}`),
|
|
158
|
+
用 `workflow.update` 原样回写,再 `workflow.publish`。**要生效必须 `summary:true`**(只有它进运行时 `activitySummaries`;
|
|
159
|
+
否则 `form/load` 的 `formPermission.dataPermissions` 回退默认,读不到你的 `editable:false`);子表列用 `subPropertyPermissions`。
|
|
160
|
+
验收用 `npm run test:live-permission` + **非管理员参与者**(管理员会被后端强制 `e:true` 掩盖)。
|
|
161
|
+
|
|
162
|
+
声明式流程(intent)的 `workflow.template` 用 **`activities` + `routes`**(不是 `nodes`/`edges`):活动 `{id, type: START|END|PARTICIPANT|…, participant?}`,路由 `{preNode, postNode}` 必须指向已声明活动 code;`workflow.update` 只从 `activities` 读节点,写 `nodes` 会在 apply 时 `rules[0] references an unknown activity`(validate 会提前拦)。
|
|
163
|
+
|
|
164
|
+
示例:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
开始 → 填写申请单 → 部门审批 → 财务审批 → 结束
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
如果环境里存在测试节点,先确认保留还是删除,不要静默覆盖。
|
|
171
|
+
|
|
172
|
+
## 业务规则
|
|
173
|
+
|
|
174
|
+
**先选对机制,别一律上规则图**(三者代价差很大):
|
|
175
|
+
|
|
176
|
+
| 需求形态 | 用哪个 | 入口 |
|
|
177
|
+
| --- | --- | --- |
|
|
178
|
+
| 条件必填 / 条件只读 / 恒只读(表单交互层) | 字段 `options` | `field.update --example form-conditional-required` / `form-conditional-readonly` / `form-always-readonly` |
|
|
179
|
+
| 服务端字段级校验 / 计算 / 拼接 / 显示(type 1..5) | 数据规则 | `datarule.create`(字段级引擎) |
|
|
180
|
+
| 数据事件自动化(创建/更新时改字段、调服务、发起流程) | 规则图 | 本节 `rule.save`(`--example standard-business-rule-graph`) |
|
|
181
|
+
|
|
182
|
+
「超过某值必填 / 等于某值只读」= **字段 options**,**不要**建规则图、也**不要**用 `datarule.create`
|
|
183
|
+
(实测:`datarule` type3/4/5 不会让门户表单控件变必填/只读,且符号式经 `historyOpt` 镜像会让表单渲染崩溃;
|
|
184
|
+
平台的 bizdatarule 会被镜像进表单控件 `historyOpt`,而设计器/运行时读的是控件 `options`)。
|
|
185
|
+
|
|
186
|
+
### 条件式(必填/只读/显示)怎么写
|
|
187
|
+
|
|
188
|
+
- **恒必填**:`requiredFormula: "true"`(字面量);**条件必填**:`requiredFormula: "{触发字段} 操作符 {\"valueType\":...,\"value\":...}"`。
|
|
189
|
+
- 操作符用**中文**(设计器产出):等于/不等于/大于/小于/大于等于/小于等于/包含/包含全部/等于任意一个/为空/不为空;也接受符号 `== != > >= <= Contains IsEmpty`。为空/不为空**不带值**。
|
|
190
|
+
- 写完后 `field.publish` → `configure_form`(同步进控件)→ **门户打开表单改触发字段的值**,断言目标控件变 `required` / `disabled`(存储回读不算验证)。
|
|
191
|
+
- 恒只读:`readonlyFormula: true`。
|
|
192
|
+
|
|
193
|
+
### 规则图的触发条件(关键)
|
|
194
|
+
|
|
195
|
+
规则支持**触发条件**,不要用「两条无条件规则」表达互斥结果:
|
|
196
|
+
|
|
197
|
+
- **节点级条件有两大类,别混**(各节点类型都可能有,完整字段/样例见 `describe rule.save --full` 的 RULE_NODE_TEMPLATES):
|
|
198
|
+
- **定位要操作哪些数据**(`filterCondition`:叶 `targetSchemaDataItem`+`ruleConditionType`):UPDATE=改哪条(空=整表)、DELETE=删哪条、CREATE=存在符合则不新增+`findMainData`、QUERY=`targetConditionGroups`、**ASSIGN=在输入数据源匹配要取值的行(不是执行门!)**。⚠️ 非唯一字段(金额等)会命中**多条**;改「当前/关联那一条」用唯一键(`id` 或 `from`)。`actions.filter` 表达这类(同模型省略→默认 `id=id`;跨模型省略 fail-closed)。
|
|
199
|
+
- **执行门 / 满足条件触发**(`dataCondition`,BIZ_ACTION 用 `execConditionGroups`):**与定位两码事**——决定「要不要执行」,不决定「改哪条」。compact `actions.when` 表达 UPDATE 执行门(叶 `currentSchemaDataItem`+`ruleDataConditionType`);其它节点用 `nodeGraph`。**条件改自身**:`when: [{field: amount, gt: 10000}]` + 省略 `filter`(默认 `id=id`)——别把条件写进 `filter`,那会改掉所有符合的行(bench66 多行互覆)。
|
|
200
|
+
- 子表定位 `filterSubCondition`;子表触发范围 `childTriggerConditionType∈ADD/MODIFY/DELETE`。
|
|
201
|
+
- **触发时机**:数据事件(`Create`/`Update`/`Delete`)**只分发到平台预置 code 行**;流程相关用预置 `Available`(流程生效)/`Cancel`(流程作废),或流程事件绑定 `workflow.bindRule` 的 `end`/`cancel`/`start`/`activate`。
|
|
202
|
+
- **预置规则身份不可改**:`Create`/`Update`/`Delete`/`Load`/`GetList`/`Available`/`Cancel` 名称由平台维护(`Create`=数据新增);传 `name` 不生效(仅自定义规则名称可改),可改的是节点名 `nodeName`。
|
|
203
|
+
- **流程事件只绑自定义规则**:`workflow.bindRule` 的 `ruleCodes` 只能给自定义 code——设计器的事件规则选择器不提供预置触发行(绑 `Create` 到 `end` 非法,工具 fail closed)。要「审批通过后执行某逻辑」:新建自定义规则承载动作节点再绑 `end`。
|
|
204
|
+
- **审批通过/驳回回写**:通过绑 `end`(或 `Available`)、驳回绑 `cancel`(或 `Cancel`)——**不要**把两条各自 FIXED 赋值的规则都绑到 `endEventHandler`(两条都会执行、后者覆盖前者;工具会在 `bizActions.length>1` 时回读 `advisory` 提醒)。真实生产只在 `endEventHandler` 绑**一条**多分支规则图。
|
|
205
|
+
|
|
206
|
+
规则图需要显式:
|
|
207
|
+
|
|
208
|
+
- `ruleCode`、名称、触发方式
|
|
209
|
+
- 每个节点 `nodeName`
|
|
210
|
+
- `nodeType`、路由、目标模型
|
|
211
|
+
- 主表/子表 `findMainData`
|
|
212
|
+
- 每个映射的 source/target 字段:**新增/更新节点的字段映射 = `dataActions`**(每目标字段一条叶:`{targetDataItem, ruleValueType:"DYNAMIC"/"FIXED", value:""/字面量, ruleActionType:"EQUALS", currentDataItemValue:"<来源字段>"}`)。**`execFormMapping` 只是展示开关,不是映射来源**——只写 `execFormMapping:true` 不写 `dataActions`,「主表字段值设置」是空的、新增行业务字段全 null(工具对 `execFormMapping:true` 缺 `dataActions` fail closed `rule-graph-create-mapping-missing`)。**写跨表节点前先 `rule.get` 读一条真实同型规则(如 `purchase_request`/`Create`)当基线**,不要从模板推断。
|
|
213
|
+
|
|
214
|
+
流程结束后新增目标表单,配置发布后要真实跑完流程,再读目标表单每个字段(`data.load`,不是 `data.list`——后者只投影列表列);只看到规则 `ENABLED` 不等于映射成功。
|
|
215
|
+
|
|
216
|
+
## 业务集成
|
|
217
|
+
|
|
218
|
+
优先复用现存 service/method,不做无必要的部署:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
omc call service.get --env local --args '{"serviceCode":"omc_demo_restful"}'
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
- **新写一个接口 ≠ 新建一个服务**。同一个服务下可以挂多个方法:新服务用 `service.register`(`serviceCode` 已存在会 `duplicate-service` 拒绝),**往已有服务加方法用 `method.create`**(服务不存在 → 拒绝并提示先用 `service.register`;方法已存在 → 拒绝并提示改用 `method.update`)。不要为加一个方法而删服务重建(会连带丢掉服务的其它方法与规则绑定)。
|
|
225
|
+
|
|
226
|
+
BIZ_ACTION:
|
|
227
|
+
|
|
228
|
+
- 先读方法输入/输出参数面。
|
|
229
|
+
- `codeType: 1` 的 PROPERTY 输入:`bizCode` 是源字段 code,`propertyName` 是显示名,`serviceMethodParameterCode` 必须命中方法参数。
|
|
230
|
+
- **常量入参用 `codeType: 0`(CONST)**(如固定请求头 `X-LowCode-Corpid`):值可放 `bizCode`,也可放 `value`(工具会自动移入 `bizCode`)。平台 CONST **只读 `bizCode`**——`value`/`expressionValue` 原样存着的话,运行时取到的是字面 `null`。
|
|
231
|
+
- 参数面每参数必带 `bizPropertyType`(参数类型),否则业务规则按类型匹配字段会失败、映射不到(缺失即拒绝);`externParameterType`/`description` 工具补齐。**返回值参数默认不必填(`required:false`),入参按需必填**——返回值声明为必填会经规则 designer 的 `required` 镜像强制每条输出映射也必填,是绑定摩擦的常见来源。
|
|
232
|
+
- `rule.save` 自动补 `serviceName`/`serviceMethodName`/节点 `nodeCategory:"actionNode"`/映射元素 `index`(弹窗异步加载,稍候再判空)。
|
|
233
|
+
- 配规则后读回 methodMapping,再用按钮或流程实际触发一次。
|
|
234
|
+
- 服务、方法、参数不确定时拒绝猜,先读证据。
|
|
235
|
+
|
|
236
|
+
## 按钮与在线 JS
|
|
237
|
+
|
|
238
|
+
- 直接执行规则:`useLocation: ROW` + `operateType: WITH_OUT_VIEW`。
|
|
239
|
+
- `WITH_VIEW` 是打开表单。
|
|
240
|
+
- FLOW 按钮需要 workflowCode;CLI 会补安全的 actionConfig。
|
|
241
|
+
- **在线 JS 分两条**:本 CLI 只做**发布与回读**——用 `onlinejs.compose` 把已定稿的 `source` 组合进平台 skeleton 的 `customScript` 再 publish,回读 `publishedHtmlJson`+SHA-256。**脚本内容的编写/增量合并不在本 CLI**:若当前项目自带在线 JS 编写规范(例如其 `.cpdocs`/技能或项目文档),遵循它;否则向用户/设计者索取已定稿的 `source`。不要在 omc 侧手写或臆造 JS 逻辑。
|
|
242
|
+
|
|
243
|
+
## 运行验收与清理
|
|
244
|
+
|
|
245
|
+
运行测试前在草稿里列出:
|
|
246
|
+
|
|
247
|
+
- 测试输入值
|
|
248
|
+
- 预计生成的记录/调用
|
|
249
|
+
- 每个字段的验收值
|
|
250
|
+
- 清理哪些测试数据,保留哪些配置
|
|
251
|
+
|
|
252
|
+
推荐顺序:
|
|
253
|
+
|
|
254
|
+
```text
|
|
255
|
+
配置读回 → CLI 运行触发 → workitem/data/service 读回 → 比较字段 → 清理测试数据
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
浏览器不是常规验收步骤;只有用户报告 UI 回归时才做专项诊断。
|