weaver-e10-builder 1.5.11 → 1.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -189
- package/assets/image-style-observation.schema.json +1355 -0
- package/assets/layout-spec.schema.json +52 -0
- package/dist/commands/designer-common.d.ts.map +1 -1
- package/dist/commands/designer-common.js +91 -0
- package/dist/commands/designer-common.js.map +1 -1
- package/dist/commands/form-add-detail-table.d.ts.map +1 -1
- package/dist/commands/form-add-detail-table.js +97 -1
- package/dist/commands/form-add-detail-table.js.map +1 -1
- package/dist/commands/form-field-linkage.d.ts +55 -0
- package/dist/commands/form-field-linkage.d.ts.map +1 -1
- package/dist/commands/form-field-linkage.js +1026 -12
- package/dist/commands/form-field-linkage.js.map +1 -1
- package/dist/commands/form-formula-linkage.d.ts +36 -0
- package/dist/commands/form-formula-linkage.d.ts.map +1 -1
- package/dist/commands/form-formula-linkage.js +107 -7
- package/dist/commands/form-formula-linkage.js.map +1 -1
- package/dist/commands/form-formula.d.ts.map +1 -1
- package/dist/commands/form-formula.js +21 -4
- package/dist/commands/form-formula.js.map +1 -1
- package/dist/commands/form-layout-restore.d.ts +3 -0
- package/dist/commands/form-layout-restore.d.ts.map +1 -0
- package/dist/commands/form-layout-restore.js +217 -0
- package/dist/commands/form-layout-restore.js.map +1 -0
- package/dist/commands/form-layout.d.ts.map +1 -1
- package/dist/commands/form-layout.js +11 -1
- package/dist/commands/form-layout.js.map +1 -1
- package/dist/commands/form-obj-meta.d.ts +12 -0
- package/dist/commands/form-obj-meta.d.ts.map +1 -0
- package/dist/commands/form-obj-meta.js +116 -0
- package/dist/commands/form-obj-meta.js.map +1 -0
- package/dist/commands/form-validate.d.ts.map +1 -1
- package/dist/commands/form-validate.js +167 -35
- package/dist/commands/form-validate.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +359 -27
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +5 -3
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +215 -13
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +18 -4
- package/dist/commands/workflow.js.map +1 -1
- package/dist/core/client.d.ts +2 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +4 -2
- package/dist/core/client.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
- package/dist/services/actionflow/calendar_mapper.js +34 -14
- package/dist/services/actionflow/calendar_mapper.js.map +1 -1
- package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/document_actions.js +113 -4
- package/dist/services/actionflow/components/document_actions.js.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js +18 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
- package/dist/services/actionflow/components/index.d.ts.map +1 -1
- package/dist/services/actionflow/components/index.js +2 -1
- package/dist/services/actionflow/components/index.js.map +1 -1
- package/dist/services/actionflow/components/schedule_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/schedule_create.js +22 -6
- package/dist/services/actionflow/components/schedule_create.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts +1 -0
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +31 -6
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts +5 -0
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +88 -34
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/document_source.d.ts +5 -0
- package/dist/services/actionflow/document_source.d.ts.map +1 -1
- package/dist/services/actionflow/document_source.js +16 -0
- package/dist/services/actionflow/document_source.js.map +1 -1
- package/dist/services/actionflow/filter_rules.d.ts.map +1 -1
- package/dist/services/actionflow/filter_rules.js +9 -8
- package/dist/services/actionflow/filter_rules.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +2 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +52 -22
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +5 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +128 -3
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/save_workflow_draft.d.ts +7 -0
- package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
- package/dist/services/actionflow/save_workflow_draft.js +1 -1
- package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +51 -13
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/form-formula-linkage.d.ts +4 -0
- package/dist/services/form-formula-linkage.d.ts.map +1 -1
- package/dist/services/form-formula-linkage.js +3 -1
- package/dist/services/form-formula-linkage.js.map +1 -1
- package/dist/services/form-layout-io.d.ts +18 -0
- package/dist/services/form-layout-io.d.ts.map +1 -0
- package/dist/services/form-layout-io.js +89 -0
- package/dist/services/form-layout-io.js.map +1 -0
- package/dist/services/form-layout-source/artifact.d.ts +8 -0
- package/dist/services/form-layout-source/artifact.d.ts.map +1 -0
- package/dist/services/form-layout-source/artifact.js +52 -0
- package/dist/services/form-layout-source/artifact.js.map +1 -0
- package/dist/services/form-layout-source/binding.d.ts +10 -0
- package/dist/services/form-layout-source/binding.d.ts.map +1 -0
- package/dist/services/form-layout-source/binding.js +43 -0
- package/dist/services/form-layout-source/binding.js.map +1 -0
- package/dist/services/form-layout-source/compile.d.ts +7 -0
- package/dist/services/form-layout-source/compile.d.ts.map +1 -0
- package/dist/services/form-layout-source/compile.js +262 -0
- package/dist/services/form-layout-source/compile.js.map +1 -0
- package/dist/services/form-layout-source/creation.d.ts +18 -0
- package/dist/services/form-layout-source/creation.d.ts.map +1 -0
- package/dist/services/form-layout-source/creation.js +42 -0
- package/dist/services/form-layout-source/creation.js.map +1 -0
- package/dist/services/form-layout-source/excel-extractor.d.ts +7 -0
- package/dist/services/form-layout-source/excel-extractor.d.ts.map +1 -0
- package/dist/services/form-layout-source/excel-extractor.js +342 -0
- package/dist/services/form-layout-source/excel-extractor.js.map +1 -0
- package/dist/services/form-layout-source/image-border.d.ts +9 -0
- package/dist/services/form-layout-source/image-border.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-border.js +128 -0
- package/dist/services/form-layout-source/image-border.js.map +1 -0
- package/dist/services/form-layout-source/image-observation.d.ts +14 -0
- package/dist/services/form-layout-source/image-observation.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-observation.js +90 -0
- package/dist/services/form-layout-source/image-observation.js.map +1 -0
- package/dist/services/form-layout-source/image-review.d.ts +32 -0
- package/dist/services/form-layout-source/image-review.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-review.js +266 -0
- package/dist/services/form-layout-source/image-review.js.map +1 -0
- package/dist/services/form-layout-source/image-style.d.ts +16 -0
- package/dist/services/form-layout-source/image-style.d.ts.map +1 -0
- package/dist/services/form-layout-source/image-style.js +539 -0
- package/dist/services/form-layout-source/image-style.js.map +1 -0
- package/dist/services/form-layout-source/json.d.ts +3 -0
- package/dist/services/form-layout-source/json.d.ts.map +1 -0
- package/dist/services/form-layout-source/json.js +33 -0
- package/dist/services/form-layout-source/json.js.map +1 -0
- package/dist/services/form-layout-source/presentation.d.ts +23 -0
- package/dist/services/form-layout-source/presentation.d.ts.map +1 -0
- package/dist/services/form-layout-source/presentation.js +174 -0
- package/dist/services/form-layout-source/presentation.js.map +1 -0
- package/dist/services/form-layout-source/preview.d.ts +4 -0
- package/dist/services/form-layout-source/preview.d.ts.map +1 -0
- package/dist/services/form-layout-source/preview.js +49 -0
- package/dist/services/form-layout-source/preview.js.map +1 -0
- package/dist/services/form-layout-source/schema.d.ts +20 -0
- package/dist/services/form-layout-source/schema.d.ts.map +1 -0
- package/dist/services/form-layout-source/schema.js +149 -0
- package/dist/services/form-layout-source/schema.js.map +1 -0
- package/dist/services/form-layout-source/source-grid.d.ts +8 -0
- package/dist/services/form-layout-source/source-grid.d.ts.map +1 -0
- package/dist/services/form-layout-source/source-grid.js +61 -0
- package/dist/services/form-layout-source/source-grid.js.map +1 -0
- package/dist/services/form-layout-source/types.d.ts +242 -0
- package/dist/services/form-layout-source/types.d.ts.map +1 -0
- package/dist/services/form-layout-source/types.js +2 -0
- package/dist/services/form-layout-source/types.js.map +1 -0
- package/dist/services/form-layout-source/verify.d.ts +14 -0
- package/dist/services/form-layout-source/verify.d.ts.map +1 -0
- package/dist/services/form-layout-source/verify.js +226 -0
- package/dist/services/form-layout-source/verify.js.map +1 -0
- package/dist/services/form-linkage-condition.d.ts +15 -0
- package/dist/services/form-linkage-condition.d.ts.map +1 -1
- package/dist/services/form-linkage-condition.js +19 -10
- package/dist/services/form-linkage-condition.js.map +1 -1
- package/dist/services/form-obj-meta.d.ts +72 -0
- package/dist/services/form-obj-meta.d.ts.map +1 -0
- package/dist/services/form-obj-meta.js +103 -0
- package/dist/services/form-obj-meta.js.map +1 -0
- package/dist/services/form-sub-detail.d.ts +25 -0
- package/dist/services/form-sub-detail.d.ts.map +1 -1
- package/dist/services/form-sub-detail.js +64 -0
- package/dist/services/form-sub-detail.js.map +1 -1
- package/dist/services/validate-help.d.ts +25 -0
- package/dist/services/validate-help.d.ts.map +1 -0
- package/dist/services/validate-help.js +29 -0
- package/dist/services/validate-help.js.map +1 -0
- package/dist/services/workflow-operator.d.ts +12 -5
- package/dist/services/workflow-operator.d.ts.map +1 -1
- package/dist/services/workflow-operator.js +41 -16
- package/dist/services/workflow-operator.js.map +1 -1
- package/package.json +3 -1
- package/skill-docs/SKILL.md +38 -165
- package/skill-docs/_catalog.md +4 -1
- package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +29 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +1 -1
- package/skill-docs/assets/schemas/image-style-observation.schema.json +1355 -0
- package/skill-docs/references/coding/guide-page-code.md +2 -0
- package/skill-docs/references/coding/ref-compile-rules.md +2 -0
- package/skill-docs/references/common/capability-boundaries.md +15 -0
- package/skill-docs/references/common/guide-install.md +44 -0
- package/skill-docs/references/common/guide-plan-template.md +167 -164
- package/skill-docs/references/common/map.md +9 -0
- package/skill-docs/references/common/ref-cli-commands.md +650 -635
- package/skill-docs/references/form/guide-create-form.md +2 -0
- package/skill-docs/references/form/guide-field-linkage.md +185 -58
- package/skill-docs/references/form/guide-form-formula-functions.md +354 -343
- package/skill-docs/references/form/guide-form-layout-planning.md +6 -0
- package/skill-docs/references/form/guide-form-layout-source.md +366 -0
- package/skill-docs/references/form/guide-form-linkage.md +56 -66
- package/skill-docs/references/form/guide-form-view.md +1 -1
- package/skill-docs/references/form/guide-formula-linkage.md +44 -1
- package/skill-docs/references/workflow/guide-workflow.md +1 -1
package/dist/commands/form.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { writeFileSync, existsSync, readFileSync } from 'fs';
|
|
2
2
|
import { AuthSession } from '../core/auth.js';
|
|
3
3
|
import { ApiClient } from '../core/client.js';
|
|
4
|
+
import { parseLayoutJson } from '../services/form-layout-source/json.js';
|
|
4
5
|
import { toColumnName, toTableName, resolveFieldKeys } from '../utils/column-name.js';
|
|
5
6
|
import { createCustomPhysicalForm, applyInitialFieldsToNewForm, placeholderFromFormat, reapplyGroupLayout, queryFormStorageSetting } from '../services/form-create.js';
|
|
6
7
|
import { getRichType, richIdUnits, BROWSER_KINDS } from '../services/rich-types.js';
|
|
@@ -22,6 +23,8 @@ import { FIELD_TYPE_CHOICES, canonComponentKey, assertFieldType, normalizeFieldD
|
|
|
22
23
|
import { listFormTables, readFieldRecords, mapFieldsToTables } from '../services/form-physical-table.js';
|
|
23
24
|
import { buildFormulaParameters, defaultReturnType } from '../services/formula-detail.js';
|
|
24
25
|
import { registerOptionTemplateCommand } from './form-option-template.js';
|
|
26
|
+
import { registerFormObjMetaCommands } from './form-obj-meta.js';
|
|
27
|
+
import { prepareSourceLayoutInputs, restoreSourceLayoutAfterCreate } from '../services/form-layout-source/creation.js';
|
|
25
28
|
/**
|
|
26
29
|
* 字段类型归一 / 校验 / 校验清单已抽到 `services/form-field-validate.ts` ——
|
|
27
30
|
* 「标准建表」与「专项建表」两个入口共用同一份,避免两处真相。
|
|
@@ -99,6 +102,7 @@ async function fetchFieldPageRecords(client, baseUrl, appId, formId, subFormId)
|
|
|
99
102
|
export function registerFormCommands(program) {
|
|
100
103
|
const form = program.command('form').description('表单管理');
|
|
101
104
|
registerOptionTemplateCommand(form, program);
|
|
105
|
+
registerFormObjMetaCommands(form, program);
|
|
102
106
|
form.command('read')
|
|
103
107
|
.description('读取表单字段结构')
|
|
104
108
|
.argument('<objId>', '表单 objId')
|
|
@@ -316,14 +320,18 @@ export function registerFormCommands(program) {
|
|
|
316
320
|
+ 'valueKey 须为数字、省略则平台生成)')
|
|
317
321
|
.option('--menu', '建表后添加台账菜单(默认不加;漏加可用 `e10-cli menu add-table` 补)')
|
|
318
322
|
.option('--layout <type>', '表单布局类型:FLOW(流式)/EXCEL(表格,缺省)。布局类型建表后不可切换', 'EXCEL')
|
|
323
|
+
.option('--layout-source <json>', 'extract 输出的源证据;搭配 layout-spec 和 layout-artifact-out')
|
|
324
|
+
.option('--layout-spec <json>', '字段位置描述;字段创建和归组结束后还原源样式')
|
|
325
|
+
.option('--layout-artifact-out <file>', '保存源布局编译产物及原生前置快照,用于验收和重试')
|
|
319
326
|
.option('--table-name <name>', '自定义数据库表名。平台前缀(如 uf_)由 CLI 自动补,传 uf_xxx 或只传自定义部分都可以;'
|
|
320
327
|
+ '须字母开头、只含字母数字下划线。缺省按表单名拼音首字母 + 随机数生成')
|
|
321
328
|
.action(async (appId, name, cmdOpts) => {
|
|
329
|
+
const sourceLayout = await prepareSourceLayoutInputs(cmdOpts);
|
|
322
330
|
const opts = program.opts();
|
|
323
331
|
const auth = await AuthSession.fromOptions(opts);
|
|
324
332
|
if (!auth)
|
|
325
333
|
process.exit(1);
|
|
326
|
-
const client = new ApiClient(auth);
|
|
334
|
+
const client = new ApiClient(auth, 3, sourceLayout ? parseLayoutJson : undefined);
|
|
327
335
|
const baseUrl = auth.getBaseUrl();
|
|
328
336
|
const { randomUUID } = await import('crypto');
|
|
329
337
|
// Fields are required — parse from file (must start with @)
|
|
@@ -1736,21 +1744,137 @@ export function registerFormCommands(program) {
|
|
|
1736
1744
|
catch (e) {
|
|
1737
1745
|
console.error(` 显示列兜底失败: ${e.message}(可用 \`e10-cli form table-view ensure ${objId} ${appId}\` 手动补加)`);
|
|
1738
1746
|
}
|
|
1747
|
+
let layoutRestoration;
|
|
1748
|
+
if (sourceLayout) {
|
|
1749
|
+
try {
|
|
1750
|
+
// 独立单次提交客户端:不能让默认重试把结果未知的布局写入重复发送。
|
|
1751
|
+
layoutRestoration = await restoreSourceLayoutAfterCreate(new ApiClient(auth, 1, parseLayoutJson), baseUrl, { module: 'ebuilderform', formId, objId, appId, routeKind: 'default' }, sourceLayout);
|
|
1752
|
+
if (!layoutRestoration.saved || layoutRestoration.reportWriteError)
|
|
1753
|
+
process.exitCode = 1;
|
|
1754
|
+
}
|
|
1755
|
+
catch (e) {
|
|
1756
|
+
layoutRestoration = { saved: false, partial: true, error: e.message, artifactOut: sourceLayout.artifactOut };
|
|
1757
|
+
process.exitCode = 1;
|
|
1758
|
+
}
|
|
1759
|
+
console.error(layoutRestoration.saved ? ` 源布局结构回读通过,产物: ${sourceLayout.artifactOut}` : ` 表单 ${objId} 已创建,源布局还原未通过: ${layoutRestoration.error || '请查看差异报告'};重试只处理此已有表单`);
|
|
1760
|
+
if (layoutRestoration.reportWriteError)
|
|
1761
|
+
console.error(` 业务保存已回读通过,但报告落盘失败: ${layoutRestoration.reportWriteError}`);
|
|
1762
|
+
}
|
|
1739
1763
|
if (opts.json) {
|
|
1740
|
-
console.log(JSON.stringify({ objId, name, menuId, skippedSys }));
|
|
1764
|
+
console.log(JSON.stringify({ objId, name, menuId, skippedSys, ...(sourceLayout ? { formId, layoutRestoration } : {}) }));
|
|
1741
1765
|
}
|
|
1742
1766
|
else {
|
|
1743
1767
|
console.log(`完成: ${objId}${skippedSys.length ? `(跳过系统字段重名: ${skippedSys.map((s) => s.name).join('、')})` : ''}`);
|
|
1744
1768
|
}
|
|
1745
1769
|
});
|
|
1746
1770
|
const linkageCmd = form.command('linkage').description('表单字段显隐联动管理');
|
|
1771
|
+
const linkageBase = '/api/ebuilder/form/form/setting/viewlinkage';
|
|
1772
|
+
async function readLinkage(client, baseUrl, appId, objId, formId, id) {
|
|
1773
|
+
const res = await client.get(`${baseUrl}${linkageBase}/id?${new URLSearchParams({ id, formId, module: 'ebuilderform', apid: appId })}`);
|
|
1774
|
+
if (res?.code !== 200 || !res?.status || !res?.data || String(res.data.id) !== id) {
|
|
1775
|
+
throw new Error(`读取显示属性联动 ${id} 失败: ${res?.msg || '未找到规则'}`);
|
|
1776
|
+
}
|
|
1777
|
+
if (String(res.data.formId) !== formId)
|
|
1778
|
+
throw new Error(`规则 ${id} 不属于表单 ${objId}`);
|
|
1779
|
+
return res.data;
|
|
1780
|
+
}
|
|
1781
|
+
async function readLinkageLayoutTargets(client, baseUrl, appId, objId, formId) {
|
|
1782
|
+
const res = await client.post(`${baseUrl}/api/ebuilder/form/common/browser/complete/form_dataDrivenColumn?apid=${appId}`, {
|
|
1783
|
+
browserMultiple: true, formId, module: 'ebuilderform', groupId: 'layoutComponent',
|
|
1784
|
+
makeComplexField: true, openTab: false, scenarioType: 'VIEW_LINKAGE_TARGET',
|
|
1785
|
+
notComponentKeyList: ['DividingLine', 'ColumnPanel', 'MultiTypeField', 'WPSEditor'],
|
|
1786
|
+
needI18n: true, newly: 1, searchValue: '', customParam: { appId, objId },
|
|
1787
|
+
});
|
|
1788
|
+
if (res?.code !== 200 || !res?.status || !Array.isArray(res?.data?.data)) {
|
|
1789
|
+
throw new Error(`查询布局组件失败: ${res?.msg || '未返回组件列表'}`);
|
|
1790
|
+
}
|
|
1791
|
+
return res.data.data;
|
|
1792
|
+
}
|
|
1793
|
+
async function resolveLayoutActions(client, baseUrl, appId, objId, formId, actions) {
|
|
1794
|
+
if (!actions.some((action) => action.linkageObj === 'layout'))
|
|
1795
|
+
return actions;
|
|
1796
|
+
const targets = await readLinkageLayoutTargets(client, baseUrl, appId, objId, formId);
|
|
1797
|
+
return actions.map((action) => action.linkageObj !== 'layout' ? action : {
|
|
1798
|
+
...action,
|
|
1799
|
+
fields: action.fields.map((field) => {
|
|
1800
|
+
const target = targets.find((item) => String(item.id) === String(field.id));
|
|
1801
|
+
if (!target)
|
|
1802
|
+
throw new Error(`布局组件 ${field.id} 不在当前表单的可选列表中`);
|
|
1803
|
+
return target;
|
|
1804
|
+
}),
|
|
1805
|
+
});
|
|
1806
|
+
}
|
|
1807
|
+
function checkLinkageActions(actions) {
|
|
1808
|
+
if (!Array.isArray(actions) || actions.length === 0)
|
|
1809
|
+
throw new Error('至少配置一项联动变更对象 actions[]');
|
|
1810
|
+
const props = {
|
|
1811
|
+
field: ['hide', 'show', 'edit', 'readonly', 'required', 'hideLine', 'hideRow'],
|
|
1812
|
+
option: ['hide', 'disabled'],
|
|
1813
|
+
detail: ['hide', 'show', 'edit', 'readonly', 'hideLine', 'hideRow'],
|
|
1814
|
+
layout: ['hide', 'show', 'hideLine'],
|
|
1815
|
+
};
|
|
1816
|
+
for (const action of actions) {
|
|
1817
|
+
const obj = action.linkageObj || 'field';
|
|
1818
|
+
if (!props[obj])
|
|
1819
|
+
throw new Error(`联动对象 ${obj} 暂无已确认的保存结构;支持 field / option / detail / layout`);
|
|
1820
|
+
if (!props[obj].includes(action.prop))
|
|
1821
|
+
throw new Error(`${obj} 不支持效果 ${action.prop};可用 ${props[obj].join('/')}`);
|
|
1822
|
+
if (!Array.isArray(action.fields) || !action.fields.length)
|
|
1823
|
+
throw new Error(`${obj} 效果需指定 fields[]`);
|
|
1824
|
+
if (obj === 'layout' && action.fields.some((field) => !field.id)) {
|
|
1825
|
+
throw new Error('布局组件目标需在 fields[] 中提供可选列表返回的 id');
|
|
1826
|
+
}
|
|
1827
|
+
if (obj === 'option' && (!Array.isArray(action.options) || !action.options.length)) {
|
|
1828
|
+
throw new Error('选项目标需指定 options[](fieldId、optionId、optionName)');
|
|
1829
|
+
}
|
|
1830
|
+
for (const option of action.options || []) {
|
|
1831
|
+
if (!option.fieldId || !option.optionId || !option.optionName) {
|
|
1832
|
+
throw new Error('options[] 每项需包含 fieldId、optionId、optionName');
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
}
|
|
1836
|
+
}
|
|
1837
|
+
async function resolveLinkageFormula(client, baseUrl, appId, objId, formId, config) {
|
|
1838
|
+
if (config.formulaId) {
|
|
1839
|
+
if (!config.formulaName)
|
|
1840
|
+
throw new Error('引用已有公式需同时提供 formulaName');
|
|
1841
|
+
return { id: String(config.formulaId), name: String(config.formulaName) };
|
|
1842
|
+
}
|
|
1843
|
+
if (!config.formula)
|
|
1844
|
+
return undefined;
|
|
1845
|
+
const expression = String(config.formula).trim();
|
|
1846
|
+
const parsed = await buildFormulaParameters(client, baseUrl, objId, appId, formId, expression);
|
|
1847
|
+
if (parsed.errors.length)
|
|
1848
|
+
throw new Error(`公式引用无效: ${parsed.errors.join('; ')}`);
|
|
1849
|
+
for (const warning of parsed.warnings)
|
|
1850
|
+
console.error(` ⚠ ${warning}`);
|
|
1851
|
+
const name = String(config.formulaName || `显示属性联动公式_${Date.now()}`);
|
|
1852
|
+
const res = await client.post(`${baseUrl}/api/excel/formula/save`, {
|
|
1853
|
+
expressSql: parsed.normalizedExpression, name, parameters: parsed.parameters,
|
|
1854
|
+
returnType: 'Boolean', validateType: 'normal', referenceType: 'check',
|
|
1855
|
+
extendParam: JSON.stringify({ isFormViewLinkage: true }), formulaId: null,
|
|
1856
|
+
dataSources: [], formulaType: 'normal', mainDataSource: [null],
|
|
1857
|
+
tempVariableList: [], nameAuto: false, module: 'ebuilderform', multiFuncSepType: 1,
|
|
1858
|
+
});
|
|
1859
|
+
if (res?.returnInfo?.state === 'VERIFY_REQUIRED' || res?.securityCheckResult === false) {
|
|
1860
|
+
throw new Error('公式保存需要二次验证,联动规则尚未保存;请完成平台验证后再试');
|
|
1861
|
+
}
|
|
1862
|
+
if (!res?.resultJson?.excute || !res?.resultJson?.id || res?.resultJson?.returnType !== 'Boolean') {
|
|
1863
|
+
throw new Error(`布尔公式保存失败: ${res?.resultJson?.error || res?.msg || '未返回有效 Boolean 公式'}`);
|
|
1864
|
+
}
|
|
1865
|
+
console.error(` 布尔公式已保存: ${res.resultJson.id}(若后续联动保存失败,请用 formulaId/formulaName 复用)`);
|
|
1866
|
+
return { id: String(res.resultJson.id), name };
|
|
1867
|
+
}
|
|
1747
1868
|
linkageCmd.command('add')
|
|
1748
1869
|
.description('添加字段显隐联动规则')
|
|
1749
1870
|
.argument('<appId>', '应用 ID')
|
|
1750
1871
|
.argument('<objId>', '表单 objId')
|
|
1751
1872
|
.argument('<name>', '联动规则名称')
|
|
1752
1873
|
.requiredOption('--config <json>', '联动配置 JSON(@文件路径),格式见文档')
|
|
1874
|
+
.option('--disabled', '新建时停用(默认启用)')
|
|
1753
1875
|
.action(async (appId, objId, name, cmdOpts) => {
|
|
1876
|
+
if (name.length > 200)
|
|
1877
|
+
throw new Error('联动名称不能超过 200 字');
|
|
1754
1878
|
const opts = program.opts();
|
|
1755
1879
|
const auth = await AuthSession.fromOptions(opts);
|
|
1756
1880
|
if (!auth)
|
|
@@ -1766,23 +1890,15 @@ export function registerFormCommands(program) {
|
|
|
1766
1890
|
console.error(e.message);
|
|
1767
1891
|
process.exit(1);
|
|
1768
1892
|
}
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
if (missingProps.length > 0) {
|
|
1779
|
-
console.error(`联动 action 缺少 prop(联动效果类型必填)`);
|
|
1780
|
-
}
|
|
1781
|
-
if (invalidProps.length > 0) {
|
|
1782
|
-
console.error(`联动 prop 不支持: ${[...new Set(invalidProps)].join(', ')}`);
|
|
1783
|
-
console.error(` 平台支持: ${SUPPORTED_PROPS.join(', ')}`);
|
|
1784
|
-
}
|
|
1785
|
-
process.exit(1);
|
|
1893
|
+
checkLinkageActions(config.actions || []);
|
|
1894
|
+
if (config.conditions !== undefined && (config.formula || config.formulaId)) {
|
|
1895
|
+
throw new Error('简易条件 conditions 与函数条件 formula/formulaId 不能同时指定');
|
|
1896
|
+
}
|
|
1897
|
+
if (!config.formula && !config.formulaId && !Array.isArray(config.conditions)) {
|
|
1898
|
+
throw new Error('请提供 conditions[] 或 Boolean 公式');
|
|
1899
|
+
}
|
|
1900
|
+
if (Array.isArray(config.conditions) && config.conditions.length === 0) {
|
|
1901
|
+
throw new Error('简易条件 conditions[] 至少包含一项');
|
|
1786
1902
|
}
|
|
1787
1903
|
// Get formId from appId
|
|
1788
1904
|
const formInfo = await resolveFormRecord(client, baseUrl, appId, objId);
|
|
@@ -1796,27 +1912,231 @@ export function registerFormCommands(program) {
|
|
|
1796
1912
|
// 不看设计器实际报文就想不到的约束。
|
|
1797
1913
|
const formName = formInfo?.formName || formInfo?.objName || '表单';
|
|
1798
1914
|
const effect = await resolveEffect(client, baseUrl, formId, formName, config.effect);
|
|
1915
|
+
const formula = await resolveLinkageFormula(client, baseUrl, appId, objId, formId, config);
|
|
1916
|
+
const actions = await resolveLayoutActions(client, baseUrl, appId, objId, formId, config.actions || []);
|
|
1799
1917
|
const { payload, warnings } = buildLinkageAddPayload({
|
|
1800
1918
|
appId, objId, formId, formName, name,
|
|
1801
1919
|
conditions: config.conditions || [],
|
|
1802
1920
|
detailType: config.detailType,
|
|
1803
|
-
actions
|
|
1804
|
-
effect,
|
|
1921
|
+
actions,
|
|
1922
|
+
effect, formula, enableState: cmdOpts.disabled ? '0' : '1',
|
|
1805
1923
|
});
|
|
1806
1924
|
for (const w of warnings)
|
|
1807
1925
|
console.error(` ⚠ ${w}`);
|
|
1808
1926
|
const data = await addLinkage(client, baseUrl, appId, formId, payload);
|
|
1809
1927
|
if (data?.code === 200 && data?.status) {
|
|
1810
|
-
|
|
1928
|
+
// add 的 data 在部分环境是成功标记 1,并非规则 ID;从列表按名称回查唯一记录。
|
|
1929
|
+
const listed = await client.post(`${baseUrl}${linkageBase}/queryByPages?apid=${appId}`, {
|
|
1930
|
+
formId, module: 'ebuilderform', linkageTypeList: ['template', 'sql'],
|
|
1931
|
+
customParam: { appId, objId }, pageNo: 1, pageSize: 50,
|
|
1932
|
+
}, { ebbusinessid: appId });
|
|
1933
|
+
const matches = listed?.code === 200 && listed?.status
|
|
1934
|
+
? (listed?.data?.result || []).filter((item) => item.linkageName === name) : [];
|
|
1935
|
+
const linkageId = matches.length === 1 ? String(matches[0].id) : '';
|
|
1811
1936
|
console.log(opts.json
|
|
1812
1937
|
? JSON.stringify({ success: true, linkageId, name })
|
|
1813
|
-
: `联动规则已添加: ${name}` + (linkageId ? ` (id: ${linkageId})` : ''));
|
|
1938
|
+
: `联动规则已添加: ${name}` + (linkageId ? ` (id: ${linkageId})` : ';请用 linkage list 核对 ID'));
|
|
1814
1939
|
}
|
|
1815
1940
|
else {
|
|
1816
1941
|
console.error(`添加失败: ${data?.msg || '未知错误'}`);
|
|
1817
1942
|
process.exit(1);
|
|
1818
1943
|
}
|
|
1819
1944
|
});
|
|
1945
|
+
linkageCmd.command('get')
|
|
1946
|
+
.description('读取单条显示属性联动规则详情')
|
|
1947
|
+
.argument('<appId>').argument('<objId>').argument('<id>')
|
|
1948
|
+
.action(async (appId, objId, id) => {
|
|
1949
|
+
try {
|
|
1950
|
+
const opts = program.opts();
|
|
1951
|
+
const auth = await AuthSession.fromOptions(opts);
|
|
1952
|
+
if (!auth)
|
|
1953
|
+
throw new Error('无法加载认证');
|
|
1954
|
+
const client = new ApiClient(auth);
|
|
1955
|
+
const form = await resolveFormRecord(client, auth.getBaseUrl(), appId, objId);
|
|
1956
|
+
const formId = String(form?.formId || '');
|
|
1957
|
+
if (!formId)
|
|
1958
|
+
throw new Error('无法获取 formId');
|
|
1959
|
+
const record = await readLinkage(client, auth.getBaseUrl(), appId, objId, formId, id);
|
|
1960
|
+
console.log(opts.json ? JSON.stringify(record, null, 2)
|
|
1961
|
+
: `${record.linkageName} (${id}) ${record.enableState === '1' ? '启用' : '停用'};条件=${record.condition?.conditionType || '未知'};目标=${(record.linkageDetails || []).length} 项`);
|
|
1962
|
+
}
|
|
1963
|
+
catch (e) {
|
|
1964
|
+
console.error(`读取显示属性联动失败: ${e.message}`);
|
|
1965
|
+
process.exitCode = 1;
|
|
1966
|
+
}
|
|
1967
|
+
});
|
|
1968
|
+
linkageCmd.command('layout-targets')
|
|
1969
|
+
.description('查询当前表单可作为显示属性联动目标的布局组件')
|
|
1970
|
+
.argument('<appId>').argument('<objId>')
|
|
1971
|
+
.action(async (appId, objId) => {
|
|
1972
|
+
try {
|
|
1973
|
+
const auth = await AuthSession.fromOptions(program.opts());
|
|
1974
|
+
if (!auth)
|
|
1975
|
+
throw new Error('无法加载认证');
|
|
1976
|
+
const client = new ApiClient(auth);
|
|
1977
|
+
const baseUrl = auth.getBaseUrl();
|
|
1978
|
+
const form = await resolveFormRecord(client, baseUrl, appId, objId);
|
|
1979
|
+
const formId = String(form?.formId || '');
|
|
1980
|
+
if (!formId)
|
|
1981
|
+
throw new Error('无法获取 formId');
|
|
1982
|
+
const targets = await readLinkageLayoutTargets(client, baseUrl, appId, objId, formId);
|
|
1983
|
+
console.log(JSON.stringify(targets, null, 2));
|
|
1984
|
+
}
|
|
1985
|
+
catch (e) {
|
|
1986
|
+
console.error(`查询布局联动目标失败: ${e.message}`);
|
|
1987
|
+
process.exitCode = 1;
|
|
1988
|
+
}
|
|
1989
|
+
});
|
|
1990
|
+
linkageCmd.command('state')
|
|
1991
|
+
.description('启用或停用显示属性联动规则')
|
|
1992
|
+
.argument('<appId>').argument('<objId>').argument('<id>')
|
|
1993
|
+
.requiredOption('--set <on|off>', 'on=启用,off=停用')
|
|
1994
|
+
.action(async (appId, objId, id, cmdOpts) => {
|
|
1995
|
+
try {
|
|
1996
|
+
const state = cmdOpts.set === 'on' ? '1' : cmdOpts.set === 'off' ? '0' : '';
|
|
1997
|
+
if (!state)
|
|
1998
|
+
throw new Error('--set 只能为 on 或 off');
|
|
1999
|
+
const auth = await AuthSession.fromOptions(program.opts());
|
|
2000
|
+
if (!auth)
|
|
2001
|
+
throw new Error('无法加载认证');
|
|
2002
|
+
const client = new ApiClient(auth);
|
|
2003
|
+
const baseUrl = auth.getBaseUrl();
|
|
2004
|
+
const form = await resolveFormRecord(client, baseUrl, appId, objId);
|
|
2005
|
+
const formId = String(form?.formId || '');
|
|
2006
|
+
if (!formId)
|
|
2007
|
+
throw new Error('无法获取 formId');
|
|
2008
|
+
await readLinkage(client, baseUrl, appId, objId, formId, id);
|
|
2009
|
+
const res = await client.post(`${baseUrl}${linkageBase}/updateEnableStateByEntity?apid=${appId}`, { formId, id, enableState: state, customParam: { appId, objId } }, { ebbusinessid: formId });
|
|
2010
|
+
if (res?.code !== 200 || !res?.status)
|
|
2011
|
+
throw new Error(res?.msg || '保存失败');
|
|
2012
|
+
const saved = await readLinkage(client, baseUrl, appId, objId, formId, id);
|
|
2013
|
+
if (String(saved.enableState) !== state)
|
|
2014
|
+
throw new Error('启停状态保存后读回不一致');
|
|
2015
|
+
console.log(`显示属性联动已${state === '1' ? '启用' : '停用'}: ${saved.linkageName} (${id})`);
|
|
2016
|
+
}
|
|
2017
|
+
catch (e) {
|
|
2018
|
+
console.error(`切换显示属性联动失败: ${e.message}`);
|
|
2019
|
+
process.exitCode = 1;
|
|
2020
|
+
}
|
|
2021
|
+
});
|
|
2022
|
+
linkageCmd.command('update')
|
|
2023
|
+
.description('读取并修改已有显示属性联动;未指定内容保持原样')
|
|
2024
|
+
.argument('<appId>').argument('<objId>').argument('<id>')
|
|
2025
|
+
.option('--name <text>', '新名称')
|
|
2026
|
+
.option('--config <json>', '需替换的条件、目标或生效范围 JSON(@文件或内联)')
|
|
2027
|
+
.action(async (appId, objId, id, cmdOpts) => {
|
|
2028
|
+
try {
|
|
2029
|
+
if (!cmdOpts.name && !cmdOpts.config)
|
|
2030
|
+
throw new Error('至少提供 --name 或 --config');
|
|
2031
|
+
if (cmdOpts.name && cmdOpts.name.length > 200)
|
|
2032
|
+
throw new Error('联动名称不能超过 200 字');
|
|
2033
|
+
const auth = await AuthSession.fromOptions(program.opts());
|
|
2034
|
+
if (!auth)
|
|
2035
|
+
throw new Error('无法加载认证');
|
|
2036
|
+
const client = new ApiClient(auth);
|
|
2037
|
+
const baseUrl = auth.getBaseUrl();
|
|
2038
|
+
const form = await resolveFormRecord(client, baseUrl, appId, objId);
|
|
2039
|
+
const formId = String(form?.formId || '');
|
|
2040
|
+
if (!formId)
|
|
2041
|
+
throw new Error('无法获取 formId');
|
|
2042
|
+
const old = await readLinkage(client, baseUrl, appId, objId, formId, id);
|
|
2043
|
+
// 详情响应还含展示/统计字段;更新接口只接收设计器提交的规则主体。
|
|
2044
|
+
const payload = JSON.parse(JSON.stringify({
|
|
2045
|
+
fdEffect: old.fdEffect, condition: old.condition, linkageDetails: old.linkageDetails,
|
|
2046
|
+
module: 'ebuilderform', formId, refId: formId, id,
|
|
2047
|
+
enableState: old.enableState, linkageName: old.linkageName,
|
|
2048
|
+
customParam: { appId, objId },
|
|
2049
|
+
}));
|
|
2050
|
+
const config = cmdOpts.config ? readLinkageConfig(cmdOpts.config) : {};
|
|
2051
|
+
if (config.actions !== undefined)
|
|
2052
|
+
checkLinkageActions(config.actions);
|
|
2053
|
+
if (config.conditions !== undefined && (config.formula || config.formulaId)) {
|
|
2054
|
+
throw new Error('简易条件 conditions 与函数条件 formula/formulaId 不能同时指定');
|
|
2055
|
+
}
|
|
2056
|
+
if (config.conditions !== undefined && (!Array.isArray(config.conditions) || config.conditions.length === 0)) {
|
|
2057
|
+
throw new Error('简易条件 conditions[] 至少包含一项');
|
|
2058
|
+
}
|
|
2059
|
+
const formula = config.formula || config.formulaId
|
|
2060
|
+
? await resolveLinkageFormula(client, baseUrl, appId, objId, formId, config) : undefined;
|
|
2061
|
+
const actions = config.actions === undefined ? []
|
|
2062
|
+
: await resolveLayoutActions(client, baseUrl, appId, objId, formId, config.actions);
|
|
2063
|
+
const generated = buildLinkageAddPayload({
|
|
2064
|
+
appId, objId, formId, formName: String(form?.formName || form?.objName || '表单'),
|
|
2065
|
+
name: cmdOpts.name || old.linkageName, conditions: config.conditions || [],
|
|
2066
|
+
actions, detailType: config.detailType, formula,
|
|
2067
|
+
});
|
|
2068
|
+
for (const warning of generated.warnings)
|
|
2069
|
+
console.error(` ⚠ ${warning}`);
|
|
2070
|
+
if (cmdOpts.name)
|
|
2071
|
+
payload.linkageName = cmdOpts.name;
|
|
2072
|
+
if (config.effect !== undefined)
|
|
2073
|
+
payload.fdEffect = await resolveEffect(client, baseUrl, formId, String(form?.formName || form?.objName || '表单'), config.effect).then((effect) => ({
|
|
2074
|
+
...generated.payload.fdEffect, effectType: effect.effectType, effectName: effect.effectName,
|
|
2075
|
+
optionList: [{ effectValue: effect.effectValue, effectName: effect.optionName || effect.effectName }],
|
|
2076
|
+
}));
|
|
2077
|
+
if (config.conditions !== undefined || formula) {
|
|
2078
|
+
payload.condition = { ...old.condition, ...generated.payload.condition };
|
|
2079
|
+
}
|
|
2080
|
+
else if (config.detailType !== undefined) {
|
|
2081
|
+
payload.condition.detailType = config.detailType;
|
|
2082
|
+
}
|
|
2083
|
+
if (config.actions !== undefined)
|
|
2084
|
+
payload.linkageDetails = generated.payload.linkageDetails;
|
|
2085
|
+
payload.id = id;
|
|
2086
|
+
payload.formId = formId;
|
|
2087
|
+
payload.refId = formId;
|
|
2088
|
+
payload.module = 'ebuilderform';
|
|
2089
|
+
payload.customParam = { appId, objId };
|
|
2090
|
+
const res = await client.post(`${baseUrl}${linkageBase}/update?apid=${appId}`, payload, { ebbusinessid: formId });
|
|
2091
|
+
if (res?.code !== 200 || !res?.status)
|
|
2092
|
+
throw new Error(res?.msg || '保存失败');
|
|
2093
|
+
const saved = await readLinkage(client, baseUrl, appId, objId, formId, id);
|
|
2094
|
+
if (cmdOpts.name && saved.linkageName !== cmdOpts.name)
|
|
2095
|
+
throw new Error('规则名称保存后读回不一致');
|
|
2096
|
+
if (formula && String(saved.condition?.formulaId || '') !== formula.id)
|
|
2097
|
+
throw new Error('函数条件保存后读回不一致');
|
|
2098
|
+
if (config.detailType && saved.condition?.detailType !== config.detailType)
|
|
2099
|
+
throw new Error('条件关系保存后读回不一致');
|
|
2100
|
+
if (config.actions && (saved.linkageDetails || []).length !== config.actions.length)
|
|
2101
|
+
throw new Error('变更对象数量保存后读回不一致');
|
|
2102
|
+
console.log(`显示属性联动已修改: ${saved.linkageName} (${id})`);
|
|
2103
|
+
}
|
|
2104
|
+
catch (e) {
|
|
2105
|
+
console.error(`修改显示属性联动失败: ${e.message}`);
|
|
2106
|
+
process.exitCode = 1;
|
|
2107
|
+
}
|
|
2108
|
+
});
|
|
2109
|
+
linkageCmd.command('delete')
|
|
2110
|
+
.description('删除当前表单的一条显示属性联动规则')
|
|
2111
|
+
.argument('<appId>').argument('<objId>').argument('<id>')
|
|
2112
|
+
.action(async (appId, objId, id) => {
|
|
2113
|
+
try {
|
|
2114
|
+
const auth = await AuthSession.fromOptions(program.opts());
|
|
2115
|
+
if (!auth)
|
|
2116
|
+
throw new Error('无法加载认证');
|
|
2117
|
+
const client = new ApiClient(auth);
|
|
2118
|
+
const baseUrl = auth.getBaseUrl();
|
|
2119
|
+
const form = await resolveFormRecord(client, baseUrl, appId, objId);
|
|
2120
|
+
const formId = String(form?.formId || '');
|
|
2121
|
+
if (!formId)
|
|
2122
|
+
throw new Error('无法获取 formId');
|
|
2123
|
+
await readLinkage(client, baseUrl, appId, objId, formId, id);
|
|
2124
|
+
const query = new URLSearchParams({ ids: id, formId, module: 'ebuilderform', apid: appId });
|
|
2125
|
+
const res = await client.get(`${baseUrl}${linkageBase}/deleteByIds?${query}`);
|
|
2126
|
+
if (res?.code !== 200 || !res?.status || res?.data === 0)
|
|
2127
|
+
throw new Error(res?.msg || '删除失败');
|
|
2128
|
+
const check = await client.get(`${baseUrl}${linkageBase}/id?${new URLSearchParams({ id, formId, module: 'ebuilderform', apid: appId })}`);
|
|
2129
|
+
if (check?.code === 200 && check?.status && String(check?.data?.id || '') === id
|
|
2130
|
+
&& check.data.deleteType !== '1' && check.data.deleteType !== 1 && check.data.deleteType !== true) {
|
|
2131
|
+
throw new Error(`规则 ${id} 删除后仍可读到,请核查`);
|
|
2132
|
+
}
|
|
2133
|
+
console.log(`显示属性联动规则已删除: ${id}`);
|
|
2134
|
+
}
|
|
2135
|
+
catch (e) {
|
|
2136
|
+
console.error(`删除显示属性联动失败: ${e.message}`);
|
|
2137
|
+
process.exitCode = 1;
|
|
2138
|
+
}
|
|
2139
|
+
});
|
|
1820
2140
|
linkageCmd.command('list')
|
|
1821
2141
|
.description('查看显隐联动规则列表(回读条件/动作/启用状态)')
|
|
1822
2142
|
.argument('<appId>', '应用 ID')
|
|
@@ -1841,19 +2161,31 @@ export function registerFormCommands(program) {
|
|
|
1841
2161
|
formId, module: 'ebuilderform', linkageTypeList: ['template', 'sql'],
|
|
1842
2162
|
customParam: { appId, objId }, pageNo: 1, pageSize: 50,
|
|
1843
2163
|
};
|
|
1844
|
-
if (cmdOpts.keyword)
|
|
1845
|
-
body.keyword = cmdOpts.keyword;
|
|
1846
2164
|
const res = await client.post(`${baseUrl}/api/ebuilder/form/form/setting/viewlinkage/queryByPages?apid=${appId}`, body, { ebbusinessid: appId });
|
|
1847
2165
|
if (res?.code !== 200 || !res?.status) {
|
|
1848
2166
|
console.error(`查询失败: ${res?.msg || '未知错误'}`);
|
|
1849
2167
|
process.exit(1);
|
|
1850
2168
|
}
|
|
1851
|
-
|
|
2169
|
+
// 该接口的 keyword 不是字符串 DTO,直接传文本会触发反序列化错误;按名称在读回结果中过滤。
|
|
2170
|
+
let list = res?.data?.result || [];
|
|
2171
|
+
if (cmdOpts.keyword) {
|
|
2172
|
+
const total = Number(res?.data?.totalCount || list.length);
|
|
2173
|
+
for (let pageNo = 2; pageNo <= Math.ceil(total / body.pageSize); pageNo++) {
|
|
2174
|
+
const page = await client.post(`${baseUrl}${linkageBase}/queryByPages?apid=${appId}`, { ...body, pageNo }, { ebbusinessid: appId });
|
|
2175
|
+
if (page?.code !== 200 || !page?.status) {
|
|
2176
|
+
console.error(`第 ${pageNo} 页查询失败: ${page?.msg || '未知错误'}`);
|
|
2177
|
+
process.exitCode = 1;
|
|
2178
|
+
return;
|
|
2179
|
+
}
|
|
2180
|
+
list = list.concat(page?.data?.result || []);
|
|
2181
|
+
}
|
|
2182
|
+
list = list.filter((item) => String(item.linkageName || '').includes(cmdOpts.keyword));
|
|
2183
|
+
}
|
|
1852
2184
|
if (opts.json) {
|
|
1853
2185
|
console.log(JSON.stringify(list, null, 2));
|
|
1854
2186
|
}
|
|
1855
2187
|
else {
|
|
1856
|
-
console.log(`共 ${res?.data?.totalCount ?? list.length} 条联动规则:`);
|
|
2188
|
+
console.log(`共 ${cmdOpts.keyword ? list.length : (res?.data?.totalCount ?? list.length)} 条联动规则:`);
|
|
1857
2189
|
for (const x of list) {
|
|
1858
2190
|
const en = x.enableState === '1' ? '启用' : '停用';
|
|
1859
2191
|
console.log(` [${x.id}] ${x.linkageName} (${en})`);
|