weaver-e10-builder 1.6.10 → 1.6.11
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/dist/commands/report-admin.d.ts.map +1 -1
- package/dist/commands/report-admin.js +378 -2
- package/dist/commands/report-admin.js.map +1 -1
- package/dist/commands/report-validate.d.ts.map +1 -1
- package/dist/commands/report-validate.js +1066 -3
- package/dist/commands/report-validate.js.map +1 -1
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +341 -3
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/workflow-after-submit-comment.d.ts +3 -0
- package/dist/commands/workflow-after-submit-comment.d.ts.map +1 -0
- package/dist/commands/workflow-after-submit-comment.js +56 -0
- package/dist/commands/workflow-after-submit-comment.js.map +1 -0
- package/dist/commands/workflow-setting.d.ts.map +1 -1
- package/dist/commands/workflow-setting.js +2 -67
- package/dist/commands/workflow-setting.js.map +1 -1
- package/dist/services/report/blueprint.d.ts +109 -0
- package/dist/services/report/blueprint.d.ts.map +1 -0
- package/dist/services/report/blueprint.js +322 -0
- package/dist/services/report/blueprint.js.map +1 -0
- package/dist/services/report/build.d.ts.map +1 -1
- package/dist/services/report/build.js +8 -3
- package/dist/services/report/build.js.map +1 -1
- package/dist/services/report/card.d.ts +65 -0
- package/dist/services/report/card.d.ts.map +1 -0
- package/dist/services/report/card.js +151 -0
- package/dist/services/report/card.js.map +1 -0
- package/dist/services/report/copy-health.d.ts +31 -0
- package/dist/services/report/copy-health.d.ts.map +1 -0
- package/dist/services/report/copy-health.js +87 -0
- package/dist/services/report/copy-health.js.map +1 -0
- package/dist/services/report/dataset-heal.d.ts +64 -0
- package/dist/services/report/dataset-heal.d.ts.map +1 -0
- package/dist/services/report/dataset-heal.js +89 -0
- package/dist/services/report/dataset-heal.js.map +1 -0
- package/dist/services/report/dataset-ids.d.ts +70 -0
- package/dist/services/report/dataset-ids.d.ts.map +1 -0
- package/dist/services/report/dataset-ids.js +149 -0
- package/dist/services/report/dataset-ids.js.map +1 -0
- package/dist/services/report/dataset.d.ts.map +1 -1
- package/dist/services/report/dataset.js +3 -1
- package/dist/services/report/dataset.js.map +1 -1
- package/dist/services/report/empty-dataset.d.ts +51 -0
- package/dist/services/report/empty-dataset.d.ts.map +1 -0
- package/dist/services/report/empty-dataset.js +213 -0
- package/dist/services/report/empty-dataset.js.map +1 -0
- package/dist/services/report/field-binding.d.ts +75 -0
- package/dist/services/report/field-binding.d.ts.map +1 -0
- package/dist/services/report/field-binding.js +160 -0
- package/dist/services/report/field-binding.js.map +1 -0
- package/dist/services/report/forms.d.ts +32 -0
- package/dist/services/report/forms.d.ts.map +1 -1
- package/dist/services/report/forms.js +90 -0
- package/dist/services/report/forms.js.map +1 -1
- package/dist/services/report/formula-parent.d.ts +25 -0
- package/dist/services/report/formula-parent.d.ts.map +1 -0
- package/dist/services/report/formula-parent.js +116 -0
- package/dist/services/report/formula-parent.js.map +1 -0
- package/dist/services/report/locate.d.ts +40 -0
- package/dist/services/report/locate.d.ts.map +1 -0
- package/dist/services/report/locate.js +122 -0
- package/dist/services/report/locate.js.map +1 -0
- package/dist/services/report/reports.d.ts +4 -0
- package/dist/services/report/reports.d.ts.map +1 -1
- package/dist/services/report/reports.js +4 -2
- package/dist/services/report/reports.js.map +1 -1
- package/dist/services/report/scene.d.ts +22 -0
- package/dist/services/report/scene.d.ts.map +1 -0
- package/dist/services/report/scene.js +145 -0
- package/dist/services/report/scene.js.map +1 -0
- package/dist/services/report/types.d.ts +28 -0
- package/dist/services/report/types.d.ts.map +1 -1
- package/dist/services/report/verify.d.ts +24 -0
- package/dist/services/report/verify.d.ts.map +1 -1
- package/dist/services/report/verify.js +115 -2
- package/dist/services/report/verify.js.map +1 -1
- package/dist/services/report/workbook.d.ts +12 -1
- package/dist/services/report/workbook.d.ts.map +1 -1
- package/dist/services/report/workbook.js +107 -8
- package/dist/services/report/workbook.js.map +1 -1
- package/dist/services/workflow-after-submit-comment.d.ts +20 -0
- package/dist/services/workflow-after-submit-comment.d.ts.map +1 -0
- package/dist/services/workflow-after-submit-comment.js +81 -0
- package/dist/services/workflow-after-submit-comment.js.map +1 -0
- package/ecodecmd/src/build.js +36 -12
- package/package.json +1 -1
- package/skill-docs/SKILL.md +4 -4
- package/skill-docs/_catalog.md +10 -1
- package/skill-docs/references/coding/guide-page-code.md +95 -0
- package/skill-docs/references/components/ref-component-common.md +98 -0
- package/skill-docs/references/report/add-dataset-registration-guide.md +44 -22
- package/skill-docs/references/report/advanced-crosstab-tree-guide.md +82 -0
- package/skill-docs/references/report/ai-report-workflow.md +100 -100
- package/skill-docs/references/report/api-auth-headers.md +129 -0
- package/skill-docs/references/report/api-report-build-fast-path.md +274 -275
- package/skill-docs/references/report/app-datasource-lookup-guide.md +230 -230
- package/skill-docs/references/report/branch-scene-guide.md +293 -0
- package/skill-docs/references/report/build-resilience-guide.md +99 -0
- package/skill-docs/references/report/card-report-guide.md +110 -0
- package/skill-docs/references/report/cell-config-echo-guide.md +44 -9
- package/skill-docs/references/report/cell-transform-guide.md +9 -9
- package/skill-docs/references/report/column-split-report-guide.md +96 -0
- package/skill-docs/references/report/condition-format-guide.md +49 -24
- package/skill-docs/references/report/cross-dataset-filter-guide.md +180 -69
- package/skill-docs/references/report/crosstab-raw-workbook-guide.md +265 -0
- package/skill-docs/references/report/dataset-query-filter-guide.md +231 -235
- package/skill-docs/references/report/dataset-sidebar-ops-guide.md +75 -34
- package/skill-docs/references/report/dataset-table-field-contract-guide.md +196 -46
- package/skill-docs/references/report/datasource-metadata-guide.md +128 -119
- package/skill-docs/references/report/datasource-selection-and-parent-filter-guide.md +183 -148
- package/skill-docs/references/report/date-range-query-reference.md +97 -102
- package/skill-docs/references/report/default-header-style-guide.md +8 -8
- package/skill-docs/references/report/designer-blank-prevention-guide.md +8 -8
- package/skill-docs/references/report/dossier-report-guide.md +69 -0
- package/skill-docs/references/report/drilldown-report-guide.md +59 -0
- package/skill-docs/references/report/event-hreflink-guide.md +53 -47
- package/skill-docs/references/report/expansion-block-parent-config-guide.md +208 -0
- package/skill-docs/references/report/failure-cleanup-and-nonblocking-guide.md +183 -0
- package/skill-docs/references/report/field-bind-exact-match-guide.md +208 -208
- package/skill-docs/references/report/financial-stats-report-guide.md +89 -0
- package/skill-docs/references/report/formula-cell-api-guide.md +325 -258
- package/skill-docs/references/report/golden-case-summary-sheet.md +200 -0
- package/skill-docs/references/report/guide-report-build.md +6 -1
- package/skill-docs/references/report/hidden-row-and-header-merge-guide.md +10 -10
- package/skill-docs/references/report/layout-showlocation-freeze-guide.md +39 -10
- package/skill-docs/references/report/multi-report-crosstab-casebook.md +263 -0
- package/skill-docs/references/report/paged-group-report-guide.md +68 -0
- package/skill-docs/references/report/preaggregate-auto-disable-guide.md +24 -13
- package/skill-docs/references/report/query-condition-api-guide.md +145 -125
- package/skill-docs/references/report/ref-report-commands.md +41 -3
- package/skill-docs/references/report/report-baseinfo-defaults-guide.md +117 -117
- package/skill-docs/references/report/report-building-guide.md +52 -52
- package/skill-docs/references/report/report-case-prompts.md +104 -0
- package/skill-docs/references/report/report-config-schema.md +281 -281
- package/skill-docs/references/report/report-create-modes-guide.md +73 -35
- package/skill-docs/references/report/report-data-model.md +131 -131
- package/skill-docs/references/report/report-delivery-contract.md +23 -3
- package/skill-docs/references/report/report-designer-feature-map.md +30 -35
- package/skill-docs/references/report/report-help-guide.md +304 -0
- package/skill-docs/references/report/report-internal-error-guide.md +71 -0
- package/skill-docs/references/report/report-knowledge-base.md +27 -27
- package/skill-docs/references/report/report-lifecycle-api-guide.md +126 -94
- package/skill-docs/references/report/report-list-page-ops-guide.md +54 -8
- package/skill-docs/references/report/report-permission-guide.md +99 -102
- package/skill-docs/references/report/report-requirement-analysis-template.md +93 -29
- package/skill-docs/references/report/report-self-check-guide.md +164 -164
- package/skill-docs/references/report/report-verification-discipline-guide.md +203 -0
- package/skill-docs/references/report/safe-partial-save-guide.md +151 -151
- package/skill-docs/references/report/shard-freeze-report-guide.md +97 -0
- package/skill-docs/references/report/snowflake-id-precision-guide.md +84 -84
- package/skill-docs/references/report/spec-build-schema.md +71 -71
- package/skill-docs/references/report/targeted-fix-guide.md +155 -97
- package/skill-docs/references/report/user-request-scope-only-guide.md +23 -4
- package/skill-docs/references/workflow/guide-after-submit-comment.md +58 -0
- package/skill-docs/references/workflow/guide-workflow.md +6 -0
|
@@ -1,230 +1,230 @@
|
|
|
1
|
-
# 应用内数据源查找(强制优先级)
|
|
2
|
-
|
|
3
|
-
> **适用**:能力一/五、API 从零搭建报表时,需要把「需求里的表单/数据源名称」解析为 `sourceId`。
|
|
4
|
-
> **核心规则**:**先当前应用、后别处**;命中即停;**禁止**固定 `sleep`;**禁止**为找表启动 浏览器自动化 开应用页。
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 一、判定顺序(任务开始后第一步)
|
|
9
|
-
|
|
10
|
-
| 输入 | 解析 appId | 找 sourceId |
|
|
11
|
-
|------|------------|-------------|
|
|
12
|
-
| **appId + 数据源名** | 直接用 | **① 应用内**(§二)→ 未命中再 **② 别处**(§三,有限次) |
|
|
13
|
-
| **appName + 数据源名** | `GET /api/bs/ebuilder/app/list?name={appName}&pageNo=1&pageSize=20` **1 次** | 同上 |
|
|
14
|
-
| **仅数据源名,无 app** | — | 直接 §三(须带关键字) |
|
|
15
|
-
| **appId + sourceId 已给** | 直接用 | **跳过查找**,直接 `addDataset` |
|
|
16
|
-
|
|
17
|
-
**禁止(已指定 app 时的首轮)**:
|
|
18
|
-
|
|
19
|
-
- 一上来就 `GET /ds/group` 全系统遍历
|
|
20
|
-
- 对每个 `groupId` 循环 `listByPage` 空扫
|
|
21
|
-
- 多 module(`ebuilder` / `bs` / `datasource`)无关键字轮询试探
|
|
22
|
-
- **先拉系统级分页再本地过滤「当前应用」**(分页也必须带 appId)
|
|
23
|
-
- **`sleep` / `setTimeout` 固定等待** 代替「读接口直到有数据」
|
|
24
|
-
- **浏览器自动化 打开应用详情页**
|
|
25
|
-
|
|
26
|
-
**强制优先级**:`e10-cli report find` = `getList/{appId}` → 未命中再问用户 / 有限次应用内关键字 listByPage → **最后**才别处。
|
|
27
|
-
见 `
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## 二、应用内查找(已指定 appId · 优先 · 通常 1 次)
|
|
32
|
-
|
|
33
|
-
### 2.0 未指定准确表名(强制 · 二次确认)
|
|
34
|
-
|
|
35
|
-
> **事故模式**:需求只写业务描述(如「资产统计」「党员发展」)未给表单名 → Agent 模糊匹配错表 → 数据集字段对不上。
|
|
36
|
-
|
|
37
|
-
| 用户输入 | Agent 行为 | 绑定 |
|
|
38
|
-
|----------|------------|------|
|
|
39
|
-
| **已给准确表名** 且应用内 **exact 唯一** | 可 `find form` 后绑定 | `autoBind=true`(建议仍口头确认) |
|
|
40
|
-
| **未给表名** / 只给业务词 / 报表名 | **只在当前应用** `getList/{appId}` 检索 → 按关键字打分出候选 | **`needConfirm=true`,禁止 addDataset** |
|
|
41
|
-
| **模糊命中 1 条或多条** | 展示候选(表名 + sourceId) | **必须等用户确认** 后再绑 |
|
|
42
|
-
| 应用内无候选 | 问用户准确表名/sourceId;**禁止**立刻全系统 `/ds/group` | 不绑 |
|
|
43
|
-
|
|
44
|
-
**二次确认话术(强制)**:
|
|
45
|
-
|
|
46
|
-
```text
|
|
47
|
-
需求未指定准确表名。已在当前应用内检索到以下候选,请确认用哪一张(回复表名或 sourceId):
|
|
48
|
-
1. {nameA}(sourceId=…)
|
|
49
|
-
2. {nameB}(sourceId=…)
|
|
50
|
-
若都不是,请给出准确表单名或 sourceId。
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
**禁止**:未确认就 `addDataset` / 落库绑字段;禁止用报表标题「看起来像」的表直接当数据源。
|
|
54
|
-
|
|
55
|
-
CLI:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
e10-cli report find <appId> --list
|
|
59
|
-
e10-cli report find <appId> --suggest "资产,台账"
|
|
60
|
-
e10-cli report find <appId> "准确表单名"
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
exit code **3** = 须二次确认(`needConfirm=true`)。
|
|
64
|
-
|
|
65
|
-
按优先级尝试,**命中即停**(合计计入 §六预算):
|
|
66
|
-
|
|
67
|
-
### 2.1 【首选 · eteams 已验证】应用表单列表
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
GET /api/bs/ebuilder/form/obj/getList/{appId}?apid={appId}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
- Header:`eteamsid` + `Cookie: ETEAMSID=…` + `ebBusinessId={appId}`
|
|
74
|
-
- 响应为应用内表单数组(或包在 `data`);按 `name` **精确或包含**匹配需求表名
|
|
75
|
-
- 取命中项的 **`id`** 作为 `sourceId`(`addDataset` 用)
|
|
76
|
-
- **示例**:应用 `786501450842480640` 中「进销存-销售单」→ `787599094054395904`
|
|
77
|
-
|
|
78
|
-
```javascript
|
|
79
|
-
async function findFormInApp(host, headers, appId, formName) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 2.2 CLI(表单类 · 优先)
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
e10-cli report find <appId> <表单名>
|
|
93
|
-
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
若 `e10-cli report` auth 与 `e10-
|
|
97
|
-
|
|
98
|
-
字段核对(已有 sourceId 后):
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
# 报表侧(推荐):
|
|
102
|
-
# GET /api/bs/edc/dataset/fieldsBySource?sourceId=&sourceType=logic&groupId=weaver-ebuilder-form-service
|
|
103
|
-
# 或 addDataset 后 fieldsAndOriginFields?isFront=true
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### 2.3 HTTP 备用(仅当 §2.1 失败)
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
GET /api/datasource/ds/listByPage?sourceType=logic&appid={appId}&condition={关键字}&pageNo=1&pageSize=50
|
|
110
|
-
GET /api/ebuilder/form/ds/listByPage?sourceType=LOGIC&groupId=0&name={关键字}&appId={appId}&pageNo=1&pageSize=50
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
> **注意**:部分环境 `form/ds/listByPage` 会 500;**不要**因此改去开 浏览器自动化,应回退 §2.1 或进入 §三 / 询问用户。
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## 三、别处检索(应用内未命中 或 未给 app)
|
|
118
|
-
|
|
119
|
-
**仅当**:应用内 §二已试完仍无命中,**或**用户未指定应用。
|
|
120
|
-
|
|
121
|
-
1. `GET /api/datasource/ds/listByPage`(或 `/api/{module}/ds/listByPage`)带 **`name`/`condition` 关键字** + 必要时 `groupId`
|
|
122
|
-
2. **禁止**无关键字翻页扫全库
|
|
123
|
-
3. 仍计入 §六预算;用尽 → **打断询问**,不要继续盲扫
|
|
124
|
-
|
|
125
|
-
>
|
|
126
|
-
> `GET /api/bs/ebuilder/app/list?name={kw}` 与 `e10-cli report app
|
|
127
|
-
> 恒返回全量 998 条且顺序固定,**不能**靠它定位应用。找不到表时:直接用 `ds/listByPage` 关键字搜数据源,或向用户要 appId/sourceId。
|
|
128
|
-
|
|
129
|
-
若用户其实给了应用名但 Agent 漏解析 → 应先补 `app/list` 再回 §二,而不是直接全系统扫。
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## 四、与报表 API 闭环(禁止固定 sleep)
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
解析 appId(若需要,最多 1 次 app/list)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### 4.1 addDataset 后:轮询代替 sleep(强制)
|
|
145
|
-
|
|
146
|
-
**禁止** `await sleep(800)` / `setTimeout(800)` 之类固定等待。
|
|
147
|
-
|
|
148
|
-
```javascript
|
|
149
|
-
async function waitDatasetBySource(reportId, sourceId, { tries = 8, gapMs = 100 } = {}) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
- 首包常立刻命中(~60ms);未就绪再 100ms 级重试,总等待远小于固定 800ms。
|
|
161
|
-
- `addDataset` 不返回 `datasetId` → **必须**按 **sourceId** 匹配,禁止按下标 `[0]`。
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## 五、HTTP 客户端优先(强制 · 性能)
|
|
166
|
-
|
|
167
|
-
| 做法 | 说明 |
|
|
168
|
-
|------|------|
|
|
169
|
-
| **首选** | Node `https` / `fetch` / 浏览器自动化 **仅** `request` API 发 HTTP(若已有 context) |
|
|
170
|
-
| **禁止为找表** | `chromium.launch` + `page.goto(应用详情)` 扫表单(~0.6s+0.5s+打开页数秒) |
|
|
171
|
-
| **禁止为纯 API 建表** | 仅为 `baseInfo/addDataset/save` 而启动浏览器;用 https + multipart 即可 |
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## 六、探测预算与打断询问(强制 · 防空耗)
|
|
178
|
-
|
|
179
|
-
### 6.1 单次任务硬上限
|
|
180
|
-
|
|
181
|
-
| 项 | 上限 | 说明 |
|
|
182
|
-
|----|------|------|
|
|
183
|
-
| 应用解析 `app/list` | **1** | 已有 appId 则 0 |
|
|
184
|
-
| **应用内**找表(`getList` / `form list` / scoped listByPage) | **合计 ≤ 2** | 换关键字也算;命中即停 |
|
|
185
|
-
| **别处** `group` + `listByPage`(应用内未中或未给 app) | **合计 ≤ 3** | 必须带 name;禁止翻页空扫 |
|
|
186
|
-
| 同一关键字换 module 无脑重试 | **禁止** | |
|
|
187
|
-
| 固定 `sleep` ≥ 300ms 等数据集 | **禁止** | 用 §4.1 轮询 |
|
|
188
|
-
| 浏览器自动化 开应用页找表 | **禁止** | |
|
|
189
|
-
|
|
190
|
-
### 6.2 何时必须打断并询问用户
|
|
191
|
-
|
|
192
|
-
1. §6.1 预算用尽仍无唯一命中。
|
|
193
|
-
2. 关键字命中多条,无法确认。
|
|
194
|
-
3. 表名与应用内列表对不上。
|
|
195
|
-
4. 连续 2 轮仍在换词/换接口盲扫。
|
|
196
|
-
5. **用户未指定准确表名**(仅业务描述/报表名)→ 应用内 `--suggest`/`--list` 后 **二次确认**(§2.0);**禁止**静默绑定。
|
|
197
|
-
6. **模糊匹配**(`match=fuzzy`)→ 即使只有 1 条也必须确认。
|
|
198
|
-
|
|
199
|
-
询问:应用?准确表名或 **sourceId**?多候选点选哪张?
|
|
200
|
-
|
|
201
|
-
### 6.3 禁止的空耗行为
|
|
202
|
-
|
|
203
|
-
- 未给 app 时先全系统 group「碰运气」
|
|
204
|
-
- 已给 app 却跳过 §二直接别处扫
|
|
205
|
-
- 固定 sleep、开浏览器扫页、输出长探测日志代替提问
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## 七、耗时对照(优化目标)
|
|
210
|
-
|
|
211
|
-
| 路径 | 典型耗时 | 说明 |
|
|
212
|
-
|------|----------|------|
|
|
213
|
-
| `getList/{appId}` 应用内命中 | **~0.2–0.5s** | **推荐** |
|
|
214
|
-
| 固定 sleep(800) + 浏览器自动化 启浏览器 | **~2s+** | **禁止** |
|
|
215
|
-
| 浏览器自动化 打开应用详情扫表单 | **~15–20s** | **禁止** |
|
|
216
|
-
| 全系统 group 遍历 | **数秒~数十秒** | 仅 §三兜底 |
|
|
217
|
-
|
|
218
|
-
API 从零搭建:数据源定位应控制在 **2 秒内**(已给 app 时);整段建表(已知名)目标 **≤ 5s**(不含用户确认)。
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## 八、与现有文档关系
|
|
223
|
-
|
|
224
|
-
| 文档 | 关系 |
|
|
225
|
-
|------|------|
|
|
226
|
-
| `e10-cli report find` | 应用内 `getList` 找 sourceId(无 sleep/无浏览器) |
|
|
227
|
-
| `api-report-build-fast-path.md` | 建表流程 §〇 / 性能纪律引用本节 |
|
|
228
|
-
| `datasource-metadata-guide.md` | 有 app → 本节;无 app → §三 |
|
|
229
|
-
| `datasource-selection-and-parent-filter-guide.md` | 少挂源 |
|
|
230
|
-
| `
|
|
1
|
+
# 应用内数据源查找(强制优先级)
|
|
2
|
+
|
|
3
|
+
> **适用**:能力一/五、API 从零搭建报表时,需要把「需求里的表单/数据源名称」解析为 `sourceId`。
|
|
4
|
+
> **核心规则**:**先当前应用、后别处**;命中即停;**禁止**固定 `sleep`;**禁止**为找表启动 浏览器自动化 开应用页。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、判定顺序(任务开始后第一步)
|
|
9
|
+
|
|
10
|
+
| 输入 | 解析 appId | 找 sourceId |
|
|
11
|
+
|------|------------|-------------|
|
|
12
|
+
| **appId + 数据源名** | 直接用 | **① 应用内**(§二)→ 未命中再 **② 别处**(§三,有限次) |
|
|
13
|
+
| **appName + 数据源名** | `GET /api/bs/ebuilder/app/list?name={appName}&pageNo=1&pageSize=20` **1 次** | 同上 |
|
|
14
|
+
| **仅数据源名,无 app** | — | 直接 §三(须带关键字) |
|
|
15
|
+
| **appId + sourceId 已给** | 直接用 | **跳过查找**,直接 `addDataset` |
|
|
16
|
+
|
|
17
|
+
**禁止(已指定 app 时的首轮)**:
|
|
18
|
+
|
|
19
|
+
- 一上来就 `GET /ds/group` 全系统遍历
|
|
20
|
+
- 对每个 `groupId` 循环 `listByPage` 空扫
|
|
21
|
+
- 多 module(`ebuilder` / `bs` / `datasource`)无关键字轮询试探
|
|
22
|
+
- **先拉系统级分页再本地过滤「当前应用」**(分页也必须带 appId)
|
|
23
|
+
- **`sleep` / `setTimeout` 固定等待** 代替「读接口直到有数据」
|
|
24
|
+
- **浏览器自动化 打开应用详情页** 扫网络找表单(验证 ~17s,且非必要)
|
|
25
|
+
|
|
26
|
+
**强制优先级**:`e10-cli report find form` = `getList/{appId}` → 未命中再问用户 / 有限次应用内关键字 listByPage → **最后**才别处。
|
|
27
|
+
见 `api-report-build-fast-path.md` §二。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 二、应用内查找(已指定 appId · 优先 · 通常 1 次)
|
|
32
|
+
|
|
33
|
+
### 2.0 未指定准确表名(强制 · 二次确认)
|
|
34
|
+
|
|
35
|
+
> **事故模式**:需求只写业务描述(如「资产统计」「党员发展」)未给表单名 → Agent 模糊匹配错表 → 数据集字段对不上。
|
|
36
|
+
|
|
37
|
+
| 用户输入 | Agent 行为 | 绑定 |
|
|
38
|
+
|----------|------------|------|
|
|
39
|
+
| **已给准确表名** 且应用内 **exact 唯一** | 可 `find form` 后绑定 | `autoBind=true`(建议仍口头确认) |
|
|
40
|
+
| **未给表名** / 只给业务词 / 报表名 | **只在当前应用** `getList/{appId}` 检索 → 按关键字打分出候选 | **`needConfirm=true`,禁止 addDataset** |
|
|
41
|
+
| **模糊命中 1 条或多条** | 展示候选(表名 + sourceId) | **必须等用户确认** 后再绑 |
|
|
42
|
+
| 应用内无候选 | 问用户准确表名/sourceId;**禁止**立刻全系统 `/ds/group` | 不绑 |
|
|
43
|
+
|
|
44
|
+
**二次确认话术(强制)**:
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
需求未指定准确表名。已在当前应用内检索到以下候选,请确认用哪一张(回复表名或 sourceId):
|
|
48
|
+
1. {nameA}(sourceId=…)
|
|
49
|
+
2. {nameB}(sourceId=…)
|
|
50
|
+
若都不是,请给出准确表单名或 sourceId。
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**禁止**:未确认就 `addDataset` / 落库绑字段;禁止用报表标题「看起来像」的表直接当数据源。
|
|
54
|
+
|
|
55
|
+
CLI:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
e10-cli report find form <appId> --list
|
|
59
|
+
e10-cli report find form <appId> --suggest "资产,台账"
|
|
60
|
+
e10-cli report find form <appId> "准确表单名" # exact 才可 autoBind
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
exit code **3** = 须二次确认(`needConfirm=true`)。
|
|
64
|
+
|
|
65
|
+
按优先级尝试,**命中即停**(合计计入 §六预算):
|
|
66
|
+
|
|
67
|
+
### 2.1 【首选 · eteams 已验证】应用表单列表
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
GET /api/bs/ebuilder/form/obj/getList/{appId}?apid={appId}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Header:`eteamsid` + `Cookie: ETEAMSID=…` + `ebBusinessId={appId}`
|
|
74
|
+
- 响应为应用内表单数组(或包在 `data`);按 `name` **精确或包含**匹配需求表名
|
|
75
|
+
- 取命中项的 **`id`** 作为 `sourceId`(`addDataset` 用)
|
|
76
|
+
- **示例**:应用 `786501450842480640` 中「进销存-销售单」→ `787599094054395904`
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
async function findFormInApp(host, headers, appId, formName) {
|
|
80
|
+
const j = await get(`${host}/api/bs/ebuilder/form/obj/getList/${appId}`, { apid: appId }, headers);
|
|
81
|
+
const rows = Array.isArray(j.data) ? j.data : Array.isArray(j) ? j : j.data?.list || [];
|
|
82
|
+
const exact = rows.find((r) => r.name === formName);
|
|
83
|
+
if (exact) return String(exact.id);
|
|
84
|
+
const fuzzy = rows.find((r) => String(r.name || '').includes(formName) || formName.includes(String(r.name || '')));
|
|
85
|
+
return fuzzy ? String(fuzzy.id) : null;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 2.2 CLI(表单类 · 优先)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
e10-cli report find form <appId> <表单名> # 推荐(本包唯一 CLI 入口)
|
|
93
|
+
e10-cli report find <appId> <表单名> # 仅 CLI 未装时
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
若 `e10-cli report` auth 与 `e10-cli auth` 不同步失败 → **改走 §2.1**,不要去找 e10-cli。
|
|
97
|
+
|
|
98
|
+
字段核对(已有 sourceId 后):
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# 报表侧(推荐):
|
|
102
|
+
# GET /api/bs/edc/dataset/fieldsBySource?sourceId=&sourceType=logic&groupId=weaver-ebuilder-form-service
|
|
103
|
+
# 或 addDataset 后 fieldsAndOriginFields?isFront=true
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 2.3 HTTP 备用(仅当 §2.1 失败)
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
GET /api/datasource/ds/listByPage?sourceType=logic&appid={appId}&condition={关键字}&pageNo=1&pageSize=50
|
|
110
|
+
GET /api/ebuilder/form/ds/listByPage?sourceType=LOGIC&groupId=0&name={关键字}&appId={appId}&pageNo=1&pageSize=50
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
> **注意**:部分环境 `form/ds/listByPage` 会 500;**不要**因此改去开 浏览器自动化,应回退 §2.1 或进入 §三 / 询问用户。
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 三、别处检索(应用内未命中 或 未给 app)
|
|
118
|
+
|
|
119
|
+
**仅当**:应用内 §二已试完仍无命中,**或**用户未指定应用。
|
|
120
|
+
|
|
121
|
+
1. `GET /api/datasource/ds/listByPage`(或 `/api/{module}/ds/listByPage`)带 **`name`/`condition` 关键字** + 必要时 `groupId`
|
|
122
|
+
2. **禁止**无关键字翻页扫全库
|
|
123
|
+
3. 仍计入 §六预算;用尽 → **打断询问**,不要继续盲扫
|
|
124
|
+
|
|
125
|
+
> **验证坑(<your-e10-host>)**:按「应用名」找应用这条路在本环境不可用 ——
|
|
126
|
+
> `GET /api/bs/ebuilder/app/list?name={kw}` 与 `e10-cli report app search --name {kw}` **服务端忽略 `name`**,
|
|
127
|
+
> 恒返回全量 998 条且顺序固定,**不能**靠它定位应用。找不到表时:直接用 `ds/listByPage` 关键字搜数据源,或向用户要 appId/sourceId。
|
|
128
|
+
|
|
129
|
+
若用户其实给了应用名但 Agent 漏解析 → 应先补 `app/list` 再回 §二,而不是直接全系统扫。
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 四、与报表 API 闭环(禁止固定 sleep)
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
解析 appId(若需要,最多 1 次 app/list)
|
|
137
|
+
→ findFormInApp / §二(优先 getList)
|
|
138
|
+
→ [未命中] §三 别处(有限次)
|
|
139
|
+
→ POST addDataset(sourceId)
|
|
140
|
+
→ poll GET dataset/list?reportId= 直到出现匹配 sourceId 的行(见下)
|
|
141
|
+
→ GET fieldsAndOriginFields?datasetId=&isFront=true&reportId=
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 4.1 addDataset 后:轮询代替 sleep(强制)
|
|
145
|
+
|
|
146
|
+
**禁止** `await sleep(800)` / `setTimeout(800)` 之类固定等待。
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
async function waitDatasetBySource(reportId, sourceId, { tries = 8, gapMs = 100 } = {}) {
|
|
150
|
+
for (let i = 0; i < tries; i++) {
|
|
151
|
+
const list = await getDatasetList(reportId); // GET /api/bs/edc/dataset/list?hasField=true&reportId=
|
|
152
|
+
const hit = (list || []).find((d) => String(d.sourceId) === String(sourceId));
|
|
153
|
+
if (hit) return hit;
|
|
154
|
+
await new Promise((r) => setTimeout(r, gapMs)); // 仅短间隔重试,非「盲等 800ms」
|
|
155
|
+
}
|
|
156
|
+
throw new Error(`dataset not ready for sourceId=${sourceId}`);
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- 首包常立刻命中(~60ms);未就绪再 100ms 级重试,总等待远小于固定 800ms。
|
|
161
|
+
- `addDataset` 不返回 `datasetId` → **必须**按 **sourceId** 匹配,禁止按下标 `[0]`。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 五、HTTP 客户端优先(强制 · 性能)
|
|
166
|
+
|
|
167
|
+
| 做法 | 说明 |
|
|
168
|
+
|------|------|
|
|
169
|
+
| **首选** | Node `https` / `fetch` / 浏览器自动化 **仅** `request` API 发 HTTP(若已有 context) |
|
|
170
|
+
| **禁止为找表** | `chromium.launch` + `page.goto(应用详情)` 扫表单(~0.6s+0.5s+打开页数秒) |
|
|
171
|
+
| **禁止为纯 API 建表** | 仅为 `baseInfo/addDataset/save` 而启动浏览器;用 https + multipart 即可 |
|
|
172
|
+
|
|
173
|
+
验证:纯 API 路径找表 + 建表可压到数秒;浏览器自动化 启浏览器 alone ≈ **1s+**。
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 六、探测预算与打断询问(强制 · 防空耗)
|
|
178
|
+
|
|
179
|
+
### 6.1 单次任务硬上限
|
|
180
|
+
|
|
181
|
+
| 项 | 上限 | 说明 |
|
|
182
|
+
|----|------|------|
|
|
183
|
+
| 应用解析 `app/list` | **1** | 已有 appId 则 0 |
|
|
184
|
+
| **应用内**找表(`getList` / `form list` / scoped listByPage) | **合计 ≤ 2** | 换关键字也算;命中即停 |
|
|
185
|
+
| **别处** `group` + `listByPage`(应用内未中或未给 app) | **合计 ≤ 3** | 必须带 name;禁止翻页空扫 |
|
|
186
|
+
| 同一关键字换 module 无脑重试 | **禁止** | |
|
|
187
|
+
| 固定 `sleep` ≥ 300ms 等数据集 | **禁止** | 用 §4.1 轮询 |
|
|
188
|
+
| 浏览器自动化 开应用页找表 | **禁止** | |
|
|
189
|
+
|
|
190
|
+
### 6.2 何时必须打断并询问用户
|
|
191
|
+
|
|
192
|
+
1. §6.1 预算用尽仍无唯一命中。
|
|
193
|
+
2. 关键字命中多条,无法确认。
|
|
194
|
+
3. 表名与应用内列表对不上。
|
|
195
|
+
4. 连续 2 轮仍在换词/换接口盲扫。
|
|
196
|
+
5. **用户未指定准确表名**(仅业务描述/报表名)→ 应用内 `--suggest`/`--list` 后 **二次确认**(§2.0);**禁止**静默绑定。
|
|
197
|
+
6. **模糊匹配**(`match=fuzzy`)→ 即使只有 1 条也必须确认。
|
|
198
|
+
|
|
199
|
+
询问:应用?准确表名或 **sourceId**?多候选点选哪张?
|
|
200
|
+
|
|
201
|
+
### 6.3 禁止的空耗行为
|
|
202
|
+
|
|
203
|
+
- 未给 app 时先全系统 group「碰运气」
|
|
204
|
+
- 已给 app 却跳过 §二直接别处扫
|
|
205
|
+
- 固定 sleep、开浏览器扫页、输出长探测日志代替提问
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 七、耗时对照(优化目标)
|
|
210
|
+
|
|
211
|
+
| 路径 | 典型耗时 | 说明 |
|
|
212
|
+
|------|----------|------|
|
|
213
|
+
| `getList/{appId}` 应用内命中 | **~0.2–0.5s** | **推荐** |
|
|
214
|
+
| 固定 sleep(800) + 浏览器自动化 启浏览器 | **~2s+** | **禁止** |
|
|
215
|
+
| 浏览器自动化 打开应用详情扫表单 | **~15–20s** | **禁止** |
|
|
216
|
+
| 全系统 group 遍历 | **数秒~数十秒** | 仅 §三兜底 |
|
|
217
|
+
|
|
218
|
+
API 从零搭建:数据源定位应控制在 **2 秒内**(已给 app 时);整段建表(已知名)目标 **≤ 5s**(不含用户确认)。
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 八、与现有文档关系
|
|
223
|
+
|
|
224
|
+
| 文档 | 关系 |
|
|
225
|
+
|------|------|
|
|
226
|
+
| `e10-cli report find` | 应用内 `getList` 找 sourceId(无 sleep/无浏览器) |
|
|
227
|
+
| `api-report-build-fast-path.md` | 建表流程 §〇 / 性能纪律引用本节 |
|
|
228
|
+
| `datasource-metadata-guide.md` | 有 app → 本节;无 app → §三 |
|
|
229
|
+
| `datasource-selection-and-parent-filter-guide.md` | 少挂源 |
|
|
230
|
+
| `ref-report-commands.md` | 本包不含 e10-cli;勿扫描 |
|