From 9ff131df9cf60a17abbf22efe88aa0c23a6134b2 Mon Sep 17 00:00:00 2001 From: lzm <17817447469@163.com> Date: Wed, 28 Sep 2022 17:59:15 +0800 Subject: [PATCH] =?UTF-8?q?v1.1:=20=E7=94=A8=E6=88=B7=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E5=88=86=E6=88=90=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/listener/InsertRecordListener.java | 6 +- .../business/message/GiftMessage.java | 10 ++ .../service/gift/GiftMessageService.java | 114 +++++++++++++----- .../service/gift/GiftSendService.java | 26 ++-- .../service/purse/UserPurseService.java | 22 ++++ .../business/service/room/RoomService.java | 37 ++++++ .../scheduler/task/UserPurseTask.java | 2 +- 7 files changed, 170 insertions(+), 47 deletions(-) diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/InsertRecordListener.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/InsertRecordListener.java index ee8ecd668..b41802d1e 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/InsertRecordListener.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/event/listener/InsertRecordListener.java @@ -160,12 +160,12 @@ public class InsertRecordListener implements ApplicationListener 0){ - String perNumbillId = billRecordService.insertGiftSendBillRecord(giftMessage.getRoomUid(),giftMessage.getSendUid(), + String perNumbillId = billRecordService.insertGiftSendBillRecord(giftMessage.getPerNumUid(),giftMessage.getSendUid(), giftMessage.getRoomUid(),objId, BillObjTypeEnum.ROOM_PERCENTAGE_INCOME,giftMessage.getPerNum(), giftMessage.getGiftId(),giftMessage.getGiftNum()); if (giftMessage.getRoomAssociate() != null) { - associateIncomeTransfer(giftMessage.getRoomUid(), giftMessage.getSendUid(), giftMessage.getPerNum(), BillObjTypeEnum.ROOM_PERCENTAGE_INCOME.getValue(), giftMessage.getRoomAssociate(), perNumbillId); + associateIncomeTransfer(giftMessage.getPerNumUid(), giftMessage.getSendUid(), giftMessage.getPerNum(), BillObjTypeEnum.ROOM_PERCENTAGE_INCOME.getValue(), giftMessage.getRoomAssociate(), perNumbillId); } } log.info("handleGiftMessage insert billRecord finish, sendUid:{}, recvUid:{}, goldNum:{}, messId:{}" @@ -228,7 +228,7 @@ public class InsertRecordListener implements ApplicationListener 0) { - ClanAccountAssociate clanAccountAssociate = clanAccountAssociateService.checkIsAssociateAccount(recvUid); - if (clanAccountAssociate == null ) { - Boolean ret = userPurseService.addCrystal(recvUid, giftMessage.getDiamondNum(), BillObjTypeEnum.GIFT_ROOM_INCOME.getDesc()); - if (!ret){ - logger.error("failed to add diamond, message={}", JSON.toJSONString(giftMessage)); - } - }else { - log.info("收礼用户为族长关联号转家族族长uid({})关联uid({})流转金额({})", clanAccountAssociate.getClanElderUid(), recvUid, giftMessage.getDiamondNum()); - giftMessage.setReciveAssociate(clanAccountAssociate); - } + + Hall hall = clanService.getHallByUid(recvUid); + Clan clan = clanService.getClanBaseInfoByUid(recvUid); + if (hall != null && clan != null) { + // 更新收礼物用户的钱包,加水晶 + addRecvUserDiamondNum(recvUid,giftMessage); + + // 收礼用户为 会长 个人收礼a 房主流水分成流入公会长 + if (hall.getOwnerUid().equals(recvUid) && !clan.getClanElderUid().equals(recvUid)) { + // 收礼用户为 会长+家族长 个人收礼分成a 房主流水分成b + addPerNumClanOwner(clan.getClanElderUid(),giftMessage); + giftMessage.setPerNumUid(clan.getClanElderUid()); } - } catch (Exception e) { - logger.error("收礼用户为族长关联号转家族族长出现异常, message= " + JSON.toJSONString(giftMessage), e); - } - //在房间送礼物,房主有钻石提成 - try { - if(giftMessage.getPerNum() != null && giftMessage.getPerNum().compareTo(0.0) > 0){ - ClanAccountAssociate clanAccountAssociateRoom = clanAccountAssociateService.checkIsAssociateAccount(roomUid); - if (clanAccountAssociateRoom == null) { - userPurseService.addCrystal(roomUid, giftMessage.getPerNum(), BillObjTypeEnum.ROOM_PERCENTAGE_INCOME.getDesc()); - }else { - log.info("房主为族长关联号转家族族长uid({})关联uid({})流转金额({})", clanAccountAssociateRoom.getClanElderUid(), roomUid, giftMessage.getPerNum()); - giftMessage.setRoomAssociate(clanAccountAssociateRoom); - } + + if (hall.getOwnerUid().equals(recvUid) && clan.getClanElderUid().equals(recvUid)) { + //在房间送礼物,房主有钻石提成 + addPerNumRoomOwner(roomUid,giftMessage); + giftMessage.setPerNumUid(roomUid); } - } catch (Exception e) { - logger.error("关联账号收礼房间出现异常, message= " + JSON.toJSONString(giftMessage), e); } // 删除该标识,表示消息已经消费过 @@ -118,6 +110,66 @@ public class GiftMessageService extends BaseService { applicationContext.publishEvent(new GiftMessageEvent(giftMessage)); } + private void addRecvUserDiamondNum(Long recvUid, GiftMessage giftMessage) { + try { + if (giftMessage.getDiamondNum().compareTo(0.0) > 0) { + ClanAccountAssociate clanAccountAssociate = clanAccountAssociateService.checkIsAssociateAccount(recvUid); + if (clanAccountAssociate == null ) { + // 原先是增加水晶 定时任务水晶转换为金币, 现在直接将水晶 => 金币 + Boolean ret = userPurseService.addGold(recvUid, giftMessage.getDiamondNum(), BillObjTypeEnum.GIFT_ROOM_INCOME.getDesc()); + if (!ret){ + logger.error("addRecvUserDiamondNum failed to add gold, message={}", JSON.toJSONString(giftMessage)); + } + }else { + log.info("收礼用户为族长关联号转家族族长uid({})关联uid({})流转金额({})", clanAccountAssociate.getClanElderUid(), recvUid, giftMessage.getDiamondNum()); + giftMessage.setReciveAssociate(clanAccountAssociate); + } + } + } catch (Exception e) { + logger.error("收礼用户为族长关联号转家族族长出现异常, message= " + JSON.toJSONString(giftMessage), e); + } + } + + private void addPerNumRoomOwner(Long roomUid, GiftMessage giftMessage) { + try { + if(giftMessage.getPerNum() != null && giftMessage.getPerNum().compareTo(0.0) > 0){ + ClanAccountAssociate clanAccountAssociateRoom = clanAccountAssociateService.checkIsAssociateAccount(roomUid); + if (clanAccountAssociateRoom == null) { + // 原先是增加水晶 定时任务水晶转换为金币, 现在直接将水晶 => 金币 + Boolean ret = userPurseService.addGold(roomUid, giftMessage.getPerNum(), BillObjTypeEnum.ROOM_PERCENTAGE_INCOME.getDesc()); + if (!ret){ + logger.error("addPerNumRoomOwner failed to add gold, message={}", JSON.toJSONString(giftMessage)); + } + }else { + log.info("房主为族长关联号转家族族长uid({})关联uid({})流转金额({})", clanAccountAssociateRoom.getClanElderUid(), roomUid, giftMessage.getPerNum()); + giftMessage.setRoomAssociate(clanAccountAssociateRoom); + } + } + } catch (Exception e) { + logger.error("关联账号收礼房间出现异常, message= " + JSON.toJSONString(giftMessage), e); + } + } + + private void addPerNumClanOwner(Long recvUid, GiftMessage giftMessage) { + try { + if (giftMessage.getPerNum() != null && giftMessage.getPerNum().compareTo(0.0) > 0) { + ClanAccountAssociate clanAccountAssociate = clanAccountAssociateService.checkIsAssociateAccount(recvUid); + if (clanAccountAssociate == null ) { + // 原先是增加水晶 定时任务水晶转换为金币, 现在直接将水晶 => 金币 + Boolean ret = userPurseService.addGold(recvUid, giftMessage.getDiamondNum(), BillObjTypeEnum.GIFT_ROOM_INCOME.getDesc()); + if (!ret){ + logger.error("addPerNumClanOwner failed to add gold, message={}", JSON.toJSONString(giftMessage)); + } + }else { + log.info("房主流水分成流入公会长,收礼用户为族长关联号转家族族长uid({})关联uid({})流转金额({})", clanAccountAssociate.getClanElderUid(), recvUid, giftMessage.getDiamondNum()); + giftMessage.setReciveAssociate(clanAccountAssociate); + } + } + } catch (Exception e) { + logger.error("房主流水分成流入公会长,收礼用户为族长关联号转家族族长出现异常, message= " + JSON.toJSONString(giftMessage), e); + } + } + public BillRecord buildRepairBillRecord(Byte billType, GiftSendRecord giftSendRecord, Long uid, Long targetUid){ Date date = giftSendRecord.getCreateTime(); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendService.java index b6223f00d..67c39f02a 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/gift/GiftSendService.java @@ -230,7 +230,7 @@ public class GiftSendService extends BaseService { Double diamondNum = Math.abs(goldNum * roomService.getUserCommissionByRoom(room, recvUid)); // 礼物钻石总数 Double perNum = null; if(roomUid != null) { - perNum = Math.abs(goldNum * roomService.getRoomCommission(room)); + perNum = Math.abs(goldNum * roomService.getRoomCommissionV2(room,recvUid)); } reduceStock(sendUid, giftId, goldNum, giftNum, giftSource); @@ -378,11 +378,6 @@ public class GiftSendService extends BaseService { Long giftPrice = gift.getGoldPrice(); Long everyGoldNum = Math.abs(giftPrice * giftNum); // 礼物金币总数,相对于每一次发送者 Long totalGoldNum = Math.abs(everyGoldNum * recvUids.length); // 礼物金币总数, - // 礼物钻石总数,相对于每一个接收者 - Double perNum = null; - if(roomUid != null) { - perNum = Math.abs(everyGoldNum * roomService.getRoomCommission(room)); - } int totalGiftNum = giftNum * recvUids.length; //礼物总数 reduceStock(sendUid, giftId, totalGoldNum, totalGiftNum, giftSource); @@ -390,6 +385,11 @@ public class GiftSendService extends BaseService { // 循环发送礼物消息到MQ处理(加钻石、写DB记录) for (int i = 0; i < recvUids.length; i++) { Double diamondNum = Math.abs(everyGoldNum * roomService.getUserCommissionByRoom(room, recvUids[i])); + // 礼物钻石总数,相对于每一个接收者 + Double perNum = null; + if(roomUid != null) { + perNum = Math.abs(everyGoldNum * roomService.getRoomCommissionV2(room,recvUids[i])); + } sendGiftMessage2MQ(sendUid, recvUids[i], roomUid, giftId, giftNum, everyGoldNum, diamondNum,perNum, Constant.SendGiftType.roomToperson, room.getType(), msg, giftSource, false); } @@ -787,11 +787,6 @@ public class GiftSendService extends BaseService { Long giftPrice = gift.getGoldPrice(); Long everyGoldNum = Math.abs(giftPrice * giftNum); // 礼物金币总数,相对于每一次发送者 Long totalGoldNum = Math.abs(everyGoldNum * recvUids.length); // 礼物金币总数, - Double perNum = null; - if(roomUid != null) { - // 可以按厅配置礼物分成 - perNum = Math.abs(everyGoldNum * roomService.getRoomCommission(room)); - } // 礼物钻石总数,相对于每一个接收者 int totalGiftNum = giftNum * recvUids.length; //礼物总数 @@ -812,6 +807,13 @@ public class GiftSendService extends BaseService { for (int i = 0; i < recvUids.length; i++) { // 收礼人的分成收益是房间类型+用户身份综合判断的,所以需要在循环内计算 Double diamondNum = Math.abs(everyGoldNum * roomService.getUserCommissionByRoom(room, recvUids[i])); + // 收礼流水分成 + Double perNum = null; + if(roomUid != null) { + // 可以按厅配置礼物分成 + perNum = Math.abs(everyGoldNum * roomService.getRoomCommissionV2(room,recvUids[i])); + } + sendGiftMessage2MQ(sendUid, recvUids[i], roomUid, gift.getGiftId(), giftNum, everyGoldNum, diamondNum,perNum, sendType, room!=null?room.getType():null, msg, giftSource, false); } @@ -922,7 +924,7 @@ public class GiftSendService extends BaseService { Double perNum = null; if(roomUid != null) { // 可以按厅配置礼物分成 - perNum = Math.abs(everyGoldNum * roomService.getRoomCommission(room)); + perNum = Math.abs(everyGoldNum * roomService.getRoomCommissionV2(room,receiveUid)); } Double diamondNum = Math.abs(everyGoldNum * roomService.getUserCommissionByRoom(room, receiveUid)); GiftSendRecord giftSendRecord = buildSendLuckyBagRecord(drawGift, sendUid, receiveUid, room, diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java index e505287fd..4e6e17692 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java @@ -195,6 +195,28 @@ public class UserPurseService extends ServiceImpl { } } + public Boolean addGold(Long uid, Double goldNum, String businessType) { + String lockVal = jedisLockService.lock(RedisKey.lock_user_gold.getKey(uid.toString())); + try { + if (StringUtils.isBlank(lockVal)) { + throw new ServiceException(BusiStatus.SERVER_BUSY); + } + if (goldNum <= 0) { + throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR); + } + UserPurse userPurse = queryUserPurse(uid); + log.info("addGold 操作前,buss:{},userPurse:{}", businessType, gson.toJson(userPurse)); + int ret = userPurseMapper.updateAddGolds(uid,goldNum); + Boolean result = SqlHelper.retBool(ret); + if(result) { + log.info("addGold 操作后,buss:{},userPurse:{}", businessType, gson.toJson(userPurse)); + } + return result; + } finally { + jedisLockService.unlock(RedisKey.lock_user_gold.getKey(uid.toString()), lockVal); + } + } + public Boolean excCrystalToDiamond(Long uid, Double exchangeNum, Double convertNum) { String lockVal = jedisLockService.lock(RedisKey.lock_user_crystal.getKey(uid.toString())); try { diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java index 38b90ae64..f2fec29f8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java @@ -11,6 +11,7 @@ import com.accompany.business.event.RoomOpenEvent; import com.accompany.business.event.SuperCloseRoomEvent; import com.accompany.business.event.room.UserAddRoomPasswordEvent; import com.accompany.business.model.*; +import com.accompany.business.model.clan.Clan; import com.accompany.business.model.miniGame.MiniGame; import com.accompany.business.model.miniGame.MiniGameRoom; import com.accompany.business.model.miniGame.MiniGameSwitchRecord; @@ -29,9 +30,11 @@ import com.accompany.business.service.RobotV2Service; import com.accompany.business.service.SendSysMsgService; import com.accompany.business.service.administrator.SuperAdminWebService; import com.accompany.business.service.api.QinniuService; +import com.accompany.business.service.clan.ClanService; import com.accompany.business.service.dfa.DfaService; import com.accompany.business.service.follow.FansRoomService; import com.accompany.business.service.follow.FansService; +import com.accompany.business.service.hall.HallService; import com.accompany.business.service.ktv.UserChooseMusicService; import com.accompany.business.service.level.LevelService; import com.accompany.business.service.live.LiveAttestationService; @@ -182,6 +185,10 @@ public class RoomService extends BaseService { private IBlindDateRoundService iBlindDateRoundService; @Autowired private BlindDateRoundHistoryService blindDateRoundHistoryService; + @Autowired + private ClanService clanService; + @Autowired + private HallService hallService; @Autowired private MiniGameRoomService miniGameRoomService; @@ -3260,6 +3267,28 @@ public class RoomService extends BaseService { return null == room.getGiftRate() ? SystemConfig.Commission.roomOwnerPerRate : room.getGiftRate(); } + /** + * 获取房间房主礼物提成比例 + * @param room + * @return + */ + public Double getRoomCommissionV2(Room room,Long receiveUid) { + if (Constant.PermitType.SINGLE_BROADCAST.equals(room.getIsPermitRoom())) return 0.0; + // 非牌照房房主提成开关 + if (!SystemConfig.Commission.notPermitRoomCommissionSwitch && + !room.getIsPermitRoom().equals(Constant.PermitType.PERMIT_ROOM)) { + return 0.0; + } + + // 成员加入 公会&&家族 才有收益 + Hall hall = clanService.getHallByUid(receiveUid); + Clan clan = clanService.getClanBaseInfoByUid(receiveUid); + if ((hall == null || clan == null)) { + return 0.0; + } + return null == room.getGiftRate() ? SystemConfig.Commission.roomOwnerPerRate : room.getGiftRate(); + } + public void updateBlindDateVipUid(Long vipUid, Room room) { if (ObjectUtil.isNull(vipUid)) vipUid = 0l; roomMapper.updateRoomVipUid(vipUid, room.getUid()); @@ -3534,6 +3563,11 @@ public class RoomService extends BaseService { * @return */ public Double getUserCommissionByRoom(Room room, Long receiveUid) { + Hall hall = clanService.getHallByUid(receiveUid); + Clan clan = clanService.getClanBaseInfoByUid(receiveUid); + if ((hall == null || clan == null) && room == null) { + return 0.0d; + } if (room == null) return SystemConfig.Commission.userPerRate; if (Constant.PermitType.SINGLE_BROADCAST.equals(room.getIsPermitRoom())) { //个播房 @@ -3546,6 +3580,9 @@ public class RoomService extends BaseService { return SystemConfig.Commission.singleRoomNormalUserRate; } }else { + if ( hall == null || clan == null ){ + return 0.0d; + } return SystemConfig.Commission.userPerRate; } } diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/UserPurseTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/UserPurseTask.java index 0f88b0a48..c00b92f6d 100644 --- a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/UserPurseTask.java +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/UserPurseTask.java @@ -26,7 +26,7 @@ import java.util.List; * Created By LeeNana on 2020/3/11. * 活动定时器 */ -@Component +// @Component @Slf4j public class UserPurseTask extends BaseTask { @Autowired