/
AfterSaleServiceImpl.java
172 lines (144 loc) · 7.67 KB
/
AfterSaleServiceImpl.java
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package com.didiglobal.turbo.demo.service;
import com.didiglobal.turbo.demo.util.Constant;
import com.didiglobal.turbo.demo.util.EntityBuilder;
import com.didiglobal.turbo.engine.engine.ProcessEngine;
import com.didiglobal.turbo.engine.model.InstanceData;
import com.didiglobal.turbo.engine.param.CommitTaskParam;
import com.didiglobal.turbo.engine.param.CreateFlowParam;
import com.didiglobal.turbo.engine.param.DeployFlowParam;
import com.didiglobal.turbo.engine.param.RollbackTaskParam;
import com.didiglobal.turbo.engine.param.StartProcessParam;
import com.didiglobal.turbo.engine.param.UpdateFlowParam;
import com.didiglobal.turbo.engine.result.CommitTaskResult;
import com.didiglobal.turbo.engine.result.CreateFlowResult;
import com.didiglobal.turbo.engine.result.DeployFlowResult;
import com.didiglobal.turbo.engine.result.RollbackTaskResult;
import com.didiglobal.turbo.engine.result.StartProcessResult;
import com.didiglobal.turbo.engine.result.UpdateFlowResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author rick
* @Date 2022/4/6 14:07
* 案例1:某团购售后流程
* 用户A在订单列表中选择订单,判断订单状态,如果状态为未发货,则直接跳转至退款申请页,
* 如果状态为待收货则提示不支持售后,跳转至物流信息页,如果状态为已收货,则跳转至售后页填写售后信息并提交。
* <p>
* 未发货
* ---> 用户节点(申请取消) --->
* 未收到货
* 开始节点 -> 用户节点(输入订单相关信息) --->排他节点(判断订单状态) ---> 用户节点(展示物流信息) ---> 结束节点
* 已收到货
* ---> 用户节点(填写售后原因) --->
*/
@Service
public class AfterSaleServiceImpl {
private static final Logger LOGGER = LoggerFactory.getLogger(AfterSaleServiceImpl.class);
@Resource
private ProcessEngine processEngine;
private CreateFlowParam createFlowParam;
private CreateFlowResult createFlowResult;
private UpdateFlowResult updateFlowResult;
private DeployFlowResult deployFlowResult;
public void run() {
LOGGER.info("AfterSale Demo run:");
LOGGER.info("AfterSale definition:");
createFlow();
updateFlow();
deployFlow();
LOGGER.info("AfterSale runtime:");
startProcessToEnd();
}
private void createFlow() {
createFlowParam = new CreateFlowParam(Constant.tenant, Constant.caller);
createFlowParam.setFlowKey("after_sale");
createFlowParam.setFlowName("售后处理SOP");
createFlowParam.setRemark("demo");
createFlowParam.setOperator(Constant.operator);
createFlowResult = processEngine.createFlow(createFlowParam);
LOGGER.info("createFlow.||createFlowResult={}", createFlowResult);
}
private void updateFlow() {
UpdateFlowParam updateFlowParam = new UpdateFlowParam(Constant.tenant, Constant.caller);
updateFlowParam.setFlowModel(EntityBuilder.buildAfterSaleFlowModelStr());
updateFlowParam.setFlowModuleId(createFlowResult.getFlowModuleId());
updateFlowResult = processEngine.updateFlow(updateFlowParam);
LOGGER.info("updateFlow.||updateFlowResult={}", updateFlowResult);
}
private void deployFlow() {
DeployFlowParam param = new DeployFlowParam(Constant.tenant, Constant.caller);
param.setFlowModuleId(createFlowResult.getFlowModuleId());
deployFlowResult = processEngine.deployFlow(param);
LOGGER.info("deployFlow.||deployFlowResult={}", deployFlowResult);
}
private void startProcessToEnd() {
StartProcessResult startProcessResult = startProcess();
CommitTaskResult commitTaskResult = chooseUnreleaseOrder(startProcessResult);
RollbackTaskResult rollbackTaskResult = rollbackToChoose(commitTaskResult);
CommitTaskResult result = chooseReleaseOrder(rollbackTaskResult);
commitCompleteProcess(result);
}
// 用户拉起售后sop
private StartProcessResult startProcess() {
StartProcessParam startProcessParam = new StartProcessParam();
startProcessParam.setFlowDeployId(deployFlowResult.getFlowDeployId());
List<InstanceData> variables = new ArrayList<>();
variables.add(new InstanceData("user_id", "userId"));
startProcessParam.setVariables(variables);
StartProcessResult startProcessResult = processEngine.startProcess(startProcessParam);
LOGGER.info("startProcess.||startProcessResult={}", startProcessResult);
return startProcessResult;
}
// 选择未发货的订单
private CommitTaskResult chooseUnreleaseOrder(StartProcessResult startProcessResult) {
CommitTaskParam commitTaskParam = new CommitTaskParam();
commitTaskParam.setFlowInstanceId(startProcessResult.getFlowInstanceId());
commitTaskParam.setTaskInstanceId(startProcessResult.getActiveTaskInstance().getNodeInstanceId());
List<InstanceData> variables = new ArrayList<>();
variables.add(new InstanceData("order_id", "orderID"));
variables.add(new InstanceData("status", "0"));
commitTaskParam.setVariables(variables);
CommitTaskResult commitTaskResult = processEngine.commitTask(commitTaskParam);
LOGGER.info("chooseUnrelesseOrder.||commitTaskResult={}", commitTaskResult);
return commitTaskResult;
}
// 回退,重新选取订单
private RollbackTaskResult rollbackToChoose(CommitTaskResult commitTaskResult) {
RollbackTaskParam rollbackTaskParam = new RollbackTaskParam();
rollbackTaskParam.setFlowInstanceId(commitTaskResult.getFlowInstanceId());
rollbackTaskParam.setTaskInstanceId(commitTaskResult.getActiveTaskInstance().getNodeInstanceId());
RollbackTaskResult rollbackTaskResult = processEngine.rollbackTask(rollbackTaskParam);
LOGGER.info("rollbackToChoose.||rollbackTaskResult={}", rollbackTaskResult);
return rollbackTaskResult;
}
//选取已发货,未收到货 订单
private CommitTaskResult chooseReleaseOrder(RollbackTaskResult rollbackTaskResult) {
CommitTaskParam commitTaskParam = new CommitTaskParam();
commitTaskParam.setFlowInstanceId(rollbackTaskResult.getFlowInstanceId());
commitTaskParam.setTaskInstanceId(rollbackTaskResult.getActiveTaskInstance().getNodeInstanceId());
List<InstanceData> variables = new ArrayList<>();
variables.add(new InstanceData("order_id", "orderID"));
variables.add(new InstanceData("status", "1"));
commitTaskParam.setVariables(variables);
CommitTaskResult commitTaskResult = processEngine.commitTask(commitTaskParam);
LOGGER.info("chooseReleaseOrder.||commitTaskResult={}", commitTaskResult);
return commitTaskResult;
}
//BadCase:已完成流程,再次提交订单和状态,此时流程已经结束会报错。
private CommitTaskResult commitCompleteProcess(CommitTaskResult commitTaskResult) {
CommitTaskParam commitTaskParam = new CommitTaskParam();
commitTaskParam.setFlowInstanceId(commitTaskResult.getFlowInstanceId());
commitTaskParam.setTaskInstanceId(commitTaskResult.getActiveTaskInstance().getNodeInstanceId());
List<InstanceData> variables = new ArrayList<>();
variables.add(new InstanceData("order_id", "orderID"));
variables.add(new InstanceData("status", "2"));
commitTaskParam.setVariables(variables);
CommitTaskResult result = processEngine.commitTask(commitTaskParam);
LOGGER.info("chooseReceivedOrderBadCase.||commitTaskResult={}", result);
return result;
}
}