|
|
|
@@ -475,12 +475,103 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
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); |
|
|
|
} |
|
|
|
|
|
|
|
// 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); |
|
|
|
} |
|
|
|
|
|
|
|
// 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); |
|
|
|
} |
|
|
|
|
|
|
|
//如果开启了分账,就必须要配置分账账号 |
|
|
|
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()); |
|
|
|
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); |
|
|
|
} |
|
|
|
doAfterVerify(couponOrder, wxCoupon, cm.getMerchantId()); |
|
|
|
this.sendInsideCouponVerifyMsg(couponOrder, couponOrder.getId(), cm.getMerchantId()); |
|
|
|
return couponOrder; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* B端核销卷增加成长值,积分 |
|
|
|
* @param couponOrder |
|
|
|
* @param bUser |
|
|
|
* @param wxCoupon |
|
|
|
*/ |
|
|
|
private void doAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser, WxCoupon wxCoupon) { |
|
|
|
// 成长值 |
|
|
|
try { |
|
|
|
WxOrder order = wxOrderMapper.selectById(couponOrder.getOrderId(),couponOrder.getTenantId()); |
|
|
|
wxScoreRulesService.addScore2(bUser,EnumScoreType.CONSUMPTION, order, wxCoupon.getBusiness()); |
|
|
|
wxScoreRulesService.addScore2(couponOrder,EnumScoreType.CONSUMPTION, order, wxCoupon.getBusiness()); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("成长值:" + e.getMessage()); |
|
|
|
} |
|
|
|
@@ -511,6 +602,12 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 核销停车劵增加成长值,积分 |
|
|
|
* @param couponOrder |
|
|
|
* @param wxCoupon |
|
|
|
* @param cuUser |
|
|
|
*/ |
|
|
|
private void doAfterVerify(WxCouponOrder couponOrder, WxCoupon wxCoupon, WxCUserBasicInfo cuUser) { |
|
|
|
// 成长值 |
|
|
|
try { |
|
|
|
@@ -542,18 +639,56 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 自主核销商品加成长值 积分 |
|
|
|
* @param couponOrder |
|
|
|
* @param wxCoupon |
|
|
|
*/ |
|
|
|
private void doAfterVerify(WxCouponOrder couponOrder, WxCoupon wxCoupon,Long merchantId) { |
|
|
|
// 成长值 |
|
|
|
try { |
|
|
|
WxOrder order = wxOrderMapper.selectById(couponOrder.getOrderId(),couponOrder.getTenantId()); |
|
|
|
wxScoreRulesService.addScore2(couponOrder,EnumScoreType.CONSUMPTION, order, wxCoupon.getBusiness()); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("成长值:" + e.getMessage()); |
|
|
|
} |
|
|
|
|
|
|
|
// 积分 |
|
|
|
try { |
|
|
|
//-------此处为【现金支付】记录增加积分操作------- |
|
|
|
WxCreditHistory creditHistory = new WxCreditHistory(); |
|
|
|
creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); |
|
|
|
creditHistory.setOperatorId(couponOrder.getCUserId()); |
|
|
|
creditHistory.setCUserId(couponOrder.getCUserId()); |
|
|
|
creditHistory.setCreateDate(new Date()); |
|
|
|
// creditHistory.updateTenantInfo(couponOrder); |
|
|
|
creditHistory.setTenantId(couponOrder.getFinalTenantId()); |
|
|
|
creditHistory.setFinalTenantId(couponOrder.getFinalTenantId()); |
|
|
|
creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); |
|
|
|
creditHistory.setCouponId(wxCoupon.getId()); |
|
|
|
creditHistory.setBusinessId(wxCoupon.getBusiness()); |
|
|
|
creditHistory.setSpend(couponOrder.getCouponPrice()); |
|
|
|
//如果券与商户一对一 则直接将消费商户更新为此商户 若一对多 则消费商户显示多商户 |
|
|
|
creditHistory.setMerchantId(merchantId); |
|
|
|
creditHistory.setChangePurpose("用户自主核销增加积分:券名称["+wxCoupon.getTitle()+"("+creditHistory.getSpendStr()+"元)] "); |
|
|
|
wxCreditHistoryService.saveOrUpdate(creditHistory,couponOrder.getTenantId()); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("积分值:" + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendInsideCouponVerifyMsg(TenantEntity tenantEntity, Long couponOrderId, Long buUserId) { |
|
|
|
public void sendInsideCouponVerifyMsg(TenantEntity tenantEntity, Long couponOrderId, Long merchantId) { |
|
|
|
FmInsideCouponVerifyMsg verifyMsg = new FmInsideCouponVerifyMsg(); |
|
|
|
verifyMsg.setMsgType(EnumMsgRecordType.INSIDE_COUPON_VERIFY.getCode()); |
|
|
|
verifyMsg.updateTenantInfo(tenantEntity); |
|
|
|
verifyMsg.setCouponOrderId(couponOrderId); |
|
|
|
verifyMsg.setBUserId(buUserId); |
|
|
|
verifyMsg.setMerchantId(merchantId); |
|
|
|
mqBaseProducer.sendMessage(verifyMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser) { |
|
|
|
public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchant merchant) { |
|
|
|
|
|
|
|
WxPayAccount wxPayAccountQuery = new WxPayAccount(); |
|
|
|
wxPayAccountQuery.updateTenantInfo(couponOrder); |
|
|
|
@@ -562,7 +697,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
try { |
|
|
|
// 核销记账,并且往账户里面记帐 |
|
|
|
if (couponOrder.getCouponPrice() > 0) { |
|
|
|
recordAfterVerified(couponOrder, bUser.getMerchantId()); |
|
|
|
recordAfterVerified(couponOrder, merchant.getId()); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("核销记账失败"+e.getMessage(),e); |
|
|
|
@@ -572,14 +707,14 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
if (EnumComposeOrder.isSingle(couponOrder.getComposeOrderType())) { |
|
|
|
try { |
|
|
|
// 核销分账 |
|
|
|
shareAfterVerify(couponOrder, bUser.getMerchantId(),couponOrder.getPayVendor(),false); |
|
|
|
shareAfterVerify(couponOrder, merchant.getId(),couponOrder.getPayVendor(),false); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("核销记账失败"+e.getMessage(),e); |
|
|
|
} |
|
|
|
}else { |
|
|
|
try { |
|
|
|
// 核销分账 |
|
|
|
shareAfterVerify(couponOrder, bUser.getMerchantId(),couponOrder.getPayVendor(),true); |
|
|
|
shareAfterVerify(couponOrder, merchant.getId(),couponOrder.getPayVendor(),true); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("核销记账失败"+e.getMessage(),e); |
|
|
|
} |
|
|
|
@@ -588,7 +723,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
|
|
|
|
try { |
|
|
|
// 核销补贴 |
|
|
|
subsidyAfterVerify(couponOrder, bUser.getMerchantId()); |
|
|
|
subsidyAfterVerify(couponOrder, merchant.getId()); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("核销记账失败"+e.getMessage(),e); |
|
|
|
} |
|
|
|
@@ -597,14 +732,14 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
|
|
|
|
// 核销发券 |
|
|
|
try { |
|
|
|
bSentCoupon = sendCouponAfterVerify(couponOrder, bUser); |
|
|
|
bSentCoupon = sendCouponAfterVerify(couponOrder); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("核销记账失败"+e.getMessage(),e); |
|
|
|
} |
|
|
|
|
|
|
|
// 核销发模板消息 |
|
|
|
try { |
|
|
|
sendVerifyMsg(couponOrder, bUser, bSentCoupon); |
|
|
|
sendVerifyMsg(couponOrder, merchant, bSentCoupon); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("核销发送消息发生错误:" + e.getMessage(),e); |
|
|
|
} |
|
|
|
@@ -800,7 +935,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean sendCouponAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser) { |
|
|
|
public boolean sendCouponAfterVerify(WxCouponOrder couponOrder) { |
|
|
|
// 核销发券 |
|
|
|
WxOrder wxOrder = wxOrderMapper.selectById(couponOrder.getOrderId(),couponOrder.getTenantId()); |
|
|
|
if (wxOrder != null) { |
|
|
|
@@ -833,7 +968,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
* @param couponOrder, bUser |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public void sendVerifyMsg(WxCouponOrder couponOrder, WxMerchantBUser bUser, boolean hadSentCoupon) { |
|
|
|
public void sendVerifyMsg(WxCouponOrder couponOrder, WxMerchant merchant, boolean hadSentCoupon) { |
|
|
|
// 1. get order info |
|
|
|
WxOrder order = wxOrderMapper.selectById(couponOrder.getOrderId(),couponOrder.getTenantId()); |
|
|
|
if (order == null) { |
|
|
|
@@ -846,18 +981,18 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { |
|
|
|
logger.error("找不到券信息"); |
|
|
|
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); |
|
|
|
} |
|
|
|
// 3. merchant info |
|
|
|
WxMerchant merchant = wxMerchantMapper.selectById(bUser.getMerchantId()); |
|
|
|
if (merchant == null) { |
|
|
|
logger.error("找不到商户信息"); |
|
|
|
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); |
|
|
|
} |
|
|
|
// // 3. merchant info |
|
|
|
// WxMerchant merchant = wxMerchantMapper.selectById(merchant.getId()); |
|
|
|
// if (merchant == null) { |
|
|
|
// logger.error("找不到商户信息"); |
|
|
|
// throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); |
|
|
|
// } |
|
|
|
|
|
|
|
// 4. get user info |
|
|
|
WxCUser user = null; |
|
|
|
|
|
|
|
WxCUser wcuQ = new WxCUser(); |
|
|
|
wcuQ.updateTenantInfo(bUser); |
|
|
|
wcuQ.updateTenantInfo(couponOrder); |
|
|
|
wcuQ.setUserId(couponOrder.getCUserId()); |
|
|
|
List<WxCUser> list = wxCUserMapper.findList(wcuQ); |
|
|
|
if(list != null && list.size() > 0){ |
|
|
|
|