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.
- package/assets/icon-names.txt +7438 -0
- package/dist/cli-register.d.ts.map +1 -1
- package/dist/cli-register.js +16 -3
- package/dist/cli-register.js.map +1 -1
- package/dist/commands/app-manager.d.ts +8 -0
- package/dist/commands/app-manager.d.ts.map +1 -0
- package/dist/commands/app-manager.js +330 -0
- package/dist/commands/app-manager.js.map +1 -0
- package/dist/commands/app-setting.d.ts +8 -0
- package/dist/commands/app-setting.d.ts.map +1 -0
- package/dist/commands/app-setting.js +170 -0
- package/dist/commands/app-setting.js.map +1 -0
- package/dist/commands/connector.d.ts +7 -0
- package/dist/commands/connector.d.ts.map +1 -0
- package/dist/commands/connector.js +163 -0
- package/dist/commands/connector.js.map +1 -0
- package/dist/commands/form-association-manage.d.ts.map +1 -1
- package/dist/commands/form-association-manage.js +57 -4
- package/dist/commands/form-association-manage.js.map +1 -1
- package/dist/commands/form-association.d.ts.map +1 -1
- package/dist/commands/form-association.js +4 -2
- package/dist/commands/form-association.js.map +1 -1
- package/dist/commands/form-button-actions-cmd.d.ts.map +1 -1
- package/dist/commands/form-button-actions-cmd.js +180 -18
- package/dist/commands/form-button-actions-cmd.js.map +1 -1
- package/dist/commands/form-button-props-cmd.d.ts.map +1 -1
- package/dist/commands/form-button-props-cmd.js +4 -0
- package/dist/commands/form-button-props-cmd.js.map +1 -1
- package/dist/commands/form-button.d.ts.map +1 -1
- package/dist/commands/form-button.js +11 -0
- package/dist/commands/form-button.js.map +1 -1
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +310 -84
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/icon.d.ts.map +1 -1
- package/dist/commands/icon.js +63 -1
- package/dist/commands/icon.js.map +1 -1
- package/dist/commands/menu-config.d.ts +3 -0
- package/dist/commands/menu-config.d.ts.map +1 -0
- package/dist/commands/menu-config.js +93 -0
- package/dist/commands/menu-config.js.map +1 -0
- package/dist/commands/menu-permission.d.ts.map +1 -1
- package/dist/commands/menu-permission.js +6 -7
- package/dist/commands/menu-permission.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +2 -5
- package/dist/commands/menu.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +1 -1
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/date_trigger.js +1 -1
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +4 -4
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/meeting_create.js +2 -1
- package/dist/services/actionflow/components/meeting_create.js.map +1 -1
- package/dist/services/actionflow/components/output.d.ts.map +1 -1
- package/dist/services/actionflow/components/output.js +2 -0
- package/dist/services/actionflow/components/output.js.map +1 -1
- package/dist/services/actionflow/context_discovery.d.ts.map +1 -1
- package/dist/services/actionflow/context_discovery.js +3 -0
- package/dist/services/actionflow/context_discovery.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +0 -10
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/date_trigger_field.d.ts +3 -0
- package/dist/services/actionflow/date_trigger_field.d.ts.map +1 -0
- package/dist/services/actionflow/date_trigger_field.js +23 -0
- package/dist/services/actionflow/date_trigger_field.js.map +1 -0
- package/dist/services/actionflow/form_source.d.ts +1 -1
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +9 -1
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +4 -12
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/generation_service.d.ts.map +1 -1
- package/dist/services/actionflow/generation_service.js +2 -1
- package/dist/services/actionflow/generation_service.js.map +1 -1
- package/dist/services/actionflow/loop_context.d.ts.map +1 -1
- package/dist/services/actionflow/loop_context.js +17 -0
- package/dist/services/actionflow/loop_context.js.map +1 -1
- package/dist/services/actionflow/meeting_secret_level.d.ts +5 -0
- package/dist/services/actionflow/meeting_secret_level.d.ts.map +1 -0
- package/dist/services/actionflow/meeting_secret_level.js +49 -0
- package/dist/services/actionflow/meeting_secret_level.js.map +1 -0
- package/dist/services/actionflow/preflight_service.d.ts +2 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +212 -4
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
- package/dist/services/actionflow/readback_verifier.js +22 -0
- package/dist/services/actionflow/readback_verifier.js.map +1 -1
- package/dist/services/actionflow/runtime_metadata.d.ts +2 -1
- package/dist/services/actionflow/runtime_metadata.d.ts.map +1 -1
- package/dist/services/actionflow/runtime_metadata.js +6 -1
- package/dist/services/actionflow/runtime_metadata.js.map +1 -1
- package/dist/services/actionflow/update_service.d.ts.map +1 -1
- package/dist/services/actionflow/update_service.js +42 -1
- package/dist/services/actionflow/update_service.js.map +1 -1
- package/dist/services/actionflow/webhook_response_context.d.ts +7 -0
- package/dist/services/actionflow/webhook_response_context.d.ts.map +1 -0
- package/dist/services/actionflow/webhook_response_context.js +82 -0
- package/dist/services/actionflow/webhook_response_context.js.map +1 -0
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +67 -35
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/app-manager.d.ts +128 -0
- package/dist/services/app-manager.d.ts.map +1 -0
- package/dist/services/app-manager.js +420 -0
- package/dist/services/app-manager.js.map +1 -0
- package/dist/services/app-setting.d.ts +109 -0
- package/dist/services/app-setting.d.ts.map +1 -0
- package/dist/services/app-setting.js +410 -0
- package/dist/services/app-setting.js.map +1 -0
- package/dist/services/esb-interface/connector-lock.d.ts +42 -0
- package/dist/services/esb-interface/connector-lock.d.ts.map +1 -0
- package/dist/services/esb-interface/connector-lock.js +79 -0
- package/dist/services/esb-interface/connector-lock.js.map +1 -0
- package/dist/services/esb-interface/connector-update.d.ts +34 -0
- package/dist/services/esb-interface/connector-update.d.ts.map +1 -0
- package/dist/services/esb-interface/connector-update.js +58 -0
- package/dist/services/esb-interface/connector-update.js.map +1 -0
- package/dist/services/form-association.d.ts +28 -1
- package/dist/services/form-association.d.ts.map +1 -1
- package/dist/services/form-association.js +232 -2
- package/dist/services/form-association.js.map +1 -1
- package/dist/services/form-button-action.d.ts +48 -2
- package/dist/services/form-button-action.d.ts.map +1 -1
- package/dist/services/form-button-action.js +68 -2
- package/dist/services/form-button-action.js.map +1 -1
- package/dist/services/form-field-options.d.ts +45 -0
- package/dist/services/form-field-options.d.ts.map +1 -0
- package/dist/services/form-field-options.js +179 -0
- package/dist/services/form-field-options.js.map +1 -0
- package/dist/services/form-permission-archive.d.ts +1 -0
- package/dist/services/form-permission-archive.d.ts.map +1 -1
- package/dist/services/form-permission-archive.js +3 -3
- package/dist/services/form-permission-archive.js.map +1 -1
- package/dist/services/form-permission-edit.d.ts +36 -0
- package/dist/services/form-permission-edit.d.ts.map +1 -1
- package/dist/services/form-permission-edit.js +77 -1
- package/dist/services/form-permission-edit.js.map +1 -1
- package/dist/services/icon-catalog.d.ts +60 -0
- package/dist/services/icon-catalog.d.ts.map +1 -0
- package/dist/services/icon-catalog.js +175 -0
- package/dist/services/icon-catalog.js.map +1 -0
- package/dist/services/icon-path.d.ts +2 -0
- package/dist/services/icon-path.d.ts.map +1 -1
- package/dist/services/icon-path.js +4 -0
- package/dist/services/icon-path.js.map +1 -1
- package/dist/services/menu-config.d.ts +42 -0
- package/dist/services/menu-config.d.ts.map +1 -0
- package/dist/services/menu-config.js +174 -0
- package/dist/services/menu-config.js.map +1 -0
- package/dist/services/menu-permission-config.d.ts +47 -0
- package/dist/services/menu-permission-config.d.ts.map +1 -0
- package/dist/services/menu-permission-config.js +222 -0
- package/dist/services/menu-permission-config.js.map +1 -0
- package/package.json +1 -1
- package/skill-docs/SKILL.md +193 -188
- package/skill-docs/_catalog.md +5 -1
- package/skill-docs/actionflows/SKILL.md +195 -193
- package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +5 -1
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +80 -80
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +75 -75
- package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +113 -111
- package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +2 -0
- package/skill-docs/actionflows/references/condition_rules.md +100 -100
- package/skill-docs/references/app/guide-app-manager.md +93 -0
- package/skill-docs/references/app/guide-app-settings.md +93 -0
- package/skill-docs/references/common/guide-install.md +2 -0
- package/skill-docs/references/common/ref-cli-commands.md +22 -7
- package/skill-docs/references/form/guide-form-association.md +36 -0
- package/skill-docs/references/form/guide-form-button.md +22 -1
- package/skill-docs/references/form/guide-form-permission.md +17 -5
- package/skill-docs/references/menu/guide-menu-config.md +130 -0
- 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
|
-
//
|
|
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
|
|
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:
|
|
329
|
-
orgName:
|
|
330
|
-
matrixValueRelation:
|
|
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
|
|
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
|
-
|
|
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
|
-
.
|
|
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
|
-
|
|
755
|
-
|
|
756
|
-
const
|
|
757
|
-
|
|
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
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
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
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
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.
|
|
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(
|
|
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({
|
|
796
|
-
|
|
797
|
-
|
|
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>',
|
|
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:
|
|
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
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
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
|
|
868
|
-
|
|
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({
|
|
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}`);
|