weaver-e10-builder 1.7.0 → 1.7.2

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 (180) hide show
  1. package/assets/icon-names.txt +7438 -0
  2. package/dist/cli-register.d.ts.map +1 -1
  3. package/dist/cli-register.js +16 -3
  4. package/dist/cli-register.js.map +1 -1
  5. package/dist/commands/app-manager.d.ts +8 -0
  6. package/dist/commands/app-manager.d.ts.map +1 -0
  7. package/dist/commands/app-manager.js +330 -0
  8. package/dist/commands/app-manager.js.map +1 -0
  9. package/dist/commands/app-setting.d.ts +8 -0
  10. package/dist/commands/app-setting.d.ts.map +1 -0
  11. package/dist/commands/app-setting.js +170 -0
  12. package/dist/commands/app-setting.js.map +1 -0
  13. package/dist/commands/connector.d.ts +7 -0
  14. package/dist/commands/connector.d.ts.map +1 -0
  15. package/dist/commands/connector.js +163 -0
  16. package/dist/commands/connector.js.map +1 -0
  17. package/dist/commands/form-association-manage.d.ts.map +1 -1
  18. package/dist/commands/form-association-manage.js +57 -4
  19. package/dist/commands/form-association-manage.js.map +1 -1
  20. package/dist/commands/form-association.d.ts.map +1 -1
  21. package/dist/commands/form-association.js +4 -2
  22. package/dist/commands/form-association.js.map +1 -1
  23. package/dist/commands/form-button-actions-cmd.d.ts.map +1 -1
  24. package/dist/commands/form-button-actions-cmd.js +180 -18
  25. package/dist/commands/form-button-actions-cmd.js.map +1 -1
  26. package/dist/commands/form-button-props-cmd.d.ts.map +1 -1
  27. package/dist/commands/form-button-props-cmd.js +4 -0
  28. package/dist/commands/form-button-props-cmd.js.map +1 -1
  29. package/dist/commands/form-button.d.ts.map +1 -1
  30. package/dist/commands/form-button.js +11 -0
  31. package/dist/commands/form-button.js.map +1 -1
  32. package/dist/commands/form-permission.d.ts.map +1 -1
  33. package/dist/commands/form-permission.js +310 -84
  34. package/dist/commands/form-permission.js.map +1 -1
  35. package/dist/commands/icon.d.ts.map +1 -1
  36. package/dist/commands/icon.js +63 -1
  37. package/dist/commands/icon.js.map +1 -1
  38. package/dist/commands/menu-config.d.ts +3 -0
  39. package/dist/commands/menu-config.d.ts.map +1 -0
  40. package/dist/commands/menu-config.js +93 -0
  41. package/dist/commands/menu-config.js.map +1 -0
  42. package/dist/commands/menu-permission.d.ts.map +1 -1
  43. package/dist/commands/menu-permission.js +6 -7
  44. package/dist/commands/menu-permission.js.map +1 -1
  45. package/dist/commands/menu.d.ts.map +1 -1
  46. package/dist/commands/menu.js +2 -5
  47. package/dist/commands/menu.js.map +1 -1
  48. package/dist/services/actionflow/components/action_eb_add.js +1 -1
  49. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  50. package/dist/services/actionflow/components/date_trigger.js +1 -1
  51. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  52. package/dist/services/actionflow/components/enquiry_form.js +4 -4
  53. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  54. package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
  55. package/dist/services/actionflow/components/meeting_create.js +2 -1
  56. package/dist/services/actionflow/components/meeting_create.js.map +1 -1
  57. package/dist/services/actionflow/components/output.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/output.js +2 -0
  59. package/dist/services/actionflow/components/output.js.map +1 -1
  60. package/dist/services/actionflow/context_discovery.d.ts.map +1 -1
  61. package/dist/services/actionflow/context_discovery.js +3 -0
  62. package/dist/services/actionflow/context_discovery.js.map +1 -1
  63. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  64. package/dist/services/actionflow/context_preflight.js +0 -10
  65. package/dist/services/actionflow/context_preflight.js.map +1 -1
  66. package/dist/services/actionflow/date_trigger_field.d.ts +3 -0
  67. package/dist/services/actionflow/date_trigger_field.d.ts.map +1 -0
  68. package/dist/services/actionflow/date_trigger_field.js +23 -0
  69. package/dist/services/actionflow/date_trigger_field.js.map +1 -0
  70. package/dist/services/actionflow/form_source.d.ts +1 -1
  71. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  72. package/dist/services/actionflow/form_source.js +9 -1
  73. package/dist/services/actionflow/form_source.js.map +1 -1
  74. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  75. package/dist/services/actionflow/formula_service.js +4 -12
  76. package/dist/services/actionflow/formula_service.js.map +1 -1
  77. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  78. package/dist/services/actionflow/generation_service.js +2 -1
  79. package/dist/services/actionflow/generation_service.js.map +1 -1
  80. package/dist/services/actionflow/loop_context.d.ts.map +1 -1
  81. package/dist/services/actionflow/loop_context.js +17 -0
  82. package/dist/services/actionflow/loop_context.js.map +1 -1
  83. package/dist/services/actionflow/meeting_secret_level.d.ts +5 -0
  84. package/dist/services/actionflow/meeting_secret_level.d.ts.map +1 -0
  85. package/dist/services/actionflow/meeting_secret_level.js +49 -0
  86. package/dist/services/actionflow/meeting_secret_level.js.map +1 -0
  87. package/dist/services/actionflow/preflight_service.d.ts +2 -0
  88. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  89. package/dist/services/actionflow/preflight_service.js +212 -4
  90. package/dist/services/actionflow/preflight_service.js.map +1 -1
  91. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  92. package/dist/services/actionflow/readback_verifier.js +22 -0
  93. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  94. package/dist/services/actionflow/runtime_metadata.d.ts +2 -1
  95. package/dist/services/actionflow/runtime_metadata.d.ts.map +1 -1
  96. package/dist/services/actionflow/runtime_metadata.js +6 -1
  97. package/dist/services/actionflow/runtime_metadata.js.map +1 -1
  98. package/dist/services/actionflow/update_service.d.ts.map +1 -1
  99. package/dist/services/actionflow/update_service.js +42 -1
  100. package/dist/services/actionflow/update_service.js.map +1 -1
  101. package/dist/services/actionflow/webhook_response_context.d.ts +7 -0
  102. package/dist/services/actionflow/webhook_response_context.d.ts.map +1 -0
  103. package/dist/services/actionflow/webhook_response_context.js +82 -0
  104. package/dist/services/actionflow/webhook_response_context.js.map +1 -0
  105. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  106. package/dist/services/actionflow/workflow_compiler.js +67 -35
  107. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  108. package/dist/services/app-manager.d.ts +128 -0
  109. package/dist/services/app-manager.d.ts.map +1 -0
  110. package/dist/services/app-manager.js +420 -0
  111. package/dist/services/app-manager.js.map +1 -0
  112. package/dist/services/app-setting.d.ts +109 -0
  113. package/dist/services/app-setting.d.ts.map +1 -0
  114. package/dist/services/app-setting.js +410 -0
  115. package/dist/services/app-setting.js.map +1 -0
  116. package/dist/services/esb-interface/connector-lock.d.ts +42 -0
  117. package/dist/services/esb-interface/connector-lock.d.ts.map +1 -0
  118. package/dist/services/esb-interface/connector-lock.js +79 -0
  119. package/dist/services/esb-interface/connector-lock.js.map +1 -0
  120. package/dist/services/esb-interface/connector-update.d.ts +34 -0
  121. package/dist/services/esb-interface/connector-update.d.ts.map +1 -0
  122. package/dist/services/esb-interface/connector-update.js +58 -0
  123. package/dist/services/esb-interface/connector-update.js.map +1 -0
  124. package/dist/services/form-association.d.ts +28 -1
  125. package/dist/services/form-association.d.ts.map +1 -1
  126. package/dist/services/form-association.js +232 -2
  127. package/dist/services/form-association.js.map +1 -1
  128. package/dist/services/form-button-action.d.ts +48 -2
  129. package/dist/services/form-button-action.d.ts.map +1 -1
  130. package/dist/services/form-button-action.js +68 -2
  131. package/dist/services/form-button-action.js.map +1 -1
  132. package/dist/services/form-field-options.d.ts +45 -0
  133. package/dist/services/form-field-options.d.ts.map +1 -0
  134. package/dist/services/form-field-options.js +179 -0
  135. package/dist/services/form-field-options.js.map +1 -0
  136. package/dist/services/form-permission-archive.d.ts +1 -0
  137. package/dist/services/form-permission-archive.d.ts.map +1 -1
  138. package/dist/services/form-permission-archive.js +3 -3
  139. package/dist/services/form-permission-archive.js.map +1 -1
  140. package/dist/services/form-permission-edit.d.ts +36 -0
  141. package/dist/services/form-permission-edit.d.ts.map +1 -1
  142. package/dist/services/form-permission-edit.js +77 -1
  143. package/dist/services/form-permission-edit.js.map +1 -1
  144. package/dist/services/icon-catalog.d.ts +60 -0
  145. package/dist/services/icon-catalog.d.ts.map +1 -0
  146. package/dist/services/icon-catalog.js +175 -0
  147. package/dist/services/icon-catalog.js.map +1 -0
  148. package/dist/services/icon-path.d.ts +2 -0
  149. package/dist/services/icon-path.d.ts.map +1 -1
  150. package/dist/services/icon-path.js +4 -0
  151. package/dist/services/icon-path.js.map +1 -1
  152. package/dist/services/menu-config.d.ts +42 -0
  153. package/dist/services/menu-config.d.ts.map +1 -0
  154. package/dist/services/menu-config.js +174 -0
  155. package/dist/services/menu-config.js.map +1 -0
  156. package/dist/services/menu-permission-config.d.ts +47 -0
  157. package/dist/services/menu-permission-config.d.ts.map +1 -0
  158. package/dist/services/menu-permission-config.js +222 -0
  159. package/dist/services/menu-permission-config.js.map +1 -0
  160. package/package.json +1 -1
  161. package/skill-docs/SKILL.md +193 -188
  162. package/skill-docs/_catalog.md +5 -1
  163. package/skill-docs/actionflows/SKILL.md +195 -193
  164. package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +2 -0
  165. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +5 -1
  166. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +80 -80
  167. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +75 -75
  168. package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +2 -0
  169. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +113 -111
  170. package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +2 -0
  171. package/skill-docs/actionflows/references/condition_rules.md +100 -100
  172. package/skill-docs/references/app/guide-app-manager.md +93 -0
  173. package/skill-docs/references/app/guide-app-settings.md +93 -0
  174. package/skill-docs/references/common/guide-install.md +2 -0
  175. package/skill-docs/references/common/ref-cli-commands.md +22 -7
  176. package/skill-docs/references/form/guide-form-association.md +36 -0
  177. package/skill-docs/references/form/guide-form-button.md +22 -1
  178. package/skill-docs/references/form/guide-form-permission.md +17 -5
  179. package/skill-docs/references/menu/guide-menu-config.md +130 -0
  180. package/skill-docs/references/menu/guide-menu-permission.md +94 -0
@@ -2,9 +2,9 @@ import { readFileSync } from 'node:fs';
2
2
  import { AuthSession } from '../core/auth.js';
3
3
  import { ApiClient } from '../core/client.js';
4
4
  import { resolveFormId } from '../services/form-id.js';
5
- import { ARCHIVE_ORG_TYPES, ARCHIVE_TARGETS, ARCHIVE_TARGET_ALIASES, FIELD_ORG_TYPE_LABELS, archiveFileRightsIncludeView, archiveRightsIncludeView, archiveRowKey, buildArchiveRow, buildMatrixValueRelation, ebFormValueFields, matrixValueFields, normalizeArchiveRow, parseArchiveFileRights, parseArchiveRights, resolveFieldOrgType, verifyArchiveRow, } from '../services/form-permission-archive.js';
6
- import { MATRIX_COND_FUNC_HINT, buildMatrixConditionData, ebFormCondColumns, matrixCondColumns, parseMatrixConditionArgs, pickCondFields, } from '../services/matrix-condition.js';
7
- import { PERMISSION_CODE_TYPES, PERMISSION_ORG_TYPES, PERMISSION_TARGETS, PERMISSION_TARGET_ALIASES, addPermissionRow, applyPermissionSettings, buildPermissionRow, buildSyncPermissionList, findRightRow, matrixValueCandidates, parseOnOff, parsePermissionFileRights, parsePermissionRights, permissionRightLabels, normalizeFileRightType, readPermissionDetail, resolvePermissionEbForm, resolvePermissionField, resolvePermissionMatrix, targetOfCodeType, updatePermissionDetail, verifyAddedRow, } from '../services/form-permission-edit.js';
5
+ import { ARCHIVE_ORG_TYPES, ARCHIVE_TARGETS, ARCHIVE_TARGET_ALIASES, FIELD_ORG_TYPE_LABELS, archiveFileRightsIncludeView, archiveRightsIncludeView, archiveRowKey, buildArchiveRow, buildMatrixValueRelation, ebFormValueFields, matrixValueFields, normalizeArchiveRow, parseArchiveFileRights, parseArchiveRights, resolveFieldOrgType, sameMatrixRelation, verifyArchiveRow, } from '../services/form-permission-archive.js';
6
+ import { MATRIX_COND_FUNC_HINT, buildMatrixConditionData, canonicalMatrixCondition, ebFormCondColumns, matrixCondColumns, parseMatrixConditionArgs, pickCondFields, summarizeMatrixCondition, } from '../services/matrix-condition.js';
7
+ import { PERMISSION_CODE_TYPES, PERMISSION_ORG_TYPES, PERMISSION_TARGETS, PERMISSION_TARGET_ALIASES, addPermissionRow, applyPermissionSettings, buildImpExpPermissionRow, buildPermissionRow, buildSyncPermissionList, copyImpExpPreservedFields, IMP_EXP_CODE_TYPES, impExpMatrixMismatches, impExpPreservedMismatches, findRightRow, matrixValueCandidates, parseOnOff, parsePermissionFileRights, parsePermissionRights, permissionRightLabels, normalizeFileRightType, readPermissionDetail, resolvePermissionEbForm, resolvePermissionField, resolvePermissionMatrix, targetOfCodeType, updatePermissionDetail, verifyAddedRow, } from '../services/form-permission-edit.js';
8
8
  import { fetchFields } from './form-list-utils.js';
9
9
  /**
10
10
  * Form permission management.
@@ -51,7 +51,7 @@ const RIGHT_TYPES = {
51
51
  '9': '数据导入',
52
52
  '93': '删除导入数据',
53
53
  };
54
- // 导入导出权限(codeType=data_imp_exp,独立分类——不在共享 dataRightList 里):
54
+ // 导入导出权限(通用对象 codeType=data_imp_exp、矩阵相关 data_imp_exp_matrix,独立分类——不在共享 dataRightList 里):
55
55
  // rightType 8=导出、9=导入(追加)、93=删除导入数据;93 必须与 9 同选(只勾"删除导入数据"平台语义为更新导入的一部分)。
56
56
  // importType "0,1":0=追加导入、1=更新导入(勾 93 时须带 1)。
57
57
  const IMP_EXP_RIGHT_ALIASES = {
@@ -174,6 +174,50 @@ function requireOrgId(orgType, orgId) {
174
174
  throw new Error(`--org-type ${orgType} 需要 --org-id(组织对象的 ID)`);
175
175
  return id;
176
176
  }
177
+ /** 导入导出权限的授权对象类别:通用对象 / 矩阵相关(平台 codeType 分别是 data_imp_exp / data_imp_exp_matrix)。 */
178
+ function resolveImpExpTarget(raw) {
179
+ const explicit = raw.target === undefined ? '' : String(raw.target).trim().toLowerCase();
180
+ if (explicit) {
181
+ if (['general', 'common', '通用', '通用对象'].includes(explicit))
182
+ return 'general';
183
+ if (['matrix', '矩阵', '矩阵相关'].includes(explicit))
184
+ return 'matrix';
185
+ throw new Error(`不支持的 --target: ${raw.target},可选: general(通用对象)/ matrix(矩阵相关)`);
186
+ }
187
+ if (raw.matrix !== undefined || raw.ebForm !== undefined
188
+ || raw.matrixValue?.length || raw.matrixValueRaw !== undefined || raw.matrixConditionRaw !== undefined) {
189
+ return 'matrix';
190
+ }
191
+ if (raw.orgType !== undefined || raw.orgId !== undefined || raw.orgName !== undefined)
192
+ return 'general';
193
+ return null;
194
+ }
195
+ function addImpExpTargetOptions(cmd) {
196
+ return cmd
197
+ .option('--target <type>', '授权对象类别: general 通用对象(默认)/ matrix 矩阵相关')
198
+ .option('--matrix <idOrName>', '矩阵相关:矩阵 id 或名称')
199
+ .option('--eb-form <idOrName>', '矩阵相关:e-Builder 表单 id 或名称')
200
+ .option('--matrix-value <spec...>', '矩阵相关:取值字段(名称或 id:名称:valueType)')
201
+ .option('--matrix-value-raw <json>', '矩阵相关:取值字段原始 JSON 数组')
202
+ .option('--matrix-condition-raw <json>', '矩阵相关:条件树原始 JSON');
203
+ }
204
+ function summarizeMatrixValueRelation(raw) {
205
+ if (raw === undefined || raw === null || String(raw).trim() === '')
206
+ return '';
207
+ try {
208
+ const list = JSON.parse(String(raw));
209
+ if (!Array.isArray(list))
210
+ return '';
211
+ return list.map((item) => String(item?.valueName ?? '')).filter(Boolean).join('、');
212
+ }
213
+ catch {
214
+ return '';
215
+ }
216
+ }
217
+ function isMatrixPermissionRow(row) {
218
+ return String(row?.codeType ?? '') === 'data_imp_exp_matrix'
219
+ || row?.orgType === 'matrix' || row?.orgType === 'ebuilder_form';
220
+ }
177
221
  export function registerFormPermissionCommands(form, program) {
178
222
  const permCmd = form.command('permission').description('表单权限管理(增删查)');
179
223
  // ─── LIST ───────────────────────────────────────────────
@@ -223,6 +267,77 @@ export function registerFormPermissionCommands(form, program) {
223
267
  });
224
268
  // ─── ADD ────────────────────────────────────────────────
225
269
  const dataCmd = permCmd.command('data').description('表单数据权限(共享权限:通用对象 / 创建人 / 字段 / 矩阵 / 政务单位)');
270
+ /**
271
+ * 解析「矩阵相关」授权对象。数据权限与导入导出权限共用同一套矩阵字段。
272
+ *
273
+ * `current` 用于 update:只改权限项、没给矩阵相关选项时沿用当前矩阵来源与条件;
274
+ * 换了来源且没点名取值字段时,按新来源的默认字段重建映射(与数据权限一致)。
275
+ */
276
+ async function resolveMatrixSubject(client, baseUrl, appId, raw, current) {
277
+ let source;
278
+ if (raw.ebForm || raw.matrix) {
279
+ const useEbForm = Boolean(raw.ebForm);
280
+ const spec = String(raw.ebForm ?? raw.matrix ?? '');
281
+ source = useEbForm
282
+ ? await resolvePermissionEbForm(client, baseUrl, appId, spec)
283
+ : await resolvePermissionMatrix(client, baseUrl, appId, spec);
284
+ }
285
+ else if (current && (current.orgType === 'matrix' || current.orgType === 'ebuilder_form')) {
286
+ source = {
287
+ id: String(current.orgId ?? ''),
288
+ name: String(current.orgName ?? ''),
289
+ codeType: current.orgType,
290
+ orgTypeName: String(current.orgTypeName ?? ''),
291
+ };
292
+ }
293
+ else {
294
+ throw new Error('矩阵权限需要 --matrix(真矩阵)或 --eb-form(e-Builder 表单)');
295
+ }
296
+ const sourceChanged = !current
297
+ || String(source.codeType) !== String(current.orgType ?? '')
298
+ || String(source.id) !== String(current.orgId ?? '');
299
+ let matrixValueRelation;
300
+ if (raw.matrixValueRaw !== undefined) {
301
+ const parsed = jsonArg(String(raw.matrixValueRaw), '--matrix-value-raw');
302
+ if (!Array.isArray(parsed) || !parsed.length)
303
+ throw new Error('--matrix-value-raw 需是非空 JSON 数组');
304
+ matrixValueRelation = buildMatrixValueRelation(parsed.map((v) => ({
305
+ valueId: String(v?.valueId ?? ''), valueName: String(v?.valueName ?? ''), valueType: String(v?.valueType ?? ''),
306
+ })));
307
+ }
308
+ else if (raw.matrixValue?.length) {
309
+ const candidates = await matrixValueCandidates(client, baseUrl, appId, source);
310
+ matrixValueRelation = buildMatrixValueRelation(raw.matrixValue.map((token) => parseMatrixValueToken(token, candidates)));
311
+ }
312
+ else if (!sourceChanged && current?.matrixValueRelation) {
313
+ matrixValueRelation = String(current.matrixValueRelation);
314
+ }
315
+ else {
316
+ const candidates = await matrixValueCandidates(client, baseUrl, appId, source);
317
+ const fallback = source.codeType === 'ebuilder_form'
318
+ ? (candidates.find((c) => c.valueType === 'system_creator') ?? candidates[0])
319
+ : candidates[0];
320
+ if (!fallback)
321
+ throw new Error('该矩阵没有可用取值字段,请用 --matrix-value 或 --matrix-value-raw 明写');
322
+ matrixValueRelation = buildMatrixValueRelation([fallback]);
323
+ }
324
+ let matrixConditionData;
325
+ if (raw.matrixConditionRaw !== undefined) {
326
+ const parsed = jsonArg(String(raw.matrixConditionRaw), '--matrix-condition-raw');
327
+ matrixConditionData = typeof parsed === 'string' ? parsed : JSON.stringify(parsed);
328
+ }
329
+ else {
330
+ matrixConditionData = String(current?.matrixConditionData ?? '');
331
+ }
332
+ return {
333
+ orgType: source.codeType,
334
+ orgId: String(source.id),
335
+ orgName: String(source.name ?? ''),
336
+ orgTypeName: String(source.orgTypeName ?? ''),
337
+ matrixValueRelation,
338
+ matrixConditionData,
339
+ };
340
+ }
226
341
  /**
227
342
  * 解析授权对象,产出写进 permission 的字段补丁。
228
343
  *
@@ -291,43 +406,14 @@ export function registerFormPermissionCommands(form, program) {
291
406
  };
292
407
  }
293
408
  case 'matrix': {
294
- const useEbForm = Boolean(raw.ebForm);
295
- const spec = String(raw.ebForm ?? raw.matrix ?? '');
296
- if (!spec)
297
- throw new Error('--target matrix 需要 --matrix(真矩阵)或 --eb-form(e-Builder 表单)');
298
- const source = useEbForm
299
- ? await resolvePermissionEbForm(client, baseUrl, appId, spec)
300
- : await resolvePermissionMatrix(client, baseUrl, appId, spec);
301
- let relation;
302
- if (raw.matrixValueRaw) {
303
- const parsed = jsonArg(String(raw.matrixValueRaw), '--matrix-value-raw');
304
- if (!Array.isArray(parsed) || !parsed.length)
305
- throw new Error('--matrix-value-raw 需是非空 JSON 数组');
306
- relation = buildMatrixValueRelation(parsed.map((v) => ({
307
- valueId: String(v?.valueId ?? ''), valueName: String(v?.valueName ?? ''), valueType: String(v?.valueType ?? ''),
308
- })));
309
- }
310
- else {
311
- const candidates = await matrixValueCandidates(client, baseUrl, appId, source);
312
- const fallback = useEbForm
313
- ? (candidates.find((c) => c.valueType === 'system_creator') ?? candidates[0])
314
- : candidates[0];
315
- const tokens = raw.matrixValue?.length ? raw.matrixValue : (fallback ? [fallback.valueName] : []);
316
- if (!tokens.length)
317
- throw new Error('该来源没有可用取值字段,请用 --matrix-value-raw 明写');
318
- relation = buildMatrixValueRelation(tokens.map((t) => parseMatrixValueToken(t, candidates)));
319
- }
320
- let matrixConditionData = '';
321
- if (raw.matrixConditionRaw !== undefined) {
322
- const parsed = jsonArg(String(raw.matrixConditionRaw), '--matrix-condition-raw');
323
- matrixConditionData = typeof parsed === 'string' ? parsed : JSON.stringify(parsed);
324
- }
409
+ const subject = await resolveMatrixSubject(client, baseUrl, appId, raw);
325
410
  return {
326
411
  target,
327
412
  patch: {
328
- codeType: source.codeType, orgType: source.codeType, orgId: source.id,
329
- orgName: source.name, orgTypeName: source.orgTypeName,
330
- matrixValueRelation: relation, matrixConditionData,
413
+ codeType: subject.orgType, orgType: subject.orgType, orgId: subject.orgId,
414
+ orgName: subject.orgName, orgTypeName: subject.orgTypeName,
415
+ matrixValueRelation: subject.matrixValueRelation,
416
+ matrixConditionData: subject.matrixConditionData,
331
417
  },
332
418
  };
333
419
  }
@@ -679,9 +765,10 @@ export function registerFormPermissionCommands(form, program) {
679
765
  process.exitCode = 1;
680
766
  }
681
767
  });
682
- // ─── IMP-EXP(导入导出权限,独立分类 data_imp_exp)─────────
768
+ // ─── IMP-EXP(导入导出权限,独立分类 data_imp_exp / data_imp_exp_matrix)─────────
683
769
  // 用户反馈:想加导入导出权限却加到了共享里。共享(dataRightList/obj_data_admin)只有 查看/编辑/删除 三种,
684
- // 导入导出是独立分类(impRightList/data_imp_exp),rightType: 8导出/9导入(追加)/93删除导入数据。
770
+ // 导入导出是独立分类(impRightList),通用对象 data_imp_exp、矩阵相关 data_imp_exp_matrix,
771
+ // rightType: 8导出/9导入(追加)/93删除导入数据。
685
772
  const impCmd = permCmd.command('imp-exp').description('导入导出权限(独立分类,勿用 data add——共享权限只有 查看/编辑/删除)');
686
773
  async function readImpRights(client, baseUrl, appId, objId) {
687
774
  const listed = await client.get(`${baseUrl}/api/bs/ebuilder/form/permission/getRightList?objId=${objId}&apid=${appId}&belongId=${objId}&type=imp`, { ebbusinessid: appId });
@@ -712,7 +799,8 @@ export function registerFormPermissionCommands(form, program) {
712
799
  return;
713
800
  }
714
801
  for (const r of items) {
715
- console.log(`[${r.id}] ${r.orgName || r.orgTypeName}(${r.orgType}) ${r.rightTypeName || rightTypeLabel(r.rightType)}`);
802
+ const matrix = isMatrixPermissionRow(r);
803
+ console.log(`[${r.id}] ${r.orgName || r.orgTypeName}(${r.orgType}) ${r.rightTypeName || rightTypeLabel(r.rightType)}${matrix ? ' [矩阵相关]' : ''}`);
716
804
  const extras = [];
717
805
  if (r.importType)
718
806
  extras.push(`importType=${r.importType}`);
@@ -722,6 +810,12 @@ export function registerFormPermissionCommands(form, program) {
722
810
  extras.push('导出明细');
723
811
  if (r.exportAttachment)
724
812
  extras.push('导出附件');
813
+ const values = summarizeMatrixValueRelation(r.matrixValueRelation);
814
+ if (values)
815
+ extras.push(`取值字段=${values}`);
816
+ const conditions = summarizeMatrixCondition(r.matrixConditionData);
817
+ if (conditions)
818
+ extras.push(`条件=${conditions}`);
725
819
  if (extras.length)
726
820
  console.log(` ${extras.join(' ')}`);
727
821
  }
@@ -732,47 +826,81 @@ export function registerFormPermissionCommands(form, program) {
732
826
  process.exitCode = 1;
733
827
  }
734
828
  });
735
- impCmd.command('add')
829
+ addImpExpTargetOptions(impCmd.command('add')
736
830
  .description('添加导入导出权限并回读(rightType: export=8 / import=9 / delete-import=93,93 须与 9 同选)')
737
831
  .argument('<objId>', '表单 objId')
738
832
  .argument('<appId>', '应用 ID')
739
- .requiredOption('--org-type <type>', `授权对象类型: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`)
833
+ .option('--org-type <type>', `通用对象类型: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`)
740
834
  .option('--org-id <id>', '授权对象 ID(all / externalAll 自动为 0)')
741
- .option('--org-name <name>', '授权对象名称(缺省用类型名)', '')
835
+ .option('--org-name <name>', '授权对象名称(缺省用类型名)')
742
836
  .requiredOption('--rights <rights...>', '权限组合: export / import / delete-import(或 8/9/93)')
743
837
  .option('--update-import', '允许更新导入(importType 加 1;默认仅追加导入 importType=0)')
744
838
  .option('--export-details', '导出明细数据(明细表)')
745
839
  .option('--export-attachment', '导出附件')
746
840
  .option('--export-field-range <range>', '导出字段范围: listShowField 列表显示字段 / allField 全部字段', 'listShowField')
747
- .option('--creator-related <level>', '权限关系: 0 本人 / 1 上级 / 5 本岗位', '0')
748
- .action(async (objId, appId, cmdOpts) => {
841
+ .option('--creator-related <level>', '权限关系: 0 本人 / 1 上级 / 5 本岗位', '0')).action(async (objId, appId, cmdOpts) => {
749
842
  try {
750
843
  const opts = program.opts();
751
844
  const auth = await AuthSession.fromOptions(opts);
752
845
  if (!auth)
753
846
  throw new Error('无法加载认证');
754
- if (!PERMISSION_ORG_TYPES[cmdOpts.orgType])
755
- throw new Error(`不支持的 --org-type: ${cmdOpts.orgType}`);
756
- const orgId = requireOrgId(cmdOpts.orgType, cmdOpts.orgId);
757
- const orgName = cmdOpts.orgName || PERMISSION_ORG_TYPES[cmdOpts.orgType];
847
+ const client = new ApiClient(auth);
848
+ const baseUrl = auth.getBaseUrl();
849
+ const target = resolveImpExpTarget(cmdOpts) ?? 'general';
850
+ let orgType;
851
+ let orgId;
852
+ let orgName;
853
+ let orgTypeName;
854
+ let matrixSubject;
855
+ if (target === 'matrix') {
856
+ if (cmdOpts.orgType !== undefined || cmdOpts.orgId !== undefined
857
+ || (cmdOpts.orgName !== undefined && cmdOpts.orgName !== '')) {
858
+ throw new Error('矩阵相关权限不能用 --org-type / --org-id / --org-name,请用 --matrix 或 --eb-form');
859
+ }
860
+ matrixSubject = await resolveMatrixSubject(client, baseUrl, appId, cmdOpts);
861
+ orgType = matrixSubject.orgType;
862
+ orgId = matrixSubject.orgId;
863
+ orgName = matrixSubject.orgName;
864
+ orgTypeName = matrixSubject.orgTypeName;
865
+ }
866
+ else {
867
+ if (cmdOpts.matrix !== undefined || cmdOpts.ebForm !== undefined
868
+ || cmdOpts.matrixValue?.length || cmdOpts.matrixValueRaw !== undefined || cmdOpts.matrixConditionRaw !== undefined) {
869
+ throw new Error('通用对象权限不能用矩阵选项,请去掉 --matrix / --eb-form / --matrix-value 等,或加 --target matrix');
870
+ }
871
+ if (!cmdOpts.orgType)
872
+ throw new Error('通用对象导入导出权限需要 --org-type');
873
+ if (!PERMISSION_ORG_TYPES[cmdOpts.orgType])
874
+ throw new Error(`不支持的 --org-type: ${cmdOpts.orgType}`);
875
+ orgType = cmdOpts.orgType;
876
+ orgId = requireOrgId(orgType, cmdOpts.orgId);
877
+ orgName = cmdOpts.orgName || PERMISSION_ORG_TYPES[orgType];
878
+ orgTypeName = PERMISSION_ORG_TYPES[orgType];
879
+ }
758
880
  const rightType = parseRightValues(cmdOpts.rights, IMP_EXP_RIGHT_ALIASES, '导入导出权限');
759
881
  if (rightType.includes('93') && !rightType.includes('9')) {
760
882
  throw new Error('delete-import(93) 必须与 import(9) 同选(删除导入数据依附于导入)');
761
883
  }
762
884
  // importType: 0=追加导入(默认);勾 93(删除导入数据)平台语义含更新导入 → importType 须带 1(抓包:8,9,93 → "0,1")
763
885
  const importType = rightType.includes('93') || cmdOpts.updateImport ? '0,1' : '0';
764
- const client = new ApiClient(auth);
765
- const baseUrl = auth.getBaseUrl();
766
- const perm = {
767
- belong: 'obj', belongId: objId, codeType: 'data_imp_exp',
886
+ const perm = buildImpExpPermissionRow({
887
+ objId,
888
+ target,
889
+ orgType,
890
+ orgId,
891
+ orgName,
892
+ orgTypeName,
893
+ rightType,
894
+ importType,
768
895
  exportDetails: cmdOpts.exportDetails ? 1 : 0,
769
896
  exportFieldRange: normalizeExportFieldRange(cmdOpts.exportFieldRange),
770
- layoutOrder: 0, orgType: cmdOpts.orgType, creatorRelated: cmdOpts.creatorRelated,
771
- orgId, orgVirtualType: '', orgTypeName: PERMISSION_ORG_TYPES[cmdOpts.orgType],
772
- rightType, importType, excludeObj: '', isPcMobileSameLayout: '0',
773
- orgName, conditionData: '',
774
- ...(cmdOpts.exportAttachment ? { exportAttachment: true } : {}),
775
- };
897
+ exportAttachment: Boolean(cmdOpts.exportAttachment),
898
+ creatorRelated: cmdOpts.creatorRelated,
899
+ ...(matrixSubject ? {
900
+ matrixValueRelation: matrixSubject.matrixValueRelation,
901
+ matrixConditionData: matrixSubject.matrixConditionData,
902
+ } : {}),
903
+ });
776
904
  const added = await client.post(`${baseUrl}/api/bs/ebuilder/form/permission/addRight?objId=${objId}&apid=${appId}&tpaid=${objId}`, [perm], { ebbusinessid: appId });
777
905
  if (added?.code !== 200 || !added?.status)
778
906
  throw new Error(added?.msg || '添加失败');
@@ -784,17 +912,38 @@ export function registerFormPermissionCommands(form, program) {
784
912
  const saved = items.find((item) => String(item.id) === id);
785
913
  if (!saved || String(saved.rightType) !== rightType)
786
914
  throw new Error('导入导出权限保存后回读不一致');
787
- if (String(saved.orgType) !== String(cmdOpts.orgType)) {
915
+ if (String(saved.codeType ?? '') !== perm.codeType) {
916
+ throw new Error(`导入导出权限保存后回读不一致(codeType 期望 ${perm.codeType},回读 ${saved.codeType ?? ''})`);
917
+ }
918
+ if (String(saved.orgType) !== String(orgType)) {
788
919
  throw new Error('导入导出权限保存后回读不一致(授权对象类型被平台改写)');
789
920
  }
790
- if (!['all', 'externalAll'].includes(cmdOpts.orgType) && String(saved.orgId ?? '') !== String(orgId)) {
921
+ if (!['all', 'externalAll'].includes(orgType) && String(saved.orgId ?? '') !== String(orgId)) {
791
922
  throw new Error('导入导出权限保存后回读不一致(授权对象 ID 被平台改写)');
792
923
  }
924
+ if (matrixSubject) {
925
+ const matrixMismatch = impExpMatrixMismatches(saved, {
926
+ codeType: perm.codeType,
927
+ matrixValueRelation: matrixSubject.matrixValueRelation,
928
+ matrixConditionData: matrixSubject.matrixConditionData,
929
+ });
930
+ if (matrixMismatch.length) {
931
+ throw new Error(`导入导出权限保存后回读不一致 —— ${matrixMismatch.join(';')}`);
932
+ }
933
+ }
793
934
  const label = rightTypeLabel(rightType);
794
- if (opts.json)
795
- console.log(JSON.stringify({ success: true, id, orgName, orgType: cmdOpts.orgType, orgId, rightType, label, importType }, null, 2));
796
- else
797
- console.log(`导入导出权限已添加: [${id}] ${orgName} ${label}${importType === '0,1' ? '(含更新导入)' : ''}`);
935
+ if (opts.json) {
936
+ console.log(JSON.stringify({
937
+ success: true, id, orgName, orgType, orgId, rightType, label, importType,
938
+ target, ...(matrixSubject ? { matrixValueRelation: matrixSubject.matrixValueRelation, matrixConditionData: matrixSubject.matrixConditionData } : {}),
939
+ }, null, 2));
940
+ }
941
+ else {
942
+ console.log(`导入导出权限已添加: [${id}] ${orgName || orgTypeName} ${label}${importType === '0,1' ? '(含更新导入)' : ''}`);
943
+ const values = matrixSubject ? summarizeMatrixValueRelation(matrixSubject.matrixValueRelation) : '';
944
+ if (values)
945
+ console.log(` 取值字段=${values}`);
946
+ }
798
947
  if (added?.data?.[0]?.isShowRebuild === 2) {
799
948
  console.error(` 注意: 该权限需要重构,执行: e10-cli form permission rebuild ${objId} ${appId} ${id}`);
800
949
  }
@@ -804,12 +953,12 @@ export function registerFormPermissionCommands(form, program) {
804
953
  process.exitCode = 1;
805
954
  }
806
955
  });
807
- impCmd.command('update')
956
+ addImpExpTargetOptions(impCmd.command('update')
808
957
  .description('修改导入导出权限(整行回写,只改点名项)')
809
958
  .argument('<objId>', '表单 objId')
810
959
  .argument('<appId>', '应用 ID')
811
960
  .requiredOption('--right-id <id>', '权限 ID(form permission imp-exp list 里的 [id])')
812
- .option('--org-type <type>', `授权对象类型: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`)
961
+ .option('--org-type <type>', `通用对象类型: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`)
813
962
  .option('--org-id <id>', '授权对象 ID(all / externalAll 自动为 0)')
814
963
  .option('--org-name <name>', '授权对象名称')
815
964
  .option('--rights <rights...>', '权限组合: export / import / delete-import(或 8/9/93)')
@@ -817,8 +966,7 @@ export function registerFormPermissionCommands(form, program) {
817
966
  .option('--export-details <on|off>', '导出明细数据(明细表)')
818
967
  .option('--export-attachment <on|off>', '导出附件')
819
968
  .option('--export-field-range <range>', '导出字段范围: listShowField 列表显示字段 / allField 全部字段')
820
- .option('--creator-related <level>', '权限关系: 0 本人 / 1 上级 / 5 本岗位')
821
- .action(async (objId, appId, raw) => {
969
+ .option('--creator-related <level>', '权限关系: 0 本人 / 1 上级 / 5 本岗位')).action(async (objId, appId, raw) => {
822
970
  try {
823
971
  const opts = program.opts();
824
972
  const auth = await AuthSession.fromOptions(opts);
@@ -831,11 +979,13 @@ export function registerFormPermissionCommands(form, program) {
831
979
  .find((r) => String(r.id) === rightId);
832
980
  if (!current)
833
981
  throw new Error(`导入导出权限 ${rightId} 不存在`);
982
+ const currentMatrix = isMatrixPermissionRow(current);
983
+ const target = resolveImpExpTarget(raw) ?? (currentMatrix ? 'matrix' : 'general');
834
984
  const permission = {
835
985
  id: rightId,
836
986
  belong: current.belong || 'obj',
837
987
  belongId: current.belongId || objId,
838
- codeType: 'data_imp_exp',
988
+ codeType: current.codeType || (currentMatrix ? IMP_EXP_CODE_TYPES.matrix : IMP_EXP_CODE_TYPES.general),
839
989
  orgType: current.orgType,
840
990
  orgId: current.orgId ?? '',
841
991
  orgName: current.orgName ?? '',
@@ -851,21 +1001,67 @@ export function registerFormPermissionCommands(form, program) {
851
1001
  orgVirtualType: current.orgVirtualType ?? '',
852
1002
  excludeObj: current.excludeObj ?? '',
853
1003
  conditionData: current.conditionData ?? '',
1004
+ ...(currentMatrix ? {
1005
+ matrixValueRelation: current.matrixValueRelation ?? '',
1006
+ matrixConditionData: current.matrixConditionData ?? '',
1007
+ } : {}),
854
1008
  };
1009
+ // 这几个字段没有 CLI 选项,但后端 update SQL 是无条件覆盖的;
1010
+ // 不原样带回会把界面上配好的权限描述/导入布局清空。
1011
+ copyImpExpPreservedFields(permission, current);
855
1012
  const changed = [];
856
- if (raw.orgType !== undefined) {
857
- const orgType = String(raw.orgType);
858
- if (!PERMISSION_ORG_TYPES[orgType]) {
859
- throw new Error(`不支持的 --org-type: ${orgType},可选: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`);
1013
+ const matrixOptionsGiven = raw.matrix !== undefined || raw.ebForm !== undefined
1014
+ || raw.matrixValue?.length || raw.matrixValueRaw !== undefined || raw.matrixConditionRaw !== undefined;
1015
+ if (target === 'matrix') {
1016
+ if (raw.orgType !== undefined || raw.orgId !== undefined || raw.orgName !== undefined) {
1017
+ throw new Error('矩阵相关权限不能用 --org-type / --org-id / --org-name,请用 --matrix 或 --eb-form');
1018
+ }
1019
+ if (!currentMatrix || matrixOptionsGiven) {
1020
+ const subject = await resolveMatrixSubject(client, baseUrl, appId, raw, currentMatrix ? current : undefined);
1021
+ permission.codeType = IMP_EXP_CODE_TYPES.matrix;
1022
+ permission.orgType = subject.orgType;
1023
+ permission.orgId = subject.orgId;
1024
+ permission.orgName = subject.orgName;
1025
+ permission.orgTypeName = subject.orgTypeName;
1026
+ permission.matrixValueRelation = subject.matrixValueRelation;
1027
+ permission.matrixConditionData = subject.matrixConditionData;
1028
+ changed.push('codeType', 'orgType', 'orgId', 'matrixValueRelation', 'matrixConditionData');
860
1029
  }
861
- permission.orgType = orgType;
862
- permission.orgId = requireOrgId(orgType, raw.orgId);
863
- permission.orgName = raw.orgName || PERMISSION_ORG_TYPES[orgType];
864
- permission.orgTypeName = PERMISSION_ORG_TYPES[orgType];
865
- changed.push('orgType', 'orgId');
866
1030
  }
867
- else if (raw.orgId !== undefined) {
868
- throw new Error('改授权对象需要同时给 --org-type(判断对象种类)');
1031
+ else {
1032
+ if (matrixOptionsGiven) {
1033
+ throw new Error('通用对象权限不能用矩阵选项,请去掉 --matrix / --eb-form / --matrix-value 等,或加 --target matrix');
1034
+ }
1035
+ if (currentMatrix) {
1036
+ if (!raw.orgType)
1037
+ throw new Error('从矩阵相关切换为通用对象需要 --org-type');
1038
+ const orgType = String(raw.orgType);
1039
+ if (!PERMISSION_ORG_TYPES[orgType]) {
1040
+ throw new Error(`不支持的 --org-type: ${orgType},可选: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`);
1041
+ }
1042
+ permission.codeType = IMP_EXP_CODE_TYPES.general;
1043
+ permission.orgType = orgType;
1044
+ permission.orgId = requireOrgId(orgType, raw.orgId);
1045
+ permission.orgName = raw.orgName || PERMISSION_ORG_TYPES[orgType];
1046
+ permission.orgTypeName = PERMISSION_ORG_TYPES[orgType];
1047
+ permission.matrixValueRelation = '';
1048
+ permission.matrixConditionData = '';
1049
+ changed.push('codeType', 'orgType', 'orgId', 'matrixValueRelation', 'matrixConditionData');
1050
+ }
1051
+ else if (raw.orgType !== undefined) {
1052
+ const orgType = String(raw.orgType);
1053
+ if (!PERMISSION_ORG_TYPES[orgType]) {
1054
+ throw new Error(`不支持的 --org-type: ${orgType},可选: ${Object.keys(PERMISSION_ORG_TYPES).join(' / ')}`);
1055
+ }
1056
+ permission.orgType = orgType;
1057
+ permission.orgId = requireOrgId(orgType, raw.orgId);
1058
+ permission.orgName = raw.orgName || PERMISSION_ORG_TYPES[orgType];
1059
+ permission.orgTypeName = PERMISSION_ORG_TYPES[orgType];
1060
+ changed.push('orgType', 'orgId');
1061
+ }
1062
+ else if (raw.orgId !== undefined) {
1063
+ throw new Error('改授权对象需要同时给 --org-type(判断对象种类)');
1064
+ }
869
1065
  }
870
1066
  if (raw.rights?.length) {
871
1067
  const rightType = parseRightValues(raw.rights, IMP_EXP_RIGHT_ALIASES, '导入导出权限');
@@ -915,6 +1111,17 @@ export function registerFormPermissionCommands(form, program) {
915
1111
  const cmp = (key) => {
916
1112
  if (['orgName', 'orgTypeName'].includes(key))
917
1113
  return;
1114
+ if (key === 'matrixValueRelation') {
1115
+ if (!sameMatrixRelation(after[key], permission[key]))
1116
+ mismatch.push('matrixValueRelation: 回读与期望不一致');
1117
+ return;
1118
+ }
1119
+ if (key === 'matrixConditionData') {
1120
+ if (canonicalMatrixCondition(after[key]) !== canonicalMatrixCondition(permission[key])) {
1121
+ mismatch.push('matrixConditionData: 回读与期望不一致(条件被平台改写或吞掉了)');
1122
+ }
1123
+ return;
1124
+ }
918
1125
  if (String(after[key] ?? '') !== String(permission[key] ?? '')) {
919
1126
  mismatch.push(`${key}: 期望 ${permission[key] ?? ''},回读 ${after[key] ?? ''}`);
920
1127
  }
@@ -924,14 +1131,27 @@ export function registerFormPermissionCommands(form, program) {
924
1131
  continue;
925
1132
  cmp(key);
926
1133
  }
1134
+ mismatch.push(...impExpPreservedMismatches(after, current));
927
1135
  if (mismatch.length)
928
1136
  throw new Error(`导入导出权限保存后回读不一致 —— ${mismatch.join(';')}`);
929
1137
  const label = rightTypeLabel(String(permission.rightType));
930
1138
  if (opts.json) {
931
- console.log(JSON.stringify({ success: true, id: rightId, orgType: permission.orgType, orgId: permission.orgId, rightType: permission.rightType, label, importType: permission.importType }, null, 2));
1139
+ console.log(JSON.stringify({
1140
+ success: true, id: rightId, orgType: permission.orgType, orgId: permission.orgId,
1141
+ rightType: permission.rightType, label, importType: permission.importType, target,
1142
+ ...(target === 'matrix' ? {
1143
+ matrixValueRelation: permission.matrixValueRelation,
1144
+ matrixConditionData: permission.matrixConditionData,
1145
+ } : {}),
1146
+ }, null, 2));
932
1147
  }
933
1148
  else {
934
1149
  console.log(`导入导出权限已修改: [${rightId}] ${permission.orgName || permission.orgTypeName} ${label}${permission.importType === '0,1' ? '(含更新导入)' : ''}`);
1150
+ if (target === 'matrix') {
1151
+ const values = summarizeMatrixValueRelation(permission.matrixValueRelation);
1152
+ if (values)
1153
+ console.log(` 取值字段=${values}`);
1154
+ }
935
1155
  }
936
1156
  }
937
1157
  catch (error) {
@@ -958,7 +1178,7 @@ export function registerFormPermissionCommands(form, program) {
958
1178
  console.log(JSON.stringify(row, null, 2));
959
1179
  return;
960
1180
  }
961
- console.log(`[${row.id}] ${row.orgName || row.orgTypeName}(${row.orgType}/${row.orgId ?? ''}) ${row.rightTypeName || rightTypeLabel(row.rightType)}`);
1181
+ console.log(`[${row.id}] ${row.orgName || row.orgTypeName}(${row.orgType}/${row.orgId ?? ''}) ${row.rightTypeName || rightTypeLabel(row.rightType)}${isMatrixPermissionRow(row) ? ' [矩阵相关]' : ''}`);
962
1182
  if (row.importType)
963
1183
  console.log(` importType=${row.importType}`);
964
1184
  if (row.exportFieldRange)
@@ -967,6 +1187,12 @@ export function registerFormPermissionCommands(form, program) {
967
1187
  console.log(' 导出明细');
968
1188
  if (row.exportAttachment)
969
1189
  console.log(' 导出附件');
1190
+ const values = summarizeMatrixValueRelation(row.matrixValueRelation);
1191
+ if (values)
1192
+ console.log(` 取值字段=${values}`);
1193
+ const conditions = summarizeMatrixCondition(row.matrixConditionData);
1194
+ if (conditions)
1195
+ console.log(` 条件=${conditions}`);
970
1196
  }
971
1197
  catch (error) {
972
1198
  console.error(`读取导入导出权限失败: ${error.message}`);