weaver-e10-builder 1.6.11 → 1.6.12

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 (144) hide show
  1. package/dist/commands/form-browser-definition.d.ts.map +1 -1
  2. package/dist/commands/form-browser-definition.js +108 -7
  3. package/dist/commands/form-browser-definition.js.map +1 -1
  4. package/dist/commands/form-browser-scope-rules.d.ts +27 -0
  5. package/dist/commands/form-browser-scope-rules.d.ts.map +1 -0
  6. package/dist/commands/form-browser-scope-rules.js +141 -0
  7. package/dist/commands/form-browser-scope-rules.js.map +1 -0
  8. package/dist/commands/form-browser-scope-tree.d.ts +14 -0
  9. package/dist/commands/form-browser-scope-tree.d.ts.map +1 -0
  10. package/dist/commands/form-browser-scope-tree.js +115 -0
  11. package/dist/commands/form-browser-scope-tree.js.map +1 -0
  12. package/dist/commands/matrix-maintainer.d.ts +3 -0
  13. package/dist/commands/matrix-maintainer.d.ts.map +1 -0
  14. package/dist/commands/matrix-maintainer.js +117 -0
  15. package/dist/commands/matrix-maintainer.js.map +1 -0
  16. package/dist/commands/matrix.d.ts.map +1 -1
  17. package/dist/commands/matrix.js +2 -0
  18. package/dist/commands/matrix.js.map +1 -1
  19. package/dist/commands/report-validate.d.ts.map +1 -1
  20. package/dist/commands/report-validate.js +36 -0
  21. package/dist/commands/report-validate.js.map +1 -1
  22. package/dist/commands/role.d.ts.map +1 -1
  23. package/dist/commands/role.js +354 -0
  24. package/dist/commands/role.js.map +1 -1
  25. package/dist/commands/special.d.ts.map +1 -1
  26. package/dist/commands/special.js +67 -31
  27. package/dist/commands/special.js.map +1 -1
  28. package/dist/commands/wf-form.d.ts.map +1 -1
  29. package/dist/commands/wf-form.js +1 -121
  30. package/dist/commands/wf-form.js.map +1 -1
  31. package/dist/commands/workflow-layout-components.d.ts +3 -0
  32. package/dist/commands/workflow-layout-components.d.ts.map +1 -0
  33. package/dist/commands/workflow-layout-components.js +36 -0
  34. package/dist/commands/workflow-layout-components.js.map +1 -0
  35. package/dist/commands/workflow-node-batch.d.ts +3 -0
  36. package/dist/commands/workflow-node-batch.d.ts.map +1 -0
  37. package/dist/commands/workflow-node-batch.js +136 -0
  38. package/dist/commands/workflow-node-batch.js.map +1 -0
  39. package/dist/commands/workflow-node-opinion.d.ts +3 -0
  40. package/dist/commands/workflow-node-opinion.d.ts.map +1 -0
  41. package/dist/commands/workflow-node-opinion.js +51 -0
  42. package/dist/commands/workflow-node-opinion.js.map +1 -0
  43. package/dist/commands/workflow-node-reject.js +1 -1
  44. package/dist/commands/workflow-node-reject.js.map +1 -1
  45. package/dist/commands/workflow-node.d.ts.map +1 -1
  46. package/dist/commands/workflow-node.js +4 -3
  47. package/dist/commands/workflow-node.js.map +1 -1
  48. package/dist/index.js +6 -2
  49. package/dist/index.js.map +1 -1
  50. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  51. package/dist/services/actionflow/components/send_message.js +8 -3
  52. package/dist/services/actionflow/components/send_message.js.map +1 -1
  53. package/dist/services/actionflow/context_preflight.js +1 -1
  54. package/dist/services/actionflow/context_preflight.js.map +1 -1
  55. package/dist/services/actionflow/formula_service.d.ts +1 -0
  56. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  57. package/dist/services/actionflow/formula_service.js +107 -31
  58. package/dist/services/actionflow/formula_service.js.map +1 -1
  59. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  60. package/dist/services/actionflow/preflight_service.js +4 -1
  61. package/dist/services/actionflow/preflight_service.js.map +1 -1
  62. package/dist/services/form-layout-describe.d.ts.map +1 -1
  63. package/dist/services/form-layout-describe.js +3 -2
  64. package/dist/services/form-layout-describe.js.map +1 -1
  65. package/dist/services/form-layout-document.d.ts.map +1 -1
  66. package/dist/services/form-layout-document.js +2 -1
  67. package/dist/services/form-layout-document.js.map +1 -1
  68. package/dist/services/matrix-maintainer.d.ts +27 -0
  69. package/dist/services/matrix-maintainer.d.ts.map +1 -0
  70. package/dist/services/matrix-maintainer.js +142 -0
  71. package/dist/services/matrix-maintainer.js.map +1 -0
  72. package/dist/services/report/drill.d.ts +74 -0
  73. package/dist/services/report/drill.d.ts.map +1 -0
  74. package/dist/services/report/drill.js +259 -0
  75. package/dist/services/report/drill.js.map +1 -0
  76. package/dist/services/role-function-permission.d.ts +12 -0
  77. package/dist/services/role-function-permission.d.ts.map +1 -0
  78. package/dist/services/role-function-permission.js +46 -0
  79. package/dist/services/role-function-permission.js.map +1 -0
  80. package/dist/services/special-layout.d.ts +113 -0
  81. package/dist/services/special-layout.d.ts.map +1 -0
  82. package/dist/services/special-layout.js +178 -0
  83. package/dist/services/special-layout.js.map +1 -0
  84. package/dist/services/workflow-base-settings.d.ts +1 -10
  85. package/dist/services/workflow-base-settings.d.ts.map +1 -1
  86. package/dist/services/workflow-field-permission-route.d.ts +15 -41
  87. package/dist/services/workflow-field-permission-route.d.ts.map +1 -1
  88. package/dist/services/workflow-field-permission-route.js +23 -8
  89. package/dist/services/workflow-field-permission-route.js.map +1 -1
  90. package/dist/services/workflow-layout-components.d.ts +52 -0
  91. package/dist/services/workflow-layout-components.d.ts.map +1 -0
  92. package/dist/services/workflow-layout-components.js +66 -0
  93. package/dist/services/workflow-layout-components.js.map +1 -0
  94. package/dist/services/workflow-layout-draft.d.ts +49 -0
  95. package/dist/services/workflow-layout-draft.d.ts.map +1 -0
  96. package/dist/services/workflow-layout-draft.js +98 -0
  97. package/dist/services/workflow-layout-draft.js.map +1 -0
  98. package/dist/services/workflow-node-batch-spec.d.ts +122 -0
  99. package/dist/services/workflow-node-batch-spec.d.ts.map +1 -0
  100. package/dist/services/workflow-node-batch-spec.js +496 -0
  101. package/dist/services/workflow-node-batch-spec.js.map +1 -0
  102. package/dist/services/workflow-node-batch.d.ts +73 -0
  103. package/dist/services/workflow-node-batch.d.ts.map +1 -0
  104. package/dist/services/workflow-node-batch.js +328 -0
  105. package/dist/services/workflow-node-batch.js.map +1 -0
  106. package/dist/services/workflow-node-opinion-description.d.ts +12 -0
  107. package/dist/services/workflow-node-opinion-description.d.ts.map +1 -0
  108. package/dist/services/workflow-node-opinion-description.js +52 -0
  109. package/dist/services/workflow-node-opinion-description.js.map +1 -0
  110. package/dist/services/workflow-node-opinion-layout.d.ts +22 -0
  111. package/dist/services/workflow-node-opinion-layout.d.ts.map +1 -0
  112. package/dist/services/workflow-node-opinion-layout.js +113 -0
  113. package/dist/services/workflow-node-opinion-layout.js.map +1 -0
  114. package/dist/services/workflow-node-opinion-range.d.ts +21 -0
  115. package/dist/services/workflow-node-opinion-range.d.ts.map +1 -0
  116. package/dist/services/workflow-node-opinion-range.js +74 -0
  117. package/dist/services/workflow-node-opinion-range.js.map +1 -0
  118. package/dist/services/workflow-node-opinion.d.ts +43 -0
  119. package/dist/services/workflow-node-opinion.d.ts.map +1 -0
  120. package/dist/services/workflow-node-opinion.js +198 -0
  121. package/dist/services/workflow-node-opinion.js.map +1 -0
  122. package/dist/services/workflow-opinion-settings.d.ts +14 -0
  123. package/dist/services/workflow-opinion-settings.d.ts.map +1 -1
  124. package/dist/services/workflow-opinion-settings.js +18 -2
  125. package/dist/services/workflow-opinion-settings.js.map +1 -1
  126. package/package.json +1 -1
  127. package/skill-docs/SKILL.md +164 -162
  128. package/skill-docs/_catalog.md +3 -2
  129. package/skill-docs/actionflows/references/components/message/SendMessage.md +32 -30
  130. package/skill-docs/references/common/guide-plan-template.md +4 -1
  131. package/skill-docs/references/common/map.md +28 -4
  132. package/skill-docs/references/common/ref-cli-commands.md +14 -4
  133. package/skill-docs/references/form/guide-browser-definition.md +2 -219
  134. package/skill-docs/references/form/guide-browser-scope.md +285 -0
  135. package/skill-docs/references/form/guide-create-form.md +1 -1
  136. package/skill-docs/references/hrm/guide-matrix.md +276 -245
  137. package/skill-docs/references/hrm/guide-role.md +77 -0
  138. package/skill-docs/references/report/drilldown-report-guide.md +17 -1
  139. package/skill-docs/references/report/event-hreflink-guide.md +2 -0
  140. package/skill-docs/references/report/query-condition-api-guide.md +29 -0
  141. package/skill-docs/references/workflow/guide-layout-components.md +26 -0
  142. package/skill-docs/references/workflow/guide-node-opinion.md +58 -0
  143. package/skill-docs/references/workflow/guide-workflow.md +43 -0
  144. package/skill-docs/references/form/guide-ebuilder-scope.md +0 -82
@@ -0,0 +1,259 @@
1
+ /**
2
+ * 报表跳报表(钻取)传参体检。
3
+ *
4
+ * ## 平台规则(2026-11-03 实测)
5
+ *
6
+ * 来源报表的单元格链接把参数拼在地址上:
7
+ *
8
+ * /sp/edc/report/view/<目标报表>?searchfield002=13261367755986572676
9
+ *
10
+ * 目标报表**不会**按参数名自动过滤。要接住这个参数,目标报表的查询条件必须
11
+ * 把参数名写进「自定义默认值」:
12
+ *
13
+ * defaultValueType : "custom"
14
+ * defaultValue : ["{searchfield002}",""] ← 存花括号
15
+ * type2DefaultValue: 同上
16
+ *
17
+ * 设计器「默认值」框里显示为 `(searchfield002)`(圆括号只是 UI 渲染)。
18
+ * 运行时平台按请求里的同名字段替换:
19
+ * - 带 `searchfield002=xxx` → `handleDefaultValue` = `["xxx",""]`;
20
+ * - 不带 → 占位清空成 `["",""]`,直接打开报表不过滤。
21
+ *
22
+ * 若条件保持「常规 / 空」,URL 参数会被静默忽略:页面能打开、不报错、数据一条不少。
23
+ * 这就是这里要体检的东西。
24
+ *
25
+ * 参数名就是 `{…}` 里的名字,**不是**由条件标识推出来的;两者通常同名,
26
+ * 但链接的 key 必须与目标条件默认值里的占位一致。
27
+ */
28
+ import { fieldStyle } from './safe-save.js';
29
+ import { fetchQueryItems } from './query.js';
30
+ import { getReportDevInfo } from './reports.js';
31
+ /** 报表预览地址;兼容 `/sp/edc/report/view/<id>` 与带 appId 的 `/sp/edc/report/view/<appId>/<id>`。 */
32
+ const REPORT_VIEW_RE = /\/sp(?:\/|a\/)edc\/report\/view\/([^?#]*)/i;
33
+ /** 链接上由平台自己消费、不属于查询条件的参数。 */
34
+ export const DRILL_NOISE_KEYS = new Set([
35
+ 'sheetindex',
36
+ 'sheetname',
37
+ 'appid',
38
+ 'from',
39
+ 'gettabsbyquery',
40
+ 'getsheetsbyquery',
41
+ 'hidetop',
42
+ 'jumplinkparamkey',
43
+ 'logflag',
44
+ 'snapshotid',
45
+ 'dataid',
46
+ 'token',
47
+ 'pagenum',
48
+ 'pagefilter',
49
+ ]);
50
+ /** 解码一次,失败就保留原文(链接里常有 `%` 不是合法转义)。 */
51
+ function decode(v) {
52
+ try {
53
+ return decodeURIComponent(v.replace(/\+/g, ' '));
54
+ }
55
+ catch {
56
+ return v;
57
+ }
58
+ }
59
+ /** 解析查询串;空值也算参数(`?searchfield001=` 表示显式传空)。 */
60
+ export function parseDrillParams(search) {
61
+ const qs = String(search || '').replace(/^\?/, '');
62
+ if (!qs)
63
+ return [];
64
+ return qs
65
+ .split('&')
66
+ .filter(Boolean)
67
+ .map((pair) => {
68
+ const i = pair.indexOf('=');
69
+ const key = decode(i < 0 ? pair : pair.slice(0, i));
70
+ const value = i < 0 ? '' : decode(pair.slice(i + 1));
71
+ return { key, value };
72
+ })
73
+ .filter((p) => p.key && !DRILL_NOISE_KEYS.has(p.key.toLowerCase()));
74
+ }
75
+ /**
76
+ * 从单元格链接里取出目标报表与查询参数。
77
+ * 非报表预览地址(外链、台账、卡片、JS)返回 null,不参与体检。
78
+ */
79
+ export function parseDrillHref(href) {
80
+ const s = String(href || '').trim();
81
+ if (!s || /^javascript:/i.test(s))
82
+ return null;
83
+ const noHash = s.split('#')[0];
84
+ const q = noHash.indexOf('?');
85
+ const path = q < 0 ? noHash : noHash.slice(0, q);
86
+ const search = q < 0 ? '' : noHash.slice(q);
87
+ const m = path.match(REPORT_VIEW_RE);
88
+ if (!m)
89
+ return null;
90
+ const segs = m[1].split('/').filter(Boolean);
91
+ const targetId = segs[segs.length - 1] || '';
92
+ if (!targetId)
93
+ return null;
94
+ return { targetId, params: parseDrillParams(search) };
95
+ }
96
+ /** 字段上直接挂的链接键,或 `style.cellType` 里挂的那一份。 */
97
+ function hrefsOf(f) {
98
+ const out = [];
99
+ const style = fieldStyle(f);
100
+ let ct = style.cellType ?? {};
101
+ if (typeof ct === 'string') {
102
+ try {
103
+ ct = JSON.parse(ct);
104
+ }
105
+ catch {
106
+ ct = {};
107
+ }
108
+ }
109
+ for (const key of ['pcHreflink', 'h5Hreflink']) {
110
+ const v = String(f[key] ?? ct?.[key] ?? '').trim();
111
+ if (v)
112
+ out.push({ key, href: v });
113
+ }
114
+ return out;
115
+ }
116
+ /** 扫出报表里所有指向另一张报表的链接。同一格 PC/H5 都有时各算一条。 */
117
+ export function collectDrillLinks(fields) {
118
+ const out = [];
119
+ for (const f of fields) {
120
+ for (const { key, href } of hrefsOf(f)) {
121
+ const parsed = parseDrillHref(href);
122
+ if (!parsed)
123
+ continue;
124
+ out.push({
125
+ cell: `${Number(f.x)},${Number(f.y)}`,
126
+ text: String(f.text ?? ''),
127
+ source: key,
128
+ href,
129
+ targetId: parsed.targetId,
130
+ params: parsed.params,
131
+ });
132
+ }
133
+ }
134
+ return out;
135
+ }
136
+ /** `searchfield002` → 2;其它自定义参数名返回 null。 */
137
+ export function asNameIndexOf(key) {
138
+ const m = String(key || '').match(/^searchfield0*(\d+)(?:_start|_end)?$/i);
139
+ return m ? Number(m[1]) : null;
140
+ }
141
+ /** 条件当前生效的「自定义默认值」原文。 */
142
+ function customDefaultOf(item) {
143
+ if (String(item.defaultValueType ?? '') !== 'custom')
144
+ return '';
145
+ return String(item.type2DefaultValue ?? '') || String(item.defaultValue ?? '');
146
+ }
147
+ /** 目标条件里是否已经声明 `{key}` 这个占位。 */
148
+ export function findBinding(key, items) {
149
+ const token = `{${key}}`;
150
+ return (items.find((it) => customDefaultOf(it).includes(token)) || null);
151
+ }
152
+ /** 参数缺失时,优先按 asNameIndex 挑出最该改的条件。 */
153
+ export function suggestCondition(key, items) {
154
+ const idx = asNameIndexOf(key);
155
+ if (idx != null) {
156
+ const hit = items.find((it) => Number(it.asNameIndex) === idx);
157
+ if (hit)
158
+ return hit;
159
+ }
160
+ const text = String(key).replace(/^searchfield0*/i, '').replace(/_(start|end)$/i, '');
161
+ const byText = items.find((it) => String(it.text ?? '').includes(text));
162
+ if (byText)
163
+ return byText;
164
+ return items.length === 1 ? items[0] : null;
165
+ }
166
+ function missingHint(targetId, key, items) {
167
+ if (!items.length) {
168
+ return `目标报表 ${targetId} 没有查询条件,URL 参数「${key}」不会被消费;先建对应条件并配置自定义默认值。`;
169
+ }
170
+ const cand = suggestCondition(key, items);
171
+ const who = cand
172
+ ? `条件「${cand.text || cand.id}」${cand.id ? `(id ${cand.id})` : ''}`
173
+ : '对应条件';
174
+ return `目标报表 ${targetId} 没有条件用自定义默认值声明 {${key}}。`
175
+ + `把${who}改成:默认值类型=自定义,默认值 ["{${key}}",""](自定义那份同步);`
176
+ + '若链接参数名与目标占位不一致,两边改成同一个名字。';
177
+ }
178
+ /**
179
+ * 纯检查:链接参数 → 目标报表查询条件默认值。
180
+ * `conditionsByReport` 缺目标报表(读失败)时计入 problems,不假装通过。
181
+ */
182
+ export function checkDrillLinks(reportId, links, conditionsByReport) {
183
+ const problems = [];
184
+ const checked = [];
185
+ let total = 0;
186
+ let missing = 0;
187
+ for (const link of links) {
188
+ const items = conditionsByReport.get(link.targetId);
189
+ if (items === undefined || items === null) {
190
+ const why = '读取目标报表查询条件失败';
191
+ problems.push(`${link.cell} ${link.text}:目标报表 ${link.targetId} ${why},无法确认参数是否生效`);
192
+ continue;
193
+ }
194
+ const params = link.params.map((p) => {
195
+ total += 1;
196
+ const hit = findBinding(p.key, items);
197
+ if (hit) {
198
+ return {
199
+ key: p.key,
200
+ value: p.value,
201
+ status: 'bound',
202
+ conditionId: String(hit.id ?? ''),
203
+ conditionText: String(hit.text ?? ''),
204
+ };
205
+ }
206
+ missing += 1;
207
+ return {
208
+ key: p.key,
209
+ value: p.value,
210
+ status: 'missing',
211
+ hint: missingHint(link.targetId, p.key, items),
212
+ };
213
+ });
214
+ for (const p of params) {
215
+ if (p.status === 'missing') {
216
+ problems.push(`${link.cell} ${link.text}:参数「${p.key}」在目标报表 ${link.targetId} 没有生效条件`);
217
+ }
218
+ }
219
+ checked.push({
220
+ cell: link.cell,
221
+ text: link.text,
222
+ source: link.source,
223
+ targetId: link.targetId,
224
+ href: link.href,
225
+ params,
226
+ });
227
+ }
228
+ const summary = total === 0
229
+ ? (links.length ? '钻取链接没有可体检的查询参数。' : '没有指向其他报表的链接。')
230
+ : `汇总:${links.length} 个钻取链接,${total} 个参数,${total - missing} 个已绑定,${missing} 个未生效。`;
231
+ return {
232
+ reportId,
233
+ links: checked,
234
+ problems,
235
+ summary,
236
+ exitCode: problems.length ? 1 : 0,
237
+ };
238
+ }
239
+ /**
240
+ * 联网体检:读设计数据 → 扫链接 → 逐张目标报表读查询条件。
241
+ *
242
+ * 目标报表按当前应用(`ReportHttp` 的 ebbusinessid)读取;跨应用目标会读失败,
243
+ * 这时给出「无法确认」而不是误导性的通过。
244
+ */
245
+ export async function verifyDrill(http, reportId) {
246
+ const dev = await getReportDevInfo(http, reportId);
247
+ const links = collectDrillLinks((dev.fields || []));
248
+ const conditions = new Map();
249
+ for (const targetId of new Set(links.map((l) => l.targetId))) {
250
+ try {
251
+ conditions.set(targetId, await fetchQueryItems(http, targetId));
252
+ }
253
+ catch {
254
+ conditions.set(targetId, null);
255
+ }
256
+ }
257
+ return checkDrillLinks(reportId, links, conditions);
258
+ }
259
+ //# sourceMappingURL=drill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drill.js","sourceRoot":"","sources":["../../../src/services/report/drill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ export interface RoleFunctionPermission {
3
+ menuCode: string;
4
+ permissionSetCode: string;
5
+ permissionName: string;
6
+ checked: boolean;
7
+ disabled: boolean;
8
+ }
9
+ export declare function flattenRolePermissions(nodes: any[]): RoleFunctionPermission[];
10
+ export declare function readRolePermissions(client: ApiClient, base: string, roleId: string): Promise<RoleFunctionPermission[]>;
11
+ export declare function setRolePermission(client: ApiClient, base: string, roleId: string, code: string, enabled: boolean): Promise<RoleFunctionPermission>;
12
+ //# sourceMappingURL=role-function-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-function-permission.d.ts","sourceRoot":"","sources":["../../src/services/role-function-permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,sBAAsB,EAAE,CAY7E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAM5H;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACrF,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgBjE"}
@@ -0,0 +1,46 @@
1
+ export function flattenRolePermissions(nodes) {
2
+ const out = [];
3
+ const visit = (node) => {
4
+ if (node?.permissionSetCode)
5
+ out.push({
6
+ menuCode: String(node.menuCode || ''), permissionSetCode: String(node.permissionSetCode),
7
+ permissionName: String(node.permissionName || ''), checked: Number(node.checked) === 1,
8
+ disabled: Boolean(node.disabled),
9
+ });
10
+ for (const child of node?.children || [])
11
+ visit(child);
12
+ };
13
+ for (const node of nodes)
14
+ visit(node);
15
+ return out;
16
+ }
17
+ export async function readRolePermissions(client, base, roleId) {
18
+ const res = await client.get(`${base}/api/bs/auth/role/${roleId}/functionPermissionTree2?menuCode=roleSettings`);
19
+ if (res?.code !== 200 || !res?.status || !Array.isArray(res?.data?.data)) {
20
+ throw new Error(`读取角色功能权限失败:${res?.msg || '响应缺少权限树'}`);
21
+ }
22
+ return flattenRolePermissions(res.data.data);
23
+ }
24
+ export async function setRolePermission(client, base, roleId, code, enabled) {
25
+ const before = await readRolePermissions(client, base, roleId);
26
+ const matches = before.filter(row => row.permissionSetCode === code);
27
+ if (matches.length !== 1)
28
+ throw new Error(`权限集 ${code} 在当前角色权限树中未唯一匹配`);
29
+ const target = matches[0];
30
+ if (target.disabled)
31
+ throw new Error(`权限集 ${code} 在当前角色权限树中被禁用`);
32
+ if (target.checked === enabled)
33
+ return target;
34
+ const item = { menuCode: target.menuCode, permissionSetCode: target.permissionSetCode, permissionName: target.permissionName };
35
+ const res = await client.post(`${base}/api/bs/auth/role/${roleId}/savePermissionSet`, {
36
+ addList: enabled ? [item] : [], removeList: enabled ? [] : [item],
37
+ });
38
+ if (res?.code !== 200 || !res?.status || res?.fail)
39
+ throw new Error(`保存角色功能权限失败:${res?.msg || '未知错误'}`);
40
+ const after = await readRolePermissions(client, base, roleId);
41
+ const saved = after.find(row => row.permissionSetCode === code);
42
+ if (!saved || saved.checked !== enabled)
43
+ throw new Error(`平台返回成功,但权限集 ${code} 回读不一致`);
44
+ return saved;
45
+ }
46
+ //# sourceMappingURL=role-function-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-function-permission.js","sourceRoot":"","sources":["../../src/services/role-function-permission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 专项应用交付 —— 表单布局(前台接口族)。
3
+ *
4
+ * ## 为什么不是 `flow/form/layout/save`
5
+ *
6
+ * 平台上有三套布局路由:
7
+ *
8
+ * | 用途 | 前缀 |
9
+ * |---|---|
10
+ * | 设计器 / 流程节点 | `/api/ebuilder/flow/form/layout/*` |
11
+ * | 标准前端 | `/api/bs/ebuilder/form/layout/*` |
12
+ * | **应用前台(表单设置)** | `/api/ebuilder/form/form/layout/*` |
13
+ *
14
+ * 专项应用要在「不开后台编辑权限」的前提下复制/新建布局,必须走最后一套,并且
15
+ * 在 `customParam` 里带 `terminal`:
16
+ *
17
+ * EbFormAuthenticationServiceImpl#getPermission:
18
+ * customParam.terminal 非空 + appType==2
19
+ * → 走第三方应用菜单权限(MenuType.form),
20
+ * 而不是后台应用编辑权限。
21
+ *
22
+ * 只换路由不带 `terminal` 仍然落在后台权限分支,只读应用照样
23
+ * `500 没有相关权限`(平台自己的表单设置页就是这样)。
24
+ *
25
+ * ## 两个前提,满足其一即可
26
+ *
27
+ * 1. 应用可编辑(`app/readOnly=false`);
28
+ * 2. 账号拥有该应用的「表单菜单」权限
29
+ * (`GET /api/cusapp/app/checkAppPermit?appId=` 返回 `menuSetPermission=true`)。
30
+ *
31
+ * 两者都不满足时,平台前后台都写不进布局;页面另存/映射不受此限制。
32
+ */
33
+ import type { ApiClient } from '../core/client.js';
34
+ export type SpecialTerminal = 'PC' | 'MOBILE';
35
+ export declare const SPECIAL_LAYOUT_LIST_PATH = "/api/ebuilder/form/form/layout/list";
36
+ export declare const SPECIAL_LAYOUT_SAVE_PATH = "/api/ebuilder/form/form/layout/save";
37
+ export declare const SPECIAL_LAYOUT_DEFAULT_PATH = "/api/ebuilder/form/form/layout/getDefault";
38
+ export declare const APP_CHECK_PERMIT_PATH = "/api/cusapp/app/checkAppPermit";
39
+ export declare const APP_INFO_PATH = "/api/bs/ebuilder/app/info";
40
+ /**
41
+ * 请求来源。后端只判断 `customParam.terminal` 是否非空,取值不参与比较;
42
+ * 这里按平台前台的口径写 `front`,与后台请求区分开。
43
+ */
44
+ export declare const SPECIAL_FRONT_TERMINAL = "front";
45
+ /** `obj/getInfo` 里定位一次,布局三个接口共用。 */
46
+ export interface SpecialFormMeta {
47
+ objId: string;
48
+ formId: string;
49
+ appId: string;
50
+ thirdPartyFlag: number;
51
+ }
52
+ /** `form/layout/list` 一行。 */
53
+ export interface SpecialLayoutRow {
54
+ id: string;
55
+ name: string;
56
+ terminalType: string;
57
+ layoutType: string;
58
+ isDefault: boolean;
59
+ isSys: boolean;
60
+ readOnly: boolean;
61
+ describe?: string;
62
+ [k: string]: unknown;
63
+ }
64
+ export interface ListSpecialLayoutsInput {
65
+ appId: string;
66
+ objId: string;
67
+ formId: string;
68
+ terminal: SpecialTerminal;
69
+ }
70
+ export interface CreateSpecialLayoutInput extends ListSpecialLayoutsInput {
71
+ name: string;
72
+ /** 复制来源;不传 = 建空布局。 */
73
+ from?: string;
74
+ layoutType: 'FLOW' | 'EXCEL';
75
+ describe?: string;
76
+ }
77
+ /**
78
+ * `objId → formId/appId`。
79
+ *
80
+ * ⚠ 不能走 `obj/getInfo`:fs 建出来的三方表单只回 `formId`/`isPhysical`,没有 appId。
81
+ * `obj/getInfoById/<objId>` 回完整记录(含 `appId`、`formId`、`thirdPartyFlag`),
82
+ * 对系统表单和三方表单都有效。
83
+ */
84
+ export declare function formMetaOf(client: Pick<ApiClient, 'get'>, baseUrl: string, objId: string): Promise<SpecialFormMeta>;
85
+ /** 列布局。走应用前台接口族,读口在只读应用下也可用。 */
86
+ export declare function listSpecialLayouts(client: Pick<ApiClient, 'post'>, baseUrl: string, input: ListSpecialLayoutsInput): Promise<SpecialLayoutRow[]>;
87
+ /** 默认布局。 */
88
+ export declare function getDefaultSpecialLayout(client: Pick<ApiClient, 'post'>, baseUrl: string, input: ListSpecialLayoutsInput): Promise<SpecialLayoutRow | null>;
89
+ /**
90
+ * 新建 / 复制布局。
91
+ *
92
+ * `sourceId` 决定复制模式;不带就是空布局。新布局的类型由调用方给出:
93
+ * 复制时跟来源,空布局默认 FLOW(与平台前台「新建布局」弹窗一致)。
94
+ */
95
+ export declare function createSpecialLayout(client: Pick<ApiClient, 'post'>, baseUrl: string, input: CreateSpecialLayoutInput): Promise<SpecialLayoutRow>;
96
+ /**
97
+ * 应用的「表单菜单」权限。`undefined` = 探测失败,不据此阻断。
98
+ *
99
+ * 这是第三方应用分支(带 terminal)实际使用的 `MenuType.form` 权限的
100
+ * 可观测口径;它与 `permitCheckByFixedMenuType` 的结果在本轮实测中一致。
101
+ */
102
+ export declare function checkAppMenuSetPermission(client: Pick<ApiClient, 'get'>, baseUrl: string, appId: string): Promise<boolean | undefined>;
103
+ /** 应用是否只读。`undefined` = 探测失败。 */
104
+ export declare function getAppReadOnly(client: Pick<ApiClient, 'get'>, baseUrl: string, appId: string): Promise<boolean | undefined>;
105
+ /** 平台拒绝布局写入时的固定话术。 */
106
+ export declare function isLayoutPermissionError(message: string): boolean;
107
+ /**
108
+ * 把“没有相关权限”翻译成可执行的结论。
109
+ *
110
+ * 两个前提满足其一即可:应用可编辑,或账号有表单菜单权限。
111
+ */
112
+ export declare function buildLayoutPermissionHint(menuSetPermission: boolean | undefined, readOnly: boolean | undefined): string;
113
+ //# sourceMappingURL=special-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"special-layout.d.ts","sourceRoot":"","sources":["../../src/services/special-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE9C,eAAO,MAAM,wBAAwB,wCAAwC,CAAC;AAC9E,eAAO,MAAM,wBAAwB,wCAAwC,CAAC;AAC9E,eAAO,MAAM,2BAA2B,8CAA8C,CAAC;AACvF,eAAO,MAAM,qBAAqB,mCAAmC,CAAC;AACtE,eAAO,MAAM,aAAa,8BAA8B,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuBD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAc1B;AAED,gCAAgC;AAChC,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuB7B;AAED,YAAY;AACZ,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAgBlC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAyC3B;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAW9B;AAED,iCAAiC;AACjC,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAa9B;AAED,sBAAsB;AACtB,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,iBAAiB,EAAE,OAAO,GAAG,SAAS,EACtC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAC5B,MAAM,CASR"}
@@ -0,0 +1,178 @@
1
+ export const SPECIAL_LAYOUT_LIST_PATH = '/api/ebuilder/form/form/layout/list';
2
+ export const SPECIAL_LAYOUT_SAVE_PATH = '/api/ebuilder/form/form/layout/save';
3
+ export const SPECIAL_LAYOUT_DEFAULT_PATH = '/api/ebuilder/form/form/layout/getDefault';
4
+ export const APP_CHECK_PERMIT_PATH = '/api/cusapp/app/checkAppPermit';
5
+ export const APP_INFO_PATH = '/api/bs/ebuilder/app/info';
6
+ /**
7
+ * 请求来源。后端只判断 `customParam.terminal` 是否非空,取值不参与比较;
8
+ * 这里按平台前台的口径写 `front`,与后台请求区分开。
9
+ */
10
+ export const SPECIAL_FRONT_TERMINAL = 'front';
11
+ function ok(res, op) {
12
+ if (!res || res.code !== 200 || res.status === false) {
13
+ throw new Error(`${op}失败:${res?.msg || '无响应'}`);
14
+ }
15
+ return res.data;
16
+ }
17
+ function normalizeRow(r) {
18
+ return {
19
+ ...r,
20
+ id: String(r?.id ?? ''),
21
+ name: String(r?.name ?? ''),
22
+ terminalType: String(r?.terminalType ?? ''),
23
+ layoutType: String(r?.layoutType ?? ''),
24
+ isDefault: !!r?.isDefault,
25
+ isSys: !!r?.isSys,
26
+ readOnly: !!r?.readOnly,
27
+ ...(r?.describe !== undefined ? { describe: String(r.describe) } : {}),
28
+ };
29
+ }
30
+ /**
31
+ * `objId → formId/appId`。
32
+ *
33
+ * ⚠ 不能走 `obj/getInfo`:fs 建出来的三方表单只回 `formId`/`isPhysical`,没有 appId。
34
+ * `obj/getInfoById/<objId>` 回完整记录(含 `appId`、`formId`、`thirdPartyFlag`),
35
+ * 对系统表单和三方表单都有效。
36
+ */
37
+ export async function formMetaOf(client, baseUrl, objId) {
38
+ const res = await client.get(`${baseUrl}/api/ebuilder/form/obj/getInfoById/${encodeURIComponent(objId)}`);
39
+ const d = res?.data;
40
+ if (res?.code !== 200 || !d?.formId) {
41
+ throw new Error(`无法获取 formId(objId=${objId}):${res?.msg || '接口未返回 formId'}`);
42
+ }
43
+ return {
44
+ objId: String(d.id ?? objId),
45
+ formId: String(d.formId),
46
+ appId: String(d.appId ?? ''),
47
+ thirdPartyFlag: Number(d.thirdPartyFlag ?? 0),
48
+ };
49
+ }
50
+ /** 列布局。走应用前台接口族,读口在只读应用下也可用。 */
51
+ export async function listSpecialLayouts(client, baseUrl, input) {
52
+ const appId = encodeURIComponent(input.appId);
53
+ const d = ok(await client.post(`${baseUrl}${SPECIAL_LAYOUT_LIST_PATH}?apid=${appId}`, {
54
+ formId: input.formId,
55
+ module: 'ebuilderform',
56
+ pageNo: 1,
57
+ pageSize: 200,
58
+ // ⚠ 读口**不能带 terminal**:实测带 `customParam.terminal` 会 500 Server Error,
59
+ // 不带则正常返回。terminal 只在 save 上用于切换鉴权分支。
60
+ customParam: { appId: input.appId, objId: input.objId },
61
+ layoutMultipleParam: { terminalType: input.terminal },
62
+ local: true,
63
+ }, { ebbusinessid: input.appId }), '读取布局列表');
64
+ const page = d?.formLayoutMultiplePage || {};
65
+ const rows = page.result || page.records || page.list || [];
66
+ return rows.map(normalizeRow);
67
+ }
68
+ /** 默认布局。 */
69
+ export async function getDefaultSpecialLayout(client, baseUrl, input) {
70
+ const appId = encodeURIComponent(input.appId);
71
+ const d = ok(await client.post(`${baseUrl}${SPECIAL_LAYOUT_DEFAULT_PATH}?apid=${appId}`, {
72
+ module: 'ebuilderform',
73
+ customParam: { appId: input.appId, objId: input.objId },
74
+ terminalType: input.terminal,
75
+ formId: input.formId,
76
+ }, { ebbusinessid: input.appId }), '读取默认布局');
77
+ return d?.formLayoutMultiple ? normalizeRow(d.formLayoutMultiple) : null;
78
+ }
79
+ /**
80
+ * 新建 / 复制布局。
81
+ *
82
+ * `sourceId` 决定复制模式;不带就是空布局。新布局的类型由调用方给出:
83
+ * 复制时跟来源,空布局默认 FLOW(与平台前台「新建布局」弹窗一致)。
84
+ */
85
+ export async function createSpecialLayout(client, baseUrl, input) {
86
+ const appId = encodeURIComponent(input.appId);
87
+ const formLayoutMultiple = {
88
+ terminalType: input.terminal,
89
+ name: input.name,
90
+ labelObj: '{}',
91
+ layoutType: input.layoutType,
92
+ };
93
+ if (input.describe)
94
+ formLayoutMultiple.describe = input.describe;
95
+ const d = ok(await client.post(`${baseUrl}${SPECIAL_LAYOUT_SAVE_PATH}?apid=${appId}`, {
96
+ module: 'ebuilderform',
97
+ customParam: {
98
+ appId: input.appId,
99
+ objId: input.objId,
100
+ terminal: SPECIAL_FRONT_TERMINAL,
101
+ },
102
+ formLayoutMultiple,
103
+ local: true,
104
+ copyConfig: { formDataLinkage: true, excelLinkage: true },
105
+ ...(input.from ? { sourceId: String(input.from) } : {}),
106
+ formId: input.formId,
107
+ }, { ebbusinessid: input.appId }), '新建布局');
108
+ const flm = d?.formLayoutMultiple || {};
109
+ return {
110
+ ...flm,
111
+ id: String(flm.id || ''),
112
+ name: String(flm.name || input.name),
113
+ terminalType: String(flm.terminalType || input.terminal),
114
+ layoutType: String(flm.layoutType || input.layoutType),
115
+ isDefault: !!flm.isDefault,
116
+ isSys: !!flm.isSys,
117
+ readOnly: !!flm.readOnly,
118
+ };
119
+ }
120
+ /**
121
+ * 应用的「表单菜单」权限。`undefined` = 探测失败,不据此阻断。
122
+ *
123
+ * 这是第三方应用分支(带 terminal)实际使用的 `MenuType.form` 权限的
124
+ * 可观测口径;它与 `permitCheckByFixedMenuType` 的结果在本轮实测中一致。
125
+ */
126
+ export async function checkAppMenuSetPermission(client, baseUrl, appId) {
127
+ try {
128
+ const res = await client.get(`${baseUrl}${APP_CHECK_PERMIT_PATH}?appId=${encodeURIComponent(appId)}`);
129
+ if (res?.code !== 200)
130
+ return undefined;
131
+ const v = res?.data?.menuSetPermission;
132
+ return typeof v === 'boolean' ? v : undefined;
133
+ }
134
+ catch {
135
+ return undefined;
136
+ }
137
+ }
138
+ /** 应用是否只读。`undefined` = 探测失败。 */
139
+ export async function getAppReadOnly(client, baseUrl, appId) {
140
+ try {
141
+ const res = await client.get(`${baseUrl}${APP_INFO_PATH}?id=${encodeURIComponent(appId)}`);
142
+ if (res?.code !== 200 || !res?.data)
143
+ return undefined;
144
+ const v = res.data.readOnly;
145
+ if (v === true || v === 'true')
146
+ return true;
147
+ if (v === false || v === 'false')
148
+ return false;
149
+ return undefined;
150
+ }
151
+ catch {
152
+ return undefined;
153
+ }
154
+ }
155
+ /** 平台拒绝布局写入时的固定话术。 */
156
+ export function isLayoutPermissionError(message) {
157
+ return /没有相关权限|没有权限|no right/i.test(String(message ?? ''));
158
+ }
159
+ /**
160
+ * 把“没有相关权限”翻译成可执行的结论。
161
+ *
162
+ * 两个前提满足其一即可:应用可编辑,或账号有表单菜单权限。
163
+ */
164
+ export function buildLayoutPermissionHint(menuSetPermission, readOnly) {
165
+ const facts = [];
166
+ if (readOnly === true)
167
+ facts.push('应用当前为只读');
168
+ else if (readOnly === false)
169
+ facts.push('应用当前可编辑');
170
+ if (menuSetPermission === true)
171
+ facts.push('账号已具备表单菜单权限');
172
+ else if (menuSetPermission === false)
173
+ facts.push('账号未授予表单菜单权限');
174
+ const head = facts.length ? `(${facts.join(',')})` : '';
175
+ return `布局 copy/create 需要满足其一:应用可编辑,或账号拥有该应用的「表单菜单」权限${head}。`
176
+ + '页面另存与映射不受此限制;两者都没有时,平台前后台都写不进布局。';
177
+ }
178
+ //# sourceMappingURL=special-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"special-layout.js","sourceRoot":"","sources":["../../src/services/special-layout.ts"],"names":[],"mappings":"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"}