diff --git a/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java b/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java new file mode 100644 index 0000000..359df0a --- /dev/null +++ b/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java @@ -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; +} diff --git a/src/main/java/com/sczx/order/controller/ClientOrderController.java b/src/main/java/com/sczx/order/controller/ClientOrderController.java index 723212c..443943b 100644 --- a/src/main/java/com/sczx/order/controller/ClientOrderController.java +++ b/src/main/java/com/sczx/order/controller/ClientOrderController.java @@ -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 getOrderInfoByOrderNo(@RequestParam("orderNo") String orderNo){ + public Result getOrderInfoByOrderNo(@RequestParam("orderNo") String orderNo){ return Result.ok(orderService.getOrderInfoByOrderNo(orderNo)); } + + @ApiOperation(value = "申请还车") + @PostMapping("/requestReturnCar") + public Result requestReturnCar(@RequestBody ReturnCarReq returnCarReq){ + return Result.ok(orderService.requestReturnCar(returnCarReq)); + } } diff --git a/src/main/java/com/sczx/order/controller/StoreOrderController.java b/src/main/java/com/sczx/order/controller/StoreOrderController.java new file mode 100644 index 0000000..27f3102 --- /dev/null +++ b/src/main/java/com/sczx/order/controller/StoreOrderController.java @@ -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 bindCarToOrder(@RequestBody BindCarToOrderReq bindCarToOrderReq){ + return Result.ok(orderService.bindCarToOrder(bindCarToOrderReq)); + } + + @ApiOperation(value = "确认还车") + @PostMapping("/confirmReturnCar") + public Result confirmReturnCar(@RequestBody ReturnCarReq returnCarReq){ + return Result.ok(orderService.confirmReturnCar(returnCarReq)); + } +} diff --git a/src/main/java/com/sczx/order/convert/OrderConvert.java b/src/main/java/com/sczx/order/convert/OrderConvert.java index 73e9341..3a382a7 100644 --- a/src/main/java/com/sczx/order/convert/OrderConvert.java +++ b/src/main/java/com/sczx/order/convert/OrderConvert.java @@ -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), diff --git a/src/main/java/com/sczx/order/convert/OrderSubConvert.java b/src/main/java/com/sczx/order/convert/OrderSubConvert.java new file mode 100644 index 0000000..b10eeb9 --- /dev/null +++ b/src/main/java/com/sczx/order/convert/OrderSubConvert.java @@ -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 posToDtos(List orderSubPOList); +} diff --git a/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java b/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java new file mode 100644 index 0000000..d1119da --- /dev/null +++ b/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java @@ -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; +} diff --git a/src/main/java/com/sczx/order/dto/OrderMainDTO.java b/src/main/java/com/sczx/order/dto/OrderDTO.java similarity index 92% rename from src/main/java/com/sczx/order/dto/OrderMainDTO.java rename to src/main/java/com/sczx/order/dto/OrderDTO.java index 3ab50f5..39a0662 100644 --- a/src/main/java/com/sczx/order/dto/OrderMainDTO.java +++ b/src/main/java/com/sczx/order/dto/OrderDTO.java @@ -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 orderSubDTOList; } diff --git a/src/main/java/com/sczx/order/dto/OrderSubDTO.java b/src/main/java/com/sczx/order/dto/OrderSubDTO.java new file mode 100644 index 0000000..1073268 --- /dev/null +++ b/src/main/java/com/sczx/order/dto/OrderSubDTO.java @@ -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; +} diff --git a/src/main/java/com/sczx/order/dto/RentCarOrderResultDTO.java b/src/main/java/com/sczx/order/dto/RentCarOrderResultDTO.java index b3615ab..a1a48c5 100644 --- a/src/main/java/com/sczx/order/dto/RentCarOrderResultDTO.java +++ b/src/main/java/com/sczx/order/dto/RentCarOrderResultDTO.java @@ -10,7 +10,7 @@ import lombok.Data; @Data public class RentCarOrderResultDTO { @ApiModelProperty(value = "租车订单信息") - private OrderMainDTO orderMainInfo; + private OrderDTO orderMainInfo; @ApiModelProperty(value = "统一预支付信息") private UnifiedPaymentInfoDTO unifiedPaymentInfo; diff --git a/src/main/java/com/sczx/order/dto/ReturnCarReq.java b/src/main/java/com/sczx/order/dto/ReturnCarReq.java new file mode 100644 index 0000000..95183e9 --- /dev/null +++ b/src/main/java/com/sczx/order/dto/ReturnCarReq.java @@ -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; + +} diff --git a/src/main/java/com/sczx/order/po/OrderMainPO.java b/src/main/java/com/sczx/order/po/OrderMainPO.java index dd9b708..cd55ec2 100644 --- a/src/main/java/com/sczx/order/po/OrderMainPO.java +++ b/src/main/java/com/sczx/order/po/OrderMainPO.java @@ -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; + /** *

* 租车订单信息 @@ -94,6 +95,9 @@ public class OrderMainPO implements Serializable { @ApiModelProperty("还车时间") private LocalDateTime endRentTime; + @ApiModelProperty("申请还车时间") + private LocalDateTime reqEndRentTime; + @ApiModelProperty("实际还车时间") private LocalDateTime actEndRentTime; diff --git a/src/main/java/com/sczx/order/service/OrderService.java b/src/main/java/com/sczx/order/service/OrderService.java index 8008a06..ec4341f 100644 --- a/src/main/java/com/sczx/order/service/OrderService.java +++ b/src/main/java/com/sczx/order/service/OrderService.java @@ -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); + + } 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 e3a58b2..e4de1da 100644 --- a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java @@ -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 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 orderSubLambdaQueryWrapper = new LambdaQueryWrapper<>(); + orderSubLambdaQueryWrapper.eq(OrderSubPO::getOrderId,orderMainPO.getOrderId()); + List orderSubPOList = orderSubRepo.list(orderSubLambdaQueryWrapper); + List orderSubDTOList = OrderSubConvert.INSTANCE.posToDtos(orderSubPOList); + orderDTO.setOrderSubDTOList(orderSubDTOList); + return orderDTO; + } + + @Override + public OrderDTO bindCarToOrder(BindCarToOrderReq bindCarToOrderReq) { + //变更订单状态,记录租车时间 + LambdaUpdateWrapper 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 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 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()); } }