diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountCash.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountCash.java
index 693a58ec..3a9b6a4e 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountCash.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountCash.java
@@ -30,6 +30,7 @@ public class AccountCash implements Serializable {
*
*/
private Long userId;
+ private Long traceId;
/**
* 订单号
*/
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountChangeLog.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountChangeLog.java
index 813b9805..f724c7a3 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountChangeLog.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AccountChangeLog.java
@@ -3,6 +3,7 @@ package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
+import org.springframework.web.bind.annotation.DeleteMapping;
import java.io.Serializable;
import java.math.BigDecimal;
@@ -28,7 +29,7 @@ public class AccountChangeLog implements Serializable {
/**
* 用户ID
*/
- private Integer userId;
+ private Long userId;
/**
* 蜜瓜号
*/
@@ -44,15 +45,12 @@ public class AccountChangeLog implements Serializable {
/**
* 名称
*/
- private Integer cateName;
- /**
- * 业务码
- */
- private Long businessCode;
+ private String cateName;
+ private Long traceId;
/**
* 变化值,为正 或者为负
*/
- private BigDecimal changeValue;
+ private Long changeValue;
/**
* 备注
*/
@@ -60,6 +58,7 @@ public class AccountChangeLog implements Serializable {
/**
* 操作IP
*/
+ @Deprecated
private String operateIp;
/**
* 是否为后台用户手动调整
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/ConsumeLog.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/ConsumeLog.java
index 50613c95..5bb1dda0 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/ConsumeLog.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/ConsumeLog.java
@@ -30,10 +30,15 @@ public class ConsumeLog implements Serializable {
* 类型 1-充值 2-礼物 3-守护 4-通话
*/
private Integer type;
+
/**
- * 业务ID
+ * 业务状态码
*/
- private Integer sourceBusinessId;
+ private String businessEnum;
+ /**
+ * 跟踪ID
+ */
+ private Long traceId;
/**
* 发生金额
*/
@@ -163,9 +168,11 @@ public class ConsumeLog implements Serializable {
this.setSourceUserId(fromUser.getId());
this.setSourcePhone(fromUser.getMobile());
this.setSourceUsercode(fromUser.getUsercode());
- this.setTargetUserId(toUser.getId());
- this.setTargetUsercode(toUser.getUsercode());
- this.setTargetPhone(toUser.getMobile());
+ if(toUser != null){
+ this.setTargetUserId(toUser.getId());
+ this.setTargetUsercode(toUser.getUsercode());
+ this.setTargetPhone(toUser.getMobile());
+ }
}
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/GuardLog.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/GuardLog.java
index a08627e1..4a5c8b80 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/GuardLog.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/GuardLog.java
@@ -47,10 +47,7 @@ public class GuardLog implements Serializable {
* 守护值
*/
private Long guardValue;
- /**
- * 流水ID
- */
- private Long consumeLogId;
+ private Long traceId;
private LocalDateTime createTime;
private LocalDateTime updateTime;
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java
index b8e24497..12fb3535 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java
@@ -30,6 +30,7 @@ public class RechargeOrder implements Serializable {
* 用户ID
*/
private Long userId;
+ private Long traceId;
/**
* 商品ID
*/
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserGift.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserGift.java
index f78fa758..58deb7cf 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserGift.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserGift.java
@@ -57,7 +57,7 @@ public class UserGift implements Serializable {
*/
private Long giftAmount;
- private Long consumerLogId;
+ private Long traceId;
private LocalDateTime createTime;
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountBusinessEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountBusinessEnum.java
index 36761af1..f47a556c 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountBusinessEnum.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountBusinessEnum.java
@@ -5,43 +5,47 @@ import lombok.Getter;
@Getter
public enum AccountBusinessEnum {
- // 用户端
- A1("101","紫贝充值","增加充值的紫贝"),
- A2("102","注册奖励","增加充值的紫贝"),
- A3("103","首充奖励","增加充值的紫贝"),
- A4("104","送出礼物","扣除紫贝"),
- A5("105","送出守护","扣除紫贝"),
- A6("106","视频支出","扣除紫贝"),
- A7("106","聊天支出","扣除紫贝"),
- A8("108","提现","扣除收益的紫贝"),
+ /**
+ * 提现
+ */
+ WITHDRAW(AccountChangeEnum.WITHDRAW,null,null,null),
+ /**
+ * 守护
+ */
+ GUARD(AccountChangeEnum.USER_GUARD,AccountChangeEnum.ANCHOR_GUARD,AccountChangeEnum.ONE_GUARD,AccountChangeEnum.UNION_GUARD),
+ /**
+ * 赠送礼物
+ */
+ GIFT(AccountChangeEnum.USER_GIFT,AccountChangeEnum.ANCHOR_GIFT,AccountChangeEnum.ONE_GIFT,AccountChangeEnum.UNION_GIFT),
+ /**
+ * 视频
+ */
+ VIDEO(AccountChangeEnum.USER_VIDEO,AccountChangeEnum.ANCHOR_VIDEO,AccountChangeEnum.ONE_VIDEO,AccountChangeEnum.UNION_VIDEO),
- // 主播端
- B1("201","收到礼物","增加收益的紫贝"),
- B2("202","收到守护","增加收益的紫贝"),
- B3("203","视频收入","增加收益的紫贝"),
-
- // 分销
- C1("301","充值分成","增加收益的紫贝"),
- C2("301","礼物分成","增加收益的紫贝"),
- C3("301","守护分成","增加收益的紫贝"),
- C4("301","视频分成","增加收益的紫贝"),
-
- // 工会
- D1("401","礼物工会分成","增加收益的紫贝"),
- D2("401","守护工会分成","增加收益的紫贝"),
- D3("401","视频工会分成","增加收益的紫贝"),
-
- // 系统
- Z1("1001","系统调账","系统调账"),
+ /**
+ * 充值
+ */
+ RECHARGE(AccountChangeEnum.USER_RECHARGE,null,AccountChangeEnum.ONE_RECHARGE,null),
;
+ private final AccountChangeEnum sourceEnum;
+ private final AccountChangeEnum targetEnum;
+ private final AccountChangeEnum oneEnum;
+ private final AccountChangeEnum unionEnum;
- private final String code;
- private final String name;
- private final String desc;
+ AccountBusinessEnum(AccountChangeEnum sourceEnum, AccountChangeEnum targetEnum, AccountChangeEnum oneEnum, AccountChangeEnum unionEnum) {
+ this.sourceEnum = sourceEnum;
+ this.targetEnum = targetEnum;
+ this.oneEnum = oneEnum;
+ this.unionEnum = unionEnum;
+ }
- AccountBusinessEnum(String code, String name, String desc) {
- this.code = code;
- this.name = name;
- this.desc = desc;
+ public static AccountBusinessEnum getByName(String name){
+ AccountBusinessEnum[] values = AccountBusinessEnum.values();
+ for (AccountBusinessEnum value : values) {
+ if(value.name().equals(name)){
+ return value;
+ }
+ }
+ return null;
}
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountChangeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountChangeEnum.java
new file mode 100644
index 00000000..2f0a1039
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountChangeEnum.java
@@ -0,0 +1,50 @@
+package com.ruoyi.cai.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum AccountChangeEnum {
+
+ // 用户端
+ USER_RECHARGE(101,"充值",""),
+// A2(102,"注册奖励","增加充值的紫贝"),
+// A3(103,"首充奖励","增加充值的紫贝"),
+ USER_GIFT(104,"送出礼物",""),
+ USER_GUARD(105,"送出守护",""),
+ USER_VIDEO(106,"视频支出",""),
+ A7(107,"聊天支出",""),
+ WITHDRAW(108,"提现",""),
+
+ // 主播端
+ ANCHOR_GIFT(201,"收到礼物",""),
+ ANCHOR_GUARD(202,"收到守护",""),
+ ANCHOR_VIDEO(203,"视频收入",""),
+
+ // 分销
+ ONE_RECHARGE(301,"充值分成",""),
+ ONE_GIFT(302,"礼物分成",""),
+ ONE_GUARD(303,"守护分成",""),
+ ONE_VIDEO(304,"视频分成",""),
+
+ // 工会
+ UNION_GIFT(401,"礼物工会分成",""),
+ UNION_GUARD(402,"守护工会分成",""),
+ UNION_VIDEO(403,"视频工会分成",""),
+
+ // 系统
+ SYSTEM_COIN_INCS(1001,"系统调账","后台人工调增余额"),
+ SYSTEM_COIN_DECR(1002,"系统调账","后台人工调减余额"),
+ SYSTEM_INCOME_COIN_INCS(1003,"系统调账","后台人工调增收益"),
+ SYSTEM_INCOME_COIN_DECR(1004,"系统调账","后台人工调减收益"),
+ ;
+
+ private final Integer code;
+ private final String name;
+ private final String desc;
+
+ AccountChangeEnum(Integer code, String name, String desc) {
+ this.code = code;
+ this.name = name;
+ this.desc = desc;
+ }
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogStatus.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogStatus.java
new file mode 100644
index 00000000..e8c96945
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogStatus.java
@@ -0,0 +1,20 @@
+package com.ruoyi.cai.enums;
+
+import lombok.Getter;
+
+/**
+ * -1-无须分销 0-待分销 1-已分销
+ *
created on 2024/1/5 16:40
+ * @author duet
+ */
+@Getter
+public enum ConsumeLogStatus {
+ NO(-1),
+ READY(0),
+ ALREADY(1);
+ private final Integer code;
+
+ ConsumeLogStatus(Integer code) {
+ this.code = code;
+ }
+}
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
index de542505..93cfc884 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogType.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogType.java
@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
*/
@Getter
public enum ConsumeLogType {
- PAY(1),
+ RECHARGE(1),
GIFT(2),
GUARD(3),
VIDEO(4),
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/IdManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/IdManager.java
new file mode 100644
index 00000000..fc786fa4
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/IdManager.java
@@ -0,0 +1,26 @@
+package com.ruoyi.cai.manager;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+
+public class IdManager {
+
+ private static final Snowflake SNOWFLAKE;
+
+ static {
+ int dataId = 1;
+ String id = System.getProperty("DATA_ID");
+ if(id != null){
+ dataId = Integer.parseInt(id);
+ }
+ SNOWFLAKE = IdUtil.getSnowflake(1, dataId);
+ }
+
+ public static Long nextId(){
+ return SNOWFLAKE.nextId();
+ }
+
+ public static String nextIdStr(){
+ return SNOWFLAKE.nextIdStr();
+ }
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java
index fc811cc7..232c8f1d 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/LockManager.java
@@ -8,6 +8,8 @@ public class LockManager {
public static final String LOCK_DEAL_INVITE_REDIS = RedisConstant.REDIS_P + "lock:dealInvite:%s";
public static final String LOCK_ADD_USER_GREET_REDIS = RedisConstant.REDIS_P + "lock:addUserGreet:%s";
public static final String LOCK_SEND_GREET_REDIS = RedisConstant.REDIS_P + "lock:sendGreet:%s";
+ public static final String LOCK_SEND_GUARD_REDIS = RedisConstant.REDIS_P + "lock:sendGuard:%s";
+ public static final String LOCK_SEND_GIFT_REDIS = RedisConstant.REDIS_P + "lock:sendGift:%s";
public static String getRegisterLockKey(String mobile){
return String.format(LOCK_REGISTER_REDIS,mobile);
@@ -24,4 +26,12 @@ public class LockManager {
public static String getSendGreetLock(Long userId){
return String.format(LOCK_SEND_GREET_REDIS,userId);
}
+
+ public static String getSendGuardLock(Long userId){
+ return String.format(LOCK_SEND_GUARD_REDIS,userId);
+ }
+
+ public static String getSendGiftLock(Long userId){
+ return String.format(LOCK_SEND_GIFT_REDIS,userId);
+ }
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountChangeLogService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountChangeLogService.java
index ad020dc7..e2613d6f 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountChangeLogService.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountChangeLogService.java
@@ -2,6 +2,10 @@ package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.AccountChangeLog;
+import com.ruoyi.cai.domain.User;
+import com.ruoyi.cai.enums.AccountBusinessEnum;
+import com.ruoyi.cai.enums.AccountChangeEnum;
+import com.ruoyi.cai.pay.RechargeTypeEnum;
/**
* 账户明细Service接口
@@ -11,4 +15,9 @@ import com.ruoyi.cai.domain.AccountChangeLog;
*/
public interface AccountChangeLogService extends IService {
+ AccountChangeLog saveLogNoAdmin(Long userId, String usercode, RechargeTypeEnum rechargeTypeEnum, AccountChangeEnum accountChangeEnum, Long price,Long traceId);
+
+ AccountChangeLog saveLog(Long userId,String usercode, RechargeTypeEnum rechargeTypeEnum, AccountChangeEnum accountChangeEnum, Long price, Long traceId,Integer admin);
+
+ AccountChangeLog saveLogAdmin(Long userId,String usercode, RechargeTypeEnum rechargeTypeEnum, AccountChangeEnum accountChangeEnum, Long price,Long traceId);
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountService.java
index 1dbf8924..9bb48dc5 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountService.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AccountService.java
@@ -5,7 +5,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.domain.ConsumeLog;
import com.ruoyi.cai.dto.admin.vo.AccountAdminVo;
+import com.ruoyi.cai.enums.AccountBusinessEnum;
+import com.ruoyi.cai.enums.AccountChangeEnum;
import com.ruoyi.common.core.domain.PageQuery;
+import org.springframework.transaction.annotation.Transactional;
/**
* 用户账户Service接口
@@ -17,9 +20,13 @@ public interface AccountService extends IService {
Account getByUserId(Long userId);
- ConsumeLog decr(ConsumeLog log);
+ ConsumeLog decr(ConsumeLog log, AccountBusinessEnum businessEnum);
- void withdraw(Long userId, Long incomeCoin);
+ void withdraw(Long userId, Long incomeCoin, Long traceId);
+
+ void recharge(ConsumeLog consumeLog);
Page pageAdmin(PageQuery pageQuery, AccountAdminVo bo);
+
+ void distribution(Long userId, Long amount, AccountChangeEnum oneEnum,Long traceId);
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/ConsumeLogService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/ConsumeLogService.java
index e273e25c..0f36002a 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/ConsumeLogService.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/ConsumeLogService.java
@@ -11,4 +11,7 @@ import com.ruoyi.cai.domain.ConsumeLog;
*/
public interface ConsumeLogService extends IService {
+ void dealFenxiao(Long id);
+
+ ConsumeLog calculateInitFenxiao(ConsumeLog consumeLog);
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java
index da609978..73af78b8 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java
@@ -7,6 +7,7 @@ import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.AddRechargeOrderDto;
import com.ruoyi.cai.dto.admin.vo.RechargeOrderAdminVo;
import com.ruoyi.common.core.domain.PageQuery;
+import org.springframework.transaction.annotation.Transactional;
/**
* 充值订单Service接口
@@ -16,9 +17,14 @@ import com.ruoyi.common.core.domain.PageQuery;
*/
public interface RechargeOrderService extends IService {
+ RechargeOrder getByOrderNo(String orderNo);
+
Page pageAdmin(PageQuery pageQuery, RechargeOrderAdminVo bo);
RechargeOrder addRechargeOrder(AddRechargeOrderDto addRechargeOrderDto);
+ @Transactional(rollbackFor = Exception.class)
+ void orderSuccess(String orderNo);
+
RechargeOrder updateAdminRechargeOrder(AddRechargeOrderAdminDto dto);
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java
index 6039e9df..b74db31a 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java
@@ -8,6 +8,7 @@ import com.ruoyi.cai.domain.AccountCash;
import com.ruoyi.cai.domain.WithdrawExchange;
import com.ruoyi.cai.dto.admin.vo.AccountCashAdminVo;
import com.ruoyi.cai.dto.app.query.WithdrawReq;
+import com.ruoyi.cai.manager.IdManager;
import com.ruoyi.cai.mapper.AccountCashMapper;
import com.ruoyi.cai.service.AccountCashService;
import com.ruoyi.cai.service.AccountBankcardService;
@@ -39,10 +40,12 @@ public class AccountCashServiceImpl extends ServiceImpl implements AccountChangeLogService {
+
+ @Override
+ public AccountChangeLog saveLogNoAdmin(Long userId, String usercode, RechargeTypeEnum rechargeTypeEnum, AccountChangeEnum accountChangeEnum, Long price,Long traceId){
+ return this.saveLog(userId,usercode,rechargeTypeEnum,accountChangeEnum,price,traceId,0);
+ }
+
+ @Override
+ public AccountChangeLog saveLog(Long userId,String usercode, RechargeTypeEnum rechargeTypeEnum,
+ AccountChangeEnum accountChangeEnum, Long price, Long traceId,Integer admin){
+ AccountChangeLog log = new AccountChangeLog();
+ log.setUserId(userId);
+ log.setUsercode(usercode);
+ log.setTraceId(traceId);
+ log.setAccountType(rechargeTypeEnum.getCode());
+ log.setCateId(accountChangeEnum.getCode());
+ log.setCateName(accountChangeEnum.getName());
+ log.setRemark(accountChangeEnum.getDesc());
+ log.setChangeValue(price);
+// log.setRemark();
+ log.setIsAdmin(admin);
+ this.save(log);
+ return log;
+ }
+
+ @Override
+ public AccountChangeLog saveLogAdmin(Long userId, String usercode, RechargeTypeEnum rechargeTypeEnum, AccountChangeEnum accountChangeEnum, Long price,Long traceId) {
+ return this.saveLog(userId,usercode,rechargeTypeEnum,accountChangeEnum,price,traceId,1);
+ }
+
+
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java
index eb61ea01..c0b315aa 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java
@@ -6,8 +6,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.admin.vo.AccountAdminVo;
-import com.ruoyi.cai.enums.ConsumeLogType;
+import com.ruoyi.cai.enums.AccountBusinessEnum;
+import com.ruoyi.cai.enums.AccountChangeEnum;
import com.ruoyi.cai.mapper.AccountMapper;
+import com.ruoyi.cai.pay.RechargeTypeEnum;
import com.ruoyi.cai.service.*;
import com.ruoyi.cai.util.NumCaUtil;
import com.ruoyi.common.core.domain.PageQuery;
@@ -30,15 +32,9 @@ public class AccountServiceImpl extends ServiceImpl impl
@Autowired
private ConsumeLogService consumeLogService;
@Autowired
- private UserInviteService userInviteService;
- @Autowired
private UserService userService;
@Autowired
- private UnionUserService unionUserService;
- @Autowired
- private UnionService unionService;
- @Autowired
- private UserInfoService userInfoService;
+ private AccountChangeLogService accountChangeLogService;
@Override
@@ -48,7 +44,7 @@ public class AccountServiceImpl extends ServiceImpl impl
@Override
@Transactional(rollbackFor = Exception.class)
- public ConsumeLog decr(ConsumeLog consumeLog) {
+ public ConsumeLog decr(ConsumeLog consumeLog, AccountBusinessEnum businessEnum) {
log.info("开始扣费 consumeLog={}", JSON.toJSONString(consumeLog));
Long userId = consumeLog.getSourceUserId();
Long amount = consumeLog.getAmount();
@@ -59,12 +55,15 @@ public class AccountServiceImpl extends ServiceImpl impl
throw new ServiceException("余额不足");
}
boolean flag = false;
+ long coin = account.getCoin();
+ long incomeCoin = 0;
long diff = account.getCoin() - amount;
// 充值币够用
if(diff > 0){
- long l = baseMapper.decrCoin(userId, amount);
+ long l = baseMapper.decrCoin(userId, coin);
flag = l > 0;
} else { // 充值币不够用
+ incomeCoin = diff;
long decrCoin = baseMapper.decrCoin(userId, account.getCoin());
long decrIncomeCoin = baseMapper.decrIncomeCoin(userId, -diff);
if(decrCoin > 0 && decrIncomeCoin > 0){
@@ -80,19 +79,30 @@ public class AccountServiceImpl extends ServiceImpl impl
if(targetUserId != null){
Long anchorAmount = NumCaUtil.coin(amount,consumeLog.getTargetRate());
consumeLog.setAnchorAmount(anchorAmount);
- baseMapper.incsCoin(targetUserId,anchorAmount);
+ baseMapper.incsIncomeCoin(targetUserId,anchorAmount);
+ }
+ // 记录消费方的流水
+ if(coin != 0){
+ accountChangeLogService.saveLogNoAdmin(userId,consumeLog.getSourceUsercode(), RechargeTypeEnum.COIN,businessEnum.getSourceEnum(),coin,consumeLog.getTraceId());
+ }
+ if(incomeCoin != 0){
+ accountChangeLogService.saveLogNoAdmin(userId,consumeLog.getSourceUsercode(), RechargeTypeEnum.COIN_INCOME,businessEnum.getSourceEnum(),incomeCoin,consumeLog.getTraceId());
+ }
+ if(targetUserId != null){
+ accountChangeLogService.saveLogNoAdmin(targetUserId,consumeLog.getTargetUsercode(), RechargeTypeEnum.COIN_INCOME,businessEnum.getTargetEnum(),incomeCoin,consumeLog.getTraceId());
}
// 获取分销的比例和用户
- fenxiao(consumeLog);
+ consumeLogService.calculateInitFenxiao(consumeLog);
consumeLogService.save(consumeLog);
return consumeLog;
}
@Override
@Transactional(rollbackFor = Exception.class)
- public void withdraw(Long userId, Long incomeCoin){
+ public void withdraw(Long userId, Long incomeCoin,Long traceId){
+ User user = userService.getById(userId);
Account account = this.getByUserId(userId);
- if(account == null){
+ if(account == null || user == null){
throw new ServiceException("无效账号");
}
if(account.getIncomeCoin() < incomeCoin){
@@ -102,80 +112,50 @@ public class AccountServiceImpl extends ServiceImpl impl
if(incs <= 0){
throw new ServiceException("需"+incomeCoin+"紫贝才可提现");
}
- // TODO
+ accountChangeLogService.saveLogNoAdmin(user.getId(),user.getUsercode(), RechargeTypeEnum.COIN_INCOME,AccountBusinessEnum.WITHDRAW.getSourceEnum(),incomeCoin,traceId);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void recharge(ConsumeLog consumeLog){
+ log.info("开始扣费 consumeLog={}", JSON.toJSONString(consumeLog));
+ Long userId = consumeLog.getSourceUserId();
+ Long amount = consumeLog.getAmount();
+ User user = userService.getById(userId);
+ Account account = this.getByUserId(userId);
+ if(account == null || user == null){
+ throw new ServiceException("无效账号");
+ }
+ baseMapper.incsIncomeCoin(userId, amount);
+ accountChangeLogService.saveLogNoAdmin(user.getId(),user.getUsercode(), RechargeTypeEnum.COIN,AccountBusinessEnum.RECHARGE.getOneEnum(),amount,consumeLog.getTraceId());
+ // 获取分销的比例和用户
+ consumeLogService.calculateInitFenxiao(consumeLog);
+ consumeLogService.save(consumeLog);
+ }
+
+
@Override
public Page pageAdmin(PageQuery pageQuery, AccountAdminVo bo) {
return baseMapper.pageAdmin(pageQuery.build(),bo);
}
- private void fenxiao(ConsumeLog consumeLog){
- if(ConsumeLogType.PAY.getCode().equals(consumeLog.getType())){
- Long sourceUserId = consumeLog.getSourceUserId();
- UserInvite userInvite = userInviteService.getByUserId(sourceUserId);
- if(userInvite != null){
- User oneUser = userService.getById(userInvite.getInviteId());
- if(oneUser != null && oneUser.getStatus() == 0){
- UserInfo userInfo = userInfoService.getByUserId(userInvite.getUserId());
- consumeLog.setOneRate(userInfo.getPayIncomeRate());
- consumeLog.setOneUserId(userInvite.getInviteId());
- consumeLog.setOneUsercode(oneUser.getUsercode());
- consumeLog.setOnePhone(oneUser.getMobile());
- consumeLog.setOneJoin(userInvite.getEnableRate());
- consumeLog.setOneIsUnion(oneUser.getIsUnion());
- }
- }
+ /**
+ * 分销
+ */
+ @Override
+ public void distribution(Long userId, Long amount, AccountChangeEnum accountChangeEnum,Long traceId) {
+ User user = userService.getById(userId);
+ Account account = this.getByUserId(userId);
+ if(account == null || user == null){
+ log.error("分销失败,无效账号 userId={}",userId);
return;
}
- Long targetUserId = consumeLog.getTargetUserId();
- if(targetUserId != null){
- // 获取一级分销
- UserInvite userInvite = userInviteService.getByUserId(targetUserId);
- if(userInvite != null){
- User oneUser = userService.getById(userInvite.getInviteId());
- if(oneUser != null && oneUser.getStatus() == 0){
- UserInfo userInfo = userInfoService.getByUserId(userInvite.getUserId());
- if(ConsumeLogType.GUARD.getCode().equals(consumeLog.getType())){
- consumeLog.setOneRate(userInfo.getGuardIncomeRate());
- }else if(ConsumeLogType.GIFT.getCode().equals(consumeLog.getType())){
- consumeLog.setOneRate(userInfo.getGiftIncomeRate());
- }else if(ConsumeLogType.VIDEO.getCode().equals(consumeLog.getType())){
- consumeLog.setOneRate(userInfo.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())){
- UnionUser unionUser = unionUserService.getByUserId(targetUserId);
- if(unionUser != null){
- User user = userService.getById(unionUser.getId());
- if(user != null && user.getIsUnion() == 1 && user.getStatus() == 0){
- Union 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());
- }
- }
- }
- }
- }
+ if(amount == null || accountChangeEnum == null){
+ log.error("分销失败,参数错误 amount={},accountChangeEnum={}",amount,accountChangeEnum);
+ return;
}
-
+ baseMapper.incsCoin(userId, amount);
+ accountChangeLogService.saveLogNoAdmin(userId,user.getUsercode(), RechargeTypeEnum.COIN_INCOME,accountChangeEnum,amount,traceId);
}
+
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/ConsumeLogServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/ConsumeLogServiceImpl.java
index f8f573f4..b992fa5f 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/ConsumeLogServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/ConsumeLogServiceImpl.java
@@ -1,10 +1,22 @@
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.ConsumeLog;
+import com.ruoyi.cai.domain.*;
+import com.ruoyi.cai.enums.AccountBusinessEnum;
+import com.ruoyi.cai.enums.ConsumeLogStatus;
+import com.ruoyi.cai.enums.ConsumeLogType;
import com.ruoyi.cai.mapper.ConsumeLogMapper;
-import com.ruoyi.cai.service.ConsumeLogService;
+import com.ruoyi.cai.service.*;
+import com.ruoyi.cai.util.NumCaUtil;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.helper.LoginHelper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
/**
* 消费记录Service业务层处理
@@ -13,6 +25,148 @@ import org.springframework.stereotype.Service;
* @date 2023-12-24
*/
@Service
+@Slf4j
public class ConsumeLogServiceImpl extends ServiceImpl implements ConsumeLogService {
+ @Autowired
+ private UserInviteService userInviteService;
+ @Autowired
+ private UserInfoService userInfoService;
+ @Autowired
+ private UserService userService;
+ @Autowired
+ private UnionUserService unionUserService;
+ @Autowired
+ private UnionService unionService;
+ @Autowired
+ private AccountService accountService;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void dealFenxiao(Long id){
+ ConsumeLog consumer = this.getById(id);
+ if(consumer == null){
+ return;
+ }
+ if(!ConsumeLogStatus.READY.getCode().equals(consumer.getStatus())){
+ // 已经分销完成,无需继续分销
+ return;
+ }
+ if(!BooleanUtils.isTrue(consumer.getCalculateStatus())){
+ // 先计算
+ boolean update = this.update(Wrappers.lambdaUpdate(ConsumeLog.class)
+ .eq(ConsumeLog::getId, id)
+ .eq(ConsumeLog::getCalculateStatus, false)
+ .set(ConsumeLog::getCalculateStatus, true));
+ if(update){
+ consumer = calculateInitFenxiao(consumer);
+ consumer.setCalculateStatus(true);
+ this.updateById(consumer);
+ }
+ }
+ LoginUser loginUser = LoginHelper.getLoginUser();
+ // 在分销
+ boolean update = this.update(Wrappers.lambdaUpdate(ConsumeLog.class)
+ .eq(ConsumeLog::getId, id)
+ .eq(ConsumeLog::getStatus, ConsumeLogStatus.READY.getCode())
+ .set(ConsumeLog::getOpName, loginUser!=null?loginUser.getUsername():"system")
+ .set(ConsumeLog::getOpId, loginUser!=null?loginUser.getUserId():"-1")
+ .set(ConsumeLog::getStatus, ConsumeLogStatus.ALREADY.getCode()));
+ if(!update){
+ log.error("无需分销 consumer={}", JSON.toJSONString(consumer));
+ return;
+ }
+ AccountBusinessEnum accountBusinessEnum = AccountBusinessEnum.getByName(consumer.getBusinessEnum());
+ if(accountBusinessEnum == null){
+ log.error("分销失败 BusinessEnum状态错误! consumerLog={}",JSON.toJSONString(consumer));
+ return;
+ }
+ try {
+ // 计算一级
+ if(consumer.getOneUserId() != null && BooleanUtils.isTrue(consumer.getOneJoin())
+ && consumer.getOneAmount() > 0){
+ accountService.distribution(consumer.getOneUserId(),consumer.getOneAmount(),accountBusinessEnum.getOneEnum(),consumer.getTraceId());
+ }
+ // 计算工会
+ if(consumer.getUnionUserId() != null && BooleanUtils.isTrue(consumer.getUnionJoin())
+ && consumer.getUnionAmount() > 0){
+ accountService.distribution(consumer.getUnionUserId(),consumer.getUnionAmount(),accountBusinessEnum.getUnionEnum(),consumer.getTraceId());
+ }
+ }catch (Exception e){
+ log.error("分销发生未知错误,请联系开发检查!",e);
+ }
+ }
+
+ @Override
+ public ConsumeLog calculateInitFenxiao(ConsumeLog consumeLog){
+ if(ConsumeLogType.RECHARGE.getCode().equals(consumeLog.getType())){
+ Long sourceUserId = consumeLog.getSourceUserId();
+ UserInvite userInvite = userInviteService.getByUserId(sourceUserId);
+ if(userInvite != null){
+ User oneUser = userService.getById(userInvite.getInviteId());
+ if(oneUser != null && oneUser.getStatus() == 0){
+ UserInfo userInfo = userInfoService.getByUserId(userInvite.getUserId());
+ consumeLog.setOneRate(userInfo.getPayIncomeRate());
+ consumeLog.setOneUserId(userInvite.getInviteId());
+ consumeLog.setOneUsercode(oneUser.getUsercode());
+ consumeLog.setOnePhone(oneUser.getMobile());
+ consumeLog.setOneJoin(userInvite.getEnableRate());
+ consumeLog.setOneIsUnion(oneUser.getIsUnion());
+ consumeLog.setOneAmount(NumCaUtil.coin(consumeLog.getAmount(),consumeLog.getOneRate()));
+ }
+ }
+ return consumeLog;
+ }
+ Long targetUserId = consumeLog.getTargetUserId();
+ if(targetUserId != null){
+ // 获取一级分销
+ UserInvite userInvite = userInviteService.getByUserId(targetUserId);
+ if(userInvite != null){
+ User oneUser = userService.getById(userInvite.getInviteId());
+ if(oneUser != null && oneUser.getStatus() == 0){
+ UserInfo userInfo = userInfoService.getByUserId(userInvite.getUserId());
+ if(ConsumeLogType.GUARD.getCode().equals(consumeLog.getType())){
+ consumeLog.setOneRate(userInfo.getGuardIncomeRate());
+ }else if(ConsumeLogType.GIFT.getCode().equals(consumeLog.getType())){
+ consumeLog.setOneRate(userInfo.getGiftIncomeRate());
+ }else if(ConsumeLogType.VIDEO.getCode().equals(consumeLog.getType())){
+ consumeLog.setOneRate(userInfo.getVideoIncomeRate());
+ }
+ consumeLog.setOneUserId(userInvite.getInviteId());
+ consumeLog.setOneUsercode(oneUser.getUsercode());
+ consumeLog.setOnePhone(oneUser.getMobile());
+ consumeLog.setOneJoin(userInvite.getEnableRate());
+ consumeLog.setOneIsUnion(oneUser.getIsUnion());
+ consumeLog.setOneAmount(NumCaUtil.coin(consumeLog.getAnchorAmount(),consumeLog.getOneRate()));
+ }
+ }
+ // 工会分销 只有通话和礼物才有
+ if(ConsumeLogType.GIFT.getCode().equals(consumeLog.getType())
+ || ConsumeLogType.VIDEO.getCode().equals(consumeLog.getType())){
+ UnionUser unionUser = unionUserService.getByUserId(targetUserId);
+ if(unionUser != null){
+ User user = userService.getById(unionUser.getId());
+ if(user != null && user.getIsUnion() == 1 && user.getStatus() == 0){
+ Union 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());
+ }
+ consumeLog.setOneAmount(NumCaUtil.coin(consumeLog.getAnchorAmount(),consumeLog.getUnionRate()));
+ }
+ }
+ }
+ }
+ }
+ return consumeLog;
+ }
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/GuardTotalServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/GuardTotalServiceImpl.java
index 6eba4e56..4ddc69c8 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/GuardTotalServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/GuardTotalServiceImpl.java
@@ -9,19 +9,25 @@ import com.ruoyi.cai.dto.app.query.GiveGuardReq;
import com.ruoyi.cai.dto.app.dto.GuardTotalDTO;
import com.ruoyi.cai.dto.app.vo.index.GuardIndexVo;
import com.ruoyi.cai.dto.app.vo.index.GuardListPageVo;
+import com.ruoyi.cai.enums.AccountBusinessEnum;
import com.ruoyi.cai.enums.ConsumeLogType;
import com.ruoyi.cai.enums.SystemConfigEnum;
+import com.ruoyi.cai.manager.IdManager;
+import com.ruoyi.cai.manager.LockManager;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.mapper.GuardTotalMapper;
import com.ruoyi.cai.service.*;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -43,6 +49,9 @@ public class GuardTotalServiceImpl extends ServiceImpl implements RechargeOrderService {
@@ -49,6 +50,14 @@ public class RechargeOrderServiceImpl extends ServiceImpl pageAdmin(PageQuery pageQuery, RechargeOrderAdminVo bo) {
@@ -77,6 +86,36 @@ public class RechargeOrderServiceImpl extends ServiceImpl 0){
accountMapper.incsCoin(userId,dto.getRechargeCoin());
+ accountChangeLogService.saveLogAdmin(user.getId(),user.getUsercode(),RechargeTypeEnum.COIN, AccountChangeEnum.SYSTEM_COIN_INCS,dto.getRechargeCoin(),traceId);
}else{
if(account.getCoin() < -dto.getRechargeCoin()){
throw new ServiceException("调整后余额为负数,无法调整");
}
long l = accountMapper.decrCoin(userId, -dto.getRechargeCoin());
+ accountChangeLogService.saveLogAdmin(user.getId(),user.getUsercode(),RechargeTypeEnum.COIN, AccountChangeEnum.SYSTEM_COIN_DECR,dto.getRechargeCoin(),traceId);
if(l == 0){
throw new ServiceException("调整后余额为负数,无法调整");
}
@@ -119,11 +162,13 @@ public class RechargeOrderServiceImpl extends ServiceImpl 0){
accountMapper.incsIncomeCoin(userId,dto.getRechargeCoin());
+ accountChangeLogService.saveLogAdmin(user.getId(),user.getUsercode(),RechargeTypeEnum.COIN_INCOME, AccountChangeEnum.SYSTEM_INCOME_COIN_INCS,dto.getRechargeCoin(),traceId);
}else{
if(account.getIncomeCoin() < -dto.getRechargeCoin()){
throw new ServiceException("调整后收益为负数,无法调整");
}
long l = accountMapper.decrIncomeCoin(userId, -dto.getRechargeCoin());
+ accountChangeLogService.saveLogAdmin(user.getId(),user.getUsercode(),RechargeTypeEnum.COIN_INCOME, AccountChangeEnum.SYSTEM_INCOME_COIN_DECR,dto.getRechargeCoin(),traceId);
if(l == 0){
throw new ServiceException("调整后收益为负数,无法调整");
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserGiftServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserGiftServiceImpl.java
index 2e27e194..4d0abcf6 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserGiftServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserGiftServiceImpl.java
@@ -4,16 +4,23 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.app.query.GiveGiftRes;
import com.ruoyi.cai.dto.app.vo.index.UserGiftIndexVo;
+import com.ruoyi.cai.enums.AccountBusinessEnum;
import com.ruoyi.cai.enums.ConsumeLogType;
+import com.ruoyi.cai.manager.IdManager;
+import com.ruoyi.cai.manager.LockManager;
import com.ruoyi.cai.mapper.UserGiftMapper;
import com.ruoyi.cai.service.*;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
import lombok.RequiredArgsConstructor;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
* 礼物记录Service业务层处理
@@ -33,6 +40,8 @@ public class UserGiftServiceImpl extends ServiceImpl i
private UserService userService;
@Autowired
private AnchorService anchorService;
+ @Autowired
+ private RedissonClient redissonClient;
@Override
@@ -41,39 +50,52 @@ public class UserGiftServiceImpl extends ServiceImpl i
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public boolean giveGift(GiveGiftRes query) {
Long fromUserId = LoginHelper.getUserId();
Gift gift = giftService.getById(query.getGiftId());
if(gift == null){
throw new ServiceException("礼物不存在");
}
- User fromUser = userService.getById(fromUserId);
- User toUser = userService.getById(query.getToUserId());
- Anchor anchor = anchorService.getByUserId(query.getToUserId());
- Long price = gift.getPrice();
- Long giftAmount = query.getGiftCount() * price;
- ConsumeLog consumeLog = new ConsumeLog();
- consumeLog.init(fromUser,toUser);
- consumeLog.setType(ConsumeLogType.GIFT.getCode());
- consumeLog.setAmount(giftAmount);
- consumeLog.setTargetRate(anchor.getGiftRate());
- consumeLog = accountService.decr(consumeLog);
- UserGift userGift = new UserGift();
- userGift.setType(query.getType());
- userGift.setFromUid(fromUserId);
- userGift.setFromMobile(fromUser.getMobile());
- userGift.setFromUsercode(fromUser.getUsercode());
- userGift.setToUid(query.getToUserId());
- userGift.setToMobile(toUser.getMobile());
- userGift.setToUsercode(toUser.getUsercode());
- userGift.setGiftId(query.getGiftId());
- userGift.setGiftName(gift.getName());
- userGift.setGiftImg(gift.getImg());
- userGift.setGiftPrice(gift.getPrice());
- userGift.setGiftCount(query.getGiftCount());
- userGift.setGiftAmount(giftAmount);
- userGift.setConsumerLogId(consumeLog.getId());
- this.save(userGift);
+ String guardLock = LockManager.getSendGuardLock(fromUserId);
+ RLock lock = redissonClient.getLock(guardLock);
+ if(lock.isLocked()){
+ throw new ServiceException("您点击太快了");
+ }
+ try {
+ lock.lock(3, TimeUnit.SECONDS);
+ User fromUser = userService.getById(fromUserId);
+ User toUser = userService.getById(query.getToUserId());
+ Anchor anchor = anchorService.getByUserId(query.getToUserId());
+ Long price = gift.getPrice();
+ Long traceId = IdManager.nextId();
+ Long giftAmount = query.getGiftCount() * price;
+ ConsumeLog consumeLog = new ConsumeLog();
+ consumeLog.init(fromUser,toUser);
+ consumeLog.setTraceId(traceId);
+ consumeLog.setType(ConsumeLogType.GIFT.getCode());
+ consumeLog.setAmount(giftAmount);
+ consumeLog.setTargetRate(anchor.getGiftRate());
+ accountService.decr(consumeLog, AccountBusinessEnum.GIFT);
+ UserGift userGift = new UserGift();
+ userGift.setType(query.getType());
+ userGift.setFromUid(fromUserId);
+ userGift.setFromMobile(fromUser.getMobile());
+ userGift.setFromUsercode(fromUser.getUsercode());
+ userGift.setToUid(query.getToUserId());
+ userGift.setToMobile(toUser.getMobile());
+ userGift.setToUsercode(toUser.getUsercode());
+ userGift.setGiftId(query.getGiftId());
+ userGift.setGiftName(gift.getName());
+ userGift.setGiftImg(gift.getImg());
+ userGift.setGiftPrice(gift.getPrice());
+ userGift.setGiftCount(query.getGiftCount());
+ userGift.setGiftAmount(giftAmount);
+ userGift.setTraceId(traceId);
+ this.save(userGift);
+ }finally {
+ lock.unlock();
+ }
return true;
}
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/VipOrderServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/VipOrderServiceImpl.java
index 16dfc90c..9a6334e2 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/VipOrderServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/VipOrderServiceImpl.java
@@ -39,10 +39,6 @@ public class VipOrderServiceImpl extends ServiceImpl im
@Autowired
private MemberPriceService memberPriceService;
@Autowired
- private ConsumeLogService consumeLogService;
- @Autowired
- private UserService userService;
- @Autowired
private UserMemberService userMemberService;
/**
@@ -159,7 +155,7 @@ public class VipOrderServiceImpl extends ServiceImpl im
userMemberService.saveOrUpdate(userMember);
return true;
}
- if(longs == 1){ // 已经是永久会员还买? 什么都不干
+ if(longs == 1){ // 已经是永久会员还买? 傻逼
return true;
}
userMember.setCreateTime(createTime);
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/util/NumCaUtil.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/util/NumCaUtil.java
index 33d5589d..edc376de 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/util/NumCaUtil.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/util/NumCaUtil.java
@@ -14,6 +14,9 @@ public class NumCaUtil {
* @return
*/
public static Long coin(Long value, BigDecimal rate){
+ if(value == null || rate == null){
+ return 0L;
+ }
BigDecimal decimal = NumberUtil.mul(value, rate);
return decimal.setScale(0, RoundingMode.DOWN).longValue();
}