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.
Files changed (82) hide show
  1. package/dist/commands/form-add-detail-table.d.ts +3 -0
  2. package/dist/commands/form-add-detail-table.d.ts.map +1 -0
  3. package/dist/commands/form-add-detail-table.js +153 -0
  4. package/dist/commands/form-add-detail-table.js.map +1 -0
  5. package/dist/commands/form-association.d.ts +3 -0
  6. package/dist/commands/form-association.d.ts.map +1 -0
  7. package/dist/commands/form-association.js +299 -0
  8. package/dist/commands/form-association.js.map +1 -0
  9. package/dist/commands/form-list-filter.d.ts.map +1 -1
  10. package/dist/commands/form-list-filter.js +4 -2
  11. package/dist/commands/form-list-filter.js.map +1 -1
  12. package/dist/commands/form-list-search-group.d.ts.map +1 -1
  13. package/dist/commands/form-list-search-group.js +10 -3
  14. package/dist/commands/form-list-search-group.js.map +1 -1
  15. package/dist/commands/form-list-stats.d.ts.map +1 -1
  16. package/dist/commands/form-list-stats.js +3 -1
  17. package/dist/commands/form-list-stats.js.map +1 -1
  18. package/dist/commands/form-list-utils.d.ts +13 -0
  19. package/dist/commands/form-list-utils.d.ts.map +1 -1
  20. package/dist/commands/form-list-utils.js +87 -17
  21. package/dist/commands/form-list-utils.js.map +1 -1
  22. package/dist/commands/form-list.d.ts.map +1 -1
  23. package/dist/commands/form-list.js +51 -0
  24. package/dist/commands/form-list.js.map +1 -1
  25. package/dist/commands/form-native.d.ts +17 -0
  26. package/dist/commands/form-native.d.ts.map +1 -0
  27. package/dist/commands/form-native.js +136 -0
  28. package/dist/commands/form-native.js.map +1 -0
  29. package/dist/commands/form-permission.d.ts.map +1 -1
  30. package/dist/commands/form-permission.js +8 -1
  31. package/dist/commands/form-permission.js.map +1 -1
  32. package/dist/commands/form.d.ts.map +1 -1
  33. package/dist/commands/form.js +6 -2
  34. package/dist/commands/form.js.map +1 -1
  35. package/dist/commands/matrix.d.ts.map +1 -1
  36. package/dist/commands/matrix.js +8 -6
  37. package/dist/commands/matrix.js.map +1 -1
  38. package/dist/commands/wf-form.d.ts +3 -0
  39. package/dist/commands/wf-form.d.ts.map +1 -0
  40. package/dist/commands/wf-form.js +1002 -0
  41. package/dist/commands/wf-form.js.map +1 -0
  42. package/dist/commands/workflow-condition.d.ts.map +1 -1
  43. package/dist/commands/workflow-condition.js +193 -60
  44. package/dist/commands/workflow-condition.js.map +1 -1
  45. package/dist/commands/workflow-create-workflow.d.ts +3 -0
  46. package/dist/commands/workflow-create-workflow.d.ts.map +1 -0
  47. package/dist/commands/workflow-create-workflow.js +214 -0
  48. package/dist/commands/workflow-create-workflow.js.map +1 -0
  49. package/dist/commands/workflow-node-robot.d.ts +3 -0
  50. package/dist/commands/workflow-node-robot.d.ts.map +1 -0
  51. package/dist/commands/workflow-node-robot.js +180 -0
  52. package/dist/commands/workflow-node-robot.js.map +1 -0
  53. package/dist/commands/workflow-node-validate.js +1 -1
  54. package/dist/commands/workflow-node-validate.js.map +1 -1
  55. package/dist/commands/workflow-node.d.ts.map +1 -1
  56. package/dist/commands/workflow-node.js +171 -9
  57. package/dist/commands/workflow-node.js.map +1 -1
  58. package/dist/commands/workflow-segment.d.ts +3 -0
  59. package/dist/commands/workflow-segment.d.ts.map +1 -0
  60. package/dist/commands/workflow-segment.js +333 -0
  61. package/dist/commands/workflow-segment.js.map +1 -0
  62. package/dist/commands/workflow-subprocess.d.ts +3 -0
  63. package/dist/commands/workflow-subprocess.d.ts.map +1 -0
  64. package/dist/commands/workflow-subprocess.js +496 -0
  65. package/dist/commands/workflow-subprocess.js.map +1 -0
  66. package/dist/commands/workflow.d.ts.map +1 -1
  67. package/dist/commands/workflow.js +134 -56
  68. package/dist/commands/workflow.js.map +1 -1
  69. package/dist/core/lzw.d.ts +16 -0
  70. package/dist/core/lzw.d.ts.map +1 -0
  71. package/dist/core/lzw.js +71 -0
  72. package/dist/core/lzw.js.map +1 -0
  73. package/dist/index.js +16 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/services/condition-rules.d.ts.map +1 -1
  76. package/dist/services/condition-rules.js +83 -30
  77. package/dist/services/condition-rules.js.map +1 -1
  78. package/dist/services/workflow-layout.d.ts +13 -2
  79. package/dist/services/workflow-layout.d.ts.map +1 -1
  80. package/dist/services/workflow-layout.js +73 -27
  81. package/dist/services/workflow-layout.js.map +1 -1
  82. 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
- // Superior type: no keyword needed, fixed fields
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(` 操作者: 发起人上级 (直接上级) 类型: ${groupType}`);
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: false,
534
- openProjectOrganization: false,
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: '直接上级', type: groupType, append: !!cmdOpts.append })
548
- : `${verb}: 发起人上级(直接上级) → 节点 ${nodeId}`;
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
- const signOrder = cmdOpts.signOrder === '或签' ? '2' : '1';
702
- const signOrderCN = cmdOpts.signOrder === '或签' ? '或签' : '会签';
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
- const allFields = [...(formFields?.data?.mainFields || []), ...(formFields?.data?.subFields || [])];
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
- const deptRes = await client.post(`${baseUrl}/api/workflow/pathdef/common/browser/complete/department`, {
788
- browserMultiple: true, virtualType: 'All', showSanYuan: true, newly: 0, searchValue: keyword,
789
- });
790
- const dept = deptRes?.data?.data?.[0];
791
- if (!dept) {
792
- console.error(`未找到部门: ${keyword}`);
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 = dept.name || keyword;
798
- itemData.hrmOperators = dept.id || '';
799
- itemData.hrmOperatorsCN = dept.name || '';
800
- itemData.includeType = '2';
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 = [{ id: dept.id, name: dept.name, _entityType: 'department' }];
805
- console.error(` 操作者: ${dept.name} (${dept.id}) 类型: 指定部门(包含下级)`);
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: '依次处理', executeOrders: '1-1,2-2', executeOrdersCN: '安全级别-正序,人员显示顺序-倒序' },
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 userData = await client.post(`${baseUrl}/api/hrm/common/getEmployeeByKeyWords`, {
1042
- keyword,
1043
- searchType: 1,
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 emp = userData.data.userList[0];
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 = emp.name || '';
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: '依次处理', executeOrders: '1-1,2-2', executeOrdersCN: '安全级别-正序,人员显示顺序-倒序' },
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=0`);
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=0&showConditionName=false&showLinkName=false&isSaveBySkipLinkValidate=false&xml=${xmlB64}`;
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