diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxCardPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxCardPayController.java index 45a0bdb22..5e6a6f897 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxCardPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxCardPayController.java @@ -171,7 +171,7 @@ public class WxCardPayController extends BaseController { logger.error("卡不存在: " + cardIdStr); return new ResultData(ErrorCode.CARD_IS_NOT_FOUND); } - return saveCardPayOrder(cUserId,cardInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); + return saveCardPayOrder(false,cUserId,cardInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); } public ResultData savePasswordCardPayOrder(String cardIdStr,String totalFeeStr) { @@ -203,10 +203,10 @@ public class WxCardPayController extends BaseController { } WxCardInfo carInfo = wxCardInfoService.cardCreateByOffline(couponPassword, coupon); - return saveCardPayOrder(Constant.defaultCUserId,carInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); + return saveCardPayOrder(true,Constant.defaultCUserId,carInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); } - private ResultData saveCardPayOrder(Long cUserId,WxCardInfo cardInfo,WxMerchantBUser merchantBUser,String totalFeeStr,EnumPayWay payWay) { + private ResultData saveCardPayOrder(boolean reduceStock,Long cUserId,WxCardInfo cardInfo,WxMerchantBUser merchantBUser,String totalFeeStr,EnumPayWay payWay) { if (EnumCardInfoStatus.STOP.getCode().intValue() == cardInfo.getStatus().intValue()) { return new ResultData(ErrorCode.CARD_IS_NOT_FOUND.getCode(),"卡已被禁用."); @@ -277,9 +277,14 @@ public class WxCardPayController extends BaseController { record.setIp(ipStr); record.setDeductionAmount(payment); record.setRemark("操作于["+payWay.getMessage()+"("+payWay.getCode()+")]"); - + + Integer couponNumber = null; + if (reduceStock) { + couponNumber = 1; + } + try { - return wxCardSpendService.createCardSpend(record, order, couponMerchant,payWay); + return wxCardSpendService.createCardSpend(record, order, couponMerchant,couponNumber,payWay); } catch (MallinkException e) { logger.error("card spend error, req 2: " + record.toString() + ", e:" + e.getMessage()); return new ResultData(e.getErrorCode(), e.getMessage()); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java index 13d2c869d..cccb1ba03 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java @@ -188,7 +188,7 @@ public class WxCardPayController extends BaseController { record.setRemark("操作于["+payWay.getMessage()+"("+payWay.getCode()+")]"); try { - return wxCardSpendService.createCardSpend(record, order, couponMerchant,payWay); + return wxCardSpendService.createCardSpend(record, order, couponMerchant,null,payWay); } catch (MallinkException e) { logger.error("card spend error, req 2: " + record.toString() + ", e:" + e.getMessage()); return new ResultData(e.getErrorCode(), e.getMessage()); diff --git a/mallinkService/src/main/java/com/iformall/service/WxCardSpendService.java b/mallinkService/src/main/java/com/iformall/service/WxCardSpendService.java index 6aad1ce79..9978bc017 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCardSpendService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCardSpendService.java @@ -28,7 +28,7 @@ public interface WxCardSpendService { * @param order * @return */ - ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,EnumPayWay payWay); + ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,Integer reduceCouponNumber,EnumPayWay payWay); /** * 根据实体查询分页列表 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java index 943addd3a..ffb5d03e2 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java @@ -18,9 +18,12 @@ import com.iformall.mapper.*; import com.iformall.service.*; import com.iformall.utils.Constant; import com.iformall.utils.PayUtils; +import com.iformall.utils.RedisLock; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -54,9 +57,11 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { @Autowired WxCouponMerchantMapper wxCouponMerchantMapper; + @Lazy @Autowired WxAppinfoService wxAppinfoService; + @Lazy @Autowired WxPayAccountService wxPayAccountService; @@ -66,23 +71,34 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { @Autowired WxCouponOrderMapper wxCouponOrderMapper; + @Lazy @Autowired WxProfitSharingOrderService profitSharingOrderService; @Autowired ExcelService excelService; + @Lazy @Autowired WxCreditHistoryService wxCreditHistoryService; + @Lazy @Autowired WxScoreRulesService wxScoreRulesService; + @Lazy @Autowired WxCashOutService wxCashOutService; @Autowired WxCouponChannelMapper wxCouponChannelMapper; + + @Lazy + @Autowired + WxCouponService wxCouponService; + + @Autowired + RedisLock redisLock; @Override public WxCouponMerchant checkMerchantInCoupon(WxCardInfo cardInfo, Long merchantId) { @@ -102,7 +118,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,EnumPayWay payWay) { + public ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,Integer reduceCouponNumber,EnumPayWay payWay) { Date curDate = new Date(); final IdWorker idWorker = IdWorker.get(); // 1. get card info @@ -132,6 +148,15 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { if(payAccount == null){ return new ResultData(ErrorCode.API_KEY_NOT_FOUND); } + + //扣减库存 + if (null != reduceCouponNumber && reduceCouponNumber > 0) { + wxCouponService.reduceRemainInventory(coupon,coupon.getId(),reduceCouponNumber); + long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), reduceCouponNumber); + if (stock < 0 ) { + return new ResultData(ErrorCode.API_KEY_NOT_FOUND.getCode(),"库存不足"); + } + } // 4. 扣减计算 Double paymentD = 1.0 * cardInfo.getSaleAmount() * record.getDeductionAmount() / cardInfo.getAmount();