v1.1: 用户流水分成调整

This commit is contained in:
lzm
2022-09-28 17:59:15 +08:00
parent 51fca5a6eb
commit 9ff131df9c
7 changed files with 170 additions and 47 deletions

View File

@@ -160,12 +160,12 @@ public class InsertRecordListener implements ApplicationListener<GiftMessageEven
}
//房主流水提成
if(giftMessage.getPerNum() != null && giftMessage.getPerNum().compareTo(0.0) > 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<GiftMessageEven
clanAssociateTransferRecordService.save(associateTransferRecord);
log.info("流水记录写入完成家族族长uid({})关联uid({})流转类型({})流转金额({})", clanAccountAssociate.getClanElderUid(), recvUid, type, income);
//进行流转
userPurseService.addCrystal(clanAccountAssociate.getClanElderUid(), income, "关联账号流转");
userPurseService.addGold(clanAccountAssociate.getClanElderUid(), income, "关联账号流转");
log.info("流转完成家族族长uid({})关联uid({})流转类型({})流转金额({})", clanAccountAssociate.getClanElderUid(), recvUid, type, income);
}

View File

@@ -24,6 +24,7 @@ public class GiftMessage implements Serializable {
private String msg; // 全服消息内容
private Integer giftSource; //礼物来源1:普通礼物2:背包礼物
private Boolean luckyBagGift; // 是否是福袋开出的礼物
private Long perNumUid; // 接收流水分成的uid
private ClanAccountAssociate reciveAssociate;
private ClanAccountAssociate roomAssociate;
@@ -164,6 +165,14 @@ public class GiftMessage implements Serializable {
this.roomAssociate = roomAssociate;
}
public Long getPerNumUid() {
return perNumUid;
}
public void setPerNumUid(Long perNumUid) {
this.perNumUid = perNumUid;
}
@Override
public String toString() {
return "GiftMessage{" +
@@ -180,6 +189,7 @@ public class GiftMessage implements Serializable {
", sendType=" + sendType +
", messTime=" + messTime +
", msg=" + msg +
", perNumUid=" + perNumUid +
'}';
}
}

View File

@@ -2,14 +2,15 @@ package com.accompany.business.service.gift;
import com.accompany.business.event.GiftMessageEvent;
import com.accompany.business.message.GiftMessage;
import com.accompany.business.model.FamilyCharmRecord;
import com.accompany.business.model.FamilyMember;
import com.accompany.business.model.GiftSendRecord;
import com.accompany.business.model.*;
import com.accompany.business.model.clan.Clan;
import com.accompany.business.model.clan.ClanAccountAssociate;
import com.accompany.business.model.vip.VipAuthItem;
import com.accompany.business.service.clan.ClanAccountAssociateService;
import com.accompany.business.service.clan.ClanService;
import com.accompany.business.service.family.FamilyQueryService;
import com.accompany.business.service.family.FamilyService;
import com.accompany.business.service.hall.HallService;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.vip.VipAuthItemService;
import com.accompany.business.util.VipUtil;
@@ -57,6 +58,8 @@ public class GiftMessageService extends BaseService {
private ClanAccountAssociateService clanAccountAssociateService;
@Autowired
private VipAuthItemService vipAuthItemService;
@Autowired
private ClanService clanService;
@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public void handleGiftMessage(GiftMessage giftMessage) {
@@ -71,36 +74,25 @@ public class GiftMessageService extends BaseService {
Long goldNum = giftMessage.getGoldNum();
String messId = giftMessage.getMessId();
// 更新收礼物用户的钱包,加水晶
try {
if (giftMessage.getDiamondNum().compareTo(0.0) > 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();

View File

@@ -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,

View File

@@ -195,6 +195,28 @@ public class UserPurseService extends ServiceImpl<UserPurseMapper,UserPurse> {
}
}
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 {

View File

@@ -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;
}
}

View File

@@ -26,7 +26,7 @@ import java.util.List;
* Created By LeeNana on 2020/3/11.
* 活动定时器
*/
@Component
// @Component
@Slf4j
public class UserPurseTask extends BaseTask {
@Autowired