增加用户和门店查询订单接口

This commit is contained in:
2025-07-30 22:53:31 +08:00
parent 820be6d2a9
commit 5d4253fbf8
14 changed files with 308 additions and 10 deletions

View File

@ -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;

View File

@ -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<IPage<OrderSimpleDTO>> 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<RentCarOrderResultDTO> confirmRentalCarOrder(@RequestBody RentCarOrderReq rentCarOrderReq){

View File

@ -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<StoreOrderStatisticsDTO> storeOrderStatistics(@RequestParam("storeId") Long storeId){
return Result.ok(orderService.storeOrderStatistics(storeId));
}
@ApiOperation(value = "查询门店订单列表")
@PostMapping("/pageStoreOrder")
public Result<IPage<OrderSimpleDTO>> 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<OrderDTO> bindCarToOrder(@RequestBody BindCarToOrderReq bindCarToOrderReq){

View File

@ -11,6 +11,6 @@ public class BindCarToOrderReq {
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "车辆ID")
private Long vehicleId;
@ApiModelProperty(value = "车辆编号")
private String vin;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
/**
* <p>
@ -12,5 +17,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @since 2025-07-25 17:16:50
*/
public interface OrderMainMapper extends BaseMapper<OrderMainPO> {
StoreOrderStatisticsDTO storeOrderStatistics(@Param("storeId") Long storeId);
IPage<OrderSimpleDTO> pageQueryOrder(Page<OrderSimpleDTO> page, @Param("customerId") Long customerId, @Param("storeId") Long storeId, @Param("orderStatus") String orderStatus);
}

View File

@ -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<OrderMainPO> {
StoreOrderStatisticsDTO storeOrderStatistics(Long storeId);
/**
* 分页查询订单列表
*
* @param pageNo 页码
* @param pageSize 每页条数
* @param customerId 客户ID
* @param storeId 门店ID
* @param orderStatus 订单状态
* @return
*/
IPage<OrderSimpleDTO> pageQueryOrder(Integer pageNo, Integer pageSize, Long customerId, Long storeId, String orderStatus);
}

View File

@ -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<OrderMainMapper, OrderMainPO> implements OrderMainRepo {
@Override
public StoreOrderStatisticsDTO storeOrderStatistics(Long storeId) {
return this.getBaseMapper().storeOrderStatistics(storeId);
}
@Override
public IPage<OrderSimpleDTO> pageQueryOrder(Integer pageNo, Integer pageSize, Long customerId, Long storeId, String orderStatus) {
Page<OrderSimpleDTO> page = new Page<>(pageNo, pageSize);
return this.getBaseMapper().pageQueryOrder(page, customerId, storeId, orderStatus);
}
}

View File

@ -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<OrderSimpleDTO> pageCustOrder(Integer pageNo, Integer pageSize, OrderQueryReq orderQueryReq);
/**
* 查询门店订单列表
* @param orderQueryReq
* @return
*/
IPage<OrderSimpleDTO> pageStoreOrder(Integer pageNo, Integer pageSize, OrderQueryReq orderQueryReq);
}

View File

@ -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<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.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<OrderMainPO> 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<OrderSimpleDTO> 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<OrderSimpleDTO> pageStoreOrder(Integer pageNo, Integer pageSize, OrderQueryReq storeOrderQueryReq) {
return orderMainRepo.pageQueryOrder(pageNo, pageSize, storeOrderQueryReq.getCustomerId(), storeOrderQueryReq.getStoreId(), storeOrderQueryReq.getOrderStatus().getCode());
}
}

View File

@ -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='租车订单信息';

View File

@ -2,4 +2,46 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sczx.order.mapper.OrderMainMapper">
<select id="storeOrderStatistics" resultType="com.sczx.order.dto.StoreOrderStatisticsDTO">
SELECT
store_id,
COUNT(*) as total_orders,
SUM(CASE WHEN (status = 'AUTO_END' OR status = 'MANUAL_END') AND DATE_FORMAT(end_order_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') THEN 1 ELSE 0 END) as monthly_completed_orders,
SUM(CASE WHEN (status = 'AUTO_END' OR status = 'MANUAL_END') AND DATE_FORMAT(end_order_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') THEN order_amount ELSE 0 END) as monthly_order_amount,
COUNT(CASE WHEN status = 'WAIT_RETURN' THEN 1 END) as pending_pickup_count,
COUNT(CASE WHEN status = 'WAIT_RETURN' THEN 1 END) as pending_return_count,
COUNT(CASE WHEN status = 'RENT_OVERDUE' THEN 1 END) as overdue_count
FROM zc_order_main
WHERE store_id = #{storeId}
GROUP BY store_id
</select>
<select id="pageQueryOrder" resultType="com.sczx.order.dto.OrderSimpleDTO">
SELECT
o.order_id,
o.order_no,
o.status,
o.first_order_time,
o.end_rent_time,
o.car_model_id,
m.model_name,
m.brand_name,
m.image
from zc_order_main o join zc_car_model m on o.car_model_id = m.id
<where>
<if test="customerId != null">
and o.customer_id = #{customerId}
</if>
<if test="storeId != null">
and o.store_id = #{storeId}
</if>
<if test="orderStatus != null and orderStatus!= ''">
and o.status = #{orderStatus}
</if>
</where>
order by o.update_time desc
</select>
</mapper>