Просмотр исходного кода

feat:修改砍价订单库存不足时处理逻辑

release_toaliyun_real
xmzhao71 2 лет назад
Родитель
Сommit
ee00808d53
5 измененных файлов: 70 добавлений и 34 удалений
  1. +3
    -3
      mallinkPublicApi/src/main/java/com/iformall/utils/CallTest.java
  2. +8
    -0
      mallinkService/src/main/java/com/iformall/service/WxOrderService.java
  3. +47
    -29
      mallinkService/src/main/java/com/iformall/service/helper/WxOrderServiceHelper.java
  4. +11
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  5. +1
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java

+ 3
- 3
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);


+ 8
- 0
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);


+ 47
- 29
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());
}
});
}
}

+ 11
- 1
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<String, WxCUserBasicInfo> cUserBasicInfoRedisTemplate;


+ 1
- 1
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) {
//如果此时扣库存失败,则需要给订单退款


Загрузка…
Отмена
Сохранить