package com.project.approval.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.project.approval.domain.ApprovalNode; import com.project.approval.domain.ApprovalNodeLink; import com.project.approval.domain.vo.ApprovalNodeVo; import com.project.approval.service.IApprovalNodeLinkService; import com.project.approval.service.IApprovalNodeService; import com.project.common.constant.ApprovalConstants; import com.project.common.exception.base.BaseException; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import cn.hutool.core.convert.Convert; import com.project.common.utils.StringUtils; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.transaction.annotation.Transactional; import com.project.approval.domain.vo.ApprovalFlowVo; import com.project.approval.domain.bo.editBo.ApprovalFlowBo; import com.project.approval.domain.bo.queryBo.ApprovalFlowQueryBo; import com.project.approval.domain.ApprovalFlow; import com.project.approval.mapper.ApprovalFlowMapper; import com.project.approval.service.IApprovalFlowService; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 审批流程Service业务层处理 * * @author manton */ @Service @RequiredArgsConstructor(onConstructor_ = @Autowired) public class ApprovalFlowServiceImpl extends ServiceImpl implements IApprovalFlowService { private final IApprovalNodeLinkService linkService; private final IApprovalNodeService nodeService; @Override//列表查询 public List queryList(ApprovalFlowQueryBo bo) { QueryWrapper qw = getQw(bo); List list = this.list(qw); return Convert.toList(ApprovalFlowVo.class , list); } @Override//id查询 public ApprovalFlowVo queryById(Long flowId) { ApprovalFlow db = this.baseMapper.selectById(flowId); ApprovalFlowVo vo = Convert.convert(ApprovalFlowVo.class, db); this.setChildByFlowId(vo); return vo; } @Override//添加 @Transactional public Boolean insertByBo(ApprovalFlowBo bo) { saveFlowByBo(bo); List nodeVos = new ArrayList<>(); List voList = getLinkNode(nodeVos, bo); ApprovalFlow one = this.getOne(new LambdaQueryWrapper().eq(ApprovalFlow::getFlowName, bo.getFlowName())); List collect = voList.stream().map(ApprovalNodeVo::getNodeId).collect(Collectors.toList()); String join = StringUtils.join(collect,",",0,collect.size()); ApprovalNodeLink saveLink = new ApprovalNodeLink().setFlowId(one.getFlowId()).setNodeIds(join); linkService.save(saveLink); return true; } @Override//修改 @Transactional public Boolean updateByBo(ApprovalFlowBo bo) { saveFlowByBo(bo); List nodeVos = new ArrayList<>(); List voList = getLinkNode(nodeVos, bo); ApprovalFlow one = this.getOne(new LambdaQueryWrapper().eq(ApprovalFlow::getFlowName, bo.getFlowName())); List collect = voList.stream().map(ApprovalNodeVo::getNodeId).collect(Collectors.toList()); String join = StringUtils.join(collect,",",0,collect.size()); ApprovalNodeLink saveLink = new ApprovalNodeLink().setFlowId(one.getFlowId()).setNodeIds(join); linkService.updateById(saveLink); return true; } @Override//删除 @Transactional public Boolean deleteByIds(Collection ids) { //做一些业务上的校验,判断是否需要校验 return this.removeByIds(ids); } //------------------------------------------------------------------------------------- /** * 根据bo保存流程 * @param bo 参数 */ @Transactional public void saveFlowByBo(ApprovalFlowBo bo) { validBo(bo); ApprovalFlow save = Convert.convert(ApprovalFlow.class, bo); List collect = bo.getNodeVos().stream().map(ApprovalNodeVo::getNodeId).collect(Collectors.toList()); String join = StringUtils.join(collect,",",0,collect.size()); save.setFlowNodeIds(join); validEntityBeforeSave(save); this.saveOrUpdate(save); ApprovalFlow one = this.getOne(new LambdaQueryWrapper().eq(ApprovalFlow::getFlowName, save.getFlowName())); bo.setFlowId(one.getFlowId()); if (StringUtils.isNotEmpty(bo.getChild())){ for (ApprovalFlowBo approvalFlowBo : bo.getChild()) { approvalFlowBo.setParentId(one.getFlowId()); this.saveFlowByBo(approvalFlowBo); } } } /** * 获取线性节点 * @param nodeVos 节点数组 * @param bo 参数 * @return 线性节点 */ private List getLinkNode(List nodeVos, ApprovalFlowBo bo) { nodeVos.addAll(bo.getNodeVos()); if (StringUtils.isNotEmpty(bo.getChild())){ for (ApprovalFlowBo approvalFlowBo : bo.getChild()) { return this.getLinkNode(nodeVos, approvalFlowBo); } } else { return nodeVos; } return nodeVos; } /** * 设置子流程 * @param vo 流程vo */ private void setChildByFlowId(ApprovalFlowVo vo) { List list = this.list(new LambdaQueryWrapper().eq(ApprovalFlow::getParentId, vo.getFlowId())); String[] nodeIdStrArr = vo.getFlowNodeIds().split(","); List nodeIdStrList = Arrays.asList(nodeIdStrArr); List nodeIdList = nodeIdStrList.stream().map(Long::parseLong).collect(Collectors.toList()); List nodeList = nodeService.list(new LambdaQueryWrapper().in(ApprovalNode::getNodeId, nodeIdList)); List nodeVos = Convert.toList(ApprovalNodeVo.class, nodeList); vo.setNodeVos(nodeVos); List child = null; if (StringUtils.isNotEmpty(list)) { child = Convert.toList(ApprovalFlowVo.class, list); for (ApprovalFlowVo approvalFlowVo : child) { this.setChildByFlowId(approvalFlowVo); } } vo.setChild(child); } /** * 必要参数校验 * @param bo 参数 */ private void validBo(ApprovalFlowBo bo) { if (StringUtils.isEmpty(bo.getNodeVos())){ throw new BaseException(ApprovalConstants.LOSS_FLOW_NODE); } if (StringUtils.isNotEmpty(bo.getChild())){ for (ApprovalFlowBo childBo : bo.getChild()) { validBo(childBo); } } } /** * 实体校验,处理必要数据 * @param entity 实体 */ private void validEntityBeforeSave(ApprovalFlow entity) { int nameCount = 0; if (entity.getFlowId()==null){ //新增 nameCount = this.count(ApprovalFlow::getFlowName, entity.getFlowName()); } else { //修改 nameCount = this.count(new LambdaQueryWrapper() .eq(ApprovalFlow::getFlowName, entity.getFlowName()) .ne(ApprovalFlow::getFlowId, entity.getFlowId())); } if (nameCount>0) { throw new BaseException(ApprovalConstants.EXIST_FLOW_NAME); } } /** * 获取查询条件 * @param bo 入参 * @return 查询条件 */ private QueryWrapper getQw(ApprovalFlowQueryBo bo) { QueryWrapper qw = Wrappers.query(); qw.like(StringUtils.isNotEmpty(bo.getFlowName()), "flow_name", bo.getFlowName()); qw.eq(StringUtils.isNotEmpty(bo.getFlowCode()), "flow_code", bo.getFlowCode()); qw.eq(bo.getParentId() != null, "parent_id", bo.getParentId()); qw.eq(StringUtils.isNotEmpty(bo.getFlowStatic()), "flow_static", bo.getFlowStatic()); qw.eq(bo.getSortNum() != null, "sort_num", bo.getSortNum()); if (StringUtils.isNotEmpty(bo.getIsAsc()) && StringUtils.isNotEmpty(bo.getOrderByColumn())){ if ("acs".equals(bo.getIsAsc())) { qw.orderByAsc(bo.getOrderByColumn()); } else if ("desc".equals(bo.getIsAsc())) { qw.orderByDesc(bo.getOrderByColumn()); } } return qw; } }