diff --git a/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java b/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java index 8945ced5a..8caeb86bb 100644 --- a/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java +++ b/mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java @@ -12,9 +12,9 @@ public class CallTest { private static final String BASIC_URL = "https://openapitest.malls.iformall.com"; public static void main(String[] args) { - String appId = "CP6nwHvZ"; - String appKey = "b257eb97bb9380714306a077a66086e8b1f10639"; - String signKey = "C61842C8570524AA81756C53B8096978A06AE00D"; + String appId = "YhCW8Dra"; + String appKey = "389ac85b768b19427685bcc4adea0474cef22a14"; + String signKey = "B0AB3E2CBCB484D04AEAD0BEF933F7CF5489450C"; // 会员注册 // userRegister(appId, appKey, signKey); diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 9b5b108ba..f3be3e4eb 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -200,6 +200,14 @@ public interface WxOrderService { void updateStatusByPressCouponId(Long couponId, TenantEntity tenantEntity,int orderStatus); + /** + * 通过优惠券id更新订单状态 + * @param tenantId + * @param couponId + * @param orderStatus + */ + void updateStatusByPressCouponId(String tenantId, Long couponId, int orderStatus); + void updateOrderStatus(WxOrder order); void updateOrderGroupStatusByCouponId(Long id, TenantEntity tenantEntity, Integer code); diff --git a/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java b/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java index 5fd12a9fd..b3cc03ebc 100644 --- a/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java +++ b/mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java @@ -2,10 +2,13 @@ package com.iformall.service.helper; import com.iformall.common.ErrorCode; import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.base.TenantEntity; import com.iformall.enums.EnumCacheKey; +import com.iformall.enums.EnumOrderStatus; import com.iformall.exception.MallinkException; import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponService; +import com.iformall.service.WxOrderService; import com.iformall.utils.RedisLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,48 +16,63 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.util.concurrent.CompletableFuture; + @Service public class WxOrderServiceHelper { - private static final Logger logger = LoggerFactory.getLogger(WxOrderServiceHelper.class); - + private static final Logger logger = LoggerFactory.getLogger(WxOrderServiceHelper.class); + @Lazy @Autowired WxCouponChannelService wxCouponChannelService; - + @Lazy @Autowired WxCouponService wxCouponService; - + + @Lazy + @Autowired + private WxOrderService wxOrderService; + @Autowired RedisLock redisLock; + /** * 微信订单是否可以支付 */ - public void reduceStock(boolean isChannelStockReduce, WxCoupon coupon,Long couponChannelId,int number) throws Exception{ - if (isChannelStockReduce) { - try { - wxCouponChannelService.reduceChannelStock(coupon,couponChannelId,number); - long stock = redisLock.decrease(EnumCacheKey.COUPON_CHANNEL_STOCK.getMessage()+couponChannelId, number); - if (stock < 0 ) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]渠道["+couponChannelId+"]库存已为零!"); - } - } catch (RuntimeException e) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]渠道["+couponChannelId+"]库存更新失败!"+e.getMessage()); - } - - }else { - try { - wxCouponService.reduceRemainInventory(coupon,coupon.getId(),number); - long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), number); - if (stock < 0 ) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存已为零!"); - } - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: " + coupon.getId(),e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存更新失败!"+e.getMessage()); - } - } + public void reduceStock(boolean isChannelStockReduce, WxCoupon coupon, Long couponChannelId, int number, Boolean isPressOrder) throws Exception { + long stock; + if (isChannelStockReduce) { + try { + wxCouponChannelService.reduceChannelStock(coupon, couponChannelId, number); + stock = redisLock.decrease(EnumCacheKey.COUPON_CHANNEL_STOCK.getMessage() + couponChannelId, number); + if (stock < 0) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]渠道[" + couponChannelId + "]库存已为零!"); + } + } catch (RuntimeException e) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]渠道[" + couponChannelId + "]库存更新失败!" + e.getMessage()); + } + + } else { + try { + wxCouponService.reduceRemainInventory(coupon, coupon.getId(), number); + stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage() + coupon.getId(), number); + if (stock < 0) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]库存已为零!"); + } + } catch (RuntimeException e) { + logger.error("此券减库存失败, couponId: " + coupon.getId(), e); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), "券[" + coupon.getTitle() + "]库存更新失败!" + e.getMessage()); + } + } + + // 如果是砍价订单,当库存不足时自动取消进行中的订单 + CompletableFuture.runAsync(() -> { + if (isPressOrder && stock <= 0) { + wxOrderService.updateStatusByPressCouponId(coupon.getTenantId(), coupon.getCouponId(), EnumOrderStatus.ORDER_STATUS_PRESS_CANCEL.getCode()); + } + }); } - + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 714c5d3c5..9aef44815 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1121,7 +1121,7 @@ public class WxOrderServiceImpl implements WxOrderService { } if (isReduceStock) { try { - wxOrderServiceHelper.reduceStock(isChannelStockReduce,coupon,couponChannelId, number); + wxOrderServiceHelper.reduceStock(isChannelStockReduce,coupon,couponChannelId, number, isPressOrder); }catch (Exception e) { throw new MallinkException(ErrorCode.DB_FAIL.getCode(),e.getMessage()); } @@ -3054,6 +3054,16 @@ public class WxOrderServiceImpl implements WxOrderService { wxOrderMapper.updateStatusByPressCouponId(updateOrder); } + @Override + public void updateStatusByPressCouponId(String tenantId, Long couponId, int orderStatus) { + WxOrder updateOrder = new WxOrder(); + updateOrder.setTenantId(tenantId); + updateOrder.setOrderStatus(orderStatus); + updateOrder.setProductId(couponId); + updateOrder.setUpdateDate(new Date()); + wxOrderMapper.updateStatusByPressCouponId(updateOrder); + } + @Autowired @Qualifier("cUserBasicInfoRedisTemplate") RedisTemplate cUserBasicInfoRedisTemplate; diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 3df03d19b..798158b87 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -214,7 +214,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (null != coupon && coupon.getType().intValue() == EnumCouponType.COUPON_PRESS.getCode().intValue() && null != coupon.getPressPayReduceStock() && coupon.getPressPayReduceStock().intValue() == EnumYesOrNo.YES.getCode().intValue()) { try { - wxOrderServiceHelper.reduceStock(false,coupon,order.getCouponChannelId(), 1); + wxOrderServiceHelper.reduceStock(false,coupon,order.getCouponChannelId(), 1, true); return true; }catch(Exception e) { //如果此时扣库存失败,则需要给订单退款