目录

前言:

用户端:

1.查询历史订单

2.查询订单详情

3.取消订单

4.再来一单

管理端:

1.订单搜索

2. 各个状态的订单数量统计

3 需求分析和设计

4.接单

5.拒单

6.取消订单

7.派送订单

8.完成订单

总结:


 

前言:

本文对应外卖视频的day09项目实战,主包将记录自己的代码和思考

 

 

用户端:

1.查询历史订单

基本信息

Path: /user/order/historyOrders

Method: GET

接口描述:

请求参数

Query

参数名称 是否必须 示例 备注
page 1 页面
pageSize 10 每页记录数
status   订单状态

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number 非必须      
msg null 非必须      
data object 非必须      
├─ total number 非必须      
├─ records object [] 非必须    

item 类型: object

├─ id number 非必须      
├─ number string 非必须      
├─ status number 非必须      
├─ userId number 非必须      
├─ addressBookId number 非必须      
├─ orderTime string 非必须      
├─ checkoutTime string 非必须      
├─ payMethod number 非必须      
├─ payStatus number 非必须      
├─ amount number 非必须      
├─ remark string 非必须      
├─ userName null 非必须      
├─ phone string 非必须      
├─ address string 非必须      
├─ consignee string 非必须      
├─ cancelReason null 非必须      
├─ rejectionReason null 非必须      
├─ cancelTime null 非必须      
├─ estimatedDeliveryTime string 非必须      
├─ deliveryStatus number 非必须      
├─ deliveryTime null 非必须      
├─ packAmount number 非必须      
├─ tablewareNumber number 非必须      
├─ tablewareStatus number 非必须      
├─ orderDetailList object [] 非必须    

item 类型: object

├─ id number 必须      
├─ name string 必须      
├─ orderId number 必须      
├─ dishId number 必须      
├─ setmealId null 必须      
├─ dishFlavor null,string 必须      
├─ number number 必须      
├─ amount number 必须      
├─ image string 必须      

看到这个数据,返回的是order类多了一个orderDetailList 我想到了就是用两次mapper查两次,再封装到一起

OrderController:

 /**
     * 历史订单查询
     * @param ordersPageDTO
     * @return
     */
    @GetMapping("/historyOeders")
    public Result<PageResult> historyOrders(OrdersPageDTO ordersPageDTO){
        log.info("分页查询历史订单:{}",ordersPageDTO);
        //开始分页查询 还是封装到之前的PageResult中
        //这里我设计了一个DTO来接收前端传进来的三个参数
        PageResult pageResult = orderService.historyOrders(ordersPageDTO);
        return Result.success(pageResult);
    }

OrderService:

  PageResult historyOrders(OrdersPageDTO ordersPageDTO);

OrderServiceImpl:

  public PageResult historyOrders(OrdersPageDTO ordersPageDTO){

    //利用分页插件传进去两个参数开始分页查询
    //这里我还设计了一个VO对象,因为订单表和订单明细表是1对多的关系,所以要返回订单表和订单明细表
   //但是order表是没有的,所以用vo
       PageHelper.startPage(ordersPageDTO.getPage(), ordersPageDTO.getPageSize());
       Orders orders  = new Orders();
       BeanUtils.copyProperties(ordersPageDTO, orders);
       orders.setUserId(BaseContext.getCurrentId());
       //查询对应的历史订单数据,这里还没有查到订单明细表
       Page<OrderPageVO> page = ordersMapper.pageQuery(orders);
       //查了两次mapper,其实是可以多表查询用resultMap的
       //遍历对应的订单集合,给每个订单找到它的明细表
       for(OrderPageVO p: page){
           List<OrderDetail> list = orderDetailMapper.listByOrderId(p.getId());
            p.setOrderDetails(list);
    }
       return PageResult.builder()
               .total(page.getTotal())
               .records(page.getResult())
               .build();
           }
           /// 这里我使用build的时候报错了,要记得在对应类(Pagesult)上加@builder注解哦

OrdersMapper:

    /**
     * 查询历史订单数据
     * @param orders
     * @return
     */

   Page<OrderPageVO> pageQuery(Orders orders);

OrdersMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.OrdersMapper">
<select id="pageQuery" parameterType="com.sky.entity.Orders" resultType="com.sky.vo.OrderPageVO">
select  * from orders
<where>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="userId != null and userId != ''">
and user_id = #{userId}
</if>
</where>
    order by order_time desc
</select>

</mapper>

OrderDetail:

  @Select("select * from order_detail where order_id = #{orderId}")
   List<OrderDetail> listByOrderId(Long OrderId);

 

2.查询订单详情

基本信息

Path: /user/order/orderDetail/{id}

Method: GET

接口描述:

请求参数

路径参数

参数名称 示例 备注
id 101 订单id

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 非必须    

format: int32

data object 非必须      
├─ address string 非必须      
├─ addressBookId integer 非必须    

format: int64

├─ amount number 非必须      
├─ cancelReason string 非必须      
├─ cancelTime string 非必须    

format: date-time

├─ checkoutTime string 非必须    

format: date-time

├─ consignee string 非必须      
├─ deliveryStatus integer 非必须    

format: int32

├─ deliveryTime string 非必须    

format: date-time

├─ estimatedDeliveryTime string 非必须    

format: date-time

├─ id integer 非必须    

format: int64

├─ number string 非必须      
├─ orderDetailList object [] 非必须    

item 类型: object

├─ amount number 非必须      
├─ dishFlavor string 非必须      
├─ dishId integer 非必须    

format: int64

├─ id integer 非必须    

format: int64

├─ image string 非必须      
├─ name string 非必须      
├─ number integer 非必须    

format: int32

├─ orderId integer 非必须    

format: int64

├─ setmealId integer 非必须    

format: int64

├─ orderTime string 非必须    

format: date-time

├─ packAmount integer 非必须    

format: int32

├─ payMethod integer 非必须    

format: int32

├─ payStatus integer 非必须    

format: int32

├─ phone string 非必须      
├─ rejectionReason string 非必须      
├─ remark string 非必须      
├─ status integer 非必须    

format: int32

├─ tablewareNumber integer 非必须    

format: int32

├─ tablewareStatus integer 非必须    

format: int32

├─ userId integer 非必须    

format: int64

├─ userName string 非必须      
msg string 非必须  

这个跟上一个几乎一样,是上一个简化版

OrderController:

    /**
     * 查询订单详情
     * @param id
     * @return
     */
    @GetMapping("/orderDetail")
    public Result<OrderPageVO> orderDetail(@PathVariable Long id){
        log.info("查询订单详情:{}",id);
        OrderPageVO orderPageVO = orderService.orderDetail(id);
        return Result.success(orderPageVO);
    }

OrderService:

 OrderPageVO orderDetail(Long id);

OrderServiceImpl:

   public OrderPageVO orderDetail(Long id){
              OrderPageVO orderPageVO  = ordersMapper.getById(id);
             List<OrderDetail> list = orderDetailMapper.listByOrderId(id);
             orderPageVO.setOrderDetails(list);
             return orderPageVO;
           }

OrdersMapper:

@Select("SELECT * from orders where id = #{id}")
OrderPageVO getById(Long id);

3.取消订单

基本信息

Path: /user/order/cancel/{id}

Method: PUT

接口描述:

请求参数

路径参数

参数名称 示例 备注
id 101 订单id

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须      

业务规则:

  • 待支付和待接单状态下,用户可直接取消订单

  • 商家已接单状态下,用户取消订单需电话沟通商家

  • 派送中状态下,用户取消订单需电话沟通商家

  • 如果在待接单状态下取消订单,需要给用户退款

  • 取消订单后需要将订单状态修改为“已取消”

OrderController:

    /**
     * 取消订单
     * @param id
     * @Return
     */
    @PutMapping("/cancel/{id}")
    public Result cancel(@PathVariable Long id){
        log.info("取消订单:{}",id);
        orderService.cancel(id);
        return Result.success();


    }

OrderService:

void cancel(Long id);

OrderServiceImpl:

         public void cancel(Long id){
              OrderPageVO orderPageVO  = ordersMapper.getById(id);
              Orders orders = new Orders();
               BeanUtils.copyProperties(orderPageVO, orders);
               Integer status = orders.getStatus();
               /// 待派送和派送中的订单,用户不可取消,取消的和商家联系
               if (status > 2 ) {
                   throw new OrderBusinessException("和商家联系");
               }
              /// 待支付和待接单状态下,用户可直接取消订单
               /// 待支付退款
               if(status == Orders.PENDING_PAYMENT){
                   //退款 因为没实现微信支付功能 所以直接修改订单状态为退款
                   orders.setPayStatus(Orders.REFUND);
               }
               //取消订单
                orders.setStatus(Orders.CANCELLED);
                orders.setCancelReason("用户取消");
                orders.setCancelTime(LocalDateTime.now());
                ordersMapper.update(orders);

 }

OrdersMapper:

  /**
     * 修改订单信息
     * @param orders
     */
    void update(Orders orders);



@Select("SELECT * from orders where id = #{id}")
OrderPageVO getById(Long id);

OrdersMapper.xml:

    <update id="update" parameterType="com.sky.entity.Orders">
        update orders
        <set>
            <if test="cancelReason != null and cancelReason!='' "> cancel_reason=#{cancelReason}, </if>
            <if test="rejectionReason != null and rejectionReason!='' "> rejection_reason=#{rejectionReason}, </if>
            <if test="cancelTime != null"> cancel_time=#{cancelTime}, </if>
            <if test="payStatus != null"> pay_status=#{payStatus}, </if>
            <if test="payMethod != null"> pay_method=#{payMethod}, </if>
            <if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if>
            <if test="status != null"> status = #{status}, </if>
            <if test="deliveryTime != null"> delivery_time = #{deliveryTime} </if>
        </set>
        where id = #{id}
    </update>

4.再来一单

基本信息

Path: /user/order/repetition/{id}

Method: POST

接口描述:

请求参数

路径参数

参数名称

示例

备注

id

101

订单id

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须  

我选择复用加入购物车的代码

OrderController:

    /**
     * 再来一单
     * @param id
     * @Return
     */
    @PostMapping("/repetition/{id}")
     public Result repetition(@PathVariable Long id){
        log.info("再来一单:{}",id);
        orderService.repetition(id);
        return Result.success();
    }

OrderService:

 void repetition(Long id);

OrderServiceImpl:

    public void repetition(Long id){
        List<OrderDetail>   orderDetails = orderDetailMapper.listByOrderId(id);
              for(OrderDetail orderDetail:orderDetails){
                  ShoppingCartDTO cart = new ShoppingCartDTO();
                  BeanUtils.copyProperties(orderDetail, cart);
                  shoppingCartService.addShoppingCart(cart);
              }
    }

 

管理端:

1.订单搜索

基本信息

Path: /admin/order/conditionSearch

Method: GET

接口描述:

请求参数

Query

参数名称 是否必须 示例 备注
beginTime   beginTime
endTime   endTime
number   number
page   page
pageSize   pageSize
phone   phone
status   status

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code number 必须      
msg null 非必须      
data object 非必须      
├─ total number 非必须      
├─ records object [] 非必须    

item 类型: object

├─ id number 必须      
├─ number string 必须      
├─ status number 必须      
├─ userId number 必须      
├─ addressBookId number 必须      
├─ orderTime string 必须      
├─ checkoutTime null,string 必须      
├─ payMethod number 必须      
├─ payStatus number 必须      
├─ amount number 必须      
├─ remark string 必须      
├─ userName string 必须      
├─ phone string 必须      
├─ address string 必须      
├─ consignee string 必须      
├─ cancelReason string 必须      
├─ rejectionReason string 必须      
├─ cancelTime string 必须      
├─ estimatedDeliveryTime string 必须      
├─ deliveryStatus number 必须      
├─ deliveryTime string 必须      
├─ packAmount number 必须      
├─ tablewareNumber number 必须      
├─ tablewareStatus number 必须      
├─ orderDishes string 必须   订单包含的菜品,以字符串形式展示  

 OrderController:

    @GetMapping("conditionSearch")
    public Result<PageResult> conditionSearch( OrdersPageQueryDTO ordersPageQueryDTO) {
       log.info("订单条件查询");
     PageResult pageResult =  orderService.conditionSearch(ordersPageQueryDTO);

        return Result.success(pageResult);
    }

OrderService:

 PageResult conditionSearch( OrdersPageQueryDTO ordersPageQueryDTO);

OrderServiceImpl:

    public PageResult conditionSearch( OrdersPageQueryDTO ordersPageQueryDTO){
              /// 开始分页查询
        PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());
        /// 创建order 接受前端穿过来的参数
        Orders orders  = new Orders();
        BeanUtils.copyProperties(ordersPageQueryDTO, orders);
        /// 这里不要设置userId 因为是商家再查询所欲的用户订单,所以不用设置
        /// 这里刚开始写的是报错了   因为order刚开始是没有开始时间结束时间的 我又加上了而已
        Page<OrderPageVO> page = ordersMapper.pageQuery(orders);
        /// 返回参数是有字符串类型的订单信息的 所以遍历for循环 将OrderPageVO换成我们要传递的vo类型 顺便编写一个方法传递字符串类型的订单信息
        /// 黑马使用的是stream流的map 都一样
        List<OrderVO> list = new ArrayList<>();
        for(OrderPageVO p: page.getResult()){
            OrderVO orderVO = new OrderVO();
            BeanUtils.copyProperties(p, orderVO);
            orderVO.setOrderDishes(getOrderDishes(orderVO.getId()));
            list.add(orderVO);
        }
        return PageResult.builder()
                .total(page.getTotal())
                .records(list)
                .build();

    }

    public String getOrderDishes(Long id){
              /// 先查询出来对应的订单详细信息
        List<OrderDetail> list = orderDetailMapper.listByOrderId(id);
        /// 创建一个字符串集合
        List<String> dishes = new ArrayList<>();
        /// 遍历集合 拼接 要: 鱼香肉丝*3份
        for(OrderDetail orderDetail:list){
            String dish = orderDetail.getName() + "*" + orderDetail.getNumber() + "份";
            dishes.add(dish);
        }
        
        /// 把整个集合拼接起来
        return StringUtils.join(",", dishes);

    }

OrderDetailMapper:

@Select("select * from order_detail where order_id = #{orderId}")
   List<OrderDetail> listByOrderId(Long OrderId);

2. 各个状态的订单数量统计

 OrderController:

    @GetMapping("/statistics")
    public Result<OrderStatisticsVO > statistics(){
        log.info("各个状态的订单数量统计");
        return Result.success(orderService.getOrderStatistics());

    }

OrderService:

 OrderStatisticsVO getOrderStatistics();

OrderDetailMapper:

    public OrderStatisticsVO getOrderStatistics(){


        Integer toBeConfirmed = ordersMapper.getStatistics(Orders.TO_BE_CONFIRMED);
        Integer confirmed = ordersMapper.getStatistics(Orders.CONFIRMED);
        Integer deliveryInProgress = ordersMapper.getStatistics(Orders.DELIVERY_IN_PROGRESS);
       return OrderStatisticsVO.builder()
               .toBeConfirmed(toBeConfirmed)
               .confirmed(confirmed)
               .deliveryInProgress(deliveryInProgress)
               .build();
    }

3 需求分析和设计

基本信息

Path: /admin/order/details/{id}

Method: GET

接口描述:

请求参数

路径参数

参数名称

示例

备注

id

101

订单id

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
├─ address string 非必须      
├─ addressBookId integer 非必须    

format: int64

├─ amount number 非必须      
├─ cancelReason string 非必须      
├─ cancelTime string 非必须    

format: date-time

├─ checkoutTime string 非必须    

format: date-time

├─ consignee string 非必须      
├─ deliveryStatus integer 非必须    

format: int32

├─ deliveryTime string 非必须    

format: date-time

├─ estimatedDeliveryTime string 非必须    

format: date-time

├─ id integer 非必须    

format: int64

├─ number string 非必须      
├─ orderDetailList object [] 非必须    

item 类型: object

├─ amount number 非必须      
├─ dishFlavor string 非必须      
├─ dishId integer 非必须    

format: int64

├─ id integer 非必须    

format: int64

├─ image string 非必须      
├─ name string 非必须      
├─ number integer 非必须    

format: int32

├─ orderId integer 非必须    

format: int64

├─ setmealId integer 非必须    

format: int64

├─ orderDishes string 非必须      
├─ orderTime string 非必须    

format: date-time

├─ packAmount integer 非必须    

format: int32

├─ payMethod integer 非必须    

format: int32

├─ payStatus integer 非必须    

format: int32

├─ phone string 非必须      
├─ rejectionReason string 非必须      
├─ remark string 非必须      
├─ status integer 非必须    

format: int32

├─ tablewareNumber integer 非必须    

format: int32

├─ tablewareStatus integer 非必须    

format: int32

├─ userId integer 非必须    

format: int64

├─ userName string 非必须      
msg string 非必须    

业务规则:

  • 订单详情页面需要展示订单基本信息(状态、订单号、下单时间、收货人、电话、收货地址、金额等)

  • 订单详情页面需要展示订单明细数据(商品名称、数量、单价)

这里之在写用户端的时候其实已经相当于写过了

现在只用写controllor层

   @GetMapping("details/{id}")
    public Result<OrderPageVO> details(@PathVariable  Long id) {
        log.info("订单详情查询");
        return Result.success(orderService.orderDetail(id));
    }

 

4.接单

基本信息

Path: /admin/order/confirm

Method: PUT

接口描述:

请求参数

Headers

参数名称 参数值 是否必须 示例 备注
Content-Type application/json    

Body

名称 类型 是否必须 默认值 备注 其他信息
id integer 必须   订单id

format: int64

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须      

业务规则:

  • 商家接单其实就是将订单的状态修改为“已接单”

 OrderController:

    /**
     * 接单
     *
     * @return
     */
    @PutMapping("/confirm")
    public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) {
        orderService.confirm(ordersConfirmDTO);
        return Result.success();
    }

OrderService:

 void confirm(OrdersConfirmDTO ordersConfirmDTO);

OrderServiceImpl:

    public void confirm(OrdersConfirmDTO ordersConfirmDTO) {
        Orders orders = new Orders();
        BeanUtils.copyProperties(ordersConfirmDTO, orders);

        ordersMapper.update(orders);
    }

OrdersMapper.xml:

    <update id="update" parameterType="com.sky.entity.Orders">
        update orders
        <set>
            <if test="cancelReason != null and cancelReason!='' "> cancel_reason=#{cancelReason}, </if>
            <if test="rejectionReason != null and rejectionReason!='' "> rejection_reason=#{rejectionReason}, </if>
            <if test="cancelTime != null"> cancel_time=#{cancelTime}, </if>
            <if test="payStatus != null"> pay_status=#{payStatus}, </if>
            <if test="payMethod != null"> pay_method=#{payMethod}, </if>
            <if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if>
            <if test="status != null"> status = #{status}, </if>
            <if test="deliveryTime != null"> delivery_time = #{deliveryTime} </if>
        </set>
        where id = #{id}
    </update>

5.拒单

基本信息

Path: /admin/order/rejection

Method: PUT

接口描述:

请求参数

Headers

参数名称 参数值 是否必须 示例 备注
Content-Type application/json    

Body

名称 类型 是否必须 默认值 备注 其他信息
id integer 必须   订单id

format: int64

rejectionReason string 必须   拒单原因  

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须  

业务规则:

  • 商家拒单其实就是将订单状态修改为“已取消”

  • 只有订单处于“待接单”状态时可以执行拒单操作

  • 商家拒单时需要指定拒单原因

  • 商家拒单时,如果用户已经完成了支付,需要为用户退款

 OrderController:.

    @PutMapping("/rejection")
    public Result rejection(@RequestBody OrdersCancelDTO ordersCancelDTO){

        log.info("拒单");
        orderService.rejection(ordersCancelDTO);
        return Result.success();

OrderService:

void rejection(OrdersCancelDTO ordersCancelDTO);

OrderServiceImpl:

   public void rejection(OrdersCancelDTO ordersCancelDTO){
              Orders orders = new Orders();
      /// 先获取到订单 这里我的是vo 但是并不影响  用order转换一下
        OrderPageVO  orderPageVO  = ordersMapper.getById(ordersCancelDTO.getId());
           BeanUtils.copyProperties(orderPageVO, orders);
           /// 先判断订单存在吗 再判断订单状态
        if (orders == null || !orders.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        /// 是2 才处理
        if(orders.getPayStatus() == Orders.PAID){
            log.info("退款");
            orders.setPayStatus(Orders.REFUND);
        }

        orders.setCancelReason(ordersCancelDTO.getCancelReason());
        orders.setStatus(Orders.CANCELLED);
        orders.setCancelTime(LocalDateTime.now());
        ordersMapper.update(orders);
              }

OrdersMapper.xml:

    <update id="update" parameterType="com.sky.entity.Orders">
        update orders
        <set>
            <if test="cancelReason != null and cancelReason!='' "> cancel_reason=#{cancelReason}, </if>
            <if test="rejectionReason != null and rejectionReason!='' "> rejection_reason=#{rejectionReason}, </if>
            <if test="cancelTime != null"> cancel_time=#{cancelTime}, </if>
            <if test="payStatus != null"> pay_status=#{payStatus}, </if>
            <if test="payMethod != null"> pay_method=#{payMethod}, </if>
            <if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if>
            <if test="status != null"> status = #{status}, </if>
            <if test="deliveryTime != null"> delivery_time = #{deliveryTime} </if>
        </set>
        where id = #{id}
    </update>

6.取消订单

基本信息

Path: /admin/order/cancel

Method: PUT

接口描述:

请求参数

Headers

参数名称 参数值 是否必须 示例 备注
Content-Type application/json    

Body

名称 类型 是否必须 默认值 备注 其他信息
cancelReason string 必须   订单取消原因  
id integer 必须   订单id

format: int64

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须      

业务规则:

  • 取消订单其实就是将订单状态修改为“已取消”

  • 商家取消订单时需要指定取消原因

  • 商家取消订单时,如果用户已经完成了支付,需要为用户退款

其实跟上一个一模一样,还简单了些

 OrderController:

    /**
     * 取消订单
     *
     * @return
     */
    @PutMapping("/cancel")
    public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {
        orderService.admincancel(ordersCancelDTO);
        return Result.success();
    }

OrderService:

 void admincancel(OrdersCancelDTO ordersCancelDTO);

OrderServiceImpl:

 public void admincancel(OrdersCancelDTO ordersCancelDTO){
       Orders orders = new Orders();
       /// 先获取到订单 这里我的是vo 但是并不影响  用order转换一下
       OrderPageVO  orderPageVO  = ordersMapper.getById(ordersCancelDTO.getId());
       BeanUtils.copyProperties(orderPageVO, orders);
       /// 先判断订单存在吗
       if (orders == null ) {
           throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
       }

       if(orders.getPayStatus() == Orders.PAID){
           log.info("退款");
           orders.setPayStatus(Orders.REFUND);
       }

       orders.setCancelReason(ordersCancelDTO.getCancelReason());
       orders.setStatus(Orders.CANCELLED);
       orders.setCancelTime(LocalDateTime.now());
       ordersMapper.update(orders);

    }

OrdersMapper.xml:

    <update id="update" parameterType="com.sky.entity.Orders">
        update orders
        <set>
            <if test="cancelReason != null and cancelReason!='' "> cancel_reason=#{cancelReason}, </if>
            <if test="rejectionReason != null and rejectionReason!='' "> rejection_reason=#{rejectionReason}, </if>
            <if test="cancelTime != null"> cancel_time=#{cancelTime}, </if>
            <if test="payStatus != null"> pay_status=#{payStatus}, </if>
            <if test="payMethod != null"> pay_method=#{payMethod}, </if>
            <if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if>
            <if test="status != null"> status = #{status}, </if>
            <if test="deliveryTime != null"> delivery_time = #{deliveryTime} </if>
        </set>
        where id = #{id}
    </update>

7.派送订单

基本信息

Path: /admin/order/delivery/{id}

Method: PUT

接口描述:

请求参数

路径参数

参数名称

示例

备注

id

101

订单id

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须      

 OrderController:

    /**
     * 派送订单
     *
     * @return
     */
    @PutMapping("/delivery/{id}")
    public Result delivery(@PathVariable("id") Long id) {
        orderService.delivery(id);
        return Result.success();
    }

OrderService:

void delivery(Long id);

OrderServiceImpl:

    public void delivery(Long id) {
        Orders orders = new Orders();
        /// 先获取到订单 这里我的是vo 但是并不影响  用order转换一下
        // 根据id查询订单
        OrderPageVO  orderPageVO = ordersMapper.getById(id);
        BeanUtils.copyProperties(orderPageVO, orders);
        // 校验订单是否存在,并且状态为3
        if (orders == null || !orders.getStatus().equals(Orders.CONFIRMED)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }


        // 更新订单状态,状态转为派送中
        orders.setStatus(Orders.DELIVERY_IN_PROGRESS);

        ordersMapper.update(orders);
    }

OrdersMapper.xml:

    <update id="update" parameterType="com.sky.entity.Orders">
        update orders
        <set>
            <if test="cancelReason != null and cancelReason!='' "> cancel_reason=#{cancelReason}, </if>
            <if test="rejectionReason != null and rejectionReason!='' "> rejection_reason=#{rejectionReason}, </if>
            <if test="cancelTime != null"> cancel_time=#{cancelTime}, </if>
            <if test="payStatus != null"> pay_status=#{payStatus}, </if>
            <if test="payMethod != null"> pay_method=#{payMethod}, </if>
            <if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if>
            <if test="status != null"> status = #{status}, </if>
            <if test="deliveryTime != null"> delivery_time = #{deliveryTime} </if>
        </set>
        where id = #{id}
    </update>

 

 

8.完成订单

基本信息

Path: /admin/order/complete/{id}

Method: PUT

接口描述:

请求参数

Headers

参数名称

参数值

是否必须

示例

备注

Content-Type

application/json

 

 

路径参数

参数名称

示例

备注

id

101

订单id

返回数据

名称 类型 是否必须 默认值 备注 其他信息
code integer 必须    

format: int32

data object 非必须      
msg string 非必须      

OrderController:

  @PutMapping("/complete/{id}")
    public Result complete(@PathVariable("id") Long id) {
        orderService.complete(id);
        return Result.success();
    }

OrderService:

 void complete(Long id);

OrderServiceImpl:

  public void complete(Long id) {
        // 根据id查询订单
        Orders orders = new Orders();
        /// 先获取到订单 这里我的是vo 但是并不影响  用order转换一下
        // 根据id查询订单
        OrderPageVO  orderPageVO = ordersMapper.getById(id);
        BeanUtils.copyProperties(orderPageVO, orders);
        // 校验订单是否存在,并且状态为4
        if (orders == null || !orders.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        // 更新订单状态,状态转为完成
        orders.setStatus(Orders.COMPLETED);
        orders.setDeliveryTime(LocalDateTime.now());

        ordersMapper.update(orders);
    }

OrdersMapper.xml:

    <update id="update" parameterType="com.sky.entity.Orders">
        update orders
        <set>
            <if test="cancelReason != null and cancelReason!='' "> cancel_reason=#{cancelReason}, </if>
            <if test="rejectionReason != null and rejectionReason!='' "> rejection_reason=#{rejectionReason}, </if>
            <if test="cancelTime != null"> cancel_time=#{cancelTime}, </if>
            <if test="payStatus != null"> pay_status=#{payStatus}, </if>
            <if test="payMethod != null"> pay_method=#{payMethod}, </if>
            <if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if>
            <if test="status != null"> status = #{status}, </if>
            <if test="deliveryTime != null"> delivery_time = #{deliveryTime} </if>
        </set>
        where id = #{id}
    </update>

 

总结:

第九天的订单作业还是很值的一做的,很有锻炼意义

 

 

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐