@steedos-labs/plugin-workflow 3.0.22 → 3.0.24
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/APPROVAL_COMMENTS_OPERATIONS.md +673 -0
- package/APPROVAL_COMMENTS_UPGRADE.md +854 -0
- package/main/default/manager/uuflow_manager.js +66 -7
- package/main/default/pages/instance_tasks_detail.page.amis.json +16 -0
- package/main/default/routes/api_files.router.js +15 -1
- package/main/default/routes/flow_form_design.ejs +18 -0
- package/main/default/triggers/amis_form_design.trigger.js +4 -1
- package/main/default/utils/designerManager.js +1 -2
- package/package.json +1 -1
- package/src/rests/approvalCommentsConsole.js +460 -0
- package/src/rests/index.js +5 -1
- package/src/rests/integrationTestApprovalComments.js +96 -0
- package/src/rests/migrateApprovalCommentsField.js +536 -0
- package/src/rests/rollbackApprovalCommentsField.js +319 -0
|
@@ -0,0 +1,673 @@
|
|
|
1
|
+
# 审批意见栏字段升级 - 运维操作手册
|
|
2
|
+
|
|
3
|
+
**版本**: v2.0
|
|
4
|
+
**目标读者**: 系统运维人员
|
|
5
|
+
**风险等级**: 中等(可完全回滚)
|
|
6
|
+
**预计耗时**: 测试环境 30-60 分钟,生产环境 15-30 分钟
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 📑 目录
|
|
11
|
+
|
|
12
|
+
1. [升级概述](#一升级概述)
|
|
13
|
+
2. [前置条件](#二前置条件)
|
|
14
|
+
3. [测试环境验证](#三测试环境验证)
|
|
15
|
+
4. [生产环境执行](#四生产环境执行)
|
|
16
|
+
5. [回滚方案](#五回滚方案)
|
|
17
|
+
6. [验证检查清单](#六验证检查清单)
|
|
18
|
+
7. [常见问题](#七常见问题)
|
|
19
|
+
8. [附录](#八附录)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 一、升级概述
|
|
24
|
+
|
|
25
|
+
### 1.1 升级目的
|
|
26
|
+
|
|
27
|
+
将老版本审批意见栏字段的非标准配置(如 `{traces.审批}`、`{yijianlan:{step:'审核'}}`)转换为结构化的 `config` 对象格式。
|
|
28
|
+
|
|
29
|
+
### 1.2 升级影响范围
|
|
30
|
+
|
|
31
|
+
| 项目 | 影响说明 |
|
|
32
|
+
|------|---------|
|
|
33
|
+
| **数据库集合** | `forms` 集合(表单定义) |
|
|
34
|
+
| **处理范围** | 仅处理 `state: 'enabled'` 的表单 |
|
|
35
|
+
| **不影响** | ① 已提交的申请单(`instances` 集合)<br>② 流程定义(`flows` 集合)<br>③ 禁用状态的表单 |
|
|
36
|
+
| **可回滚性** | ✅ 完全可回滚 |
|
|
37
|
+
|
|
38
|
+
### 1.3 核心转换规则
|
|
39
|
+
|
|
40
|
+
#### 场景1: 简单 traces 模式
|
|
41
|
+
```json
|
|
42
|
+
// 转换前
|
|
43
|
+
{
|
|
44
|
+
"type": "input",
|
|
45
|
+
"formula": "{traces.部门审批}"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// 转换后
|
|
49
|
+
{
|
|
50
|
+
"type": "steedos-field",
|
|
51
|
+
"__approval_comments_transformed": true,
|
|
52
|
+
"__approval_comments_original_type": "input",
|
|
53
|
+
"__approval_comments_original_formula": "{traces.部门审批}",
|
|
54
|
+
"config": {
|
|
55
|
+
"type": "approval_comments",
|
|
56
|
+
"label": "部门审批意见",
|
|
57
|
+
"name": "部门审批意见",
|
|
58
|
+
"object": "",
|
|
59
|
+
"steps": [{
|
|
60
|
+
"name": "部门审批",
|
|
61
|
+
"show_cc": true,
|
|
62
|
+
"show_handler": true,
|
|
63
|
+
"show_image_sign": false
|
|
64
|
+
}]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 场景2: signature.traces 模式(带签章)
|
|
70
|
+
```json
|
|
71
|
+
// 转换前
|
|
72
|
+
{
|
|
73
|
+
"type": "textarea",
|
|
74
|
+
"default_value": "${signature.traces.技术审核}"
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 转换后
|
|
78
|
+
{
|
|
79
|
+
"type": "steedos-field",
|
|
80
|
+
"__approval_comments_transformed": true,
|
|
81
|
+
"__approval_comments_original_type": "textarea",
|
|
82
|
+
"__approval_comments_original_default_value": "${signature.traces.技术审核}",
|
|
83
|
+
"config": {
|
|
84
|
+
"type": "approval_comments",
|
|
85
|
+
"steps": [{
|
|
86
|
+
"name": "技术审核",
|
|
87
|
+
"show_cc": true,
|
|
88
|
+
"show_handler": true,
|
|
89
|
+
"show_image_sign": true // signature 前缀自动启用
|
|
90
|
+
}]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### 场景3: yijianlan 复杂配置
|
|
96
|
+
```json
|
|
97
|
+
// 转换前
|
|
98
|
+
{
|
|
99
|
+
"type": "input",
|
|
100
|
+
"formula": "{yijianlan:{step:'财务审批',only_cc:true,default:'已审核'}}"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 转换后
|
|
104
|
+
{
|
|
105
|
+
"type": "steedos-field",
|
|
106
|
+
"__approval_comments_transformed": true,
|
|
107
|
+
"__approval_comments_original_type": "input",
|
|
108
|
+
"__approval_comments_original_formula": "{yijianlan:{step:'财务审批',only_cc:true,default:'已审核'}}",
|
|
109
|
+
"config": {
|
|
110
|
+
"type": "approval_comments",
|
|
111
|
+
"steps": [{
|
|
112
|
+
"name": "财务审批",
|
|
113
|
+
"show_cc": true,
|
|
114
|
+
"show_handler": false, // only_cc 逻辑
|
|
115
|
+
"show_image_sign": false,
|
|
116
|
+
"default": "已审核"
|
|
117
|
+
}]
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### 场景4: AMIS Schema 转换
|
|
123
|
+
```json
|
|
124
|
+
// amis_schema 字符串内的节点转换
|
|
125
|
+
// 转换前
|
|
126
|
+
{
|
|
127
|
+
"type": "input-text",
|
|
128
|
+
"label": "审批意见",
|
|
129
|
+
"value": "${signature.traces.总经理审批}",
|
|
130
|
+
"id": "u:abc123"
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 转换后
|
|
134
|
+
{
|
|
135
|
+
"type": "sfield-approvalcomments", // 注意:AMIS 用不同的 type
|
|
136
|
+
"label": "审批意见",
|
|
137
|
+
"__approval_comments_original_type": "input-text",
|
|
138
|
+
"config": {
|
|
139
|
+
"type": "approval_comments",
|
|
140
|
+
"steps": [{ "name": "总经理审批", ... }]
|
|
141
|
+
},
|
|
142
|
+
"id": "u:abc123"
|
|
143
|
+
// value 属性已移除
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 二、前置条件
|
|
150
|
+
|
|
151
|
+
### 2.1 权限要求
|
|
152
|
+
|
|
153
|
+
- ✅ 数据库管理员权限
|
|
154
|
+
- ✅ 应用管理员账号
|
|
155
|
+
- ✅ API 接口访问权限
|
|
156
|
+
|
|
157
|
+
### 2.2 数据库备份(🔴 必须执行)
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 1. 完整备份
|
|
161
|
+
mongodump --host=<host> --port=<port> --db=<database> --out=/backup/$(date +%Y%m%d_%H%M%S)
|
|
162
|
+
|
|
163
|
+
# 2. 额外备份 forms 集合
|
|
164
|
+
mongoexport --host=<host> --port=<port> --db=<database> --collection=forms --out=/backup/forms_backup.json
|
|
165
|
+
|
|
166
|
+
# 3. 验证备份完整性
|
|
167
|
+
ls -lh /backup/
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**⚠️ 关键**: 没有备份,不允许执行升级操作!
|
|
171
|
+
|
|
172
|
+
### 2.3 记录当前状态
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# 记录表单数量
|
|
176
|
+
mongo <database> --eval "db.forms.countDocuments({state: 'enabled'})"
|
|
177
|
+
|
|
178
|
+
# 导出样本数据
|
|
179
|
+
mongo <database> --eval "db.forms.find({state: 'enabled'}).limit(1).pretty()" > /tmp/sample_before.json
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 三、测试环境验证
|
|
185
|
+
|
|
186
|
+
### 3.1 测试数据准备
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 方案A: 从生产库复制测试数据
|
|
190
|
+
mongorestore --host=<test_host> --db=<test_db> /backup/forms_backup.json
|
|
191
|
+
|
|
192
|
+
# 方案B: 仅复制包含签字字段的表单
|
|
193
|
+
mongoexport --host=<prod_host> --db=<prod_db> --collection=forms \
|
|
194
|
+
--query='{"$or":[{"current.fields.formula":{"$regex":"traces|yijianlan"}},{"amis_schema":{"$regex":"signature.traces"}}]}' \
|
|
195
|
+
--out=/tmp/signature_forms.json
|
|
196
|
+
mongoimport --host=<test_host> --db=<test_db> --collection=forms --file=/tmp/signature_forms.json
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 3.2 执行升级(干跑模式)
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# 干跑测试(不修改数据)
|
|
203
|
+
curl "http://<test_server>/api/workflow/migrateApprovalCommentsField?dryRun=true"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**检查返回结果**:
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"dryRun": true,
|
|
210
|
+
"totalForms": 150,
|
|
211
|
+
"totalFields": 230,
|
|
212
|
+
"errors": []
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 3.3 执行真实升级
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# 实际执行升级
|
|
220
|
+
curl "http://<test_server>/api/workflow/migrateApprovalCommentsField"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**预期结果**: `{ "totalForms": 150, "totalFields": 230, "errors": [] }`
|
|
224
|
+
|
|
225
|
+
### 3.4 验证升级结果
|
|
226
|
+
|
|
227
|
+
#### 验证 1: 数据库层面
|
|
228
|
+
```javascript
|
|
229
|
+
// 检查转换后的字段
|
|
230
|
+
db.forms.findOne(
|
|
231
|
+
{"current.fields.__approval_comments_transformed": true},
|
|
232
|
+
{"current.fields.$": 1}
|
|
233
|
+
).pretty()
|
|
234
|
+
|
|
235
|
+
// 应包含:
|
|
236
|
+
// - type: "steedos-field"
|
|
237
|
+
// - __approval_comments_transformed: true
|
|
238
|
+
// - __approval_comments_original_type: "input"
|
|
239
|
+
// - __approval_comments_original_formula: "{traces.xxx}"
|
|
240
|
+
// - config.type: "approval_comments"
|
|
241
|
+
// - config.steps: [...]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
#### 验证 2: 应用层面
|
|
245
|
+
1. 登录审批王系统
|
|
246
|
+
2. 打开任一包含签字字段的表单
|
|
247
|
+
3. 发起新申请
|
|
248
|
+
4. **预期**: 审批意见栏正常显示,功能正常
|
|
249
|
+
|
|
250
|
+
#### 验证 3: 设计器场景(重要!)
|
|
251
|
+
```
|
|
252
|
+
操作步骤:
|
|
253
|
+
1. 选择一个已升级的表单
|
|
254
|
+
2. 打开表单设计器 (/api/workflow/form_design?fid=<表单ID>)
|
|
255
|
+
3. 查看签字字段的配置
|
|
256
|
+
|
|
257
|
+
预期结果:
|
|
258
|
+
- 设计器中字段显示为 "sfield-approvalcomments" 类型
|
|
259
|
+
- 配置完整(type, label, name, config, id 等属性都存在)
|
|
260
|
+
- 保存后不会丢失配置
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**特殊场景: 没有 amis_schema 的表单**
|
|
264
|
+
```
|
|
265
|
+
操作步骤:
|
|
266
|
+
1. 找一个数据库中没有 amis_schema 属性的表单
|
|
267
|
+
2. 先执行升级接口(转换 current.fields)
|
|
268
|
+
3. 再打开表单设计器
|
|
269
|
+
|
|
270
|
+
预期结果:
|
|
271
|
+
- 设计器自动生成 amis_schema
|
|
272
|
+
- 生成的 amis_schema 中签字字段格式正确(sfield-approvalcomments)
|
|
273
|
+
- 所有属性完整,无数据丢失
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 3.5 执行回滚测试(🔴 必须测试)
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# 执行回滚
|
|
280
|
+
curl "http://<test_server>/api/workflow/rollbackApprovalCommentsField"
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**验证回滚结果**:
|
|
284
|
+
```javascript
|
|
285
|
+
// 检查字段已还原
|
|
286
|
+
db.forms.findOne(
|
|
287
|
+
{"name": "测试表单"},
|
|
288
|
+
{"current.fields": 1}
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
// 应该:
|
|
292
|
+
// - type 恢复为原始值(如 "input", "textarea")
|
|
293
|
+
// - formula 或 default_value 恢复
|
|
294
|
+
// - 所有 __approval_comments_* 备份属性已清除
|
|
295
|
+
// - config 属性已移除
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**⚠️ 重要**: 如果回滚测试失败,不允许在生产环境执行!
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 四、生产环境执行
|
|
303
|
+
|
|
304
|
+
### 4.1 执行前检查清单
|
|
305
|
+
|
|
306
|
+
- [ ] 测试环境验证通过
|
|
307
|
+
- [ ] 回滚测试通过
|
|
308
|
+
- [ ] 生产数据库已完整备份
|
|
309
|
+
- [ ] 已通知相关业务人员暂停申请提交(可选)
|
|
310
|
+
- [ ] 确认当前时间符合维护窗口
|
|
311
|
+
|
|
312
|
+
### 4.2 执行升级
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# Step 1: 最后一次备份
|
|
316
|
+
mongodump --host=<prod_host> --db=<prod_db> --out=/backup/final_$(date +%Y%m%d_%H%M%S)
|
|
317
|
+
|
|
318
|
+
# Step 2: 执行升级
|
|
319
|
+
curl "http://<prod_server>/api/workflow/migrateApprovalCommentsField"
|
|
320
|
+
|
|
321
|
+
# Step 3: 记录执行时间和结果
|
|
322
|
+
echo "升级执行时间: $(date)" >> /tmp/upgrade_log.txt
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**执行时长估算**:
|
|
326
|
+
- 500 个表单 ≈ 2-3 分钟
|
|
327
|
+
- 2000 个表单 ≈ 5-8 分钟
|
|
328
|
+
|
|
329
|
+
### 4.3 快速验证(5分钟内完成)
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
# 1. 检查转换数量
|
|
333
|
+
mongo <prod_db> --eval "db.forms.countDocuments({'current.fields.__approval_comments_transformed': true})"
|
|
334
|
+
|
|
335
|
+
# 2. 抽查样本
|
|
336
|
+
mongo <prod_db> --eval "db.forms.findOne({'current.fields.__approval_comments_transformed': true}, {'current.fields.$': 1}).pretty()"
|
|
337
|
+
|
|
338
|
+
# 3. 检查错误
|
|
339
|
+
# 如果返回结果中 errors 数组不为空,立即查看错误详情
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### 4.4 应用验证(10分钟内完成)
|
|
343
|
+
|
|
344
|
+
1. 登录审批王
|
|
345
|
+
2. 发起一个新申请(选择包含签字字段的表单)
|
|
346
|
+
3. 提交审批
|
|
347
|
+
4. 审批人查看审批意见栏是否正常
|
|
348
|
+
|
|
349
|
+
### 4.5 业务用户验证(30分钟内完成)
|
|
350
|
+
|
|
351
|
+
通知 2-3 个业务用户进行真实业务操作,确认无异常。
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## 五、回滚方案
|
|
356
|
+
|
|
357
|
+
### 5.1 回滚触发条件
|
|
358
|
+
|
|
359
|
+
以下任一情况需立即回滚:
|
|
360
|
+
- ❌ 升级后无法发起新申请
|
|
361
|
+
- ❌ 审批意见栏无法显示
|
|
362
|
+
- ❌ 设计器打开报错或字段配置丢失
|
|
363
|
+
- ❌ 业务用户报告关键功能异常
|
|
364
|
+
|
|
365
|
+
### 5.2 回滚步骤
|
|
366
|
+
|
|
367
|
+
#### 方式1: API 快速回滚(推荐)
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
# 执行回滚接口
|
|
371
|
+
curl "http://<server>/api/workflow/rollbackApprovalCommentsField"
|
|
372
|
+
|
|
373
|
+
# 验证回滚
|
|
374
|
+
mongo <database> --eval "db.forms.countDocuments({'current.fields.__approval_comments_transformed': true})"
|
|
375
|
+
# 应返回 0
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
#### 方式2: 数据库备份还原(紧急)
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
# 停止应用服务(避免数据不一致)
|
|
382
|
+
systemctl stop steedos
|
|
383
|
+
|
|
384
|
+
# 还原备份
|
|
385
|
+
mongorestore --host=<host> --db=<database> --drop /backup/final_<timestamp>/
|
|
386
|
+
|
|
387
|
+
# 启动应用服务
|
|
388
|
+
systemctl start steedos
|
|
389
|
+
|
|
390
|
+
# 验证还原
|
|
391
|
+
mongo <database> --eval "db.forms.countDocuments({})"
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### 5.3 回滚后验证
|
|
395
|
+
|
|
396
|
+
- [ ] 字段 type 恢复为原始值
|
|
397
|
+
- [ ] formula/default_value 恢复
|
|
398
|
+
- [ ] 无 __approval_comments_* 备份属性
|
|
399
|
+
- [ ] 应用功能正常
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## 六、验证检查清单
|
|
404
|
+
|
|
405
|
+
### 6.1 测试环境检查清单
|
|
406
|
+
|
|
407
|
+
- [ ] 数据备份完成
|
|
408
|
+
- [ ] 干跑模式测试通过
|
|
409
|
+
- [ ] 实际升级执行成功
|
|
410
|
+
- [ ] 数据库字段格式正确
|
|
411
|
+
- [ ] 应用层字段显示正常
|
|
412
|
+
- [ ] 设计器能正常打开和保存
|
|
413
|
+
- [ ] 设计器生成的 amis_schema 格式正确
|
|
414
|
+
- [ ] 没有 amis_schema 的表单也能正常处理
|
|
415
|
+
- [ ] 新发起申请流程正常
|
|
416
|
+
- [ ] 审批流程正常
|
|
417
|
+
- [ ] 回滚测试通过
|
|
418
|
+
- [ ] 回滚后功能正常
|
|
419
|
+
- [ ] 所有转换场景都覆盖(traces, signature.traces, yijianlan)
|
|
420
|
+
- [ ] 错误日志检查无异常
|
|
421
|
+
|
|
422
|
+
### 6.2 生产环境检查清单
|
|
423
|
+
|
|
424
|
+
- [ ] 测试环境验证全部通过
|
|
425
|
+
- [ ] 生产数据库备份完成
|
|
426
|
+
- [ ] 维护窗口确认
|
|
427
|
+
- [ ] 升级执行成功
|
|
428
|
+
- [ ] 快速验证通过(5分钟)
|
|
429
|
+
- [ ] 应用验证通过(10分钟)
|
|
430
|
+
- [ ] 设计器验证通过
|
|
431
|
+
- [ ] 业务用户验证通过(30分钟)
|
|
432
|
+
- [ ] 监控24小时无异常
|
|
433
|
+
- [ ] 备份文件归档保存
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## 七、常见问题
|
|
438
|
+
|
|
439
|
+
### Q1: 升级后发现部分表单字段未转换?
|
|
440
|
+
|
|
441
|
+
**可能原因**:
|
|
442
|
+
1. 字段 formula/default_value 格式不匹配(如拼写错误、括号不匹配)
|
|
443
|
+
2. 步骤名为空(如 `{traces.}`)
|
|
444
|
+
3. 表单状态不是 'enabled'
|
|
445
|
+
|
|
446
|
+
**解决方案**:
|
|
447
|
+
```bash
|
|
448
|
+
# 检查未转换字段
|
|
449
|
+
db.forms.find({
|
|
450
|
+
"state": "enabled",
|
|
451
|
+
"$or": [
|
|
452
|
+
{"current.fields.formula": {"$regex": "traces|yijianlan"}},
|
|
453
|
+
{"current.fields.default_value": {"$regex": "traces|yijianlan"}}
|
|
454
|
+
],
|
|
455
|
+
"current.fields.__approval_comments_transformed": {"$ne": true}
|
|
456
|
+
}).pretty()
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### Q2: 部分表单没有 amis_schema 属性?
|
|
460
|
+
|
|
461
|
+
**说明**: 这是正常现象,老版本表单可能缺少该属性。
|
|
462
|
+
|
|
463
|
+
**处理**:
|
|
464
|
+
1. 升级脚本会跳过这些表单的 amis_schema 转换
|
|
465
|
+
2. 只转换 current.fields 和 historys.fields
|
|
466
|
+
3. 当用户打开表单设计器时,设计器会自动生成 amis_schema
|
|
467
|
+
4. 设计器现已支持新格式,会正确生成 sfield-approvalcomments 节点
|
|
468
|
+
|
|
469
|
+
**验证步骤**:
|
|
470
|
+
```
|
|
471
|
+
1. 找一个没有 amis_schema 的表单
|
|
472
|
+
2. 执行升级(current.fields 被转换)
|
|
473
|
+
3. 打开设计器 (/api/workflow/form_design?fid=xxx)
|
|
474
|
+
4. 检查生成的 amis_schema 格式是否正确
|
|
475
|
+
5. 保存并重新打开,确认配置不丢失
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Q3: 执行速度慢怎么办?
|
|
479
|
+
|
|
480
|
+
**原因**: 数据量大或批处理大小不合适。
|
|
481
|
+
|
|
482
|
+
**解决方案**:
|
|
483
|
+
```bash
|
|
484
|
+
# 使用 fid 参数分批处理
|
|
485
|
+
curl "http://<server>/api/workflow/migrateApprovalCommentsField?fid=<流程ID>"
|
|
486
|
+
|
|
487
|
+
# 或调整批处理大小(仅用于调优)
|
|
488
|
+
curl "http://<server>/api/workflow/migrateApprovalCommentsField?batchSize=200"
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### Q4: 遇到错误如何处理?
|
|
492
|
+
|
|
493
|
+
**步骤**:
|
|
494
|
+
1. 检查返回的 errors 数组
|
|
495
|
+
2. 记录 formId, fieldPath, error 信息
|
|
496
|
+
3. 查看具体表单数据
|
|
497
|
+
4. 修正数据后重新执行(幂等性保证安全)
|
|
498
|
+
|
|
499
|
+
### Q5: 如何处理特殊字符或格式?
|
|
500
|
+
|
|
501
|
+
**示例**:
|
|
502
|
+
```javascript
|
|
503
|
+
// 特殊字符步骤名
|
|
504
|
+
{yijianlan:{step:'部门经理/主管审核'}}
|
|
505
|
+
|
|
506
|
+
// 中文引号
|
|
507
|
+
{yijianlan:{step:"部门审核"}}
|
|
508
|
+
|
|
509
|
+
// 混合配置
|
|
510
|
+
{yijianlan:{step:'审核',only_cc:true,image_sign:true,default:'同意'}}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
**说明**: 代码已处理这些场景,正常执行即可。
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
## 八、附录
|
|
518
|
+
|
|
519
|
+
### 8.1 接口参数说明
|
|
520
|
+
|
|
521
|
+
#### migrateApprovalCommentsField 接口
|
|
522
|
+
|
|
523
|
+
```
|
|
524
|
+
GET /api/workflow/migrateApprovalCommentsField
|
|
525
|
+
|
|
526
|
+
参数:
|
|
527
|
+
- dryRun: boolean (可选) - true时不修改数据,仅返回统计
|
|
528
|
+
- fid: string (可选) - 流程ID,仅处理指定流程的表单
|
|
529
|
+
- batchSize: number (可选,默认500) - 批处理大小
|
|
530
|
+
|
|
531
|
+
返回:
|
|
532
|
+
{
|
|
533
|
+
"dryRun": false,
|
|
534
|
+
"totalForms": 150,
|
|
535
|
+
"totalFields": 230,
|
|
536
|
+
"errors": []
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
#### rollbackApprovalCommentsField 接口
|
|
541
|
+
|
|
542
|
+
```
|
|
543
|
+
GET /api/workflow/rollbackApprovalCommentsField
|
|
544
|
+
|
|
545
|
+
参数:
|
|
546
|
+
- dryRun: boolean (可选) - true时不修改数据,仅返回统计
|
|
547
|
+
- fid: string (可选) - 流程ID,仅回滚指定流程的表单
|
|
548
|
+
- batchSize: number (可选,默认500) - 批处理大小
|
|
549
|
+
|
|
550
|
+
返回:
|
|
551
|
+
{
|
|
552
|
+
"dryRun": false,
|
|
553
|
+
"totalForms": 150,
|
|
554
|
+
"totalFields": 230,
|
|
555
|
+
"errors": []
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### 8.2 MongoDB 查询参考
|
|
560
|
+
|
|
561
|
+
```javascript
|
|
562
|
+
// 查找所有已转换的表单
|
|
563
|
+
db.forms.find({"current.fields.__approval_comments_transformed": true}).count()
|
|
564
|
+
|
|
565
|
+
// 查找特定表单的转换字段
|
|
566
|
+
db.forms.findOne(
|
|
567
|
+
{"name": "表单名称"},
|
|
568
|
+
{"current.fields": 1}
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
// 查看备份属性
|
|
572
|
+
db.forms.findOne(
|
|
573
|
+
{"__approval_comments_original__amis_schema": {"$exists": true}},
|
|
574
|
+
{"amis_schema": 1, "__approval_comments_original__amis_schema": 1}
|
|
575
|
+
)
|
|
576
|
+
|
|
577
|
+
// 检查是否有遗漏
|
|
578
|
+
db.forms.find({
|
|
579
|
+
"state": "enabled",
|
|
580
|
+
"$or": [
|
|
581
|
+
{"current.fields.formula": {"$regex": "traces|yijianlan|signature"}},
|
|
582
|
+
{"current.fields.default_value": {"$regex": "traces|yijianlan|signature"}},
|
|
583
|
+
{"amis_schema": {"$regex": "traces|yijianlan|signature"}}
|
|
584
|
+
],
|
|
585
|
+
"current.fields.__approval_comments_transformed": {"$exists": false}
|
|
586
|
+
})
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
### 8.3 联系支持
|
|
590
|
+
|
|
591
|
+
如遇到无法解决的问题,请收集以下信息联系技术支持:
|
|
592
|
+
|
|
593
|
+
1. 错误返回的完整 JSON
|
|
594
|
+
2. 具体表单的 MongoDB 数据(脱敏后)
|
|
595
|
+
3. 操作步骤和时间
|
|
596
|
+
4. 数据库版本和表单数量
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
**文档版本**: v2.0
|
|
601
|
+
**最后更新**: 2026-01-31
|
|
602
|
+
**维护人员**: DevOps Team
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
## 附录 D: Web 控制台界面
|
|
607
|
+
|
|
608
|
+
### 控制台访问
|
|
609
|
+
|
|
610
|
+
为了提供更好的用户体验,我们开发了一个 Web 控制台界面,运维人员可以通过浏览器直接访问和操作:
|
|
611
|
+
|
|
612
|
+
**访问地址**: `http://your-server/api/workflow/upgrade/approval-comments-console`
|
|
613
|
+
|
|
614
|
+
**要求**: 必须以管理员身份登录
|
|
615
|
+
|
|
616
|
+
### 控制台功能
|
|
617
|
+
|
|
618
|
+
Web 控制台提供以下功能:
|
|
619
|
+
|
|
620
|
+
#### 1. 文档查看
|
|
621
|
+
- **技术文档**: 详细的技术设计和实现说明
|
|
622
|
+
- **操作手册**: 本文档的完整内容
|
|
623
|
+
|
|
624
|
+
#### 2. 可视化操作
|
|
625
|
+
- **升级操作**: 通过表单和按钮执行升级
|
|
626
|
+
- **还原操作**: 通过表单和按钮执行还原
|
|
627
|
+
- **实时结果显示**: 操作结果即时反馈
|
|
628
|
+
|
|
629
|
+
#### 3. 集成测试(仅测试环境)
|
|
630
|
+
- **自动化测试**: 一键执行完整的升级-还原测试流程
|
|
631
|
+
- **结果验证**: 自动验证数据正确性
|
|
632
|
+
- **详细报告**: 生成完整的测试报告
|
|
633
|
+
|
|
634
|
+
### 使用建议
|
|
635
|
+
|
|
636
|
+
**推荐使用 Web 控制台**,因为它提供了:
|
|
637
|
+
- ✅ 更直观的操作界面
|
|
638
|
+
- ✅ 实时的结果反馈
|
|
639
|
+
- ✅ 内置的安全检查
|
|
640
|
+
- ✅ 集成的文档查看
|
|
641
|
+
- ✅ 自动化测试功能
|
|
642
|
+
|
|
643
|
+
**命令行方式**仍然可用,适合:
|
|
644
|
+
- 自动化脚本集成
|
|
645
|
+
- 批处理任务
|
|
646
|
+
- 远程服务器操作
|
|
647
|
+
|
|
648
|
+
### 安全特性
|
|
649
|
+
|
|
650
|
+
Web 控制台包含多项安全特性:
|
|
651
|
+
- 🔒 仅管理员可访问
|
|
652
|
+
- 🔒 生产环境中禁用集成测试
|
|
653
|
+
- 🔒 默认启用 Dry Run 模式
|
|
654
|
+
- 🔒 关键操作需要确认
|
|
655
|
+
- 🔒 环境标识清晰显示
|
|
656
|
+
|
|
657
|
+
### 界面预览
|
|
658
|
+
|
|
659
|
+
控制台包含 4 个主要标签页:
|
|
660
|
+
1. **技术文档** - 查看详细技术文档
|
|
661
|
+
2. **操作手册** - 查看本操作手册
|
|
662
|
+
3. **执行操作** - 执行升级和还原操作
|
|
663
|
+
4. **集成测试** - 运行自动化测试(测试环境)
|
|
664
|
+
|
|
665
|
+
每个操作都提供:
|
|
666
|
+
- 参数配置(Dry Run、Flow ID、Batch Size)
|
|
667
|
+
- 一键执行按钮
|
|
668
|
+
- 实时进度显示
|
|
669
|
+
- 详细结果展示
|
|
670
|
+
|
|
671
|
+
---
|
|
672
|
+
|
|
673
|
+
**使用 Web 控制台可以大大提升操作效率和安全性!**
|