使用java实现三级审核兼容二级审批

使用java实现三级审批流程业务代码,实现业务为
三级 a > b> c
二级 a>b
a -> b-> c
b驳回>a
c驳回>a
要求a和b和c都能看到审核过程(在前端体现),根据不同状态展示

 @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult updateDlfxWarnProblem(DlfxWarnProblem dlfxWarnProblem) {
        DlfxProcessWarnProblem processWarnProblem = dlfxWarnProblem.getCurProcess();
        dlfxWarnProblem.setUpdateTime(DateUtils.getNowDate());
        processWarnProblem.setUpdateTime(DateUtils.getNowDate());
        /**
         * 根据提交状态submitState 判断是否进入下一阶段
         * 保存:
         *      根据阶段判断是否处于第一阶段:
         *          一阶段:根据主键pId更新数据 problemDesc solutions
         *          大于一阶段:根据主键pId更新流程表中的数据  auditDesc
         *  提交:
         *      1、根据阶段判断是否处于第一阶段:
         *          一阶段:根据主键pId更新数据 problemDesc solutions  auditStage
         *        大于一阶段:
         *              根据主键pId更新数据 problemDesc solutions  auditStage(同意  进入下一个阶段,驳回直接回退到第一阶段且auditNum为auditNum+1)
         *              根据主键pId更新流程表中的数据  auditDesc auditStage auditState(同意  进入下一个阶段,驳回直接回退到第一阶段且auditNum为auditNum+1)
         *      2、根据组织机构编码查询下一环节审批人,构造流程信息插入数据,并根据该项预警是否需要发送短信来给审批人发短信
         *
         */
        try {
            Integer submitState = dlfxWarnProblem.getSubmitState();
            Long stage = dlfxWarnProblem.getAuditStage();
            if (Constants.PROCESS_SAVE.equals(submitState)) {
                //保存
                Integer a = dlfxWarnProblemMapper.updateDlfxWarnProblem(dlfxWarnProblem);
                processWarnProblem.setAuditState(Constants.PROCESS_SAVE.longValue());
                dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(processWarnProblem);
                return AjaxResult.success();
            }

            dlfxWarnProblem.setAuditNum(dlfxWarnProblem.getAuditNum() + 1);
            // 查询配置
            DlfxProcessConfig config = new DlfxProcessConfig();
            config.setIsDelete(0);
            List<DlfxProcessConfig> configList = dlfxProcessConfigMapper.selectDlfxProcessConfigList(config);
            Map<String, List<Long>> configMap = configList.stream()
                    .sorted(Comparator.comparing(DlfxProcessConfig::getOrderNum))
                    .collect(Collectors.groupingBy(DlfxProcessConfig::getProcessCode,
                            Collectors.mapping(DlfxProcessConfig::getStage, Collectors.toList())));

            //根据阶段查询下一环节审批人
            DlfxPost dlfxPost = new DlfxPost();
            List<Long> stageList = configMap.get(dlfxWarnProblem.getAuditCode());
            int index;
            // 现附上二级单位id
            String depId = dlfxWarnProblem.getSecondDeptId();
            // 审批树
            List<String> auditTreeArray = Arrays.stream(Optional.ofNullable(processWarnProblem.getAuditTree())
                    .orElse("").split("/"))
                    .collect(Collectors.toList());
            if (Constants.PROCESS_SUBMIT.equals(submitState)) {
                if (Constants.REFUSE_STAGE.equals(dlfxWarnProblem.getAuditStage())) {
                    dlfxWarnProblem.setAuditStage(Constants.START_STAGE);
                }
                index = stageList.indexOf(dlfxWarnProblem.getAuditStage()) + 1;
                if (index >= stageList.size() - 1) {
                    index = stageList.size() - 1;
                    depId = Constants.JT_DEPT_ID;
                }
                // 获取下一阶段
                dlfxPost.setStage(stageList.get(index));
            } else {
                dlfxPost.setErpNumber(auditTreeArray.get(0));
                depId = StrUtil.isBlank(dlfxWarnProblem.getThirdDeptId()) ? dlfxWarnProblem.getSecondDeptId()
                        : dlfxWarnProblem.getThirdDeptId();
            }
            dlfxPost.setDeptId(depId);
            List<DlfxPost> posts = dlfxPostMapper.selectDlfxPostList(dlfxPost);
            if (posts.isEmpty()) {
                return AjaxResult.error("当前公司当前阶段没有下一阶段审批人员,请从值班用户职责配置中配置人员");
            }


            //防止并发,为submitInfo方法添加分布式锁
            String key = dlfxWarnProblem.getpId() + dlfxWarnProblem.getProblemName();
            RLock lock = redissonClient.getLock(key);
            try {
                lock.lock();
                if (!Constants.JT_DEPT_ID.equals(depId)) {
                    // 查看当前流程pid是否一致的
                    List<DlfxProcessWarnProblem> processWarnProblems = dlfxProcessWarnProblemMapper.selectDlfxProcessWarnProblemByPid(processWarnProblem.getpId(), processWarnProblem.getAuditStage());
                    if (!ObjectUtils.isEmpty(processWarnProblems)) {
                        processWarnProblems.forEach(c -> {
                            //ErpNumber不相同,流程阶段相同,pid相同,表示问题重复了,删除另一个用户的信息
                            if (c.getErpNumber() != processWarnProblem.getErpNumber() &&
                                    c.getAuditStage().equals(processWarnProblem.getAuditStage())) {
                                c.setIsDelete(1);
                                // todo 需要优化不能循环插入
                                dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(c);
                            }
                        });
                    }
                }
                submitInfo(dlfxWarnProblem, processWarnProblem, submitState, posts);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }

            return AjaxResult.success();
        } catch (
                Exception e) {
            e.printStackTrace();
            return AjaxResult.error();
        }

    }
/**
     * 构造流程信息
     *
     * @param processWarnProblem
     * @param dlfxWarnProblem
     * @param post
     */
    public void getProcessWarnProblem(DlfxProcessWarnProblem processWarnProblem, DlfxProcessWarnProblem nextProcess, DlfxWarnProblem dlfxWarnProblem, DlfxPost post) {
        nextProcess.setProcessId(null);
        nextProcess.setAuditTree(processWarnProblem.getAuditTree());
        nextProcess.setAuditStage(dlfxWarnProblem.getAuditStage());
        nextProcess.setCreateor(DateUtils.getDate());
        nextProcess.setpId(dlfxWarnProblem.getpId());
        nextProcess.setAuditState(Constants.PROCESS_NEW.longValue());
        nextProcess.setAuditNum(dlfxWarnProblem.getAuditNum());
        nextProcess.setErpNumber(post.getErpNumber());
        nextProcess.setReportName(post.getName());
        nextProcess.setMobile(post.getMobile());
        nextProcess.setPostCode(post.getPostCode());
        nextProcess.setPostName(post.getPostName());
    }
private void submitInfo(DlfxWarnProblem dlfxWarnProblem, DlfxProcessWarnProblem processWarnProblem, Integer submitState, List<DlfxPost> posts) {
        dlfxWarnProblem.setAuditStage(getNextStage(dlfxWarnProblem));
        // 更新问题列表
        dlfxWarnProblemMapper.updateDlfxWarnProblem(dlfxWarnProblem);
        //存在就不追加不存在就追加
        if (StringUtils.isEmpty(processWarnProblem.getAuditTree())) {
            processWarnProblem.setAuditTree(processWarnProblem.getErpNumber());
        } else {
            List<String> list = Arrays.stream(processWarnProblem.getAuditTree().split("/"))
                    .collect(Collectors.toList());
            if (!list.contains(processWarnProblem.getErpNumber())) {
                processWarnProblem.setAuditTree(processWarnProblem.getAuditTree() + "/" + processWarnProblem.getErpNumber());
            }
        }

        if (Constants.PROCESS_SUBMIT.equals(submitState)) {
            processWarnProblem.setAuditState(Constants.PROCESS_SUBMIT.longValue());
            processWarnProblem.setAuditNum(dlfxWarnProblem.getAuditNum());
            dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(processWarnProblem);
        } else {
            //驳回
            processWarnProblem.setAuditState(Constants.PROCESS_REJICT.longValue());
            dlfxProcessWarnProblemMapper.updateDlfxProcessWarnProblem(processWarnProblem);
        }

        if (Constants.SUCCESS_STAGE.equals(dlfxWarnProblem.getAuditStage())) {
            // 问题落表
            int success = r01YjwtService.passAdd(dlfxWarnProblem);
            if (success <= 0) {
                log.info("问题数据落表处理失败!");
            }
        } else {
            DlfxProcessWarnProblem nextProcess = new DlfxProcessWarnProblem();
            if (!posts.isEmpty()) {
                getProcessWarnProblem(processWarnProblem, nextProcess, dlfxWarnProblem, posts.get(0));
            }
            dlfxProcessWarnProblemMapper.insertDlfxProcessWarnProblem(nextProcess);
        }
        //判断是否需要发短信
        DlfxWarnConfig config = dlfxWarnProblem.getConfig();
        if (config.getIsSendSms() == 0) {
            String erpNumber=processWarnProblem.getAuditTree().split("/")[0];
            DlfxPost dlfxPost=new DlfxPost();
            dlfxPost.setErpNumber(erpNumber);
            dlfxPost.setIsDelete(0);
            List<DlfxPost> posts1 = dlfxPostMapper.selectDlfxPostList(dlfxPost);
            //TODO 调用短信接口发送短信
            if(dlfxWarnProblem.getAuditStage()==Constants.REFUSE_STAGE){
//                System.out.println("您提交的问题未通过审核");
                    HttpSend.send(posts1.get(0).getMobile(),"您提交的问题未通过审核","");
            }if(dlfxWarnProblem.getAuditStage()==Constants.SUCCESS_STAGE){
//                System.out.println("您提交的问题已通过审核");
                    HttpSend.send(posts1.get(0).getMobile(),"您提交的问题已通过审核","");
            }
        }
    }
 // 获取下一环节阶段
    private Long getNextStage(DlfxWarnProblem dlfxWarnProblem) {
        String code = dlfxWarnProblem.getAuditCode();
        Integer submitState = dlfxWarnProblem.getSubmitState();
        if (Constants.PROCESS_REJICT.equals(submitState)) {
            return Constants.REFUSE_STAGE;
        }

        DlfxProcessConfig config = new DlfxProcessConfig();
        config.setIsDelete(0);
        config.setProcessCode(code);
        List<DlfxProcessConfig> configs = dlfxProcessConfigMapper.selectDlfxProcessConfigList(config);

        // 获取最大的阶段
        DlfxProcessConfig maxConfig = configs.stream()
                .max(Comparator.comparing(DlfxProcessConfig::getOrderNum))
                .orElse(new DlfxProcessConfig());
        //判断当前阶段是否等于最大阶段
        if (dlfxWarnProblem.getAuditStage().equals(maxConfig.getStage())) {
            //是 返回结束阶段的参数
            return Constants.SUCCESS_STAGE;
        }
        // 找到当前的配置
        DlfxProcessConfig nowConfig = configs.stream()
                .filter(t -> dlfxWarnProblem.getAuditStage().equals(t.getStage()) || dlfxWarnProblem.getAuditStage() == 999)
                .findFirst().orElse(new DlfxProcessConfig());
        // 过滤数据,查找下一个排序的数据
        return configs.stream().filter(t -> Constants.PROCESS_SUBMIT.equals(submitState)
                && t.getOrderNum().equals(nowConfig.getOrderNum() + 1))
                .mapToLong(t -> t.getStage()).findFirst().orElse(dlfxWarnProblem.getAuditStage());
    }
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值