业务流程结合工作流
先执行自己业务系统的业务流程,比如说数据导入、查询等,之后再提交给工作流引擎,去执行工作流审批。
因为公司使用的是宏天的框架,所以本文的所有流程都基于宏天流程来进行。
一、业务流程
本文只是一个示例,基于公司的业务拿来做演示。
可以看到有①②③④四个步骤。
简单说一下业务流程,选择一项资金,根据模板导入数据到数据库,经过各种校验之后,在第三步的时候将处理好的数据提交给流程引擎。
二、具体方法
因为业务数据要提交给流程引擎,肯定是需要载体来承接业务数据,所以肯定需要表单。
表单的创建步骤:建模->表单->绑定流程
建模
创建表单
绑定流程
实现思路:手动启动流程,将业务数据写入到表单表.
处理数据,因为宏天启动流程的时候需要将模之间的关系进行绑定,再用base64进行编码,并且需要注意表字段的大小写和建模、表单的字段大小写是否一致。
private StartFlowParamObject getStartFlowParamObject(TbBpmDefinition bpmDefinition, MsjxFormMain msjxFormMain, List<MsjxFormSubObj> msjxFormSubObjList, MsjxFormSubSupport msjxFormSubSupport) {
// 设置流程信息
StartFlowParamObject startFlowParamObject = new StartFlowParamObject();
startFlowParamObject.setDefId(xxx);
startFlowParamObject.setTbDefId(xxx);
startFlowParamObject.setProcessType(xxx);
startFlowParamObject.setFormType("inner");
startFlowParamObject.setSupportMobile(0);
// 将实体类转为map
Map<String, Object> msjx = BeanUtil.beanToMap(xxx, true, true);
List<Map<String, Object>> subMsjhmdbdzb = new ArrayList<>();
List<Map<String, Object>> subMsjhfczjxxbdzb = new ArrayList<>();
msjxFormSubObjList.forEach(xxx-> {
Map<String, Object> toMap = BeanUtil.beanToMap(xxx, true, true);
// 表单的key 需要换成自己定义的
表单key.add(transformUpperCase(toMap));
});
Map<String, Object> toMap = BeanUtil.beanToMap(xxx, true, true);
subMsjhfczjxxbdzb.add(transformUpperCase(toMap));
Map<String, Object> dataMap = new HashMap<>();
// 时间处理
Map<String, Object> msjx2Upper = transformUpperCase(msjx);
msjx2Upper.put(xxx, 表单key);
msjx2Upper.put(xxx, 子表单key);
dataMap.put(xxx, msjx2Upper);
String dataJson = JSONUtil.toJsonStr(dataMap);
// 转为base64编码
String encode = cn.hutool.core.codec.Base64.encode(dataJson);
startFlowParamObject.setData(encode);
return startFlowParamObject;
}
处理好表单数据之后,调用宏天框架的保存草稿方法
StartResult startResult = iProcessService.saveDraft(startFlowParamObject);
用户提交审核的时候再调用启动流程的方法(可能是新启动的流程、也可能是退回、撤回的流程)
// 草稿则启动流程 、 退回撤回则完成任务
if ("draft".equals(status)) {
DefaultProcessInstCmd cmd = new DefaultProcessInstCmd();
cmd.setFlowKey(bpmDefinition.getDefKey());
cmd.setDataMode(ActionCmd.DATA_MODE_BO);
cmd.setActionName("startFlow");
cmd.setInstId(instId);
processInstanceService.startProcessInst(cmd);
} else {
// 获取任务id
List<String> taskList = bpmProcessInstanceManager.getBpmTaskIdByInstId(instId);
if (CollUtil.isEmpty(taskList)) {
return new CommonResult(false, "任务id不存在!");
}
DoNextParamObject doNextParamObject = new DoNextParamObject();
doNextParamObject.setReviewDate(DateUtil.today());
doNextParamObject.setFormKey(表单key);
doNextParamObject.setAccount(baseContext.getCurrentUserAccout());
doNextParamObject.setTaskId(taskList.get(0));
doNextParamObject.setActionName("agree");
doNextParamObject.setOpinion("重新提交");
//doNextParamObject.setData();
doNextParamObject.setFormType("inner");
doNextParamObject.setAgentLeaderId("0");
CommonResult<String> commonResult = iFlowService.complete(doNextParamObject).get();
if (!commonResult.getState()) {
return new CommonResult<>(false, "流程启动失败:" + commonResult.getMessage(), "");
}
}
上面这种方法只能适用数据量比较小的,如果数据量比较需要,自己根据流程和表单的关联关系,自己批量写入来实现。
总结
本文比较适合有点流程基础查阅,写的不好请见谅。