From 01bb9912d958077d4fd1a276d0257298bd198e68 Mon Sep 17 00:00:00 2001 From: dute7liang <383200134@qq.com> Date: Fri, 29 Dec 2023 21:55:03 +0800 Subject: [PATCH] init --- .../java/com/ruoyi/cai/domain/CaiAccount.java | 13 -- .../java/com/ruoyi/cai/domain/CaiAnchor.java | 4 + .../com/ruoyi/cai/domain/CaiConsumeLog.java | 46 +++--- .../java/com/ruoyi/cai/domain/CaiUnion.java | 10 +- .../com/ruoyi/cai/domain/CaiUnionUser.java | 4 +- .../com/ruoyi/cai/domain/CaiUserGift.java | 2 + .../com/ruoyi/cai/domain/CaiUserInvite.java | 18 ++- .../com/ruoyi/cai/enums/ConsumeLogType.java | 25 ++++ .../ruoyi/cai/mapper/CaiAccountMapper.java | 6 +- .../ruoyi/cai/service/CaiAccountService.java | 5 +- .../service/impl/CaiAccountServiceImpl.java | 141 +++++++++++++++--- .../impl/CaiGuardTotalServiceImpl.java | 27 +++- .../service/impl/CaiUserCallServiceImpl.java | 4 +- .../service/impl/CaiUserGiftServiceImpl.java | 28 ++-- .../java/com/ruoyi/cai/util/NumCaUtil.java | 20 +++ .../cai/ws/manager/WebSocketManager.java | 2 + .../com/ruoyi/cai/ws/service/RoomService.java | 2 +- .../resources/mapper/cai/CaiAccountMapper.xml | 26 ++-- 18 files changed, 283 insertions(+), 100 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogType.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/util/NumCaUtil.java diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAccount.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAccount.java index 5429449a..15cdf048 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAccount.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAccount.java @@ -32,14 +32,6 @@ public class CaiAccount implements Serializable { * 用户ID */ private Long userId; - /** - * 充值的可用余额 - */ - private BigDecimal money; - /** - * 收益的金额 - */ - private BigDecimal incomeMoney; /** * 当前彩币数量 */ @@ -48,11 +40,6 @@ public class CaiAccount implements Serializable { * 收益的彩币数量 */ private Long incomeCoin; - private Long totalCoin; - /** - * 当前魅力值 - */ - private Long loveValue; /** * 充值总额 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java index 23832103..ce3aee86 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java @@ -71,6 +71,10 @@ public class CaiAnchor implements Serializable{ * 视频分成比例 */ private BigDecimal videoRate; + /** + * 守护分成比例 + */ + private BigDecimal guardRate; /** * 礼物分成比列 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiConsumeLog.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiConsumeLog.java index 3ad90863..6b972099 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiConsumeLog.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiConsumeLog.java @@ -1,17 +1,12 @@ package com.ruoyi.cai.domain; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import lombok.EqualsAndHashCode; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Date; -import java.math.BigDecimal; +import java.io.Serializable; import java.math.BigDecimal; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.ruoyi.common.core.domain.BaseEntity; +import java.time.LocalDateTime; /** * 消费记录对象 cai_consume_log @@ -41,27 +36,27 @@ public class CaiConsumeLog implements Serializable { /** * 发生金额 */ - private BigDecimal amount; + private Long amount; /** * 主播金额 */ - private BigDecimal anchorAmount; + private Long anchorAmount; /** * 一级金额 */ - private BigDecimal oneAmount; + private Long oneAmount; /** * 二级金额 */ - private BigDecimal twoAmount; + private Long twoAmount; /** * 平台金额 */ - private BigDecimal platformAmount; + private Long platformAmount; /** * 消费方用户 */ - private Integer sourceUserId; + private Long sourceUserId; /** * 消费方用户 */ @@ -73,7 +68,7 @@ public class CaiConsumeLog implements Serializable { /** * 接收方用户 */ - private Integer targetUserId; + private Long targetUserId; /** * 接收方用户 */ @@ -82,11 +77,14 @@ public class CaiConsumeLog implements Serializable { * 接收方用户 */ private String targetPhone; + /** + * 接收方的费率 + */ private BigDecimal targetRate; /** * 一级分销方 */ - private Integer oneUserId; + private Long oneUserId; /** * 一级分销方 */ @@ -99,6 +97,9 @@ public class CaiConsumeLog implements Serializable { * 一级分销方抽成比例 */ private BigDecimal oneRate; + /** + * 是否有效 + */ private Boolean oneJoin; /** * 是否为工会管理员 0=否 1=是 @@ -107,7 +108,7 @@ public class CaiConsumeLog implements Serializable { /** * 工会提成 */ - private Integer unionUserId; + private Long unionUserId; /** * 工会提成 */ @@ -157,4 +158,13 @@ public class CaiConsumeLog implements Serializable { private LocalDateTime createTime; + public void init(CaiUser fromUser,CaiUser toUser){ + this.setSourceUserId(fromUser.getId()); + this.setSourcePhone(fromUser.getMobile()); + this.setSourceUsercode(fromUser.getUsercode()); + this.setTargetUserId(toUser.getId()); + this.setTargetUsercode(toUser.getUsercode()); + this.setTargetPhone(toUser.getMobile()); + } + } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnion.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnion.java index d212f389..3d584214 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnion.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnion.java @@ -34,17 +34,13 @@ public class CaiUnion implements Serializable { */ private String name; /** - * 0=可用 1=不可用 + * 是否开启提成 */ - private Integer status; + private Boolean enableRate; /** * 工会默认二级支付奖励比例 */ - private BigDecimal unionPayRate; - /** - * 工会默认二级收益奖励比例 - */ - private BigDecimal unionIncomeRate; + private BigDecimal defaultIncomeRate; /** * 全部人数 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnionUser.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnionUser.java index 2ba2637e..4c3a7b1e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnionUser.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUnionUser.java @@ -46,9 +46,9 @@ public class CaiUnionUser implements Serializable { */ private BigDecimal vipDivide; /** - * 0=不分成 1=分成 + * 是否开启提成 */ - private Integer type; + private Boolean enableRate; /** * 收益 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserGift.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserGift.java index 0d8eca1d..c097f5d2 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserGift.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserGift.java @@ -49,6 +49,8 @@ public class CaiUserGift implements Serializable { */ private Long giftAmount; + private Long consumerLogId; + private LocalDateTime createTime; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java index 38b5da1a..ea5b9da8 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java @@ -34,21 +34,29 @@ public class CaiUserInvite implements Serializable { */ private Long inviteId; /** - * 奖励好友收入的比率 + * 奖励好友收入视频提成比率 */ - private BigDecimal rewardIncomeRate; + private BigDecimal videoIncomeRate; + /** + * 奖励好友守护的比例 + */ + private BigDecimal guardIncomeRate; + /** + * 奖励好友礼物的比例 + */ + private BigDecimal giftIncomeRate; /** * 奖励好友充值的比率 */ - private BigDecimal rewardRechargeRate; + private BigDecimal payIncomeRate; /** * 邀请奖励汇总 */ - private BigDecimal rewardMoneyTotal; + private Long rewardCoinTotal; /** * 是否有效 0=无效 1=有效 */ - private Integer isValid; + private Boolean enableRate; private LocalDateTime createTime; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogType.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogType.java new file mode 100644 index 00000000..de542505 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogType.java @@ -0,0 +1,25 @@ +package com.ruoyi.cai.enums; + +import lombok.Getter; +import org.springframework.stereotype.Component; + + +/** + * 类型 1-充值 2-礼物 3-守护 4-通话 + *

created on 2023/12/29 20:39

+ * @author duet + */ +@Getter +public enum ConsumeLogType { + PAY(1), + GIFT(2), + GUARD(3), + VIDEO(4), + ; + + private final Integer code; + + ConsumeLogType(Integer code) { + this.code = code; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiAccountMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiAccountMapper.java index e619d8e0..0f84bfac 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiAccountMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiAccountMapper.java @@ -12,9 +12,11 @@ import org.apache.ibatis.annotations.Param; */ public interface CaiAccountMapper extends BaseMapper { - long incs(@Param("userId") Long userId, @Param("value") Long value); + long decrCoin(@Param("userId") Long userId, @Param("coin") Long coin); - void incsCoin(@Param("userId") Long userId, @Param("coin") Long coin, @Param("incomeCoin") Long incomeCoin); + long incsCoin(@Param("userId") Long userId, @Param("coin") Long coin); + + void incsIncomeCoin(@Param("userId") Long userId, @Param("incomeCoin") Long incomeCoin); long decrIncomeCoin(@Param("userId") Long userId, @Param("incomeCoin") Long incomeCoin); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAccountService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAccountService.java index 9afcfd67..ba33f1a9 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAccountService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAccountService.java @@ -2,6 +2,7 @@ package com.ruoyi.cai.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.cai.domain.CaiAccount; +import com.ruoyi.cai.domain.CaiConsumeLog; /** * 用户账户Service接口 @@ -13,9 +14,7 @@ public interface CaiAccountService extends IService { CaiAccount getByUserId(Long userId); - boolean incs(Long userId, Long value); - - boolean decr(Long userId, Long value); + CaiConsumeLog decr(CaiConsumeLog log); boolean withdraw(Long userId, Long incomeCoin); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAccountServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAccountServiceImpl.java index 1b7085a6..076e0fea 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAccountServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAccountServiceImpl.java @@ -1,14 +1,21 @@ package com.ruoyi.cai.service.impl; +import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.cai.domain.CaiAccount; +import com.ruoyi.cai.domain.*; +import com.ruoyi.cai.enums.ConsumeLogType; import com.ruoyi.cai.mapper.CaiAccountMapper; -import com.ruoyi.cai.service.CaiAccountService; +import com.ruoyi.cai.service.*; +import com.ruoyi.cai.util.NumCaUtil; import com.ruoyi.common.exception.ServiceException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; + /** * 用户账户Service业务层处理 * @@ -16,38 +23,134 @@ import org.springframework.transaction.annotation.Transactional; * @date 2023-12-23 */ @Service +@Slf4j public class CaiAccountServiceImpl extends ServiceImpl implements CaiAccountService { + @Autowired + private CaiConsumeLogService consumeLogService; + @Override public CaiAccount getByUserId(Long userId) { return this.getOne(Wrappers.lambdaQuery(CaiAccount.class).eq(CaiAccount::getUserId,userId).last("limit 1")); } - @Override - public boolean incs(Long userId, Long value) { - return baseMapper.incs(userId,value) > 0; - } - @Override @Transactional(rollbackFor = Exception.class) - public boolean decr(Long userId, Long value) { + public CaiConsumeLog decr(CaiConsumeLog consumeLog) { + log.info("开始扣费 consumeLog={}", JSON.toJSONString(consumeLog)); + Long userId = consumeLog.getSourceUserId(); + Long amount = consumeLog.getAmount(); + CaiAccount account = this.getByUserId(userId); - if(account.getTotalCoin() < value){ + long totalCoin = account.getIncomeCoin() + account.getCoin(); + if(totalCoin < amount){ throw new ServiceException("余额不足"); } - long incs = baseMapper.incs(userId, -value); - if(incs <= 0){ - return false; + boolean flag = false; + long diff = account.getCoin() - amount; + // 充值币够用 + if(diff > 0){ + long l = baseMapper.decrCoin(userId, amount); + flag = l > 0; + } else { // 充值币不够用 + long decrCoin = baseMapper.decrCoin(userId, account.getCoin()); + long decrIncomeCoin = baseMapper.decrIncomeCoin(userId, -diff); + if(decrCoin > 0 && decrIncomeCoin > 0){ + flag = true; + } } - CaiAccount newAccount = this.getByUserId(userId); - Long decrCoinFlag = newAccount.getCoin() - value; - if(decrCoinFlag >= 0){ - baseMapper.incsCoin(userId, -value,0L); - }else{ - baseMapper.incsCoin(userId, -newAccount.getCoin(), decrCoinFlag); + // 扣费不成功 + if(!flag){ + throw new ServiceException("扣费失败,请重新购买"); } - return true; + // 开始处理 接收方的费用 + Long targetUserId = consumeLog.getTargetUserId(); + if(targetUserId != null){ + Long anchorAmount = NumCaUtil.coin(amount,consumeLog.getTargetRate()); + consumeLog.setAnchorAmount(anchorAmount); + baseMapper.incsCoin(targetUserId,anchorAmount); + } + // 获取分销的比例和用户 + fenxiao(consumeLog); + consumeLogService.save(consumeLog); + return consumeLog; + } + @Autowired + private CaiUserInviteService userInviteService; + @Autowired + private CaiUserService userService; + @Autowired + private CaiUnionUserService unionUserService; + @Autowired + private CaiUnionService unionService; + + + private void fenxiao(CaiConsumeLog consumeLog){ + if(ConsumeLogType.PAY.getCode().equals(consumeLog.getType())){ + Long sourceUserId = consumeLog.getSourceUserId(); + CaiUserInvite userInvite = userInviteService.getByUserId(sourceUserId); + if(userInvite != null){ + CaiUser oneUser = userService.getById(userInvite.getInviteId()); + if(oneUser != null && oneUser.getStatus() == 0){ + consumeLog.setOneRate(userInvite.getPayIncomeRate()); + consumeLog.setOneUserId(userInvite.getInviteId()); + consumeLog.setOneUsercode(oneUser.getUsercode()); + consumeLog.setOnePhone(oneUser.getMobile()); + consumeLog.setOneJoin(userInvite.getEnableRate()); + consumeLog.setOneIsUnion(oneUser.getIsUnion()); + } + } + return; + } + Long targetUserId = consumeLog.getTargetUserId(); + if(targetUserId != null){ + // 获取一级分销 + CaiUserInvite userInvite = userInviteService.getByUserId(targetUserId); + if(userInvite != null){ + CaiUser oneUser = userService.getById(userInvite.getInviteId()); + if(oneUser != null && oneUser.getStatus() == 0){ + if(ConsumeLogType.GUARD.getCode().equals(consumeLog.getType())){ + consumeLog.setOneRate(userInvite.getGuardIncomeRate()); + }else if(ConsumeLogType.GIFT.getCode().equals(consumeLog.getType())){ + consumeLog.setOneRate(userInvite.getGiftIncomeRate()); + }else if(ConsumeLogType.VIDEO.getCode().equals(consumeLog.getType())){ + consumeLog.setOneRate(userInvite.getVideoIncomeRate()); + } + consumeLog.setOneUserId(userInvite.getInviteId()); + consumeLog.setOneUsercode(oneUser.getUsercode()); + consumeLog.setOnePhone(oneUser.getMobile()); + consumeLog.setOneJoin(userInvite.getEnableRate()); + consumeLog.setOneIsUnion(oneUser.getIsUnion()); + } + } + // 工会分销 只有通话和礼物才有 + if(ConsumeLogType.GIFT.getCode().equals(consumeLog.getType()) + || ConsumeLogType.VIDEO.getCode().equals(consumeLog.getType())){ + CaiUnionUser unionUser = unionUserService.getByUserId(targetUserId); + if(unionUser != null){ + CaiUser user = userService.getById(unionUser.getId()); + if(user != null && user.getIsUnion() == 1 && user.getStatus() == 0){ + CaiUnion union = unionService.getById(unionUser.getUnionId()); + if(union != null){ + consumeLog.setUnionUsercode(user.getUsercode()); + consumeLog.setUnionPhone(user.getMobile()); + consumeLog.setUnionUserId(user.getId()); + consumeLog.setUnionJoin(false); + if(unionUser.getEnableRate() && union.getEnableRate()){ + consumeLog.setUnionJoin(true); + } + if(ConsumeLogType.GIFT.getCode().equals(consumeLog.getType())){ + consumeLog.setUnionRate(unionUser.getGiftDivide()); + }else if(ConsumeLogType.VIDEO.getCode().equals(consumeLog.getType())){ + consumeLog.setUnionRate(unionUser.getVideoDivide()); + } + } + } + } + } + } + } @Override diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java index 9697eb12..b483b02f 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java @@ -2,13 +2,17 @@ package com.ruoyi.cai.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.domain.CaiAnchor; +import com.ruoyi.cai.domain.CaiConsumeLog; import com.ruoyi.cai.domain.CaiGuardTotal; import com.ruoyi.cai.domain.CaiUser; import com.ruoyi.cai.dto.app.dto.GuardNum; import com.ruoyi.cai.dto.app.query.GiveGuardReq; import com.ruoyi.cai.dto.app.vo.GuardTotalVo; +import com.ruoyi.cai.enums.ConsumeLogType; import com.ruoyi.cai.mapper.CaiGuardTotalMapper; import com.ruoyi.cai.service.CaiAccountService; +import com.ruoyi.cai.service.CaiAnchorService; import com.ruoyi.cai.service.CaiGuardTotalService; import com.ruoyi.cai.service.CaiUserService; import com.ruoyi.common.exception.ServiceException; @@ -33,6 +37,8 @@ public class CaiGuardTotalServiceImpl extends ServiceImpl selectGuardTotalLimit(Long fromUserId,Integer limit) { @@ -43,18 +49,25 @@ public class CaiGuardTotalServiceImpl extends ServiceImpl selectGiftList(Long userId) { @@ -45,12 +47,17 @@ public class CaiUserGiftServiceImpl extends ServiceImpl - - - - - update cai_account - set total_coin = total_coin + #{value} - where user_id = #{userId} and (total_coin + #{value}) > 0 - update cai_account - set coin = coin + #{coin}, income_coin = income_coin + #{incomeCoin} + set coin = coin + #{coin} where user_id = #{userId} + + update cai_account + set coin = coin - #{coin} + where user_id = #{userId} and (coin - #{coin}) > 0 + + update cai_account - set income_coin = income_coin - #{value} - where user_id = #{userId} and (income_coin - #{value}) > 0 + set income_coin = income_coin - #{incomeCoin} + where user_id = #{userId} and (income_coin - #{incomeCoin}) > 0 + + + + update cai_account + set income_coin = income_coin + #{incomeCoin} + where user_id = #{userId}