增加确认租车,申请还车,绑定车辆,确认还车接口

This commit is contained in:
2025-07-27 14:39:30 +08:00
parent ab55c0fe2b
commit 648a98ee6a
13 changed files with 259 additions and 29 deletions

View File

@ -0,0 +1,23 @@
package com.sczx.order.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author: 张黎
* @Date: 2024/03/08/17:42
* @Description: 订单状态
*/
@AllArgsConstructor
@Getter
public enum OrderStatusEnum {
WAIT_PAY("WAIT_PAY", "待支付"),
WAIT_PICK("WAIT_PICK", "待取车"),
RENT_ING("RENT_ING", "租赁中"),
WAIT_RETURN("WAIT_RETURN", "待还车"),
RENT_END("RENT_END", "已结束"),
;
private final String code;
private final String msg;
}

View File

@ -1,9 +1,10 @@
package com.sczx.order.controller;
import com.sczx.order.common.Result;
import com.sczx.order.dto.OrderMainDTO;
import com.sczx.order.dto.OrderDTO;
import com.sczx.order.dto.RentCarOrderReq;
import com.sczx.order.dto.RentCarOrderResultDTO;
import com.sczx.order.dto.ReturnCarReq;
import com.sczx.order.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -31,7 +32,13 @@ public class ClientOrderController {
@ApiOperation(value = "根据订单查询订单信息")
@GetMapping("/getOrderInfoByOrderNo")
public Result<OrderMainDTO> getOrderInfoByOrderNo(@RequestParam("orderNo") String orderNo){
public Result<OrderDTO> getOrderInfoByOrderNo(@RequestParam("orderNo") String orderNo){
return Result.ok(orderService.getOrderInfoByOrderNo(orderNo));
}
@ApiOperation(value = "申请还车")
@PostMapping("/requestReturnCar")
public Result<OrderDTO> requestReturnCar(@RequestBody ReturnCarReq returnCarReq){
return Result.ok(orderService.requestReturnCar(returnCarReq));
}
}

View File

@ -0,0 +1,35 @@
package com.sczx.order.controller;
import com.sczx.order.common.Result;
import com.sczx.order.dto.*;
import com.sczx.order.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @Author: 张黎
* @Date: 2025/07/25/16:42
* @Description:
*/
@Api(value = "门店订单操作接口", tags = "门店订单操作接口")
@RestController
@RequestMapping("/storeOrder")
public class StoreOrderController {
@Autowired
private OrderService orderService;
@ApiOperation(value = "绑定车辆")
@PostMapping("/bindCarToOrder")
public Result<OrderDTO> bindCarToOrder(@RequestBody BindCarToOrderReq bindCarToOrderReq){
return Result.ok(orderService.bindCarToOrder(bindCarToOrderReq));
}
@ApiOperation(value = "确认还车")
@PostMapping("/confirmReturnCar")
public Result<OrderDTO> confirmReturnCar(@RequestBody ReturnCarReq returnCarReq){
return Result.ok(orderService.confirmReturnCar(returnCarReq));
}
}

View File

@ -1,6 +1,6 @@
package com.sczx.order.convert;
import com.sczx.order.dto.OrderMainDTO;
import com.sczx.order.dto.OrderDTO;
import com.sczx.order.dto.RentCarOrderReq;
import com.sczx.order.dto.SimpleUserInfoDTO;
import com.sczx.order.po.OrderMainPO;
@ -15,9 +15,9 @@ public interface OrderConvert {
OrderConvert INSTANCE = Mappers.getMapper(OrderConvert.class);
OrderMainDTO poToDto(OrderMainPO orderMainPO);
OrderDTO poToDto(OrderMainPO orderMainPO);
OrderMainPO dtoToPo(OrderMainDTO orderMainDTO);
OrderMainPO dtoToPo(OrderDTO orderDTO);
@Mappings({
@Mapping(target = "orderId", ignore = true),

View File

@ -0,0 +1,15 @@
package com.sczx.order.convert;
import com.sczx.order.dto.OrderSubDTO;
import com.sczx.order.po.OrderSubPO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface OrderSubConvert {
OrderSubConvert INSTANCE = Mappers.getMapper(OrderSubConvert.class);
OrderSubDTO poToDto(OrderSubPO orderSubPO);
List<OrderSubDTO> posToDtos(List<OrderSubPO> orderSubPOList);
}

View File

@ -0,0 +1,16 @@
package com.sczx.order.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(value = "绑定车辆到订单请求参数")
@Data
public class BindCarToOrderReq {
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "车辆ID")
private Long vehicleId;
}

View File

@ -1,7 +1,5 @@
package com.sczx.order.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sczx.order.thirdpart.dto.CarModelSimpleDTO;
import com.sczx.order.thirdpart.dto.CompanyStoreDTO;
import io.swagger.annotations.ApiModel;
@ -10,6 +8,7 @@ import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* @Author: 张黎
@ -18,7 +17,7 @@ import java.time.LocalDateTime;
*/
@Data
@ApiModel(value = "订单dto", description = "租车订单信息")
public class OrderMainDTO {
public class OrderDTO {
@ApiModelProperty("订单ID主键")
private Long orderId;
@ -92,6 +91,9 @@ public class OrderMainDTO {
@ApiModelProperty("还车时间")
private LocalDateTime endRentTime;
@ApiModelProperty("申请还车时间")
private LocalDateTime reqEndRentTime;
@ApiModelProperty("实际还车时间")
private LocalDateTime actEndRentTime;
@ -115,4 +117,7 @@ public class OrderMainDTO {
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
@ApiModelProperty("租车子订单信息")
private List<OrderSubDTO> orderSubDTOList;
}

View File

@ -0,0 +1,46 @@
package com.sczx.order.dto;
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;
@ApiModelProperty("订单产生时间")
private LocalDateTime createdAt;
@ApiModelProperty("支付ID")
private String paymentId;
@ApiModelProperty("实际支付时间")
private LocalDateTime paidAt;
@ApiModelProperty("备注")
private String remark;
}

View File

@ -10,7 +10,7 @@ import lombok.Data;
@Data
public class RentCarOrderResultDTO {
@ApiModelProperty(value = "租车订单信息")
private OrderMainDTO orderMainInfo;
private OrderDTO orderMainInfo;
@ApiModelProperty(value = "统一预支付信息")
private UnifiedPaymentInfoDTO unifiedPaymentInfo;

View File

@ -0,0 +1,14 @@
package com.sczx.order.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "还车请求参数")
public class ReturnCarReq {
@ApiModelProperty(value = "订单编号")
private String orderNo;
}

View File

@ -3,14 +3,15 @@ package com.sczx.order.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* 租车订单信息
@ -94,6 +95,9 @@ public class OrderMainPO implements Serializable {
@ApiModelProperty("还车时间")
private LocalDateTime endRentTime;
@ApiModelProperty("申请还车时间")
private LocalDateTime reqEndRentTime;
@ApiModelProperty("实际还车时间")
private LocalDateTime actEndRentTime;

View File

@ -1,9 +1,7 @@
package com.sczx.order.service;
import com.sczx.order.dto.OrderMainDTO;
import com.sczx.order.dto.RentCarOrderReq;
import com.sczx.order.dto.RentCarOrderResultDTO;
import com.sczx.order.dto.*;
public interface OrderService {
@ -19,5 +17,28 @@ public interface OrderService {
* @param orderNo
* @return
*/
OrderMainDTO getOrderInfoByOrderNo(String orderNo);
OrderDTO getOrderInfoByOrderNo(String orderNo);
/**
* 绑定车辆到订单
* @param bindCarToOrderReq
* @return
*/
OrderDTO bindCarToOrder(BindCarToOrderReq bindCarToOrderReq);
/**
* 申请还车
* @param returnCarReq
* @return
*/
OrderDTO requestReturnCar(ReturnCarReq returnCarReq);
/**
* 确认还车
* @param returnCarReq
* @return
*/
OrderDTO confirmReturnCar(ReturnCarReq returnCarReq);
}

View File

@ -1,15 +1,15 @@
package com.sczx.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.sczx.order.common.constant.RedisKeyConstants;
import com.sczx.order.common.enums.MiniProgramTypeEnum;
import com.sczx.order.common.enums.OrderStatusEnum;
import com.sczx.order.common.enums.PaymentTypeEnum;
import com.sczx.order.common.enums.SubOrderTypeEnum;
import com.sczx.order.convert.OrderConvert;
import com.sczx.order.dto.OrderMainDTO;
import com.sczx.order.dto.RentCarOrderReq;
import com.sczx.order.dto.RentCarOrderResultDTO;
import com.sczx.order.dto.SimpleUserInfoDTO;
import com.sczx.order.convert.OrderSubConvert;
import com.sczx.order.dto.*;
import com.sczx.order.exception.InnerException;
import com.sczx.order.po.OrderMainPO;
import com.sczx.order.po.OrderSubPO;
@ -74,6 +74,9 @@ public class OrderServiceImpl implements OrderService {
//生成订单主表
OrderMainPO orderMainPO = OrderConvert.INSTANCE.subOrderToPo(rentCarOrderReq, userInfoDTO, rentCarRuleDTO);
orderMainPO.setOrderNo(OrderUtil.generateOrderNo());
//TODO 默认应该是待支付状态,这里先默认支付完成待取车
// orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PAY.getCode());
orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PICK.getCode());
orderMainRepo.save(orderMainPO);
//生成子表订单
@ -117,12 +120,12 @@ public class OrderServiceImpl implements OrderService {
UnifiedPaymentInfoDTO unifiedPaymentInfoDTO = new UnifiedPaymentInfoDTO();
//返回订单信息
OrderMainDTO orderMainDTO = OrderConvert.INSTANCE.poToDto(orderMainPO);
orderMainDTO.setCompanyStoreDTO(companyStoreDTO);
orderMainDTO.setCarModelSimpleDTO(carModelSimpleDTO);
OrderDTO orderDTO = OrderConvert.INSTANCE.poToDto(orderMainPO);
orderDTO.setCompanyStoreDTO(companyStoreDTO);
orderDTO.setCarModelSimpleDTO(carModelSimpleDTO);
RentCarOrderResultDTO rentCarOrderResultDTO = new RentCarOrderResultDTO();
rentCarOrderResultDTO.setOrderMainInfo(orderMainDTO);
rentCarOrderResultDTO.setOrderMainInfo(orderDTO);
rentCarOrderResultDTO.setUnifiedPaymentInfo(unifiedPaymentInfoDTO);
return rentCarOrderResultDTO;
@ -140,17 +143,58 @@ public class OrderServiceImpl implements OrderService {
}
@Override
public OrderMainDTO getOrderInfoByOrderNo(String orderNo) {
public OrderDTO getOrderInfoByOrderNo(String orderNo) {
LambdaQueryWrapper<OrderMainPO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OrderMainPO::getOrderNo, orderNo);
OrderMainPO orderMainPO = orderMainRepo.getOne(queryWrapper);
OrderMainDTO orderMainDTO = OrderConvert.INSTANCE.poToDto(orderMainPO);
OrderDTO orderDTO = OrderConvert.INSTANCE.poToDto(orderMainPO);
//获取门店信息
CompanyStoreDTO companyStoreDTO = storeInteg.getStoreById(Integer.valueOf(orderMainPO.getStoreId().toString()));
CarModelSimpleDTO carModelSimpleDTO = carInteg.getCarModelByModelId(orderMainPO.getCarModelId());
orderMainDTO.setCarModelSimpleDTO(carModelSimpleDTO);
orderMainDTO.setCompanyStoreDTO(companyStoreDTO);
return orderMainDTO;
orderDTO.setCarModelSimpleDTO(carModelSimpleDTO);
orderDTO.setCompanyStoreDTO(companyStoreDTO);
LambdaQueryWrapper<OrderSubPO> orderSubLambdaQueryWrapper = new LambdaQueryWrapper<>();
orderSubLambdaQueryWrapper.eq(OrderSubPO::getOrderId,orderMainPO.getOrderId());
List<OrderSubPO> orderSubPOList = orderSubRepo.list(orderSubLambdaQueryWrapper);
List<OrderSubDTO> orderSubDTOList = OrderSubConvert.INSTANCE.posToDtos(orderSubPOList);
orderDTO.setOrderSubDTOList(orderSubDTOList);
return orderDTO;
}
@Override
public OrderDTO bindCarToOrder(BindCarToOrderReq bindCarToOrderReq) {
//变更订单状态,记录租车时间
LambdaUpdateWrapper<OrderMainPO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(OrderMainPO::getOrderStatus, OrderStatusEnum.RENT_ING.getCode());
updateWrapper.set(OrderMainPO::getStartRentTime, LocalDateTime.now());
updateWrapper.set(OrderMainPO::getVehicleId, bindCarToOrderReq.getVehicleId());
updateWrapper.eq(OrderMainPO::getOrderNo, bindCarToOrderReq.getOrderNo());
orderMainRepo.update(updateWrapper);
//TODO 变更车辆状态
return getOrderInfoByOrderNo(bindCarToOrderReq.getOrderNo());
}
@Override
public OrderDTO requestReturnCar(ReturnCarReq returnCarReq) {
LambdaUpdateWrapper<OrderMainPO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(OrderMainPO::getOrderStatus, OrderStatusEnum.WAIT_RETURN.getCode());
updateWrapper.set(OrderMainPO::getReqEndRentTime, LocalDateTime.now());
updateWrapper.eq(OrderMainPO::getOrderNo, returnCarReq.getOrderNo());
orderMainRepo.update(updateWrapper);
return getOrderInfoByOrderNo(returnCarReq.getOrderNo());
}
@Override
public OrderDTO confirmReturnCar(ReturnCarReq returnCarReq) {
//变更订单状态,记录还车时间
LambdaUpdateWrapper<OrderMainPO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(OrderMainPO::getOrderStatus, OrderStatusEnum.RENT_END.getCode());
updateWrapper.set(OrderMainPO::getActEndRentTime, LocalDateTime.now());
updateWrapper.eq(OrderMainPO::getOrderNo, returnCarReq.getOrderNo());
orderMainRepo.update(updateWrapper);
//TODO 变更车辆状态
return getOrderInfoByOrderNo(returnCarReq.getOrderNo());
}
}