假如有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中的其中一个人,如果是空的,自动指派给第一个人审核,上面代码有提到)
* 如果是最后一个人:
* 指派给第一个人审核
* 如果不是最后一个人:
* 指派给下一个人审核.
*
*/