Skip to content

业务层重构 ​

注意,以下的描述含有示例或例如含义的代码示例,仅作参考,需要以实际索引到的代码为准,需要根据实际代码参照示例进行修改,不可以直接复制,需要充分的理解代码上下文之后进行工作。

1. 定位业务文件 ​

  • 1.1 定位逻辑
      1. 找到注入了IWfProcessService的类。
      1. 在该类中增加以下的方法注入,并且需要增加对应的引用。
java
import com.pig4cloud.pigx.standard.feign.service.WFlowInstanceService;
  
@Resource
private WFlowInstanceService wfInstanceService;

的注入。

  • 1.2 业务逻辑迁移
      1. 找到使用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);
}
      1. 找到这个方法的调用方,例如:
startProcessInstanceByKey(body);
      1. 重新配置启动工作流的参数,例如:
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 监听器的迁移

      1. 找到这个类对应的监听器,其规则明明通常为:业务名称 + StatusLIstener。例如: HjlAuditExpenseService 对应的监听器是 HjlAuditCarStatusListener。
      1. 迁移监听器,将该监听器移动至 pigx-wflow-biz 服务中, 存放于listener目录下。
  • 1.4 创建同意维护流程定义key的公共文件。

      1. 原本的流程定义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;
      1. 将监听器中原本的getProcessDefinitionKey的返回值,改为该公共文件中的流程定义key。例如:
java
    @Override
    protected String getProcessDefinitionKey() {
        return IHjlAuditCarServiceProcess.HJL_AUDIT_CAR_PROCESS;
    }
  • 1.5 改造监听器的onEvent方法。

因为已经将原本的监听器迁移到了wflow服务中,原本监听器中直接通过service调用的方法失效。所以需要根据业务代码,将onEvent方法中的service调用,改为通过Feign调用wflow服务中的方法。

      1. 分析原本的onEvent方法的实现逻辑。
      1. 在pigx-standard-biz中,collect中增加对应的rest接口。
      1. 将原本的实现逻辑在service中实现出来。
      1. 在wflow服务中,增加对应的Feign接口调用。

重要提示 ​

  • 1、在以上的任务中,添加了很多示例,仅供参考作用,你必须要逐个分析每个业务场景的实际情况,然后参考示例,定制详细的迁移方案任务,最后根据任务完成迁移。
  • 2、本次任务是一个大型迁移任务,你可以根据业务创建对应的迁移计划,每个业务对应一个计划文件,同样计划文件应该在pigx-wflow-biz服务的resources/wflow整合/plans目录下。我需要你在迁移对应的业务之前先创建计划,然后迁移对应的业务,并且创建计划时先回顾一下本文档。
  • 3、你必须要创建对应的迁移任务日志,将该日志输出到pigx-wflow-biz服务的resources/wflow整合/logs 目录下,以便后续追踪。
  • 4、我通过本地的git做了分支管理,所以在迁移任务过程中,你不必问我授权及询问我是否要做某些操作,直接进行该操作,我只验证最后的迁移结果。