随机生成红包金额
思路: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. 抢红包
代码下载地址