From 121598e13ce1550bdf479811461926975a4ec7f9 Mon Sep 17 00:00:00 2001 From: terrfly Date: Tue, 25 Jan 2022 16:58:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=86=E8=B4=A6MQ=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=87=8D=E6=96=B0=E5=8F=91=E8=B5=B7=E5=88=86=E8=B4=A6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mq/model/PayOrderDivisionMQ.java | 10 ++- .../PayOrderDivisionRecordController.java | 31 ++++++++ .../PayOrderDivisionExecController.java | 2 +- .../pay/mq/PayOrderDivisionMQReceiver.java | 2 +- .../PayOrderDivisionProcessService.java | 77 +++++++++++-------- .../impl/PayOrderDivisionRecordService.java | 31 ++++++++ 6 files changed, 120 insertions(+), 33 deletions(-) diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderDivisionMQ.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderDivisionMQ.java index 121696b..f756dc7 100644 --- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderDivisionMQ.java +++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderDivisionMQ.java @@ -64,6 +64,9 @@ public class PayOrderDivisionMQ extends AbstractMQ { * **/ private List receiverList; + /** 是否重新发送 ( 如分账失败,重新请求分账接口 ) , 空表示false **/ + private Boolean isResend; + } @Override @@ -84,7 +87,12 @@ public class PayOrderDivisionMQ extends AbstractMQ { /** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/ public static PayOrderDivisionMQ build(String payOrderId, Byte useSysAutoDivisionReceivers, List receiverList){ - return new PayOrderDivisionMQ(new MsgPayload(payOrderId, useSysAutoDivisionReceivers, receiverList)); + return new PayOrderDivisionMQ(new MsgPayload(payOrderId, useSysAutoDivisionReceivers, receiverList, false)); + } + + /** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/ + public static PayOrderDivisionMQ build(String payOrderId, Byte useSysAutoDivisionReceivers, List receiverList, Boolean isResend){ + return new PayOrderDivisionMQ(new MsgPayload(payOrderId, useSysAutoDivisionReceivers, receiverList, isResend)); } /** 解析MQ消息, 一般用于接收MQ消息时 **/ diff --git a/jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/division/PayOrderDivisionRecordController.java b/jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/division/PayOrderDivisionRecordController.java index ec675ed..f429c22 100644 --- a/jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/division/PayOrderDivisionRecordController.java +++ b/jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/division/PayOrderDivisionRecordController.java @@ -18,6 +18,8 @@ package com.jeequan.jeepay.mch.ctrl.division; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.jeequan.jeepay.components.mq.model.PayOrderDivisionMQ; +import com.jeequan.jeepay.components.mq.vender.IMQSender; import com.jeequan.jeepay.core.constants.ApiCodeEnum; import com.jeequan.jeepay.core.entity.PayOrder; import com.jeequan.jeepay.core.entity.PayOrderDivisionRecord; @@ -45,6 +47,7 @@ import org.springframework.web.bind.annotation.RestController; public class PayOrderDivisionRecordController extends CommonCtrl { @Autowired private PayOrderDivisionRecordService payOrderDivisionRecordService; + @Autowired private IMQSender mqSender; /** list */ @@ -112,4 +115,32 @@ public class PayOrderDivisionRecordController extends CommonCtrl { return ApiRes.ok(record); } + + + /** 分账接口重试 */ + @PreAuthorize("hasAuthority( 'ENT_DIVISION_RECORD_RESEND' )") + @RequestMapping(value="/resend/{recordId}", method = RequestMethod.POST) + public ApiRes resend(@PathVariable("recordId") Long recordId) { + PayOrderDivisionRecord record = payOrderDivisionRecordService + .getOne(PayOrderDivisionRecord.gw() + .eq(PayOrderDivisionRecord::getMchNo, getCurrentMchNo()) + .eq(PayOrderDivisionRecord::getRecordId, recordId)); + if (record == null) { + throw new BizException(ApiCodeEnum.SYS_OPERATION_FAIL_SELETE); + } + + if(record.getState() != PayOrderDivisionRecord.STATE_FAIL){ + throw new BizException("请选择失败的分账记录"); + } + + // 更新订单状态 & 记录状态 + payOrderDivisionRecordService.updateResendState(record.getPayOrderId()); + + // 重发到MQ + mqSender.send(PayOrderDivisionMQ.build(record.getPayOrderId(), null, null, true)); + + return ApiRes.ok(record); + } + + } diff --git a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java index 5f27674..18f9b47 100644 --- a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java +++ b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java @@ -102,7 +102,7 @@ public class PayOrderDivisionExecController extends ApiController { } //处理分账请求 - ChannelRetMsg channelRetMsg = payOrderDivisionProcessService.processPayOrderDivision(bizRQ.getPayOrderId(), bizRQ.getUseSysAutoDivisionReceivers(), receiverList); + ChannelRetMsg channelRetMsg = payOrderDivisionProcessService.processPayOrderDivision(bizRQ.getPayOrderId(), bizRQ.getUseSysAutoDivisionReceivers(), receiverList, false); PayOrderDivisionExecRS bizRS = new PayOrderDivisionExecRS(); bizRS.setState(channelRetMsg.getChannelState() == ChannelRetMsg.ChannelState.CONFIRM_SUCCESS ? PayOrderDivisionRecord.STATE_SUCCESS : PayOrderDivisionRecord.STATE_FAIL); diff --git a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/PayOrderDivisionMQReceiver.java b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/PayOrderDivisionMQReceiver.java index 0cffe8e..187c20b 100644 --- a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/PayOrderDivisionMQReceiver.java +++ b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/PayOrderDivisionMQReceiver.java @@ -39,7 +39,7 @@ public class PayOrderDivisionMQReceiver implements PayOrderDivisionMQ.IMQReceive try { log.info("接收订单分账通知MQ, msg={}", payload.toString()); - payOrderDivisionProcessService.processPayOrderDivision(payload.getPayOrderId(), payload.getUseSysAutoDivisionReceivers(), payload.getReceiverList()); + payOrderDivisionProcessService.processPayOrderDivision(payload.getPayOrderId(), payload.getUseSysAutoDivisionReceivers(), payload.getReceiverList(), payload.getIsResend()); }catch (Exception e) { log.error(e.getMessage(), e); diff --git a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderDivisionProcessService.java b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderDivisionProcessService.java index f63469e..c9f156c 100644 --- a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderDivisionProcessService.java +++ b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderDivisionProcessService.java @@ -72,7 +72,13 @@ public class PayOrderDivisionProcessService { * @site https://www.jeequan.com * @date 2021/8/27 9:44 */ - public ChannelRetMsg processPayOrderDivision(String payOrderId, Byte useSysAutoDivisionReceivers, List receiverList) { + public ChannelRetMsg processPayOrderDivision(String payOrderId, Byte useSysAutoDivisionReceivers, List receiverList, Boolean isResend) { + + // 是否重发分账接口( 当分账失败, 列表允许再次发送请求 ) + if(isResend == null){ + isResend = false; + } + String logPrefix = "订单["+payOrderId+"]执行分账"; @@ -104,38 +110,49 @@ public class PayOrderDivisionProcessService { throw new BizException("更新支付订单为分账处理中异常"); } - // 查询&过滤 所有的分账接收对象 - List allReceiver = this.queryReceiver(useSysAutoDivisionReceivers, payOrder, receiverList); - //得到全部分账比例 (所有待分账账号的分账比例总和) - BigDecimal allDivisionProfit = BigDecimal.ZERO; - for (MchDivisionReceiver receiver : allReceiver) { - allDivisionProfit = allDivisionProfit.add(receiver.getDivisionProfit()); + // 所有的分账列表 + List recordList = null; + + // 重发通知,可直接查库 + if(isResend){ + recordList = payOrderDivisionRecordService.list(PayOrderDivisionRecord.gw().eq(PayOrderDivisionRecord::getPayOrderId, payOrderId)); + }else{ + + // 查询&过滤 所有的分账接收对象 + List allReceiver = this.queryReceiver(useSysAutoDivisionReceivers, payOrder, receiverList); + + //得到全部分账比例 (所有待分账账号的分账比例总和) + BigDecimal allDivisionProfit = BigDecimal.ZERO; + for (MchDivisionReceiver receiver : allReceiver) { + allDivisionProfit = allDivisionProfit.add(receiver.getDivisionProfit()); + } + + //计算分账金额 = 商家实际入账金额 + Long payOrderDivisionAmount = payOrderService.calMchIncomeAmount(payOrder); + + //剩余待分账金额 (用作最后一个分账账号的 计算, 避免出现分账金额超出最大) [结果向下取整 , 避免出现金额溢出的情况。 ] + Long subDivisionAmount = AmountUtil.calPercentageFee(payOrderDivisionAmount, allDivisionProfit, BigDecimal.ROUND_FLOOR); + + recordList = new ArrayList<>(); + + //计算订单分账金额, 并插入到记录表 + + String batchOrderId = SeqKit.genDivisionBatchId(); + + for (MchDivisionReceiver receiver : allReceiver) { + + PayOrderDivisionRecord record = genRecord(batchOrderId, payOrder, receiver, payOrderDivisionAmount, subDivisionAmount); + + //剩余金额 + subDivisionAmount = subDivisionAmount - record.getCalDivisionAmount(); + + //入库保存 + payOrderDivisionRecordService.save(record); + recordList.add(record); + } } - //计算分账金额 = 商家实际入账金额 - Long payOrderDivisionAmount = payOrderService.calMchIncomeAmount(payOrder); - - //剩余待分账金额 (用作最后一个分账账号的 计算, 避免出现分账金额超出最大) [结果向下取整 , 避免出现金额溢出的情况。 ] - Long subDivisionAmount = AmountUtil.calPercentageFee(payOrderDivisionAmount, allDivisionProfit, BigDecimal.ROUND_FLOOR); - - List recordList = new ArrayList<>(); - - //计算订单分账金额, 并插入到记录表 - - String batchOrderId = SeqKit.genDivisionBatchId(); - - for (MchDivisionReceiver receiver : allReceiver) { - - PayOrderDivisionRecord record = genRecord(batchOrderId, payOrder, receiver, payOrderDivisionAmount, subDivisionAmount); - - //剩余金额 - subDivisionAmount = subDivisionAmount - record.getCalDivisionAmount(); - - //入库保存 - payOrderDivisionRecordService.save(record); - recordList.add(record); - } ChannelRetMsg channelRetMsg = null; diff --git a/jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderDivisionRecordService.java b/jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderDivisionRecordService.java index 2afdf5f..239a2bb 100644 --- a/jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderDivisionRecordService.java +++ b/jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderDivisionRecordService.java @@ -1,9 +1,14 @@ package com.jeequan.jeepay.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jeequan.jeepay.core.entity.PayOrder; import com.jeequan.jeepay.core.entity.PayOrderDivisionRecord; +import com.jeequan.jeepay.core.exception.BizException; import com.jeequan.jeepay.service.mapper.PayOrderDivisionRecordMapper; +import com.jeequan.jeepay.service.mapper.PayOrderMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -19,6 +24,8 @@ import java.util.List; @Service public class PayOrderDivisionRecordService extends ServiceImpl { + @Autowired private PayOrderMapper payOrderMapper; + /** 更新分账记录为分账成功**/ public void updateRecordSuccessOrFail(List records, Byte state, String channelBatchOrderId, String channelRespResult){ @@ -38,8 +45,32 @@ public class PayOrderDivisionRecordService extends ServiceImpl