@qingflow-tech/qingflow-cli 1.1.61-beta.3 → 1.1.61-beta.5

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 (58) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/pyproject.toml +1 -1
  4. package/skills/qingflow-cli/SKILL.md +2 -0
  5. package/skills/qingflow-cli/reference/builder/30-schema-fields.md +13 -0
  6. package/skills/qingflow-cli/reference/builder/70-portal.md +37 -16
  7. package/skills/qingflow-cli/reference/data/README.md +38 -0
  8. package/skills/qingflow-cli/reference/examples/portal/portal_apply_v1alpha1.example.json +100 -0
  9. package/skills/qingflow-cli/reference/examples/portal/portal_sections_all_types.example.json +6 -7
  10. package/src/qingflow_mcp/app_form_validator.py +20 -3
  11. package/src/qingflow_mcp/builder_facade/app_form.py +137 -17
  12. package/src/qingflow_mcp/builder_facade/models.py +164 -13
  13. package/src/qingflow_mcp/builder_facade/portals_schema.py +397 -0
  14. package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +14 -1
  15. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +49 -9
  16. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +27 -0
  17. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_content_classification.json +146 -0
  18. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_content_extraction.json +146 -0
  19. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_content_generation.json +146 -0
  20. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_document_parsing.json +146 -0
  21. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_image_generation.json +146 -0
  22. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_image_recognition.json +146 -0
  23. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_machine_translation.json +146 -0
  24. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ai_text_summary.json +146 -0
  25. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +2 -2
  26. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +27 -0
  27. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date_duration.json +146 -0
  28. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/embed_field.json +146 -0
  29. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/image_select.json +146 -0
  30. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/location.json +146 -0
  31. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +2 -2
  32. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/ocr.json +146 -0
  33. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +2 -2
  34. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +27 -0
  35. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +29 -2
  36. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +20 -7
  37. package/src/qingflow_mcp/builder_facade/schemas/portals/manifest.json +59 -0
  38. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/complete.json +1397 -0
  39. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/carousel.json +193 -0
  40. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/chart.json +643 -0
  41. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/favourite.json +203 -0
  42. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/filter.json +268 -0
  43. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/grid.json +265 -0
  44. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/link.json +131 -0
  45. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/task.json +199 -0
  46. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/text.json +123 -0
  47. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/components/view.json +196 -0
  48. package/src/qingflow_mcp/builder_facade/schemas/portals/v1alpha1/summary.json +800 -0
  49. package/src/qingflow_mcp/builder_facade/service.py +1104 -71
  50. package/src/qingflow_mcp/cli/commands/builder.py +114 -5
  51. package/src/qingflow_mcp/public_surface.py +2 -0
  52. package/src/qingflow_mcp/server_app_builder.py +32 -1
  53. package/src/qingflow_mcp/solution/compiler/icon_utils.py +73 -0
  54. package/src/qingflow_mcp/solution/executor.py +5 -2
  55. package/src/qingflow_mcp/tools/ai_builder_tools.py +110 -12
  56. package/src/qingflow_mcp/tools/portal_tools.py +4 -54
  57. package/src/qingflow_mcp/tools/portal_writer.py +59 -0
  58. package/src/qingflow_mcp/tools/solution_tools.py +2 -0
@@ -0,0 +1,1397 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://qingflow.com/schemas/builder/portals/v1alpha1/complete.json",
4
+ "title": "Qingflow Builder Portals Declaration · complete (v1alpha1)",
5
+ "portalCompleteDescription": "门户完整声明(详细版 spec):summary 的超集,覆盖门户全局配置(图标/颜色/版权/自动刷新)、九类组件明细(chart/view/grid/filter/text/link/carousel/task/favourite)、组件级样式与可见性授权。字段集 = portal_apply 真正可写的字段集(以 ws40013 dataset 实测形态校准);后端读面运行态字段(收藏/编辑权限/水印等)不属于声明。PC 为 24 列网格、mobile 为 6 列网格。组件引用使用后端唯一键。schema 校验在别名归一之后执行,JSON Schema 只约束规范名(别名见各字段说明)。",
6
+ "$defs": {
7
+ "PortalDeclaration": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "required": [
11
+ "name",
12
+ "sections"
13
+ ],
14
+ "portalCompleteTopDescription": "完整门户声明。sections 提交即整体替换(replace 语义);不带 sections 的 base-info 更新(仅名称/图标/授权/归属)走 edit 模式。",
15
+ "properties": {
16
+ "dash_key": {
17
+ "type": "string",
18
+ "dashKeyCompleteDescription": "门户唯一键;upsert 锁定已有门户。别名 dashKey。",
19
+ "x-backend": "dash.dashKey"
20
+ },
21
+ "name": {
22
+ "type": "string",
23
+ "portalNameCompleteDescription": "门户名称。别名 dash_name/dashName。 可为空串(后端无非空校验,生产存量存在空名门户;提取产物空名透传)。",
24
+ "x-backend": "dash.dashName"
25
+ },
26
+ "package_tag_id": {
27
+ "type": "integer",
28
+ "minimum": 1,
29
+ "packageTagIdCompleteDescription": "归属应用包 tagId;创建必填,更新缺省沿用读面归属。别名 packageTagId/package_id/packageId。 创建(无 dash_key)时必填——由 portal_apply 实现层校验(PACKAGE_TAG_REQUIRED + 包新增权限守卫);更新(带 dash_key)缺省沿用读面归属,无所属包的门户提取产物合法缺省本字段。",
30
+ "x-backend": "dash.tags[0].tagId(POST /dash/{dashKey}/baseInfo)"
31
+ },
32
+ "sections": {
33
+ "type": "array",
34
+ "sectionsCompleteDescription": "组件清单,replace 语义,数组顺序即渲染顺序。 空数组合法(空门户:updateDash 对空组件列表仅跳过组件重建,全局配置仍生效)。",
35
+ "items": {
36
+ "$ref": "#/$defs/Section"
37
+ },
38
+ "x-backend": "DashDetailInfo.components"
39
+ },
40
+ "layout_preset": {
41
+ "type": "string",
42
+ "enum": [
43
+ "auto",
44
+ "dashboard_2col",
45
+ "dashboard_3col"
46
+ ],
47
+ "layoutPresetCompleteDescription": "布局预设;与显式 position 二选一。别名 layoutPreset。",
48
+ "x-backend": "(编排层,不落库)"
49
+ },
50
+ "publish": {
51
+ "type": "boolean",
52
+ "default": true,
53
+ "publishCompleteDescription": "apply 后是否发布;幂等重放时用 false。"
54
+ },
55
+ "icon": {
56
+ "type": "string",
57
+ "portalIconCompleteDescription": "门户图标名(workspace icon 目录,如 view-grid);与 color 一起编码为 dashIcon。省略时按名称生成稳定默认图标。",
58
+ "x-backend": "dash.dashIcon(编码)"
59
+ },
60
+ "color": {
61
+ "type": "string",
62
+ "portalColorCompleteDescription": "门户图标底色(如 #2468F2);与 icon 一起编码为 dashIcon。",
63
+ "x-backend": "dash.dashIcon(编码)"
64
+ },
65
+ "hide_copyright": {
66
+ "type": "boolean",
67
+ "default": false,
68
+ "hideCopyrightCompleteDescription": "是否隐藏轻流 vi 版权标识。别名 hideCopyright。",
69
+ "x-backend": "dash.hideCopyright"
70
+ },
71
+ "global_config": {
72
+ "$ref": "#/$defs/GlobalConfig",
73
+ "globalConfigCompleteDescription": "门户全局功能配置(自动刷新/导出)。别名收敛 dash_global_config/dashGlobalConfig。"
74
+ },
75
+ "style_template_id": {
76
+ "type": "integer",
77
+ "styleTemplateIdCompleteDescription": "门户样式模板 id(样式模板体系,详见 DashStyleTemplateCtrl)。",
78
+ "x-backend": "dash.styleTemplateId"
79
+ },
80
+ "overall_style": {
81
+ "type": "object",
82
+ "overallStyleCompleteDescription": "门户全局样式(受控键集;键白名单以 ws40013 dataset 实测形态校准,未经校准的键会被拒绝)。别名 overallConfigBO。",
83
+ "x-backend": "DashDetailInfo.overallConfigBO(DashStyleConfigBO)"
84
+ },
85
+ "visibility": {
86
+ "$ref": "#/$defs/Visibility",
87
+ "visibilityCompleteDescription": "门户可见性与授权(对内可见范围 + 外部成员授权)。与 auth(裸后端形状)互斥;声明面统一走 visibility。"
88
+ }
89
+ }
90
+ },
91
+ "GlobalConfig": {
92
+ "type": "object",
93
+ "additionalProperties": false,
94
+ "globalConfigShapeDescription": "门户全局功能配置。省略整段时创建路径按 auto_refresh=false + interval=60。",
95
+ "properties": {
96
+ "auto_refresh": {
97
+ "type": "boolean",
98
+ "default": false,
99
+ "autoRefreshDescription": "门户是否自动刷新。别名 beingAutoRefresh。",
100
+ "x-backend": "dashGlobalConfig.beingAutoRefresh"
101
+ },
102
+ "interval": {
103
+ "type": "integer",
104
+ "minimum": 1,
105
+ "default": 60,
106
+ "intervalDescription": "自动刷新间隔(分钟),默认 60。",
107
+ "x-backend": "dashGlobalConfig.interval"
108
+ },
109
+ "export": {
110
+ "type": "boolean",
111
+ "exportDescription": "是否支持导出。别名 beingExport。",
112
+ "x-backend": "dashGlobalConfig.beingExport"
113
+ }
114
+ },
115
+ "x-backend": "DashGlobalConfigInfo"
116
+ },
117
+ "Section": {
118
+ "type": "object",
119
+ "additionalProperties": false,
120
+ "required": [
121
+ "source_type"
122
+ ],
123
+ "sectionCompleteDescription": "门户组件(complete 档开放九类:chart/view/grid/filter/text/link/carousel/task/favourite)。filter 语义 raw/unstable,skill 不建议作为主自动化路径。",
124
+ "properties": {
125
+ "title": {
126
+ "anyOf": [
127
+ {
128
+ "type": "string"
129
+ },
130
+ {
131
+ "type": "null"
132
+ }
133
+ ],
134
+ "sectionTitleDescription": "组件显示标题。空标题(null)是合法存量形态(显示标题开但标题空,读链渲染时回退图表名/视图名);创建语义缺省建议显式命名。",
135
+ "x-backend": "组件标题(DashChartInfo.title / DashChartInfo.chartComponentTitle / gridConfig.gridTitle / componentTaskTitle 等;null 落库 NULL)"
136
+ },
137
+ "source_type": {
138
+ "type": "string",
139
+ "enum": [
140
+ "chart",
141
+ "view",
142
+ "grid",
143
+ "filter",
144
+ "text",
145
+ "link",
146
+ "carousel",
147
+ "task",
148
+ "favourite"
149
+ ],
150
+ "sourceTypeCompleteDescription": "组件类型(complete 档开放九类)。每种类型的详细配置经专项 Schema 获取(CLI: qingflow builder portal schema --schema-kind <类型>;MCP: portal_schema(schema_kind=...)),不要凭枚举名猜配置键:chart=1(--schema-kind chart)、grid=2(--schema-kind grid)、carousel=3(--schema-kind carousel)、link=4(--schema-kind link)、text=5(--schema-kind text)、filter=6(--schema-kind filter,语义 raw/unstable)、favourite=7(--schema-kind favourite)、task=8(--schema-kind task)、view=10(--schema-kind view)。",
151
+ "x-backend": "DashComponentInfo.type"
152
+ },
153
+ "role": {
154
+ "type": "string",
155
+ "roleCompleteDescription": "组件角色标注(编排辅助,如 metric)。别名 zone/section_role。"
156
+ },
157
+ "position": {
158
+ "$ref": "#/$defs/Position",
159
+ "positionCompleteDescription": "网格位置(pc 24 列/mobile 6 列)。"
160
+ },
161
+ "style_config": {
162
+ "type": "object",
163
+ "styleConfigCompleteDescription": "组件级样式(受控键集;键白名单以 dataset 实测形态校准)。别名 dash_style_config/dashStyleConfigBO。",
164
+ "x-backend": "DashComponentInfo.dashStyleConfigBO(DashStyleConfigBO)"
165
+ },
166
+ "chart_ref": {
167
+ "$ref": "#/$defs/ChartRef",
168
+ "chartRefCompleteDescription": "已有图表引用(chart 类型:chart_ref 或 chart 二选一)。"
169
+ },
170
+ "chart": {
171
+ "$ref": "#/$defs/InlineChart",
172
+ "chartInlineCompleteDescription": "内联创建 QingBI 图表(chart 类型)。"
173
+ },
174
+ "view_ref": {
175
+ "$ref": "#/$defs/ViewRef",
176
+ "viewRefCompleteDescription": "业务视图引用(view 类型必填)。"
177
+ },
178
+ "view_display": {
179
+ "$ref": "#/$defs/ViewDisplayConfig",
180
+ "viewDisplayCompleteDescription": "视图组件展示配置(view 类型可选)。"
181
+ },
182
+ "config": {
183
+ "configCompleteDescription": "类型化配置:grid→GridConfig;filter→FilterConfig;其余类型不使用本键(各类型有专用键)。",
184
+ "oneOf": [
185
+ {
186
+ "$ref": "#/$defs/GridConfig"
187
+ },
188
+ {
189
+ "$ref": "#/$defs/FilterConfig"
190
+ }
191
+ ]
192
+ },
193
+ "carousel": {
194
+ "$ref": "#/$defs/CarouselConfig",
195
+ "carouselCompleteDescription": "轮播组件配置(carousel 类型必填):绑定应用的图片轮播。"
196
+ },
197
+ "task": {
198
+ "$ref": "#/$defs/TaskConfig",
199
+ "taskCompleteDescription": "待办组件配置(task 类型必填)。"
200
+ },
201
+ "favourite": {
202
+ "$ref": "#/$defs/FavouriteConfig",
203
+ "favouriteCompleteDescription": "收藏组件配置(favourite 类型必填)。"
204
+ },
205
+ "text": {
206
+ "type": "string",
207
+ "textCompleteDescription": "文本内容(text 类型必填)。",
208
+ "x-backend": "ComponentTextConfig.content"
209
+ },
210
+ "url": {
211
+ "type": "string",
212
+ "maxLength": 500,
213
+ "urlCompleteDescription": "链接地址(link 类型必填),上限 500。",
214
+ "x-backend": "ComponentLinkConfig.linkUrl"
215
+ },
216
+ "login_auth": {
217
+ "type": "boolean",
218
+ "default": false,
219
+ "loginAuthCompleteDescription": "链接是否需要登录鉴权(link 类型可选)。别名 beingLoginAuth/being_login_auth。",
220
+ "x-backend": "ComponentLinkConfig.beingLoginAuth"
221
+ },
222
+ "show_title": {
223
+ "type": "boolean",
224
+ "showTitleShapeDescription": "显示标题开关(draft_dash_chart.being_show_title 落库列)。提取侧读面必有值;存量 false 必须保真(渲染语义依赖)。声明缺省时编译回落产品默认 true。",
225
+ "x-backend": "DashChart.beingShowTitle(chart/view 组件)"
226
+ }
227
+ },
228
+ "allOf": [
229
+ {
230
+ "if": {
231
+ "properties": {
232
+ "source_type": {
233
+ "const": "chart"
234
+ }
235
+ },
236
+ "required": [
237
+ "source_type"
238
+ ]
239
+ },
240
+ "then": {
241
+ "anyOf": [
242
+ {
243
+ "required": [
244
+ "chart_ref"
245
+ ]
246
+ },
247
+ {
248
+ "required": [
249
+ "chart"
250
+ ]
251
+ }
252
+ ]
253
+ }
254
+ },
255
+ {
256
+ "if": {
257
+ "properties": {
258
+ "source_type": {
259
+ "const": "view"
260
+ }
261
+ },
262
+ "required": [
263
+ "source_type"
264
+ ]
265
+ },
266
+ "then": {
267
+ "required": [
268
+ "view_ref"
269
+ ]
270
+ }
271
+ },
272
+ {
273
+ "if": {
274
+ "properties": {
275
+ "source_type": {
276
+ "const": "grid"
277
+ }
278
+ },
279
+ "required": [
280
+ "source_type"
281
+ ]
282
+ },
283
+ "then": {
284
+ "required": [
285
+ "config"
286
+ ],
287
+ "properties": {
288
+ "config": {
289
+ "required": [
290
+ "items"
291
+ ],
292
+ "properties": {
293
+ "items": {}
294
+ }
295
+ }
296
+ }
297
+ }
298
+ },
299
+ {
300
+ "if": {
301
+ "properties": {
302
+ "source_type": {
303
+ "const": "filter"
304
+ }
305
+ },
306
+ "required": [
307
+ "source_type"
308
+ ]
309
+ },
310
+ "then": {
311
+ "required": [
312
+ "config"
313
+ ]
314
+ }
315
+ },
316
+ {
317
+ "if": {
318
+ "properties": {
319
+ "source_type": {
320
+ "const": "text"
321
+ }
322
+ },
323
+ "required": [
324
+ "source_type"
325
+ ]
326
+ },
327
+ "then": {
328
+ "required": [
329
+ "text"
330
+ ]
331
+ }
332
+ },
333
+ {
334
+ "if": {
335
+ "properties": {
336
+ "source_type": {
337
+ "const": "link"
338
+ }
339
+ },
340
+ "required": [
341
+ "source_type"
342
+ ]
343
+ },
344
+ "then": {
345
+ "required": [
346
+ "url"
347
+ ]
348
+ }
349
+ },
350
+ {
351
+ "if": {
352
+ "properties": {
353
+ "source_type": {
354
+ "const": "carousel"
355
+ }
356
+ },
357
+ "required": [
358
+ "source_type"
359
+ ]
360
+ },
361
+ "then": {
362
+ "required": [
363
+ "carousel"
364
+ ]
365
+ }
366
+ },
367
+ {
368
+ "if": {
369
+ "properties": {
370
+ "source_type": {
371
+ "const": "task"
372
+ }
373
+ },
374
+ "required": [
375
+ "source_type"
376
+ ]
377
+ },
378
+ "then": {
379
+ "required": [
380
+ "task"
381
+ ]
382
+ }
383
+ },
384
+ {
385
+ "if": {
386
+ "properties": {
387
+ "source_type": {
388
+ "const": "favourite"
389
+ }
390
+ },
391
+ "required": [
392
+ "source_type"
393
+ ]
394
+ },
395
+ "then": {
396
+ "required": [
397
+ "favourite"
398
+ ]
399
+ }
400
+ }
401
+ ]
402
+ },
403
+ "Position": {
404
+ "type": "object",
405
+ "additionalProperties": false,
406
+ "positionShapeCompleteDescription": "网格位置。PC 是 24 列网格(cols≤24),mobile 是 6 列网格(cols≤6);mobile 可省略。平铺别名 pc_x/pc_y/pc_w/pc_h、mobile_* 也接受。",
407
+ "properties": {
408
+ "pc": {
409
+ "$ref": "#/$defs/PositionDetail"
410
+ },
411
+ "mobile": {
412
+ "$ref": "#/$defs/PositionDetail"
413
+ }
414
+ }
415
+ },
416
+ "PositionDetail": {
417
+ "type": "object",
418
+ "additionalProperties": false,
419
+ "positionDetailCompleteDescription": "单端位置:x=列偏移、y=行偏移、cols=占宽、rows=占高。",
420
+ "properties": {
421
+ "x": {
422
+ "type": [
423
+ "integer",
424
+ "null"
425
+ ],
426
+ "minimum": 0
427
+ },
428
+ "y": {
429
+ "type": [
430
+ "integer",
431
+ "null"
432
+ ],
433
+ "minimum": 0
434
+ },
435
+ "cols": {
436
+ "type": [
437
+ "integer",
438
+ "null"
439
+ ],
440
+ "minimum": 1
441
+ },
442
+ "rows": {
443
+ "type": [
444
+ "integer",
445
+ "null"
446
+ ],
447
+ "minimum": 1
448
+ }
449
+ },
450
+ "x-backend": "DashPosition.pc / DashPosition.mobile"
451
+ },
452
+ "Visibility": {
453
+ "type": "object",
454
+ "additionalProperties": false,
455
+ "required": [
456
+ "mode"
457
+ ],
458
+ "visibilityShapeDescription": "门户可见性与授权(与视图 visibility 同源编译)。写出 visibility 时 mode 必填。mode=specific 时必须带 selectors;mode=everyone 时 external_mode 必须为 workspace;external_mode=specific 时必须带 external_selectors。整段省略时创建路径按 workspace + external_mode=not。",
459
+ "allOf": [
460
+ {
461
+ "if": {
462
+ "properties": {
463
+ "mode": {
464
+ "const": "specific"
465
+ }
466
+ },
467
+ "required": [
468
+ "mode"
469
+ ]
470
+ },
471
+ "then": {
472
+ "required": [
473
+ "selectors"
474
+ ]
475
+ }
476
+ },
477
+ {
478
+ "if": {
479
+ "properties": {
480
+ "mode": {
481
+ "const": "everyone"
482
+ }
483
+ },
484
+ "required": [
485
+ "mode"
486
+ ]
487
+ },
488
+ "then": {
489
+ "required": [
490
+ "external_mode"
491
+ ],
492
+ "properties": {
493
+ "external_mode": {
494
+ "const": "workspace"
495
+ }
496
+ }
497
+ }
498
+ },
499
+ {
500
+ "if": {
501
+ "properties": {
502
+ "external_mode": {
503
+ "const": "specific"
504
+ }
505
+ },
506
+ "required": [
507
+ "external_mode"
508
+ ]
509
+ },
510
+ "then": {
511
+ "required": [
512
+ "external_selectors"
513
+ ]
514
+ }
515
+ }
516
+ ],
517
+ "properties": {
518
+ "mode": {
519
+ "type": "string",
520
+ "enum": [
521
+ "workspace",
522
+ "everyone",
523
+ "specific"
524
+ ],
525
+ "visibilityModeDescription": "对内可见:workspace=工作区可见,everyone=互联网公开(要求 external_mode=workspace),specific=指定成员/部门/角色。",
526
+ "x-backend": "dash.dashAuth(1/2/3)"
527
+ },
528
+ "selectors": {
529
+ "$ref": "#/$defs/VisibilitySelectors"
530
+ },
531
+ "external_mode": {
532
+ "type": "string",
533
+ "enum": [
534
+ "not",
535
+ "workspace",
536
+ "specific"
537
+ ],
538
+ "externalModeCompleteDescription": "外部成员授权:not=不开放,workspace=共享工作区全部外部联系人,specific=指定外部成员。别名 externalMode。",
539
+ "x-backend": "dash.externalAuth(NOT|WORKSPACE_ALL|SPECIFIC)"
540
+ },
541
+ "external_selectors": {
542
+ "$ref": "#/$defs/ExternalSelectors"
543
+ }
544
+ },
545
+ "x-backend": "MemberAuthInfoVO(DashDetailInfo.auth)"
546
+ },
547
+ "VisibilitySelectors": {
548
+ "type": "object",
549
+ "additionalProperties": false,
550
+ "selectorsCompleteDescription": "指定成员/部门/角色选择器;各列表都不是单独必填,空对象表示指定范围但尚未配置成员(合法形态)。与 views 声明的 selectors 键集同构。",
551
+ "properties": {
552
+ "member_uids": {
553
+ "type": "array",
554
+ "items": {
555
+ "type": "integer"
556
+ },
557
+ "memberUidsDescription": "成员 uid 列表(数字)。"
558
+ },
559
+ "member_emails": {
560
+ "type": "array",
561
+ "items": {
562
+ "type": "string"
563
+ },
564
+ "memberEmailsDescription": "成员邮箱列表。"
565
+ },
566
+ "member_names": {
567
+ "type": "array",
568
+ "items": {
569
+ "type": "string"
570
+ },
571
+ "memberNamesDescription": "成员姓名列表(重名有歧义风险,优先 uid/email)。"
572
+ },
573
+ "dept_ids": {
574
+ "type": "array",
575
+ "items": {
576
+ "type": "integer"
577
+ },
578
+ "deptIdsDescription": "部门 id 列表。"
579
+ },
580
+ "dept_names": {
581
+ "type": "array",
582
+ "items": {
583
+ "type": "string"
584
+ },
585
+ "deptNamesDescription": "部门名称列表。"
586
+ },
587
+ "role_ids": {
588
+ "type": "array",
589
+ "items": {
590
+ "type": "integer"
591
+ },
592
+ "roleIdsDescription": "角色 id 列表。"
593
+ },
594
+ "role_names": {
595
+ "type": "array",
596
+ "items": {
597
+ "type": "string"
598
+ },
599
+ "roleNamesDescription": "角色名称列表。"
600
+ },
601
+ "include_sub_departs": {
602
+ "type": "boolean",
603
+ "default": false,
604
+ "includeSubDepartsDescription": "dept 指定时是否包含子部门。"
605
+ }
606
+ }
607
+ },
608
+ "ExternalSelectors": {
609
+ "type": "object",
610
+ "additionalProperties": false,
611
+ "externalSelectorsCompleteDescription": "指定外部成员选择器(与 views 声明键集同构)。",
612
+ "properties": {
613
+ "member_ids": {
614
+ "type": "array",
615
+ "items": {
616
+ "type": "string"
617
+ },
618
+ "externalMemberIdsDescription": "外部成员 id 列表。"
619
+ },
620
+ "member_emails": {
621
+ "type": "array",
622
+ "items": {
623
+ "type": "string"
624
+ },
625
+ "externalMemberEmailsDescription": "外部成员邮箱列表。"
626
+ },
627
+ "dept_ids": {
628
+ "type": "array",
629
+ "items": {
630
+ "type": "integer"
631
+ },
632
+ "externalDeptIdsDescription": "外部部门 id 列表。"
633
+ }
634
+ }
635
+ },
636
+ "ChartRef": {
637
+ "type": "object",
638
+ "additionalProperties": false,
639
+ "chartRefShapeCompleteDescription": "已有图表引用。chart_id 或 chart_name 至少一个;按 chart_name 解析时必须给 app_key。别名 chartId/chart_key/chartKey。",
640
+ "properties": {
641
+ "app_key": {
642
+ "type": "string",
643
+ "chartRefAppKeyCompleteDescription": "图表所属应用 key。"
644
+ },
645
+ "ref_kind": {
646
+ "type": "string",
647
+ "enum": [
648
+ "chart",
649
+ "bi_chart"
650
+ ],
651
+ "chartRefKindDescription": "引用面判别:chart=轻流报表(chart 表唯一键 chartKey,后端组件 type=1,写链 addChartInfos 按 chartKey 解析);bi_chart=轻析 BI 报表(bi_chart 表整型 chart_id,后端组件 type=9)。缺省 bi_chart(向后兼容)。别名 refKind/kind。",
652
+ "x-backend": "DashComponentInfo.type ∈ {1, 9}"
653
+ },
654
+ "chart_id": {
655
+ "type": "string",
656
+ "chartRefIdCompleteDescription": "图表 id(后端唯一键,回读优先携带)。 ref_kind=chart 时为 chart 表唯一键 chartKey;ref_kind=bi_chart 时为 bi_chart 整型 chart_id。"
657
+ },
658
+ "chart_name": {
659
+ "type": "string",
660
+ "chartRefNameCompleteDescription": "图表名称。"
661
+ }
662
+ }
663
+ },
664
+ "ViewRef": {
665
+ "type": "object",
666
+ "additionalProperties": false,
667
+ "required": [
668
+ "app_key"
669
+ ],
670
+ "viewRefShapeCompleteDescription": "业务视图引用。view_key 或 view_name 至少一个。",
671
+ "properties": {
672
+ "app_key": {
673
+ "type": "string",
674
+ "viewRefAppKeyCompleteDescription": "视图所属应用 key。"
675
+ },
676
+ "view_key": {
677
+ "type": "string",
678
+ "viewRefKeyCompleteDescription": "视图唯一键(viewgraphKey)。"
679
+ },
680
+ "view_name": {
681
+ "type": "string",
682
+ "viewRefNameCompleteDescription": "视图名称(按名解析)。"
683
+ }
684
+ },
685
+ "x-backend": "ComponentViewConfig(appKey/viewgraphKey)"
686
+ },
687
+ "ViewDisplayConfig": {
688
+ "type": "object",
689
+ "additionalProperties": false,
690
+ "viewDisplayShapeDescription": "视图组件展示配置。",
691
+ "properties": {
692
+ "show_title": {
693
+ "type": "boolean",
694
+ "default": true,
695
+ "viewShowTitleDescription": "是否显示组件标题。别名 beingShowTitle。",
696
+ "x-backend": "ComponentViewConfig.beingShowTitle"
697
+ },
698
+ "component_title": {
699
+ "type": "string",
700
+ "componentTitleDescription": "组件标题文案;缺省沿用组件引用名。别名 componentTitle。",
701
+ "x-backend": "ComponentViewConfig.componentTitle"
702
+ }
703
+ }
704
+ },
705
+ "InlineChart": {
706
+ "type": "object",
707
+ "additionalProperties": false,
708
+ "required": [
709
+ "app_key",
710
+ "name",
711
+ "chart_type"
712
+ ],
713
+ "inlineChartShapeCompleteDescription": "内联创建的 QingBI 图表(与 builder chart apply 同一公开契约的子集)。",
714
+ "properties": {
715
+ "app_key": {
716
+ "type": "string",
717
+ "inlineChartAppKeyCompleteDescription": "图表所属应用 key。"
718
+ },
719
+ "name": {
720
+ "type": "string",
721
+ "minLength": 1,
722
+ "inlineChartNameCompleteDescription": "图表名称。"
723
+ },
724
+ "chart_type": {
725
+ "type": "string",
726
+ "enum": [
727
+ "target",
728
+ "indicator",
729
+ "summary",
730
+ "pie",
731
+ "bar",
732
+ "columnar",
733
+ "line",
734
+ "table",
735
+ "detail",
736
+ "area",
737
+ "stacked_area",
738
+ "pct_stack_area",
739
+ "funnel",
740
+ "waterfall",
741
+ "gauge",
742
+ "heatmap",
743
+ "histogram",
744
+ "treemap",
745
+ "radar",
746
+ "stacked_bar",
747
+ "pct_stack_bar",
748
+ "stacked_column",
749
+ "pct_stack_col",
750
+ "scatter",
751
+ "ring",
752
+ "rose",
753
+ "dualaxes",
754
+ "map",
755
+ "timeline"
756
+ ],
757
+ "inlineChartTypeCompleteDescription": "图表类型。"
758
+ },
759
+ "metric": {
760
+ "$ref": "#/$defs/ChartMetric"
761
+ },
762
+ "metrics": {
763
+ "type": "array",
764
+ "items": {
765
+ "$ref": "#/$defs/ChartMetric"
766
+ }
767
+ },
768
+ "group_by": {
769
+ "type": "array",
770
+ "items": {
771
+ "type": "string"
772
+ }
773
+ },
774
+ "filters": {
775
+ "type": "array",
776
+ "items": {
777
+ "$ref": "#/$defs/ChartFilterRule"
778
+ }
779
+ },
780
+ "dimension_field_ids": {
781
+ "type": "array",
782
+ "items": {
783
+ "type": "string"
784
+ }
785
+ },
786
+ "indicator_field_ids": {
787
+ "type": "array",
788
+ "items": {
789
+ "type": "string"
790
+ }
791
+ },
792
+ "visibility": {
793
+ "$ref": "#/$defs/Visibility",
794
+ "inlineChartVisibilityCompleteDescription": "图表自身可见性(可选)。"
795
+ },
796
+ "chart_id": {
797
+ "type": "string",
798
+ "inlineChartChartIdDescription": "已有图表 id(引用形态;等价 chart_ref.chart_id)。"
799
+ },
800
+ "rows": {
801
+ "type": "array",
802
+ "items": {
803
+ "type": "string"
804
+ },
805
+ "inlineChartRowsDescription": "行字段(交叉表)。",
806
+ "x-backend": "ChartUpsertPatch.rows"
807
+ },
808
+ "columns": {
809
+ "type": "array",
810
+ "items": {
811
+ "type": "string"
812
+ },
813
+ "inlineChartColumnsDescription": "列字段(交叉表)。",
814
+ "x-backend": "ChartUpsertPatch.columns"
815
+ },
816
+ "question_config": {
817
+ "type": "array",
818
+ "inlineChartQuestionConfigDescription": "图表字段配置透传(chart apply 受控面)。",
819
+ "x-backend": "ChartUpsertPatch.questionConfig"
820
+ },
821
+ "user_config": {
822
+ "type": "array",
823
+ "inlineChartUserConfigDescription": "图表用户配置透传(chart apply 受控面)。",
824
+ "x-backend": "ChartUpsertPatch.userConfig"
825
+ },
826
+ "config": {
827
+ "type": "object",
828
+ "inlineChartConfigDescription": "图表 raw 配置透传(chart apply 受控面)。",
829
+ "x-backend": "ChartUpsertPatch.config"
830
+ },
831
+ "x_metric": {
832
+ "$ref": "#/$defs/ChartMetric",
833
+ "inlineChartXMetricDescription": "X 轴指标(散点等)。"
834
+ },
835
+ "y_metric": {
836
+ "$ref": "#/$defs/ChartMetric",
837
+ "inlineChartYMetricDescription": "Y 轴指标(散点等)。"
838
+ },
839
+ "left_metric": {
840
+ "$ref": "#/$defs/ChartMetric",
841
+ "inlineChartLeftMetricDescription": "左轴指标(双轴图)。"
842
+ },
843
+ "right_metric": {
844
+ "$ref": "#/$defs/ChartMetric",
845
+ "inlineChartRightMetricDescription": "右轴指标(双轴图)。"
846
+ },
847
+ "value_metric": {
848
+ "$ref": "#/$defs/ChartMetric",
849
+ "inlineChartValueMetricDescription": "值指标。"
850
+ },
851
+ "target_metric": {
852
+ "$ref": "#/$defs/ChartMetric",
853
+ "inlineChartTargetMetricDescription": "目标值指标。"
854
+ }
855
+ }
856
+ },
857
+ "ChartMetric": {
858
+ "chartMetricShapeCompleteDescription": "聚合指标:字符串形态(如 \"count(*)\"、\"sum(金额)\",裸字段名默认 sum)或对象 {op, field_name, alias}。",
859
+ "oneOf": [
860
+ {
861
+ "type": "string",
862
+ "minLength": 1
863
+ },
864
+ {
865
+ "type": "object",
866
+ "additionalProperties": false,
867
+ "required": [
868
+ "op"
869
+ ],
870
+ "properties": {
871
+ "op": {
872
+ "type": "string"
873
+ },
874
+ "field_name": {
875
+ "type": "string"
876
+ },
877
+ "alias": {
878
+ "type": "string"
879
+ }
880
+ }
881
+ }
882
+ ]
883
+ },
884
+ "ChartFilterRule": {
885
+ "type": "object",
886
+ "additionalProperties": false,
887
+ "required": [
888
+ "field_name"
889
+ ],
890
+ "chartFilterRuleCompleteDescription": "图表过滤规则;is_empty/not_empty 不带 values,其余必须带非空 values。",
891
+ "properties": {
892
+ "field_name": {
893
+ "type": "string"
894
+ },
895
+ "operator": {
896
+ "type": "string",
897
+ "enum": [
898
+ "eq",
899
+ "neq",
900
+ "in",
901
+ "contains",
902
+ "gte",
903
+ "lte",
904
+ "is_empty",
905
+ "not_empty",
906
+ "belongs_to"
907
+ ],
908
+ "default": "eq"
909
+ },
910
+ "values": {
911
+ "type": "array"
912
+ }
913
+ }
914
+ },
915
+ "GridConfig": {
916
+ "type": "object",
917
+ "additionalProperties": false,
918
+ "required": [
919
+ "items"
920
+ ],
921
+ "gridConfigShapeDescription": "业务入口宫格配置;items 必须含真实条目,不接受空宫格。声明键与后端 ComponentGridInfo 键一致(camelCase):gridTitle/beingShowTitle/items。",
922
+ "properties": {
923
+ "gridTitle": {
924
+ "type": "string",
925
+ "gridTitleShapeDescription": "宫格标题(缺省用 section.title)。",
926
+ "x-backend": "ComponentGridInfo.gridTitle"
927
+ },
928
+ "beingShowTitle": {
929
+ "type": "boolean",
930
+ "default": true,
931
+ "gridShowTitleShapeDescription": "是否显示宫格标题。",
932
+ "x-backend": "ComponentGridInfo.beingShowTitle"
933
+ },
934
+ "items": {
935
+ "type": "array",
936
+ "gridItemsShapeDescription": "入口条目列表(ordinal 缺省按数组顺序)。 空数组合法(空入口宫格:后端建 grid 行、0 item 行,round-trip 保真)。",
937
+ "items": {
938
+ "$ref": "#/$defs/GridItem"
939
+ }
940
+ }
941
+ },
942
+ "x-backend": "ComponentGridInfo"
943
+ },
944
+ "FilterConfig": {
945
+ "type": "object",
946
+ "additionalProperties": false,
947
+ "filterConfigShapeDescription": "筛选组件配置(受控键集;filter 组件语义 raw/unstable,不建议作为主自动化路径)。graphs 为受影响的图表引用,rules 为筛选规则组(键集以 ws40013 dataset 实测形态定稿)。",
948
+ "properties": {
949
+ "graphs": {
950
+ "type": "array",
951
+ "filterGraphsDescription": "筛选作用的图表引用列表(chart_key/chart_name)。",
952
+ "items": {
953
+ "type": "object",
954
+ "additionalProperties": false,
955
+ "properties": {
956
+ "chart_key": {
957
+ "type": "string"
958
+ },
959
+ "chart_name": {
960
+ "type": "string"
961
+ }
962
+ }
963
+ },
964
+ "x-backend": "ComponentFilter.graphList(GraphVO.graphKey/graphName)"
965
+ },
966
+ "rules": {
967
+ "type": "array",
968
+ "filterRulesDescription": "筛选规则组(受控透传;dataset 校准后开放规范键)。",
969
+ "x-backend": "ComponentFilter.filterConfig(List<FilterConfig>)"
970
+ }
971
+ }
972
+ },
973
+ "CarouselConfig": {
974
+ "type": "object",
975
+ "additionalProperties": false,
976
+ "required": [],
977
+ "carouselShapeDescription": "轮播组件配置:绑定一个应用的记录流,按标题/图片/链接字段轮播展示。",
978
+ "properties": {
979
+ "source_app_key": {
980
+ "type": "string",
981
+ "carouselSourceAppDescription": "轮播数据源应用 key。 悬空轮播(源表已删,related_form_id NULL 存量形态)缺省合法:后端写链不写 relatedFormId,读面回空 sourceApp。",
982
+ "x-backend": "ComponentCarouselConfig.sourceApp(ComponentFormBaseInfo)"
983
+ },
984
+ "source_form_title": {
985
+ "type": "string",
986
+ "sourceFormTitleDescription": "源表标题(读面派生回填,写链不落库)。别名 sourceFormTitle。",
987
+ "x-backend": "ComponentCarouselConfig.sourceApp.formTitle(读面派生)"
988
+ },
989
+ "title_field": {
990
+ "type": "string",
991
+ "carouselTitleFieldDescription": "标题字段(显示名)。",
992
+ "x-backend": "ComponentCarouselConfig.titleQue(ComponentQueBaseInfo)"
993
+ },
994
+ "image_field": {
995
+ "type": "string",
996
+ "carouselImageFieldDescription": "图片字段(显示名,附件/图片类字段)。",
997
+ "x-backend": "ComponentCarouselConfig.imageQue"
998
+ },
999
+ "link_field": {
1000
+ "type": "string",
1001
+ "carouselLinkFieldDescription": "链接字段(显示名,点击轮播项跳转)。",
1002
+ "x-backend": "ComponentCarouselConfig.linkQue"
1003
+ },
1004
+ "jump_mode": {
1005
+ "type": "integer",
1006
+ "carouselJumpModeDescription": "跳转方式。",
1007
+ "x-backend": "ComponentCarouselConfig.jumpMode"
1008
+ },
1009
+ "scaling": {
1010
+ "type": "boolean",
1011
+ "carouselScalingDescription": "图片是否缩放填充。别名 beingScaling。",
1012
+ "x-backend": "ComponentCarouselConfig.beingScaling"
1013
+ },
1014
+ "show_latest_limit": {
1015
+ "type": "integer",
1016
+ "minimum": 1,
1017
+ "carouselShowLatestDescription": "只展示最新 N 条记录。",
1018
+ "x-backend": "ComponentCarouselConfig.showLatestLimit"
1019
+ },
1020
+ "scroll_interval": {
1021
+ "type": "integer",
1022
+ "minimum": 1,
1023
+ "carouselScrollIntervalDescription": "轮播滚动间隔(秒)。",
1024
+ "x-backend": "ComponentCarouselConfig.scrollInterval"
1025
+ },
1026
+ "filters": {
1027
+ "type": "array",
1028
+ "items": {
1029
+ "$ref": "#/$defs/ChartFilterRule"
1030
+ },
1031
+ "carouselFiltersDescription": "数据源过滤条件(单组 AND)。",
1032
+ "x-backend": "ComponentCarouselConfig.filterConfig(List<List<MatchRule>>)"
1033
+ }
1034
+ }
1035
+ },
1036
+ "TaskConfig": {
1037
+ "type": "object",
1038
+ "additionalProperties": false,
1039
+ "taskShapeDescription": "待办组件配置。",
1040
+ "properties": {
1041
+ "show_title": {
1042
+ "type": "boolean",
1043
+ "default": true,
1044
+ "taskShowTitleDescription": "是否显示待办标题。别名 beingShowTitle。",
1045
+ "x-backend": "ComponentTaskConfig.beingShowTitle"
1046
+ },
1047
+ "hint": {
1048
+ "type": "string",
1049
+ "taskHintDescription": "待办提示文案。别名 componentTaskHint。",
1050
+ "x-backend": "ComponentTaskConfig.componentTaskHint"
1051
+ },
1052
+ "show_hint": {
1053
+ "type": "boolean",
1054
+ "taskShowHintDescription": "是否显示提示。别名 beingShowHint。",
1055
+ "x-backend": "ComponentTaskConfig.beingShowHint"
1056
+ },
1057
+ "enabled": {
1058
+ "type": "boolean",
1059
+ "taskEnabledDescription": "待办组件是否启用。别名 beingUsing。",
1060
+ "x-backend": "ComponentTaskConfig.beingUsing"
1061
+ },
1062
+ "tasks": {
1063
+ "type": "array",
1064
+ "taskItemsDescription": "待办任务条目(键集以 dataset 实测形态定稿)。",
1065
+ "x-backend": "ComponentTaskConfig.dashTaskConfigList(DashTaskConfig)"
1066
+ }
1067
+ }
1068
+ },
1069
+ "FavouriteConfig": {
1070
+ "type": "object",
1071
+ "additionalProperties": false,
1072
+ "favouriteShapeDescription": "收藏组件配置。",
1073
+ "properties": {
1074
+ "show_title": {
1075
+ "type": "boolean",
1076
+ "default": true,
1077
+ "favouriteShowTitleDescription": "是否显示收藏标题。别名 beingShowTitle。",
1078
+ "x-backend": "ComponentFavouriteConfig.beingShowTitle"
1079
+ },
1080
+ "enabled": {
1081
+ "type": "boolean",
1082
+ "favouriteEnabledDescription": "收藏组件是否启用。别名 beingUsing。",
1083
+ "x-backend": "ComponentFavouriteConfig.beingUsing"
1084
+ },
1085
+ "items": {
1086
+ "type": "array",
1087
+ "favouriteItemsDescription": "收藏条目(键集以 dataset 实测形态定稿)。",
1088
+ "x-backend": "ComponentFavouriteConfig.items(ComponentFavouriteItemInfo)"
1089
+ }
1090
+ }
1091
+ },
1092
+ "GridItem": {
1093
+ "type": "object",
1094
+ "additionalProperties": false,
1095
+ "required": [
1096
+ "type",
1097
+ "jumpMode",
1098
+ "title"
1099
+ ],
1100
+ "gridItemShapeDescription": "单个入口条目。grid 的 config 声明键与后端 ComponentGridItemInfo 键一致(camelCase);Python 端 section.config 直接透传。",
1101
+ "properties": {
1102
+ "type": {
1103
+ "type": "integer",
1104
+ "gridItemTypeDescription": "入口类型:1=应用,2=门户,3=应用包,4=外链。",
1105
+ "x-backend": "ComponentGridItemInfo.type"
1106
+ },
1107
+ "jumpMode": {
1108
+ "type": "integer",
1109
+ "gridJumpModeDescription": "跳转方式:1=应用内页,2=新页面。",
1110
+ "x-backend": "ComponentGridItemInfo.jumpMode"
1111
+ },
1112
+ "linkAppKey": {
1113
+ "type": "string",
1114
+ "gridItemAppKeyDescription": "目标应用 key(type=1 时使用)。",
1115
+ "x-backend": "ComponentGridItemInfo.linkAppKey"
1116
+ },
1117
+ "linkFormType": {
1118
+ "type": [
1119
+ "integer",
1120
+ "null"
1121
+ ],
1122
+ "gridItemFormTypeDescription": "目标应用页面形态(type=1 时使用)。",
1123
+ "x-backend": "ComponentGridItemInfo.linkFormType"
1124
+ },
1125
+ "linkDashKey": {
1126
+ "type": [
1127
+ "string",
1128
+ "null"
1129
+ ],
1130
+ "gridItemDashKeyDescription": "目标门户 key(type=2 时使用)。",
1131
+ "x-backend": "ComponentGridItemInfo.linkDashKey"
1132
+ },
1133
+ "linkTagId": {
1134
+ "type": [
1135
+ "integer",
1136
+ "null"
1137
+ ],
1138
+ "gridItemTagIdDescription": "目标应用包 tagId(type=3 时使用)。",
1139
+ "x-backend": "ComponentGridItemInfo.linkTagId"
1140
+ },
1141
+ "linkUrl": {
1142
+ "type": [
1143
+ "string",
1144
+ "null"
1145
+ ],
1146
+ "maxLength": 500,
1147
+ "gridItemUrlDescription": "外链地址(type=4 时使用)。",
1148
+ "x-backend": "ComponentGridItemInfo.linkUrl"
1149
+ },
1150
+ "title": {
1151
+ "type": "string",
1152
+ "gridItemTitleDescription": "入口标题。",
1153
+ "x-backend": "ComponentGridItemInfo.title"
1154
+ },
1155
+ "customTitle": {
1156
+ "type": "string",
1157
+ "gridItemCustomTitleDescription": "自定义标题(beingCustomTitle=true 时生效)。",
1158
+ "x-backend": "ComponentGridItemInfo.customTitle"
1159
+ },
1160
+ "beingCustomTitle": {
1161
+ "type": "boolean",
1162
+ "default": false,
1163
+ "gridItemCustomTitleSwitchDescription": "是否启用自定义标题。",
1164
+ "x-backend": "ComponentGridItemInfo.beingCustomTitle"
1165
+ },
1166
+ "iconUrl": {
1167
+ "type": "string",
1168
+ "gridItemIconDescription": "入口图标 URL(可选,缺省按目标解析)。",
1169
+ "x-backend": "ComponentGridItemInfo.iconUrl"
1170
+ },
1171
+ "ordinal": {
1172
+ "type": [
1173
+ "integer",
1174
+ "null"
1175
+ ],
1176
+ "gridItemOrdinalDescription": "排序(缺省按数组顺序)。",
1177
+ "x-backend": "ComponentGridItemInfo.ordinal"
1178
+ }
1179
+ }
1180
+ }
1181
+ },
1182
+ "$ref": "#/$defs/PortalDeclaration",
1183
+ "x-qingflow-config-sections": {
1184
+ "sectionsDescription": "complete 声明按配置域组织;各域可整体省略,省略片段的语义见 x-qingflow-write-semantics。",
1185
+ "sections": {
1186
+ "identity": "name/package_tag_id/dash_key/publish。",
1187
+ "layout": "sections[].position / layout_preset。",
1188
+ "global": "icon/color/hide_copyright/global_config/style_template_id/overall_style。",
1189
+ "components": "sections[](九类组件与类型化 config/style_config)。",
1190
+ "authorization": "visibility(对内 + 外部成员授权)。"
1191
+ }
1192
+ },
1193
+ "x-qingflow-related-schemas": {
1194
+ "summary": "builder portal schema --schema-kind summary(CLI)/portal_schema(schema_kind=summary)。",
1195
+ "views": "视图声明契约 builder views schema(视图组件引用的视图本体配置)。",
1196
+ "charts": "图表声明契约 builder chart 面(内联图表引用的图表完整可写面)。"
1197
+ },
1198
+ "x-qingflow-write-semantics": {
1199
+ "create": "省略的配置片段由 builder 组装创建默认值;JSON Schema 的 default 只是注解。",
1200
+ "sections_replace": "提交 sections 即整体替换组件清单(replace);不带 sections 的 apply 为 base-info 更新(名称/图标/授权/归属)。",
1201
+ "patch_compat": "局部更新走 CLI 兼容参数 --patch-sections-file(order/chart_ref.chart_id/view_ref.view_key 选择器 + set/unset);声明面收敛后由 complete 档承载。",
1202
+ "readback": "apply 后自动回读草稿态(发布时另回读线上态)并做元数据校验;回读失败记 partial,不算成功也不算失败。",
1203
+ "backend_warning": "底层 DashDetailInfo 更新接口对部分省略字段会执行默认初始化,不得把后端请求中的省略统一理解为保留。"
1204
+ },
1205
+ "x-qingflow-capability-boundary": {
1206
+ "contract": "仅列出 portal_apply 真正可写的字段;键集以 ws40013 dataset 实测形态校准。",
1207
+ "backendKnownUnsupported": {
1208
+ "watermark": "工作区水印(beingWatermark/watermarkConfig)是工作区级配置,不属于门户写入契约。",
1209
+ "publish_state": "publishStatus 由发布动作管理,不作为声明字段。",
1210
+ "runtime_flags": "beingFavorite/editItemStatus/deleteItemStatus/componentStatus/dashCount 为读面运行态。",
1211
+ "deprecated": "favouriteTagId 后端已 @Deprecated,不进契约。",
1212
+ "filter_semantics": "filter 组件的语义化筛选 DSL(v1alpha2 候选);当前受控键集见 qingflow builder portal schema --schema-kind filter。",
1213
+ "carousel_media": "轮播媒体明细超集(v1alpha2 候选,dataset 校准);当前键集见 qingflow builder portal schema --schema-kind carousel。"
1214
+ }
1215
+ },
1216
+ "examples": [
1217
+ {
1218
+ "name": "运营门户",
1219
+ "package_tag_id": 2030703,
1220
+ "icon": "view-grid",
1221
+ "color": "#2468F2",
1222
+ "hide_copyright": true,
1223
+ "global_config": {
1224
+ "auto_refresh": true,
1225
+ "interval": 120,
1226
+ "export": true
1227
+ },
1228
+ "visibility": {
1229
+ "mode": "specific",
1230
+ "selectors": {
1231
+ "member_names": [
1232
+ "张三"
1233
+ ],
1234
+ "dept_names": [
1235
+ "运维部"
1236
+ ]
1237
+ },
1238
+ "external_mode": "not"
1239
+ },
1240
+ "sections": [
1241
+ {
1242
+ "title": "业务入口",
1243
+ "source_type": "grid",
1244
+ "position": {
1245
+ "pc": {
1246
+ "x": 0,
1247
+ "y": 0,
1248
+ "cols": 24,
1249
+ "rows": 4
1250
+ }
1251
+ },
1252
+ "config": {
1253
+ "gridTitle": "业务入口",
1254
+ "beingShowTitle": true,
1255
+ "items": [
1256
+ {
1257
+ "type": 1,
1258
+ "jumpMode": 1,
1259
+ "linkAppKey": "APP_KEY_OPS",
1260
+ "linkFormType": 1,
1261
+ "title": "运维台账"
1262
+ }
1263
+ ]
1264
+ }
1265
+ },
1266
+ {
1267
+ "title": "告警趋势",
1268
+ "source_type": "chart",
1269
+ "position": {
1270
+ "pc": {
1271
+ "x": 0,
1272
+ "y": 4,
1273
+ "cols": 12,
1274
+ "rows": 7
1275
+ }
1276
+ },
1277
+ "chart": {
1278
+ "app_key": "APP_KEY_OPS",
1279
+ "name": "告警趋势",
1280
+ "chart_type": "line",
1281
+ "metric": "count(*)",
1282
+ "group_by": [
1283
+ "告警日期"
1284
+ ]
1285
+ }
1286
+ },
1287
+ {
1288
+ "title": "最新公告",
1289
+ "source_type": "carousel",
1290
+ "position": {
1291
+ "pc": {
1292
+ "x": 12,
1293
+ "y": 4,
1294
+ "cols": 12,
1295
+ "rows": 7
1296
+ }
1297
+ },
1298
+ "carousel": {
1299
+ "source_app_key": "APP_KEY_NOTICE",
1300
+ "title_field": "公告标题",
1301
+ "image_field": "封面图",
1302
+ "link_field": "详情链接",
1303
+ "show_latest_limit": 5,
1304
+ "scroll_interval": 8
1305
+ }
1306
+ },
1307
+ {
1308
+ "title": "我的待办",
1309
+ "source_type": "task",
1310
+ "position": {
1311
+ "pc": {
1312
+ "x": 0,
1313
+ "y": 11,
1314
+ "cols": 12,
1315
+ "rows": 8
1316
+ }
1317
+ },
1318
+ "task": {
1319
+ "show_title": true,
1320
+ "enabled": true
1321
+ }
1322
+ },
1323
+ {
1324
+ "title": "处理工单",
1325
+ "source_type": "view",
1326
+ "position": {
1327
+ "pc": {
1328
+ "x": 0,
1329
+ "y": 19,
1330
+ "cols": 24,
1331
+ "rows": 11
1332
+ }
1333
+ },
1334
+ "view_ref": {
1335
+ "app_key": "APP_KEY_OPS",
1336
+ "view_key": "VIEW_KEY_PENDING"
1337
+ },
1338
+ "view_display": {
1339
+ "show_title": true
1340
+ }
1341
+ },
1342
+ {
1343
+ "title": "帮助中心",
1344
+ "source_type": "link",
1345
+ "position": {
1346
+ "pc": {
1347
+ "x": 0,
1348
+ "y": 30,
1349
+ "cols": 24,
1350
+ "rows": 4
1351
+ }
1352
+ },
1353
+ "url": "https://help.example.com",
1354
+ "login_auth": false
1355
+ }
1356
+ ]
1357
+ }
1358
+ ],
1359
+ "x-qingflow-detail-query": {
1360
+ "currentKind": "complete",
1361
+ "tool": "portal_schema",
1362
+ "cli": "qingflow builder portal schema --schema-kind KIND",
1363
+ "argument": "schema_kind",
1364
+ "kinds": [
1365
+ "summary",
1366
+ "complete",
1367
+ "chart",
1368
+ "view",
1369
+ "grid",
1370
+ "filter",
1371
+ "text",
1372
+ "link",
1373
+ "carousel",
1374
+ "task",
1375
+ "favourite"
1376
+ ],
1377
+ "kindDescriptions": {
1378
+ "summary": "门户名称 + 布局 + 组件清单(五类稳定组件类型)。",
1379
+ "complete": "完整门户声明:全局配置 + 九类组件明细 + 可见性授权;summary 是它的最小子集。",
1380
+ "chart": "报表组件:chart_ref 已有图表引用 / chart 内联创建(QingBI 全类型、指标、过滤、双轴)。",
1381
+ "view": "数据视图组件:视图引用(view_key 优先)与组件展示配置。",
1382
+ "grid": "业务入口宫格:入口条目(应用/门户/外链)、图标、自定义标题、排序。",
1383
+ "filter": "筛选组件:作用图表与筛选规则组(语义 raw/unstable,不建议主自动化路径)。",
1384
+ "text": "文本组件:富文本内容。",
1385
+ "link": "链接组件:地址(≤500)与登录鉴权。",
1386
+ "carousel": "轮播组件:数据源应用 + 标题/图片/链接字段绑定 + 滚动配置。",
1387
+ "task": "待办组件:提示文案与任务条目。",
1388
+ "favourite": "收藏组件:预置收藏条目。"
1389
+ },
1390
+ "detailQueryDescription": "每种组件类型的详细配置都有自包含专项 Schema:按需调用 portal_schema 传对应 schema_kind(CLI: qingflow builder portal schema --schema-kind chart|view|grid|filter|text|link|carousel|task|favourite);专项已内联其引用的定义,可独立交给 JSON Schema 校验器。",
1391
+ "readSources": {
1392
+ "chartIds": "已有图表用 chart 面读取 chart_id;内联创建则直接在 section.chart 声明。",
1393
+ "viewKeys": "视图唯一键用 qingflow builder views get --app-key APP 回读。",
1394
+ "existingPortal": "既有门户声明用 qingflow builder portal get --dash-key K --schema-kind summary|complete 回读。"
1395
+ }
1396
+ }
1397
+ }