diff --git a/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java b/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java index 359df0a..645da8d 100644 --- a/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java +++ b/src/main/java/com/sczx/order/common/enums/OrderStatusEnum.java @@ -15,7 +15,9 @@ public enum OrderStatusEnum { WAIT_PICK("WAIT_PICK", "待取车"), RENT_ING("RENT_ING", "租赁中"), WAIT_RETURN("WAIT_RETURN", "待还车"), - RENT_END("RENT_END", "已结束"), + RENT_OVERDUE("RENT_OVERDUE", "逾期"), + AUTO_END("AUTO_END", "自动结束"), + MANUAL_END("MANUAL_END", "手动结束"), ; private final String code; diff --git a/src/main/java/com/sczx/order/controller/ClientOrderController.java b/src/main/java/com/sczx/order/controller/ClientOrderController.java index 443943b..204cead 100644 --- a/src/main/java/com/sczx/order/controller/ClientOrderController.java +++ b/src/main/java/com/sczx/order/controller/ClientOrderController.java @@ -1,10 +1,8 @@ package com.sczx.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.sczx.order.common.Result; -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.dto.*; import com.sczx.order.service.OrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -24,6 +22,14 @@ public class ClientOrderController { @Autowired private OrderService orderService; + @ApiOperation(value = "查询用户订单列表") + @PostMapping("/pageCustOrder") + public Result> pageCustOrder(@RequestParam(name = "pageNo", required = false, defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", required = false, defaultValue = "10") Integer pageSize, + @RequestBody OrderQueryReq orderQueryReq){ + return Result.ok(orderService.pageStoreOrder(pageNo, pageSize, orderQueryReq)); + } + @ApiOperation(value = "生成租车订单") @PostMapping("/confirmRentalCarOrder") public Result confirmRentalCarOrder(@RequestBody RentCarOrderReq rentCarOrderReq){ diff --git a/src/main/java/com/sczx/order/controller/StoreOrderController.java b/src/main/java/com/sczx/order/controller/StoreOrderController.java index 27f3102..2d23888 100644 --- a/src/main/java/com/sczx/order/controller/StoreOrderController.java +++ b/src/main/java/com/sczx/order/controller/StoreOrderController.java @@ -1,5 +1,6 @@ package com.sczx.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.sczx.order.common.Result; import com.sczx.order.dto.*; import com.sczx.order.service.OrderService; @@ -21,6 +22,20 @@ public class StoreOrderController { @Autowired private OrderService orderService; + @ApiOperation(value = "门店订单统计") + @GetMapping("/storeOrderStatistics") + public Result storeOrderStatistics(@RequestParam("storeId") Long storeId){ + return Result.ok(orderService.storeOrderStatistics(storeId)); + } + + @ApiOperation(value = "查询门店订单列表") + @PostMapping("/pageStoreOrder") + public Result> pageStoreOrder(@RequestParam(name = "pageNo", required = false, defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", required = false, defaultValue = "10") Integer pageSize, + @RequestBody OrderQueryReq storeOrderQueryReq){ + return Result.ok(orderService.pageStoreOrder(pageNo, pageSize, storeOrderQueryReq)); + } + @ApiOperation(value = "绑定车辆") @PostMapping("/bindCarToOrder") public Result bindCarToOrder(@RequestBody BindCarToOrderReq bindCarToOrderReq){ diff --git a/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java b/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java index d1119da..0d80820 100644 --- a/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java +++ b/src/main/java/com/sczx/order/dto/BindCarToOrderReq.java @@ -11,6 +11,6 @@ public class BindCarToOrderReq { @ApiModelProperty(value = "订单编号") private String orderNo; - @ApiModelProperty(value = "车辆ID") - private Long vehicleId; + @ApiModelProperty(value = "车辆编号") + private String vin; } diff --git a/src/main/java/com/sczx/order/dto/OrderQueryReq.java b/src/main/java/com/sczx/order/dto/OrderQueryReq.java new file mode 100644 index 0000000..c98d543 --- /dev/null +++ b/src/main/java/com/sczx/order/dto/OrderQueryReq.java @@ -0,0 +1,25 @@ +package com.sczx.order.dto; + +import com.sczx.order.common.enums.OrderStatusEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author: 张黎 + * @Date: 2025/07/30/16:02 + * @Description: + */ +@ApiModel(value = "门店订单查询请求参数") +@Data +public class OrderQueryReq { + + @ApiModelProperty("门店ID") + private Long storeId; + + @ApiModelProperty("用户id") + private Long customerId; + + @ApiModelProperty("订单状态") + private OrderStatusEnum orderStatus; +} diff --git a/src/main/java/com/sczx/order/dto/OrderSimpleDTO.java b/src/main/java/com/sczx/order/dto/OrderSimpleDTO.java new file mode 100644 index 0000000..5b90c8a --- /dev/null +++ b/src/main/java/com/sczx/order/dto/OrderSimpleDTO.java @@ -0,0 +1,59 @@ +package com.sczx.order.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.sczx.order.thirdpart.dto.CarModelSimpleDTO; +import com.sczx.order.thirdpart.dto.CompanyStoreDTO; +import com.sczx.order.thirdpart.dto.RentBatteyRuleDTO; +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 OrderSimpleDTO { + + @ApiModelProperty("订单ID(主键)") + private Long orderId; + + @ApiModelProperty("订单编号") + private String orderNo; + + @ApiModelProperty("订单状态:下单未提车、租赁中、已结束-自动、已结束-手动") + private String orderStatus; + + @ApiModelProperty("车型ID") + private Long carModelId; + + @ApiModelProperty("车型名称") + private String modelName; + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("车型图片") + private String image; + + @ApiModelProperty("订单状态标签") + private String orderStatusLabel; + + + @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 endRentTime; + + +} diff --git a/src/main/java/com/sczx/order/dto/StoreOrderStatisticsDTO.java b/src/main/java/com/sczx/order/dto/StoreOrderStatisticsDTO.java new file mode 100644 index 0000000..2249a38 --- /dev/null +++ b/src/main/java/com/sczx/order/dto/StoreOrderStatisticsDTO.java @@ -0,0 +1,35 @@ +package com.sczx.order.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author: 张黎 + * @Date: 2025/07/30/15:01 + * @Description: + */ +@ApiModel(value = "门店订单统计") +@Data +public class StoreOrderStatisticsDTO { + + @ApiModelProperty("订单总数") + private Integer totalOrders; + + @ApiModelProperty("本月完成订单数") + private Integer monthlyCompletedOrders; + + @ApiModelProperty("本月完成订单总金额") + private BigDecimal monthlyOrderAmount; + + @ApiModelProperty("待提车订单数") + private Integer pendingPickupCount; + + @ApiModelProperty("待还车订单数") + private Integer pendingReturnCount; + + @ApiModelProperty("逾期订单数") + private Integer overdueCount; +} diff --git a/src/main/java/com/sczx/order/mapper/OrderMainMapper.java b/src/main/java/com/sczx/order/mapper/OrderMainMapper.java index 6bec478..85f5ed8 100644 --- a/src/main/java/com/sczx/order/mapper/OrderMainMapper.java +++ b/src/main/java/com/sczx/order/mapper/OrderMainMapper.java @@ -1,7 +1,12 @@ package com.sczx.order.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.sczx.order.dto.OrderSimpleDTO; +import com.sczx.order.dto.StoreOrderStatisticsDTO; import com.sczx.order.po.OrderMainPO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -12,5 +17,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @since 2025-07-25 17:16:50 */ public interface OrderMainMapper extends BaseMapper { + StoreOrderStatisticsDTO storeOrderStatistics(@Param("storeId") Long storeId); + IPage pageQueryOrder(Page page, @Param("customerId") Long customerId, @Param("storeId") Long storeId, @Param("orderStatus") String orderStatus); } diff --git a/src/main/java/com/sczx/order/repository/OrderMainRepo.java b/src/main/java/com/sczx/order/repository/OrderMainRepo.java index 8fab9f6..0a82dad 100644 --- a/src/main/java/com/sczx/order/repository/OrderMainRepo.java +++ b/src/main/java/com/sczx/order/repository/OrderMainRepo.java @@ -1,5 +1,8 @@ package com.sczx.order.repository; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.sczx.order.dto.OrderSimpleDTO; +import com.sczx.order.dto.StoreOrderStatisticsDTO; import com.sczx.order.po.OrderMainPO; import com.baomidou.mybatisplus.extension.service.IService; @@ -12,5 +15,17 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2025-07-25 17:16:50 */ public interface OrderMainRepo extends IService { + StoreOrderStatisticsDTO storeOrderStatistics(Long storeId); + /** + * 分页查询订单列表 + * + * @param pageNo 页码 + * @param pageSize 每页条数 + * @param customerId 客户ID + * @param storeId 门店ID + * @param orderStatus 订单状态 + * @return + */ + IPage pageQueryOrder(Integer pageNo, Integer pageSize, Long customerId, Long storeId, String orderStatus); } diff --git a/src/main/java/com/sczx/order/repository/impl/OrderMainRepoImpl.java b/src/main/java/com/sczx/order/repository/impl/OrderMainRepoImpl.java index 7e508a6..31c8325 100644 --- a/src/main/java/com/sczx/order/repository/impl/OrderMainRepoImpl.java +++ b/src/main/java/com/sczx/order/repository/impl/OrderMainRepoImpl.java @@ -1,5 +1,9 @@ package com.sczx.order.repository.impl; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.sczx.order.dto.OrderSimpleDTO; +import com.sczx.order.dto.StoreOrderStatisticsDTO; import com.sczx.order.po.OrderMainPO; import com.sczx.order.mapper.OrderMainMapper; import com.sczx.order.repository.OrderMainRepo; @@ -17,4 +21,14 @@ import org.springframework.stereotype.Service; @Service public class OrderMainRepoImpl extends ServiceImpl implements OrderMainRepo { + @Override + public StoreOrderStatisticsDTO storeOrderStatistics(Long storeId) { + return this.getBaseMapper().storeOrderStatistics(storeId); + } + + @Override + public IPage pageQueryOrder(Integer pageNo, Integer pageSize, Long customerId, Long storeId, String orderStatus) { + Page page = new Page<>(pageNo, pageSize); + return this.getBaseMapper().pageQueryOrder(page, customerId, storeId, orderStatus); + } } diff --git a/src/main/java/com/sczx/order/service/OrderService.java b/src/main/java/com/sczx/order/service/OrderService.java index ec4341f..43baeff 100644 --- a/src/main/java/com/sczx/order/service/OrderService.java +++ b/src/main/java/com/sczx/order/service/OrderService.java @@ -1,6 +1,7 @@ package com.sczx.order.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.sczx.order.dto.*; public interface OrderService { @@ -40,5 +41,24 @@ public interface OrderService { */ OrderDTO confirmReturnCar(ReturnCarReq returnCarReq); + /** + * 门店订单统计 + * @param storeId + * @return + */ + StoreOrderStatisticsDTO storeOrderStatistics(Long storeId); + /** + * 查询门店订单列表 + * @param orderQueryReq + * @return + */ + IPage pageCustOrder(Integer pageNo, Integer pageSize, OrderQueryReq orderQueryReq); + + /** + * 查询门店订单列表 + * @param orderQueryReq + * @return + */ + IPage pageStoreOrder(Integer pageNo, Integer pageSize, OrderQueryReq orderQueryReq); } 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 d07b5dd..30171ee 100644 --- a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java @@ -2,6 +2,7 @@ package com.sczx.order.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.sczx.order.common.constant.RedisKeyConstants; import com.sczx.order.common.enums.MiniProgramTypeEnum; import com.sczx.order.common.enums.OrderStatusEnum; @@ -79,7 +80,7 @@ public class OrderServiceImpl implements OrderService { //TODO 这里保存订单要做事物处理 //生成订单主表 OrderMainPO orderMainPO = OrderConvert.INSTANCE.subOrderToPo(rentCarOrderReq, userInfoDTO, rentCarRuleDTO); - orderMainPO.setOperatorId(Long.valueOf(companyStoreDTO.getId().toString())); + orderMainPO.setOperatorId(Long.valueOf(companyStoreDTO.getOperatingCompanyId())); orderMainPO.setOrderNo(OrderUtil.generateOrderNo()); //TODO 默认应该是待支付状态,这里先默认支付完成待取车 // orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PAY.getCode()); @@ -189,11 +190,12 @@ public class OrderServiceImpl implements OrderService { @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.set(OrderMainPO::getVehicleId, bindCarToOrderReq.getVehicleId()); updateWrapper.eq(OrderMainPO::getOrderNo, bindCarToOrderReq.getOrderNo()); orderMainRepo.update(updateWrapper); //TODO 变更车辆状态 @@ -215,11 +217,27 @@ public class OrderServiceImpl implements OrderService { public OrderDTO confirmReturnCar(ReturnCarReq returnCarReq) { //变更订单状态,记录还车时间 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(OrderMainPO::getOrderStatus, OrderStatusEnum.RENT_END.getCode()); + updateWrapper.set(OrderMainPO::getOrderStatus, OrderStatusEnum.AUTO_END.getCode()); updateWrapper.set(OrderMainPO::getActEndRentTime, LocalDateTime.now()); updateWrapper.eq(OrderMainPO::getOrderNo, returnCarReq.getOrderNo()); orderMainRepo.update(updateWrapper); //TODO 变更车辆状态 return getOrderInfoByOrderNo(returnCarReq.getOrderNo()); } + + @Override + public StoreOrderStatisticsDTO storeOrderStatistics(Long storeId) { + return orderMainRepo.storeOrderStatistics(storeId); + } + + @Override + public IPage pageCustOrder(Integer pageNo, Integer pageSize, OrderQueryReq orderQueryReq) { + orderQueryReq.setCustomerId(Long.valueOf(jwtUtil.getUserInfoFromToken().getUserId().toString())); + return orderMainRepo.pageQueryOrder(pageNo, pageSize, orderQueryReq.getCustomerId(), orderQueryReq.getStoreId(), orderQueryReq.getOrderStatus().getCode()); + } + + @Override + public IPage pageStoreOrder(Integer pageNo, Integer pageSize, OrderQueryReq storeOrderQueryReq) { + return orderMainRepo.pageQueryOrder(pageNo, pageSize, storeOrderQueryReq.getCustomerId(), storeOrderQueryReq.getStoreId(), storeOrderQueryReq.getOrderStatus().getCode()); + } } diff --git a/src/main/resources/doc/dbInit.sql b/src/main/resources/doc/dbInit.sql new file mode 100644 index 0000000..314c3de --- /dev/null +++ b/src/main/resources/doc/dbInit.sql @@ -0,0 +1,40 @@ +CREATE TABLE `zc_order_main` ( + `order_id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID(主键)', + `order_no` varchar(50) NOT NULL COMMENT '订单编号', + `order_status` varchar(20) NOT NULL COMMENT '订单状态:下单未提车、租赁中、已结束-自动、已结束-手动', + `operator_id` bigint NOT NULL COMMENT '所属运营商ID', + `store_id` bigint NOT NULL COMMENT '所属门店ID', + `vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID', + `car_model_id` bigint NOT NULL COMMENT '车型ID', + `customer_id` bigint NOT NULL COMMENT '客户id', + `customer_name` varchar(50) NOT NULL COMMENT '客户姓名', + `customer_phone` varchar(20) NOT NULL COMMENT '客户联系电话', + `battery_type` varchar(50) DEFAULT '' COMMENT '选择的电池类型(48V标准版/100km,48V超长版/200km等)', + `rental_type` varchar(20) NOT NULL COMMENT '租赁类型(时租/日租/按天数/以租代售)', + `rental_days` int DEFAULT NULL COMMENT '租赁天数(当类型为"按天数"时使用)', + `rental_price` decimal(10,2) NOT NULL COMMENT '租车价格(元)', + `deposit_price` decimal(10,2) NOT NULL COMMENT '押金价格(元)', + `overdue_fee` decimal(10,2) NOT NULL COMMENT '逾期金额(元)', + `overdue_type` varchar(10) DEFAULT '按日计费' COMMENT '逾期计费类型(按日计费/按月计费)', + `is_deposit_free` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开通免押', + `is_auto_deduct` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开通代扣', + `first_order_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '首次下单时间', + `start_rent_time` datetime DEFAULT NULL COMMENT '开始计费时间', + `end_rent_time` datetime DEFAULT NULL COMMENT '预计还车时间', + `req_end_rent_time` datetime DEFAULT NULL COMMENT '申请还车时间', + `act_end_rent_time` datetime DEFAULT NULL COMMENT '实际还车时间', + `overdue_days` int NOT NULL DEFAULT '0' COMMENT '逾期天数', + `renewal_times` int NOT NULL DEFAULT '0' COMMENT '续租次数', + `charge_times` int NOT NULL DEFAULT '0' COMMENT '充电次数', + `rent_car_rule_id` bigint DEFAULT NULL COMMENT '租车套餐id', + `rent_battey_rule_id` bigint DEFAULT NULL COMMENT '租电套餐id', + `end_order_time` datetime DEFAULT NULL COMMENT '订单结束时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`order_id`), + KEY `idx_order_no` (`order_no`), + KEY `idx_customer_id` (`customer_id`), + KEY `idx_operator_id` (`operator_id`), + KEY `idx_store_id` (`store_id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='租车订单信息'; \ No newline at end of file diff --git a/src/main/resources/mapper/OrderMainMapper.xml b/src/main/resources/mapper/OrderMainMapper.xml index 79d6fa6..c7550c3 100644 --- a/src/main/resources/mapper/OrderMainMapper.xml +++ b/src/main/resources/mapper/OrderMainMapper.xml @@ -2,4 +2,46 @@ + + + +