!1292 feat: 任务前后置通知
Merge pull request !1292 from Lesan/feature/bpm-任务前后置通知
This commit is contained in:
commit
b2dd2148d3
|
@ -88,6 +88,12 @@ public class BpmModelMetaInfoVO {
|
||||||
@Schema(description = "流程后置通知设置", example = "{}")
|
@Schema(description = "流程后置通知设置", example = "{}")
|
||||||
private HttpRequestSetting processAfterTriggerSetting;
|
private HttpRequestSetting processAfterTriggerSetting;
|
||||||
|
|
||||||
|
@Schema(description = "任务前置通知设置", example = "{}")
|
||||||
|
private HttpRequestSetting taskBeforeTriggerSetting;
|
||||||
|
|
||||||
|
@Schema(description = "任务后置通知设置", example = "{}")
|
||||||
|
private HttpRequestSetting taskAfterTriggerSetting;
|
||||||
|
|
||||||
@Schema(description = "流程 ID 规则")
|
@Schema(description = "流程 ID 规则")
|
||||||
@Data
|
@Data
|
||||||
@Valid
|
@Valid
|
||||||
|
|
|
@ -199,4 +199,16 @@ public class BpmProcessDefinitionInfoDO extends BaseDO {
|
||||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||||
private BpmModelMetaInfoVO.HttpRequestSetting processAfterTriggerSetting;
|
private BpmModelMetaInfoVO.HttpRequestSetting processAfterTriggerSetting;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务前置通知设置
|
||||||
|
*/
|
||||||
|
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||||
|
private BpmModelMetaInfoVO.HttpRequestSetting taskBeforeTriggerSetting;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务后置通知设置
|
||||||
|
*/
|
||||||
|
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||||
|
private BpmModelMetaInfoVO.HttpRequestSetting taskAfterTriggerSetting;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
|
||||||
public static final Set<FlowableEngineEventType> TASK_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
|
public static final Set<FlowableEngineEventType> TASK_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
|
||||||
.add(FlowableEngineEventType.TASK_CREATED)
|
.add(FlowableEngineEventType.TASK_CREATED)
|
||||||
.add(FlowableEngineEventType.TASK_ASSIGNED)
|
.add(FlowableEngineEventType.TASK_ASSIGNED)
|
||||||
// .add(FlowableEngineEventType.TASK_COMPLETED) // 由于审批通过时,已经记录了 task 的 status 为通过,所以不需要监听了。
|
.add(FlowableEngineEventType.TASK_COMPLETED) // 由于审批通过时,已经记录了 task 的 status 为通过,这里仅处理任务后置通知。
|
||||||
.add(FlowableEngineEventType.ACTIVITY_CANCELLED)
|
.add(FlowableEngineEventType.ACTIVITY_CANCELLED)
|
||||||
.add(FlowableEngineEventType.TIMER_FIRED) // 监听审批超时
|
.add(FlowableEngineEventType.TIMER_FIRED) // 监听审批超时
|
||||||
.build();
|
.build();
|
||||||
|
@ -66,6 +66,11 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
|
||||||
taskService.processTaskAssigned((Task) event.getEntity());
|
taskService.processTaskAssigned((Task) event.getEntity());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void taskCompleted(FlowableEngineEntityEvent event) {
|
||||||
|
taskService.processTaskCompleted((Task) event.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void activityCancelled(FlowableActivityCancelledEvent event) {
|
protected void activityCancelled(FlowableActivityCancelledEvent event) {
|
||||||
List<HistoricActivityInstance> activityList = taskService.getHistoricActivityListByExecutionId(event.getExecutionId());
|
List<HistoricActivityInstance> activityList = taskService.getHistoricActivityListByExecutionId(event.getExecutionId());
|
||||||
|
|
|
@ -278,6 +278,13 @@ public interface BpmTaskService {
|
||||||
*/
|
*/
|
||||||
void processTaskAssigned(Task task);
|
void processTaskAssigned(Task task);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理 Task 完成事件,目前是发送任务后置通知
|
||||||
|
*
|
||||||
|
* @param task 任务实体
|
||||||
|
*/
|
||||||
|
void processTaskCompleted(Task task);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理 Task 审批超时事件,可能会处理多个当前审批中的任务
|
* 处理 Task 审批超时事件,可能会处理多个当前审批中的任务
|
||||||
*
|
*
|
||||||
|
|
|
@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
||||||
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
|
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
|
||||||
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
|
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
|
||||||
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
|
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
||||||
|
@ -23,6 +24,7 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskSignTypeEnum;
|
||||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
|
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
|
||||||
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmHttpRequestUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
|
import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
|
||||||
|
@ -1180,6 +1182,21 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||||
log.error("[processTaskCreated][taskId({}) 没有找到流程实例]", task.getId());
|
log.error("[processTaskCreated][taskId({}) 没有找到流程实例]", task.getId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService.
|
||||||
|
getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
|
||||||
|
if (processDefinitionInfo == null) {
|
||||||
|
log.error("[processTaskCreated][processDefinitionId({}) 没有找到流程定义]", processInstance.getProcessDefinitionId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 任务前置通知
|
||||||
|
if (ObjUtil.isNotNull(processDefinitionInfo.getTaskBeforeTriggerSetting())){
|
||||||
|
BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskBeforeTriggerSetting();
|
||||||
|
BpmHttpRequestUtils.executeBpmHttpRequest(processInstance,
|
||||||
|
setting.getUrl(),
|
||||||
|
setting.getHeader(),
|
||||||
|
setting.getBody(),
|
||||||
|
true, setting.getResponse());
|
||||||
|
}
|
||||||
BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId());
|
BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId());
|
||||||
FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
|
FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
|
||||||
Integer approveType = BpmnModelUtils.parseApproveType(userTaskElement);
|
Integer approveType = BpmnModelUtils.parseApproveType(userTaskElement);
|
||||||
|
@ -1391,6 +1408,30 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processTaskCompleted(Task task) {
|
||||||
|
ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
|
||||||
|
if (processInstance == null) {
|
||||||
|
log.error("[processTaskCompleted][taskId({}) 没有找到流程实例]", task.getId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService.
|
||||||
|
getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
|
||||||
|
if (processDefinitionInfo == null) {
|
||||||
|
log.error("[processTaskCompleted][processDefinitionId({}) 没有找到流程定义]", processInstance.getProcessDefinitionId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 任务前置通知
|
||||||
|
if (ObjUtil.isNotNull(processDefinitionInfo.getTaskAfterTriggerSetting())){
|
||||||
|
BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getTaskAfterTriggerSetting();
|
||||||
|
BpmHttpRequestUtils.executeBpmHttpRequest(processInstance,
|
||||||
|
setting.getUrl(),
|
||||||
|
setting.getHeader(),
|
||||||
|
setting.getBody(),
|
||||||
|
true, setting.getResponse());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType) {
|
public void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType) {
|
||||||
|
|
Loading…
Reference in New Issue