主题
待办审批场景
适用于存在申请流程的任务数据对接,需要同时推送申请流程和每个流程节点对应的任务数据,当流程节点发生流转时,需主动调用接口更新对应任务和申请状态等信息,同时推送下一节点的任务数据,门户端处理人的待办/已办任务列表及申请发起人的申请列表中将会展示对应数据。
门户展示



名词解释
重要提醒
无论是或签还是会签,在审批任务时调用方都只需要关注当前审批人的操作,无需处理其余审批人的任务情况,待办中心会根据推送任务时传入的或签/会签字段,自行处理。
或签
当流程中某个节点任务存在多个审批人,但当其中一个人审批完成后,当前节点任务直接处理完成,其它审批人无需处理。这种处理方式为或签。
门户表现形式为节点中的每个审批人都会收到一条待办任务,当其中一个审批人审批完成后,当前审批用户的待办任务会变更为已办任务,其余审批人的待办任务自行消失;
会签
当流程中某个节点任务存在多个审批人,需要所有审批人都审批完成后,当前节点任务才能处理完成。这种处理方式为会签。
门户表现形式为节点中的每个审批人都会收到一条待办任务,当其中一个审批人审批完成后,当前审批用户的待办任务会变更为已办任务,其余审批人的待办任务继续存在;
接入流程
涉及接口:创建/更新任务
创建待办任务及申请任务

用户首次发起申请时需要在待办中心创建一条申请任务,同时向审核人发送待办任务。
上述操作可通过一次接口请求完成,建议不要分开调用。
请求体
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 新增任务信息 | insertModel | *M | List<InsertModel> | 新增信息(任务和申请) |
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 第三方任务ID | taskId | M | String(64) | 任务业务主键,由第三方提供。业务系统唯一,可使用英文、数字、下划线组成,长度小于64位 |
| 业务场景编码 | sceneCode | O | String(128) | 业务场景编码;可通过查询业务场景进行获取 |
| 任务主题 | subject | M | String(300) | 任务主题 |
| 紧急程度 | priority | M | integer | 1:特急 2:紧急 3:一般 用于展示标签在门户中,并快速筛选 |
| 任务类型 | taskType | M | integer | 1:待阅 2:分发 3:普通 4:内部待阅3.7.3.Beta1+ 5:内部分发3.7.3.Beta1+ 除普通类型外,待阅及分发流程办结后,任务继续保留待办(第三方业务特殊逻辑) |
| 过期时间 | expireTime | O | String | 过期时间(yyyy-MM-dd HH:mm:ss) |
| 发起人类型 | initiatorType | M | integer | 1:学工号 |
| 发起人ID | initiatorId | M | String(50) | 当initiatorType=1,传学工号 |
| 用户范围类型 | objectScope | O | integer | 1:校内用户(默认) 2:校外用户 |
| 处理人列表 | processors | M | List<Processor> | 处理人列表,标记这个待办任务接收人 |
| 任务上一步处理人工号(校内) | prevProcessor | O | String(300) | 任务上一步处理人工号,多个以逗号隔开 (校内用户),用于门户展示,建议传入 |
| 任务上一步处理人工号(校外) | outPrevProcessor | O | String(300) | 任务上一步处理人工号,多个以逗号隔开 (校外用户),用于门户展示,建议传入 |
| pc待办任务地址 | pcViewUrl | O | String(512) | pc待办任务地址,点击后的跳转地址,建议传入 |
| h5待办任务地址 | h5ViewUrl | O | String(512) | h5待办任务地址,点击后的跳转地址,建议传入 |
| 流程图地址 | processInstanceImgUrl | O | String(512) | 流程图地址,用于门户查看流程图,建议传入 |
| 流程记录地址 | processInstanceRecordUrl | O | String(512) | 流程记录地址,用于门户查看流转记录,建议传入 |
| 任务当前节点id | nodeId | O | String(50) | 任务当前节点id,用于门户展示,建议传入 |
| 任务当前节点名称 | nodeName | O | String(40) | 任务当前节点名称,用于门户展示,建议传入 |
| 处理类型 | processType | O | integer | 或签/会签逻辑 1:只需要一个人处理 2:所有人都需处理 默认为1 |
| 服务ID | serviceId | O | String(128) | 所属服务ID,用于统计和门户展示,建议传入 |
| 服务名称 | serviceName | O | String(300) | 所属服务名称,用于统计和门户展示,建议传入 |
| applicationModel | O | ApplicationModel | 任务关联的申请信息 |
ApplicationModel(返回)
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 第三方申请ID | processInstanceId | M | String(64) | 申请业务主键, 由第三方提供。业务系统唯一,可使用英文、数字、下划线组成,长度小于64位 |
| 申请主题 | subject | *M | String(300) | 申请主题 |
| 待处理人列表 | processors | *M | List<Processor> | 待处理人列表 (申请当前所在节点的处理人列表) |
| 申请状态 | processInstanceStatus | *M | String | RUNNING(正常运行) COMPLETE(正常结束) ABORT(强行中止) DRAFT(草稿) REPLY(待重新提交) |
| pc申请任务地址 | pcViewUrl | O | String(512) | pc申请任务地址,点击后的跳转地址,建议传入 |
| h5申请任务地址 | h5ViewUrl | O | String(512) | h5申请任务地址,点击后的跳转地址,建议传入 |
| 当前节点id | nodeId | *M | String(50) | 申请当前节点id |
| 当前节点名称 | nodeName | *M | String(40) | 申请当前节点名称 |
| 创建时间 | createTime | O | String | 申请创建时间,不填默认为系统当前时间 yyyy-MM-dd HH:mm:ss |
| nodeList | O | List<Node> | 当前流程的所有节点列表(查询流程图时使用) |
重要提醒
ApplicationModel中必填为*M的字段在首次创建申请任务时必填。后续创建待办任务时只需要传入processInstanceId字段用于关联此条申请任务和待办任务即可。
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 处理人类型 | processorType | M | integer | 1:学工号 |
| 处理人ID | processorId | M | String(50) | 当processorType=1,传学工号 |
| 用户范围类型 | objectScope | O | integer | 1:校内用户(默认) 2:校外用户 |
Node(返回)
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 节点id | nodeId | M | String(50) | 节点id |
| 节点名称 | nodeName | M | String(40) | 节点名称 |
请求示例
{
"insertModel": [
{
"taskId": "2024071703",
"subject": "test主题",
"sceneCode": "testCode1",
"initiatorId": "user01",
"initiatorType": 1,
"nodeId": "002",
"nodeName": "002",
"pcViewUrl": "http://www.pc.url",
"h5ViewUrl": "http://www.h5.url",
"prevProcessor": "user02",
"priority": 3,
"processInstanceImgUrl": "",
"processInstanceRecordUrl": "",
"processType": 1,
"processors": [
{
"objectScope": 1,
"processorId": "user03",
"processorType": 1
},
{
"objectScope": 1,
"processorId": "user04",
"processorType": 1
}
],
"serviceId": "xxx",
"serviceName": "xxx",
"taskType": 3,
"applicationModel": {
"processInstanceId": "20240717",
"subject": "申请主题",
"processInstanceStatus": "RUNNING",
"processors": [
{
"objectScope": 1,
"processorId": "user03",
"processorType": 1
},
{
"objectScope": 1,
"processorId": "user04",
"processorType": 1
}
],
"nodeId": "002",
"nodeName": "002",
"pcViewUrl": "http://www.pc.url",
"h5ViewUrl": "http://www.h5.url",
"nodeList": [
{
"nodeId": "001",
"nodeName": "001"
},
{
"nodeId": "002",
"nodeName": "002"
},
{
"nodeId": "003",
"nodeName": "003"
}
]
}
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Demo
java
// 创建客户端
Client client = new DefaultClient(BASE_URL, APP_ID, APP_SECRET);
// 创建请求对象
SaveOrUpdateRequest request = new SaveOrUpdateRequest();
// 发起任务
InsertModel insertModel = new InsertModel();
insertModel.setTaskId("2024071701");
insertModel.setSceneCode("testCode1");
insertModel.setInitiatorId("user01");
insertModel.setInitiatorType(ProcessorType.USER_ACCOUNT);
insertModel.setSubject("test主题");
insertModel.setProcessors(Arrays.asList(new Processor("user03"), new Processor("user04")));
insertModel.setServiceId("xxx");
insertModel.setServiceName("xxx");
insertModel.setNodeId("001");
insertModel.setNodeName("001");
insertModel.setPcViewUrl("http://www.pc.url");
insertModel.setH5ViewUrl("http://www.h5.url");
insertModel.setProcessInstanceImgUrl("");
insertModel.setProcessInstanceRecordUrl("");
// 任务关联的申请信息
ApplicationModel applicationModel = new ApplicationModel();
applicationModel.setProcessInstanceId("20240717");
applicationModel.setSubject("申请主题");
applicationModel.setProcessInstanceStatus(ProcessInstanceStatusType.RUNNING);
applicationModel.setProcessors(Arrays.asList(new Processor("user03"), new Processor("user04")));
applicationModel.setPcViewUrl("http://www.pc.url");
applicationModel.setH5ViewUrl("http://www.h5.url");
applicationModel.setNodeId("001");
applicationModel.setNodeName("001");
applicationModel.setNodeList(Arrays.asList(new ApplicationModel.Node("001", "001")
, new ApplicationModel.Node("002", "002"), new ApplicationModel.Node("003", "003")));
insertModel.setApplicationModel(applicationModel);
request.setInsertModel(Collections.singletonList(insertModel));
BaseResponse response = client.execute(request);
//调用成功,则处理业务逻辑
if (response.isSuccess()) {
//.....
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
审批任务

上述操作可通过一次接口请求完成,建议不要分开调用。
请求体
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| updateModel | *M | UpdateModel | 更新信息 (任务和申请),与insertModel至少填一个 | |
| 新增任务信息 | insertModel | *M | List<InsertModel> | 新增信息(任务和申请),与updateModel至少填一个 |
UpdateModel(返回)
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| taskModels | *M | List<TaskModel> | 需要更新的任务信息,与applyModels至少填一个 | |
| applyModels | *M | List<ApplyModel> | 需要更新申请信息,与taskModels至少填一个 |
TaskModel(返回)
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 第三方任务ID | taskId | M | String(64) | 任务业务主键,由第三方提供 |
| 处理人ID | processorId | M | String(50) | 处理人ID |
| 处理人类型 | processorType | O | integer | 1:学工号 2:业务侧自定义 |
| 用户范围类型 | objectScope | O | integer | 1:校内用户(默认) 2:校外用户 |
| 任务状态 | status | M | String | ACTIVE(激活) COMPLETE(完成) ROLLBACK(退回) WITHDRAW(撤回) TRANSFER(移交) DELEGATE(委派) ABORT(终止) |
| 流程图地址 | processInstanceImgUrl | O | String(512) | 流程图地址,用于门户查看流程图,建议传入 |
| 流程记录地址 | processInstanceRecordUrl | O | String(512) | 流程记录地址,用于门户查看流转记录,建议传入 |
| 处理意见 | taskComment | O | String(1000) | 处理意见 |
| pc已办任务地址 | donePcUrl | O | String(512) | pc已办任务地址。如果第三方待办和已办地址不同,需要传入 |
| h5已办任务地址 | doneH5Url | O | String(512) | h5已办任务地址。如果第三方待办和已办地址不同,需要传入 |
| 任务结束时间 | taskEndTime | O | String | 任务结束时间(yyyy-MM-dd HH:mm:ss),默认系统当前时间 |
| 更新时间 | updateTime | O | String | 更新时间 (yyyy-MM-dd HH:mm:ss),默认系统当前时间 |
ApplyModel(返回)
| 字段名 | 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|---|
| 第三方申请ID | processInstanceId | M | String(64) | 申请业务主键, 由第三方提供 |
| 当前节点待处理人列表 | processors | *M | List<Processor> | 当前节点待处理人列表,申请状态为RUNNING时必填 |
| 当前节点id | nodeId | O | String(50) | 当前节点id |
| 当前节点名称 | nodeName | *M | String(40) | 当前节点名称,申请状态为RUNNING时必填 |
| 申请状态 | processInstanceStatus | M | String | RUNNING(正常运行) COMPLETE(正常结束) ABORT(强行中止) DRAFT(草稿) REPLY(待重新提交) |
| 流程图地址 | processInstanceImgUrl | O | String(512) | 流程图地址 |
| 流程记录地址 | processInstanceRecordUrl | O | String(512) | 流程记录地址 |
| 流程结束时间 | processInstanceEndTime | O | String | 流程结束时间(yyyy-MM-dd HH:mm:ss) |
请求示例
{
"insertModel": [
{
"taskId": "2024071702",
"initiatorId": "user01",
"initiatorType": 1,
"subject": "test主题",
"nodeId": "002",
"nodeName": "002",
"pcViewUrl": "http://www.pc.url",
"h5ViewUrl": "http://www.h5.url",
"prevProcessor": "user02",
"priority": 3,
"processInstanceImgUrl": "",
"processInstanceRecordUrl": "",
"processType": 1,
"processors": [
{
"objectScope": 1,
"processorId": "user03",
"processorType": 1
},
{
"objectScope": 1,
"processorId": "user04",
"processorType": 1
}
],
"sceneCode": "testCode1",
"serviceId": "xxx",
"serviceName": "xxx",
"taskType": 3,
"applicationModel": {
"initiatorType": 1,
"processInstanceId": "20240717"
}
}
],
"updateModel": {
"applyModels": [
{
"nodeId": "002",
"nodeName": "002",
"processInstanceId": "20240717",
"processInstanceStatus": "RUNNING",
"processors": [
{
"objectScope": 1,
"processorId": "user03",
"processorType": 1
},
{
"objectScope": 1,
"processorId": "user04",
"processorType": 1
}
]
}
],
"taskModels": [
{
"processorId": "user02",
"processorType": 1,
"status": "COMPLETE",
"taskComment": "同意",
"taskId": "2024071701"
}
]
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Demo
java
// 创建客户端
Client client = new DefaultClient(BASE_URL, APP_ID, APP_SECRET);
// 创建请求对象
SaveOrUpdateRequest request = new SaveOrUpdateRequest();
// 更新上一个任务状态
SaveOrUpdateRequest.UpdateModel updateModel = new SaveOrUpdateRequest.UpdateModel();
TaskModel taskModel = new TaskModel();
taskModel.setTaskId("2024071701");
taskModel.setProcessorId("user02");
taskModel.setTaskComment("同意");
taskModel.setStatus(TaskStatusType.COMPLETE);
updateModel.setTaskModels(Collections.singletonList(taskModel));
// 更新申请节点信息、处理人信息
ApplyModel applyModel = new ApplyModel();
applyModel.setProcessInstanceId("20240717");
applyModel.setProcessInstanceStatus(ProcessInstanceStatusType.RUNNING);
applyModel.setNodeId("002");
applyModel.setNodeName("002");
applyModel.setProcessors(Arrays.asList(new Processor("user03"), new Processor("user04")));
updateModel.setApplyModels(Collections.singletonList(applyModel));
request.setUpdateModel(updateModel);
// 创建下一个节点的任务
InsertModel insertModel = new InsertModel();
insertModel.setTaskId("2024071702");
insertModel.setSceneCode("testCode1");
insertModel.setInitiatorId("user01");
insertModel.setSubject("test主题");
insertModel.setProcessors(Arrays.asList(new Processor("user03"), new Processor("user04")));
insertModel.setServiceId("xxx");
insertModel.setServiceName("xxx");
insertModel.setNodeId("002");
insertModel.setNodeName("002");
insertModel.setPcViewUrl("http://www.pc.url");
insertModel.setH5ViewUrl("http://www.h5.url");
insertModel.setProcessInstanceImgUrl("");
insertModel.setProcessInstanceRecordUrl("");
insertModel.setPrevProcessor("user02");
// 任务关联的申请信息
ApplicationModel applicationModel = new ApplicationModel();
applicationModel.setProcessInstanceId("20240717");
insertModel.setApplicationModel(applicationModel);
request.setInsertModel(Collections.singletonList(insertModel));
BaseResponse response = client.execute(request);
//调用成功,则处理业务逻辑
if (response.isSuccess()) {
//.....
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

