# Conflicts:
#	pom.xml
#	yudao-dependencies/pom.xml
This commit is contained in:
YunaiV
2025-11-24 17:03:53 +08:00
50 changed files with 349 additions and 159 deletions

View File

@@ -18,11 +18,11 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConsta
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.impl.util.io.BytesStreamSource;
import org.flowable.engine.impl.el.FixedValue;
import java.util.*;
@@ -406,7 +406,7 @@ public class BpmnModelUtils {
flowableListener.getFieldExtensions().add(fieldExtension);
}
public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FixedValue fixedValue) {
public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(Expression fixedValue) {
String expressionText = fixedValue.getExpressionText();
Assert.notNull(expressionText, "监听器扩展字段({})不能为空", expressionText);
return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class);

View File

@@ -54,7 +54,7 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
}
// 执行抄送
createProcessInstanceCopy(userIds, reason,
task.getProcessInstanceId(), task.getTaskDefinitionKey(), task.getId(), task.getName());
task.getProcessInstanceId(), task.getTaskDefinitionKey(), task.getName(), task.getId());
}
@Override

View File

@@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
@@ -752,6 +753,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) {
// 获得流程定义
ProcessDefinition definition = processDefinitionService
@@ -762,6 +764,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
}
@Override
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) {
return FlowableUtils.executeAuthenticatedUserId(userId, () -> {
// 获得流程定义
@@ -878,6 +881,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
}
@Override
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void cancelProcessInstanceByStartUser(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) {
// 1.1 校验流程实例存在
ProcessInstance instance = getProcessInstance(cancelReqVO.getId());
@@ -907,6 +911,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
}
@Override
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void cancelProcessInstanceByAdmin(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO) {
// 1.1 校验流程实例存在
ProcessInstance instance = getProcessInstance(cancelReqVO.getId());

View File

@@ -376,6 +376,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
}
// 2.2 过滤:只有串行可到达的节点,才可以退回。类似非串行、子流程无法退回
previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null));
// 2.3 过滤:只能退回到已经处理过的节点(排除审批未经过的节点)。相关 issuehttps://github.com/YunaiV/ruoyi-vue-pro/issues/982
List<HistoricTaskInstance> finishedTasks = getFinishedTaskListByProcessInstanceIdWithoutCancel(task.getProcessInstanceId());
Set<String> finishedTaskDefinitionKeys = convertSet(finishedTasks, HistoricTaskInstance::getTaskDefinitionKey);
previousUserList.removeIf(userTask -> !finishedTaskDefinitionKeys.contains(userTask.getId()));
return previousUserList;
}
@@ -544,6 +549,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) {
// 1.1 校验任务存在
Task task = validateTask(userId, reqVO.getId());
@@ -788,6 +794,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) {
// 1.1 校验任务存在
Task task = validateTask(userId, reqVO.getId());
@@ -855,6 +862,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void returnTask(Long userId, BpmTaskReturnReqVO reqVO) {
// 1.1 当前任务 task
Task task = validateTask(userId, reqVO.getId());
@@ -983,6 +991,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) {
String taskId = reqVO.getId();
// 1.1 校验任务
@@ -1012,6 +1021,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
}
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void transferTask(Long userId, BpmTaskTransferReqVO reqVO) {
String taskId = reqVO.getId();
// 1.1 校验任务
@@ -1042,6 +1053,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void moveTaskToEnd(String processInstanceId, String reason) {
List<Task> taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null);
if (CollUtil.isEmpty(taskList)) {
@@ -1080,6 +1092,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void createSignTask(Long userId, BpmTaskSignCreateReqVO reqVO) {
// 1. 获取和校验任务
TaskEntityImpl taskEntity = validateTaskCanCreateSign(userId, reqVO);
@@ -1196,6 +1209,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
@SuppressWarnings("DataFlowIssue")
public void deleteSignTask(Long userId, BpmTaskSignDeleteReqVO reqVO) {
// 1.1 校验 task 可以被减签
@@ -1235,6 +1249,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据。相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void withdrawTask(Long userId, String taskId) {
// 1.1 查询本人已办任务
HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery()

View File

@@ -13,9 +13,9 @@ import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionServic
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.el.FixedValue;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Component;
@@ -34,7 +34,7 @@ public class BpmCallActivityListener implements ExecutionListener {
public static final String DELEGATE_EXPRESSION = "${bpmCallActivityListener}";
@Setter
private FixedValue listenerConfig;
private Expression listenerConfig;
@Resource
private BpmProcessDefinitionService processDefinitionService;

View File

@@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmHttpRequestUt
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.engine.impl.el.FixedValue;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.context.annotation.Scope;
@@ -34,7 +34,7 @@ public class BpmUserTaskListener implements TaskListener {
private BpmProcessInstanceService processInstanceService;
@Setter
private FixedValue listenerConfig;
private Expression listenerConfig;
@Override
public void notify(DelegateTask delegateTask) {