package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.workflow.domain.WfTaskBackNode; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.mapper.WfTaskBackNodeMapper; import org.dromara.workflow.service.IWfTaskBackNodeService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.task.api.Task; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import static org.dromara.workflow.common.constant.FlowConstant.MULTI_INSTANCE; import static org.dromara.workflow.common.constant.FlowConstant.USER_TASK; /** * 节点驳回记录Service业务层处理 * * @author may * @date 2024-03-13 */ @Slf4j @RequiredArgsConstructor @Service public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService { private final WfTaskBackNodeMapper wfTaskBackNodeMapper; @Override @Transactional(rollbackFor = Exception.class) public void recordExecuteNode(Task task) { List list = getListByInstanceId(task.getProcessInstanceId()); WfTaskBackNode wfTaskBackNode = new WfTaskBackNode(); wfTaskBackNode.setNodeId(task.getTaskDefinitionKey()); wfTaskBackNode.setNodeName(task.getName()); wfTaskBackNode.setInstanceId(task.getProcessInstanceId()); wfTaskBackNode.setAssignee(String.valueOf(LoginHelper.getUserId())); MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); if (ObjectUtil.isNotEmpty(multiInstance)) { wfTaskBackNode.setTaskType(MULTI_INSTANCE); } else { wfTaskBackNode.setTaskType(USER_TASK); } if (CollUtil.isEmpty(list)) { wfTaskBackNode.setOrderNo(0); wfTaskBackNodeMapper.insert(wfTaskBackNode); } else { WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0); if (ObjectUtil.isEmpty(taskNode)) { wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1); WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId()); if (ObjectUtil.isNotEmpty(node)) { node.setAssignee(node.getAssignee() + StringUtils.SEPARATOR + LoginHelper.getUserId()); wfTaskBackNodeMapper.updateById(node); } else { wfTaskBackNodeMapper.insert(wfTaskBackNode); } } } } @Override public List getListByInstanceId(String processInstanceId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); wrapper.orderByDesc(WfTaskBackNode::getOrderNo); return wfTaskBackNodeMapper.selectList(wrapper); } @Override public WfTaskBackNode getListByInstanceIdAndNodeId(String processInstanceId, String nodeId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); queryWrapper.eq(WfTaskBackNode::getNodeId, nodeId); return wfTaskBackNodeMapper.selectOne(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public boolean deleteBackTaskNode(String processInstanceId, String targetActivityId) { try { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); queryWrapper.eq(WfTaskBackNode::getNodeId, targetActivityId); WfTaskBackNode actTaskNode = wfTaskBackNodeMapper.selectOne(queryWrapper); if (ObjectUtil.isNotNull(actTaskNode)) { Integer orderNo = actTaskNode.getOrderNo(); List taskNodeList = getListByInstanceId(processInstanceId); List ids = new ArrayList<>(); if (CollUtil.isNotEmpty(taskNodeList)) { for (WfTaskBackNode taskNode : taskNodeList) { if (taskNode.getOrderNo() >= orderNo) { ids.add(taskNode.getId()); } } } if (CollUtil.isNotEmpty(ids)) { wfTaskBackNodeMapper.deleteByIds(ids); } } return true; } catch (Exception e) { log.error(e.getMessage(), e); throw new ServiceException("删除失败"); } } @Override @Transactional(rollbackFor = Exception.class) public boolean deleteByInstanceId(String processInstanceId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); List list = wfTaskBackNodeMapper.selectList(wrapper); int delete = wfTaskBackNodeMapper.delete(wrapper); if (list.size() != delete) { throw new ServiceException("删除失败"); } return true; } @Override public boolean deleteByInstanceIds(List processInstanceIds) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(WfTaskBackNode::getInstanceId, processInstanceIds); List list = wfTaskBackNodeMapper.selectList(wrapper); int delete = wfTaskBackNodeMapper.delete(wrapper); if (list.size() != delete) { throw new ServiceException("删除失败"); } return true; } }