@qingflow-tech/qingflow-cli 1.1.61-beta.6 → 1.1.61-beta.7
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 +3 -3
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/skills/qingflow-cli/reference/builder/70-portal.md +29 -14
- package/src/qingflow_mcp/builder_facade/models.py +12 -0
- package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/complete.json +2 -2
- package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/filter.json +44 -63
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Qingflow CLI 是轻流面向开发者和 AI Agent 的命令行工具。它把轻
|
|
|
7
7
|
## 安装
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install @qingflow-tech/qingflow-cli@1.1.61-beta.
|
|
10
|
+
npm install @qingflow-tech/qingflow-cli@1.1.61-beta.7
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
推荐从官网复制这一条一键安装 Qingflow CLI:
|
|
@@ -21,7 +21,7 @@ npx qingflow-cli@latest install
|
|
|
21
21
|
## 运行
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
npx -y -p @qingflow-tech/qingflow-cli@1.1.61-beta.
|
|
24
|
+
npx -y -p @qingflow-tech/qingflow-cli@1.1.61-beta.7 qingflow
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
全局安装后可以直接运行:
|
|
@@ -62,7 +62,7 @@ qingflow-skills install --agent codex --scope user
|
|
|
62
62
|
如果你通过一次性 `npx -p` 执行 skills 安装,建议加 `--copy`,避免 symlink 指向 npm 临时执行缓存:
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
|
-
npx -y -p @qingflow-tech/qingflow-cli@1.1.61-beta.
|
|
65
|
+
npx -y -p @qingflow-tech/qingflow-cli@1.1.61-beta.7 qingflow-skills install --agent codex --scope user --copy
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
`qingflow-skills install` 默认使用 symlink,且遇到同名 skill 不会覆盖;只有显式传入 `--force` 才会替换。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qingflow-tech/qingflow-cli",
|
|
3
|
-
"version": "1.1.61-beta.
|
|
3
|
+
"version": "1.1.61-beta.7",
|
|
4
4
|
"description": "Human-friendly Qingflow command line interface for auth, record operations, import, tasks, and stable builder flows.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
package/pyproject.toml
CHANGED
|
@@ -47,7 +47,7 @@ Start from the portal job, then choose the section strategy. A portal is an asse
|
|
|
47
47
|
| Show BI visualizations | Use chart sections | `rows=7`; same-row components share the same `rows` |
|
|
48
48
|
| Show concrete data views | Use view sections | Use business views, not `全部数据` / `我的数据`; `rows=11` |
|
|
49
49
|
| Update one existing portal block | Prefer `patch_sections[]` | Do not replace the whole `sections` list unless intentional |
|
|
50
|
-
| Need a filter bar |
|
|
50
|
+
| Need a filter bar | Use `source_type: "filter"` with non-empty `config.rules` | Empty-rules filters are rejected (backend read face enumerates filter components by their rule groups); see §3.4 |
|
|
51
51
|
|
|
52
52
|
Short rule: **portal rows are 24-grid layout rows, not form-field rows. Same `y` = same row, same `rows`, `cols` sum 24.**
|
|
53
53
|
|
|
@@ -63,7 +63,7 @@ Before `portal apply`, verify this short list:
|
|
|
63
63
|
| Standard heights | Metric cards `rows=5`; BI charts `rows=7`; data views `rows=11`. Do not mix different heights in one row. |
|
|
64
64
|
| Standard order | Business entry -> metrics -> BI charts -> data views. Do not put data views before metrics/charts in a dashboard-style portal. |
|
|
65
65
|
| Default/system views | Do not use `全部数据` / `我的数据` as the main business portal views. Use concrete business views. |
|
|
66
|
-
| Filter component |
|
|
66
|
+
| Filter component | `config.rules` must contain at least one rule group (empty-rules filters are written but invisible in readback; blocked at validation). Rule keys: filterGroupName/filterGroupConfig/filterItemName/que/judge, see §3.4. |
|
|
67
67
|
| Readback | After apply, run `portal get` and compare section count, refs, and positions before claiming frontend visibility. |
|
|
68
68
|
|
|
69
69
|
Inline QingBI chart creation uses one chart job per section and runs with an internal concurrency limit of 10. If two sections declare the same `app_key + name + chart_type` with identical config, CLI creates/updates once and reuses the chart id. If their config differs, CLI rejects the portal write as a duplicate inline chart conflict.
|
|
@@ -90,7 +90,7 @@ Recommended standard workbench skeleton:
|
|
|
90
90
|
|
|
91
91
|
搭建侧稳定入口:**`qingflow builder portal`**:`list` / `get` / **`apply`** / **`delete`**(与根命令 **`qingflow portal`** 的「成员可读列表/详情」不同,见 **[QINGFLOW_CLI_EXPLORATION_REPORT.md](../core/QINGFLOW_CLI_EXPLORATION_REPORT.md) §4.6**)。
|
|
92
92
|
|
|
93
|
-
实现要点来自 CLI 打包内的 `builder_facade/models.py`(`PortalApplyRequest`、`PortalSectionPatch`)、`builder_facade/service.py`(`portal_apply` / `portal_delete`)、`cli/commands/builder.py`。已对 **`package_id=2030703`**、应用 **`ead8ims5i401`** **实跑**:**新建**(`--no-publish`)、**`--publish` 更新**(网关 **503** 恢复后已重试成功)、**五类区块可稳定落库**;**`filter
|
|
93
|
+
实现要点来自 CLI 打包内的 `builder_facade/models.py`(`PortalApplyRequest`、`PortalSectionPatch`)、`builder_facade/service.py`(`portal_apply` / `portal_delete`)、`cli/commands/builder.py`。已对 **`package_id=2030703`**、应用 **`ead8ims5i401`** **实跑**:**新建**(`--no-publish`)、**`--publish` 更新**(网关 **503** 恢复后已重试成功)、**五类区块可稳定落库**;**`filter` 声明式写入受控支持(rules 非空,历史「不落库」实测为空规则读面不可见,见 §3.4)**。另已对测试包 **`1414907`** 实跑 **`portal delete`**:临时门户 **`etcivtmv5402`** 删除后回读 **`readback_status=deleted`**。
|
|
94
94
|
|
|
95
95
|
> **权限**:**更新**需 **`edit_portal`**;**新建**按后端 `DashCtrl.createDash` 链路只预检目标包 **`add_app`**,不额外要求包 **`edit_app`**。失败时参见主技能与 **ADMIN** 速查。
|
|
96
96
|
|
|
@@ -214,7 +214,7 @@ mobile 固定按 **6 栅格** 从上到下堆叠:通常所有组件 `x=0, cols
|
|
|
214
214
|
|
|
215
215
|
**当前工具边界**:
|
|
216
216
|
|
|
217
|
-
- 声明式(`--file` / complete 档)支持**九类组件**:**`grid` / `chart` / `view` / `text` / `link`**(summary 档稳定面)+ **`carousel` / `task` / `favourite`**(complete 档,配置键见专项 Schema)+ **`filter`**(complete
|
|
217
|
+
- 声明式(`--file` / complete 档)支持**九类组件**:**`grid` / `chart` / `view` / `text` / `link`**(summary 档稳定面)+ **`carousel` / `task` / `favourite`**(complete 档,配置键见专项 Schema)+ **`filter`**(complete 档受控承载:`config.rules` 至少 1 组,空规则读面不可见、模型层阻断,见 **§3.4**)。
|
|
218
218
|
- **`task`(一个门户最多 1 个)与 `favourite`(一个门户最多 1 个)** 已进入 v1alpha1 complete 声明面(`task`/`favourite` 类型化 config 键),不要再按后端 raw 形状(`taskConfig`/`favouriteConfig`)手拼;声明形态见 `qingflow --json builder portal schema --schema-kind task|favourite`。旧文档中的「task/favorite 不在公开合约里」已过时。
|
|
219
219
|
- 推荐门户的可直接 apply 示例见 **[portal_sections_standard_workbench.example.json](../examples/portal/portal_sections_standard_workbench.example.json)**。这是唯一推荐复制的业务工作台布局模板:每一行 `cols_sum=24`,同行 `rows` 一致,下一行 `y` 连续。顶部先用一个业务入口 `grid` 占满 24 栅格;如果工具已支持待办组件,再把顶部拆成 `grid cols=12 + task cols=12`。
|
|
220
220
|
- **[portal_sections_five_types.example.json](../examples/portal/portal_sections_five_types.example.json)** 和 **[portal_sections_all_types.example.json](../examples/portal/portal_sections_all_types.example.json)** 仅用于组件能力探针,不作为业务门户布局模板;搭建正式门户时不要从这些探针推导布局。
|
|
@@ -253,7 +253,7 @@ mobile 固定按 **6 栅格** 从上到下堆叠:通常所有组件 `x=0, cols
|
|
|
253
253
|
| **`grid`** | **2** | 九宫格 | summary |
|
|
254
254
|
| **`text`** | **5** | 富文本说明 | summary |
|
|
255
255
|
| **`link`** | **4** | 外链 | summary |
|
|
256
|
-
| **`filter`** | **6** | 筛选条 | complete(
|
|
256
|
+
| **`filter`** | **6** | 筛选条 | complete(rules 必须非空) |
|
|
257
257
|
| **`carousel`** | **3** | 轮播(数据源应用 + 标题/图片/链接字段) | complete |
|
|
258
258
|
| **`task`** | **8** | 待办(一个门户最多 1 个) | complete |
|
|
259
259
|
| **`favourite`** | **7** | 收藏(一个门户最多 1 个) | complete |
|
|
@@ -292,14 +292,29 @@ CLI 校验(`PortalSectionPatch`):**chart** 须 **`chart`** 或 **`chart_re
|
|
|
292
292
|
}
|
|
293
293
|
```
|
|
294
294
|
|
|
295
|
-
### 3.4 **`filter
|
|
295
|
+
### 3.4 **`filter`**:声明式筛选条(支持,**rules 必须非空**)
|
|
296
296
|
|
|
297
|
-
|
|
297
|
+
声明形态:**`config.graphs`**(受筛选作用的图表引用)+ **`config.rules`**(筛选规则组,至少 1 组),编译为后端 `ComponentFilter`(`graphList` + `filterConfig`)。规则键集:`filterGroupName`(组名)/`filterGroupConfig`(筛选项:`filterItemName` + `que{queId}` + `judge{judgeType,judgeValues}`);代理键 `filterGroupId`/`filterItemId` 为后端自增位移键,声明里不要携带。
|
|
298
298
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
299
|
+
```json
|
|
300
|
+
{
|
|
301
|
+
"source_type": "filter",
|
|
302
|
+
"position": {"pc": {"x": 0, "y": 0, "cols": 24, "rows": 3}},
|
|
303
|
+
"config": {
|
|
304
|
+
"graphs": [{"chart_key": "CHART_KEY_1001"}],
|
|
305
|
+
"rules": [
|
|
306
|
+
{
|
|
307
|
+
"filterGroupName": "区域",
|
|
308
|
+
"filterGroupConfig": [
|
|
309
|
+
{"filterItemName": "城市", "que": {"queId": 123456}, "judge": {"judgeType": 3, "judgeValues": ["上海"]}}
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
]
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**关键边界(旧实测记录的真相)**:`rules` 为空的 filter **会被模型层直接拒绝**——后端读面按筛选组(dash_filter_group 行)反查筛选组件,空规则的组件行虽写入但读面枚举不到,表现为「apply 成功、回读缺 type:6」。历史上「filter 不落库」的实测记录(命令式 raw 直传时代、全部空规则组合)即此机制,不是后端拒绝 type:6。存量筛选组件合法无标题(提取产物不带 `title`,不要合成);round-trip 重放已验证(ws40013 基准 337 个 filter 组件一致率 100%)。专项 Schema:`qingflow --json builder portal schema --schema-kind filter`。
|
|
303
318
|
|
|
304
319
|
### 3.5 **`grid` / `text` / `link` / `view`**
|
|
305
320
|
|
|
@@ -360,8 +375,8 @@ qingflow --json builder portal delete --dash-key "<DASH_KEY>" > tmp/builder_port
|
|
|
360
375
|
| 步骤 | 命令要点 | 结果 |
|
|
361
376
|
|------|-----------|------|
|
|
362
377
|
| 新建门户 | `--package-id 2030703`、`--dash-name "CLI门户探针_可删"`、`--no-publish`、单 **view** | **`dash_key`: `ecdcell64s02`** |
|
|
363
|
-
| 503 后重试 | **`--dash-key ecdcell64s02`、`--publish`** + 含 **filter** 的六类 **`sections-file`** | **`published: true
|
|
364
|
-
| **filter 专项** | 仅 **chart + filter** 两块的多种 **`graphList`/`graphRef`/`dashChartId`/`filterGroupConfig`**
|
|
378
|
+
| 503 后重试 | **`--dash-key ecdcell64s02`、`--publish`** + 含 **filter** 的六类 **`sections-file`** | **`published: true`**;当时 filter 组合全部**空 rules** → 读面不可见(**§3.4** 机制,非后端拒绝;现空 rules 已被模型层阻断) |
|
|
379
|
+
| **filter 专项** | 仅 **chart + filter** 两块的多种 **`graphList`/`graphRef`/`dashChartId`/`filterGroupConfig`** 组合(历史记录,全部空 rules) | **回读恒为 1 块(仅 `type: 9`)**——空规则读面不可见;含 rules 的声明式写入已由 ws40013 基准验证 |
|
|
365
380
|
| **稳定可复现** | **`--publish`** + **[portal_sections_five_types.example.json](../examples/portal/portal_sections_five_types.example.json)**(**grid / text / link / view / chart**) | **`status: success`**,**`types: [2,4,5,9,10]`**,**`published: true`** |
|
|
366
381
|
| 删除门户 | `builder portal delete --dash-key etcivtmv5402` | **`status: success`**,**`delete_executed: true`**,**`readback_status: deleted`**,**`summary.removed: 1`** |
|
|
367
382
|
|
|
@@ -376,7 +391,7 @@ qingflow --json builder portal delete --dash-key "<DASH_KEY>" > tmp/builder_port
|
|
|
376
391
|
| 现象 | 处理 |
|
|
377
392
|
|------|------|
|
|
378
393
|
| `portal apply accepts exactly one selector mode` | **`dash-key`** vs **`package-id`** 二选一。 |
|
|
379
|
-
| `PORTAL_READBACK_PENDING` / **`components expected N, got M`** | **`portal get`**
|
|
394
|
+
| `PORTAL_READBACK_PENDING` / **`components expected N, got M`** | **`portal get`** 数组件;`filter` 回读缺失多为 **空 rules**(模型层已阻断,检查报错)或 **异步回读**(可再 **`get`** 一次);含规则的 filter 写入正常(见 **§3.4**)。 |
|
|
380
395
|
| **`published: true` 但 `verified: false`** | 读 **§7**;用 **`get` 草稿+线上**对照。 |
|
|
381
396
|
| **503** | 网关/运维;稍后重试。 |
|
|
382
397
|
| 缺 **chart** | 在对应 portal section 写 **`chart`**;或换用已有报表的 **`chart: {"chart_id": "..."}`** / 兼容旧 **`chart_ref`**。 |
|
|
@@ -2724,6 +2724,18 @@ class PortalSectionPatch(StrictModel):
|
|
|
2724
2724
|
raise ValueError("task section requires task")
|
|
2725
2725
|
if self.source_type == "favourite" and self.favourite is None:
|
|
2726
2726
|
raise ValueError("favourite section requires favourite")
|
|
2727
|
+
if self.source_type == "filter":
|
|
2728
|
+
# 后端读面(DashSvcImpl#getComponentFilter)按筛选组(dash_filter_group 行)
|
|
2729
|
+
# 反查筛选组件:空规则的 filter 组件行虽会写入,但读面枚举不到——表现为
|
|
2730
|
+
# 「apply 成功但回读缺 type:6」(实测反馈「filter 不落库」的真身)。
|
|
2731
|
+
# 在模型咽喉(apply/validate 共同路径)阻断,不给静默不可见留门。
|
|
2732
|
+
filter_payload = self.config or {}
|
|
2733
|
+
rule_groups = filter_payload.get("rules", filter_payload.get("filterConfig"))
|
|
2734
|
+
if not isinstance(rule_groups, list) or not rule_groups:
|
|
2735
|
+
raise ValueError(
|
|
2736
|
+
"filter section requires config.rules with at least one rule group; "
|
|
2737
|
+
"an empty-rules filter is written but invisible in portal get readback"
|
|
2738
|
+
)
|
|
2727
2739
|
return self
|
|
2728
2740
|
|
|
2729
2741
|
|
|
@@ -944,7 +944,7 @@
|
|
|
944
944
|
"FilterConfig": {
|
|
945
945
|
"type": "object",
|
|
946
946
|
"additionalProperties": false,
|
|
947
|
-
"filterConfigShapeDescription": "筛选组件配置(
|
|
947
|
+
"filterConfigShapeDescription": "筛选组件配置(受控键集)。graphs 为受影响的图表引用;rules 为筛选规则组,键集 filterGroupName/filterGroupConfig/filterItemName/que/judge 系(受控透传,dataset 实测形态定稿;代理键 filterGroupId/filterItemId 剔除)。rules 必须至少 1 组——后端读面按筛选组反查筛选组件,空规则的 filter 写入后读面不可见(模型层已阻断)。",
|
|
948
948
|
"properties": {
|
|
949
949
|
"graphs": {
|
|
950
950
|
"type": "array",
|
|
@@ -965,7 +965,7 @@
|
|
|
965
965
|
},
|
|
966
966
|
"rules": {
|
|
967
967
|
"type": "array",
|
|
968
|
-
"filterRulesDescription": "筛选规则组(
|
|
968
|
+
"filterRulesDescription": "筛选规则组(至少 1 组;空规则组件读面不可见)。组键 filterGroupName(必填)/filterGroupConfig(筛选项:filterItemName/que{queId}/judge{judgeType,judgeValues})。",
|
|
969
969
|
"x-backend": "ComponentFilter.filterConfig(List<FilterConfig>)"
|
|
970
970
|
}
|
|
971
971
|
}
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"type": "object",
|
|
58
58
|
"additionalProperties": false,
|
|
59
59
|
"required": [
|
|
60
|
-
"
|
|
60
|
+
"rules"
|
|
61
61
|
],
|
|
62
|
-
"filterConfigShapeDescription": "
|
|
62
|
+
"filterConfigShapeDescription": "筛选组件配置。rules 必须非空——后端读面(DashSvcImpl#getComponentFilter)按筛选组(dash_filter_group 行)反查筛选组件,空规则的 filter 组件行虽会写入但读面枚举不到,表现为「apply 成功、回读缺该组件」;规则键集为受控透传(filterGroupName/filterGroupConfig/filterItemName/que/judge 系,以 ws40013 dataset 实测形态定稿)。",
|
|
63
63
|
"properties": {
|
|
64
64
|
"graphs": {
|
|
65
65
|
"type": "array",
|
|
@@ -69,12 +69,12 @@
|
|
|
69
69
|
},
|
|
70
70
|
"x-backend": "ComponentFilter.graphList(GraphVO.graphKey/graphName/graphType)"
|
|
71
71
|
},
|
|
72
|
-
"
|
|
72
|
+
"rules": {
|
|
73
73
|
"type": "array",
|
|
74
74
|
"minItems": 1,
|
|
75
|
-
"
|
|
75
|
+
"filterRulesShapeDescription": "筛选规则组(至少 1 组)。组键:filterGroupName(组名,必填)、filterGroupConfig(组内筛选项列表);项键:filterItemName、que{queId}(绑定字段)、judge{judgeType,judgeValues}(默认条件)。代理键 filterGroupId/filterItemId 为后端自增位移键,读写两侧均剔除,不要携带。",
|
|
76
76
|
"items": {
|
|
77
|
-
"$ref": "#/$defs/
|
|
77
|
+
"$ref": "#/$defs/FilterRuleGroup"
|
|
78
78
|
},
|
|
79
79
|
"x-backend": "ComponentFilter.filterConfig(List<FilterConfig>)"
|
|
80
80
|
}
|
|
@@ -109,71 +109,49 @@
|
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
},
|
|
112
|
-
"
|
|
112
|
+
"FilterRuleGroup": {
|
|
113
113
|
"type": "object",
|
|
114
|
-
"additionalProperties": false,
|
|
115
114
|
"required": [
|
|
116
|
-
"
|
|
115
|
+
"filterGroupName"
|
|
117
116
|
],
|
|
118
|
-
"
|
|
117
|
+
"filterRuleGroupShapeDescription": "筛选规则组。组内筛选项走 filterGroupConfig;其余后端键受控透传。",
|
|
119
118
|
"properties": {
|
|
120
|
-
"
|
|
121
|
-
"type": "integer",
|
|
122
|
-
"filterGroupIdShapeDescription": "组 id(更新已有组时锚定;缺省新建)。",
|
|
123
|
-
"x-backend": "FilterConfig.filterGroupId"
|
|
124
|
-
},
|
|
125
|
-
"name": {
|
|
119
|
+
"filterGroupName": {
|
|
126
120
|
"type": "string",
|
|
127
|
-
"
|
|
121
|
+
"filterRuleGroupNameShapeDescription": "组名称(读面渲染为分组标题)。",
|
|
128
122
|
"x-backend": "FilterConfig.filterGroupName"
|
|
129
123
|
},
|
|
130
|
-
"
|
|
124
|
+
"filterGroupConfig": {
|
|
131
125
|
"type": "array",
|
|
132
|
-
"
|
|
133
|
-
"filterGroupItemsShapeDescription": "组内筛选项。",
|
|
126
|
+
"filterRuleGroupItemsShapeDescription": "组内筛选项(绑定字段与默认条件)。",
|
|
134
127
|
"items": {
|
|
135
|
-
"$ref": "#/$defs/
|
|
136
|
-
}
|
|
128
|
+
"$ref": "#/$defs/FilterRuleItem"
|
|
129
|
+
},
|
|
130
|
+
"x-backend": "FilterConfig.filterGroupConfig(List<FilterGroupConfig>)"
|
|
137
131
|
}
|
|
138
132
|
}
|
|
139
133
|
},
|
|
140
|
-
"
|
|
134
|
+
"FilterRuleItem": {
|
|
141
135
|
"type": "object",
|
|
142
|
-
"additionalProperties": false,
|
|
143
136
|
"required": [
|
|
144
|
-
"
|
|
137
|
+
"filterItemName"
|
|
145
138
|
],
|
|
146
|
-
"
|
|
139
|
+
"filterRuleItemShapeDescription": "单个筛选项(绑定一个字段)。que/judge 为后端受控透传形态;条件表达式(关联图表/字段)键集以 dataset 实测形态为准。",
|
|
147
140
|
"properties": {
|
|
148
|
-
"
|
|
149
|
-
"type": "integer",
|
|
150
|
-
"filterItemIdShapeDescription": "筛选项 id(更新锚定)。",
|
|
151
|
-
"x-backend": "FilterGroupConfig.filterItemId"
|
|
152
|
-
},
|
|
153
|
-
"name": {
|
|
141
|
+
"filterItemName": {
|
|
154
142
|
"type": "string",
|
|
155
|
-
"
|
|
143
|
+
"filterRuleItemNameShapeDescription": "筛选项名称。",
|
|
156
144
|
"x-backend": "FilterGroupConfig.filterItemName"
|
|
157
145
|
},
|
|
158
|
-
"
|
|
159
|
-
"type": "
|
|
160
|
-
"
|
|
161
|
-
"x-backend": "FilterGroupConfig.
|
|
162
|
-
},
|
|
163
|
-
"default_judge_type": {
|
|
164
|
-
"type": "integer",
|
|
165
|
-
"filterItemDftJudgeTypeShapeDescription": "默认比较符。",
|
|
166
|
-
"x-backend": "FilterGroupConfig.dftJudgeType"
|
|
167
|
-
},
|
|
168
|
-
"default_values": {
|
|
169
|
-
"type": "array",
|
|
170
|
-
"filterItemDftValuesShapeDescription": "默认比较值(受控透传)。",
|
|
171
|
-
"x-backend": "FilterGroupConfig.dftJudgeValue(List<AnswerValue>)"
|
|
146
|
+
"que": {
|
|
147
|
+
"type": "object",
|
|
148
|
+
"filterRuleItemQueShapeDescription": "绑定的字段引用(queId 为字段唯一键)。",
|
|
149
|
+
"x-backend": "FilterGroupConfig.que(Question)"
|
|
172
150
|
},
|
|
173
|
-
"
|
|
174
|
-
"type": "
|
|
175
|
-
"
|
|
176
|
-
"x-backend": "FilterGroupConfig.
|
|
151
|
+
"judge": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"filterRuleItemJudgeShapeDescription": "默认筛选条件:judgeType(比较符)+judgeValues(比较值列表)。",
|
|
154
|
+
"x-backend": "FilterGroupConfig.dftJudgeType/dftJudgeValue"
|
|
177
155
|
}
|
|
178
156
|
}
|
|
179
157
|
},
|
|
@@ -181,16 +159,14 @@
|
|
|
181
159
|
"type": "object",
|
|
182
160
|
"additionalProperties": false,
|
|
183
161
|
"required": [
|
|
184
|
-
"title",
|
|
185
162
|
"source_type",
|
|
186
163
|
"config"
|
|
187
164
|
],
|
|
188
165
|
"properties": {
|
|
189
166
|
"title": {
|
|
190
167
|
"type": "string",
|
|
191
|
-
"
|
|
192
|
-
"
|
|
193
|
-
"x-backend": "组件标题(DashChartInfo.title / gridConfig.gridTitle 等)"
|
|
168
|
+
"sectionTitleShapeDescription": "组件标题(可选)。存量筛选组件合法无标题——后端筛选组件无标题存储,提取产物不带 title,不要合成(如「组件 N」)。",
|
|
169
|
+
"x-backend": "组件标题(筛选组件无标题存储;其余组件见 DashChartInfo.title / gridConfig.gridTitle 等)"
|
|
194
170
|
},
|
|
195
171
|
"source_type": {
|
|
196
172
|
"const": "filter",
|
|
@@ -211,7 +187,7 @@
|
|
|
211
187
|
},
|
|
212
188
|
"config": {
|
|
213
189
|
"$ref": "#/$defs/FilterConfig",
|
|
214
|
-
"filterConfigPropDescription": "筛选配置(必填,
|
|
190
|
+
"filterConfigPropDescription": "筛选配置(必填,rules 至少 1 组)。"
|
|
215
191
|
}
|
|
216
192
|
}
|
|
217
193
|
}
|
|
@@ -230,7 +206,6 @@
|
|
|
230
206
|
},
|
|
231
207
|
"examples": [
|
|
232
208
|
{
|
|
233
|
-
"title": "数据筛选",
|
|
234
209
|
"source_type": "filter",
|
|
235
210
|
"position": {
|
|
236
211
|
"pc": {
|
|
@@ -249,15 +224,21 @@
|
|
|
249
224
|
"chart_name": "故障类型分布"
|
|
250
225
|
}
|
|
251
226
|
],
|
|
252
|
-
"
|
|
227
|
+
"rules": [
|
|
253
228
|
{
|
|
254
|
-
"
|
|
255
|
-
"
|
|
229
|
+
"filterGroupName": "区域",
|
|
230
|
+
"filterGroupConfig": [
|
|
256
231
|
{
|
|
257
|
-
"
|
|
258
|
-
"
|
|
259
|
-
|
|
260
|
-
|
|
232
|
+
"filterItemName": "城市",
|
|
233
|
+
"que": {
|
|
234
|
+
"queId": 123456
|
|
235
|
+
},
|
|
236
|
+
"judge": {
|
|
237
|
+
"judgeType": 3,
|
|
238
|
+
"judgeValues": [
|
|
239
|
+
"上海"
|
|
240
|
+
]
|
|
241
|
+
}
|
|
261
242
|
}
|
|
262
243
|
]
|
|
263
244
|
}
|