From 879678cb56a53e85f94c115dda0a5c1ce8ab84d4 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Fri, 26 Sep 2025 01:45:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=8D=E6=8A=BC=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/common/enums/PayStatusEnum.java | 1 + .../order/common/enums/SubOrderTypeEnum.java | 1 + .../com/sczx/order/service/OrderService.java | 7 ++ .../order/service/impl/OrderServiceImpl.java | 48 +++++++++----- .../dto/AlipayFundFreezeResponse.java | 14 ++++ .../dto/AlipayQueryFreezeResponse.java | 14 ++++ .../thirdpart/dto/UnifiedPaymentInfoDTO.java | 3 + .../dto/req/AlipayFinishFreezeRequest.java | 19 ++++++ .../dto/req/AlipayFundFreezeRequest.java | 13 ++++ .../dto/req/AlipayQueryFreezeRequest.java | 12 ++++ .../order/thirdpart/facade/PayFacade.java | 33 ++++++++-- .../order/thirdpart/integration/PayInteg.java | 65 +++++++++++++++++++ 12 files changed, 211 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/sczx/order/thirdpart/dto/AlipayFundFreezeResponse.java create mode 100644 src/main/java/com/sczx/order/thirdpart/dto/AlipayQueryFreezeResponse.java create mode 100644 src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFinishFreezeRequest.java create mode 100644 src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFundFreezeRequest.java create mode 100644 src/main/java/com/sczx/order/thirdpart/dto/req/AlipayQueryFreezeRequest.java diff --git a/src/main/java/com/sczx/order/common/enums/PayStatusEnum.java b/src/main/java/com/sczx/order/common/enums/PayStatusEnum.java index 2c4ffb5..fab8b91 100644 --- a/src/main/java/com/sczx/order/common/enums/PayStatusEnum.java +++ b/src/main/java/com/sczx/order/common/enums/PayStatusEnum.java @@ -11,6 +11,7 @@ import lombok.Getter; @AllArgsConstructor @Getter public enum PayStatusEnum { + INIT("INIT", "初始化"), USERPAYING("USERPAYING", "用户支付中"), SUCCESS("SUCCESS", "支付成功"), PAYERROR("PAYERROR", "支付失败"), diff --git a/src/main/java/com/sczx/order/common/enums/SubOrderTypeEnum.java b/src/main/java/com/sczx/order/common/enums/SubOrderTypeEnum.java index f41f13d..ad69ef6 100644 --- a/src/main/java/com/sczx/order/common/enums/SubOrderTypeEnum.java +++ b/src/main/java/com/sczx/order/common/enums/SubOrderTypeEnum.java @@ -11,6 +11,7 @@ import lombok.Getter; @AllArgsConstructor @Getter public enum SubOrderTypeEnum { + NO_DEPOSIT("NO_DEPOSIT", "免押冻结订单"), DEPOSIT("DEPOSIT", "押金订单"), RENTCAR("RENTCAR", "租车订单"), RENTBATTEY("RENTBATTEY", "租电订单"), diff --git a/src/main/java/com/sczx/order/service/OrderService.java b/src/main/java/com/sczx/order/service/OrderService.java index 54acab0..6cbc576 100644 --- a/src/main/java/com/sczx/order/service/OrderService.java +++ b/src/main/java/com/sczx/order/service/OrderService.java @@ -22,6 +22,13 @@ public interface OrderService { */ RentCarOrderResultDTO submitRentCarOrder(RentCarOrderReq rentCarOrderReq); + /** + * 免押下单 + * @param rentCarOrderReq + * @return + */ + RentCarOrderResultDTO depositFreeSubmitRentCarOrder(RentCarOrderReq rentCarOrderReq); + /** * 续租车 * @param rentCarOrderReq diff --git a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java index 00aa2d4..b122a61 100644 --- a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java @@ -18,6 +18,7 @@ import com.sczx.order.service.OrderService; import com.sczx.order.service.PayService; import com.sczx.order.thirdpart.dto.*; import com.sczx.order.thirdpart.dto.req.AlipayCloseRequest; +import com.sczx.order.thirdpart.dto.req.AlipayFundFreezeRequest; import com.sczx.order.thirdpart.dto.req.CarQueryConditionReq; import com.sczx.order.thirdpart.integration.CarInteg; import com.sczx.order.thirdpart.integration.PayInteg; @@ -143,9 +144,7 @@ public class OrderServiceImpl implements OrderService { OrderMainPO orderMainPO = OrderConvert.INSTANCE.subOrderToPo(rentCarOrderReq, userInfoDTO, rentCarRuleDTO); orderMainPO.setOperatorId(Long.valueOf(companyStoreDTO.getOperatingCompanyId())); orderMainPO.setOrderNo(OrderUtil.generateOrderNo()); - //TODO 默认应该是待支付状态,这里先默认支付完成待取车 orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PAY.getCode()); -// orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PICK.getCode()); orderMainPO.setFirstOrderTime(LocalDateTime.now()); //设置预计还车时间 @@ -238,6 +237,11 @@ public class OrderServiceImpl implements OrderService { } } + @Override + public RentCarOrderResultDTO depositFreeSubmitRentCarOrder(RentCarOrderReq rentCarOrderReq) { + //TODO - 免押冻结 + return null; + } @Transactional(rollbackFor = Exception.class) @@ -394,23 +398,37 @@ public class OrderServiceImpl implements OrderService { LambdaQueryWrapper orderSubQueryWrapper = new LambdaQueryWrapper<>(); orderSubQueryWrapper.eq(OrderSubPO::getOrderId, orderMainPO.getOrderId()); - orderSubQueryWrapper.eq(OrderSubPO::getPayStatus, PayStatusEnum.USERPAYING.getCode()); - orderSubQueryWrapper.orderByDesc(OrderSubPO::getCreatedAt).last(" limit 1"); - OrderSubPO orderSubPO = orderSubRepo.getOne(orderSubQueryWrapper); + orderSubQueryWrapper.in(OrderSubPO::getPayStatus, Arrays.asList(PayStatusEnum.USERPAYING.getCode(), PayStatusEnum.INIT.getCode())); + orderSubQueryWrapper.orderByDesc(OrderSubPO::getCreatedAt); + List orderSubPOList = orderSubRepo.list(orderSubQueryWrapper); boolean closePayOrder = false; //获取门店信息 CompanyStoreDTO companyStoreDTO = storeInteg.getStoreById(Integer.valueOf(orderMainPO.getStoreId().toString())); - + OrderSubPO rentOrder = orderSubPOList.stream().filter(orderSubPO -> StringUtils.equalsIgnoreCase(orderSubPO.getSuborderType(), SubOrderTypeEnum.RENTCAR.getCode())).findFirst().orElse( new OrderSubPO()); //关闭支付单 - if(StringUtils.equalsIgnoreCase(orderSubPO.getPaymentMethod(), PaymentTypeEnum.WX_PAY.getCode())){ - log.info("开始关闭支付单"); - closePayOrder = payInteg.closeOrder(Long.valueOf(companyStoreDTO.getOperatingCompanyId()), orderSubPO.getPaymentId()); - } else if(StringUtils.equalsIgnoreCase(orderSubPO.getPaymentMethod(), PaymentTypeEnum.ZFB_PAY.getCode())){ - log.info("开始关闭支付宝支付单"); - AlipayCloseRequest alipayCloseRequest = new AlipayCloseRequest(); - alipayCloseRequest.setCompanyId(Long.valueOf(companyStoreDTO.getOperatingCompanyId())); - alipayCloseRequest.setOutTradeNo(orderSubPO.getPaymentId()); - closePayOrder = payInteg.alipayCloseOrder(alipayCloseRequest); + if(StringUtils.equalsIgnoreCase(rentOrder.getPaymentMethod(), PaymentTypeEnum.WX_PAY.getCode())){ + log.info("开始关闭微信租车支付单"); + closePayOrder = payInteg.closeOrder(Long.valueOf(companyStoreDTO.getOperatingCompanyId()), rentOrder.getPaymentId()); + } else if(StringUtils.equalsIgnoreCase(rentOrder.getPaymentMethod(), PaymentTypeEnum.ZFB_PAY.getCode())){ + + if(orderMainPO.getIsDepositFree()){ + OrderSubPO noDepositOrder = orderSubPOList.stream().filter(orderSubPO -> StringUtils.equalsIgnoreCase(orderSubPO.getSuborderType(), SubOrderTypeEnum.NO_DEPOSIT.getCode())).findFirst().orElse(null); + if(Objects.nonNull(noDepositOrder)){ + log.info("开始取消支付宝押金冻结支付单"); + AlipayFundFreezeRequest fundFreezeRequest = new AlipayFundFreezeRequest(); + fundFreezeRequest.setCompanyId(companyStoreDTO.getOperatingCompanyId().toString()); + fundFreezeRequest.setOutOrderNo(noDepositOrder.getPaymentId()); + closePayOrder = payInteg.cancelFundFreeze(fundFreezeRequest); + } + } + if(StringUtils.equalsIgnoreCase(rentOrder.getPayStatus(), PayStatusEnum.USERPAYING.getCode())){ + log.info("开始关闭支付宝租车支付单"); + AlipayCloseRequest alipayCloseRequest = new AlipayCloseRequest(); + alipayCloseRequest.setCompanyId(Long.valueOf(companyStoreDTO.getOperatingCompanyId())); + alipayCloseRequest.setOutTradeNo(rentOrder.getPaymentId()); + closePayOrder = payInteg.alipayCloseOrder(alipayCloseRequest); + } + } if(closePayOrder){ diff --git a/src/main/java/com/sczx/order/thirdpart/dto/AlipayFundFreezeResponse.java b/src/main/java/com/sczx/order/thirdpart/dto/AlipayFundFreezeResponse.java new file mode 100644 index 0000000..c0c23a1 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/AlipayFundFreezeResponse.java @@ -0,0 +1,14 @@ +package com.sczx.order.thirdpart.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("支付宝资金冻结响应参数") +@Data +public class AlipayFundFreezeResponse { + private boolean success; + private String message; + private String outTradeNo; // 商户订单号 + private String orderStr; // 支付串(用于前端调起支付) + private String code; // 状态码 +} diff --git a/src/main/java/com/sczx/order/thirdpart/dto/AlipayQueryFreezeResponse.java b/src/main/java/com/sczx/order/thirdpart/dto/AlipayQueryFreezeResponse.java new file mode 100644 index 0000000..9163ed8 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/AlipayQueryFreezeResponse.java @@ -0,0 +1,14 @@ +package com.sczx.order.thirdpart.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("支付宝资金冻结响应参数") +@Data +public class AlipayQueryFreezeResponse { + private boolean success; + private String message; + private String outTradeNo; // 商户订单号 + private String authNo; // 支付串(用于前端调起支付) + private String code; // 状态码 +} diff --git a/src/main/java/com/sczx/order/thirdpart/dto/UnifiedPaymentInfoDTO.java b/src/main/java/com/sczx/order/thirdpart/dto/UnifiedPaymentInfoDTO.java index 0a13f5d..482840f 100644 --- a/src/main/java/com/sczx/order/thirdpart/dto/UnifiedPaymentInfoDTO.java +++ b/src/main/java/com/sczx/order/thirdpart/dto/UnifiedPaymentInfoDTO.java @@ -62,4 +62,7 @@ public class UnifiedPaymentInfoDTO { @ApiModelProperty(value = "支付宝交易号") private String tradeNo; // 支付宝交易号 + + @ApiModelProperty(value = "支付宝芝麻信用免押支付串(用于前端调起支付)") + private String orderStr; } diff --git a/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFinishFreezeRequest.java b/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFinishFreezeRequest.java new file mode 100644 index 0000000..1900013 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFinishFreezeRequest.java @@ -0,0 +1,19 @@ +package com.sczx.order.thirdpart.dto.req; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("支付宝资金冻结请求参数") +@Data +public class AlipayFinishFreezeRequest { + private String companyId; + @ApiModelProperty(value = "支付宝资金授权订单号") + private String authNo; + + @ApiModelProperty(value = "解冻请求流水号") + private String outRequestNo; + + @ApiModelProperty(value = "解冻金额") + private String amount; +} diff --git a/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFundFreezeRequest.java b/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFundFreezeRequest.java new file mode 100644 index 0000000..e2bdec5 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayFundFreezeRequest.java @@ -0,0 +1,13 @@ +package com.sczx.order.thirdpart.dto.req; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("支付宝资金冻结请求参数") +@Data +public class AlipayFundFreezeRequest { + private String companyId; + private String outOrderNo; + private String title; + private String amount; +} diff --git a/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayQueryFreezeRequest.java b/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayQueryFreezeRequest.java new file mode 100644 index 0000000..f9f80b8 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/req/AlipayQueryFreezeRequest.java @@ -0,0 +1,12 @@ +package com.sczx.order.thirdpart.dto.req; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@ApiModel("支付宝资金冻结请求参数") +@Data +public class AlipayQueryFreezeRequest { + private String companyId; + private String outOrderNo; + private String operationType; +} diff --git a/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java b/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java index ec930e5..6acad88 100644 --- a/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java +++ b/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java @@ -1,9 +1,6 @@ package com.sczx.order.thirdpart.facade; -import com.sczx.order.thirdpart.dto.AlipayCreateResponse; -import com.sczx.order.thirdpart.dto.AlipayQueryResponse; -import com.sczx.order.thirdpart.dto.AlipayResponse; -import com.sczx.order.thirdpart.dto.PaymentResponse; +import com.sczx.order.thirdpart.dto.*; import com.sczx.order.thirdpart.dto.req.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -86,4 +83,32 @@ public interface PayFacade { */ @PostMapping("/api/alipay/refundQuery") AlipayResponse alipayRefundQuery(@RequestBody AlipayRefundRequest request); + + /** + * 冻结接口 + */ + @PostMapping("/api/authAlipay/fundFreeze") + AlipayFundFreezeResponse fundFreeze(@RequestBody AlipayFundFreezeRequest request); + + /** + * 取消冻结 + */ + @PostMapping("/api/authAlipay/cancelFundFreeze") + AlipayFundFreezeResponse cancelFundFreeze(@RequestBody AlipayFundFreezeRequest request); + + /** + * 查询冻结 + * @param alipayQueryFreezeRequest + * @return + */ + @PostMapping("/api/authAlipay/queryFundFreeze") + AlipayQueryFreezeResponse queryFundFreeze(@RequestBody AlipayQueryFreezeRequest alipayQueryFreezeRequest); + + /** + * 完结冻结 + * @param alipayFinishFreezeRequest + * @return + */ + @PostMapping("/api/authAlipay/finishFreeze") + AlipayResponse finishFreeze(@RequestBody AlipayFinishFreezeRequest alipayFinishFreezeRequest); } diff --git a/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java b/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java index f204ae6..e1f8f88 100644 --- a/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java +++ b/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java @@ -220,4 +220,69 @@ public class PayInteg { throw new InnerException("支付宝查询退款失败"); } } + + /** + * 免押冻结 + */ + public AlipayFundFreezeResponse fundFreeze(AlipayFundFreezeRequest request) { + try { + AlipayFundFreezeResponse result = payFacade.fundFreeze( request); + if(StringUtils.isNotBlank(result.getCode()) && "SUCCESS".equals(result.getCode())){ + return result; + } else { + throw new InnerException("免押冻结失败"); + } + } catch (Exception e){ + log.error("免押冻结失败",e); + throw new InnerException("免押冻结失败"); + } + } + + /** + * 取消冻结 + */ + + public boolean cancelFundFreeze(AlipayFundFreezeRequest request) { + try { + AlipayFundFreezeResponse result = payFacade.cancelFundFreeze( request); + if(StringUtils.isNotBlank(result.getCode()) && "SUCCESS".equals(result.getCode())){ + return true; + } else { + throw new InnerException("取消免押冻结失败"); + } + } catch (Exception e){ + log.error("取消免押冻结失败",e); + throw new InnerException("取消免押冻结失败"); + } + } + + + public AlipayQueryFreezeResponse queryFundFreeze(AlipayQueryFreezeRequest alipayQueryFreezeRequest) { + try { + AlipayQueryFreezeResponse result = payFacade.queryFundFreeze( alipayQueryFreezeRequest); + if(StringUtils.isNotBlank(result.getCode()) && "SUCCESS".equals(result.getCode())){ + return result; + } else { + throw new InnerException("查询免押冻结失败"); + } + } catch (Exception e){ + log.error("查询免押押冻结失败",e); + throw new InnerException("查询免押冻结失败"); + } + } + + + public AlipayResponse finishFreeze(AlipayFinishFreezeRequest alipayFinishFreezeRequest) { + try { + AlipayResponse result = payFacade.finishFreeze(alipayFinishFreezeRequest); + if(StringUtils.isNotBlank(result.getCode()) && "SUCCESS".equals(result.getCode())){ + return result; + } else { + throw new InnerException("完成免押冻结失败"); + } + } catch (Exception e){ + log.error("完成免押押冻结失败",e); + throw new InnerException("完成免押冻结失败"); + } + } }