|
|
|
@@ -1,8 +1,8 @@ |
|
|
|
package com.iformall.service.impl; |
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSON; |
|
|
|
import com.alibaba.fastjson.JSONArray; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
import com.github.pagehelper.PageHelper; |
|
|
|
@@ -392,7 +392,11 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) |
|
|
|
public WxCouponOrder verify(WxCouponOrder couponOrder, WxMerchantBUser bUser) { |
|
|
|
public WxCouponOrder verify(WxCouponOrder couponOrder, WxMerchantBUser bUser, EnumCouponVerifyType couponVerifyType) { |
|
|
|
if(EnumCouponVerifyType.VERIFY_B.equals(couponVerifyType) && bUser == null){ |
|
|
|
logger.error("B端核销未传入门店"); |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_ERROR); |
|
|
|
} |
|
|
|
|
|
|
|
// 1. 获取券信息 |
|
|
|
WxCoupon wxCoupon = wxCouponMapper.selectById(couponOrder.getCouponId(),couponOrder.getTenantId()); |
|
|
|
@@ -423,45 +427,82 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
} |
|
|
|
|
|
|
|
// 2. 检查适用门店 |
|
|
|
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); |
|
|
|
wxCouponMerchant.setProductId(wxCoupon.getId()); |
|
|
|
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); |
|
|
|
List<WxCouponMerchant> couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant); |
|
|
|
if (!couponMerchantList.stream().anyMatch(cm -> cm.getMerchantId().equals(bUser.getMerchantId()))) { |
|
|
|
logger.error("券: coupon-" + wxCoupon.getId() + "核销: couponMerchantId-" + bUser.getMerchantId()); |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
|
|
|
|
//如果开启了分账,就必须要配置分账账号 |
|
|
|
WxAppinfo appInfo = getAppinfo(couponOrder,couponOrder.getPayVendor()); |
|
|
|
WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); |
|
|
|
WxProfitSharingReceiver psReceiverQ = new WxProfitSharingReceiver(); |
|
|
|
psReceiverQ.updateTenantInfo(payAccount); |
|
|
|
psReceiverQ.setMerchantId(bUser.getMerchantId()); |
|
|
|
psReceiverQ.setSharingType(payServiceFactory.getPayShareAdapterService(couponOrder.getPayVendor()).getProfitSharingType()); |
|
|
|
psReceiverQ.setStatus(EnumProfitSharingReceiverStatus.PROFIT_SHARING_RECEIVER_STATUS_VALID.getCode()); |
|
|
|
List<WxProfitSharingReceiver> psReceiverList = wxProfitSharingReceiverMapper.findList(psReceiverQ); |
|
|
|
if (null == payAccount.getShare()) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该租户payAccount未设置分账."); |
|
|
|
} |
|
|
|
if (EnumPayShare.YES.getCode().intValue() == payAccount.getShare().intValue()) { |
|
|
|
if (null == psReceiverList || psReceiverList.size() == 0) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户未设置分账账号."); |
|
|
|
}else { |
|
|
|
for (WxProfitSharingReceiver receiver:psReceiverList) { |
|
|
|
if (EnumProfitSharingReceiverType.PROFIT_SHARING_RECEIVER_PERSONAL_WECHATID.getCode().intValue() |
|
|
|
== receiver.getReceiverType().intValue()) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户收款账号存在个人微信号方式,微信已停止支持,请重新设置."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
Long merchantId = null; |
|
|
|
if(EnumCouponType.COUPON_DISTRIBUTION.getCode().equals(wxCoupon.getType())){ |
|
|
|
//可配送商品 |
|
|
|
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); |
|
|
|
wxCouponMerchant.setProductId(wxCoupon.getId()); |
|
|
|
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); |
|
|
|
WxCouponMerchant cm = null; |
|
|
|
try{ |
|
|
|
cm = wxCouponMerchantMapper.selectOne(new QueryWrapper<>(wxCouponMerchant)); |
|
|
|
}catch (Exception e){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
if(cm == null){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
if(EnumCouponVerifyType.VERIFY_B.equals(couponVerifyType) && !cm.getId().equals(bUser.getMerchantId())){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
merchantId = cm.getId(); |
|
|
|
}else if(EnumCouponType.COUPON_GIFT.getCode().equals(wxCoupon.getType())){ |
|
|
|
if (StringUtils.isBlank(wxCoupon.getGiftList())){ |
|
|
|
logger.error("券包: coupon-" + wxCoupon.getId() + "数据异常" + "couponOrder-" + couponOrder.getId()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_DATE_ERROR); |
|
|
|
} |
|
|
|
if(!EnumCouponVerifyType.VERIFY_AUTO.equals(couponVerifyType)){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT); |
|
|
|
} |
|
|
|
}else{ |
|
|
|
if(!EnumCouponVerifyType.VERIFY_B.equals(couponVerifyType)){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT); |
|
|
|
} |
|
|
|
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); |
|
|
|
wxCouponMerchant.setProductId(wxCoupon.getId()); |
|
|
|
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); |
|
|
|
List<WxCouponMerchant> couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant); |
|
|
|
if (!couponMerchantList.stream().anyMatch(cm -> cm.getMerchantId().equals(bUser.getMerchantId()))) { |
|
|
|
logger.error("券: coupon-" + wxCoupon.getId() + "核销: couponMerchantId-" + bUser.getMerchantId()); |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
merchantId = bUser.getId(); |
|
|
|
} |
|
|
|
|
|
|
|
if(merchantId != null){ |
|
|
|
//如果开启了分账,就必须要配置分账账号 |
|
|
|
WxAppinfo appInfo = getAppinfo(couponOrder,couponOrder.getPayVendor()); |
|
|
|
WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); |
|
|
|
WxProfitSharingReceiver psReceiverQ = new WxProfitSharingReceiver(); |
|
|
|
psReceiverQ.updateTenantInfo(payAccount); |
|
|
|
psReceiverQ.setMerchantId(merchantId); |
|
|
|
psReceiverQ.setSharingType(payServiceFactory.getPayShareAdapterService(couponOrder.getPayVendor()).getProfitSharingType()); |
|
|
|
psReceiverQ.setStatus(EnumProfitSharingReceiverStatus.PROFIT_SHARING_RECEIVER_STATUS_VALID.getCode()); |
|
|
|
List<WxProfitSharingReceiver> psReceiverList = wxProfitSharingReceiverMapper.findList(psReceiverQ); |
|
|
|
if (null == payAccount.getShare()) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该租户payAccount未设置分账."); |
|
|
|
} |
|
|
|
if (EnumPayShare.YES.getCode().intValue() == payAccount.getShare().intValue()) { |
|
|
|
if (null == psReceiverList || psReceiverList.size() == 0) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户未设置分账账号."); |
|
|
|
}else { |
|
|
|
for (WxProfitSharingReceiver receiver:psReceiverList) { |
|
|
|
if (EnumProfitSharingReceiverType.PROFIT_SHARING_RECEIVER_PERSONAL_WECHATID.getCode().intValue() |
|
|
|
== receiver.getReceiverType().intValue()) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户收款账号存在个人微信号方式,微信已停止支持,请重新设置."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int num = 0; |
|
|
|
try { |
|
|
|
couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销 |
|
|
|
couponOrder.setBUserId(bUser.getId()); |
|
|
|
couponOrder.setVerifyType(EnumCouponVerifyType.VERIFY_B.getCode()); |
|
|
|
if(StringUtils.isNotBlank(couponOrder.getVerifyRemark())){ |
|
|
|
couponOrder.setBUserId(bUser==null?0l:bUser.getId()); |
|
|
|
couponOrder.setVerifyType(couponVerifyType.getCode()); |
|
|
|
if(EnumCouponVerifyType.VERIFY_B.equals(couponVerifyType) |
|
|
|
&& StringUtils.isNotBlank(couponOrder.getVerifyRemark())){ |
|
|
|
if(couponOrder.getVerifyRemark().equals(EnumCouponVerifyType.VERIFY_B_11.getCode().toString())){ |
|
|
|
couponOrder.setVerifyRemark(EnumCouponVerifyType.VERIFY_B_11.getMessage()); |
|
|
|
}else if(couponOrder.getVerifyRemark().equals(EnumCouponVerifyType.VERIFY_B_12.getCode().toString())){ |
|
|
|
@@ -483,100 +524,24 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
logger.error("核销异常:updatete num " + num); |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); |
|
|
|
} |
|
|
|
doAfterVerify(couponOrder, bUser, wxCoupon); |
|
|
|
return couponOrder; |
|
|
|
} |
|
|
|
@Override |
|
|
|
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) |
|
|
|
public WxCouponOrder verify(WxCouponOrder couponOrder) { |
|
|
|
|
|
|
|
// 1. 获取券信息 |
|
|
|
WxCoupon wxCoupon = wxCouponMapper.selectById(couponOrder.getCouponId(),couponOrder.getTenantId()); |
|
|
|
if (wxCoupon == null) { |
|
|
|
logger.error("券: coupon-" + wxCoupon.getId() + "不存在" + "couponOrder-" + couponOrder.getId()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); |
|
|
|
} |
|
|
|
// 3. 券包状态检查 |
|
|
|
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()) { |
|
|
|
logger.error("已过期: couponOrder-" + couponOrder.getId()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); |
|
|
|
} |
|
|
|
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()) { |
|
|
|
logger.error("已退款: couponOrder-" + couponOrder.getId()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); |
|
|
|
} |
|
|
|
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()) { |
|
|
|
logger.error("已经核销过的券: couponOrder-" + couponOrder.getId()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); |
|
|
|
} |
|
|
|
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.POS_PRE_VERIFY.getCode()) { |
|
|
|
logger.error("券已被预核销: couponOrder-" + couponOrder.getId()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_PRE_VERIFY); |
|
|
|
} |
|
|
|
if(!EnumCouponType.COUPON_DISTRIBUTION.getCode().equals(wxCoupon.getType())){ |
|
|
|
logger.error("券类型不支持: couponOrder-" + couponOrder.getId() +"类型:" + wxCoupon.getType()); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_TYPE_NOT_SUPPORTED); |
|
|
|
} |
|
|
|
|
|
|
|
// 2. 检查适用门店(自主核销有且只有一个门店) |
|
|
|
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); |
|
|
|
wxCouponMerchant.setProductId(wxCoupon.getId()); |
|
|
|
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); |
|
|
|
WxCouponMerchant cm = null; |
|
|
|
try{ |
|
|
|
cm = wxCouponMerchantMapper.selectOne(new QueryWrapper<>(wxCouponMerchant)); |
|
|
|
}catch (Exception e){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
if(cm == null){ |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); |
|
|
|
} |
|
|
|
|
|
|
|
//如果开启了分账,就必须要配置分账账号 |
|
|
|
WxAppinfo appInfo = getAppinfo(couponOrder,couponOrder.getPayVendor()); |
|
|
|
WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId()); |
|
|
|
WxProfitSharingReceiver psReceiverQ = new WxProfitSharingReceiver(); |
|
|
|
psReceiverQ.updateTenantInfo(payAccount); |
|
|
|
psReceiverQ.setMerchantId(cm.getMerchantId()); |
|
|
|
psReceiverQ.setSharingType(payServiceFactory.getPayShareAdapterService(couponOrder.getPayVendor()).getProfitSharingType()); |
|
|
|
psReceiverQ.setStatus(EnumProfitSharingReceiverStatus.PROFIT_SHARING_RECEIVER_STATUS_VALID.getCode()); |
|
|
|
List<WxProfitSharingReceiver> psReceiverList = wxProfitSharingReceiverMapper.findList(psReceiverQ); |
|
|
|
if (null == payAccount.getShare()) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该租户payAccount未设置分账."); |
|
|
|
} |
|
|
|
if (EnumPayShare.YES.getCode().intValue() == payAccount.getShare().intValue()) { |
|
|
|
if (null == psReceiverList || psReceiverList.size() == 0) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户未设置分账账号."); |
|
|
|
}else { |
|
|
|
for (WxProfitSharingReceiver receiver:psReceiverList) { |
|
|
|
if (EnumProfitSharingReceiverType.PROFIT_SHARING_RECEIVER_PERSONAL_WECHATID.getCode().intValue() |
|
|
|
== receiver.getReceiverType().intValue()) { |
|
|
|
throw new MallinkException(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID.getCode(),"该商户收款账号存在个人微信号方式,微信已停止支持,请重新设置."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
int num = 0; |
|
|
|
try { |
|
|
|
couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销 |
|
|
|
couponOrder.setVerifyType(EnumCouponVerifyType.VERIFY_C.getCode()); |
|
|
|
if(EnumOrderShopingType.SELF_MENTION.getCode().equals(couponOrder.getShippingType())){ |
|
|
|
couponOrder.setShippingStatus(EnumOrderShopingStatus.ALREADY_SELF_MENTION.getCode()); |
|
|
|
}else if(EnumOrderShopingType.DISTRIBUTION.getCode().equals(couponOrder.getShippingType())){ |
|
|
|
couponOrder.setShippingStatus(EnumOrderShopingStatus.ALREADY_DISTRIBUTION.getCode()); |
|
|
|
if(EnumCouponType.COUPON_GIFT.getCode().equals(wxCoupon.getType())){ |
|
|
|
try { |
|
|
|
List<Long> longs = JSON.parseArray(wxCoupon.getGiftList(), Long.class); |
|
|
|
//发券包子券 |
|
|
|
wxOrderService.sendSubCouponToUser(couponOrder,longs); |
|
|
|
} catch (MallinkException e) { |
|
|
|
throw e; |
|
|
|
} catch (Exception e){ |
|
|
|
throw new MallinkException(ErrorCode.COUPON_ORDER_SEND_ERROR.getCode(), couponOrder.getCouponName() + ErrorCode.COUPON_ORDER_SEND_ERROR.getMessage() ); |
|
|
|
} |
|
|
|
couponOrder.setUpdateDate(new Date()); |
|
|
|
num = wxCouponOrderMapper.updateVerifyCouponOrder(couponOrder); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("db failed: couponOrder-" + couponOrder.getId() + ", e:" + e.getMessage()); |
|
|
|
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); |
|
|
|
} |
|
|
|
if (num != 1) { |
|
|
|
logger.error("核销异常:updatete num " + num); |
|
|
|
throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); |
|
|
|
|
|
|
|
if(EnumCouponVerifyType.VERIFY_B.equals(couponVerifyType)){ |
|
|
|
doAfterVerify(couponOrder, bUser, wxCoupon); |
|
|
|
}else{ |
|
|
|
doAfterVerify(couponOrder, wxCoupon, merchantId); |
|
|
|
} |
|
|
|
doAfterVerify(couponOrder, wxCoupon, cm.getMerchantId()); |
|
|
|
this.sendInsideCouponVerifyMsg(couponOrder, couponOrder.getId(), cm.getMerchantId()); |
|
|
|
couponOrder.setMerchantId(merchantId); |
|
|
|
return couponOrder; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -689,7 +654,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
creditHistory.setSpend(couponOrder.getCouponPrice()); |
|
|
|
//如果券与商户一对一 则直接将消费商户更新为此商户 若一对多 则消费商户显示多商户 |
|
|
|
creditHistory.setMerchantId(merchantId); |
|
|
|
creditHistory.setChangePurpose("用户自主核销增加积分:券名称["+wxCoupon.getTitle()+"("+creditHistory.getSpendStr()+"元)] "); |
|
|
|
creditHistory.setChangePurpose("增加积分:券名称["+wxCoupon.getTitle()+"("+creditHistory.getSpendStr()+"元)] "); |
|
|
|
wxCreditHistoryService.saveOrUpdate(creditHistory,couponOrder.getTenantId()); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("积分值:" + e.getMessage()); |
|
|
|
@@ -924,6 +889,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
// 补贴已入库 |
|
|
|
return; |
|
|
|
} |
|
|
|
subsidyNum = subsidyNum * couponOrder.getCouponNumber(); |
|
|
|
// 新补贴入库 |
|
|
|
int iSubChargeFee = OrderHelper.getMallCharge(subsidyNum, payAccount); |
|
|
|
Integer realSubsidyFee = subsidyNum - iSubChargeFee; |
|
|
|
|