weaver-e10-builder 1.0.3-beta → 1.0.7-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/form-add-detail-table.d.ts +3 -0
- package/dist/commands/form-add-detail-table.d.ts.map +1 -0
- package/dist/commands/form-add-detail-table.js +153 -0
- package/dist/commands/form-add-detail-table.js.map +1 -0
- package/dist/commands/form-association.d.ts +3 -0
- package/dist/commands/form-association.d.ts.map +1 -0
- package/dist/commands/form-association.js +299 -0
- package/dist/commands/form-association.js.map +1 -0
- package/dist/commands/form-list-filter.d.ts.map +1 -1
- package/dist/commands/form-list-filter.js +4 -2
- package/dist/commands/form-list-filter.js.map +1 -1
- package/dist/commands/form-list-search-group.d.ts.map +1 -1
- package/dist/commands/form-list-search-group.js +10 -3
- package/dist/commands/form-list-search-group.js.map +1 -1
- package/dist/commands/form-list-stats.d.ts.map +1 -1
- package/dist/commands/form-list-stats.js +3 -1
- package/dist/commands/form-list-stats.js.map +1 -1
- package/dist/commands/form-list-utils.d.ts +13 -0
- package/dist/commands/form-list-utils.d.ts.map +1 -1
- package/dist/commands/form-list-utils.js +87 -17
- package/dist/commands/form-list-utils.js.map +1 -1
- package/dist/commands/form-list.d.ts.map +1 -1
- package/dist/commands/form-list.js +51 -0
- package/dist/commands/form-list.js.map +1 -1
- package/dist/commands/form-native.d.ts +17 -0
- package/dist/commands/form-native.d.ts.map +1 -0
- package/dist/commands/form-native.js +136 -0
- package/dist/commands/form-native.js.map +1 -0
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +8 -1
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +6 -2
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/matrix.d.ts.map +1 -1
- package/dist/commands/matrix.js +8 -6
- package/dist/commands/matrix.js.map +1 -1
- package/dist/commands/wf-form.d.ts +3 -0
- package/dist/commands/wf-form.d.ts.map +1 -0
- package/dist/commands/wf-form.js +1002 -0
- package/dist/commands/wf-form.js.map +1 -0
- package/dist/commands/workflow-condition.d.ts.map +1 -1
- package/dist/commands/workflow-condition.js +193 -60
- package/dist/commands/workflow-condition.js.map +1 -1
- package/dist/commands/workflow-create-workflow.d.ts +3 -0
- package/dist/commands/workflow-create-workflow.d.ts.map +1 -0
- package/dist/commands/workflow-create-workflow.js +214 -0
- package/dist/commands/workflow-create-workflow.js.map +1 -0
- package/dist/commands/workflow-node-robot.d.ts +3 -0
- package/dist/commands/workflow-node-robot.d.ts.map +1 -0
- package/dist/commands/workflow-node-robot.js +180 -0
- package/dist/commands/workflow-node-robot.js.map +1 -0
- package/dist/commands/workflow-node-validate.js +1 -1
- package/dist/commands/workflow-node-validate.js.map +1 -1
- package/dist/commands/workflow-node.d.ts.map +1 -1
- package/dist/commands/workflow-node.js +171 -9
- package/dist/commands/workflow-node.js.map +1 -1
- package/dist/commands/workflow-segment.d.ts +3 -0
- package/dist/commands/workflow-segment.d.ts.map +1 -0
- package/dist/commands/workflow-segment.js +333 -0
- package/dist/commands/workflow-segment.js.map +1 -0
- package/dist/commands/workflow-subprocess.d.ts +3 -0
- package/dist/commands/workflow-subprocess.d.ts.map +1 -0
- package/dist/commands/workflow-subprocess.js +496 -0
- package/dist/commands/workflow-subprocess.js.map +1 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +134 -56
- package/dist/commands/workflow.js.map +1 -1
- package/dist/core/lzw.d.ts +16 -0
- package/dist/core/lzw.d.ts.map +1 -0
- package/dist/core/lzw.js +71 -0
- package/dist/core/lzw.js.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/services/condition-rules.d.ts.map +1 -1
- package/dist/services/condition-rules.js +83 -30
- package/dist/services/condition-rules.js.map +1 -1
- package/dist/services/workflow-layout.d.ts +13 -2
- package/dist/services/workflow-layout.d.ts.map +1 -1
- package/dist/services/workflow-layout.js +73 -27
- package/dist/services/workflow-layout.js.map +1 -1
- package/package.json +1 -1
|
@@ -443,11 +443,13 @@ export function registerWorkflowCommands(program) {
|
|
|
443
443
|
.argument('<workflowId>', '流程 ID')
|
|
444
444
|
.argument('<nodeId>', '节点 ID')
|
|
445
445
|
.argument('[keyword]', '人员/角色关键词(--type form 时不需要)', '')
|
|
446
|
-
.option('--type <type>', '操作者类型: user(指定人) / role(指定角色) / dept(指定部门) / position(指定岗位) / all(所有人) / free(自由选择) / superior(发起人上级) / prev-node(上一节点) / form(表单相关人员) / matrix(矩阵对应)', 'user')
|
|
446
|
+
.option('--type <type>', '操作者类型: user(指定人) / role(指定角色) / dept(指定部门) / position(指定岗位) / all(所有人) / free(自由选择) / superior(发起人上级) / initiator(流程发起人本人) / prev-node(上一节点) / form(表单相关人员) / matrix(矩阵对应)', 'user')
|
|
447
447
|
.option('--source <formObjId>', '表单 ID(--type form 时必填)')
|
|
448
448
|
.option('--target <fieldId>', '人员字段 ID(--type form 时必填)')
|
|
449
449
|
.option('--condition <json>', '筛选条件 JSON / @文件(--type form 时可选)')
|
|
450
|
-
.option('--sign-order <order>', '签署顺序: 会签(默认) / 非会签 / 竞签 / 依次处理 / 抄送 / 抄送需批注', '会签')
|
|
450
|
+
.option('--sign-order <order>', '签署顺序: 会签(默认) / 非会签 / 竞签 / 依次处理(默认倒序) / 抄送 / 抄送需批注', '会签')
|
|
451
|
+
.option('--execute-order <spec>', '依次处理的执行顺序码: 2-2 人员显示顺序-倒序(默认) / 2-1 正序 / 1-1,2-2 安全级别正序+人员显示倒序', '')
|
|
452
|
+
.option('--dept-scope <scope>', '指定部门的范围: 本部门 / 本及下级(默认)', '本及下级')
|
|
451
453
|
.option('--orders <orders>', '批次号(两位小数,如 0.00 / 1.00)', '0.00')
|
|
452
454
|
.option('--workflow-form <objId>', '流程绑定的表单 objId(valueFieldId 引用字段时在此表单查找)')
|
|
453
455
|
.option('--matrix-id <id>', '矩阵 ID(--type matrix 必填)')
|
|
@@ -455,11 +457,15 @@ export function registerWorkflowCommands(program) {
|
|
|
455
457
|
.option('--matrix-rule <rules...>', '矩阵条件映射规则。格式: "条件configId:数据来源type:匹配operate:维度virtualId"。type: 0=指定部门/1=发起人部门/5=当前操作人部门。operate: 1=本部门/2=本及下级/3=本及上级/49=逐级向上/67=本及下级逐级向上')
|
|
456
458
|
.option('--batch-condition <expr>', '批次条件表达式(--type matrix 可选)')
|
|
457
459
|
.option('--append', '追加操作者组(不清空节点已有操作者组;默认是清空后全量重建)')
|
|
460
|
+
.option('--segment', '片段节点操作者(内部 workflowId 用 -99999999;nodeId 传片段节点 id)')
|
|
458
461
|
.action(async (workflowId, nodeId, keyword, cmdOpts) => {
|
|
459
462
|
const opts = program.opts();
|
|
460
463
|
const auth = await AuthSession.fromOptions(opts);
|
|
461
464
|
if (!auth)
|
|
462
465
|
process.exit(1);
|
|
466
|
+
// 片段节点操作者走 workflowId=-99999999 变体(抓包确认 saveOperatorGroup isPub=1)
|
|
467
|
+
if (cmdOpts.segment)
|
|
468
|
+
workflowId = '-99999999';
|
|
463
469
|
const client = new ApiClient(auth);
|
|
464
470
|
const baseUrl = auth.getBaseUrl();
|
|
465
471
|
// 追加模式(--append)下提示语用「追加」,否则「设置」
|
|
@@ -487,16 +493,19 @@ export function registerWorkflowCommands(program) {
|
|
|
487
493
|
let itemLevel = '';
|
|
488
494
|
let includeType = '';
|
|
489
495
|
let includeTypeCN = '';
|
|
490
|
-
const isSuperior = cmdOpts.type === 'superior';
|
|
496
|
+
const isSuperior = cmdOpts.type === 'superior' || cmdOpts.type === 'initiator';
|
|
491
497
|
if (isSuperior) {
|
|
492
|
-
//
|
|
498
|
+
// 发起人上级(superior) / 流程发起人本人(initiator):无 keyword,固定字段。
|
|
499
|
+
// 区别(抓包 2026-08-24):本人 includeType=12+itemName=本人+isSuportVirtualId/openProjectOrganization=true;
|
|
500
|
+
// 上级 includeType=13+itemName=直接上级+这两个 false。
|
|
501
|
+
const isInitiator = cmdOpts.type === 'initiator';
|
|
493
502
|
targetId = '';
|
|
494
|
-
targetName = '直接上级';
|
|
503
|
+
targetName = isInitiator ? '本人' : '直接上级';
|
|
495
504
|
groupType = '流程发起人';
|
|
496
505
|
groupTypeId = '114';
|
|
497
|
-
itemName = '直接上级';
|
|
498
|
-
// Build payload directly — superior has no browserData
|
|
499
|
-
console.error(` 操作者:
|
|
506
|
+
itemName = isInitiator ? '本人' : '直接上级';
|
|
507
|
+
// Build payload directly — superior/initiator has no browserData
|
|
508
|
+
console.error(` 操作者: ${isInitiator ? '流程发起人(本人)' : '发起人上级(直接上级)'} 类型: ${groupType}`);
|
|
500
509
|
const rg = await client.post(`${baseUrl}/api/bs/workflow/pathdef/nodeOperator/getLayoutConfigInfo`, {
|
|
501
510
|
groupId: '', workflowId, nodeId, sourceType: '1', isOperatorRuleAuth: true,
|
|
502
511
|
});
|
|
@@ -504,8 +513,10 @@ export function registerWorkflowCommands(program) {
|
|
|
504
513
|
const payload = {
|
|
505
514
|
workflowId, nodeId, groupId: '', isCreate: '', reserveGroupId,
|
|
506
515
|
itemDatas: [{
|
|
507
|
-
includeType: '13',
|
|
508
|
-
includeTypeCN: '上级',
|
|
516
|
+
includeType: isInitiator ? '12' : '13',
|
|
517
|
+
includeTypeCN: isInitiator ? '本人' : '上级',
|
|
518
|
+
virtualId: '',
|
|
519
|
+
virtualIdCN: '',
|
|
509
520
|
objLevelType: '1',
|
|
510
521
|
objLevelTypeCN: '全部机构',
|
|
511
522
|
objectId: '1',
|
|
@@ -530,8 +541,8 @@ export function registerWorkflowCommands(program) {
|
|
|
530
541
|
condition: '',
|
|
531
542
|
groupCondition: '',
|
|
532
543
|
level: '',
|
|
533
|
-
isSuportVirtualId:
|
|
534
|
-
openProjectOrganization:
|
|
544
|
+
isSuportVirtualId: isInitiator,
|
|
545
|
+
openProjectOrganization: isInitiator,
|
|
535
546
|
isExtendType: 0,
|
|
536
547
|
}],
|
|
537
548
|
oldGroupName: '',
|
|
@@ -543,9 +554,10 @@ export function registerWorkflowCommands(program) {
|
|
|
543
554
|
};
|
|
544
555
|
const data = await client.post(`${baseUrl}/api/bs/workflow/pathdef/nodeOperator/saveOperatorGroup`, payload);
|
|
545
556
|
if (data?.code === 200 && data?.status) {
|
|
557
|
+
const label = isInitiator ? '流程发起人(本人)' : '发起人上级(直接上级)';
|
|
546
558
|
const msg = opts.json
|
|
547
|
-
? JSON.stringify({ success: true, workflowId, nodeId, operator:
|
|
548
|
-
: `${verb}:
|
|
559
|
+
? JSON.stringify({ success: true, workflowId, nodeId, operator: label, type: groupType, append: !!cmdOpts.append })
|
|
560
|
+
: `${verb}: ${label} → 节点 ${nodeId}`;
|
|
549
561
|
console.log(msg);
|
|
550
562
|
}
|
|
551
563
|
else {
|
|
@@ -698,16 +710,38 @@ export function registerWorkflowCommands(program) {
|
|
|
698
710
|
};
|
|
699
711
|
ebFormConditionCn = `( ${cond.fieldName || cond.fieldId} ${funcMap[cond.func] || cond.func} '${valueDesc}' )`;
|
|
700
712
|
}
|
|
701
|
-
|
|
702
|
-
|
|
713
|
+
// 表单相关人员签署顺序:与 user/role 分支同码(会签1/非会签0/竞签0+competeSignOrder/依次2/抄送3/抄送需批注4)。
|
|
714
|
+
// 或签 当作竞签(表单字段多人"任一人签"语义一致)。
|
|
715
|
+
const formSignOrderMap = {
|
|
716
|
+
'会签': { code: '1', cn: '会签' },
|
|
717
|
+
'非会签': { code: '0', cn: '非会签' },
|
|
718
|
+
'竞签': { code: '0', cn: '非会签', competeSignOrder: '1', competeSignOrderCN: '竞签' },
|
|
719
|
+
'或签': { code: '0', cn: '非会签', competeSignOrder: '1', competeSignOrderCN: '竞签' },
|
|
720
|
+
'依次处理': { code: '2', cn: '依次逐个处理', executeOrders: '2-2', executeOrdersCN: '人员显示顺序-倒序' },
|
|
721
|
+
'抄送': { code: '3', cn: '抄送' },
|
|
722
|
+
'抄送需批注': { code: '4', cn: '抄送' },
|
|
723
|
+
};
|
|
724
|
+
const fso = formSignOrderMap[cmdOpts.signOrder || '会签'] || formSignOrderMap['会签'];
|
|
725
|
+
if (cmdOpts.executeOrder) {
|
|
726
|
+
const EC = { '2-2': '人员显示顺序-倒序', '2-1': '人员显示顺序-正序', '1-1': '安全级别-正序', '1-2': '安全级别-倒序', '1-1,2-2': '安全级别-正序,人员显示顺序-倒序', '1-1,2-1': '安全级别-正序,人员显示顺序-正序' };
|
|
727
|
+
fso.executeOrders = cmdOpts.executeOrder;
|
|
728
|
+
fso.executeOrdersCN = EC[cmdOpts.executeOrder] || cmdOpts.executeOrder;
|
|
729
|
+
}
|
|
730
|
+
const signOrder = fso.code;
|
|
731
|
+
const signOrderCN = fso.cn;
|
|
703
732
|
// Try to get form name and field name via API
|
|
704
733
|
let sourceIdCN = '';
|
|
705
734
|
let targetIdCN = '';
|
|
706
735
|
try {
|
|
707
736
|
const formFields = await client.post(`${baseUrl}/api/ebuilder/form/dataset/v1/getFields`, {
|
|
708
|
-
objId: cmdOpts.source, userid: auth.userId, tenantKey: auth.tenantKey,
|
|
737
|
+
objId: cmdOpts.source, userid: auth.userId, tenantKey: auth.tenantKey, isReturnDetail: 'y',
|
|
709
738
|
});
|
|
710
|
-
|
|
739
|
+
// 主表 + 明细字段都纳入(明细字段在 detailFields 里,含 subFormId)
|
|
740
|
+
const allFields = [
|
|
741
|
+
...(formFields?.data?.mainFields || []),
|
|
742
|
+
...(formFields?.data?.subFields || []),
|
|
743
|
+
...(formFields?.data?.detailFields || []).flatMap((dt) => dt.fields || []),
|
|
744
|
+
];
|
|
711
745
|
const targetField = allFields.find((f) => f.fieldId === cmdOpts.target || f.id === cmdOpts.target);
|
|
712
746
|
if (targetField) {
|
|
713
747
|
targetIdCN = targetField.fieldName || targetField.name || '';
|
|
@@ -723,6 +757,8 @@ export function registerWorkflowCommands(program) {
|
|
|
723
757
|
const itemData = {
|
|
724
758
|
signOrder,
|
|
725
759
|
signOrderCN,
|
|
760
|
+
...(fso.competeSignOrder ? { competeSignOrder: fso.competeSignOrder, competeSignOrderCN: fso.competeSignOrderCN } : {}),
|
|
761
|
+
...(fso.executeOrders ? { executeOrders: fso.executeOrders, executeOrdersCN: fso.executeOrdersCN } : {}),
|
|
726
762
|
isOut: false,
|
|
727
763
|
isSaveHrmOperator: false,
|
|
728
764
|
id: '1',
|
|
@@ -784,25 +820,43 @@ export function registerWorkflowCommands(program) {
|
|
|
784
820
|
console.error('--type dept 需要部门关键词');
|
|
785
821
|
process.exit(1);
|
|
786
822
|
}
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
823
|
+
// keyword 支持逗号分隔多部门;逐个解析
|
|
824
|
+
const deptNames = keyword.split(',').map((s) => s.trim()).filter(Boolean);
|
|
825
|
+
if (!deptNames.length) {
|
|
826
|
+
console.error('--type dept 需要部门关键词');
|
|
827
|
+
process.exit(1);
|
|
828
|
+
}
|
|
829
|
+
const depts = [];
|
|
830
|
+
const missingDepts = [];
|
|
831
|
+
for (const dn of deptNames) {
|
|
832
|
+
const deptRes = await client.post(`${baseUrl}/api/workflow/pathdef/common/browser/complete/department`, {
|
|
833
|
+
browserMultiple: true, virtualType: 'All', showSanYuan: true, newly: 0, searchValue: dn,
|
|
834
|
+
});
|
|
835
|
+
const d = deptRes?.data?.data?.[0];
|
|
836
|
+
if (!d) {
|
|
837
|
+
missingDepts.push(dn);
|
|
838
|
+
continue;
|
|
839
|
+
}
|
|
840
|
+
depts.push(d);
|
|
841
|
+
}
|
|
842
|
+
if (missingDepts.length) {
|
|
843
|
+
console.error(`未找到部门: ${missingDepts.join(',')}`);
|
|
793
844
|
process.exit(1);
|
|
794
845
|
}
|
|
846
|
+
// 部门范围:本部门(1, 单个部门内会签) / 本及下级(2, 默认)
|
|
847
|
+
const includeType = cmdOpts.deptScope === '本部门' ? '1' : '2';
|
|
848
|
+
const includeTypeCN = includeType === '1' ? '本部门' : '本部门及下级部门';
|
|
795
849
|
groupType = '指定部门';
|
|
796
850
|
groupTypeId = '102';
|
|
797
|
-
itemName =
|
|
798
|
-
itemData.hrmOperators =
|
|
799
|
-
itemData.hrmOperatorsCN =
|
|
800
|
-
itemData.includeType =
|
|
801
|
-
itemData.includeTypeCN =
|
|
851
|
+
itemName = depts.map((d) => `${d.name}(${includeTypeCN})`).join(',');
|
|
852
|
+
itemData.hrmOperators = depts.map((d) => d.id).join(',');
|
|
853
|
+
itemData.hrmOperatorsCN = depts.map((d) => d.name).join(',');
|
|
854
|
+
itemData.includeType = includeType;
|
|
855
|
+
itemData.includeTypeCN = includeTypeCN;
|
|
802
856
|
itemData.level = '10~90';
|
|
803
857
|
itemData.itemLevel = '10~90';
|
|
804
|
-
itemData.hrmBrowserDataDtos =
|
|
805
|
-
console.error(` 操作者: ${
|
|
858
|
+
itemData.hrmBrowserDataDtos = depts.map((d) => ({ id: d.id, name: d.name, _entityType: 'department' }));
|
|
859
|
+
console.error(` 操作者: ${depts.map((d) => d.name).join(',')} 类型: 指定部门(${includeTypeCN})`);
|
|
806
860
|
}
|
|
807
861
|
else if (cmdOpts.type === 'position') {
|
|
808
862
|
if (!keyword) {
|
|
@@ -861,11 +915,21 @@ export function registerWorkflowCommands(program) {
|
|
|
861
915
|
'会签': { code: '1', cn: '会签' },
|
|
862
916
|
'非会签': { code: '0', cn: '非会签' },
|
|
863
917
|
'竞签': { code: '0', cn: '非会签', competeSignOrder: '1', competeSignOrderCN: '竞签' },
|
|
864
|
-
'依次处理': { code: '2', cn: '
|
|
918
|
+
'依次处理': { code: '2', cn: '依次逐个处理', executeOrders: '2-2', executeOrdersCN: '人员显示顺序-倒序' },
|
|
865
919
|
'抄送': { code: '3', cn: '抄送' },
|
|
866
920
|
'抄送需批注': { code: '4', cn: '抄送' },
|
|
867
921
|
};
|
|
922
|
+
// executeOrders 顺序码 → 中文(依次处理时可 --execute-order 覆盖;默认 2-2 倒序)
|
|
923
|
+
const EXECUTE_ORDER_CN = {
|
|
924
|
+
'2-2': '人员显示顺序-倒序', '2-1': '人员显示顺序-正序',
|
|
925
|
+
'1-1': '安全级别-正序', '1-2': '安全级别-倒序',
|
|
926
|
+
'1-1,2-2': '安全级别-正序,人员显示顺序-倒序', '1-1,2-1': '安全级别-正序,人员显示顺序-正序',
|
|
927
|
+
};
|
|
868
928
|
const so = signOrderMap[cmdOpts.signOrder || '会签'] || signOrderMap['会签'];
|
|
929
|
+
if (cmdOpts.executeOrder) {
|
|
930
|
+
so.executeOrders = cmdOpts.executeOrder;
|
|
931
|
+
so.executeOrdersCN = EXECUTE_ORDER_CN[cmdOpts.executeOrder] || cmdOpts.executeOrder;
|
|
932
|
+
}
|
|
869
933
|
// Get reserveGroupId
|
|
870
934
|
const rg = await client.post(`${baseUrl}/api/bs/workflow/pathdef/nodeOperator/getLayoutConfigInfo`, {
|
|
871
935
|
groupId: '', workflowId, nodeId, sourceType: '1', isOperatorRuleAuth: true,
|
|
@@ -1037,24 +1101,13 @@ export function registerWorkflowCommands(program) {
|
|
|
1037
1101
|
includeTypeCN = '所有级别';
|
|
1038
1102
|
}
|
|
1039
1103
|
else {
|
|
1040
|
-
// Search users
|
|
1041
|
-
const
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
searchCount: 1,
|
|
1045
|
-
appDetachModule: 'EM',
|
|
1046
|
-
disableAppDetach: 0,
|
|
1047
|
-
pageNo: 1,
|
|
1048
|
-
pageSize: 1,
|
|
1049
|
-
});
|
|
1050
|
-
if (userData?.code !== 200 || !userData?.data?.userList?.length) {
|
|
1051
|
-
console.error(`未找到人员: ${keyword}`);
|
|
1104
|
+
// Search users — keyword 支持逗号分隔多人员(一个节点多人,如 闫宇,吴鹏)
|
|
1105
|
+
const names = keyword.split(',').map((s) => s.trim()).filter(Boolean);
|
|
1106
|
+
if (!names.length) {
|
|
1107
|
+
console.error('--type user 需要人员关键词');
|
|
1052
1108
|
process.exit(1);
|
|
1053
1109
|
}
|
|
1054
|
-
const
|
|
1055
|
-
targetId = emp.id || '';
|
|
1056
|
-
targetName = emp.name || '';
|
|
1057
|
-
browserData = {
|
|
1110
|
+
const mkBrowserData = (emp) => ({
|
|
1058
1111
|
id: emp.id || '',
|
|
1059
1112
|
cid: emp.cid || emp.companyId || '',
|
|
1060
1113
|
userid: emp.userid || emp.userId || emp.id || '',
|
|
@@ -1075,11 +1128,30 @@ export function registerWorkflowCommands(program) {
|
|
|
1075
1128
|
mainId: emp.mainId || emp.id || '',
|
|
1076
1129
|
stopDepartment: false,
|
|
1077
1130
|
leaf: true,
|
|
1078
|
-
};
|
|
1131
|
+
});
|
|
1132
|
+
const emps = [];
|
|
1133
|
+
const missing = [];
|
|
1134
|
+
for (const n of names) {
|
|
1135
|
+
const userData = await client.post(`${baseUrl}/api/hrm/common/getEmployeeByKeyWords`, {
|
|
1136
|
+
keyword: n, searchType: 1, searchCount: 1, appDetachModule: 'EM', disableAppDetach: 0, pageNo: 1, pageSize: 1,
|
|
1137
|
+
});
|
|
1138
|
+
const emp = userData?.data?.userList?.[0];
|
|
1139
|
+
if (!emp) {
|
|
1140
|
+
missing.push(n);
|
|
1141
|
+
continue;
|
|
1142
|
+
}
|
|
1143
|
+
emps.push(emp);
|
|
1144
|
+
}
|
|
1145
|
+
if (missing.length) {
|
|
1146
|
+
console.error(`未找到人员: ${missing.join(',')}`);
|
|
1147
|
+
process.exit(1);
|
|
1148
|
+
}
|
|
1149
|
+
targetId = emps.map((e) => e.id || '').join(',');
|
|
1150
|
+
targetName = emps.map((e) => e.name || '').join(',');
|
|
1151
|
+
browserDatas = emps.map(mkBrowserData);
|
|
1079
1152
|
groupType = '指定人';
|
|
1080
1153
|
groupTypeId = '101';
|
|
1081
|
-
itemName =
|
|
1082
|
-
browserDatas = [browserData];
|
|
1154
|
+
itemName = targetName;
|
|
1083
1155
|
}
|
|
1084
1156
|
console.error(` 操作者: ${targetName} (${targetId}) 类型: ${groupType}`);
|
|
1085
1157
|
// 2. Get reserveGroupId from layout config
|
|
@@ -1092,11 +1164,16 @@ export function registerWorkflowCommands(program) {
|
|
|
1092
1164
|
'会签': { code: '1', cn: '会签' },
|
|
1093
1165
|
'非会签': { code: '0', cn: '非会签' },
|
|
1094
1166
|
'竞签': { code: '0', cn: '非会签', competeSignOrder: '1', competeSignOrderCN: '竞签' },
|
|
1095
|
-
'依次处理': { code: '2', cn: '
|
|
1167
|
+
'依次处理': { code: '2', cn: '依次逐个处理', executeOrders: '2-2', executeOrdersCN: '人员显示顺序-倒序' },
|
|
1096
1168
|
'抄送': { code: '3', cn: '抄送' },
|
|
1097
1169
|
'抄送需批注': { code: '4', cn: '抄送' },
|
|
1098
1170
|
};
|
|
1099
1171
|
const so = soMap[cmdOpts.signOrder || '会签'] || soMap['会签'];
|
|
1172
|
+
if (cmdOpts.executeOrder) {
|
|
1173
|
+
const EXEC_CN = { '2-2': '人员显示顺序-倒序', '2-1': '人员显示顺序-正序', '1-1': '安全级别-正序', '1-2': '安全级别-倒序', '1-1,2-2': '安全级别-正序,人员显示顺序-倒序', '1-1,2-1': '安全级别-正序,人员显示顺序-正序' };
|
|
1174
|
+
so.executeOrders = cmdOpts.executeOrder;
|
|
1175
|
+
so.executeOrdersCN = EXEC_CN[cmdOpts.executeOrder] || cmdOpts.executeOrder;
|
|
1176
|
+
}
|
|
1100
1177
|
const itemData = {
|
|
1101
1178
|
hrmOperators: targetId,
|
|
1102
1179
|
hrmOperatorsCN: targetName,
|
|
@@ -1414,7 +1491,7 @@ export function registerWorkflowCommands(program) {
|
|
|
1414
1491
|
'1': '审批',
|
|
1415
1492
|
'2': '确认/会签',
|
|
1416
1493
|
'3': '归档',
|
|
1417
|
-
'5': '
|
|
1494
|
+
'5': '投票',
|
|
1418
1495
|
'7': '自动处理',
|
|
1419
1496
|
'8': '等待',
|
|
1420
1497
|
'forkstart': '分流点',
|
|
@@ -1568,6 +1645,7 @@ export function registerWorkflowCommands(program) {
|
|
|
1568
1645
|
.argument('<xml>', '浏览器格式的 XML 或 @文件路径')
|
|
1569
1646
|
.option('--delete-links <ids>', '要删除的连线 ID,逗号分隔')
|
|
1570
1647
|
.option('--delete-nodes <ids>', '要删除的节点 ID,逗号分隔')
|
|
1648
|
+
.option('--chart-src <n>', '图表来源:0=普通流程(默认) / 1=公用流转片段', '0')
|
|
1571
1649
|
.action(async (workflowId, xmlArg, cmdOpts) => {
|
|
1572
1650
|
const opts = program.opts();
|
|
1573
1651
|
const auth = await AuthSession.fromOptions(opts);
|
|
@@ -1592,7 +1670,7 @@ export function registerWorkflowCommands(program) {
|
|
|
1592
1670
|
// 不要转成 node_X/link_X——服务器解析不了会静默失败。直接回传浏览器格式 XML,
|
|
1593
1671
|
// 仅对服务器不存在的 nodeId/linkId(新增节点/连线)注入 flag="add"。
|
|
1594
1672
|
try {
|
|
1595
|
-
const chartData = await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/getXml`, `workflowId=${workflowId}&keepTitle=undefined&showType=0`);
|
|
1673
|
+
const chartData = await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/getXml`, `workflowId=${workflowId}&keepTitle=undefined&showType=0&chartSrc=${cmdOpts.chartSrc}`);
|
|
1596
1674
|
const serverXml = chartData?.data?.xml || '';
|
|
1597
1675
|
if (serverXml) {
|
|
1598
1676
|
const knownNodes = new Set([...serverXml.matchAll(/nodeId="(\d+)"/g)].map(m => m[1]));
|
|
@@ -1614,13 +1692,13 @@ export function registerWorkflowCommands(program) {
|
|
|
1614
1692
|
catch { /* best effort */ }
|
|
1615
1693
|
// Lock the chart for editing (browser does this before save)
|
|
1616
1694
|
try {
|
|
1617
|
-
await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/checkoutHeart`, `workflowId=${workflowId}&chartSrc
|
|
1695
|
+
await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/checkoutHeart`, `workflowId=${workflowId}&chartSrc=${cmdOpts.chartSrc}`);
|
|
1618
1696
|
}
|
|
1619
1697
|
catch { /* best effort */ }
|
|
1620
1698
|
// Base64-encode: standard base64 then replace + with $ (avoids form-decoding + as space)
|
|
1621
1699
|
const xmlB64 = Buffer.from(xml).toString('base64').replace(/\+/g, '$');
|
|
1622
1700
|
// Build form body — server expects unencoded JSON braces
|
|
1623
|
-
const body = `workflowId=${workflowId}&deleteLinks=${cmdOpts.deleteLinks || ''}&deleteNodes=${cmdOpts.deleteNodes || ''}&groups={"col":[],"row":[]}&deleteGroups=&templateKey=0&chartSrc
|
|
1701
|
+
const body = `workflowId=${workflowId}&deleteLinks=${cmdOpts.deleteLinks || ''}&deleteNodes=${cmdOpts.deleteNodes || ''}&groups={"col":[],"row":[]}&deleteGroups=&templateKey=0&chartSrc=${cmdOpts.chartSrc}&showConditionName=false&showLinkName=false&isSaveBySkipLinkValidate=false&xml=${xmlB64}`;
|
|
1624
1702
|
const data = await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/saveLayout`, body);
|
|
1625
1703
|
if (data?.code === 200 && data?.status) {
|
|
1626
1704
|
const msg = opts.json
|