From 8df08d1ff168d97ec4201758f9ab2dd96e86dcc8 Mon Sep 17 00:00:00 2001 From: Hawking Date: Wed, 31 May 2023 23:13:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=9B=9E=E8=B0=83=E8=B0=83?= =?UTF-8?q?=E6=95=B4:=20=E5=8E=9F=E9=80=BB=E8=BE=91:=20=E5=8D=95=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E5=85=B3=E8=81=94payment=5Fid,=E5=BD=93=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=8D=95=E5=8F=91=E8=B5=B7=E4=BA=86=E5=A4=9A=E6=AC=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=97=B6,=E4=BC=9A=E9=80=A0=E6=88=90?= =?UTF-8?q?=E6=B7=B7=E4=B9=B1.=20=E7=8E=B0=E6=9B=B4=E6=94=B9=E4=B8=BA:=20?= =?UTF-8?q?=E7=94=B1=E6=94=AF=E4=BB=98=E6=88=90=E5=8A=9F=E7=9A=84payment?= =?UTF-8?q?=E5=9C=A8=E5=9B=9E=E8=B0=83=E6=97=B6=E9=80=9A=E8=BF=87payment?= =?UTF-8?q?=5Frelation=E8=A1=A8=E6=89=BE=E5=88=B0=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=B9=B6=E5=85=B3=E8=81=94.=201.=20Financial?= =?UTF-8?q?Master:=20=E4=BF=9D=E5=AD=98paymentId,=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=8A=B6=E6=80=81;=202.=20FinancialChange:?= =?UTF-8?q?=20=E4=BF=9D=E5=AD=98paymentId,=E6=9B=B4=E6=96=B0=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E7=8A=B6=E6=80=81,=E5=B9=B6=E6=8A=8A=E9=87=91?= =?UTF-8?q?=E9=A2=9D=E5=8A=A0=E5=88=B0FinancialDetail=E4=B8=8EFinancialMas?= =?UTF-8?q?ter=E9=87=8C;=203.=20OrderAddSubtract:=20=E4=BF=9D=E5=AD=98paym?= =?UTF-8?q?entId,=E6=9B=B4=E6=96=B0=E6=94=AF=E4=BB=98=E7=8A=B6=E6=80=81,?= =?UTF-8?q?=E5=B9=B6=E6=8A=8A=E9=87=91=E9=A2=9D=E5=8A=A0=E5=88=B0Financial?= =?UTF-8?q?Detail=E4=B8=8EFinancialMaster=E9=87=8C;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/callback/PayCallbackService.java | 153 ++++++++++-------- .../order/mapper/OrderAddSubtractMapper.java | 9 +- .../service/IOrderAddSubtractService.java | 28 ++++ .../impl/OrderAddSubtractServiceImpl.java | 46 ++++++ .../mapper/order/OrderAddSubtractMapper.xml | 7 + .../ghy/payment/domain/PaymentRelation.java | 5 + .../mapper/FinancialChangeRecordMapper.java | 2 + .../payment/mapper/FinancialMasterMapper.java | 2 + .../service/FinancialChangeRecordService.java | 10 ++ .../service/FinancialMasterService.java | 12 +- .../FinancialChangeRecordServiceImpl.java | 5 + .../impl/FinancialMasterServiceImpl.java | 5 + .../financial/FinancialChangeRecordMapper.xml | 8 + .../financial/FinancialMasterMapper.xml | 8 + 14 files changed, 226 insertions(+), 74 deletions(-) create mode 100644 ghy-order/src/main/java/com/ghy/order/service/IOrderAddSubtractService.java create mode 100644 ghy-order/src/main/java/com/ghy/order/service/impl/OrderAddSubtractServiceImpl.java diff --git a/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java b/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java index 08fac14b..94fa64d6 100644 --- a/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java +++ b/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java @@ -7,20 +7,22 @@ import com.ghy.common.adapay.model.Event; import com.ghy.common.adapay.model.PayCallback; import com.ghy.common.adapay.model.PaymentDTO; import com.ghy.common.enums.PayStatus; +import com.ghy.order.domain.OrderAddSubtract; +import com.ghy.order.service.IOrderAddSubtractService; import com.ghy.payment.domain.FinancialChangeRecord; import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; +import com.ghy.payment.domain.PaymentRelation; +import com.ghy.payment.mapper.PaymentRelationMapper; import com.ghy.payment.service.CallBackService; import com.ghy.payment.service.FinancialChangeRecordService; import com.ghy.payment.service.FinancialDetailService; import com.ghy.payment.service.FinancialMasterService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; -import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -30,106 +32,117 @@ import java.util.concurrent.CompletableFuture; * * @author HH 2022/5/31 */ +@Slf4j @Service("payCallbackService") public class PayCallbackService implements CallBackService { - private static final Logger logger = LoggerFactory.getLogger(PayCallbackService.class); - @Resource FinancialMasterService financialMasterService; - + @Resource + PaymentRelationMapper paymentRelationMapper; @Resource FinancialDetailService financialDetailService; - + @Resource + IOrderAddSubtractService orderAddSubtractService; @Resource FinancialChangeRecordService financialChangeRecordService; @Override - @Transactional(rollbackFor = Exception.class) public void onCallback(Event event) { - logger.info("支付回调: {}", event); + log.info("支付回调: {}", event); String data = event.getData(); PayCallback payment = JSON.parseObject(data, PayCallback.class); PaymentDTO dto = financialMasterService.selectPaymentById(payment.getId()); - // 校验是否是本系统发出去的支付请求 - if (dto != null) { - CompletableFuture.runAsync(() -> { - // 异步更新交易记录 避免被回滚 - PaymentDTO param = new PaymentDTO(); - param.setId(payment.getId()); + // 支付ID + final String paymentId = dto.getId(); + // 是否支付成功 + final boolean succeeded = AdapayStatusEnum.succeeded.code.equals(payment.getStatus()); + + // 异步更新交易记录 避免被其它业务异常回滚 + CompletableFuture.runAsync(() -> { + PaymentDTO param = new PaymentDTO(); + param.setId(payment.getId()); + param.setStatus(payment.getStatus()); + if (succeeded) { + // 如果支付成功 更新支付渠道、支付时间、手续费 + param.setPayChannel(payment.getPayChannel()); param.setFeeAmt(payment.getFeeAmt()); - param.setStatus(payment.getStatus()); param.setPayTime(LocalDateTime.now()); - financialMasterService.updatePayment(param); - }); - if (AdapayStatusEnum.succeeded.code.equals(payment.getStatus())) { - if (payment.getOrderNo().split("_").length > 2) { - // 支付回调中的加价记录ID - String fcrIdStr = payment.getOrderNo().split("_")[1]; - String[] fcrIds = fcrIdStr.split(","); + if ("delay".equals(dto.getPayMode())) { + // 如果支付成功 且是延迟分账模式 更新可用金额=交易金额 + param.setAvailableAmt(dto.getPayAmt()); + } + } + financialMasterService.updatePayment(param); + }); - BigDecimal totalChangeMoney = BigDecimal.ZERO; - Long financialMasterId = null; - for (String fcrId : fcrIds) { - FinancialChangeRecord financialChangeRecord = new FinancialChangeRecord(); - financialChangeRecord.setId(Long.valueOf(fcrId)); - financialChangeRecord.setPayStatus(1); - // 加价的支付paymentId回填到remark - financialChangeRecord.setRemark(payment.getId()); - financialChangeRecord.setRemark(payment.getId()); - financialChangeRecord.setPaymentId(payment.getId()); - financialChangeRecordService.update(financialChangeRecord); + if (succeeded) { + // 支付成功 查询支付关联的订单 + List paymentRelations = paymentRelationMapper.selectByPaymentId(paymentId); + if (CollectionUtils.isEmpty(paymentRelations)) { + log.error("未关联订单的支付回调: {}", data); + return; + } - // 修改子订单的payMoney - FinancialChangeRecord fc = financialChangeRecordService.selectFinancialChangeRecordById(financialChangeRecord.getId()); - FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(fc.getOrderDetailId()); - FinancialDetail financialDetail2Update = new FinancialDetail(); - financialDetail2Update.setId(financialDetail.getId()); - financialDetail2Update.setPayMoney(financialDetail.getPayMoney().add(fc.getChangeMoney())); - financialDetail2Update.setPayStatus(PayStatus.PAID.getCode()); - financialDetailService.updateFinancialDetail(financialDetail2Update); - totalChangeMoney = totalChangeMoney.add(fc.getChangeMoney()); - if (financialMasterId == null) { - financialMasterId = financialDetail.getFinancialMasterId(); - } - } + for (PaymentRelation relation : paymentRelations) { + Long relationId = relation.getRelationId(); + if (PaymentRelation.FINANCIAL_MASTER.equals(relation.getRelationIdType())) { + + // 更新主财务单的支付信息 + financialMasterService.updatePay(relationId, paymentId, PayStatus.PAID.getCode()); + log.info("主财务单[{}]支付成功", relationId); + + } else if (PaymentRelation.FINANCIAL_CHANGE.equals(relation.getRelationIdType())) { + + // 更新加价单的支付信息 + financialChangeRecordService.updatePay(relationId, paymentId, PayStatus.PAID.getCode()); + FinancialChangeRecord fc = financialChangeRecordService.selectFinancialChangeRecordById(relationId); + // 修改子订单的payMoney + FinancialDetail fd = financialDetailService.selectByOrderDetailId(fc.getOrderDetailId()); + FinancialDetail fd2Update = new FinancialDetail(); + fd2Update.setId(fd.getId()); + fd2Update.setPayMoney(fd.getPayMoney().add(fc.getChangeMoney())); + fd2Update.setPayStatus(PayStatus.PAID.getCode()); + financialDetailService.updateFinancialDetail(fd2Update); // 修改主单的payMoney - FinancialMaster financialMaster = financialMasterService.selectById(financialMasterId); + FinancialMaster financialMaster = financialMasterService.selectById(fd.getFinancialMasterId()); FinancialMaster financialMaster2Update = new FinancialMaster(); financialMaster2Update.setId(financialMaster.getId()); - financialMaster2Update.setPayMoney(financialMaster.getPayMoney().add(totalChangeMoney)); + financialMaster2Update.setPayMoney(financialMaster.getPayMoney().add(fc.getChangeMoney())); financialMaster2Update.setPayStatus(PayStatus.PAID.getCode()); financialMasterService.updateFinancialMaster(financialMaster2Update); - // TODO 拆分对应的分账流水 - }else { - // 主单的付款 - String masterOrderNo = payment.getOrderNo().split("_")[0]; + log.info("FinancialChange[{}]支付成功", relationId); - // 找到主单记录 - FinancialMaster param = new FinancialMaster(); - param.setOrderMasterCode(masterOrderNo); - List financialMasters = financialMasterService.selectFinancialMasterList(param); - FinancialMaster source = financialMasters.get(0); - // 更新主单paymentId 以及主单状态 + } else if (PaymentRelation.ORDER_ADD.equals(relation.getRelationIdType())) { + // 更新订单追加单的支付信息 + orderAddSubtractService.updatePay(relationId, paymentId, PayStatus.PAID.getCode()); + OrderAddSubtract orderAdd = orderAddSubtractService.selectById(relationId); + // 修改子订单的payMoney + FinancialDetail fd = financialDetailService.selectByOrderDetailId(orderAdd.getOrderDetailId()); + FinancialDetail fd2Update = new FinancialDetail(); + fd2Update.setId(fd.getId()); + fd2Update.setPayMoney(fd.getPayMoney().add(orderAdd.getMoney())); + fd2Update.setPayStatus(PayStatus.PAID.getCode()); + financialDetailService.updateFinancialDetail(fd2Update); + // 修改主单的payMoney + FinancialMaster financialMaster = financialMasterService.selectById(fd.getFinancialMasterId()); FinancialMaster financialMaster2Update = new FinancialMaster(); - financialMaster2Update.setId(source.getId()); + financialMaster2Update.setId(financialMaster.getId()); + financialMaster2Update.setPayMoney(financialMaster.getPayMoney().add(orderAdd.getMoney())); financialMaster2Update.setPayStatus(PayStatus.PAID.getCode()); - financialMaster2Update.setPaymentId(payment.getId()); financialMasterService.updateFinancialMaster(financialMaster2Update); + log.info("订单追加[{}]支付成功", relationId); + + } else { + log.error("未知的订单类型: relationIdType={}, relationId={}", relation.getRelationIdType(), relationId); } - // 更新主财务单状态 - financialMasterService.paySucceeded(payment.getId(), payment.getPayChannel()); - } else { - logger.warn("支付失败 : {}", data); } - } else { - logger.warn("系统中不存在这条交易记录: {}", event); } } @Override public void onResponse(JSONObject response) { - logger.info("发起支付 Response: {}", response.toJSONString()); + log.info("发起支付 Response: {}", response.toJSONString()); // 保存一条支付记录 PaymentDTO payment = response.toJavaObject(PaymentDTO.class); String status = payment.getStatus(); @@ -137,7 +150,7 @@ public class PayCallbackService implements CallBackService { financialMasterService.insertPayment(payment); if (!AdapayStatusEnum.succeeded.code.equals(status)) { - logger.warn("发起支付失败 : {}", response.toJSONString()); + log.warn("发起支付失败 : {}", response.toJSONString()); } } diff --git a/ghy-order/src/main/java/com/ghy/order/mapper/OrderAddSubtractMapper.java b/ghy-order/src/main/java/com/ghy/order/mapper/OrderAddSubtractMapper.java index d024feb1..2400e098 100644 --- a/ghy-order/src/main/java/com/ghy/order/mapper/OrderAddSubtractMapper.java +++ b/ghy-order/src/main/java/com/ghy/order/mapper/OrderAddSubtractMapper.java @@ -1,6 +1,7 @@ package com.ghy.order.mapper; import com.ghy.order.domain.OrderAddSubtract; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -9,13 +10,15 @@ import java.util.List; */ public interface OrderAddSubtractMapper { - int insert(OrderAddSubtract insert); + int insert(OrderAddSubtract o); - int update(OrderAddSubtract insert); + int update(OrderAddSubtract o); - List select(OrderAddSubtract insert); + List select(OrderAddSubtract o); List selectByOrderDetail(Long orderDetailId); OrderAddSubtract selectById(Long id); + + int updatePay(@Param(value = "id") Long id, @Param(value = "paymentId") String paymentId, @Param(value = "payStatus") Integer payStatus); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/IOrderAddSubtractService.java b/ghy-order/src/main/java/com/ghy/order/service/IOrderAddSubtractService.java new file mode 100644 index 00000000..04d13906 --- /dev/null +++ b/ghy-order/src/main/java/com/ghy/order/service/IOrderAddSubtractService.java @@ -0,0 +1,28 @@ +package com.ghy.order.service; + +import com.ghy.order.domain.OrderAddSubtract; + +import java.util.List; + +public interface IOrderAddSubtractService { + + int insert(OrderAddSubtract o); + + int update(OrderAddSubtract o); + + List select(OrderAddSubtract o); + + List selectByOrderDetail(Long orderDetailId); + + OrderAddSubtract selectById(Long id); + + /** + * 更新支付信息 + * + * @param id OrderAddSubtract ID + * @param paymentId 支付ID + * @param payStatus 支付状态 + * @return 1 + */ + int updatePay(Long id, String paymentId, Integer payStatus); +} diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderAddSubtractServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderAddSubtractServiceImpl.java new file mode 100644 index 00000000..7e986374 --- /dev/null +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderAddSubtractServiceImpl.java @@ -0,0 +1,46 @@ +package com.ghy.order.service.impl; + +import com.ghy.order.domain.OrderAddSubtract; +import com.ghy.order.mapper.OrderAddSubtractMapper; +import com.ghy.order.service.IOrderAddSubtractService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class OrderAddSubtractServiceImpl implements IOrderAddSubtractService { + + @Resource + private OrderAddSubtractMapper orderAddSubtractMapper; + + @Override + public int insert(OrderAddSubtract o) { + return orderAddSubtractMapper.insert(o); + } + + @Override + public int update(OrderAddSubtract o) { + return orderAddSubtractMapper.update(o); + } + + @Override + public List select(OrderAddSubtract o) { + return orderAddSubtractMapper.select(o); + } + + @Override + public List selectByOrderDetail(Long orderDetailId) { + return orderAddSubtractMapper.selectByOrderDetail(orderDetailId); + } + + @Override + public OrderAddSubtract selectById(Long id) { + return orderAddSubtractMapper.selectById(id); + } + + @Override + public int updatePay(Long id, String paymentId, Integer payStatus) { + return orderAddSubtractMapper.updatePay(id, paymentId, payStatus); + } +} diff --git a/ghy-order/src/main/resources/mapper/order/OrderAddSubtractMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderAddSubtractMapper.xml index 2619e270..e23c7f13 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderAddSubtractMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderAddSubtractMapper.xml @@ -44,6 +44,13 @@ WHERE id = #{id} + + UPDATE order_add_subtract + SET pay_status = #{payStatus}, + payment_id = #{paymentId} + WHERE id = #{id} + +