diff --git a/pom.xml b/pom.xml
index 93ec073..9367015 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,6 +92,17 @@
1.18.30
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-hystrix
+
diff --git a/src/main/java/com/sczx/pay/Application.java b/src/main/java/com/sczx/pay/Application.java
index b122ee2..19037b3 100644
--- a/src/main/java/com/sczx/pay/Application.java
+++ b/src/main/java/com/sczx/pay/Application.java
@@ -1,11 +1,14 @@
package com.sczx.pay;
+import com.sczx.pay.common.constant.SystemConstants;
import com.sczx.pay.utils.ComputerInfo;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.hystrix.EnableHystrix;
+import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.retry.annotation.EnableRetry;
@@ -17,7 +20,9 @@ import java.io.IOException;
@SpringBootApplication
@EnableDiscoveryClient // 启用服务注册与发现
@EnableRetry
+@EnableFeignClients(basePackages = SystemConstants.FEIGN_CLIENT_BASE_PACKAGE )
@EnableTransactionManagement
+@EnableHystrix
@MapperScan("com.sczx.pay.mapper") // 扫描 Mapper 接口
public class Application {
diff --git a/src/main/java/com/sczx/pay/alipay/controller/ItemOrderController.java b/src/main/java/com/sczx/pay/alipay/controller/ItemOrderController.java
new file mode 100644
index 0000000..48c8f77
--- /dev/null
+++ b/src/main/java/com/sczx/pay/alipay/controller/ItemOrderController.java
@@ -0,0 +1,32 @@
+package com.sczx.pay.alipay.controller;
+
+
+import com.alipay.api.AlipayApiException;
+import com.sczx.pay.alipay.service.RentOrderService;
+import com.sczx.pay.alipay.vo.RentOrderCreateRequest;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Api(value = "租赁订单接口", tags = "租赁订单接口")
+@Slf4j
+@RestController
+@RequestMapping("/rentorder")
+public class ItemOrderController {
+
+ @Autowired
+ private RentOrderService rentOrderService;
+
+ @ApiOperation(value = "创建租赁订单")
+ @PostMapping("/create")
+ public String rentOrderCreate(RentOrderCreateRequest request) throws AlipayApiException {
+ return rentOrderService.rentOrderCreate(request).getBody();
+
+ }
+}
diff --git a/src/main/java/com/sczx/pay/alipay/service/RentOrderService.java b/src/main/java/com/sczx/pay/alipay/service/RentOrderService.java
new file mode 100644
index 0000000..d5c2e7a
--- /dev/null
+++ b/src/main/java/com/sczx/pay/alipay/service/RentOrderService.java
@@ -0,0 +1,11 @@
+package com.sczx.pay.alipay.service;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.request.AlipayCommerceRentOrderCreateRequest;
+import com.alipay.api.response.AlipayCommerceRentOrderCreateResponse;
+import com.sczx.pay.alipay.vo.RentOrderCreateRequest;
+
+public interface RentOrderService {
+
+ AlipayCommerceRentOrderCreateResponse rentOrderCreate(RentOrderCreateRequest request) throws AlipayApiException;
+}
diff --git a/src/main/java/com/sczx/pay/alipay/service/impl/ItemServiceImpl.java b/src/main/java/com/sczx/pay/alipay/service/impl/ItemServiceImpl.java
index 5e24376..8571411 100644
--- a/src/main/java/com/sczx/pay/alipay/service/impl/ItemServiceImpl.java
+++ b/src/main/java/com/sczx/pay/alipay/service/impl/ItemServiceImpl.java
@@ -12,8 +12,6 @@ import com.sczx.pay.alipay.po.RentCommodityConfig;
import com.sczx.pay.alipay.po.RentRuleItem;
import com.sczx.pay.alipay.service.ImageUploadService;
import com.sczx.pay.alipay.service.ItemService;
-import com.sczx.pay.alipay.vo.AppItemSkuAttrVo;
-import com.sczx.pay.alipay.vo.ItemCreateRequest;
import com.sczx.pay.alipay.vo.OpenResponse;
import com.sczx.pay.mapper.RentRuleItemMapper;
import com.sczx.pay.utils.AlipayApiCallback;
@@ -587,7 +585,8 @@ public class ItemServiceImpl implements ItemService {
// 创建时段价格列表根据基础价格创建3个时段价格
List durationPriceList = new ArrayList<>();
- for(int i = 1; i < 4; i++){
+ //暂时设置为只保留一个时段价格
+ for(int i = 1; i < 2; i++){
RentCommodityConfig.DurationPrice durationPrice = new RentCommodityConfig.DurationPrice();
String val = i*100 + "";
durationPrice.setDuration(i*rentalDays+"");
@@ -601,10 +600,15 @@ public class ItemServiceImpl implements ItemService {
}
config.setDurationPriceList(durationPriceList);
rentCommodityAttr.setAttrValue(JSON.toJSONString(config));
+
+ rentCommodityAttr.setAttrKey("收货方式");
+ rentCommodityAttr.setAttrValue("到店自提");
// 根据实际情况设置
skuAttrs.add(rentCommodityAttr);
sku.setSkuAttrs(skuAttrs);
+
+
itemSkus.add(sku);
return itemSkus;
}
@@ -667,7 +671,7 @@ public class ItemServiceImpl implements ItemService {
// 创建时段价格列表根据基础价格创建3个时段价格
List durationPriceList = new ArrayList<>();
- for(int i = 1; i < 4; i++){
+ for(int i = 1; i < 2; i++){
RentCommodityConfig.DurationPrice durationPrice = new RentCommodityConfig.DurationPrice();
String val = i*100 + "";
durationPrice.setDuration(i*rentalDays+"");
diff --git a/src/main/java/com/sczx/pay/alipay/service/impl/RentOrderServiceImpl.java b/src/main/java/com/sczx/pay/alipay/service/impl/RentOrderServiceImpl.java
new file mode 100644
index 0000000..59c4abc
--- /dev/null
+++ b/src/main/java/com/sczx/pay/alipay/service/impl/RentOrderServiceImpl.java
@@ -0,0 +1,146 @@
+package com.sczx.pay.alipay.service.impl;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.domain.*;
+import com.alipay.api.request.AlipayCommerceRentOrderCreateRequest;
+import com.alipay.api.response.AlipayCommerceRentOrderCreateResponse;
+import com.sczx.pay.alipay.po.RentRuleItem;
+import com.sczx.pay.alipay.service.RentOrderService;
+import com.sczx.pay.alipay.vo.RentOrderCreateRequest;
+import com.sczx.pay.mapper.RentRuleItemMapper;
+import com.sczx.pay.thirdpart.dto.req.OrderDetailDTO;
+import com.sczx.pay.thirdpart.integration.OrderInteg;
+import com.sczx.pay.utils.AlipaySdkUtil;
+import org.mapstruct.ap.shaded.freemarker.template.utility.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+
+@Service
+public class RentOrderServiceImpl implements RentOrderService {
+
+ @Autowired
+ private AlipaySdkUtil alipaySdkUtil;
+
+ @Autowired
+ private RentRuleItemMapper rentRuleItemMapper;
+
+ @Autowired
+ private OrderInteg orderInteg;
+
+ @Override
+ public AlipayCommerceRentOrderCreateResponse rentOrderCreate(RentOrderCreateRequest reqData) throws AlipayApiException {
+
+ AlipayCommerceRentOrderCreateRequest request = new AlipayCommerceRentOrderCreateRequest();
+ AlipayCommerceRentOrderCreateModel model = new AlipayCommerceRentOrderCreateModel();
+
+ RentRuleItem rentRuleItem = rentRuleItemMapper.selectItemByOutItemId(reqData.getOutItemId());
+ OrderDetailDTO orderDetailDTO = orderInteg.getOrderDetailByOrderNo(reqData.getOutOrderid());
+
+ // 设置商户订单号
+ model.setOutOrderId(reqData.getOutOrderid());
+
+ // 设置订单类型
+ model.setOrderType(reqData.getRentType());
+
+ // 设置订单标题
+ model.setTitle(rentRuleItem.getItemDesc());
+
+ // 设置租赁订单页面地址信息
+ RentPathInfoDTO pathInfo = new RentPathInfoDTO();
+ pathInfo.setDetailPath("pages/rentGoodsDetail/index?outItemId="+reqData.getOutOrderid());
+ ArrayList serviceProtocolList = new ArrayList<>();
+ RentServiceProtocolDTO serviceProtocol = new RentServiceProtocolDTO();
+ serviceProtocol.setProtocolName("两轮电动车租赁协议");
+ serviceProtocol.setProtocolPath("pages_order/rentDeal");
+ serviceProtocolList.add(serviceProtocol);
+ model.setPathInfo(pathInfo);
+
+ model.setPathInfo(pathInfo);
+
+ // 设置订单金额信息
+ RentOrderPriceInfoDTO priceInfo = new RentOrderPriceInfoDTO();
+ // 可小于等于原订单租赁计划中buyout_price金额
+ priceInfo.setOrderPrice(orderDetailDTO.getRentalPrice().toString());
+ priceInfo.setDepositPrice(orderDetailDTO.getDepositPrice().toString());
+ model.setPriceInfo(priceInfo);
+
+ model.setSourceId(reqData.getSourceId());
+ // 设置买家支付宝用户唯一标识
+ model.setBuyerOpenId(reqData.getOpenId());
+
+ RentPlanInfoDTO planInfo = new RentPlanInfoDTO();
+ planInfo.setRentStartTime(Date.from(orderDetailDTO.getStartRentTime().atZone(ZoneId.systemDefault()).toInstant()));
+ planInfo.setRentEndTime(Date.from(orderDetailDTO.getEndRentTime().atZone(ZoneId.systemDefault()).toInstant()));
+ ArrayList planItemList = new ArrayList<>();
+ RentInstallmentInfo planItem = new RentInstallmentInfo();
+ planItem.setInstallmentNo(1L);
+ planItem.setInstallmentPrice(orderDetailDTO.getRentalPrice().toString());
+ planItem.setPlanPayTime(new Date());
+ planItemList.add(planItem);
+ planInfo.setInstallments(planItemList);
+ model.setRentPlanInfo(planInfo);
+
+ RentSignInfoDTO signInfo = new RentSignInfoDTO();
+
+ RentDeductInfoDTO deductInfo = new RentDeductInfoDTO();
+ deductInfo.setSignScene("RENT_DEDUCT");
+ deductInfo.setServiceName(rentRuleItem.getItemDesc());
+ signInfo.setRentDeductInfo(deductInfo);
+
+ RentFundAuthFreezeInfoDTO fundAuthFreezeInfo = new RentFundAuthFreezeInfoDTO();
+ //需要实现回调监听
+ fundAuthFreezeInfo.setFreezeNotifyUrl("https://www.alipay.com");
+ signInfo.setFundAuthFreezeInfo(fundAuthFreezeInfo);
+
+ //需要确认
+ RentCreditInfoDTO creditInfo = new RentCreditInfoDTO();
+ creditInfo.setZmServiceId("2025061101502300000000760095243636");
+ creditInfo.setCategoryId("RENT_PHONE");
+ signInfo.setCreditInfo(creditInfo);
+ model.setRentSignInfo(signInfo);
+
+ ArrayList goodsDetailList = new ArrayList<>();
+ RentGoodsDetailInfoDTO goodsDetail = new RentGoodsDetailInfoDTO();
+ goodsDetail.setItemName(rentRuleItem.getItemDesc());
+ goodsDetail.setOutItemId(rentRuleItem.getOutItemId());
+ goodsDetail.setOutSkuId(rentRuleItem.getOutSkuId());
+ goodsDetail.setItemCnt("1");
+ if (rentRuleItem.getRentalDays() != null) {
+ BigDecimal rentalPrice = rentRuleItem.getRentalPrice();
+ BigDecimal rentalDays = new BigDecimal(rentRuleItem.getRentalDays());
+ BigDecimal salePrice = rentalPrice.divide(rentalDays, 2, RoundingMode.HALF_UP);
+ goodsDetail.setSalePrice(salePrice.toString());
+ }else {
+ goodsDetail.setSalePrice(rentRuleItem.getRentalPrice().toString());
+ }
+ goodsDetail.setItemFineness("secondHand");
+ goodsDetail.setItemFinenessGrade("99new");
+ goodsDetail.setItemValue("5000.00");
+ goodsDetail.setRentModel("R00001");
+ goodsDetailList.add(goodsDetail);
+ model.setItemInfos(goodsDetailList);
+
+
+ //TODO 续租
+
+ RentOrderDeliveryInfoDTO deliveryInfo = new RentOrderDeliveryInfoDTO();
+ deliveryInfo.setDeliveryType("SELFPICK");
+ RentPickupShopInfoDTO pickupShopInfo = new RentPickupShopInfoDTO();
+ pickupShopInfo.setName("当前门店");
+ pickupShopInfo.setAddress("门店地址");
+ model.setDeliveryInfo(deliveryInfo);
+
+
+ request.setBizModel(model);
+ AlipayCommerceRentOrderCreateResponse response =alipaySdkUtil.execute(request);
+ return response;
+ }
+
+
+}
diff --git a/src/main/java/com/sczx/pay/alipay/vo/RentOrderCreateRequest.java b/src/main/java/com/sczx/pay/alipay/vo/RentOrderCreateRequest.java
new file mode 100644
index 0000000..0277e7b
--- /dev/null
+++ b/src/main/java/com/sczx/pay/alipay/vo/RentOrderCreateRequest.java
@@ -0,0 +1,15 @@
+package com.sczx.pay.alipay.vo;
+
+import lombok.Data;
+
+@Data
+public class RentOrderCreateRequest {
+
+ private String outOrderid;
+ private String outItemId;
+ private Long storeId;
+ private String rentType;
+ private String openId;
+ private String sourceId;
+
+}
diff --git a/src/main/java/com/sczx/pay/aspect/FacadeAspect.java b/src/main/java/com/sczx/pay/aspect/FacadeAspect.java
new file mode 100644
index 0000000..61e7d5b
--- /dev/null
+++ b/src/main/java/com/sczx/pay/aspect/FacadeAspect.java
@@ -0,0 +1,54 @@
+package com.sczx.pay.aspect;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author Huang Kai
+ * @Date 2023/1/18 17:01
+ * @Version 1.0
+ */
+@Aspect
+@Component
+@Slf4j
+public class FacadeAspect {
+
+
+
+ /** 以 controller 包下定义的所有请求为切入点 */
+ @Pointcut("execution(public * com..facade.*.*(..))")
+ public void facadeLog() {}
+
+ /**
+ * 在切点之前织入
+ * @param joinPoint
+ */
+ @Before("facadeLog()")
+ public void doBefore(JoinPoint joinPoint) {
+ // 打印请求相关参数
+ log.info("******** remote Start *********");
+ // 打印 Http method
+ //log.info("HTTP Method : {}", request.getMethod());
+ // 打印调用 controller 的全路径以及执行方法
+ log.info("Class Method:{}.{}, facadeAspect_Request:{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(),JSON.toJSONString(joinPoint.getArgs()));
+ }
+
+ @Around("facadeLog()")
+ public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
+ long startTime = System.currentTimeMillis();
+ Object result = proceedingJoinPoint.proceed();
+ // 打印出参
+ log.info("facadeAspect_Response:{}", JSON.toJSONString(result));
+ // 执行耗时
+ log.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
+ log.info("**************remote End ****************");
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/sczx/pay/common/IApiCode.java b/src/main/java/com/sczx/pay/common/IApiCode.java
new file mode 100644
index 0000000..4738be0
--- /dev/null
+++ b/src/main/java/com/sczx/pay/common/IApiCode.java
@@ -0,0 +1,12 @@
+package com.sczx.pay.common;
+
+/**
+ * @Author: 张黎
+ * @Date: 2025/07/09/20:20
+ * @Description:
+ */
+public interface IApiCode {
+ String getCode();
+
+ String getMsg();
+}
diff --git a/src/main/java/com/sczx/pay/common/Result.java b/src/main/java/com/sczx/pay/common/Result.java
new file mode 100644
index 0000000..af6cba3
--- /dev/null
+++ b/src/main/java/com/sczx/pay/common/Result.java
@@ -0,0 +1,121 @@
+package com.sczx.pay.common;
+
+
+import com.sczx.pay.common.enums.ApiErrorCode;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.commons.lang.StringUtils;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: 张黎
+ * @Date: 2025/07/09/20:25
+ * @Description:
+ */
+@ApiModel(value = "公共返回结果")
+@Builder
+@Data
+public class Result implements Serializable {
+ private static final long serialVersionUID = 1331134667810352183L;
+ @ApiModelProperty(value = "成功标识")
+ private boolean success;
+ @ApiModelProperty(value = "返回编码")
+ private String code;
+ @ApiModelProperty(value = "返回信息说明")
+ private String msg;
+ private String issue;
+ @ApiModelProperty(value = "返回数据")
+ private T data;
+
+ public Result(boolean success, String code, String msg, String issue, T data) {
+ this.success = success;
+ this.code = code;
+ this.msg = msg;
+ this.issue = issue;
+ this.data = data;
+ }
+
+ public static Result result(IApiCode apiCode) {
+ return result(apiCode, (Object)null);
+ }
+
+ public static Result result(IApiCode apiCode, Object data) {
+ return result(apiCode, apiCode.getMsg(), data);
+ }
+
+ public static Result result(IApiCode apiCode, String issue, Object data) {
+ return result((IApiCode)apiCode, (String)null, issue, data);
+ }
+
+ public static Result result(IApiCode apiCode, String msg, String issue, Object data) {
+ String message = apiCode.getMsg();
+ if (StringUtils.isNotBlank(msg)) {
+ message = msg;
+ }
+
+ return result(apiCode.getCode(), message, issue, data);
+ }
+
+ public static Result result(String code, String msg, String issue, Object data) {
+ return builder().code(code).success("0".equals(code)).msg(msg).issue(issue).data(data).build();
+ }
+
+ public static Result ok() {
+ return ok((Object)null);
+ }
+
+ public static Result ok(Object data) {
+ return result(ApiErrorCode.SUCCESS, data);
+ }
+
+ public static Result ok(String key, Object value) {
+ Map map = new HashMap(1);
+ map.put(key, value);
+ return ok(map);
+ }
+
+ public static Result fail(String msg) {
+ return result((IApiCode)ApiErrorCode.FAIL, msg, msg, (Object)null);
+ }
+
+ public static Result fail(IApiCode apiCode) {
+ return result(apiCode, (Object)null);
+ }
+
+ public static Result fail(IApiCode apiCode, String issue) {
+ return result(apiCode, issue, (Object)null);
+ }
+
+ public static Result fail(String code, String msg) {
+ return result((String)code, msg, msg, (Object)null);
+ }
+
+ public static Result fail(String code, String msg, String issue) {
+ return result((String)code, msg, issue, (Object)null);
+ }
+
+ public static Result fail(String code, String msg, String issue, Object data) {
+ return result(code, msg, issue, data);
+ }
+
+ public static Result fail(IApiCode apiCode, String issue, Object data) {
+ if (ApiErrorCode.SUCCESS == apiCode) {
+ throw new RuntimeException("失败结果状态码不能为" + ApiErrorCode.SUCCESS.getCode());
+ } else {
+ return result(apiCode, issue, data);
+ }
+ }
+
+ public static Result fail(String key, Object value) {
+ Map map = new HashMap();
+ map.put(key, value);
+ return result(ApiErrorCode.FAIL, map);
+ }
+ public Result() {
+ }
+}
diff --git a/src/main/java/com/sczx/pay/common/constant/SystemConstants.java b/src/main/java/com/sczx/pay/common/constant/SystemConstants.java
new file mode 100644
index 0000000..b1df4dd
--- /dev/null
+++ b/src/main/java/com/sczx/pay/common/constant/SystemConstants.java
@@ -0,0 +1,11 @@
+package com.sczx.pay.common.constant;
+
+
+public interface SystemConstants {
+
+ /***
+ * feign客户端所在包路径
+ */
+ String FEIGN_CLIENT_BASE_PACKAGE = "com.sczx.pay.thirdpart.facade";
+
+}
diff --git a/src/main/java/com/sczx/pay/common/enums/ApiErrorCode.java b/src/main/java/com/sczx/pay/common/enums/ApiErrorCode.java
new file mode 100644
index 0000000..4bfd46b
--- /dev/null
+++ b/src/main/java/com/sczx/pay/common/enums/ApiErrorCode.java
@@ -0,0 +1,55 @@
+package com.sczx.pay.common.enums;
+
+
+import com.sczx.pay.common.IApiCode;
+
+/**
+ * @Author: 张黎
+ * @Date: 2025/07/09/20:22
+ * @Description:
+ */
+public enum ApiErrorCode implements IApiCode {
+ SUCCESS("0", "操作成功"),
+ ARG_ERROR("401000", "参数错误"),
+ NOT_PERMISSION("401001", "没有权限"),
+ HTTP_MEDIA_TYPE_NOT_SUPPORTED_ERROR("401002", "media类型出错"),
+ HTTP_METHOD_NOT_ALLOW_ERROR("401003", "http请求method错误"),
+ BODY_NOT_MATCH("401004", "请求的数据格式不符!"),
+ NOT_FOUND("404000", "你请求的路径不存在"),
+ UNAUTHORIZED("404001", "非法访问"),
+ FAIL("500000", "操作失败"),
+ INNER_ERROR("500001", "服务器内部异常");
+
+ private final String code;
+ private final String msg;
+
+ private ApiErrorCode(String code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public static ApiErrorCode getApiCode(String code) {
+ ApiErrorCode[] ecs = values();
+ ApiErrorCode[] var2 = ecs;
+ int var3 = ecs.length;
+
+ for(int var4 = 0; var4 < var3; ++var4) {
+ ApiErrorCode ec = var2[var4];
+ if (ec.getCode().equals(code)) {
+ return ec;
+ }
+ }
+
+ return SUCCESS;
+ }
+
+ @Override
+ public String getCode() {
+ return this.code;
+ }
+
+ @Override
+ public String getMsg() {
+ return this.msg;
+ }
+}
diff --git a/src/main/java/com/sczx/pay/exception/InnerException.java b/src/main/java/com/sczx/pay/exception/InnerException.java
new file mode 100644
index 0000000..6df71e1
--- /dev/null
+++ b/src/main/java/com/sczx/pay/exception/InnerException.java
@@ -0,0 +1,86 @@
+package com.sczx.pay.exception;
+
+
+import com.sczx.pay.common.IApiCode;
+import com.sczx.pay.common.enums.ApiErrorCode;
+
+/**
+ *
+ * @author zhangli
+
+ */
+public class InnerException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 错误码
+ */
+ protected String errorCode;
+ /**
+ * 错误信息
+ */
+ protected String errorMsg;
+
+ public InnerException() {
+ super();
+ }
+
+ public InnerException(IApiCode apiCode) {
+ super(apiCode.getCode());
+ this.errorCode = apiCode.getCode();
+ this.errorMsg = apiCode.getMsg();
+ }
+
+ public InnerException(IApiCode apiCode, Throwable cause) {
+ super(apiCode.getCode(), cause);
+ this.errorCode = apiCode.getCode();
+ this.errorMsg = apiCode.getMsg();
+ }
+
+ public InnerException(String errorMsg) {
+ super(errorMsg);
+ this.errorCode = ApiErrorCode.INNER_ERROR.getCode();
+ this.errorMsg = errorMsg;
+ }
+
+ public InnerException(String errorCode, String errorMsg) {
+ super(errorCode);
+ this.errorCode = errorCode;
+ this.errorMsg = errorMsg;
+ }
+
+ public InnerException(String errorCode, String errorMsg, Throwable cause) {
+ super(errorCode, cause);
+ this.errorCode = errorCode;
+ this.errorMsg = errorMsg;
+ }
+
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+
+ @Override
+ public String getMessage() {
+ return errorMsg;
+ }
+
+ @Override
+ public Throwable fillInStackTrace() {
+ return this;
+ }
+
+}
diff --git a/src/main/java/com/sczx/pay/mapper/RentRuleItemMapper.java b/src/main/java/com/sczx/pay/mapper/RentRuleItemMapper.java
index 3551b94..461bd03 100644
--- a/src/main/java/com/sczx/pay/mapper/RentRuleItemMapper.java
+++ b/src/main/java/com/sczx/pay/mapper/RentRuleItemMapper.java
@@ -17,6 +17,7 @@ public interface RentRuleItemMapper {
RentRuleItem selectItemByFourIds(@Param("batteryRuleId") Long batteryRuleId, @Param("carRuleId") Long carRuleId, @Param("carModelId") Long carModelId,@Param("brandId") Long brandId);
+ RentRuleItem selectItemByOutItemId(@Param("outItemId") String outItemId);
int insertByFourId(RentRuleItem zcRentRuleItem);
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/CarDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/CarDTO.java
new file mode 100644
index 0000000..3ba3b4c
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/CarDTO.java
@@ -0,0 +1,132 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 电动车信息表
+ *
+ *
+ * @author zhangli
+ * @since 2025-07-30 17:05:03
+ */
+
+@Data
+@ApiModel(value = "CarDTO对象", description = "电动车信息表")
+public class CarDTO {
+
+ @ApiModelProperty("主键ID")
+ private Long id;
+
+ @ApiModelProperty("车架号(VIN)")
+ private String vin;
+
+ @ApiModelProperty("车牌号码")
+ private String licensePlate;
+
+ @ApiModelProperty("车辆品牌ID")
+ private Long brandId;
+
+ @ApiModelProperty("车辆品牌名称")
+ private String brandName;
+
+ @ApiModelProperty("车辆型号ID")
+ private Long modelId;
+
+ @ApiModelProperty("车辆型号名称")
+ private String modelName;
+
+ @ApiModelProperty("支持电池类型(48V标准版/100km,48V超长版/200km等)")
+ private String batteryType;
+
+ @ApiModelProperty("整车重量(kg)")
+ private String weight;
+
+ @ApiModelProperty("最高时速(km/h)")
+ private String maxSpeed;
+
+ @ApiModelProperty("LOT识别号")
+ private String lotNumber;
+
+ @ApiModelProperty("采购日期")
+ private LocalDateTime purchaseDate;
+
+ @ApiModelProperty("采购价格(元)")
+ private BigDecimal purchasePrice;
+
+ @ApiModelProperty("车辆归属(0归属于合,1归属运营商)")
+ private String belongType;
+
+ @ApiModelProperty("车辆图片(多个图片用逗号分隔)")
+ private String images;
+
+ @ApiModelProperty("BRS车辆状态(空闲/使用中/维修中/丢失报损等)")
+ private String brsStatus;
+
+ @ApiModelProperty("IoT设备状态")
+ private String iotStatus;
+
+ @ApiModelProperty("IoT识别码")
+ private String iotCode;
+
+ @ApiModelProperty("所属运营商ID")
+ private Long operatorId;
+
+ @ApiModelProperty("所属运营商名称")
+ private String operatorName;
+
+ @ApiModelProperty("所属门店ID")
+ private Long storeId;
+
+ @ApiModelProperty("所属门店名称")
+ private String storeName;
+
+ @ApiModelProperty("应用套餐ID")
+ private Long packageId;
+
+ @ApiModelProperty("应用套餐名称")
+ private String packageName;
+
+ @ApiModelProperty("状态(0正常 1停用)")
+ private String status;
+
+ @ApiModelProperty("删除标志(0代表存在 2代表删除)")
+ private String delFlag;
+
+ @ApiModelProperty("创建者")
+ private String createBy;
+
+ @ApiModelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("更新者")
+ private String updateBy;
+
+ @ApiModelProperty("更新时间")
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("备注信息")
+ private String remark;
+
+ @ApiModelProperty("扩展字段1")
+ private String extend1;
+
+ @ApiModelProperty("扩展字段2")
+ private String extend2;
+
+ @ApiModelProperty("扩展字段3")
+ private String extend3;
+
+ @ApiModelProperty("扩展字段4")
+ private String extend4;
+
+ @ApiModelProperty("扩展字段5")
+ private String extend5;
+
+
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/CarModelSimpleDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/CarModelSimpleDTO.java
new file mode 100644
index 0000000..6597806
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/CarModelSimpleDTO.java
@@ -0,0 +1,40 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "车型简单对象")
+public class CarModelSimpleDTO {
+
+ @ApiModelProperty("车型ID")
+ private Long carModelId;
+
+ @ApiModelProperty("门店id")
+ private Integer storeId;
+
+ @ApiModelProperty("门店编号")
+ private String storeNumber;
+
+ @ApiModelProperty("车型名称")
+ private String modelName;
+
+ @ApiModelProperty("品牌名称")
+ private String brandName;
+
+ @ApiModelProperty("租赁类型(时租/日租/按天数/以租代售),用逗号分隔")
+ private String batteryTypes;
+
+ @ApiModelProperty("是否支持免押(0不支持 1支持)")
+ private String depositFree;
+
+ @ApiModelProperty("是否支持代扣(0不支持 1支持)")
+ private String autoDeduct;
+
+ @ApiModelProperty("电池类型")
+ private String batteryType;
+
+ @ApiModelProperty("车型照片")
+ private String image;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/CompanyStoreDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/CompanyStoreDTO.java
new file mode 100644
index 0000000..935e7cb
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/CompanyStoreDTO.java
@@ -0,0 +1,68 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "CompanyStoreDTO对象", description = "门店信息")
+public class CompanyStoreDTO {
+
+ @ApiModelProperty("主键id")
+ private Integer id;
+
+ @ApiModelProperty("门店名称")
+ private String name;
+
+ @ApiModelProperty("联系人")
+ private String contactPerson;
+
+ @ApiModelProperty("手机号码")
+ private String phone;
+
+ @ApiModelProperty("联系人2")
+ private String contactPerson2;
+
+ @ApiModelProperty("手机号码2")
+ private String phone2;
+
+
+ @ApiModelProperty("详细地址")
+ private String detailedAddress;
+
+ @ApiModelProperty("门店logo")
+ private String image;
+
+ @ApiModelProperty("纬度")
+ private Double latitude;
+
+ @ApiModelProperty("经度")
+ private Double longitude;
+
+ @ApiModelProperty("标签 1.可租车 2.可换电 3.二手车,多个用,号隔开,例如1,2,3")
+ private String label;
+
+ @ApiModelProperty("运营公司id")
+ private Integer operatingCompanyId;
+
+ @ApiModelProperty("运营性质 1.直营 0.合作")
+ private Boolean operatingNature;
+
+ @ApiModelProperty("简介")
+ private String introduction;
+
+
+ @ApiModelProperty("门店编号")
+ private String storeNumber;
+
+ @ApiModelProperty("租车分成比例")
+ private BigDecimal zucheRatio;
+
+ @ApiModelProperty("租电分成比例")
+ private BigDecimal zudianRatio;
+
+ @ApiModelProperty("以租代售分成比例")
+ private BigDecimal daishouRatio;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderCarImgDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderCarImgDTO.java
new file mode 100644
index 0000000..cc12db3
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderCarImgDTO.java
@@ -0,0 +1,16 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel(value = "OrderCarImgDTO对象", description = "订单租车车辆图片信息")
+@Data
+public class OrderCarImgDTO {
+
+ @ApiModelProperty("图片类型:RENT租车,RETURN还车")
+ private String imgType;
+
+ @ApiModelProperty("图片地址")
+ private String imgUrl;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderDTO.java
new file mode 100644
index 0000000..c5b2ff2
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderDTO.java
@@ -0,0 +1,144 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @Author: 张黎
+ * @Date: 2025/07/25/17:18
+ * @Description:
+ */
+@Data
+@ApiModel(value = "订单dto", description = "租车订单信息")
+public class OrderDTO {
+
+ @ApiModelProperty("订单ID(主键)")
+ private Long orderId;
+
+ @ApiModelProperty("订单编号")
+ private String orderNo;
+
+ @ApiModelProperty("订单状态:下单未提车、租赁中、已结束-自动、已结束-手动")
+ private String orderStatus;
+
+ @ApiModelProperty("所属运营商ID")
+ private Long operatorId;
+
+ @ApiModelProperty("门店信息")
+ private CompanyStoreDTO companyStoreDTO;
+
+ @ApiModelProperty("所属门店ID")
+ private Long storeId;
+
+ @ApiModelProperty("车辆ID")
+ private Long vehicleId;
+
+ @ApiModelProperty("车辆信息")
+ private CarDTO carDTO;
+
+ @ApiModelProperty("车型ID")
+ private Long carModelId;
+
+ @ApiModelProperty("车型信息")
+ private CarModelSimpleDTO carModelSimpleDTO;
+
+ @ApiModelProperty("客户id")
+ private Long customerId;
+
+ @ApiModelProperty("客户姓名")
+ private String customerName;
+
+ @ApiModelProperty("客户联系电话")
+ private String customerPhone;
+
+ @ApiModelProperty("选择的电池类型")
+ private String batteryType;
+
+ @ApiModelProperty("租赁类型(时租/日租/按天数/以租代售)")
+ private String rentalType;
+
+ @ApiModelProperty("租赁天数(当类型为\"按天数\"时使用)")
+ private Integer rentalDays;
+
+ @ApiModelProperty("租车价格(元)")
+ private BigDecimal rentalPrice;
+
+ @ApiModelProperty("押金价格(元)")
+ private BigDecimal depositPrice;
+
+ @ApiModelProperty("逾期金额(元)")
+ private BigDecimal overdueFee;
+
+ @ApiModelProperty("逾期计费类型(按日计费/按月计费)")
+ private String overdueType;
+
+ @ApiModelProperty("是否开通免押")
+ private Boolean isDepositFree;
+
+ @ApiModelProperty("是否开通代扣")
+ private Boolean isAutoDeduct;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("首次下单时间")
+ private LocalDateTime firstOrderTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("开始计费时间")
+ private LocalDateTime startRentTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("还车时间")
+ private LocalDateTime endRentTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("申请还车时间")
+ private LocalDateTime reqEndRentTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("实际还车时间")
+ private LocalDateTime actEndRentTime;
+
+ @ApiModelProperty("逾期天数")
+ private Integer overdueDays;
+
+ @ApiModelProperty("续租次数")
+ private Integer renewalTimes;
+
+ @ApiModelProperty("充电次数")
+ private Integer chargeTimes;
+
+ @ApiModelProperty("租车套餐id")
+ private Long rentCarRuleId;
+
+ @ApiModelProperty("租电套餐id")
+ private Long rentBatteyRuleId;
+
+ @ApiModelProperty("订单结束时间")
+ private LocalDateTime endOrderTime;
+
+ @ApiModelProperty("订单总金额")
+ private BigDecimal orderAmount;
+
+ @ApiModelProperty("租电套餐信息")
+ private RentBatteyRuleDTO rentBatteyRule;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("租车子订单信息")
+ private List orderSubDTOList;
+
+ @ApiModelProperty("订单车辆图片")
+ private List orderCarImgList;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderDetailDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderDetailDTO.java
new file mode 100644
index 0000000..72db2c3
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderDetailDTO.java
@@ -0,0 +1,176 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@ApiModel(value = "订单详情dto", description = "租车订单详情信息")
+@Data
+public class OrderDetailDTO {
+
+ @ApiModelProperty("订单ID(主键)")
+ private Long orderId;
+
+ @ApiModelProperty("订单编号")
+ private String orderNo;
+
+ @ApiModelProperty("订单状态:下单未提车、租赁中、已结束-自动、已结束-手动")
+ private String orderStatus;
+
+ @ApiModelProperty("门店名称")
+ private String storeName;
+
+ @ApiModelProperty("详细地址")
+ private String detailedAddress;
+
+ @ApiModelProperty("纬度")
+ private Double latitude;
+
+ @ApiModelProperty("经度")
+ private Double longitude;
+
+ @ApiModelProperty("车型名称")
+ private String modelName;
+
+ @ApiModelProperty("品牌名称")
+ private String brandName;
+
+ @ApiModelProperty("车型图片")
+ private String image;
+
+ @ApiModelProperty("车辆id")
+ private String carId;
+
+ @ApiModelProperty("车架号(VIN)")
+ private String vin;
+
+ @ApiModelProperty("车牌号码")
+ private String licensePlate;
+
+ @ApiModelProperty("客户id")
+ private Long customerId;
+
+ @ApiModelProperty("客户姓名")
+ private String customerName;
+
+ @ApiModelProperty("客户联系电话")
+ private String customerPhone;
+
+
+ @ApiModelProperty("租赁类型(时租/日租/按天数/以租代售)")
+ private String rentalType;
+
+ @ApiModelProperty("租赁类型标签")
+ private String rentalTypeLabel;
+
+ @ApiModelProperty("租赁天数(当类型为\"按天数\"时使用)")
+ private Integer rentalDays;
+
+ @ApiModelProperty("租车价格(元)")
+ private BigDecimal rentalPrice;
+
+ @ApiModelProperty("逾期金额(元)")
+ private BigDecimal overdueFee;
+
+ @ApiModelProperty("逾期计费类型(按日计费/按月计费)")
+ private String overdueType;
+
+ @ApiModelProperty("押金价格(元)")
+ private BigDecimal depositPrice;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("首次下单时间")
+ private LocalDateTime firstOrderTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("取车时间")
+ private LocalDateTime pickCarTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("开始计费时间")
+ private LocalDateTime startRentTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("预计还车时间")
+ private LocalDateTime endRentTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("申请还车时间")
+ private LocalDateTime reqEndRentTime;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("实际还车时间")
+ private LocalDateTime actEndRentTime;
+
+ @ApiModelProperty("电池订单号")
+ private String rentBatteyOrderNo;
+
+ @ApiModelProperty("电池类型名称")
+ private String categoryName;
+
+ @ApiModelProperty("电池编码")
+ private String batteyNo;
+
+ @ApiModelProperty("计时方式")
+ private Integer durationType;
+
+ @ApiModelProperty("电池计时方式标签")
+ private String durationTypeLabel;
+
+ @ApiModelProperty("租点套餐名称")
+ private String rentBatteyTitle;
+
+ @ApiModelProperty("逾期天数")
+ private Integer overdueDays;
+
+ @ApiModelProperty("逾期金额")
+ private BigDecimal overdueAmount;
+
+ @ApiModelProperty("续租金额")
+ private BigDecimal rerentAmount;
+
+ @ApiModelProperty("续租次数")
+ private Integer renewalTimes;
+
+ @ApiModelProperty("充电次数")
+ private Integer chargeTimes;
+
+ @ApiModelProperty("订单总金额")
+ private BigDecimal orderAmount;
+
+ @ApiModelProperty("是否开通免押")
+ private Boolean isDepositFree;
+
+ @ApiModelProperty("是否开通代扣")
+ private Boolean isAutoDeduct;
+
+
+ @ApiModelProperty("车损金额")
+ private BigDecimal damageAmount;
+
+ @ApiModelProperty("车损说明")
+ private String damageDesc;
+
+ @ApiModelProperty("预计到期间隔天数")
+ private Integer expectedDays;
+
+ @ApiModelProperty("订单车辆图片-租车")
+ private List orderCarImgRentList;
+
+ @ApiModelProperty("订单车辆图片-还车")
+ private List orderCarImgReturnList;
+
+ @ApiModelProperty("订单车辆图片-车损")
+ private List orderCarImgDamageList;
+
+ @ApiModelProperty("最新支付单号")
+ private String lastPayOrderNo;
+
+ @ApiModelProperty("支付订单信息")
+ private List payOrderDTOList;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderSubDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderSubDTO.java
new file mode 100644
index 0000000..81b276a
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/OrderSubDTO.java
@@ -0,0 +1,49 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "租车订单子表dto", description = "租车订单子表信息")
+public class OrderSubDTO {
+
+ @ApiModelProperty("子订单ID(主键)")
+ private Long suborderId;
+
+ @ApiModelProperty("关联的订单ID(外键)")
+ private Long orderId;
+
+ @ApiModelProperty("子订单编号")
+ private String suborderNo;
+
+ @ApiModelProperty("子订单类型(首租、续租、逾期、押金、租电等)")
+ private String suborderType;
+
+ @ApiModelProperty("订单金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("支付方式")
+ private String paymentMethod;
+
+ @ApiModelProperty("车架/电池编号")
+ private String vinBatteryNo;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("订单产生时间")
+ private LocalDateTime createdAt;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("支付ID")
+ private String paymentId;
+
+ @ApiModelProperty("实际支付时间")
+ private LocalDateTime paidAt;
+
+ @ApiModelProperty("备注")
+ private String remark;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/PayOrderDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/PayOrderDTO.java
new file mode 100644
index 0000000..243b82f
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/PayOrderDTO.java
@@ -0,0 +1,30 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "支付订单dto", description = "支付订单信息")
+public class PayOrderDTO {
+
+ @ApiModelProperty("订单金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("支付方式")
+ private String paymentMethod;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("订单产生时间")
+ private LocalDateTime createdAt;
+
+ @ApiModelProperty("支付ID")
+ private String paymentId;
+
+ @ApiModelProperty("支付状态")
+ private String payStatus;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/dto/req/RentBatteyRuleDTO.java b/src/main/java/com/sczx/pay/thirdpart/dto/req/RentBatteyRuleDTO.java
new file mode 100644
index 0000000..28ffbd5
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/dto/req/RentBatteyRuleDTO.java
@@ -0,0 +1,91 @@
+package com.sczx.pay.thirdpart.dto.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@ApiModel(value = "租电套餐计费规则")
+@Data
+public class RentBatteyRuleDTO {
+
+ @ApiModelProperty("租电套餐id")
+ private Integer id;
+
+ @ApiModelProperty("商品标题")
+ private String title;
+
+ @ApiModelProperty("商品描述")
+ private String detail;
+
+ @ApiModelProperty("图标")
+ private String icon;
+
+ @ApiModelProperty("电压")
+ private String voltage;
+
+ @ApiModelProperty("电容")
+ private String ah;
+
+ @ApiModelProperty("最大里程")
+ private Integer maxMileage;
+
+ @ApiModelProperty("最小里程 默认0")
+ private Integer minMileage;
+
+ @ApiModelProperty("押金 ")
+ private BigDecimal depositPrice;
+
+ @ApiModelProperty("租金")
+ private BigDecimal rentPrice;
+
+ @ApiModelProperty("计时方式")
+ private Integer durationType;
+
+ @ApiModelProperty("租赁时长")
+ private Integer duration;
+
+ @ApiModelProperty("盗抢险")
+ private BigDecimal insurancePrice;
+
+ @ApiModelProperty("是否强制投保 默认0 false")
+ private Boolean compulsoryInsurance;
+
+ @ApiModelProperty("保险有效时长 默认12个月")
+ private Integer insuranceDuration;
+
+ @ApiModelProperty("换电次数")
+ private Integer changeNum;
+
+ @ApiModelProperty("1、有限次数 2无限次数")
+ private Integer changeType;
+
+ private Boolean isDelete;
+
+ private Integer cityId;
+
+ private Integer operatorId;
+
+ private Integer provinceId;
+
+ @ApiModelProperty("电池类型")
+ private Integer categoryId;
+
+ @ApiModelProperty("电池类型名称")
+ private String categoryName;
+
+ @ApiModelProperty("套餐类型 换电/租电")
+ private Integer mealType;
+
+ @ApiModelProperty("套餐排序规则")
+ private Integer mealSort;
+
+ private Boolean isJoinInvite;
+
+ @ApiModelProperty("套餐渠道租车默认 id号待定")
+ private Integer mealChannel;
+
+ @ApiModelProperty("购买限制类型")
+ private Integer buyLimitType;
+}
diff --git a/src/main/java/com/sczx/pay/thirdpart/facade/OrderFacade.java b/src/main/java/com/sczx/pay/thirdpart/facade/OrderFacade.java
new file mode 100644
index 0000000..032c89d
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/facade/OrderFacade.java
@@ -0,0 +1,18 @@
+package com.sczx.pay.thirdpart.facade;
+
+
+import com.sczx.pay.common.Result;
+import com.sczx.pay.thirdpart.dto.req.CarModelSimpleDTO;
+import com.sczx.pay.thirdpart.dto.req.OrderDetailDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+@FeignClient(name = "sczx-order", url = "${sczx-order.ribbon.listOfServers:}")
+public interface OrderFacade {
+
+
+ @GetMapping("/pubOrder/getOrderDetailByOrderNo")
+ Result getOrderDetailByOrderNo(@RequestParam("orderNo") String orderNo);
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/sczx/pay/thirdpart/integration/OrderInteg.java b/src/main/java/com/sczx/pay/thirdpart/integration/OrderInteg.java
new file mode 100644
index 0000000..dc9d04c
--- /dev/null
+++ b/src/main/java/com/sczx/pay/thirdpart/integration/OrderInteg.java
@@ -0,0 +1,35 @@
+package com.sczx.pay.thirdpart.integration;
+
+
+import com.sczx.pay.common.Result;
+import com.sczx.pay.exception.InnerException;
+import com.sczx.pay.thirdpart.dto.req.OrderDetailDTO;
+import com.sczx.pay.thirdpart.facade.OrderFacade;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class OrderInteg {
+
+ @Autowired
+ private OrderFacade orderFacade;
+
+
+ public OrderDetailDTO getOrderDetailByOrderNo(String orderNo){
+ try{
+ Result result = orderFacade.getOrderDetailByOrderNo(orderNo);
+ if(result.isSuccess()){
+ return result.getData();
+ }
+ } catch (Exception e){
+ log.error("根据租车套餐id获取套餐信息失败",e);
+ throw new InnerException("根据租车套餐id获取套餐信息失败");
+ }
+ return null;
+ }
+
+
+
+}
diff --git a/src/main/resources/mapper/RentRuleItemMapper.xml b/src/main/resources/mapper/RentRuleItemMapper.xml
index 2f11042..e4eadea 100644
--- a/src/main/resources/mapper/RentRuleItemMapper.xml
+++ b/src/main/resources/mapper/RentRuleItemMapper.xml
@@ -96,6 +96,13 @@
WHERE ali_item_id = #{aliItemId}
+
+
insert into zc_rent_rule_item