fix: 优化驳回选择节点重复展示

Signed-off-by: 搬砖的小庄 <1909017815@qq.com>
This commit is contained in:
搬砖的小庄 2025-12-10 10:40:41 +00:00 committed by Gitee
parent 39b19ac361
commit d671bdb09e
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

View File

@ -5,8 +5,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.lock.annotation.Lock4j;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
@ -31,7 +29,6 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.entity.*;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.enums.UserType; import org.dromara.warm.flow.core.enums.UserType;
@ -63,6 +60,7 @@ import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
import static org.dromara.workflow.common.constant.FlowConstant.*; import static org.dromara.workflow.common.constant.FlowConstant.*;
@ -103,7 +101,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Lock4j(keys = {"#startProcessBo.flowCode + #startProcessBo.businessId"})
public StartProcessReturnDTO startWorkFlow(StartProcessBo startProcessBo) { public StartProcessReturnDTO startWorkFlow(StartProcessBo startProcessBo) {
String businessId = startProcessBo.getBusinessId(); String businessId = startProcessBo.getBusinessId();
if (StringUtils.isBlank(businessId)) { if (StringUtils.isBlank(businessId)) {
@ -140,9 +137,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
// 将流程定义内的扩展参数设置到变量中 // 将流程定义内的扩展参数设置到变量中
Definition definition = FlowEngine.defService().getPublishByFlowCode(startProcessBo.getFlowCode()); Definition definition = FlowEngine.defService().getPublishByFlowCode(startProcessBo.getFlowCode());
if (ObjectUtil.isNull(definition)) {
throw new ServiceException("流程【" + startProcessBo.getFlowCode() + "】未发布,请先在流程设计器中发布流程定义");
}
Dict dict = JsonUtils.parseMap(definition.getExt()); Dict dict = JsonUtils.parseMap(definition.getExt());
boolean autoPass = !ObjectUtil.isNull(dict) && dict.getBool(FlowConstant.AUTO_PASS); boolean autoPass = !ObjectUtil.isNull(dict) && dict.getBool(FlowConstant.AUTO_PASS);
variables.put(FlowConstant.AUTO_PASS, autoPass); variables.put(FlowConstant.AUTO_PASS, autoPass);
@ -152,7 +146,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
.flowCode(startProcessBo.getFlowCode()) .flowCode(startProcessBo.getFlowCode())
.variable(startProcessBo.getVariables()) .variable(startProcessBo.getVariables())
.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); .flowStatus(BusinessStatusEnum.DRAFT.getStatus());
Instance instance = insService.start(businessId, flowParams); Instance instance;
try {
instance = insService.start(businessId, flowParams);
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
// 保存流程实例业务信息 // 保存流程实例业务信息
this.buildFlowInstanceBizExt(instance, bizExt); this.buildFlowInstanceBizExt(instance, bizExt);
// 申请人执行流程 // 申请人执行流程
@ -198,8 +197,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Lock4j(keys = {"#completeTaskBo.taskId"})
public boolean completeTask(CompleteTaskBo completeTaskBo) { public boolean completeTask(CompleteTaskBo completeTaskBo) {
try {
// 获取任务ID并查询对应的流程任务和实例信息 // 获取任务ID并查询对应的流程任务和实例信息
Long taskId = completeTaskBo.getTaskId(); Long taskId = completeTaskBo.getTaskId();
List<String> messageType = completeTaskBo.getMessageType(); List<String> messageType = completeTaskBo.getMessageType();
@ -241,6 +240,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Boolean autoPass = Convert.toBool(variables.getOrDefault(AUTO_PASS, false)); Boolean autoPass = Convert.toBool(variables.getOrDefault(AUTO_PASS, false));
skipTask(taskId, flowParams, flowTask.getInstanceId(), autoPass); skipTask(taskId, flowParams, flowTask.getInstanceId(), autoPass);
return true; return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new ServiceException(e.getMessage());
}
} }
/** /**
@ -302,12 +305,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
List<String> variableUserIds = Arrays.asList(userIds.split(StringUtils.SEPARATOR)); List<String> variableUserIds = Arrays.asList(userIds.split(StringUtils.SEPARATOR));
hashSet.addAll(popUserIds); hashSet.addAll(popUserIds);
hashSet.addAll(variableUserIds); hashSet.addAll(variableUserIds);
map.put(TaskStatusEnum.PASS.getStatus() + StrUtil.COLON + entry.getKey(), StringUtils.joinComma(hashSet)); map.put(entry.getKey(), StringUtils.joinComma(hashSet));
map.put(TaskStatusEnum.BACK.getStatus() + StrUtil.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
} }
} else { } else {
map.put(TaskStatusEnum.PASS.getStatus() + StrUtil.COLON + entry.getKey(), entry.getValue()); map.put(entry.getKey(), entry.getValue());
map.put(TaskStatusEnum.BACK.getStatus() + StrUtil.COLON + entry.getKey(), entry.getValue());
} }
} }
return map; return map;
@ -446,19 +447,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} }
private QueryWrapper<FlowTaskBo> buildQueryWrapper(FlowTaskBo flowTaskBo) { private QueryWrapper<FlowTaskBo> buildQueryWrapper(FlowTaskBo flowTaskBo) {
Map<String, Object> params = flowTaskBo.getParams();
QueryWrapper<FlowTaskBo> wrapper = Wrappers.query(); QueryWrapper<FlowTaskBo> wrapper = Wrappers.query();
wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getNodeName()), "t.node_name", flowTaskBo.getNodeName());
wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowName()), "t.flow_name", flowTaskBo.getFlowName());
wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode()); wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowCode()), "t.flow_code", flowTaskBo.getFlowCode());
wrapper.like(StringUtils.isNotBlank(flowTaskBo.getFlowStatus()), "t.flow_status", flowTaskBo.getFlowStatus());
wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds());
if (StringUtils.isNotBlank(flowTaskBo.getCategory())) { if (StringUtils.isNotBlank(flowTaskBo.getCategory())) {
List<Long> categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory())); List<Long> categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory()));
wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr)); wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr));
} }
wrapper.between(params.get("beginTime") != null && params.get("endTime") != null,
"t.create_time", params.get("beginTime"), params.get("endTime"));
wrapper.orderByDesc("t.create_time").orderByDesc("t.update_time"); wrapper.orderByDesc("t.create_time").orderByDesc("t.update_time");
return wrapper; return wrapper;
} }
@ -471,6 +468,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean backProcess(BackProcessBo bo) { public boolean backProcess(BackProcessBo bo) {
try {
Long taskId = bo.getTaskId(); Long taskId = bo.getTaskId();
String notice = bo.getNotice(); String notice = bo.getNotice();
List<String> messageType = bo.getMessageType(); List<String> messageType = bo.getMessageType();
@ -500,6 +498,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
.hisTaskExt(bo.getFileId()); .hisTaskExt(bo.getFileId());
taskService.skip(task.getId(), flowParams); taskService.skip(task.getId(), flowParams);
return true; return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new ServiceException(e.getMessage());
}
} }
/** /**
@ -527,20 +529,19 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} }
//获取可驳回的前置节点 //获取可驳回的前置节点
List<Node> nodes = nodeService.previousNodeList(task.getDefinitionId(), nowNodeCode); List<Node> nodes = nodeService.previousNodeList(task.getDefinitionId(), nowNodeCode);
List<HisTask> taskList = hisTaskService.getByInsId(task.getInstanceId()); List<HisTask> hisTaskList = hisTaskService.getByInsId(task.getInstanceId());
Map<String, Node> nodeMap = StreamUtils.toIdentityMap(nodes, Node::getNodeCode); Map<String, Node> nodeMap = StreamUtils.toIdentityMap(nodes, Node::getNodeCode);
Set<String> added = new HashSet<>();
List<Node> backNodeList = new ArrayList<>(); List<Node> backNodeList = new ArrayList<>();
for (HisTask hisTask : taskList) { for (HisTask hisTask : hisTaskList) {
Node nodeValue = nodeMap.get(hisTask.getNodeCode()); Node nodeValue = nodeMap.get(hisTask.getNodeCode());
if (nodeValue != null) { if (nodeValue != null && NodeType.BETWEEN.getKey().equals(nodeValue.getNodeType()) && added.add(nodeValue.getNodeCode())) {
backNodeList.add(nodeValue); backNodeList.add(nodeValue);
} }
} }
if (CollUtil.isNotEmpty(backNodeList)) { if (CollUtil.isNotEmpty(backNodeList)) {
List<Node> prefixOrSuffixNodes = StreamUtils.filter(backNodeList, e -> NodeType.BETWEEN.getKey().equals(e.getNodeType())); Collections.reverse(backNodeList);
Collections.reverse(prefixOrSuffixNodes); return backNodeList;
return prefixOrSuffixNodes;
} }
return nodes; return nodes;
} }
@ -553,6 +554,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean terminationTask(FlowTerminationBo bo) { public boolean terminationTask(FlowTerminationBo bo) {
try {
Long taskId = bo.getTaskId(); Long taskId = bo.getTaskId();
Task task = taskService.getById(taskId); Task task = taskService.getById(taskId);
if (task == null) { if (task == null) {
@ -568,6 +570,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
.hisStatus(TaskStatusEnum.TERMINATION.getStatus()); .hisStatus(TaskStatusEnum.TERMINATION.getStatus());
taskService.termination(taskId, flowParams); taskService.termination(taskId, flowParams);
return true; return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new ServiceException(e.getMessage());
}
} }
/** /**
@ -744,7 +750,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Task task = taskService.getById(taskId); Task task = taskService.getById(taskId);
FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId()); FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId());
if (ADD_SIGNATURE.equals(taskOperation) || REDUCTION_SIGNATURE.equals(taskOperation)) { if (ADD_SIGNATURE.equals(taskOperation) || REDUCTION_SIGNATURE.equals(taskOperation)) {
if (!CooperateType.isCountersign(flowNode.getNodeRatio())) { if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException(task.getNodeName() + "不是会签节点!"); throw new ServiceException(task.getNodeName() + "不是会签节点!");
} }
} }
@ -789,6 +795,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (CollUtil.isEmpty(taskIdList)) { if (CollUtil.isEmpty(taskIdList)) {
return false; return false;
} }
try {
List<FlowTask> flowTasks = this.selectByIdList(taskIdList); List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
// 批量删除现有任务的办理人记录 // 批量删除现有任务的办理人记录
if (CollUtil.isNotEmpty(flowTasks)) { if (CollUtil.isNotEmpty(flowTasks)) {
@ -802,6 +809,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
FlowEngine.userService().saveBatch(userList); FlowEngine.userService().saveBatch(userList);
} }
} }
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new ServiceException(e.getMessage());
}
return true; return true;
} }
@ -840,6 +851,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
*/ */
@Override @Override
public boolean urgeTask(FlowUrgeTaskBo bo) { public boolean urgeTask(FlowUrgeTaskBo bo) {
try {
if (CollUtil.isEmpty(bo.getTaskIdList())) { if (CollUtil.isEmpty(bo.getTaskIdList())) {
return false; return false;
} }
@ -850,6 +862,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
List<String> messageType = bo.getMessageType(); List<String> messageType = bo.getMessageType();
String message = bo.getMessage(); String message = bo.getMessage();
flwCommonService.sendMessage(messageType, message, "单据审批提醒", userList); flwCommonService.sendMessage(messageType, message, "单据审批提醒", userList);
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new ServiceException(e.getMessage());
}
return true; return true;
} }
} }