随机生成红包金额
思路:1. 红包总金额、红包总数通过参数传递;
2. 红包最小金额可配置
3. 每次算出一个最大红包金额的上限,保证每次分配红包金额不大于最大金额,不小于最小金额
4. 如果剩余最后2个名额,保证最后两个人的红包总额不超过剩余金额
- 生成红包
/**
* 拆分红包
* @param money 红包总金额
* @param count 红包总数
* @return List
*/
public List makeRedPacket(double money, int count) {
//红包的最小金额
double min = RedisConstant.RED_PACKET_MIN_MONEY;
//红包的最大金额
double max;
//每个红包的金额
double account;
DecimalFormat decimalFormat = new DecimalFormat("###.##");
List arrayList = new ArrayList();
int i = 1;
while (i < count) {
//保障最大红包已出现,后面剩下的红包金额也不会小于最小金额
max = money - min * (count - i);
//保证最后两个人拿的红包不超出剩余金额
int k = (int) (count - i) / 2;
if (count - i <= 2) {
k = count - i;
}
//最大的红包限定的平均线
max /= k;
//保证每个红包大于最小值,又不会大于最大值
account = (int) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));
account = Double.parseDouble(decimalFormat.format(account/100));
money = (int)(money*100 - account*100);
money = money/100;
arrayList.add(account);
i++;
//最后一个人拿走剩下的红包
if (i == count) {
arrayList.add(money);
}
}
return arrayList;
}
- 保存生成红包信息
/**
* 红包拆分
* @param money 红包金额
* @param count 红包总数
* @return AjaxUtil
*/
@Override
public AjaxUtil makeRedPacket(double money, int count) {
Long uniqueId = uniqueId();
String key = RedisConstant.RED_PACKET_KEY + uniqueId;
List redPacket = redPacketUtil.makeRedPacket(money, count);
redisTemplate.opsForList().leftPushAll(key, redPacket);
//红包中最大的
double max = (double) Collections.max(redPacket);
redisTemplate.opsForHash().put(RedisConstant.RED_PACKET_CONSUMER + uniqueId, "max_red_packet", max);
redisTemplate.opsForHash().put(RedisConstant.RED_PACKET_CONSUMER + uniqueId, "size", count);
redisTemplate.expire(key, 3, TimeUnit.HOURS);
logger.info("红包拆分信息:{}=>{}", key, redPacket);
return AjaxUtil.success();
}
效果:
- 创建红包
2. 抢红包
- 红包信息