| @@ -88,6 +88,19 @@ public class WxMerchantSubsidyController extends BaseController { | |||||
| return new ResultData(page); | return new ResultData(page); | ||||
| } | } | ||||
| @ApiOperation("交易列表") | |||||
| @GetMapping("summary") | |||||
| @SystemControllerLog(description = "结算-总计") | |||||
| public ResultData summary(@ModelAttribute WxMerchantSubsidyVo wxMerchantSubsidy) { | |||||
| logger.debug("[" + getIpAddr() + "] subsidy::summary"); | |||||
| if (null == wxMerchantSubsidy) { | |||||
| wxMerchantSubsidy = new WxMerchantSubsidyVo(); | |||||
| } | |||||
| wxMerchantSubsidy.setTenantId(getTenantId()); | |||||
| Map<String, Long> data = wxMerchantSubsidyService.summary(wxMerchantSubsidy); | |||||
| return new ResultData(data); | |||||
| } | |||||
| @ApiOperation("更新补贴记录") | @ApiOperation("更新补贴记录") | ||||
| @PostMapping("updateSubsidied") | @PostMapping("updateSubsidied") | ||||
| @SystemControllerLog(description = "商户-更新补贴记录") | @SystemControllerLog(description = "商户-更新补贴记录") | ||||
| @@ -54,17 +54,15 @@ public class WxMerchantSubsidy extends BaseEntity { | |||||
| private Integer receiverPayment; | private Integer receiverPayment; | ||||
| @TableField(exist = false) | @TableField(exist = false) | ||||
| @Excel(name="本次消费(元)",width = 20,orderNum = "5") | |||||
| @io.swagger.annotations.ApiModelProperty(value="订单金额",name="orderPaymentStr") | @io.swagger.annotations.ApiModelProperty(value="订单金额",name="orderPaymentStr") | ||||
| private String orderPaymentStr; | private String orderPaymentStr; | ||||
| @TableField(exist = false) | @TableField(exist = false) | ||||
| @Excel(name="商户应收(元)",width = 20,orderNum = "6") | |||||
| @io.swagger.annotations.ApiModelProperty(value="接收金额(包含通道费)",name="receiverPaymentStr") | @io.swagger.annotations.ApiModelProperty(value="接收金额(包含通道费)",name="receiverPaymentStr") | ||||
| private String receiverPaymentStr; | private String receiverPaymentStr; | ||||
| @TableField(exist = false) | @TableField(exist = false) | ||||
| @Excel(name="补贴(元)",width = 20,orderNum = "7") | |||||
| @Excel(name = "承付金额(元)", width = 20, orderNum = "6") | |||||
| @io.swagger.annotations.ApiModelProperty(value="补贴额(包含通道费)",name="subsidyStr") | @io.swagger.annotations.ApiModelProperty(value="补贴额(包含通道费)",name="subsidyStr") | ||||
| private String subsidyStr; | private String subsidyStr; | ||||
| @@ -76,11 +74,11 @@ public class WxMerchantSubsidy extends BaseEntity { | |||||
| @io.swagger.annotations.ApiModelProperty(value="线上补贴额/实收补贴额(通道费扣除)",name="realSubsidy") | @io.swagger.annotations.ApiModelProperty(value="线上补贴额/实收补贴额(通道费扣除)",name="realSubsidy") | ||||
| private Integer 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") | @io.swagger.annotations.ApiModelProperty(value="状态(0:未补贴, 1:已补贴, 2:已手工补贴)",name="status") | ||||
| private Integer 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") | @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") | ||||
| private Date createDate; | private Date createDate; | ||||
| @@ -102,8 +100,9 @@ public class WxMerchantSubsidy extends BaseEntity { | |||||
| @TableField(exist = false) | @TableField(exist = false) | ||||
| protected String statusStr; | protected String statusStr; | ||||
| @io.swagger.annotations.ApiModelProperty(value="是否冻结",name="freeze") | |||||
| private Integer freeze; | |||||
| @Excel(name = "冻结状态", width = 20, orderNum = "8", replace = {"冻结中_1", "正常_0", " _-1"}) | |||||
| @io.swagger.annotations.ApiModelProperty(value = "是否冻结", name = "freeze") | |||||
| private Integer freeze; | |||||
| public String getOrderPaymentStr() { | public String getOrderPaymentStr() { | ||||
| @@ -127,9 +126,11 @@ public class WxMerchantSubsidy extends BaseEntity { | |||||
| return subsidyStr; | return subsidyStr; | ||||
| } | } | ||||
| @io.swagger.annotations.ApiModelProperty(value = "结算类型1微信结算2自主结算", name = "type") | |||||
| @Excel(name = "结算类型", width = 20, orderNum = "4", replace = {"自主结算_1", "微信结算_2", " _-1"}) | |||||
| @io.swagger.annotations.ApiModelProperty(value = "结算类型1自主结算2微信结算", name = "type") | |||||
| private Integer 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", " _-1"}) | |||||
| @io.swagger.annotations.ApiModelProperty(value = "结算来源0补贴1卡消费2券核销3砍价核销4拼团核销5收银分账", name = "source") | |||||
| private Integer source; | |||||
| } | } | ||||
| @@ -13,7 +13,6 @@ public class WxMerchantSubsidyVo extends WxMerchantSubsidy { | |||||
| @io.swagger.annotations.ApiModelProperty(value="封面图",name="coverImg") | @io.swagger.annotations.ApiModelProperty(value="封面图",name="coverImg") | ||||
| private String coverImg; | private String coverImg; | ||||
| @Excel(name="活动名称",width = 20,orderNum = "3") | |||||
| @io.swagger.annotations.ApiModelProperty(value="券名称",name="title") | @io.swagger.annotations.ApiModelProperty(value="券名称",name="title") | ||||
| private String title; | private String title; | ||||
| @io.swagger.annotations.ApiModelProperty(value="副标题",name="subTitle") | @io.swagger.annotations.ApiModelProperty(value="副标题",name="subTitle") | ||||
| @@ -61,6 +61,8 @@ public interface WxMerchantSubsidyService { | |||||
| /** | /** | ||||
| * 补贴流水导出 | * 补贴流水导出 | ||||
| */ | */ | ||||
| void exportData(WxMerchantSubsidy wxMerchantSubsidy, HttpServletRequest request, HttpServletResponse response); | |||||
| void exportData(WxMerchantSubsidyVo wxMerchantSubsidy, HttpServletRequest request, HttpServletResponse response); | |||||
| Map<String, Long> summary(WxMerchantSubsidyVo wxMerchantSubsidy); | |||||
| } | } | ||||
| @@ -34,34 +34,34 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxCardSpendMapper wxCardSpendMapper; | WxCardSpendMapper wxCardSpendMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxCardInfoMapper wxCardInfoMapper; | WxCardInfoMapper wxCardInfoMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxCouponMapper wxCouponMapper; | WxCouponMapper wxCouponMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxMerchantMapper wxMerchantMapper; | WxMerchantMapper wxMerchantMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxMerchantSubsidyMapper wxMerchantSubsidyMapper; | WxMerchantSubsidyMapper wxMerchantSubsidyMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxCouponMerchantMapper wxCouponMerchantMapper; | WxCouponMerchantMapper wxCouponMerchantMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxPayAccountMapper payAccountMapper; | WxPayAccountMapper payAccountMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxOrderMapper wxOrderMapper; | WxOrderMapper wxOrderMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxCouponOrderMapper wxCouponOrderMapper; | WxCouponOrderMapper wxCouponOrderMapper; | ||||
| @Autowired | |||||
| @Autowired | |||||
| WxProfitSharingOrderService profitSharingOrderService; | WxProfitSharingOrderService profitSharingOrderService; | ||||
| @Autowired | @Autowired | ||||
| @@ -73,7 +73,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| @Autowired | @Autowired | ||||
| WxScoreRulesService wxScoreRulesService; | WxScoreRulesService wxScoreRulesService; | ||||
| @Override | |||||
| @Override | |||||
| public WxCouponMerchant checkMerchantInCoupon(WxCardInfo cardInfo, Long merchantId) { | public WxCouponMerchant checkMerchantInCoupon(WxCardInfo cardInfo, Long merchantId) { | ||||
| WxCouponMerchant couponMerchant = null; | WxCouponMerchant couponMerchant = null; | ||||
| WxCouponMerchant couponMerchantQ = new WxCouponMerchant(); | WxCouponMerchant couponMerchantQ = new WxCouponMerchant(); | ||||
| @@ -89,12 +89,12 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| return couponMerchant; | return couponMerchant; | ||||
| } | } | ||||
| @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) { | 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()); | WxCardInfo cardInfo = wxCardInfoMapper.selectById(record.getCardId()); | ||||
| if (cardInfo == null) { | if (cardInfo == null) { | ||||
| logger.error("card not found: " + record.getCardId()); | logger.error("card not found: " + record.getCardId()); | ||||
| @@ -129,8 +129,8 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); | int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); | ||||
| Integer real_payment = payment - iChargeFee; | Integer real_payment = payment - iChargeFee; | ||||
| Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; | 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()); | real_payment = Math.min(real_payment, cardInfo.getRemainingShareFeeAmount()); | ||||
| remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; | remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; | ||||
| @@ -193,7 +193,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| } | } | ||||
| // 7.2 update coupon card status | // 7.2 update coupon card status | ||||
| if(cardInfo.getRemainingAmount().equals(0)) { | |||||
| if (cardInfo.getRemainingAmount().equals(0)) { | |||||
| if (cardFinished(curDate, cardInfo)) { | if (cardFinished(curDate, cardInfo)) { | ||||
| return new ResultData(ErrorCode.DB_FAIL.getCode(), "couponOrder status 更新出错!"); | return new ResultData(ErrorCode.DB_FAIL.getCode(), "couponOrder status 更新出错!"); | ||||
| } | } | ||||
| @@ -202,9 +202,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| // 8. 补贴 | // 8. 补贴 | ||||
| // 补贴额 = 商城补贴总额/卡券面额 * 抵扣额(本次支付额) | // 补贴额 = 商城补贴总额/卡券面额 * 抵扣额(本次支付额) | ||||
| Double subsidyFeeD = 1.0 * record.getDeductionAmount() * coupon.getSubsidyNum() / cardInfo.getAmount(); | Double subsidyFeeD = 1.0 * record.getDeductionAmount() * coupon.getSubsidyNum() / cardInfo.getAmount(); | ||||
| Integer subsidyFee = subsidyFeeD.intValue(); | |||||
| Integer subsidyFee = subsidyFeeD.intValue(); | |||||
| logger.info("补贴额: " + subsidyFee); | logger.info("补贴额: " + subsidyFee); | ||||
| if(subsidyFee > 0) { | |||||
| if (cardInfo.getSaleAmount().equals(0) || subsidyFee > 0) { | |||||
| // 有补贴时入库 | // 有补贴时入库 | ||||
| int iSubChargeFee = PayUtils.getPayRate(subsidyFee, payAccount.getRate(), false); | int iSubChargeFee = PayUtils.getPayRate(subsidyFee, payAccount.getRate(), false); | ||||
| Integer realSubsidyFee = subsidyFee - iSubChargeFee; | Integer realSubsidyFee = subsidyFee - iSubChargeFee; | ||||
| @@ -224,13 +224,16 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_COUPON.getCode())) { | if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_COUPON.getCode())) { | ||||
| // 立减领券 | // 立减领券 | ||||
| merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.AUTO_SUBSIDIED.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 { | } else { | ||||
| // 未补贴 | // 未补贴 | ||||
| merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.NOT_SUBSIDY.getCode()); | merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.NOT_SUBSIDY.getCode()); | ||||
| } | } | ||||
| merchantSubsidy.setType(EnumMerchantSubsidyType.MANUAL.getCode()); | |||||
| merchantSubsidy.setSource(EnumMerchantSubsidySource.CARD.getCode()); | |||||
| merchantSubsidy.setCreateDate(curDate); | merchantSubsidy.setCreateDate(curDate); | ||||
| merchantSubsidy.setUpdateDate(curDate); | merchantSubsidy.setUpdateDate(curDate); | ||||
| try { | try { | ||||
| @@ -250,10 +253,23 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| if (ErrorCode.PROFIT_SHARING_NUM_UP_LIMIT.getCode() == e.getErrorCode()) { | if (ErrorCode.PROFIT_SHARING_NUM_UP_LIMIT.getCode() == e.getErrorCode()) { | ||||
| // 分账已到20次限制,后面只记录,无法分账 | // 分账已到20次限制,后面只记录,无法分账 | ||||
| logger.error("分账已到20次限制,后面只记录,无法分账"); | logger.error("分账已到20次限制,后面只记录,无法分账"); | ||||
| try { | |||||
| creteMerchantSubsidy(record, curDate, idWorker, coupon, payment); | |||||
| } catch (Exception ex) { | |||||
| logger.error("分账已到20次限制,记录到结算表失败"); | |||||
| } | |||||
| } else { | } else { | ||||
| throw new MallinkException(e.getErrorCode(), e.getMessage()); | 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); | 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 curDate | ||||
| * @param cardInfo | * @param cardInfo | ||||
| * @return | * @return | ||||
| @@ -315,7 +353,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| @Override | @Override | ||||
| public List<Map<String, Object>> sumCardSpendForMerchant(WxCardSpendVo record) { | public List<Map<String, Object>> sumCardSpendForMerchant(WxCardSpendVo record) { | ||||
| return wxCardSpendMapper.sumCardSpendVoForMerchant(record); | |||||
| return wxCardSpendMapper.sumCardSpendVoForMerchant(record); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -333,7 +371,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| if (record.getId() == null) { | if (record.getId() == null) { | ||||
| //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); | //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); | ||||
| final IdWorker idWorker = IdWorker.get(); | final IdWorker idWorker = IdWorker.get(); | ||||
| record.setId(idWorker.nextId()); | |||||
| record.setId(idWorker.nextId()); | |||||
| wxCardSpendMapper.insert(record); | wxCardSpendMapper.insert(record); | ||||
| } else { | } else { | ||||
| wxCardSpendMapper.updateById(record); | wxCardSpendMapper.updateById(record); | ||||
| @@ -344,7 +382,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| public void update(WxCardSpend record) { | public void update(WxCardSpend record) { | ||||
| // 1. 检查符合条件的卡消费记录是否已支付 | // 1. 检查符合条件的卡消费记录是否已支付 | ||||
| List<WxCardSpend> cardSpends = wxCardSpendMapper.findList(record); | List<WxCardSpend> 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); | throw new MallinkException(ErrorCode.CARD_SPEND_IS_PAID); | ||||
| } | } | ||||
| // 2. 更新支付状态 | // 2. 更新支付状态 | ||||
| @@ -363,11 +401,11 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| logger.error("微信分账: " + e.getMessage()); | logger.error("微信分账: " + e.getMessage()); | ||||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), 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("请用订单退款接口: "); | logger.error("请用订单退款接口: "); | ||||
| throw new MallinkException(ErrorCode.CARD_IS_NOT_COST); | throw new MallinkException(ErrorCode.CARD_IS_NOT_COST); | ||||
| } else if(cardInfo.getRemainingAmount() > 0){ | |||||
| } else if (cardInfo.getRemainingAmount() > 0) { | |||||
| // 卡已消费, 余额不为0 | // 卡已消费, 余额不为0 | ||||
| int remainShareFeeAmount = cardInfo.getRemainingShareFeeAmount(); | int remainShareFeeAmount = cardInfo.getRemainingShareFeeAmount(); | ||||
| try { | try { | ||||
| @@ -409,7 +447,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 void shareForCardPay(String tenantId, Long cardId, Long orderId, Long cardSpendId) { | public void shareForCardPay(String tenantId, Long cardId, Long orderId, Long cardSpendId) { | ||||
| // 微信已分账检查次数 | |||||
| // 微信已分账检查次数 | |||||
| int psNum = 0; | int psNum = 0; | ||||
| try { | try { | ||||
| WxCardSpend cardSpendQ = new WxCardSpend(); | WxCardSpend cardSpendQ = new WxCardSpend(); | ||||
| @@ -457,7 +495,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| shareOrder.setTransactionId(cardInfo.getTransactionId()); | shareOrder.setTransactionId(cardInfo.getTransactionId()); | ||||
| shareOrder.setShareAmount(cardSpend.getRealPayment()); | shareOrder.setShareAmount(cardSpend.getRealPayment()); | ||||
| ResultData resultData = profitSharingOrderService.createSharingOrder(shareOrder); | ResultData resultData = profitSharingOrderService.createSharingOrder(shareOrder); | ||||
| if(resultData.code != Result.SUCCESS) { | |||||
| if (resultData.code != Result.SUCCESS) { | |||||
| // 分账异常 | // 分账异常 | ||||
| logger.error(resultData.message); | logger.error(resultData.message); | ||||
| throw new MallinkException(resultData.code, 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) { | || psNum == 20) { | ||||
| // 卡余额为0,或者卡已分账20次,发起分账完结 | // 卡余额为0,或者卡已分账20次,发起分账完结 | ||||
| if (cardSpend.getCardRemainRealAmount() > 0) { | if (cardSpend.getCardRemainRealAmount() > 0) { | ||||
| @@ -492,9 +530,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| } | } | ||||
| /** | /** | ||||
| * 卡分账完结 | * 卡分账完结 | ||||
| * | |||||
| * @param cardInfo | * @param cardInfo | ||||
| * @param shareOrder | * @param shareOrder | ||||
| */ | */ | ||||
| @@ -538,9 +576,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| shareOrder.setOrderId(cardSpend.getId()); | shareOrder.setOrderId(cardSpend.getId()); | ||||
| shareOrder.setPayAmount(0); | shareOrder.setPayAmount(0); | ||||
| shareOrder.setOrderId(cardSpend.getId()); | 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 { | } else { | ||||
| shareOrder.setShareAmount(cardInfo.getRemainingShareFeeAmount()); | shareOrder.setShareAmount(cardInfo.getRemainingShareFeeAmount()); | ||||
| } | } | ||||
| @@ -610,7 +648,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); | int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); | ||||
| Integer real_payment = payment - iChargeFee; | Integer real_payment = payment - iChargeFee; | ||||
| Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; | Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() - real_payment; | ||||
| Integer remaingAmount = cardInfo.getRemainingAmount()-record.getDeductionAmount(); | |||||
| Integer remaingAmount = cardInfo.getRemainingAmount() - record.getDeductionAmount(); | |||||
| if (remaingAmount.equals(0)) { | if (remaingAmount.equals(0)) { | ||||
| // 最后一次支付时 | // 最后一次支付时 | ||||
| real_payment = Math.min(real_payment, cardInfo.getRemainingShareFeeAmount()); | 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); | int iChargeFee = PayUtils.getPayRate(payment, payAccount.getRate(), false); | ||||
| Integer real_payment = payment - iChargeFee; | Integer real_payment = payment - iChargeFee; | ||||
| Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() + real_payment; | Integer remain_real_pament = cardInfo.getRemainingShareFeeAmount() + real_payment; | ||||
| Integer remaingAmount = cardInfo.getRemainingAmount()+record.getDeductionAmount(); | |||||
| Integer remaingAmount = cardInfo.getRemainingAmount() + record.getDeductionAmount(); | |||||
| // 5.、update card info | // 5.、update card info | ||||
| WxCardInfo updateCardInfo = new WxCardInfo(); | WxCardInfo updateCardInfo = new WxCardInfo(); | ||||
| @@ -750,7 +788,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| logger.error("card not found: " + record.getCardId()); | logger.error("card not found: " + record.getCardId()); | ||||
| throw new MallinkException(ErrorCode.CARD_IS_NOT_FOUND); | throw new MallinkException(ErrorCode.CARD_IS_NOT_FOUND); | ||||
| } | } | ||||
| if(cardInfo.getRemainingAmount().equals(0)) { | |||||
| if (cardInfo.getRemainingAmount().equals(0)) { | |||||
| if (cardFinished(curDate, cardInfo)) { | if (cardFinished(curDate, cardInfo)) { | ||||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "couponOrder status 更新出错!"); | throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "couponOrder status 更新出错!"); | ||||
| } | } | ||||
| @@ -778,9 +816,9 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| // 3. 补贴 | // 3. 补贴 | ||||
| // 补贴额 = 商城补贴总额/卡券面额 * 抵扣额(本次支付额) | // 补贴额 = 商城补贴总额/卡券面额 * 抵扣额(本次支付额) | ||||
| Double subsidyFeeD = 1.0 * record.getDeductionAmount() * coupon.getSubsidyNum() / cardInfo.getAmount(); | Double subsidyFeeD = 1.0 * record.getDeductionAmount() * coupon.getSubsidyNum() / cardInfo.getAmount(); | ||||
| Integer subsidyFee = subsidyFeeD.intValue(); | |||||
| Integer subsidyFee = subsidyFeeD.intValue(); | |||||
| logger.info("补贴额: " + subsidyFee); | logger.info("补贴额: " + subsidyFee); | ||||
| if(subsidyFee > 0) { | |||||
| if (subsidyFee > 0) { | |||||
| // 有补贴时入库 | // 有补贴时入库 | ||||
| int iSubChargeFee = PayUtils.getPayRate(subsidyFee, payAccount.getRate(), false); | int iSubChargeFee = PayUtils.getPayRate(subsidyFee, payAccount.getRate(), false); | ||||
| Integer realSubsidyFee = subsidyFee - iSubChargeFee; | Integer realSubsidyFee = subsidyFee - iSubChargeFee; | ||||
| @@ -800,7 +838,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_COUPON.getCode())) { | if (coupon.getSubsidyType().equals(EnumCouponSubsidyType.WECHAT_COUPON.getCode())) { | ||||
| // 立减领券 | // 立减领券 | ||||
| merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.AUTO_SUBSIDIED.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 { | } else { | ||||
| // 未补贴 | // 未补贴 | ||||
| @@ -822,7 +860,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService { | |||||
| shareForCardPay(record.getTenantId(), record.getCardId(), record.getOrderId(), record.getId()); | shareForCardPay(record.getTenantId(), record.getCardId(), record.getOrderId(), record.getId()); | ||||
| } catch (MallinkException e) { | } catch (MallinkException e) { | ||||
| logger.error(e.getMessage()); | 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次限制,后面只记录,无法分账 | // 分账已到20次限制,后面只记录,无法分账 | ||||
| logger.error("分账已到20次限制,后面只记录,无法分账"); | logger.error("分账已到20次限制,后面只记录,无法分账"); | ||||
| } else { | } else { | ||||
| @@ -200,7 +200,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| else | else | ||||
| list = wxCouponOrderMapper.findListOfOrderedByDate(dateMap); | list = wxCouponOrderMapper.findListOfOrderedByDate(dateMap); | ||||
| //logger.info("find " + list.size() + " coupon order from " + /startDate + " to " + new Date()); | //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()); | resultMap.put("orderCount", list.size()); | ||||
| } else { | } else { | ||||
| if (isVerified) | if (isVerified) | ||||
| @@ -214,7 +214,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| @Override | @Override | ||||
| public PageInfo<WxCouponOrderCVo> listCUserVoAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { | public PageInfo<WxCouponOrderCVo> 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 | @Override | ||||
| @@ -263,7 +263,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| @Override | @Override | ||||
| public ResultData listAdminAsPage(WxCouponOrderBVo wxCouponOrderBVo, Integer pageIndex, Integer pageSize) { | public ResultData listAdminAsPage(WxCouponOrderBVo wxCouponOrderBVo, Integer pageIndex, Integer pageSize) { | ||||
| PageInfo<WxCouponOrderBVo> pageInfo= PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfAdmin(wxCouponOrderBVo)); | |||||
| PageInfo<WxCouponOrderBVo> pageInfo = PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfAdmin(wxCouponOrderBVo)); | |||||
| return new ResultData(pageInfo); | return new ResultData(pageInfo); | ||||
| } | } | ||||
| @@ -319,8 +319,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); | WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); | ||||
| wxCouponMerchant.setProductId(wxCoupon.getId()); | wxCouponMerchant.setProductId(wxCoupon.getId()); | ||||
| wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); | wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); | ||||
| List<WxCouponMerchant> couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant); | |||||
| if (!couponMerchantList.stream().anyMatch(cm->cm.getMerchantId().equals(bUser.getMerchantId()))){ | |||||
| List<WxCouponMerchant> couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant); | |||||
| if (!couponMerchantList.stream().anyMatch(cm -> cm.getMerchantId().equals(bUser.getMerchantId()))) { | |||||
| logger.error("券: coupon-" + wxCoupon.getId() + "核销: couponMerchantId-" + bUser.getMerchantId()); | logger.error("券: coupon-" + wxCoupon.getId() + "核销: couponMerchantId-" + bUser.getMerchantId()); | ||||
| throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL); | 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()); | logger.error("db failed: couponOrder-" + couponOrder.getId() + ", e:" + e.getMessage()); | ||||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | ||||
| } | } | ||||
| if(num != 1) { | |||||
| if (num != 1) { | |||||
| logger.error("核销异常:updatete num " + num); | logger.error("核销异常:updatete num " + num); | ||||
| throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); | throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); | ||||
| } | } | ||||
| @@ -402,11 +402,25 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| @Override | @Override | ||||
| public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser) { | 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 { | try { | ||||
| @@ -429,8 +443,43 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| try { | try { | ||||
| sendVerifyMsg(couponOrder, bUser, bSentCoupon); | sendVerifyMsg(couponOrder, bUser, bSentCoupon); | ||||
| } catch (Exception e) { | } 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 | @Override | ||||
| @@ -477,8 +526,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| WxCouponMerchant couponMerchant; | WxCouponMerchant couponMerchant; | ||||
| try { | try { | ||||
| couponMerchant = wxCouponMerchantMapper.selectOne(new QueryWrapper(couponMerchantQ)); | 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); | throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | ||||
| } | } | ||||
| @@ -491,7 +540,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| WxCoupon coupon; | WxCoupon coupon; | ||||
| try { | try { | ||||
| coupon = wxCouponMapper.selectById(couponOrder.getCouponId()); | coupon = wxCouponMapper.selectById(couponOrder.getCouponId()); | ||||
| }catch (Exception e) { | |||||
| } catch (Exception e) { | |||||
| logger.error("查找卡券错误: " + "CouponId:" + couponMerchantQ.getProductId()); | logger.error("查找卡券错误: " + "CouponId:" + couponMerchantQ.getProductId()); | ||||
| throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR); | ||||
| } | } | ||||
| @@ -623,7 +672,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| } | } | ||||
| // 7. 公众号消息 | // 7. 公众号消息 | ||||
| if(StringUtils.isNotBlank(user.getMpAppId()) && | |||||
| if (StringUtils.isNotBlank(user.getMpAppId()) && | |||||
| StringUtils.isNotBlank(user.getMpOpenId()) && | StringUtils.isNotBlank(user.getMpOpenId()) && | ||||
| user.getMpSubscribe().equals(EnumUserIsSubscribe.YES.getCode())) { | user.getMpSubscribe().equals(EnumUserIsSubscribe.YES.getCode())) { | ||||
| // 已关注公众号 | // 已关注公众号 | ||||
| @@ -640,15 +689,15 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| String formId = null; | String formId = null; | ||||
| Date curDate = new Date(); | Date curDate = new Date(); | ||||
| Date dateAfter7Day = DateUtils.getHourTimeAfter(7, order.getCreateDate()); | 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")) { | && !order.getFormId().equalsIgnoreCase("undefined")) { | ||||
| formId = order.getFormId(); | formId = order.getFormId(); | ||||
| } | } | ||||
| // 6. get payOrder info | // 6. get payOrder info | ||||
| int formType = EnumMsgLimitType.WEAPP_FORMID.getCode(); | 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 | // formId为空,获取prepayId | ||||
| WxPayOrder payOrder = null; | WxPayOrder payOrder = null; | ||||
| WxPayOrder payOrderQ = new WxPayOrder(); | WxPayOrder payOrderQ = new WxPayOrder(); | ||||
| @@ -675,7 +724,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| } | } | ||||
| } | } | ||||
| if(StringUtils.isBlank(formId)) { | |||||
| if (StringUtils.isBlank(formId)) { | |||||
| logger.error("无可用formId, 不能发小程序模板消息"); | logger.error("无可用formId, 不能发小程序模板消息"); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -688,7 +737,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| msgLimit.setTenantId(user.getTenantId()); | msgLimit.setTenantId(user.getTenantId()); | ||||
| msgLimit.setType(formType); | msgLimit.setType(formType); | ||||
| msgLimit.setLimitId(formId); | msgLimit.setLimitId(formId); | ||||
| if(wxMsgLimitService.checkIsLimit(msgLimit)) { | |||||
| if (wxMsgLimitService.checkIsLimit(msgLimit)) { | |||||
| // 已达到限制条件,不发消息了 | // 已达到限制条件,不发消息了 | ||||
| logger.error("已达到限制条件,不发小程序模板消息了: " + user.getId()); | logger.error("已达到限制条件,不发小程序模板消息了: " + user.getId()); | ||||
| return; | return; | ||||
| @@ -730,7 +779,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| )); | )); | ||||
| try { | 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) { | } catch (Exception e) { | ||||
| logger.error("核销-公众号-模板消息发送失败: " + e.getMessage()); | logger.error("核销-公众号-模板消息发送失败: " + e.getMessage()); | ||||
| throw new MallinkException(ErrorCode.MP_TEMPLATE_SEND_FAILED); | throw new MallinkException(ErrorCode.MP_TEMPLATE_SEND_FAILED); | ||||
| @@ -742,7 +791,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| authQ.setAuthorizerAppid(user.getAppId()); | authQ.setAuthorizerAppid(user.getAppId()); | ||||
| authQ.setTenantId(user.getTenantId()); | authQ.setTenantId(user.getTenantId()); | ||||
| WxAuthorizerInfo weappInfo = authorizerInfoMapper.findMp(authQ); | WxAuthorizerInfo weappInfo = authorizerInfoMapper.findMp(authQ); | ||||
| if(weappInfo != null) { | |||||
| if (weappInfo != null) { | |||||
| AppUniformMsg appUniformMsg = new AppUniformMsg(); | AppUniformMsg appUniformMsg = new AppUniformMsg(); | ||||
| appUniformMsg.setMsgType(EnumMsgRecordType.SMART_APP_UNIFORM.getCode()); | appUniformMsg.setMsgType(EnumMsgRecordType.SMART_APP_UNIFORM.getCode()); | ||||
| appUniformMsg.setAppId(user.getAppId()); | appUniformMsg.setAppId(user.getAppId()); | ||||
| @@ -758,7 +807,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| user.getNickName() | user.getNickName() | ||||
| )); | )); | ||||
| try { | 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) { | } catch (Exception e) { | ||||
| logger.error("核销-公众号-模板消息发送失败: " + e.getMessage()); | logger.error("核销-公众号-模板消息发送失败: " + e.getMessage()); | ||||
| throw new MallinkException(ErrorCode.UNIFORM_SEND_FAILED); | throw new MallinkException(ErrorCode.UNIFORM_SEND_FAILED); | ||||
| @@ -17,8 +17,11 @@ import org.springframework.stereotype.Service; | |||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
| import java.math.BigDecimal; | |||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.stream.Collectors; | |||||
| @Service | @Service | ||||
| @@ -75,9 +78,26 @@ public class WxMerchantSubsidyServiceImpl implements WxMerchantSubsidyService { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public void exportData(WxMerchantSubsidy wxMerchantSubsidy, HttpServletRequest request, HttpServletResponse response) { | |||||
| public void exportData(WxMerchantSubsidyVo wxMerchantSubsidy, HttpServletRequest request, HttpServletResponse response) { | |||||
| List<WxMerchantSubsidyVo> list = wxMerchantSubsidyMapper.findVoList(wxMerchantSubsidy); | List<WxMerchantSubsidyVo> list = wxMerchantSubsidyMapper.findVoList(wxMerchantSubsidy); | ||||
| excelService.exportExcel(list, null, "补贴记录", WxMerchantSubsidyVo.class, "补贴记录.xlsx", response, false); | |||||
| Map<String, Long> summary = summary(wxMerchantSubsidy); | |||||
| Long subsidy = summary.get("subsidy"); | |||||
| String subsidyStr = new BigDecimal(subsidy).divide(new BigDecimal(100)).toPlainString(); | |||||
| WxMerchantSubsidyVo merchantSubsidy = new WxMerchantSubsidyVo(); | |||||
| merchantSubsidy.setSubsidyStr(subsidyStr); | |||||
| merchantSubsidy.setSource(-1); | |||||
| merchantSubsidy.setType(-1); | |||||
| merchantSubsidy.setFreeze(-1); | |||||
| list.add(merchantSubsidy); | |||||
| excelService.exportExcel(list, null, "结算记录", WxMerchantSubsidyVo.class, "结算记录.xlsx", response, false); | |||||
| } | |||||
| @Override | |||||
| public Map<String, Long> summary(WxMerchantSubsidyVo wxMerchantSubsidy) { | |||||
| Long subsidy = wxMerchantSubsidyMapper.findVoList(wxMerchantSubsidy).stream().collect(Collectors.summingLong(WxMerchantSubsidy::getSubsidy)); | |||||
| Map<String, Long> data = new HashMap<>(); | |||||
| data.put("subsidy", subsidy); | |||||
| return data; | |||||
| } | } | ||||
| @@ -76,6 +76,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| @Autowired | @Autowired | ||||
| WxOrderGroupService wxOrderGroupService; | WxOrderGroupService wxOrderGroupService; | ||||
| @Autowired | |||||
| WxMerchantSubsidyMapper wxMerchantSubsidyMapper; | |||||
| JSONObject errorMap = JSON.parseObject("{" + | JSONObject errorMap = JSON.parseObject("{" + | ||||
| "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + | "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + | ||||
| @@ -686,9 +688,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| public ResultData payOrderQuery(WxPayOrder record) { | public ResultData payOrderQuery(WxPayOrder record) { | ||||
| try { | try { | ||||
| if (StringUtils.isBlank(record.getPayOrderNo())) | |||||
| if (StringUtils.isBlank(record.getPayOrderNo())) { | |||||
| record.setPayOrderNo(String.valueOf(record.getId())); | record.setPayOrderNo(String.valueOf(record.getId())); | ||||
| } | |||||
| WxPayOrder payOrder = wxPayOrderMapper.selectById(record.getId()); | WxPayOrder payOrder = wxPayOrderMapper.selectById(record.getId()); | ||||
| if (payOrder != null) { | if (payOrder != null) { | ||||
| record.setPayOrderStatus(payOrder.getPayOrderStatus()); | record.setPayOrderStatus(payOrder.getPayOrderStatus()); | ||||
| @@ -1333,27 +1335,59 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| } | } | ||||
| logger.info("订单刷卡发券 结束"); | 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 { | try { | ||||
| Thread.currentThread().sleep(10000); | |||||
| createMerchantSubsidy(record, order, curDate); | |||||
| } catch (Exception e) { | } 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 | @Override | ||||
| @@ -1539,4 +1573,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| public void deleteById(Long id) { | public void deleteById(Long id) { | ||||
| wxPayOrderMapper.deleteById(id); | wxPayOrderMapper.deleteById(id); | ||||
| } | } | ||||
| } | } | ||||
| @@ -17,11 +17,13 @@ | |||||
| <result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> | <result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> | ||||
| <result column="update_date" jdbcType="TIMESTAMP" property="updateDate" /> | <result column="update_date" jdbcType="TIMESTAMP" property="updateDate" /> | ||||
| <result column="freeze" property="freeze" /> | <result column="freeze" property="freeze" /> | ||||
| <result column="type" property="type"/> | |||||
| <result column="source" property="source"/> | |||||
| </resultMap> | </resultMap> | ||||
| <sql id="allColumns"> | <sql id="allColumns"> | ||||
| `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 | |||||
| </sql> | </sql> | ||||
| <sql id="dynamicWhereConditions"> | <sql id="dynamicWhereConditions"> | ||||
| @@ -74,6 +76,14 @@ | |||||
| <if test=" null != startdate and null!=enddate"> | <if test=" null != startdate and null!=enddate"> | ||||
| and `create_date` between #{startdate} and #{enddate} | and `create_date` between #{startdate} and #{enddate} | ||||
| </if> | </if> | ||||
| <if test=" null != type"> | |||||
| and `type` = #{type} | |||||
| </if> | |||||
| <if test=" null != source"> | |||||
| and `source` = #{source} | |||||
| </if> | |||||
| <if test=" null != statusS "> | <if test=" null != statusS "> | ||||
| and `status` in | and `status` in | ||||
| <foreach collection="statusS" index="index" item="sItem" open="(" separator="," close=")"> | <foreach collection="statusS" index="index" item="sItem" open="(" separator="," close=")"> | ||||
| @@ -140,6 +150,11 @@ | |||||
| <result column="nick_name" jdbcType="VARCHAR" property="nickName" /> | <result column="nick_name" jdbcType="VARCHAR" property="nickName" /> | ||||
| <result column="phone" jdbcType="VARCHAR" property="phone" /> | <result column="phone" jdbcType="VARCHAR" property="phone" /> | ||||
| <result column="freeze" property="freeze" /> | <result column="freeze" property="freeze" /> | ||||
| <result column="source" property="source"/> | |||||
| <result column="type" property="type"/> | |||||
| </resultMap> | </resultMap> | ||||
| <sql id="allVoColumns"> | <sql id="allVoColumns"> | ||||
| @@ -218,28 +233,34 @@ | |||||
| </sql> | </sql> | ||||
| <select id="findVoList" parameterType="com.iformall.domain.vo.WxMerchantSubsidyVo" resultMap="VoBaseResultMap"> | <select id="findVoList" parameterType="com.iformall.domain.vo.WxMerchantSubsidyVo" resultMap="VoBaseResultMap"> | ||||
| select * from | |||||
| ( | |||||
| select <include refid="allVoColumns" /> | |||||
| from wx_merchant_subsidy ms | |||||
| left join wx_coupon_order co on co.id = ms.coupon_order_id | |||||
| left join wx_coupon c on c.id = co.coupon_id | |||||
| left join wx_merchant m on m.id = ms.merchant_id | |||||
| left join wx_card_spend cs on cs.order_id = ms.order_id | |||||
| left join wx_c_user cu on cu.id = cs.owner_id | |||||
| where ms.order_type = 3 | |||||
| union | |||||
| select <include refid="allVoColumns" /> | |||||
| from wx_merchant_subsidy ms | |||||
| left join wx_coupon_order co on co.id = ms.coupon_order_id | |||||
| left join wx_coupon c on c.id = co.coupon_id | |||||
| left join wx_merchant m on m.id = ms.merchant_id | |||||
| left join wx_order o on o.id = ms.order_id | |||||
| left join wx_c_user cu on cu.id = o.c_user_id | |||||
| where ms.order_type = 0 | |||||
| ) t | |||||
| select ms.id,ms.order_id,m.name,ms.source,ms.type, | |||||
| ms.create_date,ms.subsidy,ms.real_subsidy,ms.status,ms.freeze | |||||
| from wx_merchant_subsidy ms left join wx_merchant m on ms.merchant_id=m.id | |||||
| where 1=1 | where 1=1 | ||||
| <include refid="dynamicVoWhereConditions" /> | |||||
| <if test=" null != tenantId "> | |||||
| and ms.`tenant_id` = #{tenantId} | |||||
| </if> | |||||
| <if test=" null != orderId "> | |||||
| and ms.`order_id` = #{orderId} | |||||
| </if> | |||||
| <if test=" null != merchantId "> | |||||
| and ms.`merchant_id` = #{merchantId} | |||||
| </if> | |||||
| <if test=" null != source "> | |||||
| and ms.`source` = #{source} | |||||
| </if> | |||||
| <if test=" null != type "> | |||||
| and ms.`type` = #{type} | |||||
| </if> | |||||
| <if test=" null != status "> | |||||
| and ms.`status` = #{status} | |||||
| </if> | |||||
| <if test=" null != freeze "> | |||||
| and ms.`freeze` = #{freeze} | |||||
| </if> | |||||
| <if test=" null != startdate and null!=enddate"> | |||||
| and ms.`create_date` between #{startdate} and #{enddate} | |||||
| </if> | |||||
| </select> | </select> | ||||
| <select id="sumVoList" parameterType="com.iformall.domain.vo.WxMerchantSubsidyVo" resultType="hashmap"> | <select id="sumVoList" parameterType="com.iformall.domain.vo.WxMerchantSubsidyVo" resultType="hashmap"> | ||||
| @@ -561,7 +561,7 @@ | |||||
| where o.tenant_id=#{tenantId} and c.type!=100 and o.order_status in(0,1,2,3,4,5) | where o.tenant_id=#{tenantId} and c.type!=100 and o.order_status in(0,1,2,3,4,5) | ||||
| union all | union all | ||||
| select o.id,o.order_number,o.tenant_id,o.product_id,o.payment, | select o.id,o.order_number,o.tenant_id,o.product_id,o.payment, | ||||
| case o.order_status when 6 then 0 when 7 then 1 | |||||
| case o.order_status when 6 then 0 when 7 then 0 | |||||
| when 8 then 2 when 9 then 2 else o.order_status end order_status, | when 8 then 2 when 9 then 2 else o.order_status end order_status, | ||||
| c.title,cubi.`name` c_user_name,cubi.phone,o.create_date,3 attribute from wx_order o | c.title,cubi.`name` c_user_name,cubi.phone,o.create_date,3 attribute from wx_order o | ||||
| left join wx_c_user_basic_info cubi on o.c_user_id=cubi.id | left join wx_c_user_basic_info cubi on o.c_user_id=cubi.id | ||||