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}