基于开源项目KonBAI / RuoYi-Flowable-Plus使用的部分功能调整。利用全局监听器,设置act_ru_task表中的CATEGORY_(流程分类key)的值。
流程实例创建流程
(1)创建流程分类:category
(2)创建自定义表单:form
(3)设计模型流程图、部署:model、procdef、deployment
一个流程分类下可以有多个模型,是一对多的关系。
代码解析
在部署模型时,将部署id回写到模型表中
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deployModel(String modelId) {
// 获取流程模型
Model model = repositoryService.getModel(modelId);
if (ObjectUtil.isNull(model)) {
throw new RuntimeException("流程模型不存在!");
}
// 获取流程图
byte[] bpmnBytes = repositoryService.getModelEditorSource(modelId);
if (bpmnBytes == null) {
throw new ServiceException("流程设计未定义!");
}
String bpmnXml = StringUtils.toEncodedString(bpmnBytes, StandardCharsets.UTF_8);
BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml);
String processName = model.getName() + ProcessConstants.SUFFIX;
// 部署流程
Deployment deployment = repositoryService.createDeployment()
.name(model.getName())
.key(model.getKey())
.category(model.getCategory())
.addBytes(processName, bpmnBytes)
.deploy();
ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery()
.deploymentId(deployment.getId())
.singleResult();
// 修改流程定义的分类,便于搜索流程
repositoryService.setProcessDefinitionCategory(procDef.getId(), model.getCategory());
// new >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 保存部署id到模型表中
model.setDeploymentId(deployment.getId());
// --------------------------------------------------
repositoryService.saveModel(model);
// 保存部署表单
return deployFormService.saveInternalDeployForm(deployment.getId(), bpmnModel);
}
}
添加全局监听,给每个任务写入category_
@Slf4j
@Component
public class GlobalEventListener implements FlowableEventListener {
/**
* 事件触发时,设置category_
* @param flowableEvent
*/
@Override
public void onEvent(FlowableEvent flowableEvent) {
FlowableEventType eventType = flowableEvent.getType();
log.info(">>执行 任务全局监听 --》 GlobalEventListener eventType={}", eventType.name());
// 在任务创建时,将category填入任务中
if (TASK_CREATED == eventType) {
FlowableEntityEvent entityEvent = (FlowableEntityEvent) flowableEvent;
TaskEntity entity = (TaskEntity) entityEvent.getEntity();
if (StrUtil.isBlank(entity.getCategory())) {
//前提是Deployment已经设置过Category
ProcessDefinitionEntity processDefinitionEntity = CommandContextUtil.getProcessDefinitionEntityManager().findById(entity.getProcessDefinitionId());
DeploymentEntity deploymentEntity = CommandContextUtil.getDeploymentEntityManager().findById(processDefinitionEntity.getDeploymentId());
//直接修改act_ru_task实体的属性
//因为事件是同步事件,所以会包裹在整体事务中提交
entity.setCategory(deploymentEntity.getCategory());
}
}
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
参考资料
KonBAI / RuoYi-Flowable-Plus 基于 RuoYi-Vue-Plus 进行二次开发扩展Flowable工作流功能项目
Flowable6.4 – 设置流程分类 by 字痕随行