weaver-e10-builder 1.5.14 → 1.5.15
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/workflow-base-command.d.ts +4 -0
- package/dist/commands/workflow-base-command.d.ts.map +1 -0
- package/dist/commands/workflow-base-command.js +6 -0
- package/dist/commands/workflow-base-command.js.map +1 -0
- package/dist/commands/workflow-base-settings.d.ts.map +1 -1
- package/dist/commands/workflow-base-settings.js +4 -1
- package/dist/commands/workflow-base-settings.js.map +1 -1
- package/dist/commands/workflow-function-settings.d.ts +3 -0
- package/dist/commands/workflow-function-settings.d.ts.map +1 -0
- package/dist/commands/workflow-function-settings.js +47 -0
- package/dist/commands/workflow-function-settings.js.map +1 -0
- package/dist/commands/workflow-setting.d.ts.map +1 -1
- package/dist/commands/workflow-setting.js +137 -406
- package/dist/commands/workflow-setting.js.map +1 -1
- package/dist/services/workflow-function-settings.d.ts +31 -0
- package/dist/services/workflow-function-settings.d.ts.map +1 -0
- package/dist/services/workflow-function-settings.js +191 -0
- package/dist/services/workflow-function-settings.js.map +1 -0
- package/dist/services/workflow-sign-file-settings.d.ts +16 -0
- package/dist/services/workflow-sign-file-settings.d.ts.map +1 -0
- package/dist/services/workflow-sign-file-settings.js +80 -0
- package/dist/services/workflow-sign-file-settings.js.map +1 -0
- package/dist/services/workflow-submit-confirm.d.ts +14 -0
- package/dist/services/workflow-submit-confirm.d.ts.map +1 -0
- package/dist/services/workflow-submit-confirm.js +29 -0
- package/dist/services/workflow-submit-confirm.js.map +1 -0
- package/dist/services/workflow-tab-config.d.ts +3 -3
- package/dist/services/workflow-tab-config.d.ts.map +1 -1
- package/dist/services/workflow-tab-config.js +14 -12
- package/dist/services/workflow-tab-config.js.map +1 -1
- package/dist/services/workflow-tabs-editor.d.ts +28 -0
- package/dist/services/workflow-tabs-editor.d.ts.map +1 -0
- package/dist/services/workflow-tabs-editor.js +130 -0
- package/dist/services/workflow-tabs-editor.js.map +1 -0
- package/package.json +1 -1
- package/skill-docs/SKILL.md +4 -4
- package/skill-docs/_catalog.md +106 -104
- package/skill-docs/references/common/ref-cli-commands.md +16 -10
- package/skill-docs/references/workflow/guide-base-auth-share-remind.md +126 -126
- package/skill-docs/references/workflow/guide-function-settings.md +55 -0
- package/skill-docs/references/workflow/guide-workflow.md +630 -553
|
@@ -1,6 +1,14 @@
|
|
|
1
|
+
import { registerWorkflowFunctionSettings } from './workflow-function-settings.js';
|
|
2
|
+
import { SignFileSettings } from '../services/workflow-sign-file-settings.js';
|
|
3
|
+
import { editTabs, getTabLocales } from '../services/workflow-tabs-editor.js';
|
|
4
|
+
import { readPatch } from './workflow-function-management.js';
|
|
5
|
+
import { findTab } from '../services/workflow-tab-config.js';
|
|
6
|
+
import { SubmitConfirmSettings, showNodeLabels } from '../services/workflow-submit-confirm.js';
|
|
7
|
+
import { normalized } from '../services/workflow-base-settings.js';
|
|
8
|
+
import { workflowBaseCommand } from './workflow-base-command.js';
|
|
1
9
|
import { AuthSession } from '../core/auth.js';
|
|
2
10
|
import { ApiClient } from '../core/client.js';
|
|
3
|
-
import {
|
|
11
|
+
import { getTabConfig, tabLabel, } from '../services/workflow-tab-config.js';
|
|
4
12
|
/**
|
|
5
13
|
* Merge only known keys from source into target, converting boolean to 0/1.
|
|
6
14
|
* This prevents leaking UI-internal fields (layout, items, etc.) to save APIs.
|
|
@@ -16,58 +24,55 @@ function mergeKnown(target, source) {
|
|
|
16
24
|
return result;
|
|
17
25
|
}
|
|
18
26
|
export function registerWorkflowSettingCommands(wf, program) {
|
|
19
|
-
const
|
|
27
|
+
const base = workflowBaseCommand(wf);
|
|
28
|
+
registerWorkflowFunctionSettings(wf, program);
|
|
20
29
|
// ======== submit ========
|
|
21
|
-
|
|
22
|
-
.description('
|
|
30
|
+
base.command('submit-confirm')
|
|
31
|
+
.description('查看/修改流程提交确认设置;先读后合并,保存后回读验证')
|
|
23
32
|
.argument('<workflowId>', '流程 ID')
|
|
24
|
-
.option('--confirm <0|1>', '
|
|
25
|
-
.option('--node-range <n>', '节点范围: 0=全部, 1=选择, 2
|
|
26
|
-
.option('--
|
|
33
|
+
.option('--confirm <0|1>', '提交流程需要确认')
|
|
34
|
+
.option('--node-range <n>', '节点范围: 0=全部, 1=选择, 2=排除;切换全部会清空节点列表')
|
|
35
|
+
.option('--nodes <nodes...>', '替换选择/排除的节点列表;支持节点 ID 或唯一名称,名称含空格请加引号')
|
|
36
|
+
.option('--show-cc <0|1>', '提交确认时显示抄送人')
|
|
37
|
+
.option('--show-way <n>', '发起节点显示方式: 0=所有节点, 1=下一节点, 2=会流转到达的节点')
|
|
27
38
|
.action(async (workflowId, cmdOpts) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
try {
|
|
40
|
+
const opts = program.opts();
|
|
41
|
+
const auth = await AuthSession.fromOptions(opts);
|
|
42
|
+
if (!auth)
|
|
43
|
+
throw Error('无法加载认证');
|
|
44
|
+
const service = new SubmitConfirmSettings(new ApiClient(auth), auth.getBaseUrl());
|
|
45
|
+
const patch = {};
|
|
46
|
+
for (const [option, field] of [['confirm', 'confirm'], ['nodeRange', 'nodeRange'], ['nodes', 'nodeRangeBrowser'], ['showCc', 'showCcOperator'], ['showWay', 'showNodeWay']]) {
|
|
47
|
+
if (cmdOpts[option] !== undefined)
|
|
48
|
+
patch[field] = cmdOpts[option];
|
|
49
|
+
}
|
|
50
|
+
if (Object.keys(patch).length) {
|
|
51
|
+
const result = await service.update(workflowId, patch);
|
|
52
|
+
console.log(opts.json ? JSON.stringify(result, null, 2) : '提交确认设置已保存并回读验证');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const form = normalized(await service.read(workflowId));
|
|
41
56
|
if (opts.json) {
|
|
42
57
|
console.log(JSON.stringify(form, null, 2));
|
|
58
|
+
return;
|
|
43
59
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
return;
|
|
60
|
+
const rangeLabels = { '0': '全部节点', '1': '选择节点', '2': '排除节点' };
|
|
61
|
+
console.log(`提交确认: ${form.confirm ? '开启' : '关闭'}`);
|
|
62
|
+
console.log(`节点范围: ${rangeLabels[form.nodeRange] ?? form.nodeRange}`);
|
|
63
|
+
console.log(`指定节点: ${(form.nodeRangeBrowser ?? []).map((n) => `${n.content ?? n.name ?? n.id}(${n.id})`).join('、') || '无'}`);
|
|
64
|
+
console.log(`显示抄送人: ${form.showCcOperator ? '开启' : '关闭'}`);
|
|
65
|
+
console.log(`显示方式: ${showNodeLabels[String(form.showNodeWay)] ?? form.showNodeWay}`);
|
|
51
66
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
form.nodeRange = cmdOpts.nodeRange;
|
|
56
|
-
if (cmdOpts.showWay)
|
|
57
|
-
form.showNodeWay = cmdOpts.showWay;
|
|
58
|
-
const saveRes = await client.post(`${baseUrl}/api/bs/workflow/pathdef/baseSet/saveSubmitSetForm`, { workflowId, ...form });
|
|
59
|
-
if (saveRes?.code === 200 && saveRes?.status) {
|
|
60
|
-
console.log(opts.json ? JSON.stringify({ success: true, workflowId }) : '提交确认设置已保存');
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
|
|
64
|
-
process.exit(1);
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`操作失败: ${error.message}`);
|
|
69
|
+
process.exitCode = 1;
|
|
65
70
|
}
|
|
66
71
|
});
|
|
67
72
|
// ======== tabs(详情页页签) ========
|
|
68
|
-
// 读接口必须带 global=false,否则 500
|
|
69
|
-
|
|
70
|
-
.description('
|
|
73
|
+
// 读接口必须带 global=false,否则 500;保存提交完整列表以保持排序,删除使用专用接口。
|
|
74
|
+
base.command('tabs-set')
|
|
75
|
+
.description('查看/修改详情页页签:显示、名称、多语言、顺序、自定义地址页签增删改')
|
|
71
76
|
.argument('<workflowId>', '流程 ID')
|
|
72
77
|
.option('--only <names...>', 'PC 端只显示这些页签,其余全部不显示')
|
|
73
78
|
.option('--show <names...>', 'PC 端显示(不动其它)')
|
|
@@ -75,6 +80,15 @@ export function registerWorkflowSettingCommands(wf, program) {
|
|
|
75
80
|
.option('--mobile <names...>', '移动端只显示这些,其余全部不显示(移动端页签与 PC 端独立)')
|
|
76
81
|
.option('--mobile-menu <names...>', '移动端菜单只显示这些,其余全部不显示')
|
|
77
82
|
.option('--default-open <name>', '默认打开哪个页签(单选,其余取消)')
|
|
83
|
+
.option('--tab <id-or-name>', '待修改页签 ID 或唯一名称')
|
|
84
|
+
.option('--name <name>', '自定义名称;空字符串恢复系统名称')
|
|
85
|
+
.option('--order <tabs...>', '完整排序名单,每个页签恰好一次;推荐使用 ID')
|
|
86
|
+
.option('--create', '新增自定义地址页签,需 --name 和 --pc-url')
|
|
87
|
+
.option('--pc-url <url>', 'PC 地址,支持内部路径、http(s) 及字段占位符')
|
|
88
|
+
.option('--mobile-url <url>', '移动地址;空字符串使用 PC 地址')
|
|
89
|
+
.option('--delete <id-or-name>', '删除一个自定义页签;须单独使用')
|
|
90
|
+
.option('--locales <json>', '多语言名称补丁:语言 ID/代码到字符串的 JSON 对象或 @文件;保留其他语言')
|
|
91
|
+
.option('--get-locales', '读取 --tab 页签的多语言名称及可用语言')
|
|
78
92
|
.action(async (workflowId, o) => {
|
|
79
93
|
const opts = program.opts();
|
|
80
94
|
const auth = await AuthSession.fromOptions(opts);
|
|
@@ -83,171 +97,101 @@ export function registerWorkflowSettingCommands(wf, program) {
|
|
|
83
97
|
const client = new ApiClient(auth);
|
|
84
98
|
const baseUrl = auth.getBaseUrl();
|
|
85
99
|
try {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
console.log(`流程 ${workflowId} 详情页页签: ${tabs.length} 个\n`);
|
|
94
|
-
console.log(' 页签 类型码 PC端 移动端 移动菜单 默认打开');
|
|
95
|
-
for (const t of tabs) {
|
|
96
|
-
console.log(` ${tabLabel(t).padEnd(14)} ${String(t.flowPageTabId).padEnd(6)} ` +
|
|
97
|
-
`${(t.showInPc ? '✅' : '⛔').padEnd(5)} ${(t.showInMobile ? '✅' : '⛔').padEnd(7)} ` +
|
|
98
|
-
`${(t.showInMobileMenu ? '✅' : '⛔').padEnd(9)} ${t.defOpen ? '✅' : ''}`);
|
|
99
|
-
}
|
|
100
|
+
if (o.getLocales) {
|
|
101
|
+
if (!o.tab || Object.keys(o).some(k => !['tab', 'getLocales'].includes(k)))
|
|
102
|
+
throw Error('--get-locales 仅与 --tab 一起使用');
|
|
103
|
+
const tabs = await getTabConfig(client, baseUrl, workflowId), t = findTab(tabs, o.tab);
|
|
104
|
+
if (!t)
|
|
105
|
+
throw Error('未找到页签');
|
|
106
|
+
console.log(JSON.stringify(await getTabLocales(client, baseUrl, t.id), null, 2));
|
|
100
107
|
return;
|
|
101
108
|
}
|
|
102
|
-
const {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (!changed.length) {
|
|
107
|
-
console.log('页签本来就是目标状态,没有改动');
|
|
109
|
+
const patch = { ...o, ...(o.locales !== undefined ? { locales: readPatch(o.locales) } : {}) };
|
|
110
|
+
if (Object.keys(patch).some(k => k !== 'tab')) {
|
|
111
|
+
const result = await editTabs(client, baseUrl, workflowId, patch);
|
|
112
|
+
console.log(JSON.stringify(result, null, 2));
|
|
108
113
|
return;
|
|
109
114
|
}
|
|
110
|
-
await
|
|
111
|
-
const after = await getTabConfig(client, baseUrl, workflowId);
|
|
112
|
-
const byId = new Map(after.map((t) => [t.id, t]));
|
|
113
|
-
const mismatches = [];
|
|
114
|
-
for (const t of next) {
|
|
115
|
-
const a = byId.get(t.id);
|
|
116
|
-
if (!a) {
|
|
117
|
-
mismatches.push(`${tabLabel(t)} 回读时不见了`);
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
if (a.showInPc !== t.showInPc || a.defOpen !== t.defOpen
|
|
121
|
-
|| a.showInMobile !== t.showInMobile || a.showInMobileMenu !== t.showInMobileMenu) {
|
|
122
|
-
mismatches.push(`${tabLabel(t)}: 期望 PC=${t.showInPc} 移动=${t.showInMobile} 菜单=${t.showInMobileMenu} 默认打开=${t.defOpen},`
|
|
123
|
-
+ `回读 PC=${a.showInPc} 移动=${a.showInMobile} 菜单=${a.showInMobileMenu} 默认打开=${a.defOpen}`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
115
|
+
const tabs = await getTabConfig(client, baseUrl, workflowId);
|
|
126
116
|
if (opts.json) {
|
|
127
|
-
console.log(JSON.stringify({
|
|
128
|
-
|
|
129
|
-
else {
|
|
130
|
-
console.log(`页签已保存: ${changed.length} 项更新 → 流程 ${workflowId}`);
|
|
131
|
-
for (const m of mismatches)
|
|
132
|
-
console.error(` ⚠ 回读不一致: ${m}`);
|
|
117
|
+
console.log(JSON.stringify({ workflowId, tabs }, null, 2));
|
|
118
|
+
return;
|
|
133
119
|
}
|
|
134
|
-
|
|
135
|
-
|
|
120
|
+
for (const t of tabs)
|
|
121
|
+
console.log(`${t.id} ${tabLabel(t)} 顺序=${t.orderId} 类型=${t.flowPageTabType} PC=${t.showInPc} 移动=${t.showInMobile} 菜单=${t.showInMobileMenu} 默认=${t.defOpen}`);
|
|
136
122
|
}
|
|
137
123
|
catch (e) {
|
|
138
124
|
console.error(`操作失败: ${e.message}`);
|
|
139
125
|
process.exitCode = 1;
|
|
140
126
|
}
|
|
141
127
|
});
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
.
|
|
145
|
-
.
|
|
146
|
-
.option('--show-
|
|
147
|
-
.option('--
|
|
148
|
-
.option('--view-
|
|
149
|
-
.option('--
|
|
150
|
-
.option('--
|
|
151
|
-
.option('--
|
|
152
|
-
.option('--
|
|
153
|
-
.option('--
|
|
154
|
-
.option('--allow-
|
|
155
|
-
.option('--
|
|
156
|
-
.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
allowSignEmoticon: 1,
|
|
202
|
-
allowSignAt: 1,
|
|
203
|
-
informHrmRange: '0',
|
|
204
|
-
signOrder: 0,
|
|
205
|
-
signShowSrcList: [],
|
|
206
|
-
uploadCatalog: '',
|
|
207
|
-
uploadCatalogBrowser: [],
|
|
208
|
-
}, form);
|
|
209
|
-
if (cmdOpts.showOrder)
|
|
210
|
-
payload.signShowOrder = cmdOpts.showOrder;
|
|
211
|
-
if (cmdOpts.showSrc) {
|
|
212
|
-
// Convert to array: "3"→["1","2"], "1,2"→["1","2"], "0"→[], "1"→["1"], "2"→["2"]
|
|
213
|
-
if (cmdOpts.showSrc === '0') {
|
|
214
|
-
payload.signShowSrcList = [];
|
|
215
|
-
}
|
|
216
|
-
else if (cmdOpts.showSrc === '3') {
|
|
217
|
-
payload.signShowSrcList = ['1', '2'];
|
|
128
|
+
// Workflow-level signing and attachment switches; PC/mobile style APIs are excluded.
|
|
129
|
+
const sign = base.command('sign-set').description('签字意见设置(不含 PC/移动显示样式)').argument('<workflowId>', '流程 ID')
|
|
130
|
+
.option('--schema', '显示服务端表单、可选值及默认值')
|
|
131
|
+
.option('--show-order <0|1>', '意见及评论顺序:0倒序/1正序')
|
|
132
|
+
.option('--show-src <n>', '保留原来源参数:0无/1PC/2非PC/3两者')
|
|
133
|
+
.option('--view-relate <0|1>', '允许查看关联流程意见及评论')
|
|
134
|
+
.option('--view-forward <0|1>', '事项分享默认允许查看意见及评论')
|
|
135
|
+
.option('--allow-relate <0|1>', '允许签字意见关联事项')
|
|
136
|
+
.option('--relate-range <0|1>', '关联范围:0全部/1选择范围')
|
|
137
|
+
.option('--candidates <relate|catalog>', '查询关联事项类型或目录候选(首100项/树形根节点)')
|
|
138
|
+
.option('--relate-items <ids...>', '关联事项类型 ID 列表(不是具体流程或实例 ID)')
|
|
139
|
+
.option('--clear-relate-items', '清空已选事项类型,需关联范围为全部')
|
|
140
|
+
.option('--allow-upload <0|1>', '允许签字意见上传附件')
|
|
141
|
+
.option('--upload-catalog <id>', '附件上传目录 ID;0 清空;需环境支持知识管理')
|
|
142
|
+
.option('--allow-location <0|1>', '允许意见及评论插入位置')
|
|
143
|
+
.option('--allow-emoticon <0|1>', '允许意见及评论插入表情')
|
|
144
|
+
.option('--allow-at <0|1>', '允许意见及评论 @ 人员')
|
|
145
|
+
.option('--inform-range <0|1>', '@范围:0所有人/1流程参与人(不含共享人)');
|
|
146
|
+
const file = base.command('file-set').description('附件设置:仅两个删除开关').argument('<workflowId>', '流程 ID')
|
|
147
|
+
.option('--schema', '显示服务端表单及默认值')
|
|
148
|
+
.option('--create-delete <0|1>', '仅发起节点才能删除附件')
|
|
149
|
+
.option('--async-delete <0|1>', '删除流程的同时删除附件');
|
|
150
|
+
for (const [cmd, kind, mapping] of [
|
|
151
|
+
[sign, 'sign', { showOrder: 'signShowOrder', viewRelate: 'viewRelateSign', viewForward: 'viewForwardSign', allowRelate: 'allowSignRelate', relateRange: 'relateRangeSelect', relateItems: 'relateMatterRangeBrowser', allowUpload: 'allowSignUpload', allowLocation: 'allowSignLocation', allowEmoticon: 'allowSignEmoticon', allowAt: 'allowSignAt', informRange: 'informHrmRange' }],
|
|
152
|
+
[file, 'file', { createDelete: 'createDelete', asyncDelete: 'asyncDelete' }]
|
|
153
|
+
])
|
|
154
|
+
cmd.action(async (w, o) => {
|
|
155
|
+
try {
|
|
156
|
+
const auth = await AuthSession.fromOptions(program.opts());
|
|
157
|
+
if (!auth)
|
|
158
|
+
throw Error('无法加载认证');
|
|
159
|
+
const service = new SignFileSettings(new ApiClient(auth), auth.getBaseUrl()), patch = {};
|
|
160
|
+
for (const [flag, key] of Object.entries(mapping))
|
|
161
|
+
if (o[flag] !== undefined)
|
|
162
|
+
patch[key] = o[flag];
|
|
163
|
+
if (o.candidates !== undefined) {
|
|
164
|
+
if (!['relate', 'catalog'].includes(o.candidates) || Object.keys(o).some(k => k !== 'candidates'))
|
|
165
|
+
throw Error('--candidates 须单独使用 relate 或 catalog');
|
|
166
|
+
console.log(JSON.stringify(await service.candidates(w, o.candidates === 'relate' ? 'relateMatterRangeBrowser' : 'uploadCatalogBrowser'), null, 2));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (o.showSrc !== undefined) {
|
|
170
|
+
if (!['0', '1', '2', '3', '1,2'].includes(o.showSrc))
|
|
171
|
+
throw Error('无效 --show-src');
|
|
172
|
+
patch.signShowSrcList = o.showSrc === '0' ? [] : ['3', '1,2'].includes(o.showSrc) ? ['1', '2'] : [o.showSrc];
|
|
173
|
+
}
|
|
174
|
+
if (o.clearRelateItems) {
|
|
175
|
+
if (o.relateItems)
|
|
176
|
+
throw Error('--clear-relate-items 与 --relate-items 互斥');
|
|
177
|
+
patch.relateMatterRangeBrowser = [];
|
|
178
|
+
}
|
|
179
|
+
if (o.uploadCatalog !== undefined)
|
|
180
|
+
patch.uploadCatalogBrowser = o.uploadCatalog === '0' ? [] : [o.uploadCatalog];
|
|
181
|
+
if (Object.keys(patch).length)
|
|
182
|
+
console.log(JSON.stringify(await service.updateSettings(kind, w, patch), null, 2));
|
|
183
|
+
else {
|
|
184
|
+
const form = await service.readSettings(kind, w);
|
|
185
|
+
console.log(JSON.stringify(o.schema ? { settings: normalized(form), form } : normalized(form), null, 2));
|
|
186
|
+
}
|
|
218
187
|
}
|
|
219
|
-
|
|
220
|
-
|
|
188
|
+
catch (e) {
|
|
189
|
+
console.error(`操作失败: ${e.message}`);
|
|
190
|
+
process.exitCode = 1;
|
|
221
191
|
}
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
if (cmdOpts.viewRelate)
|
|
225
|
-
payload.viewRelateSign = parseInt(cmdOpts.viewRelate, 10);
|
|
226
|
-
if (cmdOpts.viewForward)
|
|
227
|
-
payload.viewForwardSign = parseInt(cmdOpts.viewForward, 10);
|
|
228
|
-
if (cmdOpts.allowRelate)
|
|
229
|
-
payload.allowSignRelate = parseInt(cmdOpts.allowRelate, 10);
|
|
230
|
-
if (cmdOpts.allowUpload)
|
|
231
|
-
payload.allowSignUpload = parseInt(cmdOpts.allowUpload, 10);
|
|
232
|
-
if (cmdOpts.allowLocation)
|
|
233
|
-
payload.allowSignLocation = parseInt(cmdOpts.allowLocation, 10);
|
|
234
|
-
if (cmdOpts.allowEmoticon)
|
|
235
|
-
payload.allowSignEmoticon = parseInt(cmdOpts.allowEmoticon, 10);
|
|
236
|
-
if (cmdOpts.allowAt)
|
|
237
|
-
payload.allowSignAt = parseInt(cmdOpts.allowAt, 10);
|
|
238
|
-
if (cmdOpts.informRange)
|
|
239
|
-
payload.informHrmRange = cmdOpts.informRange;
|
|
240
|
-
const saveRes = await client.post(`${baseUrl}/api/bs/workflow/pathdef/pathSet/signconfig/savePathSignConfig`, payload);
|
|
241
|
-
if (saveRes?.code === 200 && saveRes?.status) {
|
|
242
|
-
console.log(opts.json ? JSON.stringify({ success: true, workflowId }) : '签字意见设置已保存');
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
|
|
246
|
-
process.exit(1);
|
|
247
|
-
}
|
|
248
|
-
});
|
|
192
|
+
});
|
|
249
193
|
// ======== comment ========
|
|
250
|
-
|
|
194
|
+
base.command('comment-set')
|
|
251
195
|
.description('查看/配置评论设置')
|
|
252
196
|
.argument('<workflowId>', '流程 ID')
|
|
253
197
|
.option('--enable <0|1>', '评论功能开关')
|
|
@@ -299,218 +243,5 @@ export function registerWorkflowSettingCommands(wf, program) {
|
|
|
299
243
|
process.exit(1);
|
|
300
244
|
}
|
|
301
245
|
});
|
|
302
|
-
// ======== batch ========
|
|
303
|
-
sc.command('batch')
|
|
304
|
-
.description('查看/配置批量操作设置')
|
|
305
|
-
.argument('<workflowId>', '流程 ID')
|
|
306
|
-
.option('--enable-batch <0|1>', '批量提交开关')
|
|
307
|
-
.option('--enable-turn-todo <0|1>', '批量转办开关')
|
|
308
|
-
.option('--enable-consult <0|1>', '批量征询开关')
|
|
309
|
-
.option('--enable-reject <0|1>', '批量退回开关')
|
|
310
|
-
.option('--range <n>', '节点范围: 0=全部, 1=选择, 2=排除')
|
|
311
|
-
.action(async (workflowId, cmdOpts) => {
|
|
312
|
-
const opts = program.opts();
|
|
313
|
-
const auth = await AuthSession.fromOptions(opts);
|
|
314
|
-
if (!auth)
|
|
315
|
-
process.exit(1);
|
|
316
|
-
const client = new ApiClient(auth);
|
|
317
|
-
const baseUrl = auth.getBaseUrl();
|
|
318
|
-
const getRes = await client.get(`${baseUrl}/api/bs/workflow/pathdef/batchSubmitSet/getConfigForm?workflowId=${workflowId}`);
|
|
319
|
-
if (getRes?.code !== 200 || !getRes?.status) {
|
|
320
|
-
console.error(`查询失败: ${getRes?.msg}`);
|
|
321
|
-
process.exit(1);
|
|
322
|
-
}
|
|
323
|
-
const form = getRes?.data?.data || getRes?.data || {};
|
|
324
|
-
const hasOpts = cmdOpts.enableBatch || cmdOpts.enableTurnTodo || cmdOpts.enableConsult || cmdOpts.enableReject || cmdOpts.range;
|
|
325
|
-
if (!hasOpts) {
|
|
326
|
-
if (opts.json) {
|
|
327
|
-
console.log(JSON.stringify(form, null, 2));
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
const on = (v) => v === '1' || v === 1 || v === true ? '✅' : '⛔';
|
|
331
|
-
console.log(`批量提交: ${on(form.enabledBatch)} 转办: ${on(form.allowTurnTodo)} 征询: ${on(form.allowConsult)} 退回: ${on(form.allowReject)}`);
|
|
332
|
-
}
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
// Normalize GET values (booleans→int, arrays→scalar) for save API
|
|
336
|
-
const norm = (v) => typeof v === 'boolean' ? (v ? 1 : 0) : (Array.isArray(v) && v.length === 1 ? v[0] : v);
|
|
337
|
-
const payload = mergeKnown({
|
|
338
|
-
workflowId,
|
|
339
|
-
enabledBatch: 0,
|
|
340
|
-
allowTurnTodo: 0,
|
|
341
|
-
allowConsult: 0,
|
|
342
|
-
allowReject: 0,
|
|
343
|
-
rejectOption: '0',
|
|
344
|
-
rejectNodeBrowser: [],
|
|
345
|
-
turnTodoNodeBrowser: [],
|
|
346
|
-
consultNodeBrowser: [],
|
|
347
|
-
submitType: [],
|
|
348
|
-
selectOptions: '0',
|
|
349
|
-
turnTodoOption: '0',
|
|
350
|
-
selectNodes: [],
|
|
351
|
-
submitTypeOption: '0',
|
|
352
|
-
consultOption: '0',
|
|
353
|
-
rejectToStart: [],
|
|
354
|
-
}, form);
|
|
355
|
-
const normPayload = {};
|
|
356
|
-
for (const [k, v] of Object.entries(payload)) {
|
|
357
|
-
normPayload[k] = norm(v);
|
|
358
|
-
}
|
|
359
|
-
if (cmdOpts.enableBatch)
|
|
360
|
-
normPayload.enabledBatch = parseInt(cmdOpts.enableBatch, 10);
|
|
361
|
-
if (cmdOpts.enableTurnTodo)
|
|
362
|
-
normPayload.allowTurnTodo = parseInt(cmdOpts.enableTurnTodo, 10);
|
|
363
|
-
if (cmdOpts.enableConsult)
|
|
364
|
-
normPayload.allowConsult = parseInt(cmdOpts.enableConsult, 10);
|
|
365
|
-
if (cmdOpts.enableReject)
|
|
366
|
-
normPayload.allowReject = parseInt(cmdOpts.enableReject, 10);
|
|
367
|
-
if (cmdOpts.range) {
|
|
368
|
-
normPayload.rangeType = cmdOpts.range;
|
|
369
|
-
normPayload.nodeRangeType = cmdOpts.range;
|
|
370
|
-
}
|
|
371
|
-
const saveRes = await client.post(`${baseUrl}/api/bs/workflow/pathdef/batchSubmitSet/saveConfig`, normPayload);
|
|
372
|
-
if (saveRes?.code === 200 && saveRes?.status) {
|
|
373
|
-
console.log(opts.json ? JSON.stringify({ success: true, workflowId }) : '批量操作设置已保存');
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
|
|
377
|
-
process.exit(1);
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
// ======== auto ========
|
|
381
|
-
sc.command('auto')
|
|
382
|
-
.description('查看/配置自动处理设置')
|
|
383
|
-
.argument('<workflowId>', '流程 ID')
|
|
384
|
-
.option('--enable <0|1>', '自动处理开关')
|
|
385
|
-
.option('--way <n>', '处理方式: 0=前置, 1=后置')
|
|
386
|
-
.option('--follow-type <types>', '跟进类型(逗号分隔): 0=不启用, 1=发起过, 2=批准过, 3=确认过')
|
|
387
|
-
.action(async (workflowId, cmdOpts) => {
|
|
388
|
-
const opts = program.opts();
|
|
389
|
-
const auth = await AuthSession.fromOptions(opts);
|
|
390
|
-
if (!auth)
|
|
391
|
-
process.exit(1);
|
|
392
|
-
const client = new ApiClient(auth);
|
|
393
|
-
const baseUrl = auth.getBaseUrl();
|
|
394
|
-
const getRes = await client.get(`${baseUrl}/api/bs/workflow/pathdef/autoApprove/getAutoInfoForm?src=&workflowId=${workflowId}`);
|
|
395
|
-
if (getRes?.code !== 200 || !getRes?.status) {
|
|
396
|
-
console.error(`查询失败: ${getRes?.msg || getRes?.data?.msg}`);
|
|
397
|
-
process.exit(1);
|
|
398
|
-
}
|
|
399
|
-
const form = getRes?.data?.data || getRes?.data || {};
|
|
400
|
-
if (!cmdOpts.enable && !cmdOpts.way && !cmdOpts.followType) {
|
|
401
|
-
if (opts.json) {
|
|
402
|
-
console.log(JSON.stringify(form, null, 2));
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
const on = form.autoHandle === '1' || form.autoHandle === 1 || form.autoHandle === true;
|
|
406
|
-
console.log(`自动处理: ${on ? '✅ 开启' : '⛔ 关闭'}`);
|
|
407
|
-
console.log(`处理方式: ${form.handWay === '1' ? '后置' : '前置'}`);
|
|
408
|
-
console.log(`跟进类型: ${form.followUpType || '[]'}`);
|
|
409
|
-
}
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
const payload = mergeKnown({
|
|
413
|
-
workflowId,
|
|
414
|
-
autoHandle: 0,
|
|
415
|
-
handWay: '0',
|
|
416
|
-
adjacentCheck: ['0'],
|
|
417
|
-
adjacentOptions: '0',
|
|
418
|
-
adjacentNodes: [],
|
|
419
|
-
followUpType: ['0'],
|
|
420
|
-
followUpCommit: 'false',
|
|
421
|
-
followUpCheck: [],
|
|
422
|
-
followUpOptions: '0',
|
|
423
|
-
followUpNodes: [],
|
|
424
|
-
selectUsers: [],
|
|
425
|
-
backHandle: [],
|
|
426
|
-
mustHandNodeBrowser: [],
|
|
427
|
-
allowHandleUserBrowser: [],
|
|
428
|
-
backHandleForecastNodeBrowser: [],
|
|
429
|
-
compensateTip: 1,
|
|
430
|
-
signMark: 0,
|
|
431
|
-
signContent: '',
|
|
432
|
-
}, form);
|
|
433
|
-
// Normalize: GET returns arrays for these but save API expects scalar strings
|
|
434
|
-
if (Array.isArray(payload.adjacentOptions))
|
|
435
|
-
payload.adjacentOptions = payload.adjacentOptions[0] || '0';
|
|
436
|
-
if (Array.isArray(payload.followUpOptions))
|
|
437
|
-
payload.followUpOptions = payload.followUpOptions[0] || '0';
|
|
438
|
-
if (cmdOpts.enable)
|
|
439
|
-
payload.autoHandle = parseInt(cmdOpts.enable, 10);
|
|
440
|
-
if (cmdOpts.way)
|
|
441
|
-
payload.handWay = cmdOpts.way;
|
|
442
|
-
if (cmdOpts.followType)
|
|
443
|
-
payload.followUpType = cmdOpts.followType.split(',');
|
|
444
|
-
const saveRes = await client.post(`${baseUrl}/api/bs/workflow/pathdef/autoApprove/saveConfig`, payload);
|
|
445
|
-
if (saveRes?.code === 200 && saveRes?.status) {
|
|
446
|
-
console.log(opts.json ? JSON.stringify({ success: true, workflowId }) : '自动处理设置已保存');
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
|
|
450
|
-
process.exit(1);
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
// ======== other ========
|
|
454
|
-
sc.command('other')
|
|
455
|
-
.description('查看/配置其他设置')
|
|
456
|
-
.argument('<workflowId>', '流程 ID')
|
|
457
|
-
.option('--message-op <0|1>', '消息操作开关')
|
|
458
|
-
.option('--auto-save <0|1>', '自动保存草稿开关')
|
|
459
|
-
.option('--switch-identity <0|1>', '允许切换身份查看开关')
|
|
460
|
-
.action(async (workflowId, cmdOpts) => {
|
|
461
|
-
const opts = program.opts();
|
|
462
|
-
const auth = await AuthSession.fromOptions(opts);
|
|
463
|
-
if (!auth)
|
|
464
|
-
process.exit(1);
|
|
465
|
-
const client = new ApiClient(auth);
|
|
466
|
-
const baseUrl = auth.getBaseUrl();
|
|
467
|
-
const getRes = await client.get(`${baseUrl}/api/bs/workflow/pathdef/baseExtSet/getConfigForm?workflowId=${workflowId}`);
|
|
468
|
-
if (getRes?.code !== 200 || !getRes?.status) {
|
|
469
|
-
console.error(`查询失败: ${getRes?.msg || getRes?.data?.msg}`);
|
|
470
|
-
process.exit(1);
|
|
471
|
-
}
|
|
472
|
-
const form = getRes?.data?.data || getRes?.data || {};
|
|
473
|
-
if (!cmdOpts.messageOp && !cmdOpts.autoSave && !cmdOpts.switchIdentity) {
|
|
474
|
-
if (opts.json) {
|
|
475
|
-
console.log(JSON.stringify(form, null, 2));
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
const on = (v) => v === '1' || v === 1 || v === true ? '✅' : '⛔';
|
|
479
|
-
console.log(`消息操作: ${on(form.messageOperation)} 自动保存: ${on(form.enableAutoSave)} 切换身份: ${on(form.followNodeviewRight)}`);
|
|
480
|
-
}
|
|
481
|
-
return;
|
|
482
|
-
}
|
|
483
|
-
const payload = mergeKnown({
|
|
484
|
-
workflowId,
|
|
485
|
-
followNodeviewRight: 0,
|
|
486
|
-
allowViewFormLog: 0,
|
|
487
|
-
allowUseInDoor: 1,
|
|
488
|
-
messageOperation: 0,
|
|
489
|
-
nodeRangeOptions: '0',
|
|
490
|
-
nodeRangeNodes: [],
|
|
491
|
-
autoMaxDisplay: 1,
|
|
492
|
-
enableOdocText: 0,
|
|
493
|
-
enableAutoSave: 0,
|
|
494
|
-
autoSaveRangeType: '0',
|
|
495
|
-
autoSaveRangeMultiBrowser: [],
|
|
496
|
-
markChangedFieldScene: '',
|
|
497
|
-
markFieldRange: '0',
|
|
498
|
-
markFieldKeyBrowserValue: [],
|
|
499
|
-
}, form);
|
|
500
|
-
if (cmdOpts.messageOp)
|
|
501
|
-
payload.messageOperation = parseInt(cmdOpts.messageOp, 10);
|
|
502
|
-
if (cmdOpts.autoSave)
|
|
503
|
-
payload.enableAutoSave = parseInt(cmdOpts.autoSave, 10);
|
|
504
|
-
if (cmdOpts.switchIdentity)
|
|
505
|
-
payload.followNodeviewRight = parseInt(cmdOpts.switchIdentity, 10);
|
|
506
|
-
const saveRes = await client.post(`${baseUrl}/api/bs/workflow/pathdef/baseExtSet/saveConfig`, payload);
|
|
507
|
-
if (saveRes?.code === 200 && saveRes?.status) {
|
|
508
|
-
console.log(opts.json ? JSON.stringify({ success: true, workflowId }) : '其他设置已保存');
|
|
509
|
-
}
|
|
510
|
-
else {
|
|
511
|
-
console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
|
|
512
|
-
process.exit(1);
|
|
513
|
-
}
|
|
514
|
-
});
|
|
515
246
|
}
|
|
516
247
|
//# sourceMappingURL=workflow-setting.js.map
|