bravo-调整multi计算

This commit is contained in:
khalil
2025-03-24 20:09:11 +08:00
parent a550d35ab6
commit 9426af3b0d

View File

@@ -87,13 +87,12 @@ public class BravoGiftSendService {
sendMq(recordMap, incomeAllot);
asyncSettlement(config, senderUid, partitionId, gift, everyGiftNum, recordMap,
incomeAllot, room, sendGiftTime);
asyncSettlement(config, senderUid, partitionId, gift, everyGiftNum, recordMap, room);
}
@Async
public void asyncSettlement(BravoGiftConfig config, long senderUid, Integer partitionId, Gift gift, int everyGiftNum,
Map<Long, BravoRecord> recordMap, SuperLuckyGiftIncomeAllot incomeAllot, Room room, Date sendGiftTime) {
Map<Long, BravoRecord> recordMap, Room room) {
BigDecimal totalInput = BigDecimal.valueOf(recordMap.size() * everyGiftNum * gift.getGoldPrice());
BigDecimal totalOutput = recordMap.values().stream().map(BravoRecord::getWinGoldNum).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal outputMultiple = totalOutput.compareTo(BigDecimal.ZERO) > 0? totalOutput.divide(totalInput, 2, RoundingMode.DOWN): BigDecimal.ZERO;
@@ -104,21 +103,25 @@ public class BravoGiftSendService {
Gift gift, int everyGiftNum, BigDecimal everyInput, BigDecimal divisor, int multiple, int multipleGiftNum,
int userTicketNum, List<Long> receiverList, Room room, Date sendGiftTime) {
if (multipleGiftNum > 1 && userTicketNum > 1){
int needTicketNum = multipleGiftNum == 2? 1 : multipleGiftNum == 4 ? 2 : 8;
if (multiple > 1 && userTicketNum > 1){
int needTicketNum = multiple == 2? 1 : multiple == 4 ? 2 : 8;
int superNum = Math.min(userTicketNum / needTicketNum, receiverList.size());
if (superNum < 1){
log.info("[brave] uid {}, superNum < 1, multi {}, needTicketNum {} superNum {}", senderUid, multiple, needTicketNum, superNum);
return drawMultiple(config, senderUid, partitionId, gift, everyGiftNum, everyInput, divisor, multipleGiftNum, receiverList, room, sendGiftTime);
}
int superTicketNum = needTicketNum * superNum;
int subSuperNum = userMetaService.subSuperNum(senderUid, needTicketNum, superNum, superTicketNum);
if (subSuperNum < 1){
log.info("[brave] uid {}, subSuperNum < 1, multi {}, needTicketNum {} superNum {} subSuperNum {}", senderUid, multiple, needTicketNum, superNum, subSuperNum);
return drawMultiple(config, senderUid, partitionId, gift, everyGiftNum, everyInput, divisor, multipleGiftNum, receiverList, room, sendGiftTime);
}
superNum = subSuperNum;
List<Long> superGrilList = receiverList.subList(0, superNum);
receiverList.removeAll(superGrilList);
if (CollectionUtils.isEmpty(receiverList)){
log.info("[brave] uid {}, all of superGril, multi {}, needTicketNum {} superNum {} superGrilList {}",
senderUid, multiple, needTicketNum, superNum, JSON.toJSONString(superGrilList));
return drawSuper(config, senderUid, partitionId, gift, everyGiftNum, everyInput, multiple, superGrilList, room, sendGiftTime);
}
@@ -134,7 +137,7 @@ public class BravoGiftSendService {
BigDecimal everyInput, int multiple, List<Long> superGrilList, Room room, Date sendGiftTime) {
return superGrilList.parallelStream()
.collect(Collectors.toMap(receiverUid-> receiverUid,
receiverUid-> drawSuper(config, senderUid, partitionId, gift, giftNum, receiverUid, everyInput, divisor, multiple, room, sendGiftTime)));
receiverUid-> drawSuper(senderUid, partitionId, gift, giftNum, receiverUid, everyInput, multiple, room, sendGiftTime)));
}
private Map<Long, BravoRecord> drawMultiple(BravoGiftConfig config, Long senderUid, int partitionId, Gift gift, int everyGiftNum, BigDecimal everyInput, BigDecimal divisor, int multipleGiftNum, List<Long> receiverList, Room room, Date sendGiftTime){
@@ -181,31 +184,32 @@ public class BravoGiftSendService {
rocketMQService.sendBatchBravoMessage(messageList);
}
public BravoRecord drawSuper(BravoGiftConfig config, long senderUid, int partitionId, Gift gift, int giftNum, long receiverUid, BigDecimal everyInput,
BigDecimal divisor, int multiple, Room room, Date sendGiftTime) {
public BravoRecord drawSuper(long senderUid, int partitionId, Gift gift, int giftNum, long receiverUid, BigDecimal everyInput,
int multiple, Room room, Date sendGiftTime) {
BigDecimal superMultiple = BigDecimal.ZERO;
int random = RandomUtil.randomByRange(0, 10);
if (random < 3){
boolean isSuper = random < 3;
if (isSuper){
superMultiple = multiple >= 8? oneThousand: fiveHundred;
log.info("[bravo] super yes, uid {} receiver {} random {} multiple {} superMultiple {}",
senderUid, receiverUid, random, multiple, superMultiple);
}
return updateMeta(config, senderUid, partitionId, gift, giftNum, receiverUid, everyInput, divisor, room, sendGiftTime, superMultiple);
log.info("[bravo] super {}, uid {} receiver {} random {} multiple {} superMultiple {}",
isSuper, senderUid, receiverUid, random, multiple, superMultiple);
return updateMeta(senderUid, partitionId, gift, giftNum, receiverUid, everyInput, room, sendGiftTime, superMultiple);
}
public BravoRecord drawMultiple(BravoGiftConfig config, long senderUid, int partitionId,
Gift gift, int giftNum, long receiverUid, BigDecimal totalInput, BigDecimal divisor, int multipleGiftNum, Room room, Date sendGiftTime) {
List<BravoResult> drawResultList = poolService.drawMultipleFromPool(config, senderUid, partitionId, multipleGiftNum);
return updateMeta(config, senderUid, partitionId, gift, giftNum, receiverUid, totalInput, divisor, room, sendGiftTime, drawResultList);
return updateMeta(senderUid, partitionId, gift, giftNum, receiverUid, totalInput, divisor, room, sendGiftTime, drawResultList);
}
private BravoRecord updateMeta(BravoGiftConfig config, long senderUid, int partitionId,
Gift gift, int giftNum, long receiverUid, BigDecimal totalInput, BigDecimal divisor, Room room, Date sendGiftTime,
private BravoRecord updateMeta(long senderUid, int partitionId,
Gift gift, int giftNum, long receiverUid, BigDecimal totalInput, Room room, Date sendGiftTime,
BigDecimal beforeMultiple){
BigDecimal afterMultiple = beforeMultiple;
// 平台库存
if (afterMultiple.compareTo(BigDecimal.ZERO) > 0L){
BigDecimal preWinGoldNum = afterMultiple.multiply(divisor);
BigDecimal preWinGoldNum = afterMultiple.multiply(totalInput);
if (!judgeStock(partitionId, preWinGoldNum, senderUid, receiverUid)){
afterMultiple = BigDecimal.ZERO;
}
@@ -214,15 +218,11 @@ public class BravoGiftSendService {
BigDecimal winGoldNum = afterMultiple.multiply(totalInput);
userMetaService.updateUserMetaAfter(senderUid, totalInput, winGoldNum);
/*if (winGoldNum.compareTo(BigDecimal.ZERO) > 0){
settlementService.syncSendReward(config, senderUid, room, gift, winGoldNum, afterMultiple);
}*/
return recordService.buildRecord(senderUid, partitionId, gift, giftNum, null != room? room.getUid(): null,
receiverUid,false, afterMultiple, winGoldNum, sendGiftTime);
}
private BravoRecord updateMeta(BravoGiftConfig config, long senderUid, int partitionId,
private BravoRecord updateMeta(long senderUid, int partitionId,
Gift gift, int giftNum, long receiverUid, BigDecimal totalInput, BigDecimal divisor, Room room, Date sendGiftTime,
List<BravoResult> drawResultList){
for (BravoResult drawResult: drawResultList){
@@ -239,14 +239,11 @@ public class BravoGiftSendService {
BigDecimal multiple = drawResultList.stream().map(BravoResult::getAfterOutput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal winGoldNum = multiple.multiply(divisor);
BigDecimal totalAfterMultiple = winGoldNum.compareTo(BigDecimal.ZERO) > 0? winGoldNum.divide(totalInput, 2, RoundingMode.DOWN): BigDecimal.ZERO;
userMetaService.updateUserMetaAfter(senderUid, totalInput, winGoldNum);
/*if (winGoldNum.compareTo(BigDecimal.ZERO) > 0){
settlementService.syncSendReward(config, senderUid, room, gift, winGoldNum, multiple);
}*/
return recordService.buildRecord(senderUid, partitionId, gift, giftNum, null != room? room.getUid(): null,
receiverUid, drawResultList, false, multiple, winGoldNum, sendGiftTime);
receiverUid, drawResultList, false, totalAfterMultiple, winGoldNum, sendGiftTime);
}
private boolean judgeStock(Integer partitionId, BigDecimal winGoldNum, Long senderUid, Long receiverUid){