| @@ -171,7 +171,7 @@ public class WxCardPayController extends BaseController { | |||||
| logger.error("卡不存在: " + cardIdStr); | logger.error("卡不存在: " + cardIdStr); | ||||
| return new ResultData(ErrorCode.CARD_IS_NOT_FOUND); | return new ResultData(ErrorCode.CARD_IS_NOT_FOUND); | ||||
| } | } | ||||
| return saveCardPayOrder(false,cUserId,cardInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); | |||||
| return saveCardPayOrder(cUserId,cardInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); | |||||
| } | } | ||||
| public ResultData savePasswordCardPayOrder(String cardIdStr,String totalFeeStr) { | public ResultData savePasswordCardPayOrder(String cardIdStr,String totalFeeStr) { | ||||
| @@ -203,10 +203,10 @@ public class WxCardPayController extends BaseController { | |||||
| } | } | ||||
| WxCardInfo carInfo = wxCardInfoService.cardCreateByOffline(couponPassword, coupon); | WxCardInfo carInfo = wxCardInfoService.cardCreateByOffline(couponPassword, coupon); | ||||
| return saveCardPayOrder(true,Constant.defaultCUserId,carInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); | |||||
| return saveCardPayOrder(Constant.defaultCUserId,carInfo,merchantBUser,totalFeeStr,EnumPayWay.PAY_WAY_WECHAT); | |||||
| } | } | ||||
| private ResultData saveCardPayOrder(boolean reduceStock,Long cUserId,WxCardInfo cardInfo,WxMerchantBUser merchantBUser,String totalFeeStr,EnumPayWay payWay) { | |||||
| private ResultData saveCardPayOrder(Long cUserId,WxCardInfo cardInfo,WxMerchantBUser merchantBUser,String totalFeeStr,EnumPayWay payWay) { | |||||
| if (EnumCardInfoStatus.STOP.getCode().intValue() == cardInfo.getStatus().intValue()) { | if (EnumCardInfoStatus.STOP.getCode().intValue() == cardInfo.getStatus().intValue()) { | ||||
| return new ResultData(ErrorCode.CARD_IS_NOT_FOUND.getCode(),"卡已被禁用."); | return new ResultData(ErrorCode.CARD_IS_NOT_FOUND.getCode(),"卡已被禁用."); | ||||
| @@ -279,12 +279,8 @@ public class WxCardPayController extends BaseController { | |||||
| record.setRemark("操作于["+payWay.getMessage()+"("+payWay.getCode()+")]"); | record.setRemark("操作于["+payWay.getMessage()+"("+payWay.getCode()+")]"); | ||||
| Integer couponNumber = null; | Integer couponNumber = null; | ||||
| if (reduceStock) { | |||||
| couponNumber = 1; | |||||
| } | |||||
| try { | try { | ||||
| return wxCardSpendService.createCardSpend(record, order, couponMerchant,couponNumber,payWay); | |||||
| return wxCardSpendService.createCardSpend(record, order, couponMerchant,payWay); | |||||
| } catch (MallinkException e) { | } catch (MallinkException e) { | ||||
| logger.error("card spend error, req 2: " + record.toString() + ", e:" + e.getMessage()); | logger.error("card spend error, req 2: " + record.toString() + ", e:" + e.getMessage()); | ||||
| return new ResultData(e.getErrorCode(), e.getMessage()); | return new ResultData(e.getErrorCode(), e.getMessage()); | ||||
| @@ -188,7 +188,7 @@ public class WxCardPayController extends BaseController { | |||||
| record.setRemark("操作于["+payWay.getMessage()+"("+payWay.getCode()+")]"); | record.setRemark("操作于["+payWay.getMessage()+"("+payWay.getCode()+")]"); | ||||
| try { | try { | ||||
| return wxCardSpendService.createCardSpend(record, order, couponMerchant,null,payWay); | |||||
| return wxCardSpendService.createCardSpend(record, order, couponMerchant,payWay); | |||||
| } catch (MallinkException e) { | } catch (MallinkException e) { | ||||
| logger.error("card spend error, req 2: " + record.toString() + ", e:" + e.getMessage()); | logger.error("card spend error, req 2: " + record.toString() + ", e:" + e.getMessage()); | ||||
| return new ResultData(e.getErrorCode(), e.getMessage()); | return new ResultData(e.getErrorCode(), e.getMessage()); | ||||
| @@ -28,7 +28,7 @@ public interface WxCardSpendService { | |||||
| * @param order | * @param order | ||||
| * @return | * @return | ||||
| */ | */ | ||||
| ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,Integer reduceCouponNumber,EnumPayWay payWay); | |||||
| ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,EnumPayWay payWay); | |||||
| /** | /** | ||||
| * 根据实体查询分页列表 | * 根据实体查询分页列表 | ||||
| @@ -3,7 +3,9 @@ package com.iformall.service.impl; | |||||
| import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils; | ||||
| import com.github.pagehelper.PageHelper; | import com.github.pagehelper.PageHelper; | ||||
| import com.github.pagehelper.PageInfo; | import com.github.pagehelper.PageInfo; | ||||
| import com.iformall.common.ErrorCode; | |||||
| import com.iformall.common.IdWorker; | import com.iformall.common.IdWorker; | ||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.WxCUserBasicInfo; | import com.iformall.domain.po.WxCUserBasicInfo; | ||||
| import com.iformall.domain.po.WxCardInfo; | import com.iformall.domain.po.WxCardInfo; | ||||
| import com.iformall.domain.po.WxCoupon; | import com.iformall.domain.po.WxCoupon; | ||||
| @@ -14,11 +16,14 @@ import com.iformall.domain.po.base.TenantEntity; | |||||
| import com.iformall.domain.vo.WxCardVo; | import com.iformall.domain.vo.WxCardVo; | ||||
| import com.iformall.domain.vo.WxCouponOrderBVo; | import com.iformall.domain.vo.WxCouponOrderBVo; | ||||
| import com.iformall.domain.vo.WxCouponPasswordVo; | import com.iformall.domain.vo.WxCouponPasswordVo; | ||||
| import com.iformall.enums.EnumCacheKey; | |||||
| import com.iformall.enums.EnumCardInfoStatus; | |||||
| import com.iformall.enums.EnumCardInfoType; | import com.iformall.enums.EnumCardInfoType; | ||||
| import com.iformall.enums.EnumCouponPasswordStatus; | import com.iformall.enums.EnumCouponPasswordStatus; | ||||
| import com.iformall.enums.EnumCouponPasswordSupport; | import com.iformall.enums.EnumCouponPasswordSupport; | ||||
| import com.iformall.enums.EnumCouponType; | import com.iformall.enums.EnumCouponType; | ||||
| import com.iformall.enums.EnumYesOrNo; | import com.iformall.enums.EnumYesOrNo; | ||||
| import com.iformall.exception.MallinkException; | |||||
| import com.iformall.mapper.WxCardInfoMapper; | import com.iformall.mapper.WxCardInfoMapper; | ||||
| import com.iformall.mapper.WxCouponChannelMapper; | import com.iformall.mapper.WxCouponChannelMapper; | ||||
| import com.iformall.mapper.WxCouponMapper; | import com.iformall.mapper.WxCouponMapper; | ||||
| @@ -27,6 +32,7 @@ import com.iformall.mapper.WxCouponPasswordMapper; | |||||
| import com.iformall.service.ExcelService; | import com.iformall.service.ExcelService; | ||||
| import com.iformall.service.WxCUserBasicInfoService; | import com.iformall.service.WxCUserBasicInfoService; | ||||
| import com.iformall.service.WxCardInfoService; | import com.iformall.service.WxCardInfoService; | ||||
| import com.iformall.service.WxCouponService; | |||||
| import com.iformall.utils.Constant; | import com.iformall.utils.Constant; | ||||
| import com.iformall.utils.RedisLock; | import com.iformall.utils.RedisLock; | ||||
| @@ -59,9 +65,6 @@ public class WxCardInfoServiceImpl implements WxCardInfoService { | |||||
| @Autowired | @Autowired | ||||
| WxCouponChannelMapper wxCouponChannelMapper; | WxCouponChannelMapper wxCouponChannelMapper; | ||||
| @Autowired | |||||
| RedisLock redisLock; | |||||
| @Autowired | @Autowired | ||||
| WxCouponPasswordMapper couponPasswordMapper; | WxCouponPasswordMapper couponPasswordMapper; | ||||
| @@ -75,6 +78,13 @@ public class WxCardInfoServiceImpl implements WxCardInfoService { | |||||
| @Autowired | @Autowired | ||||
| WxCouponOrderMapper wxCouponOrderMapper; | WxCouponOrderMapper wxCouponOrderMapper; | ||||
| @Lazy | |||||
| @Autowired | |||||
| WxCouponService wxCouponService; | |||||
| @Autowired | |||||
| RedisLock redisLock; | |||||
| @Override | @Override | ||||
| @@ -302,6 +312,7 @@ public class WxCardInfoServiceImpl implements WxCardInfoService { | |||||
| cardInfo.setRemainingShareFeeAmount(0); | cardInfo.setRemainingShareFeeAmount(0); | ||||
| cardInfo.setRateAmount(0); | cardInfo.setRateAmount(0); | ||||
| cardInfo.setType(EnumCardInfoType.CARD.getCode()); | cardInfo.setType(EnumCardInfoType.CARD.getCode()); | ||||
| cardInfo.setStatus(EnumCardInfoStatus.NORMAL.getCode()); | |||||
| if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { | if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { | ||||
| WxCouponPassword updateCPwd = new WxCouponPassword(); | WxCouponPassword updateCPwd = new WxCouponPassword(); | ||||
| updateCPwd.setId(couponPassword.getId()); | updateCPwd.setId(couponPassword.getId()); | ||||
| @@ -318,6 +329,14 @@ public class WxCardInfoServiceImpl implements WxCardInfoService { | |||||
| cardInfo.setUpdateDate(new Date()); | cardInfo.setUpdateDate(new Date()); | ||||
| cardInfo.setSupportTransfer(coupon.getSupportTransfer()); | cardInfo.setSupportTransfer(coupon.getSupportTransfer()); | ||||
| wxCardInfoMapper.insert(cardInfo); | wxCardInfoMapper.insert(cardInfo); | ||||
| //扣减库存 | |||||
| wxCouponService.reduceRemainInventory(coupon,coupon.getId(),1); | |||||
| long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); | |||||
| if (stock < 0 ) { | |||||
| throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(),"库存不足"); | |||||
| } | |||||
| } | } | ||||
| redisLock.unlock("cardInfoLockSet_"+couponPassword.getId(), timeStr); | redisLock.unlock("cardInfoLockSet_"+couponPassword.getId(), timeStr); | ||||
| } | } | ||||
| @@ -93,13 +93,6 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| @Autowired | @Autowired | ||||
| WxCouponChannelMapper wxCouponChannelMapper; | WxCouponChannelMapper wxCouponChannelMapper; | ||||
| @Lazy | |||||
| @Autowired | |||||
| WxCouponService wxCouponService; | |||||
| @Autowired | |||||
| RedisLock redisLock; | |||||
| @Override | @Override | ||||
| public WxCouponMerchant checkMerchantInCoupon(WxCardInfo cardInfo, Long merchantId) { | public WxCouponMerchant checkMerchantInCoupon(WxCardInfo cardInfo, Long merchantId) { | ||||
| WxCouponMerchant couponMerchant = null; | WxCouponMerchant couponMerchant = null; | ||||
| @@ -118,7 +111,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| @Override | @Override | ||||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | ||||
| public ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,Integer reduceCouponNumber,EnumPayWay payWay) { | |||||
| public ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant,EnumPayWay payWay) { | |||||
| Date curDate = new Date(); | Date curDate = new Date(); | ||||
| final IdWorker idWorker = IdWorker.get(); | final IdWorker idWorker = IdWorker.get(); | ||||
| // 1. get card info | // 1. get card info | ||||
| @@ -148,15 +141,6 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| if(payAccount == null){ | if(payAccount == null){ | ||||
| return new ResultData(ErrorCode.API_KEY_NOT_FOUND); | 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. 扣减计算 | // 4. 扣减计算 | ||||
| Double paymentD = 1.0 * cardInfo.getSaleAmount() * record.getDeductionAmount() / cardInfo.getAmount(); | Double paymentD = 1.0 * cardInfo.getSaleAmount() * record.getDeductionAmount() / cardInfo.getAmount(); | ||||