From a97285ba3c5058ef15f868d15a3919e20329cc38 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 27 Mar 2025 16:24:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(mcwl-pay):=20=E4=BF=AE=E5=A4=8D=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mcwl/memberCenter/domain/vo/MemberVo.java | 3 + .../mcwl/pay/service/OrderTradeService.java | 3 +- .../service/impl/OrderTradeServiceImpl.java | 69 ++++++++++++------- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/vo/MemberVo.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/vo/MemberVo.java index 2080c43..da2e06d 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/vo/MemberVo.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/vo/MemberVo.java @@ -3,6 +3,7 @@ package com.mcwl.memberCenter.domain.vo; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import com.mcwl.common.core.domain.BaseEntity; import com.mcwl.memberCenter.enums.MemberEnum; import io.swagger.annotations.ApiModel; @@ -34,12 +35,14 @@ public class MemberVo{ /** * 会员开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @ApiModelProperty(value = "会员开始时间") private Date startDate; /** * 会员结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @ApiModelProperty(value = "会员结束时间") private Date endDate; diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/OrderTradeService.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/OrderTradeService.java index 90b6a99..ddd7fef 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/OrderTradeService.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/OrderTradeService.java @@ -11,6 +11,7 @@ import com.mcwl.resource.domain.dto.ProductRes; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; /** * @Author:ChenYan @@ -30,7 +31,7 @@ public interface OrderTradeService extends IService { int updateMallProduct(OrderTrade orderTrade); - void orderHandler(OrderTrade orderTrade, String suffix, Map params); + void orderHandler(OrderTrade orderTrade, String suffix, Map params) throws ExecutionException; void productHandler(ProductRes productRes); diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java index aa09b90..109072f 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java @@ -5,12 +5,15 @@ import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.mcwl.common.constant.HttpStatus; import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.common.core.page.PageDomain; import com.mcwl.common.core.page.TableDataInfo; import com.mcwl.common.core.redis.RedisCache; import com.mcwl.common.domain.IdsParam; +import com.mcwl.common.exception.ServiceException; import com.mcwl.common.utils.DateUtils; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.common.utils.StringUtils; @@ -50,7 +53,11 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; /** * @Author:ChenYan @@ -101,6 +108,10 @@ public class OrderTradeServiceImpl extends ServiceImpl USER_LOCKS = CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.MINUTES) + .build(); + @Override @Transactional(rollbackFor = Exception.class) public void productHandler(ProductRes productRes) { @@ -325,6 +336,7 @@ public class OrderTradeServiceImpl extends ServiceImpl params) { + public void orderHandler(OrderTrade orderTrade, String suffix, Map params) throws ExecutionException { + Object objLock = USER_LOCKS.get(orderTrade.getCode(), () -> new Object()); + synchronized (objLock) { + orderTrade = orderTradeService.getById(orderTrade.getId()); + if (orderTrade.getPayStatus() == 2) { + return; + } + String buyerPayAmountStr = params.get("buyer_pay_amount"); + if (buyerPayAmountStr != null && !buyerPayAmountStr.isEmpty()) { + BigDecimal buyerPayAmount = new BigDecimal(buyerPayAmountStr); + orderTrade.setPaymentAmount(buyerPayAmount.intValue()); + } - String buyerPayAmountStr = params.get("buyer_pay_amount"); - if (buyerPayAmountStr != null && !buyerPayAmountStr.isEmpty()) { - BigDecimal buyerPayAmount = new BigDecimal(buyerPayAmountStr); - orderTrade.setPaymentAmount(buyerPayAmount.intValue()); + // 根据订单类型进行处理 + if (OrderTypeEnum.POINTS.getName().equals(suffix)) { + pointsHandler(orderTrade, params); + } else if (OrderTypeEnum.MEMBER.getName().equals(suffix)) { + Long promotionId = redisCache.getCacheObject(params.get("out_trade_no") + "_promotionId"); + memberHandler(orderTrade, promotionId); + redisCache.deleteObject(params.get("out_trade_no") + "_promotionId"); + } else if (OrderTypeEnum.WALLET.getName().equals(suffix)) { + walletHandler(orderTrade, params); + } else { + throw new RuntimeException("订单类型错误"); + } + // 处理订单 + this.orderHandler(orderTrade, params); + // 删除redis缓存 + redisCache.deleteObject(orderTrade.getCode()); } - - // 根据订单类型进行处理 - if (OrderTypeEnum.POINTS.getName().equals(suffix)) { - pointsHandler(orderTrade, params); - } else if (OrderTypeEnum.MEMBER.getName().equals(suffix)) { - Long promotionId = redisCache.getCacheObject(params.get("out_trade_no") + "_promotionId"); - memberHandler(orderTrade, promotionId); - redisCache.deleteObject(params.get("out_trade_no") + "promotionId"); - } else if (OrderTypeEnum.WALLET.getName().equals(suffix)) { - walletHandler(orderTrade, params); - } else { - throw new RuntimeException("订单类型错误"); - } - // 处理订单 - this.orderHandler(orderTrade, params); - // 删除redis缓存 - redisCache.deleteObject(orderTrade.getCode()); - } private void pointsHandler(OrderTrade orderTrade, Map params) { @@ -595,6 +612,12 @@ public class OrderTradeServiceImpl extends ServiceImpl 商品价格(price) 邀请人提成(amount) */ private Map getStringDoubleMap(Long productUserId, SysUser sysUser, Double price) { + + Double wallet = sysUser.getWallet(); + if (wallet < price) { + throw new ServiceException("钱包余额不足,请充值", HttpStatus.SHOW_ERROR_MSG); + } + // 从redis获取提成比例 // 抽取商家金额比例 String CommissionRationMerchant = redisCache.getCacheObject(CommissionRationEnum.COMMISSION_RATION_MERCHANT.getName());