diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantSubsidy.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantSubsidy.java index 96b7ce338..f9c923b33 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantSubsidy.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantSubsidy.java @@ -54,17 +54,15 @@ public class WxMerchantSubsidy extends BaseEntity { private Integer receiverPayment; @TableField(exist = false) - @Excel(name="本次消费(元)",width = 20,orderNum = "5") @io.swagger.annotations.ApiModelProperty(value="订单金额",name="orderPaymentStr") private String orderPaymentStr; @TableField(exist = false) - @Excel(name="商户应收(元)",width = 20,orderNum = "6") @io.swagger.annotations.ApiModelProperty(value="接收金额(包含通道费)",name="receiverPaymentStr") private String receiverPaymentStr; @TableField(exist = false) - @Excel(name="补贴(元)",width = 20,orderNum = "7") + @Excel(name = "承付金额(元)", width = 20, orderNum = "6") @io.swagger.annotations.ApiModelProperty(value="补贴额(包含通道费)",name="subsidyStr") private String subsidyStr; @@ -76,11 +74,11 @@ public class WxMerchantSubsidy extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="线上补贴额/实收补贴额(通道费扣除)",name="realSubsidy") private Integer realSubsidy; - @Excel(name="补贴状态",width = 20,orderNum = "8",replace = { "未补贴_0", "已自动补贴_1","已手工补贴_2"}) + @Excel(name = "结算状态", width = 20, orderNum = "7", replace = {"未结算_0", "已结算_1", "已结算_2"}) @io.swagger.annotations.ApiModelProperty(value="状态(0:未补贴, 1:已补贴, 2:已手工补贴)",name="status") private Integer status; - @Excel(name="交易时间",width = 20,orderNum = "4",format="yyyy-MM-dd HH:mm") + @Excel(name = "交易时间", width = 20, orderNum = "5", format = "yyyy-MM-dd HH:mm") @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") private Date createDate; @@ -102,8 +100,9 @@ public class WxMerchantSubsidy extends BaseEntity { @TableField(exist = false) protected String statusStr; - @io.swagger.annotations.ApiModelProperty(value="是否冻结",name="freeze") - private Integer freeze; + @Excel(name = "冻结状态", width = 20, orderNum = "8", replace = {"冻结中_1", "正常_0"}) + @io.swagger.annotations.ApiModelProperty(value = "是否冻结", name = "freeze") + private Integer freeze; public String getOrderPaymentStr() { @@ -127,9 +126,11 @@ public class WxMerchantSubsidy extends BaseEntity { return subsidyStr; } - @io.swagger.annotations.ApiModelProperty(value = "结算类型1微信结算2自主结算", name = "type") + @Excel(name = "结算类型", width = 20, orderNum = "4", replace = {"自主结算_1", "微信结算_2"}) + @io.swagger.annotations.ApiModelProperty(value = "结算类型1自主结算2微信结算", name = "type") private Integer type; - @io.swagger.annotations.ApiModelProperty(value = "结算来源0补贴1卡消费2券核销3砍价核销4拼团核销5收银分账", name = "source") - private Integer source; + @Excel(name = "结算来源", width = 20, orderNum = "3", replace = {"补贴_0", "卡消费_1", "券核销_2", "砍价核销_3", "拼团核销_4", , "收银分账_5"}) + @io.swagger.annotations.ApiModelProperty(value = "结算来源0补贴1卡消费2券核销3砍价核销4拼团核销5收银分账", name = "source") + private Integer source; } diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxMerchantSubsidyVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxMerchantSubsidyVo.java index 5360473e9..49bd733a0 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxMerchantSubsidyVo.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxMerchantSubsidyVo.java @@ -13,7 +13,6 @@ public class WxMerchantSubsidyVo extends WxMerchantSubsidy { @io.swagger.annotations.ApiModelProperty(value="封面图",name="coverImg") private String coverImg; - @Excel(name="活动名称",width = 20,orderNum = "3") @io.swagger.annotations.ApiModelProperty(value="券名称",name="title") private String title; @io.swagger.annotations.ApiModelProperty(value="副标题",name="subTitle") 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 8efabe9e1..b24812d32 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java @@ -34,34 +34,34 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - @Autowired + @Autowired WxCardSpendMapper wxCardSpendMapper; - @Autowired + @Autowired WxCardInfoMapper wxCardInfoMapper; - @Autowired + @Autowired WxCouponMapper wxCouponMapper; - @Autowired + @Autowired WxMerchantMapper wxMerchantMapper; - @Autowired + @Autowired WxMerchantSubsidyMapper wxMerchantSubsidyMapper; - @Autowired + @Autowired WxCouponMerchantMapper wxCouponMerchantMapper; - @Autowired + @Autowired WxPayAccountMapper payAccountMapper; - @Autowired + @Autowired WxOrderMapper wxOrderMapper; - @Autowired + @Autowired WxCouponOrderMapper wxCouponOrderMapper; - @Autowired + @Autowired WxProfitSharingOrderService profitSharingOrderService; @Autowired @@ -73,7 +73,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { @Autowired WxScoreRulesService wxScoreRulesService; - @Override + @Override public WxCouponMerchant checkMerchantInCoupon(WxCardInfo cardInfo, Long merchantId) { WxCouponMerchant couponMerchant = null; WxCouponMerchant couponMerchantQ = new WxCouponMerchant(); @@ -89,12 +89,12 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { return couponMerchant; } - @Override + @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCouponMerchant couponMerchant) { - Date curDate = new Date(); - final IdWorker idWorker = IdWorker.get(); - // 1. get card info + Date curDate = new Date(); + final IdWorker idWorker = IdWorker.get(); + // 1. get card info WxCardInfo cardInfo = wxCardInfoMapper.selectById(record.getCardId()); if (cardInfo == null) { logger.error("card not found: " + record.getCardId()); @@ -129,8 +129,8 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); Integer real_payment = payment - iChargeFee; Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; - Integer remaingAmount = cardInfo.getRemainingAmount()-record.getDeductionAmount(); - if(remaingAmount.equals(0)) { + Integer remaingAmount = cardInfo.getRemainingAmount() - record.getDeductionAmount(); + if (remaingAmount.equals(0)) { // 最后一次支付时 real_payment = Math.min(real_payment, cardInfo.getRemainingShareFeeAmount()); remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; @@ -193,7 +193,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { } // 7.2 update coupon card status - if(cardInfo.getRemainingAmount().equals(0)) { + if (cardInfo.getRemainingAmount().equals(0)) { if (cardFinished(curDate, cardInfo)) { return new ResultData(ErrorCode.DB_FAIL.getCode(), "couponOrder status 更新出错!"); } @@ -202,9 +202,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { // 8. 补贴 // 补贴额 = 商城补贴总额/卡券面额 * 抵扣额(本次支付额) Double subsidyFeeD = 1.0 * record.getDeductionAmount() * coupon.getSubsidyNum() / cardInfo.getAmount(); - Integer subsidyFee = subsidyFeeD.intValue(); + Integer subsidyFee = subsidyFeeD.intValue(); logger.info("补贴额: " + subsidyFee); - if(subsidyFee > 0) { + if (cardInfo.getSaleAmount().equals(0) || subsidyFee > 0) { // 有补贴时入库 int iSubChargeFee = PayUtils.getPayRate(subsidyFee, payAccount.getRate(), false); Integer realSubsidyFee = subsidyFee - iSubChargeFee; @@ -224,13 +224,16 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_COUPON.getCode())) { // 立减领券 merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.AUTO_SUBSIDIED.getCode()); - } else if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_MCHPAY.getCode())) { + } else if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_MCHPAY.getCode())) { // 转账倒现金 } else { // 未补贴 merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.NOT_SUBSIDY.getCode()); } + merchantSubsidy.setType(EnumMerchantSubsidyType.MANUAL.getCode()); + merchantSubsidy.setSource(EnumMerchantSubsidySource.CARD.getCode()); + merchantSubsidy.setCreateDate(curDate); merchantSubsidy.setUpdateDate(curDate); try { @@ -250,10 +253,23 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { if (ErrorCode.PROFIT_SHARING_NUM_UP_LIMIT.getCode() == e.getErrorCode()) { // 分账已到20次限制,后面只记录,无法分账 logger.error("分账已到20次限制,后面只记录,无法分账"); + try { + creteMerchantSubsidy(record, curDate, idWorker, coupon, payment); + } catch (Exception ex) { + logger.error("分账已到20次限制,记录到结算表失败"); + } } else { throw new MallinkException(e.getErrorCode(), e.getMessage()); } } + } else { + if (cardInfo.getSaleAmount() > 0) { + try { + creteMerchantSubsidy(record, curDate, idWorker, coupon, payment); + } catch (Exception ex) { + logger.error("记录到结算表失败"); + } + } } // 成长值 @@ -286,8 +302,30 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { return new ResultData(record); } + public void creteMerchantSubsidy(WxCardSpend record, Date curDate, IdWorker idWorker, WxCoupon coupon, Integer payment) { + WxMerchantSubsidy merchantSubsidy = new WxMerchantSubsidy(); + merchantSubsidy.setId(idWorker.nextId()); + merchantSubsidy.setTenantId(record.getTenantId()); + merchantSubsidy.setOrderId(record.getOrderId()); + merchantSubsidy.setOrderType(EnumOrderType.PREPAIDCARD.getCode()); + merchantSubsidy.setMerchantId(record.getMerchantId()); + merchantSubsidy.setCouponOrderId(record.getCardId()); + merchantSubsidy.setCouponType(coupon.getType()); + merchantSubsidy.setOrderPayment(record.getPayment()); + merchantSubsidy.setReceiverPayment(record.getPayment()); + merchantSubsidy.setRealPayment(record.getRealPayment()); + merchantSubsidy.setSubsidy(payment); + merchantSubsidy.setRealSubsidy(payment); + merchantSubsidy.setCreateDate(curDate); + merchantSubsidy.setUpdateDate(curDate); + merchantSubsidy.setType(EnumMerchantSubsidyType.WECHAT.getCode()); + merchantSubsidy.setSource(EnumMerchantSubsidySource.CARD.getCode()); + wxMerchantSubsidyMapper.insert(merchantSubsidy); + } + /** * 卡已用完 + * * @param curDate * @param cardInfo * @return @@ -315,7 +353,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { @Override public List> sumCardSpendForMerchant(WxCardSpendVo record) { - return wxCardSpendMapper.sumCardSpendVoForMerchant(record); + return wxCardSpendMapper.sumCardSpendVoForMerchant(record); } @Override @@ -333,7 +371,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { if (record.getId() == null) { //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); final IdWorker idWorker = IdWorker.get(); - record.setId(idWorker.nextId()); + record.setId(idWorker.nextId()); wxCardSpendMapper.insert(record); } else { wxCardSpendMapper.updateById(record); @@ -344,7 +382,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { public void update(WxCardSpend record) { // 1. 检查符合条件的卡消费记录是否已支付 List cardSpends = wxCardSpendMapper.findList(record); - if (cardSpends.stream().anyMatch((cs->(!cs.getPayStatus().equals(EnumCardSpendStatus.NOT_PAY.getCode()))))){ + if (cardSpends.stream().anyMatch((cs -> (!cs.getPayStatus().equals(EnumCardSpendStatus.NOT_PAY.getCode()))))) { throw new MallinkException(ErrorCode.CARD_SPEND_IS_PAID); } // 2. 更新支付状态 @@ -363,11 +401,11 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { logger.error("微信分账: " + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), e.getMessage()); } - if(cardInfo != null) { - if (cardInfo.getRemainingAmount().equals(cardInfo.getAmount())){ + if (cardInfo != null) { + if (cardInfo.getRemainingAmount().equals(cardInfo.getAmount())) { logger.error("请用订单退款接口: "); throw new MallinkException(ErrorCode.CARD_IS_NOT_COST); - } else if(cardInfo.getRemainingAmount() > 0){ + } else if (cardInfo.getRemainingAmount() > 0) { // 卡已消费, 余额不为0 int remainShareFeeAmount = cardInfo.getRemainingShareFeeAmount(); try { @@ -409,7 +447,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) public void shareForCardPay(String tenantId, Long cardId, Long orderId, Long cardSpendId) { - // 微信已分账检查次数 + // 微信已分账检查次数 int psNum = 0; try { WxCardSpend cardSpendQ = new WxCardSpend(); @@ -457,7 +495,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { shareOrder.setTransactionId(cardInfo.getTransactionId()); shareOrder.setShareAmount(cardSpend.getRealPayment()); ResultData resultData = profitSharingOrderService.createSharingOrder(shareOrder); - if(resultData.code != Result.SUCCESS) { + if (resultData.code != Result.SUCCESS) { // 分账异常 logger.error(resultData.message); throw new MallinkException(resultData.code, resultData.message); @@ -473,7 +511,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { } - if(cardSpend.getCardRemainAmount().equals(0) + if (cardSpend.getCardRemainAmount().equals(0) || psNum == 20) { // 卡余额为0,或者卡已分账20次,发起分账完结 if (cardSpend.getCardRemainRealAmount() > 0) { @@ -492,9 +530,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { } - /** * 卡分账完结 + * * @param cardInfo * @param shareOrder */ @@ -538,9 +576,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { shareOrder.setOrderId(cardSpend.getId()); shareOrder.setPayAmount(0); shareOrder.setOrderId(cardSpend.getId()); - if(cardInfo.getRateAmount() != null) { + if (cardInfo.getRateAmount() != null) { // 分账实际金额 = 分账实际剩余金额 + 通道费差 - shareOrder.setShareAmount(cardInfo.getRemainingShareFeeAmount()+cardInfo.getRateAmount()); + shareOrder.setShareAmount(cardInfo.getRemainingShareFeeAmount() + cardInfo.getRateAmount()); } else { shareOrder.setShareAmount(cardInfo.getRemainingShareFeeAmount()); } @@ -610,7 +648,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); Integer real_payment = payment - iChargeFee; Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; - Integer remaingAmount = cardInfo.getRemainingAmount()-record.getDeductionAmount(); + Integer remaingAmount = cardInfo.getRemainingAmount() - record.getDeductionAmount(); if (remaingAmount.equals(0)) { // 最后一次支付时 real_payment = Math.min(real_payment, cardInfo.getRemainingShareFeeAmount()); @@ -691,7 +729,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); Integer real_payment = payment - iChargeFee; Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() + real_payment; - Integer remaingAmount = cardInfo.getRemainingAmount()+record.getDeductionAmount(); + Integer remaingAmount = cardInfo.getRemainingAmount() + record.getDeductionAmount(); // 5.、update card info WxCardInfo updateCardInfo = new WxCardInfo(); @@ -750,7 +788,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { logger.error("card not found: " + record.getCardId()); throw new MallinkException(ErrorCode.CARD_IS_NOT_FOUND); } - if(cardInfo.getRemainingAmount().equals(0)) { + if (cardInfo.getRemainingAmount().equals(0)) { if (cardFinished(curDate, cardInfo)) { throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "couponOrder status 更新出错!"); } @@ -778,9 +816,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { // 3. 补贴 // 补贴额 = 商城补贴总额/卡券面额 * 抵扣额(本次支付额) Double subsidyFeeD = 1.0 * record.getDeductionAmount() * coupon.getSubsidyNum() / cardInfo.getAmount(); - Integer subsidyFee = subsidyFeeD.intValue(); + Integer subsidyFee = subsidyFeeD.intValue(); logger.info("补贴额: " + subsidyFee); - if(subsidyFee > 0) { + if (subsidyFee > 0) { // 有补贴时入库 int iSubChargeFee = PayUtils.getPayRate(subsidyFee, payAccount.getRate(), false); Integer realSubsidyFee = subsidyFee - iSubChargeFee; @@ -800,7 +838,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_COUPON.getCode())) { // 立减领券 merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.AUTO_SUBSIDIED.getCode()); - } else if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_MCHPAY.getCode())) { + } else if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_MCHPAY.getCode())) { // 转账倒现金 } else { // 未补贴 @@ -822,7 +860,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { shareForCardPay(record.getTenantId(), record.getCardId(), record.getOrderId(), record.getId()); } catch (MallinkException e) { logger.error(e.getMessage()); - if(ErrorCode.PROFIT_SHARING_NUM_UP_LIMIT.getCode() == e.getErrorCode()) { + if (ErrorCode.PROFIT_SHARING_NUM_UP_LIMIT.getCode() == e.getErrorCode()) { // 分账已到20次限制,后面只记录,无法分账 logger.error("分账已到20次限制,后面只记录,无法分账"); } else { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index b3fd6dc8b..80c2fd5e5 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -200,7 +200,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { else list = wxCouponOrderMapper.findListOfOrderedByDate(dateMap); //logger.info("find " + list.size() + " coupon order from " + /startDate + " to " + new Date()); - resultMap.put("amount", list.stream().mapToInt(p->p.getCouponPrice()).sum()); + resultMap.put("amount", list.stream().mapToInt(p -> p.getCouponPrice()).sum()); resultMap.put("orderCount", list.size()); } else { if (isVerified) @@ -214,7 +214,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { @Override public PageInfo listCUserVoAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfCUser(record)); + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfCUser(record)); } @Override @@ -263,7 +263,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { @Override public ResultData listAdminAsPage(WxCouponOrderBVo wxCouponOrderBVo, Integer pageIndex, Integer pageSize) { - PageInfo pageInfo= PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfAdmin(wxCouponOrderBVo)); + PageInfo pageInfo = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfAdmin(wxCouponOrderBVo)); return new ResultData(pageInfo); } @@ -319,8 +319,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); wxCouponMerchant.setProductId(wxCoupon.getId()); wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); - List couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant); - if (!couponMerchantList.stream().anyMatch(cm->cm.getMerchantId().equals(bUser.getMerchantId()))){ + List 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); } @@ -353,7 +353,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { logger.error("db failed: couponOrder-" + couponOrder.getId() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); } - if(num != 1) { + if (num != 1) { logger.error("核销异常:updatete num " + num); throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); } @@ -402,11 +402,25 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { @Override public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser) { - try { - // 核销分账 - shareAfterVerify(couponOrder, bUser.getMerchantId()); - } catch (Exception e) { - logger.error(e.getMessage()); + + WxPayAccount wxPayAccountQuery = new WxPayAccount(); + wxPayAccountQuery.setTenantId(couponOrder.getTenantId()); + WxPayAccount wxPayAccount = wxPayAccountMapper.selectOne(new QueryWrapper<>(wxPayAccountQuery)); + if (wxPayAccount != null && wxPayAccount.getShare().equals(EnumPayShare.NO.getCode())) { + try { + // 核销记账 + recordAfterVerified(couponOrder, bUser.getMerchantId()); + } catch (Exception e) { + logger.info("核销记账失败"); + logger.error(e.getMessage()); + } + } else { + try { + // 核销分账 + shareAfterVerify(couponOrder, bUser.getMerchantId()); + } catch (Exception e) { + logger.error(e.getMessage()); + } } try { @@ -429,8 +443,43 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { try { sendVerifyMsg(couponOrder, bUser, bSentCoupon); } catch (Exception e) { - logger.error("核销发送消息发生错误:"+e.getMessage()); + logger.error("核销发送消息发生错误:" + e.getMessage()); + } + } + + public void recordAfterVerified(WxCouponOrder couponOrder, Long merchantId) { + WxCoupon wxCoupon = wxCouponMapper.selectById(couponOrder.getCouponId()); + WxMerchantSubsidy merchantSubsidy = new WxMerchantSubsidy(); + if (couponOrder.getCouponType().equals(EnumCouponType.COUPON_PRESS.getCode()) + && couponOrder.getCouponPrice().equals(wxCoupon.getSalePrice())) { + //砍价 + merchantSubsidy.setSource(EnumMerchantSubsidySource.PRESS.getCode()); + } else if (couponOrder.getCouponType().equals(EnumCouponType.COUPON_GROUP.getCode()) + && couponOrder.getCouponPrice().equals(wxCoupon.getSalePrice())) { + //拼团 + merchantSubsidy.setSource(EnumMerchantSubsidySource.GROUP.getCode()); + } else { + //券 + merchantSubsidy.setSource(EnumMerchantSubsidySource.COUPON.getCode()); } + final IdWorker idWorker = IdWorker.get(); + Date curDate = new Date(); + merchantSubsidy.setId(idWorker.nextId()); + merchantSubsidy.setTenantId(couponOrder.getTenantId()); + merchantSubsidy.setOrderId(couponOrder.getOrderId()); + merchantSubsidy.setOrderType(EnumOrderType.COUPON.getCode()); + merchantSubsidy.setMerchantId(merchantId); + merchantSubsidy.setCouponOrderId(couponOrder.getId()); + merchantSubsidy.setCouponType(couponOrder.getCouponType()); + merchantSubsidy.setOrderPayment(couponOrder.getSalePrice()); + merchantSubsidy.setReceiverPayment(couponOrder.getSalePrice()); + merchantSubsidy.setRealPayment(couponOrder.getSalePrice()); + merchantSubsidy.setSubsidy(couponOrder.getSalePrice()); + merchantSubsidy.setRealSubsidy(couponOrder.getSalePrice()); + merchantSubsidy.setType(EnumMerchantSubsidyType.WECHAT.getCode()); + merchantSubsidy.setCreateDate(curDate); + merchantSubsidy.setUpdateDate(curDate); + wxMerchantSubsidyMapper.insert(merchantSubsidy); } @Override @@ -477,8 +526,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { WxCouponMerchant couponMerchant; try { couponMerchant = wxCouponMerchantMapper.selectOne(new QueryWrapper(couponMerchantQ)); - }catch (Exception e) { - logger.error("查找所属卡券商户错误: " + "CouponId:" + couponMerchantQ.getProductId(), " merchantId:" + merchantId ); + } catch (Exception e) { + logger.error("查找所属卡券商户错误: " + "CouponId:" + couponMerchantQ.getProductId(), " merchantId:" + merchantId); throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); } @@ -491,7 +540,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { WxCoupon coupon; try { coupon = wxCouponMapper.selectById(couponOrder.getCouponId()); - }catch (Exception e) { + } catch (Exception e) { logger.error("查找卡券错误: " + "CouponId:" + couponMerchantQ.getProductId()); throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); } @@ -623,7 +672,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { } // 7. 公众号消息 - if(StringUtils.isNotBlank(user.getMpAppId()) && + if (StringUtils.isNotBlank(user.getMpAppId()) && StringUtils.isNotBlank(user.getMpOpenId()) && user.getMpSubscribe().equals(EnumUserIsSubscribe.YES.getCode())) { // 已关注公众号 @@ -640,15 +689,15 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { String formId = null; Date curDate = new Date(); Date dateAfter7Day = DateUtils.getHourTimeAfter(7, order.getCreateDate()); - if(StringUtils.isNotBlank(order.getFormId()) && curDate.before(dateAfter7Day) + if (StringUtils.isNotBlank(order.getFormId()) && curDate.before(dateAfter7Day) && !order.getFormId().equalsIgnoreCase("undefined")) { formId = order.getFormId(); } // 6. get payOrder info int formType = EnumMsgLimitType.WEAPP_FORMID.getCode(); - if(StringUtils.isBlank(order.getFormId()) || order.getFormId().equalsIgnoreCase("undefined")) { - if(order.getPayment() > 0) { + if (StringUtils.isBlank(order.getFormId()) || order.getFormId().equalsIgnoreCase("undefined")) { + if (order.getPayment() > 0) { // formId为空,获取prepayId WxPayOrder payOrder = null; WxPayOrder payOrderQ = new WxPayOrder(); @@ -675,7 +724,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { } } - if(StringUtils.isBlank(formId)) { + if (StringUtils.isBlank(formId)) { logger.error("无可用formId, 不能发小程序模板消息"); return; } @@ -688,7 +737,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { msgLimit.setTenantId(user.getTenantId()); msgLimit.setType(formType); msgLimit.setLimitId(formId); - if(wxMsgLimitService.checkIsLimit(msgLimit)) { + if (wxMsgLimitService.checkIsLimit(msgLimit)) { // 已达到限制条件,不发消息了 logger.error("已达到限制条件,不发小程序模板消息了: " + user.getId()); return; @@ -730,7 +779,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { )); try { - mqBaseProducer.sendMessage(mpAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode()); + mqBaseProducer.sendMessage(mpAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); } catch (Exception e) { logger.error("核销-公众号-模板消息发送失败: " + e.getMessage()); throw new MallinkException(ErrorCode.MP_TEMPLATE_SEND_FAILED); @@ -742,7 +791,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { authQ.setAuthorizerAppid(user.getAppId()); authQ.setTenantId(user.getTenantId()); WxAuthorizerInfo weappInfo = authorizerInfoMapper.findMp(authQ); - if(weappInfo != null) { + if (weappInfo != null) { AppUniformMsg appUniformMsg = new AppUniformMsg(); appUniformMsg.setMsgType(EnumMsgRecordType.SMART_APP_UNIFORM.getCode()); appUniformMsg.setAppId(user.getAppId()); @@ -758,7 +807,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { user.getNickName() )); try { - mqBaseProducer.sendMessage(appUniformMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode()); + mqBaseProducer.sendMessage(appUniformMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); } catch (Exception e) { logger.error("核销-公众号-模板消息发送失败: " + e.getMessage()); throw new MallinkException(ErrorCode.UNIFORM_SEND_FAILED); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantSubsidyServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantSubsidyServiceImpl.java index 49f4a8cd6..0a25a56b5 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantSubsidyServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMerchantSubsidyServiceImpl.java @@ -77,7 +77,7 @@ public class WxMerchantSubsidyServiceImpl implements WxMerchantSubsidyService { @Override public void exportData(WxMerchantSubsidy wxMerchantSubsidy, HttpServletRequest request, HttpServletResponse response) { List list = wxMerchantSubsidyMapper.findVoList(wxMerchantSubsidy); - excelService.exportExcel(list, null, "补贴记录", WxMerchantSubsidyVo.class, "补贴记录.xlsx", response, false); + excelService.exportExcel(list, null, "结算记录", WxMerchantSubsidyVo.class, "结算记录.xlsx", response, false); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 7acd45999..6b1d46336 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -76,6 +76,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Autowired WxOrderGroupService wxOrderGroupService; + @Autowired + WxMerchantSubsidyMapper wxMerchantSubsidyMapper; JSONObject errorMap = JSON.parseObject("{" + "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + @@ -686,9 +688,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { public ResultData payOrderQuery(WxPayOrder record) { try { - if (StringUtils.isBlank(record.getPayOrderNo())) + if (StringUtils.isBlank(record.getPayOrderNo())) { record.setPayOrderNo(String.valueOf(record.getId())); - + } WxPayOrder payOrder = wxPayOrderMapper.selectById(record.getId()); if (payOrder != null) { record.setPayOrderStatus(payOrder.getPayOrderStatus()); @@ -1333,27 +1335,59 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } logger.info("订单刷卡发券 结束"); - // 延迟10秒后分账 - new Thread(() -> { - String tenantId = record.getTenantId(); - Long orderId = record.getOrderId(); - Long payOrderId = record.getId(); + if (record.getShare().equals(EnumPayShare.NO.getCode())) { + //结算记录 try { - Thread.currentThread().sleep(10000); + createMerchantSubsidy(record, order, curDate); } catch (Exception e) { - logger.error("sleep error: " + e.getMessage()); + logger.error("收银台结算记录失败,{}", e.getMessage()); } + } else { + // 延迟10秒后分账 + new Thread(() -> { + String tenantId = record.getTenantId(); + Long orderId = record.getOrderId(); + Long payOrderId = record.getId(); + try { + Thread.currentThread().sleep(10000); + } catch (Exception e) { + logger.error("sleep error: " + e.getMessage()); + } - // 支付分账 - logger.info("订单分账开始: orderId: {}, payOrderId: {}", orderId, payOrderId); - try { - wxOrderService.shareForMicroPay(tenantId, orderId, payOrderId); - } catch (MallinkException e) { - logger.error("订单分账失败: orderId: {}, payOrderId: {}", orderId, payOrderId); - logger.error("订单分账失败: " + e.getMessage()); - } - logger.info("订单分账结束: orderId: {}, payOrderId: {}", orderId, payOrderId); - }).start(); + // 支付分账 + logger.info("订单分账开始: orderId: {}, payOrderId: {}", orderId, payOrderId); + try { + wxOrderService.shareForMicroPay(tenantId, orderId, payOrderId); + } catch (MallinkException e) { + logger.error("订单分账失败: orderId: {}, payOrderId: {}", orderId, payOrderId); + logger.error("订单分账失败: " + e.getMessage()); + } + logger.info("订单分账结束: orderId: {}, payOrderId: {}", orderId, payOrderId); + }).start(); + } + } + + public void createMerchantSubsidy(WxPayOrder record, WxOrder order, Date curDate) { + final IdWorker idWorker = IdWorker.get(); + WxMerchantSubsidy merchantSubsidy = new WxMerchantSubsidy(); + merchantSubsidy.setId(idWorker.nextId()); + merchantSubsidy.setTenantId(record.getTenantId()); + merchantSubsidy.setOrderId(record.getOrderId()); + merchantSubsidy.setOrderType(EnumOrderType.NATIVEPAY.getCode()); + WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(order.getProductId()); + merchantSubsidy.setMerchantId(wxMerchantBUser.getMerchantId()); + merchantSubsidy.setCouponOrderId(0L); + merchantSubsidy.setCouponType(0); + merchantSubsidy.setOrderPayment(record.getPayAmount()); + merchantSubsidy.setReceiverPayment(record.getPayAmount()); + merchantSubsidy.setRealPayment(record.getPayAmount()); + merchantSubsidy.setSubsidy(record.getPayAmount()); + merchantSubsidy.setRealSubsidy(record.getPayAmount()); + merchantSubsidy.setCreateDate(curDate); + merchantSubsidy.setUpdateDate(curDate); + merchantSubsidy.setType(EnumMerchantSubsidyType.WECHAT.getCode()); + merchantSubsidy.setSource(EnumMerchantSubsidySource.CASHIER.getCode()); + wxMerchantSubsidyMapper.insert(merchantSubsidy); } @Override @@ -1539,4 +1573,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { public void deleteById(Long id) { wxPayOrderMapper.deleteById(id); } + + } diff --git a/mallinkService/src/main/resources/mapper/WxMerchantSubsidyMapper.xml b/mallinkService/src/main/resources/mapper/WxMerchantSubsidyMapper.xml index 6be704f90..a8c0429c9 100644 --- a/mallinkService/src/main/resources/mapper/WxMerchantSubsidyMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxMerchantSubsidyMapper.xml @@ -17,11 +17,13 @@ + + - `id`,`order_id`,`order_type`,`merchant_id`,`coupon_order_id`,`coupon_type`,`order_payment`,`receiver_payment`,`real_payment`,`subsidy`,`real_subsidy`,`status`,`create_date`,`update_date`,freeze + `id`,`order_id`,`order_type`,`merchant_id`,`coupon_order_id`,`coupon_type`,`order_payment`,`receiver_payment`,`real_payment`,`subsidy`,`real_subsidy`,`status`,`create_date`,`update_date`,freeze,type,source @@ -74,6 +76,14 @@ and `create_date` between #{startdate} and #{enddate} + + and `type` = #{type} + + + + and `source` = #{source} + + and `status` in @@ -140,6 +150,11 @@ + + + + + @@ -218,28 +233,34 @@