Appearance
业务层重构
注意,以下的描述含有示例或例如含义的代码示例,仅作参考,需要以实际索引到的代码为准,需要根据实际代码参照示例进行修改,不可以直接复制,需要充分的理解代码上下文之后进行工作。
1. 定位业务文件
- 1.1 定位逻辑
- 找到注入了IWfProcessService的类。
- 在该类中增加以下的方法注入,并且需要增加对应的引用。
java
import com.pig4cloud.pigx.standard.feign.service.WFlowInstanceService;
@Resource
private WFlowInstanceService wfInstanceService;的注入。
- 1.2 业务逻辑迁移
- 找到使用startProcessInstanceByKey所在的方法。例如:
java
private void startProcessInstanceByKey(JSONObject body) {
String processDefKey = body.getString("processDefKey");
String businessKey = body.getString("businessKey");
String processInstanceId = body.getString("processDefId");
if (processInstanceId == null) {
//发起审批
StartProcParamsVo startProcParamsVo = StartProcParamsVo.builder()
.defineId(processDefKey)
.initiator(businessKey)
.startDeptId(businessKey)
.build();
processInstanceId = processService.startProcessInstanceByKey(processDefKey, businessKey, body);
} else {
//发起审批
processInstanceId = processService.anewStartProcess(processInstanceId, body);
}
//更新业务对象中的流程实例id
HjlAuditCarEntity auditCarEntity = getById(businessKey);
if(ObjectUtils.isEmpty(auditCarEntity)){
throw new RuntimeException("当前申请信息不存在!");
}
auditCarEntity.setStatus(WfNotice.Type.START.getCode());
auditCarEntity.setProcessInstanceId(processInstanceId);
auditCarEntity.setProcessDefKey(processDefKey);
updateById(auditCarEntity);
}- 找到这个方法的调用方,例如:
startProcessInstanceByKey(body);- 重新配置启动工作流的参数,例如:
java
JSONObject body = new JSONObject();
body.put("processDefKey", HJL_AUDIT_CAR_PROCESS);
body.put("businessKey", id);
startProcessInstanceByKey(body);参照以上的代码需要将参数重构成为:
java
JSONObject body = new JSONObject();
body.put("processDefKey", HJL_AUDIT_CAR_PROCESS);
body.put("businessKey", id);
// 发起审批
StartProcParamsVo startProcParamsVo = StartProcParamsVo.builder()
.defineId(HJL_AUDIT_CAR_PROCESS)
.initiator(SecurityUtils.getUser().getId())
.businessKey(id.toString())
.startDeptId(SecurityUtils.getUser().getDeptId())
.variables(body)
.build();
startProcessInstanceByKey(startProcParamsVo);同时对应的startProcessInstanceByKey需要调整成为:
java
/**
* 发起审批
* @param startProcParamsVo 审批相关
*/
private void startProcessInstanceByKey(StartProcParamsVo startProcParamsVo) {
Long businessKey = Long.parseLong(startProcParamsVo.getBusinessKey());
Map<String, Object> variables = startProcParamsVo.getVariables();
String processInstanceId = null;
if (variables != null) {
Object processDefId = variables.get("processDefId");
if (processDefId != null) {
processInstanceId = processDefId.toString();
}
}
Rsp<String> rsp = null;
if (processInstanceId == null) {
//发起审批
rsp = wfInstanceService.startupProcess(startProcParamsVo);
} else {
// TODO 暂时不处理重新发起工作
rsp = wfInstanceService.startupProcess(startProcParamsVo);
}
processInstanceId = rsp.getData();
//更新业务对象中的流程实例id
HjlAuditCarEntity auditCarEntity = getById(businessKey);
if(ObjectUtils.isEmpty(auditCarEntity)){
throw new RuntimeException("当前申请信息不存在!");
}
auditCarEntity.setStatus(WfNotice.Type.START.getCode());
auditCarEntity.setProcessInstanceId(processInstanceId);
auditCarEntity.setProcessDefKey(startProcParamsVo.getDefineId());
updateById(auditCarEntity);
}其中的变量信息,以及代码逻辑,需要根据实际业务进行修改。
1.3 监听器的迁移
- 找到这个类对应的监听器,其规则明明通常为:业务名称 + StatusLIstener。例如: HjlAuditExpenseService 对应的监听器是 HjlAuditCarStatusListener。
- 迁移监听器,将该监听器移动至 pigx-wflow-biz 服务中, 存放于listener目录下。
1.4 创建同意维护流程定义key的公共文件。
- 原本的流程定义key,定义到了service中。其值为原本的processDefKey,例如:
java
body.put("processDefKey", HJL_AUDIT_CAR_PROCESS);而这个HJL_AUDIT_CAR_PROCESS的定义是在service接口中维护的。例如:
java
public interface IHjlApplyExpenseService extends IService<HjlApplyExpenseEntity> {
String HJL_AUDIT_CAR_PROCESS = "HJL_AUDIT_CAR_PROCESS";
...... 其他接口定义
}现在需要将该流程定义移动至,pigx-standard-api中。定义到constant的BussinerssProcessDefKeys类中,例如:
java
// 用车申请流程定义
public static final String HJL_AUDIT_CAR_PROCESS = "HJL_AUDIT_CAR_PROCESS";
// 报销申请流程定义
public static final String APPLY_EXPENSE_PROCESS_KEY = "APPLY_EXPENSE_PROCESS_KEY";
... 其他流程定义同时,将原本的定义文件改为,直接赋值为该业务流程定义中的值,例如:
java
@BusinessProjcessKeyTag
String HJL_AUDIT_CAR_PROCESS = BussinessProcessDefKeys.HJL_AUDIT_CAR_PROCESS;- 将监听器中原本的getProcessDefinitionKey的返回值,改为该公共文件中的流程定义key。例如:
java
@Override
protected String getProcessDefinitionKey() {
return IHjlAuditCarServiceProcess.HJL_AUDIT_CAR_PROCESS;
}- 1.5 改造监听器的onEvent方法。
因为已经将原本的监听器迁移到了wflow服务中,原本监听器中直接通过service调用的方法失效。所以需要根据业务代码,将onEvent方法中的service调用,改为通过Feign调用wflow服务中的方法。
- 分析原本的onEvent方法的实现逻辑。
- 在pigx-standard-biz中,collect中增加对应的rest接口。
- 将原本的实现逻辑在service中实现出来。
- 在wflow服务中,增加对应的Feign接口调用。
重要提示
- 1、在以上的任务中,添加了很多示例,仅供参考作用,你必须要逐个分析每个业务场景的实际情况,然后参考示例,定制详细的迁移方案任务,最后根据任务完成迁移。
- 2、本次任务是一个大型迁移任务,你可以根据业务创建对应的迁移计划,每个业务对应一个计划文件,同样计划文件应该在pigx-wflow-biz服务的resources/wflow整合/plans目录下。我需要你在迁移对应的业务之前先创建计划,然后迁移对应的业务,并且创建计划时先回顾一下本文档。
- 3、你必须要创建对应的迁移任务日志,将该日志输出到pigx-wflow-biz服务的resources/wflow整合/logs 目录下,以便后续追踪。
- 4、我通过本地的git做了分支管理,所以在迁移任务过程中,你不必问我授权及询问我是否要做某些操作,直接进行该操作,我只验证最后的迁移结果。