douyin meituan
This commit is contained in:
13
pom.xml
13
pom.xml
@ -243,8 +243,21 @@
|
|||||||
<artifactId>shedlock-provider-redis-spring</artifactId>
|
<artifactId>shedlock-provider-redis-spring</artifactId>
|
||||||
<version>4.44.0</version>
|
<version>4.44.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.douyin.openapi</groupId>
|
||||||
|
<artifactId>sdk</artifactId>
|
||||||
|
<version>1.0.6</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>douyin-openapi-repo</id>
|
||||||
|
<url>https://artifacts-cn-beijing.volces.com/repository/douyin-openapi/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
<!-- Build Configuration -->
|
<!-- Build Configuration -->
|
||||||
<build>
|
<build>
|
||||||
<finalName>sczx_order</finalName>
|
<finalName>sczx_order</finalName>
|
||||||
|
|||||||
107
src/main/java/com/sczx/order/config/DouyinTokenManager.java
Normal file
107
src/main/java/com/sczx/order/config/DouyinTokenManager.java
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
package com.sczx.order.config;
|
||||||
|
|
||||||
|
import com.aliyun.tea.TeaException;
|
||||||
|
import com.douyin.openapi.client.Client;
|
||||||
|
import com.douyin.openapi.client.models.OauthClientTokenRequest;
|
||||||
|
import com.douyin.openapi.client.models.OauthClientTokenResponse;
|
||||||
|
import com.douyin.openapi.credential.models.Config;
|
||||||
|
|
||||||
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抖音 client_token 管理器
|
||||||
|
* 负责定时获取和缓存 client_token
|
||||||
|
*/
|
||||||
|
public class DouyinTokenManager {
|
||||||
|
|
||||||
|
// 应用凭证信息
|
||||||
|
private static final String CLIENT_KEY = "awomt6nnjlfc491m";
|
||||||
|
private static final String CLIENT_SECRET = "c678c411c7a68c6f97969f2dbd8ef8fc";
|
||||||
|
|
||||||
|
// Token 缓存
|
||||||
|
private static final AtomicReference<OauthClientTokenResponse> tokenCache =
|
||||||
|
new AtomicReference<>();
|
||||||
|
|
||||||
|
// 定时任务执行器
|
||||||
|
private static final ScheduledThreadPoolExecutor scheduler =
|
||||||
|
new ScheduledThreadPoolExecutor(1, r -> {
|
||||||
|
Thread t = new Thread(r, "DouyinTokenRefreshThread");
|
||||||
|
t.setDaemon(false);
|
||||||
|
return t;
|
||||||
|
});
|
||||||
|
|
||||||
|
static {
|
||||||
|
// 初始化时立即获取一次 token
|
||||||
|
refreshClientToken();
|
||||||
|
|
||||||
|
// 每小时更新一次 token (3600秒)
|
||||||
|
scheduler.scheduleAtFixedRate(
|
||||||
|
DouyinTokenManager::refreshClientToken,
|
||||||
|
3600,
|
||||||
|
3600,
|
||||||
|
TimeUnit.SECONDS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前有效的 client_token
|
||||||
|
*
|
||||||
|
* @return 当前有效的 access_token
|
||||||
|
*/
|
||||||
|
public static String getCurrentToken() {
|
||||||
|
OauthClientTokenResponse response = tokenCache.get();
|
||||||
|
if (response != null && response.getData() != null) {
|
||||||
|
return response.getData().getAccessToken();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新 client_token
|
||||||
|
*/
|
||||||
|
private static void refreshClientToken() {
|
||||||
|
try {
|
||||||
|
Config config = new Config()
|
||||||
|
.setClientKey(CLIENT_KEY)
|
||||||
|
.setClientSecret(CLIENT_SECRET);
|
||||||
|
|
||||||
|
Client client = new Client(config);
|
||||||
|
|
||||||
|
OauthClientTokenRequest sdkRequest = new OauthClientTokenRequest();
|
||||||
|
sdkRequest.setClientKey(CLIENT_KEY);
|
||||||
|
sdkRequest.setClientSecret(CLIENT_SECRET);
|
||||||
|
sdkRequest.setGrantType("client_credential");
|
||||||
|
|
||||||
|
OauthClientTokenResponse sdkResponse = client.OauthClientToken(sdkRequest);
|
||||||
|
|
||||||
|
// 更新缓存
|
||||||
|
tokenCache.set(sdkResponse);
|
||||||
|
|
||||||
|
if (sdkResponse.getData() != null) {
|
||||||
|
System.out.println("抖音 client_token 更新成功,有效期至: " +
|
||||||
|
(System.currentTimeMillis() + sdkResponse.getData().getExpiresIn() * 1000));
|
||||||
|
}
|
||||||
|
} catch (TeaException e) {
|
||||||
|
System.err.println("获取抖音 client_token 失败 (TeaException): " + e.getMessage());
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("获取抖音 client_token 失败 (Exception): " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭定时任务
|
||||||
|
*/
|
||||||
|
public static void shutdown() {
|
||||||
|
scheduler.shutdown();
|
||||||
|
|
||||||
|
// 获取当前有效的 client_token
|
||||||
|
String token = DouyinTokenManager.getCurrentToken();
|
||||||
|
|
||||||
|
// 使用 token 调用抖音 API
|
||||||
|
if (token != null) {
|
||||||
|
// 调用订单查询等接口
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -65,6 +65,12 @@ public class ClientOrderController {
|
|||||||
return Result.ok(orderService.depositFreePayRentCarOrder(rentCarOrderReq));
|
return Result.ok(orderService.depositFreePayRentCarOrder(rentCarOrderReq));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "第三方订单")
|
||||||
|
@PostMapping("/thirdPlatformRentCarOrder")
|
||||||
|
public Result<RentCarOrderResultDTO> thirdPlatformRentCarOrder(@Valid @RequestBody RentCarThirdPlatformOrderReq rentCarOrderReq){
|
||||||
|
return Result.ok(orderService.thirdPlatformRentCarOrder(rentCarOrderReq));
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "续租车")
|
@ApiOperation(value = "续租车")
|
||||||
@PostMapping("/reRentalCarOrder")
|
@PostMapping("/reRentalCarOrder")
|
||||||
public Result<RentCarOrderResultDTO> reRentalCarOrder(@Valid @RequestBody ReRentCarReq rentCarOrderReq){
|
public Result<RentCarOrderResultDTO> reRentalCarOrder(@Valid @RequestBody ReRentCarReq rentCarOrderReq){
|
||||||
|
|||||||
@ -0,0 +1,23 @@
|
|||||||
|
package com.sczx.order.controller;
|
||||||
|
|
||||||
|
import com.sczx.order.common.Result;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class MeiTuanController {
|
||||||
|
|
||||||
|
@ApiOperation(value = "接收需同步数据接口")
|
||||||
|
@GetMapping("/authorization")
|
||||||
|
public Result authorization(@RequestParam("code") String code, @RequestParam("sign") String sign, @RequestParam("developerId") Long developerId, @RequestParam("businessId") int businessId,
|
||||||
|
@RequestParam("state") String state){
|
||||||
|
|
||||||
|
log.info("接收美团授权数据 - code: {}, sign: {}, developerId: {}, businessId: {}, state: {}",
|
||||||
|
code, sign, developerId, businessId, state);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -60,4 +60,10 @@ public class StoreOrderController {
|
|||||||
public Result<OrderDTO> confirmReturnCar(@RequestBody ReturnCarReq returnCarReq){
|
public Result<OrderDTO> confirmReturnCar(@RequestBody ReturnCarReq returnCarReq){
|
||||||
return Result.ok(orderService.confirmReturnCar(returnCarReq));
|
return Result.ok(orderService.confirmReturnCar(returnCarReq));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "抖音团购核销")
|
||||||
|
@PostMapping("/verifyCar")
|
||||||
|
public Result<OrderDTO> verifyCar(@RequestBody ReturnCarReq returnCarReq){
|
||||||
|
return Result.ok(orderService.confirmReturnCar(returnCarReq));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,6 @@
|
|||||||
package com.sczx.order.convert;
|
package com.sczx.order.convert;
|
||||||
|
|
||||||
import com.sczx.order.dto.OrderDTO;
|
import com.sczx.order.dto.*;
|
||||||
import com.sczx.order.dto.OrderDetailDTO;
|
|
||||||
import com.sczx.order.dto.RentCarOrderReq;
|
|
||||||
import com.sczx.order.dto.SimpleUserInfoDTO;
|
|
||||||
import com.sczx.order.po.OrderMainPO;
|
import com.sczx.order.po.OrderMainPO;
|
||||||
import com.sczx.order.po.OrderSubPO;
|
import com.sczx.order.po.OrderSubPO;
|
||||||
import com.sczx.order.thirdpart.dto.*;
|
import com.sczx.order.thirdpart.dto.*;
|
||||||
@ -46,6 +43,31 @@ public interface OrderConvert {
|
|||||||
})
|
})
|
||||||
OrderMainPO subOrderToPo(RentCarOrderReq rentCarOrderReq, SimpleUserInfoDTO userInfoDTO, RentCarRuleDTO rentCarRuleDTO);
|
OrderMainPO subOrderToPo(RentCarOrderReq rentCarOrderReq, SimpleUserInfoDTO userInfoDTO, RentCarRuleDTO rentCarRuleDTO);
|
||||||
|
|
||||||
|
@Mappings({
|
||||||
|
@Mapping(target = "orderId", ignore = true),
|
||||||
|
@Mapping(target = "createTime", ignore = true),
|
||||||
|
@Mapping(target = "updateTime", ignore = true),
|
||||||
|
@Mapping(target = "delFlag", ignore = true),
|
||||||
|
@Mapping(source = "rentCarOrderReq.storeId", target = "storeId"),
|
||||||
|
@Mapping(source = "rentCarOrderReq.operatorId", target = "operatorId"),
|
||||||
|
@Mapping(source = "rentCarOrderReq.carModelId", target = "carModelId"),
|
||||||
|
@Mapping(source = "rentCarOrderReq.rentCarRuleId", target = "rentCarRuleId"),
|
||||||
|
@Mapping(source = "rentCarOrderReq.rentBatteyRuleId", target = "rentBatteyRuleId"),
|
||||||
|
@Mapping(source = "rentCarOrderReq.isDepositFree", target = "isDepositFree"),
|
||||||
|
@Mapping(source = "rentCarOrderReq.batteryType", target = "batteryType"),
|
||||||
|
@Mapping(source = "userInfoDTO.userId", target = "customerId"),
|
||||||
|
@Mapping(source = "userInfoDTO.userName", target = "customerName"),
|
||||||
|
@Mapping(source = "userInfoDTO.phoneNumber", target = "customerPhone"),
|
||||||
|
@Mapping(source = "rentCarRuleDTO.rentalType", target = "rentalType"),
|
||||||
|
@Mapping(source = "rentCarRuleDTO.rentalDays", target = "rentalDays"),
|
||||||
|
@Mapping(source = "rentCarRuleDTO.rentalPrice", target = "rentalPrice"),
|
||||||
|
@Mapping(source = "rentCarRuleDTO.depositPrice", target = "depositPrice"),
|
||||||
|
@Mapping(source = "rentCarRuleDTO.overdueFee", target = "overdueFee"),
|
||||||
|
@Mapping(source = "rentCarRuleDTO.overdueType", target = "overdueType")
|
||||||
|
|
||||||
|
})
|
||||||
|
OrderMainPO subOrderToPo(RentCarThirdPlatformOrderReq rentCarOrderReq, SimpleUserInfoDTO userInfoDTO, RentCarRuleDTO rentCarRuleDTO);
|
||||||
|
|
||||||
@Mappings({
|
@Mappings({
|
||||||
|
|
||||||
@Mapping(source = "orderMainPO.orderId", target = "orderId"),
|
@Mapping(source = "orderMainPO.orderId", target = "orderId"),
|
||||||
|
|||||||
@ -0,0 +1,62 @@
|
|||||||
|
package com.sczx.order.dto;
|
||||||
|
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: 张黎
|
||||||
|
* @Date: 2025/07/25/16:58
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "租车订单请求参数")
|
||||||
|
public class RentCarThirdPlatformOrderReq {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "订单编号,租车不需要传,续租和逾期处理需要传")
|
||||||
|
private String orderNo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "运营商id")
|
||||||
|
private Long operatorId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "门店id")
|
||||||
|
@NotNull(message = "门店id不能为空")
|
||||||
|
private Long storeId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "客户id")
|
||||||
|
private Long customerId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "客户姓名")
|
||||||
|
private String customerName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "客户电话")
|
||||||
|
private String customerPhone;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "第三方订单号")
|
||||||
|
private String thirdOrderNo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "订单来源")
|
||||||
|
private String orderSource;
|
||||||
|
|
||||||
|
@ApiModelProperty("车型ID")
|
||||||
|
@NotNull(message = "车型ID不能为空")
|
||||||
|
private Long carModelId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "租车套餐id")
|
||||||
|
@NotNull(message = "租车套餐id不能为空")
|
||||||
|
private Long rentCarRuleId;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "租电套餐id")
|
||||||
|
private Long rentBatteyRuleId;
|
||||||
|
|
||||||
|
@ApiModelProperty("选择的电池类型")
|
||||||
|
private String batteryType;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty("是否开通免押")
|
||||||
|
private Boolean isDepositFree = false;
|
||||||
|
}
|
||||||
8
src/main/java/com/sczx/order/service/DouyinService.java
Normal file
8
src/main/java/com/sczx/order/service/DouyinService.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package com.sczx.order.service;
|
||||||
|
|
||||||
|
public interface DouyinService {
|
||||||
|
|
||||||
|
String resolveShortUrlToGetObjectId(String shortUrl) throws Exception;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -36,6 +36,14 @@ public interface OrderService {
|
|||||||
*/
|
*/
|
||||||
RentCarOrderResultDTO depositFreePayRentCarOrder(RentCarOrderReq rentCarOrderReq);
|
RentCarOrderResultDTO depositFreePayRentCarOrder(RentCarOrderReq rentCarOrderReq);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第三方订单
|
||||||
|
* @param rentCarOrderReq
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
RentCarOrderResultDTO thirdPlatformRentCarOrder(RentCarThirdPlatformOrderReq rentCarOrderReq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 续租车
|
* 续租车
|
||||||
* @param rentCarOrderReq
|
* @param rentCarOrderReq
|
||||||
|
|||||||
@ -0,0 +1,51 @@
|
|||||||
|
package com.sczx.order.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import com.sczx.order.exception.InnerException;
|
||||||
|
import com.sczx.order.service.DouyinService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class DouyinServiceImpl implements DouyinService {
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public String resolveShortUrlToGetObjectId(String shortUrl) {
|
||||||
|
try{
|
||||||
|
URL url = new URL(shortUrl);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
connection.setInstanceFollowRedirects(false); // 禁止自动重定向
|
||||||
|
connection.connect();
|
||||||
|
|
||||||
|
String longUrl = connection.getHeaderField("Location");
|
||||||
|
connection.disconnect();
|
||||||
|
|
||||||
|
if (longUrl == null || longUrl.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用正则表达式匹配object_id参数
|
||||||
|
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("object_id=([^&]*)");
|
||||||
|
java.util.regex.Matcher matcher = pattern.matcher(longUrl);
|
||||||
|
|
||||||
|
if (matcher.find()) {
|
||||||
|
return matcher.group(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error("二维码不正确");
|
||||||
|
throw new InnerException("扫码核销失败,二维码不正确");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -462,6 +462,161 @@ public class OrderServiceImpl implements OrderService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public RentCarOrderResultDTO thirdPlatformRentCarOrder(RentCarThirdPlatformOrderReq rentCarOrderReq) {
|
||||||
|
|
||||||
|
LambdaQueryWrapper<OrderMainPO> currentOrderWrapper = new LambdaQueryWrapper<>();
|
||||||
|
currentOrderWrapper.eq(OrderMainPO::getCustomerId, rentCarOrderReq.getCustomerId())
|
||||||
|
.notIn(OrderMainPO::getOrderStatus, Arrays.asList(OrderStatusEnum.AUTO_END.getCode(), OrderStatusEnum.MANUAL_END.getCode()))
|
||||||
|
.eq(OrderMainPO::getDelFlag, "0");
|
||||||
|
List<OrderMainPO> currentOrderList = orderMainRepo.list(currentOrderWrapper);
|
||||||
|
OrderMainPO waitPayOrder = currentOrderList.stream().filter(order -> order.getOrderStatus().equals(OrderStatusEnum.WAIT_PAY.getCode())).findFirst().orElse(null);
|
||||||
|
if(!currentOrderList.isEmpty() && waitPayOrder==null){
|
||||||
|
throw new BizException("您有未完成的订单,请先完成订单");
|
||||||
|
}
|
||||||
|
if(waitPayOrder!=null){
|
||||||
|
log.info("存在待支付的订单,取消订单");
|
||||||
|
PayOrderReq payOrderReq = new PayOrderReq();
|
||||||
|
payOrderReq.setOrderNo(waitPayOrder.getOrderNo());
|
||||||
|
cancelOrder(payOrderReq,null);
|
||||||
|
}
|
||||||
|
|
||||||
|
//判断是否存有空闲车辆可用
|
||||||
|
LambdaQueryWrapper<CarPO> carWrapper = new LambdaQueryWrapper<>();
|
||||||
|
carWrapper.eq(CarPO::getModelId, rentCarOrderReq.getCarModelId())
|
||||||
|
.eq(CarPO::getDelFlag, "0")
|
||||||
|
.eq(CarPO::getBrsStatus, "0")
|
||||||
|
.eq(CarPO::getStoreId, rentCarOrderReq.getStoreId());
|
||||||
|
List<CarPO> carPOList = carRepo.list(carWrapper);
|
||||||
|
if(CollectionUtils.isEmpty(carPOList)){
|
||||||
|
throw new BizException("门店没有该车型的车辆可租");
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取门店信息
|
||||||
|
// CompanyStoreDTO companyStoreDTO = storeInteg.getStoreById(Integer.valueOf(rentCarOrderReq.getStoreId().toString()));
|
||||||
|
// if(Objects.isNull(companyStoreDTO)){
|
||||||
|
// throw new BizException("运营商或门店已下架");
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
CarModelSimpleDTO carModelSimpleDTO = carInteg.getCarModelByModelId(rentCarOrderReq.getCarModelId());
|
||||||
|
|
||||||
|
RentCarRuleDTO rentCarRuleDTO = carInteg.getRentCarRuleByCarRuleId(rentCarOrderReq.getRentCarRuleId());
|
||||||
|
|
||||||
|
RentBatteyRuleDTO rentBatteyRuleDTO = null;
|
||||||
|
if(rentCarOrderReq.getRentBatteyRuleId()!=null){
|
||||||
|
rentBatteyRuleDTO = carInteg.getRentBatteyRuleByBatteyRuleId(rentCarOrderReq.getRentBatteyRuleId());
|
||||||
|
}
|
||||||
|
|
||||||
|
String redisLockKey = RedisKeyConstants.ORDER_SUB_KEY + rentCarOrderReq.getCustomerId();
|
||||||
|
|
||||||
|
|
||||||
|
SimpleUserInfoDTO userInfoDTO = new SimpleUserInfoDTO();
|
||||||
|
userInfoDTO.setUserId(Math.toIntExact(rentCarOrderReq.getCustomerId()));
|
||||||
|
userInfoDTO.setUserName(rentCarOrderReq.getCustomerName());
|
||||||
|
userInfoDTO.setPhoneNumber(rentCarOrderReq.getCustomerPhone());
|
||||||
|
|
||||||
|
if(redisUtil.getRedisLock(redisLockKey, "租车下单")) {
|
||||||
|
try{
|
||||||
|
|
||||||
|
//TODO 这里保存订单要做事物处理
|
||||||
|
//生成订单主表
|
||||||
|
OrderMainPO orderMainPO = OrderConvert.INSTANCE.subOrderToPo(rentCarOrderReq, userInfoDTO, rentCarRuleDTO);
|
||||||
|
//orderMainPO.setOperatorId(Long.valueOf(companyStoreDTO.getOperatingCompanyId()));
|
||||||
|
orderMainPO.setOrderNo(OrderUtil.generateOrderNo());
|
||||||
|
orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PICK.getCode());
|
||||||
|
orderMainPO.setFirstOrderTime(LocalDateTime.now());
|
||||||
|
|
||||||
|
//设置预计还车时间
|
||||||
|
LocalDateTime endRentTime = OrderUtil.getEndRentTime(orderMainPO.getFirstOrderTime(),1,rentCarRuleDTO.getRentalDays(), rentCarRuleDTO.getRentalType());
|
||||||
|
orderMainPO.setEndRentTime(endRentTime);
|
||||||
|
|
||||||
|
|
||||||
|
//生成子表订单
|
||||||
|
String paymentType = rentCarOrderReq.getOrderSource();
|
||||||
|
|
||||||
|
List<OrderSubPO> orderSubPOList = new ArrayList<>();
|
||||||
|
|
||||||
|
//如果未开通免押则要生成押金订单
|
||||||
|
if(!rentCarOrderReq.getIsDepositFree()){
|
||||||
|
OrderSubPO depositOrder = new OrderSubPO();
|
||||||
|
depositOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.YJ_PREFIX));
|
||||||
|
depositOrder.setSuborderType(SubOrderTypeEnum.DEPOSIT.getCode());
|
||||||
|
depositOrder.setAmount(orderMainPO.getDepositPrice());
|
||||||
|
depositOrder.setCreatedAt(LocalDateTime.now());
|
||||||
|
depositOrder.setPaymentMethod(paymentType);
|
||||||
|
depositOrder.setTransactionId(rentCarOrderReq.getThirdOrderNo());
|
||||||
|
orderSubPOList.add(depositOrder);
|
||||||
|
}
|
||||||
|
//如果选择了租电套餐,则还需要生成租电子订单
|
||||||
|
if(rentBatteyRuleDTO!=null){
|
||||||
|
rentBatteyRuleDTO = carInteg.getRentBatteyRuleByBatteyRuleId(rentCarOrderReq.getRentBatteyRuleId());
|
||||||
|
OrderSubPO depositOrder = new OrderSubPO();
|
||||||
|
depositOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.ZD_PREFIX));
|
||||||
|
depositOrder.setSuborderType(SubOrderTypeEnum.RENTBATTEY.getCode());
|
||||||
|
depositOrder.setAmount(rentBatteyRuleDTO.getRentPrice());
|
||||||
|
depositOrder.setCreatedAt(LocalDateTime.now());
|
||||||
|
depositOrder.setPaymentMethod(paymentType);
|
||||||
|
depositOrder.setReturnTime(endRentTime);
|
||||||
|
depositOrder.setTransactionId(rentCarOrderReq.getThirdOrderNo());
|
||||||
|
orderSubPOList.add(depositOrder);
|
||||||
|
}
|
||||||
|
//生成租车订单
|
||||||
|
BigDecimal rentCarOrderAmount = OrderUtil.getRentCarAmount(rentCarRuleDTO.getRentalType(), rentCarRuleDTO.getRentalPrice(), rentCarRuleDTO.getRentalDays());
|
||||||
|
OrderSubPO rentOrder = new OrderSubPO();
|
||||||
|
rentOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.ZC_PREFIX));
|
||||||
|
rentOrder.setSuborderType(SubOrderTypeEnum.RENTCAR.getCode());
|
||||||
|
rentOrder.setAmount(rentCarOrderAmount);
|
||||||
|
rentOrder.setCreatedAt(LocalDateTime.now());
|
||||||
|
rentOrder.setPaymentMethod(paymentType);
|
||||||
|
rentOrder.setReturnTime(endRentTime);
|
||||||
|
rentOrder.setTransactionId(rentCarOrderReq.getThirdOrderNo());
|
||||||
|
orderSubPOList.add(rentOrder);
|
||||||
|
|
||||||
|
BigDecimal orderAmount = orderSubPOList.stream().map(OrderSubPO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
orderMainPO.setOrderAmount(orderAmount);
|
||||||
|
|
||||||
|
//发起支付返回预支付信息
|
||||||
|
String paymentId = OrderUtil.generateSubOrderNo(OrderUtil.ZF_PREFIX);
|
||||||
|
|
||||||
|
|
||||||
|
for(OrderSubPO orderSubPO : orderSubPOList){
|
||||||
|
orderSubPO.setPaymentId(paymentId);
|
||||||
|
orderSubPO.setPayStatus(PayStatusEnum.USERPAYING.getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
orderMainRepo.save(orderMainPO);
|
||||||
|
|
||||||
|
orderSubPOList.forEach(orderSubPO -> {
|
||||||
|
orderSubPO.setOrderId(orderMainPO.getOrderId());
|
||||||
|
});
|
||||||
|
orderSubRepo.saveBatch(orderSubPOList);
|
||||||
|
|
||||||
|
|
||||||
|
//返回订单信息
|
||||||
|
OrderDTO orderDTO = OrderConvert.INSTANCE.poToDto(orderMainPO);
|
||||||
|
//orderDTO.setCompanyStoreDTO(companyStoreDTO);
|
||||||
|
orderDTO.setCarModelSimpleDTO(carModelSimpleDTO);
|
||||||
|
|
||||||
|
RentCarOrderResultDTO rentCarOrderResultDTO = new RentCarOrderResultDTO();
|
||||||
|
rentCarOrderResultDTO.setOrderMainInfo(orderDTO);
|
||||||
|
//rentCarOrderResultDTO.setUnifiedPaymentInfo(unifiedPaymentInfoDTO);
|
||||||
|
|
||||||
|
return rentCarOrderResultDTO;
|
||||||
|
|
||||||
|
}catch (Exception e){
|
||||||
|
log.warn("下单失败", e);
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
redisUtil.deleteRedisLock(redisLockKey);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn("下单失败,锁已被占用");
|
||||||
|
throw new InnerException("服务器正在处理,请稍后再试");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user