package jnpf.flowable.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.yulichang.extension.mapping.wrapper.MappingQuery; import jnpf.base.UserInfo; import jnpf.base.service.SuperServiceImpl; import jnpf.flowable.entity.CandidatesEntity; import jnpf.flowable.entity.OperatorEntity; import jnpf.flowable.entity.TemplateNodeEntity; import jnpf.flowable.mapper.CandidatesMapper; import jnpf.flowable.model.task.FlowModel; import jnpf.flowable.model.util.FlowNature; import jnpf.flowable.service.CandidatesService; import jnpf.flowable.service.OperatorService; import jnpf.util.RandomUtil; import jnpf.util.StringUtil; import jnpf.util.UserProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 类的描述 * * @author JNPF@YinMai Info. Co., Ltd * @version 5.0.x * @since 2024/4/18 16:03 */ @Service public class CandidatesServiceImpl extends SuperServiceImpl implements CandidatesService { @Autowired private OperatorService operatorService; @Override public List getList(String taskId, String nodeCode) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtil.isNotEmpty(taskId)) { queryWrapper.lambda().eq(CandidatesEntity::getTaskId, taskId); } if (StringUtil.isNotEmpty(nodeCode)) { queryWrapper.lambda().eq(CandidatesEntity::getNodeCode, nodeCode); } return this.list(queryWrapper); } public List getListByCode(String taskId, String nodeCode) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CandidatesEntity::getTaskId, taskId).eq(CandidatesEntity::getNodeCode, nodeCode); return this.list(queryWrapper); } @Override public void create(FlowModel fo, String taskId, List nodeEntityList, OperatorEntity operator) { UserInfo userInfo = UserProvider.getUser(); // 候选人 Map> candidateList = fo.getCandidateList(); for (String key : candidateList.keySet()) { TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(key)).findFirst().orElse(null); if (null == nodeEntity) { continue; } // 删除原先的节点的候选人 // this.delete(taskId, nodeEntity.getNodeCode()); List list = candidateList.get(key); this.create(taskId, nodeEntity, operator, userInfo, list, FlowNature.Candidates); } // 异常人 Map> errorRuleUserList = fo.getErrorRuleUserList(); for (String key : errorRuleUserList.keySet()) { TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(key)).findFirst().orElse(null); if (null == nodeEntity) { continue; } List list = errorRuleUserList.get(key); this.create(taskId, nodeEntity, operator, userInfo, list, FlowNature.CandidatesError); } } public void create(String taskId, TemplateNodeEntity nodeEntity, OperatorEntity operator, UserInfo userInfo, List list, Integer type) { CandidatesEntity entity = new CandidatesEntity(); entity.setId(RandomUtil.uuId()); entity.setTaskId(taskId); entity.setNodeCode(nodeEntity.getNodeCode()); String nodeId = ""; if (operator != null) { entity.setOperatorId(operator.getId()); nodeId = operator.getNodeId(); } else { entity.setOperatorId(FlowNature.ParentId); } List entityList = this.getListByCode(taskId, nodeEntity.getNodeCode()); if (CollectionUtil.isNotEmpty(entityList)) { QueryWrapper operatorWrapper = new QueryWrapper<>(); operatorWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).eq(OperatorEntity::getNodeId, nodeId); List opList = operatorService.list(operatorWrapper); if (CollectionUtil.isNotEmpty(opList)) { List opIds = opList.stream().map(OperatorEntity::getId).collect(Collectors.toList()); List deleteList = entityList.stream() .filter(e -> !opIds.contains(e.getOperatorId())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(deleteList)) { this.removeByIds(deleteList); } } } entity.setAccount(userInfo.getUserAccount()); entity.setHandleId(userInfo.getUserId()); entity.setType(type); entity.setCandidates(String.join(",", list)); this.save(entity); } public void delete(String taskId, String nodeCode) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CandidatesEntity::getTaskId, taskId) .eq(CandidatesEntity::getNodeCode, nodeCode); List list = this.list(queryWrapper); if (CollectionUtil.isNotEmpty(list)) { this.removeByIds(list); } } @Override public void deleteByCodes(String taskId, List nodeIds) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CandidatesEntity::getTaskId, taskId); if (CollectionUtil.isNotEmpty(nodeIds)) { queryWrapper.lambda().in(CandidatesEntity::getNodeCode, nodeIds); } List list = this.list(queryWrapper); if (CollectionUtil.isNotEmpty(list)) { this.removeByIds(list); } } @Override public void delete(String taskId, List nodeIds, List userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CandidatesEntity::getTaskId, taskId).in(CandidatesEntity::getHandleId, userId); if (CollectionUtil.isNotEmpty(nodeIds)) { queryWrapper.lambda().in(CandidatesEntity::getNodeCode, nodeIds); } List list = this.list(queryWrapper); if (CollectionUtil.isNotEmpty(list)) { this.removeByIds(list); } } @Override public List getBranch(String taskId, String nodeCode) { List resList = new ArrayList<>(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(CandidatesEntity::getTaskId, taskId).eq(CandidatesEntity::getNodeCode, nodeCode) .eq(CandidatesEntity::getType, FlowNature.Branch); List list = this.list(queryWrapper); if (CollectionUtil.isNotEmpty(list)) { for (CandidatesEntity entity : list) { if (StringUtil.isNotEmpty(entity.getCandidates())) { List branch = Arrays.stream(entity.getCandidates().split(",")).collect(Collectors.toList()); resList.addAll(branch); } } } return resList; } @Override public void createBranch(List branchList, OperatorEntity operator) { if (CollectionUtil.isNotEmpty(branchList)) { this.deleteBranch(operator.getTaskId(), operator.getNodeCode()); CandidatesEntity entity = new CandidatesEntity(); entity.setId(RandomUtil.uuId()); entity.setTaskId(operator.getTaskId()); entity.setNodeCode(operator.getNodeCode()); entity.setOperatorId(operator.getId()); entity.setType(FlowNature.Branch); entity.setCandidates(String.join(",", branchList)); this.save(entity); } } @Override public void deleteBranch(String taskId, String nodeCode) { QueryWrapper wrapper = new MappingQuery<>(); wrapper.lambda().eq(CandidatesEntity::getTaskId, taskId).eq(CandidatesEntity::getNodeCode, nodeCode) .eq(CandidatesEntity::getType, FlowNature.Branch); this.remove(wrapper); } }