¶Ô±ÈÐÂÎļþ |
| | |
| | | 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 org.dromara.common.core.exception.ServiceException; |
| | | 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 |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Service |
| | | public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService { |
| | | |
| | | private final WfTaskBackNodeMapper wfTaskBackNodeMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void recordExecuteNode(Task task) { |
| | | List<WfTaskBackNode> 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 = list.stream().filter(e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0).findFirst().orElse(null); |
| | | 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<WfTaskBackNode> getListByInstanceId(String processInstanceId) { |
| | | LambdaQueryWrapper<WfTaskBackNode> 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<WfTaskBackNode> 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<WfTaskBackNode> 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<WfTaskBackNode> taskNodeList = getListByInstanceId(processInstanceId); |
| | | List<Long> ids = new ArrayList<>(); |
| | | if (CollUtil.isNotEmpty(taskNodeList)) { |
| | | for (WfTaskBackNode taskNode : taskNodeList) { |
| | | if (taskNode.getOrderNo() >= orderNo) { |
| | | ids.add(taskNode.getId()); |
| | | } |
| | | } |
| | | } |
| | | if (CollUtil.isNotEmpty(ids)) { |
| | | wfTaskBackNodeMapper.deleteBatchIds(ids); |
| | | } |
| | | } |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | throw new ServiceException("å é¤å¤±è´¥"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteByInstanceId(String processInstanceId) { |
| | | LambdaQueryWrapper<WfTaskBackNode> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.eq(WfTaskBackNode::getInstanceId, processInstanceId); |
| | | List<WfTaskBackNode> list = wfTaskBackNodeMapper.selectList(wrapper); |
| | | int delete = wfTaskBackNodeMapper.delete(wrapper); |
| | | if (list.size() != delete) { |
| | | throw new ServiceException("å é¤å¤±è´¥"); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public boolean deleteByInstanceIds(List<String> processInstanceIds) { |
| | | LambdaQueryWrapper<WfTaskBackNode> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.in(WfTaskBackNode::getInstanceId, processInstanceIds); |
| | | List<WfTaskBackNode> list = wfTaskBackNodeMapper.selectList(wrapper); |
| | | int delete = wfTaskBackNodeMapper.delete(wrapper); |
| | | if (list.size() != delete) { |
| | | throw new ServiceException("å é¤å¤±è´¥"); |
| | | } |
| | | return true; |
| | | } |
| | | } |