java实现将任务轮流分给每一个人,自动派单分配任务,java任务平均分配制度

假如有3位业务主管:    ArratyList 主管={'主管A','主管B','主管C'}
1.需求:
	业务员提交的订单分配给3位主管中任意一位去审核,业务主管提交的订单分配给另外两位业务主管去审核
	即业务主管自己不能审核自己提交的订单.
	例如:
	当业务员提交订单1,将该订单分配给主管A去审核,
	当业务员提交订单2,将该订单分配给主管B去审核,
	当业务员提交订单3,将该订单分配给主管C去审核,
	当业务员提交订单4,将该订单分配给主管A去审核,
	...
	当业务主管A提交订单1,将该订单分配给主管B去审核,
	当业务主管A提交订单2,将该订单分配给主管C去审核,
	当业务主管B提交订单3,将该订单分配给主管A去审核,
	当业务主管B提交订单4,将该订单分配给主管C去审核,
	...
	/**
     * 轮流分配审核订单给业务主管
     *  contractManage 要分配的订单
     * 	manager		   当前登录人(提交订单的人)
     */
    public void assignmentAudit(ContractManage contractManage,Manager manager){
        //获取所有在职的业务主管(不包含订单提交者)集合A
         //说明一下:为什么ArrayList<>泛型是BigInteger,因为我使用的是原生sql查询,所以返回的是该类型,如果是hql就是Long类型.不然会报错**java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long 错误;**
        ArrayList<BigInteger> mids = managerRepository.findAllBusinessExecutive(contractManage.getInputUId());
        //获取所有在职的业务主管(包含订单提交者)集合B
        ArrayList<BigInteger> mids1 = managerRepository.findAllBusinessExecutive1();
        //1.如果当前没有业务主管------>抛异常
        if (mids.size() < 1 || mids1.size() < 1) {
            throw new CustomException(EnumErrorMsg.NO_BUSINESS_EXECUTIVES.getCode(), EnumErrorMsg.NO_BUSINESS_EXECUTIVES.getMsg());
        }
        //获取最后一个订单的审核人id
        BigInteger contractAuditId = contractManageRepository.getContractAuditIdByInputId();
        if (contractAuditId==null){
            //如果没有默认让第一个业务主管审核
            Long str = (mids1.get(0)).longValue();
            contractManage.setContractAuditByInTurnId(str);
            System.out.println("已将该订单审核权限交给 " + mids1.get(0));
            return;
        }
        //获取当前登录人的角色
        String role = getRoleByMid(manager.getMid().toString());
        //当前登录人是业务主管
        if (role.equals(EnumRoleLevel.BUSINESS_DIRECTOR.getType())) {
            for (int i = 0; i < mids.size(); i++) {
                //如果有多个业务主管--->将该订单的审核人id设置为订单所对应的下一个审核人id
                //判断该id在业务主管集合中的位置
                for (int j = 0; j < mids.size(); j++) {
                    if (contractAuditId .equals(mids.get(j))) {
                        //如果contractAuditId已经是集合最后一个元素了
                        if (contractAuditId.equals(mids.get(mids.size() - 1))) {
                            contractManage.setContractAuditByInTurnId(mids.get(0).longValue());
                            System.out.println("已将该订单审核权限交给 " + mids.get(0));
                            break;
                        } else {
                            //如果不是最后一个元素就设置为其下一个元素
                            contractManage.setContractAuditByInTurnId(mids.get(j + 1).longValue());
                            System.out.println("已将该订单审核权限交给 " + mids.get(j + 1));
                            break;
                        }
                    }
                    Long str = (mids.get(0)).longValue();
                    contractManage.setContractAuditByInTurnId(str);
                    System.out.println("已将该订单审核权限交给 " + mids.get(0));
                    break;
                }
            }
        } else {
            //当前登录人不是业务主管
            for (int i = 0; i < mids1.size(); i++) {
                //如果有多个业务主管--->将该订单的审核人id设置为最后提交的订单所对应的下一个审核人id
                //判断该id在业务主管集合中的位置
                for (int j = 0; j < mids1.size(); j++) {
                    if (contractAuditId .equals(mids1.get(j))) {
                        //如果contractAuditId已经是集合最后一个元素了
                        if (contractAuditId.equals(mids1.get(mids.size() - 1))) {
                            contractManage.setContractAuditByInTurnId(mids1.get(0).longValue());
                            System.out.println("已将该订单审核权限交给 " + mids1.get(0));
                            break;
                        } else {
                            //如果不是最后一个元素就设置为其下一个元素
                            contractManage.setContractAuditByInTurnId(mids1.get(j + 1).longValue());
                            System.out.println("已将该订单审核权限交给 " + mids1.get(j + 1));
                            break;
                        }
                    }
                }
                break;
            }
        }
        //保存该订单信息
        ContractManage save = contractManageRepository.save(contractManage);
        //保存该订单对应的指定审核人的实体信息
        ContractAuditByInTurn auditByInTurn = new ContractAuditByInTurn(save);
        contractAuditRepo.save(auditByInTurn);
    }
    /**
    *总的来说,分以下几种情况:
    * 1.当前登录人是业务主管(订单提交者是业务主管),因为需求是订单不能分配给业务主管审核,这时候需要用到不包含业务主管本人的集合A.然后判断上一个订单是谁审核的(最后一个订单).
    * 	a.如果是第一个人审核的:
    * 		继续判断第一个人是不是最后一个人:
    * 			如果是最后一个人:
    * 				指派给第一个人审核;
    * 			如果不是最后一个人:
    * 				指派给下一个人审核.
    * 	b.如果最后一个订单审核者正是当前当前登录人(此时当前登录人id肯定不等于集合A中任意元素):
    * 		自动指派给集合A中第一个元素审核;
    * 2.当前登录人不是业务主管(订单提交者不是业务主管),这时候用到包含所有业务主管的集合B.然后判断上一个订单是谁审核的(最后一个订单).	
    * 		a.判断该订单的审核人是不是集合B中的最后一个人(一定是集合B中的其中一个人,如果是空的,自动指派给第一个人审核,上面代码有提到)
    * 			如果是最后一个人:
    * 				指派给第一个人审核		
    * 			如果不是最后一个人:
    * 				指派给下一个人审核.	
    *		
    */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值