记录工作,记录生活。
当前公司业务开发过程中有对activiti工作流流程复制的需求,便查找了一些资料和代码,站在巨人的肩膀上总结一下业务功能的实现逻辑和经验。
开发环境:Spring boot + activiti5.22
/**
* 流程复制业务实现
*
* @param modelId
*/
public void flowCopy(String modelId) {
if (StringUtils.isBlank(modelId)) {
// 提示请求参数信息不能为空
}
// 获取复制源流程的模型信息
byte[] bytes = repositoryService.getModelEditorSource(modelId);
if (bytes == null || bytes.length < 0) {
// 源流程信息为空,无效复制
}
try {
// 获取流程设计节点信息
ObjectNode sourceObjectNode = (ObjectNode) new ObjectMapper().readTree(bytes);
// 创建复制的目标流程模型, 填充部分默认信息
Model newModel = repositoryService.newModel();
ObjectNode modelNode = objectMapper.createObjectNode();
newModel.setKey("填充流程名称");
// 填充模型名称, 其中在activiti7.1.M6版本中该name值必须定义为SpringAutoDeployment
newModel.setName("SpringAutoDeployment");
newModel.setVersion(1);
// 其余的信息填充可选填
modelNode.put(ModelDataJsonConstants.MODEL_NAME, "填充模型名称");
modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, "填充模型描述信息");
newModel.setMetaInfo(modelNode.toString());
// 保存模型
repositoryService.saveModel(newModel);
// 对源流程信息进行深拷贝
ObjectNode editorNode = sourceObjectNode.deepCopy();
// 以下信息可以通过debugger查看源流程信息, 定义新的流程信息后进行覆盖
ObjectNode properties = objectMapper.createObjectNode();
// 流程key的唯一性, 复制后的流程key需要更新, 可定义为源key_copy
properties.put("process_id", "新的流程key");
properties.put("name", "新的流程名称");
properties.put("author", "新的流程创建者定义");
// 根据源流程复制后的属性信息覆盖
editorNode.set("properties", properties);
// 保存新的流程模型的设计信息
repositoryService.addModelEditorSource(newModel.getId(), editorNode.toString().getBytes(StandardCharsets.UTF_8));
// 复制成功, 根据新的流程模型设计流程信息发布, 启动实例验证即可
} catch (IOException e) {
e.printStackTrace();
}
}
该业务可以实现流程模型及流程设计信息的复制,对复制后的模型进行改动后应用即可。
搭配activiti官方的流程设计器进行设计配置。