1. 程式人生 > >java實戰演算法根據個數百分比,排序金額分配案件金額也趨近百分比(二)

java實戰演算法根據個數百分比,排序金額分配案件金額也趨近百分比(二)

	//案件按照金額排序
	private void sortCases(List<CaseHead> caseHeads) {
		Collections.sort(caseHeads, new Comparator<CaseHead>() {
			@Override
			public int compare(CaseHead o1, CaseHead o2) {
				return (int) (o2.getMoney() - o1.getMoney()) * 1000;
			}
		});
	}

	//案件按照使用者金額排序
	private void sortUserMoney(List<User> Users) {
		Collections.sort(Users, new Comparator<User>() {
			@Override
			public int compare(User o1, User o2) {
				return (int) (o2.getSplitTotal() - o1.getSplitTotal()) * 1000;
			}
		});
	}

	//案件按照使用者百分比排序
	private void sortUserRate(List<User> Users) {
		Collections.sort(Users, new Comparator<User>() {
			@Override
			public int compare(User o1, User o2) {
				return (int) (o2.getSplitRate() - o1.getSplitRate()) * 1000;
			}
		});
	}

	


	//*********************************************新版催收公司分案相關2018-02-05************************************************//
	@Override
	public List<User> updateAutoCaseSplit(CaseHead head,CaseParamsExtend exParams,List<User> users,String tableName) {
		if (head == null){
			return users;
		}
		if (users == null || users.size() == 0){
			return users;
		}
		//獲取案件
		List<CaseHead> heads=caseHeadMapper.getCaseHeadAll(head,exParams,tableName);
		if (heads == null || heads.size() == 0){
			return users;
		}
		// 進行分案處理 1.案件金額排序
		sortCases(heads);
		Integer casecount=heads.size();//案件個數
		//將使用者排序打亂
		Collections.shuffle(users);

		List<CaseHead> caselist=new ArrayList<CaseHead>();//剩餘案件
		caselist=heads;
		Integer count=1;//判斷是第幾次取值
		Integer lastcount=casecount;
		for (User  userCase : users) {
			double userCaseCount=casecount*userCase.getSplitRate()/100;
			Integer usercount=(int)Math.floor(userCaseCount);
			lastcount = lastcount-usercount;
		}
		while(true){
			int size = users.size();//有待分案件
			if(caselist.size()>0 && caselist.size()>lastcount){//有待收案件使用者
				//獲取每個人得多少值,計算之後剩餘的案件隨機分配
				if(count%2 != 0){//當為奇數時從頭取。為偶數時從尾取
					//按案件金額排序使用者 小的先取
					sortUserMoney(users);
					//log.debug("催收員排序:"+users.toString());
					for (int i = users.size()-1; i >= 0 ; i--) {
						gettopcase(caselist,users.get(i),casecount);//從頭取案件
						 log.debug("催收員:"+users.get(i).getName()+"分後總金額"+users.get(i).getSplitTotal());
					}
					count=count+1;
				}else{//尾 按案件金額排序使用者 大的先取
					sortUserMoney(users);
					//log.debug("催收員排序:"+users.toString());
					for (User  userCase : users) {
						getendcase(caselist, userCase,casecount);//從尾取案件
						log.debug("催收員:"+userCase.getName()+"分後總金額"+userCase.getSplitTotal());
					}
					count=count+1;
				}
			}else if (caselist.size() >0 && caselist.size() <= lastcount ){//剩餘幾個分不出去了按百分比從大到小依次分一波
				sortUserRate(users);
				//log.debug("催收員排序:"+users.toString());
				for (User  userCase : users) {
					getcase(caselist, userCase);
					log.debug("催收員:"+userCase.getName()+"分後總金額"+userCase.getSplitTotal());
				}
			}else{
				break;
			}
		}
		return  users;
	}

	private static boolean chackUserTotalNum(List<User> users) {
		boolean flag = true;
		double samenum = users.get(0).getSplitTotal();
		for (User user : users) {
			if(user.getSplitTotal() != samenum){
				flag = false;
			}
		}
		return flag;
	}

	private  void gettopcase(List<CaseHead> cases, User userCase,Integer casecount) {
		double userCaseCount=casecount*userCase.getSplitRate()/100;
		Integer count=(int)Math.floor(userCaseCount);
		if (count > 0 && userCase.getSplitCount() != count && cases.size() > 0) {//此使用者被分到的案子大於一個並且不大於應分配的數時
			CaseHead addcase = cases.get(0);//取第一個案件
			userCase.addCaseHead(addcase);//中
			log.debug("分配案件金額"+addcase.getMoney());
			cases.remove(0);//清除分過的元素
		}
	}

	private  void getendcase(List<CaseHead> cases, User userCase,Integer casecount) {
		double userCaseCount=casecount*userCase.getSplitRate()/100;
		Integer count=(int)Math.floor(userCaseCount);
		if (count > 0 && userCase.getSplitCount() != count && cases.size() > 0) {//此使用者被分到的案子大於一個並且不大於應分配的數時
			CaseHead addcase = cases.get(cases.size() - 1);//第最後一個案件
			userCase.addCaseHead(addcase);//中
			log.debug("分配案件金額"+addcase.getMoney());
			cases.remove(cases.size() - 1);//清除分過的元素
		}
	}

	private  void getcase(List<CaseHead> cases, User userCase) {
		if (cases.size() > 0) {//此使用者被分到的案子大於一個並且不大於應分配的數時
			CaseHead addcase = cases.get(0);//取第一個案件
			userCase.addCaseHead(addcase);//中
			log.debug("分配案件金額"+addcase.getMoney());
			cases.remove(0);//清除分過的元素

		}
	}
	//*********************************************催收公司分案相關結束***************************************//