新增免押相关接口

This commit is contained in:
2025-09-26 01:45:44 +08:00
parent cefafddf5a
commit 879678cb56
12 changed files with 211 additions and 19 deletions

View File

@ -11,6 +11,7 @@ import lombok.Getter;
@AllArgsConstructor
@Getter
public enum PayStatusEnum {
INIT("INIT", "初始化"),
USERPAYING("USERPAYING", "用户支付中"),
SUCCESS("SUCCESS", "支付成功"),
PAYERROR("PAYERROR", "支付失败"),

View File

@ -11,6 +11,7 @@ import lombok.Getter;
@AllArgsConstructor
@Getter
public enum SubOrderTypeEnum {
NO_DEPOSIT("NO_DEPOSIT", "免押冻结订单"),
DEPOSIT("DEPOSIT", "押金订单"),
RENTCAR("RENTCAR", "租车订单"),
RENTBATTEY("RENTBATTEY", "租电订单"),

View File

@ -22,6 +22,13 @@ public interface OrderService {
*/
RentCarOrderResultDTO submitRentCarOrder(RentCarOrderReq rentCarOrderReq);
/**
* 免押下单
* @param rentCarOrderReq
* @return
*/
RentCarOrderResultDTO depositFreeSubmitRentCarOrder(RentCarOrderReq rentCarOrderReq);
/**
* 续租车
* @param rentCarOrderReq

View File

@ -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<OrderSubPO> 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<OrderSubPO> 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){

View File

@ -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; // 状态码
}

View File

@ -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; // 状态码
}

View File

@ -62,4 +62,7 @@ public class UnifiedPaymentInfoDTO {
@ApiModelProperty(value = "支付宝交易号")
private String tradeNo; // 支付宝交易号
@ApiModelProperty(value = "支付宝芝麻信用免押支付串(用于前端调起支付)")
private String orderStr;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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("完成免押冻结失败");
}
}
}