diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java index deb73bb..3b7d18b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java @@ -48,6 +48,10 @@ public class MemberConfigBaseVO { @NotNull(message = "vip查看微信次数不能为空") @Schema(description = "vip查看微信次数") private Integer vipLookWechtCout; + + @NotNull(message = "礼物提现比例不能为空") + @Schema(description = "礼物提现比例") + private Integer giftCashRatio; @Schema(description = "举报类型") private List reportTypeList; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java index 3608bf4..17c49d5 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java @@ -78,6 +78,12 @@ public class MemberConfigDO extends BaseDO { */ private Integer vipLookWechtCout; + /** + * 礼物提现比例 + * `giftCashRatio`可以兑换1人民币 + */ + private Integer giftCashRatio; + /** * 举报类型 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java index f35e854..6f44a77 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java @@ -193,12 +193,16 @@ public class RecentServiceImpl implements RecentService { } } List likeActionList = Arrays.asList(MemberRecentOperateEnum.MEMBER_COLLECT, MemberRecentOperateEnum.RECENT_LIKE); - OperationDO operationDO = operationMapper.selectOne(new LambdaQueryWrapperX() - .eq(OperationDO::getMemberId, dto.getMemberId()) - .eq(OperationDO::getOperatorMemberId, dto.getOperatorMemberId()) - .eq(OperationDO::getBizType, dto.getAction().getType()) - .eq(ObjectUtil.isNotEmpty(dto.getMemberRecentId()), OperationDO::getMemberRecentId, dto.getMemberRecentId()) - ); + List notFindActionList = Arrays.asList(MemberRecentOperateEnum.MEMBER_REPORT); + OperationDO operationDO = null; + if (!notFindActionList.contains(dto.getAction())) { + operationMapper.selectOne(new LambdaQueryWrapperX() + .eq(OperationDO::getMemberId, dto.getMemberId()) + .eq(OperationDO::getOperatorMemberId, dto.getOperatorMemberId()) + .eq(OperationDO::getBizType, dto.getAction().getType()) + .eq(ObjectUtil.isNotEmpty(dto.getMemberRecentId()), OperationDO::getMemberRecentId, dto.getMemberRecentId()) + ); + } if (likeActionList.contains(dto.getAction())) { if (ObjectUtil.isNotEmpty(operationDO)) { if (ObjectUtil.isEmpty(operationDO.getCancelTime())) { @@ -238,7 +242,7 @@ public class RecentServiceImpl implements RecentService { } // 屏蔽/拉黑 if (ObjectUtil.equals(dto.getAction(), MemberRecentOperateEnum.MEMBER_SHIELD)) { - + } // 举报 List reportList = new ArrayList() {{ diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java index 63b901e..ea04967 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/wallet/PayWalletBizTypeEnum.java @@ -21,7 +21,9 @@ public enum PayWalletBizTypeEnum implements ArrayValuable { PAYMENT_REFUND(4, "支付退款"), UPDATE_BALANCE(5, "更新余额"), BROKERAGE_WITHDRAW(6, "分佣提现"), - GIFT(7, "送礼物"); + GIFT(7, "送礼物"), + RECEIVE_GIFT(8, "收到礼物"), + ; /** * 业务分类 diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java index 7e42fc5..61c7792 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java @@ -16,4 +16,13 @@ public class AppPayWalletRespVO { @Schema(description = "累计充值,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") private Integer totalRecharge; + @Schema(description = "(礼物)钱包余额,单位分") + private Integer giftBalance; + + @Schema(description = "(礼物)累计支出,单位分") + private Integer giftTotalExpense; + + @Schema(description = "(礼物)累计充值,单位分") + private Integer giftTotalRecharge; + } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/wallet/PayWalletDO.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/wallet/PayWalletDO.java index a3c54c9..9b5c7f4 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/wallet/PayWalletDO.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/wallet/PayWalletDO.java @@ -12,7 +12,7 @@ import lombok.Data; * * @author jason */ -@TableName(value ="pay_wallet") +@TableName(value = "pay_wallet") @KeySequence("pay_wallet_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data public class PayWalletDO extends BaseDO { @@ -25,14 +25,15 @@ public class PayWalletDO extends BaseDO { /** * 用户 id - * + *

* 关联 MemberUserDO 的 id 编号 * 关联 AdminUserDO 的 id 编号 */ private Long userId; + /** * 用户类型, 预留 多商户转帐可能需要用到 - * + *

* 关联 {@link UserTypeEnum} */ private Integer userType; @@ -51,9 +52,30 @@ public class PayWalletDO extends BaseDO { * 累计支出,单位分 */ private Integer totalExpense; + /** * 累计充值,单位分 */ private Integer totalRecharge; + /** + * 礼物余额,单位分 + */ + private Integer giftBalance; + + /** + * 礼物累计支出,单位分 + */ + private Integer giftTotalExpense; + + /** + * 礼物累计充值,单位分 + */ + private Integer giftTotalRecharge; + + /** + * 礼物冻结金额,单位分 + */ + private Integer giftFreezePrice; + } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/wallet/PayWalletMapper.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/wallet/PayWalletMapper.java index 19a76cd..a06662b 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/wallet/PayWalletMapper.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/wallet/PayWalletMapper.java @@ -28,7 +28,7 @@ public interface PayWalletMapper extends BaseMapperX { /** * 当消费退款时候, 更新钱包 * - * @param id 钱包 id + * @param id 钱包 id * @param price 消费金额 */ default int updateWhenConsumptionRefund(Long id, Integer price) { @@ -43,9 +43,9 @@ public interface PayWalletMapper extends BaseMapperX { * 当消费时候, 更新钱包 * * @param price 消费金额 - * @param id 钱包 id + * @param id 钱包 id */ - default int updateWhenConsumption(Long id, Integer price){ + default int updateWhenConsumption(Long id, Integer price) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" balance = balance - " + price + ", total_expense = total_expense + " + price) @@ -57,10 +57,10 @@ public interface PayWalletMapper extends BaseMapperX { /** * 当充值的时候,更新钱包 * - * @param id 钱包 id + * @param id 钱包 id * @param price 钱包金额 */ - default int updateWhenRecharge(Long id, Integer price){ + default int updateWhenRecharge(Long id, Integer price) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" balance = balance + " + price + ", total_recharge = total_recharge + " + price) @@ -71,23 +71,23 @@ public interface PayWalletMapper extends BaseMapperX { /** * 增加余额的时候,更新钱包 * - * @param id 钱包 id + * @param id 钱包 id * @param price 钱包金额 */ default void updateWhenAdd(Long id, Integer price) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" balance = balance + " + price) - .eq(PayWalletDO::getId, id); + .setSql(" balance = balance + " + price) + .eq(PayWalletDO::getId, id); update(null, lambdaUpdateWrapper); } /** * 冻结钱包部分余额 * - * @param id 钱包 id + * @param id 钱包 id * @param price 冻结金额 */ - default int freezePrice(Long id, Integer price){ + default int freezePrice(Long id, Integer price) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" balance = balance - " + price + ", freeze_price = freeze_price + " + price) @@ -99,10 +99,10 @@ public interface PayWalletMapper extends BaseMapperX { /** * 解冻钱包余额 * - * @param id 钱包 id + * @param id 钱包 id * @param price 解冻金额 */ - default int unFreezePrice(Long id, Integer price){ + default int unFreezePrice(Long id, Integer price) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" balance = balance + " + price + ", freeze_price = freeze_price - " + price) @@ -114,10 +114,10 @@ public interface PayWalletMapper extends BaseMapperX { /** * 当充值退款时, 更新钱包 * - * @param id 钱包 id + * @param id 钱包 id * @param price 退款金额 */ - default int updateWhenRechargeRefund(Long id, Integer price){ + default int updateWhenRechargeRefund(Long id, Integer price) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" freeze_price = freeze_price - " + price + ", total_recharge = total_recharge - " + price) @@ -127,6 +127,22 @@ public interface PayWalletMapper extends BaseMapperX { return update(null, lambdaUpdateWrapper); } + + /* *************************************** start 礼物相关 start *************************************** */ + + /** + * 增加余额(礼物)的时候,更新钱包 + */ + default void updateGiftWhenAdd(Long id, Integer price) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() + .setSql(" gift_balance = gift_balance + " + price) + .eq(PayWalletDO::getId, id); + update(null, lambdaUpdateWrapper); + } + + + /* *************************************** end 礼物相关 end *************************************** */ + } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index b27adcd..aa5d4f3 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -166,7 +166,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { payWalletService.reduceWalletBalance(currentWallet.getId(), userTransitionObj.getBizId(), PayWalletBizTypeEnum.GIFT, gift.getPrice()); // 添加目标用户余额 - payWalletService.addWalletBalance(targetWallet.getId(), String.valueOf(userTransitionObj.getId()), PayWalletBizTypeEnum.GIFT, gift.getPrice()); + payWalletService.addWalletGiftBalance(targetWallet.getId(), String.valueOf(userTransitionObj.getId()), PayWalletBizTypeEnum.RECEIVE_GIFT, gift.getPrice()); return userTransitionObj.getId(); } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletService.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletService.java index 358d149..1f2b638 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletService.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletService.java @@ -81,6 +81,11 @@ public interface PayWalletService { PayWalletTransactionDO addWalletBalance(Long walletId, String bizId, PayWalletBizTypeEnum bizType, Integer price); + /** + * 增加钱包余额(送礼物) + */ + PayWalletTransactionDO addWalletGiftBalance(Long walletId, String bizId, PayWalletBizTypeEnum bizType, Integer price); + /** * 冻结钱包部分余额 * diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletServiceImpl.java index eb41710..e0027b6 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletServiceImpl.java @@ -216,6 +216,39 @@ public class PayWalletServiceImpl implements PayWalletService { }); } + /** + * 增加钱包余额(送礼物) + */ + @Override + @Transactional(rollbackFor = Exception.class) + @SneakyThrows + public PayWalletTransactionDO addWalletGiftBalance(Long walletId, String bizId, PayWalletBizTypeEnum bizType, Integer price) { + // 1. 获取钱包 + PayWalletDO payWallet = getWallet(walletId); + if (payWallet == null) { + log.error("[addWalletBalance][用户钱包({})不存在]", walletId); + throw exception(WALLET_NOT_FOUND); + } + // 2. 加锁,更新钱包余额(目的:避免钱包流水的并发更新时,余额变化不连贯) + return lockRedisDAO.lock(walletId, UPDATE_TIMEOUT_MILLIS, () -> { + // 3. 更新钱包金额 + switch (bizType) { + case RECEIVE_GIFT: // 收到礼物 + walletMapper.updateGiftWhenAdd(payWallet.getId(), price); + break; + default: { + throw new UnsupportedOperationException("待实现:" + bizType); + } + } + + // 4. 生成钱包流水 + WalletTransactionCreateReqBO transactionCreateReqBO = new WalletTransactionCreateReqBO() + .setWalletId(payWallet.getId()).setPrice(price).setBalance(payWallet.getBalance() + price) + .setBizId(bizId).setBizType(bizType.getType()).setTitle(bizType.getDescription()); + return walletTransactionService.createWalletTransaction(transactionCreateReqBO); + }); + } + @Override public void freezePrice(Long id, Integer price) { int updateCounts = walletMapper.freezePrice(id, price);