feat:兑换比例配置

This commit is contained in:
dzc committed 2025-12-08 13:21:55 +08:00
1 parent b9ea43afdd
commit c198254f55
10 files changed
+127 -26

No files matched your search

@@ -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<String> reportTypeList;
@@ -78,6 +78,12 @@ public class MemberConfigDO extends BaseDO {
*/
private Integer vipLookWechtCout;
/**
* 礼物提现比例
* `giftCashRatio`可以兑换1人民币
*/
private Integer giftCashRatio;
/**
* 举报类型
*/
@@ -193,12 +193,16 @@ public class RecentServiceImpl implements RecentService {
}
}
List<MemberRecentOperateEnum> likeActionList = Arrays.asList(MemberRecentOperateEnum.MEMBER_COLLECT, MemberRecentOperateEnum.RECENT_LIKE);
OperationDO operationDO = operationMapper.selectOne(new LambdaQueryWrapperX<OperationDO>()
.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<MemberRecentOperateEnum> notFindActionList = Arrays.asList(MemberRecentOperateEnum.MEMBER_REPORT);
OperationDO operationDO = null;
if (!notFindActionList.contains(dto.getAction())) {
operationMapper.selectOne(new LambdaQueryWrapperX<OperationDO>()
.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<MemberRecentOperateEnum> reportList = new ArrayList<MemberRecentOperateEnum>() {{
@@ -21,7 +21,9 @@ public enum PayWalletBizTypeEnum implements ArrayValuable<Integer> {
PAYMENT_REFUND(4, "支付退款"),
UPDATE_BALANCE(5, "更新余额"),
BROKERAGE_WITHDRAW(6, "分佣提现"),
GIFT(7, "送礼物");
GIFT(7, "送礼物"),
RECEIVE_GIFT(8, "收到礼物"),
;
/**
* 业务分类
@@ -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;
}
@@ -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
*
* <p>
* 关联 MemberUserDO 的 id 编号
* 关联 AdminUserDO 的 id 编号
*/
private Long userId;
/**
* 用户类型, 预留 多商户转帐可能需要用到
*
* <p>
* 关联 {@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;
}
@@ -28,7 +28,7 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
/**
* 当消费退款时候, 更新钱包
*
* @param id 钱包 id
* @param id 钱包 id
* @param price 消费金额
*/
default int updateWhenConsumptionRefund(Long id, Integer price) {
@@ -43,9 +43,9 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
* 当消费时候, 更新钱包
*
* @param price 消费金额
* @param id 钱包 id
* @param id 钱包 id
*/
default int updateWhenConsumption(Long id, Integer price){
default int updateWhenConsumption(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance - " + price
+ ", total_expense = total_expense + " + price)
@@ -57,10 +57,10 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
/**
* 当充值的时候,更新钱包
*
* @param id 钱包 id
* @param id 钱包 id
* @param price 钱包金额
*/
default int updateWhenRecharge(Long id, Integer price){
default int updateWhenRecharge(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance + " + price
+ ", total_recharge = total_recharge + " + price)
@@ -71,23 +71,23 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
/**
* 增加余额的时候,更新钱包
*
* @param id 钱包 id
* @param id 钱包 id
* @param price 钱包金额
*/
default void updateWhenAdd(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.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<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance - " + price
+ ", freeze_price = freeze_price + " + price)
@@ -99,10 +99,10 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
/**
* 解冻钱包余额
*
* @param id 钱包 id
* @param id 钱包 id
* @param price 解冻金额
*/
default int unFreezePrice(Long id, Integer price){
default int unFreezePrice(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance + " + price
+ ", freeze_price = freeze_price - " + price)
@@ -114,10 +114,10 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
/**
* 当充值退款时, 更新钱包
*
* @param id 钱包 id
* @param id 钱包 id
* @param price 退款金额
*/
default int updateWhenRechargeRefund(Long id, Integer price){
default int updateWhenRechargeRefund(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" freeze_price = freeze_price - " + price
+ ", total_recharge = total_recharge - " + price)
@@ -127,6 +127,22 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
return update(null, lambdaUpdateWrapper);
}
/* *************************************** start 礼物相关 start *************************************** */
/**
* 增加余额(礼物)的时候,更新钱包
*/
default void updateGiftWhenAdd(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" gift_balance = gift_balance + " + price)
.eq(PayWalletDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/* *************************************** end 礼物相关 end *************************************** */
}
@@ -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();
}
@@ -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);
/**
* 冻结钱包部分余额
*
@@ -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);