From 0fa2841213f07a079c322892a05e06bc4b65ebd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=AF=28004796=29?= Date: Fri, 5 Jan 2024 18:18:21 +0800 Subject: [PATCH] 123 --- .../com/ruoyi/cai/domain/AccountCash.java | 1 + .../ruoyi/cai/domain/AccountChangeLog.java | 13 +- .../java/com/ruoyi/cai/domain/ConsumeLog.java | 17 +- .../java/com/ruoyi/cai/domain/GuardLog.java | 5 +- .../com/ruoyi/cai/domain/RechargeOrder.java | 1 + .../java/com/ruoyi/cai/domain/UserGift.java | 2 +- .../ruoyi/cai/enums/AccountBusinessEnum.java | 72 ++++---- .../ruoyi/cai/enums/AccountChangeEnum.java | 50 ++++++ .../com/ruoyi/cai/enums/ConsumeLogStatus.java | 20 +++ .../com/ruoyi/cai/enums/ConsumeLogType.java | 2 +- .../java/com/ruoyi/cai/manager/IdManager.java | 26 +++ .../com/ruoyi/cai/manager/LockManager.java | 10 ++ .../cai/service/AccountChangeLogService.java | 9 + .../com/ruoyi/cai/service/AccountService.java | 11 +- .../ruoyi/cai/service/ConsumeLogService.java | 3 + .../cai/service/RechargeOrderService.java | 6 + .../service/impl/AccountCashServiceImpl.java | 5 +- .../impl/AccountChangeLogServiceImpl.java | 32 ++++ .../cai/service/impl/AccountServiceImpl.java | 138 +++++++-------- .../service/impl/ConsumeLogServiceImpl.java | 158 +++++++++++++++++- .../service/impl/GuardTotalServiceImpl.java | 85 ++++++---- .../impl/RechargeOrderServiceImpl.java | 63 ++++++- .../cai/service/impl/UserGiftServiceImpl.java | 76 ++++++--- .../cai/service/impl/VipOrderServiceImpl.java | 6 +- .../java/com/ruoyi/cai/util/NumCaUtil.java | 3 + 25 files changed, 605 insertions(+), 209 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/enums/AccountChangeEnum.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/enums/ConsumeLogStatus.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/manager/IdManager.java 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(); }