bravo-调整multi计算
This commit is contained in:
@@ -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){
|
||||
|
Reference in New Issue
Block a user