1 背景:
上游系统给本系统一批订单,数量x条(),本系统将订单平均分配给下游系统的员工中
2 方案
先算出每个员工分出的订单总数,放到数组中,然后将员工id放入map的key中
相应的订单数放进map的value中
在分配的时候,根据map中的员工id和相应的总数去做分配
3 分配方法
OrderCount : 订单总数
staffCount : 员工总数
A: 商 = OrderCount / staffCount , 余数 = OrderCount % staffCount
B: 商 == 0 订单总数<员工总数 每个员工分配1个
C: 商 > 0 && 余数 == 0 平均分配
D: 商 > 0 && 余数 > 0 不平均分配
这三种情况都要照顾到
package com.sitech.huxiao.batch.ElectricCanalAgentBatch;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.sitech.huxiao.domin.DistributionRuleEntity;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
/**
* @oauth: qiangSW
* @date: 2020/3/5 21:12
* @description: com.sitech.huxiao.batch.ElectricCanalAgentBatch
* @doc:
*/
public class Demo {
/**
* 平均分配
*
* @param orderCount 订单总数
* @param staffCount 员工总数
* @return int[] 每个员工分配的总数
*/
public int[] distribution(List<Object> orderCount, int staffCount) {
Map<String, Integer> map = Maps.newHashMap();
List<DistributionRuleEntity> list = Lists.newArrayList();
if (CollectionUtils.isEmpty(orderCount) || staffCount == 0) {
return null;
}
int agentMean = orderCount.size() / staffCount;
int agentRemainder = orderCount.size() % staffCount;
/*计算每个员工应该分配的总数*/
int[] agentCount = null;
if (agentMean == 0) {
agentCount = meanEqual0(staffCount);
} else if (agentMean > 0 && agentRemainder == 0) {
agentCount = meanGreater0(staffCount, agentMean);
} else if (agentMean > 0 && agentRemainder > 0) {
agentCount = meanAndRemainderGreater0(staffCount, agentMean, agentRemainder);
}
return agentCount;
}
/**
* 平均数 == 0
*
* @param number
* @return
*/
public int[] meanEqual0(int number) {
int[] array = new int[number];
for (int i = 0; i < number; i++) {
array[i] = 1;
}
return array;
}
/**
* 平均数 > 0 余数 == 0
*
* @param arraySize
* @param mean
* @return
*/
public int[] meanGreater0(int arraySize, int mean) {
int[] array = new int[arraySize];
for (int i = 0; i < arraySize; i++) {
array[i] = mean;
}
return array;
}
/**
* 平均数 > 0 余数 >0
*
* @param arraySize
* @param mean
* @param remainder
* @return
*/
public int[] meanAndRemainderGreater0(int arraySize, int mean, int remainder) {
int[] array = new int[arraySize];
for (int i = 0; i < arraySize; i++) {
if (remainder != 0 && i == remainder) {
array[i] = mean + 1;
} else {
array[i] = mean;
}
}
return array;
}
}