目录

Day9内容

用户端历史订单模块

查询历史订单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

查询订单详情

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

取消订单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

再来一单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

管理端订单管理模块

订单搜索

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

在各状态下的订单数量统计

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

查询订单详情

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

接单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

拒单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

管理端取消订单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

派送订单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

完成订单

一.问题分析

二.代码实现

三.测试

四.gitee提交记录

校验收货地址是否超出配送范围

一.环境准备

二.代码实现

三.测试

四.gitee提交记录


Day9内容

用户端历史订单模块

查询历史订单

一.问题分析

产品原型

业务规则

  • 分页查询历史订单
  • 可以根据订单状态查询
  • 展示订单数据时,需要展示的数据包括:下单时间、订单状态、订单金额、订单明细(商品名称、图片)

接口设计

二.代码实现

OrderController(user)

    /**
     * 历史订单查询
     * @param page
     * @param pageSize
     * @param status  (单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消)
     * @return
     */
    @GetMapping("/historyOrders")
    @ApiOperation("历史订单查询")
    public Result<PageResult> page(int page,int pageSize,Integer status) {
        PageResult pageResult = orderService.pageQuery4User(page,pageSize,status);
        return Result.success(pageResult);
    }

OrderService

    /**
     * 用户端订单分页查询
     * @param page
     * @param pageSize
     * @param status
     * @return
     */
    PageResult pageQuery4User(int page, int pageSize, Integer status);

OrderServiceImpl

/**
     * 用户端订单分页查询
     * @param pageNum
     * @param pageSize
     * @param status
     * @return
     */
    public PageResult pageQuery4User(int pageNum, int pageSize, Integer status) {
        //设置分页
        PageHelper.startPage(pageNum, pageSize);
        OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
        ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
        ordersPageQueryDTO.setStatus(status);
        //分页条件查询
        Page<Orders> page=orderMapper.pageQuery(ordersPageQueryDTO);
        List<OrderVO> list = new ArrayList<>();
        //查询出订单明细,并封装如OrderVO进行响应
        if (page != null && page.getTotal() > 0) {
            for (Orders orders : page) {
                Long orderId = orders.getId();
                //查询订单明细
                List<OrderDetail> orderDetails = orderDetailMapper.getByOrderId(orderId);
                OrderVO orderVO = new OrderVO();
                BeanUtils.copyProperties(orders, orderVO);
                orderVO.setOrderDetailList(orderDetails);
                list.add(orderVO);
            }
        }
        return new PageResult(page.getTotal(), list);


    }

OrderMapper


    /**
     * 分页条件查询并按下单时间排序
     * @param ordersPageQueryDTO
     * @return
     */

    Page<Orders> pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);

OrderMapper.xml

<select id="pageQuery" resultType="Orders">
        select * from orders
        <where>
            <if test="number != null and number!=''">
                and number like concat('%',#{number},'%')
            </if>
            <if test="phone != null and phone!=''">
                and phone like concat('%',#{phone},'%')
            </if>
            <if test="userId != null">
                and user_id = #{userId}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="beginTime != null">
                and order_time &gt;= #{beginTime}
            </if>
            <if test="endTime != null">
                and order_time &lt;= #{endTime}
            </if>
        </where>
        order by order_time desc
    </select>

OrderDetailMapper

    /**
     * 根据订单id查询订单明细
     * @param orderId
     * @return
     */
    @Select("select * from order_detail where order_id = #{orderId}")
    List<OrderDetail> getByOrderId(Long orderId);
三.测试

因还未实现取消订单接口,超时取消的订单的状态还没有更新

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 查询历史订单功能
-查看详情:[Gitee 提交记录] 

feat: 查询历史订单功能 · 51a5413 · jh11/sky-take-out - Gitee.com

查询订单详情

一.问题分析

产品原型

接口设计

二.代码实现

OrderController(user)

    /**
     * 查询订单详情
     * @param id
     * @return
     */
    @GetMapping("/orderDetail/{id}")
    @ApiOperation("查询订单详情")
    public Result<OrderVO> details(@PathVariable("id")  Long id) {
        OrderVO orderVO =  orderService.details(id);
        return Result.success();
        
    }

OrderService

    /**
     * 查询订单详情
     * @param id
     * @return
     */
    OrderVO details(Long id);

OrderServiceImpl

    /**
     * 查询订单详情
     * @param id
     * @return
     */
    public OrderVO details(Long id) {
        //根据id查询订单
        Orders orders=orderMapper.getById(id);
        //查询该订单对应的菜品和套餐明细
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());
        //将该订单机器详情封装到OrderVO并返沪
        OrderVO orderVO = new OrderVO();
        BeanUtils.copyProperties(orders, orderVO);
        orderVO.setOrderDetailList(orderDetailList);
        return orderVO;
    }

OrderMapper

    /**
     * 根据id查询订单
     * @param id
     * @return
     */
    @Select("select * from orders where id=#{id} ")
    Orders getById(Long id);
三.测试

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 查询订单详情功能
-查看详情:[Gitee 提交记录] 

feat: 查询订单详情功能 · 20a9c38 · jh11/sky-take-out - Gitee.com

取消订单

一.问题分析

产品原型

业务规则:

- 待支付和待接单状态下,用户可直接取消订单
- 商家已接单状态下,用户取消订单需电话沟通商家
- 派送中状态下,用户取消订单需电话沟通商家
- 如果在待接单状态下取消订单,需要给用户退款
- 取消订单后需要将订单状态修改为“已取消”

接口设计

二.代码实现

OrderController(user)

    /**
     * 用户取消订单
     * @param id
     * @return
     * @throws Exception
     */
    @PutMapping("/cancel/{id}")
    @ApiOperation("取消订单")
    public Result cancel(@PathVariable("id") Long id) throws Exception {
        orderService.userCancelById(id);
        return Result.success();
    }

OrderService  注意抛出异常

    /**
     * 用户取消订单
     * @param id
     */
    void userCancelById(Long id) throws Exception;

OrderServiceImpl

    /**
     * 取消订单
     * @param id
     * @throws Exception
     */
    public void userCancelById(Long id  )  throws Exception {
        //按照id查询订单
        Orders ordersDB = orderMapper.getById(id);
        //判断订单是否存在,不是的话抛出异常
        if(ordersDB == null) {
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        //如果存在,继续根据订单状态判断 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
        if(ordersDB.getStatus() > 2){
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);

        }
        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        //订单如果在待接单窗台下取消需要进行退款
        if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
//            //调用微信支付退款接口
//            weChatPayUtil.refund(
//                    ordersDB.getNumber(), //商户订单号
//                    ordersDB.getNumber(), //商户退款单号
//                    new BigDecimal(0.01),//退款金额
//                    new BigDecimal(0.01));//原订单金额
//
//            //支付状态修改为退款
            orders.setPayStatus(Orders.REFUND);
        }
        //更新订单的状态,取消的原因和时间
        orders.setStatus(Orders.CANCELLED);
        orders.setCancelReason("用户取消");
        orders.setCancelTime(LocalDateTime.now());
        orderMapper.update(orders);

    }

因为微信支付接口没有实现,使用的是模拟支付,所以这个地方要注释掉调用微信支付接口的代码防止报错

三.测试

取消订单

数据库中的status字段更新为6 已取消

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 取消订单功能
-查看详情:[Gitee 提交记录] 

feat: 取消订单功能 · f9ab634 · jh11/sky-take-out - Gitee.com

再来一单

一.问题分析

产品原型

接口设计

二.代码实现

OrderController(user)

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

OrderService

    /**
     * 再来一单
     *
     * @param id
     */
    void repetition(Long id);

OrderServiceImpl

    /**
     * 再来一单
     * @param id
     */
    public void repetition(Long id) {
        //查询当前用户的id
        Long userId = BaseContext.getCurrentId();
        //根据订单id查询当前订单详情
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);
        //将订单详情对象转换为购物车对象
        List<ShoppingCart> shoppingCartList=orderDetailList.stream().map(x ->{
            ShoppingCart shoppingCart = new ShoppingCart();
            //把原订单详情里的菜品信息重新复制到购物车对象中
            BeanUtils.copyProperties(x, shoppingCart);
            shoppingCart.setUserId(userId);
            shoppingCart.setCreateTime(LocalDateTime.now());
            return shoppingCart;
        }).collect(Collectors.toList());
        //将复制到购物车中的菜品信息批量添加到数据库
        shoppingCartMapper.insertBatch(shoppingCartList);
    }

ShoppingCartMapper

    /**
     * 批量插入购物车数据
     * @param shoppingCartList
     */
    void insertBatch(List<ShoppingCart> shoppingCartList);

ShoppingCartMapper.xml

<insert id="insertBatch" parameterType="list">
        insert into shopping_cart
        (name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time)
        values
        <foreach collection="shoppingCartList" item="sc" separator=",">
            (#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime})
        </foreach>
</insert>
三.测试

点击再来一单可以重新把订单的商品加入购物车

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 再来一单功能
-查看详情:[Gitee 提交记录] 

feat: 再来一单功能 · 281c386 · jh11/sky-take-out - Gitee.com

管理端订单管理模块

订单搜索

一.问题分析

业务规则:

- 输入订单号/手机号进行搜索,支持模糊搜索
- 根据订单状态进行筛选
- 下单时间进行时间筛选
- 搜索内容为空,提示未找到相关订单
- 搜索结果页,展示包含搜索关键词的内容
- 分页展示搜索到的订单数据

接口设计

二.代码实现

OrderController(admin)新建

package com.sky.controller.admin;

import com.sky.dto.OrdersPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 订单管理
 */
@RestController("adminOrderController")
@RequestMapping("/admin/order")
@Slf4j
@Api(tags = "管理端订单管理接口")
public class OrderController {
    @Autowired
    private OrderService orderService;

    /**
     * 订单搜索
     * @param ordersPageQueryDTO
     * @return
     */
    @GetMapping("/conditionSearch")
    @ApiOperation("订单搜索")
    public Result<PageResult> conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
        PageResult pageResult=  orderService.conditionSearch(ordersPageQueryDTO);
        return Result.success();
    }

}

OrderService

    /**
     * 根据条件搜索订单
     * @param ordersPageQueryDTO
     * @return
     */

    PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

OrderServiceImpl

/**
     * 订单搜索
     * @param ordersPageQueryDTO
     * @return
     */
    public PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
        PageHelper.startPage(ordersPageQueryDTO.getPage(),ordersPageQueryDTO.getPageSize());
        Page<Orders> page=orderMapper.pageQuery(ordersPageQueryDTO);
        //部分订单状态需要额外返回订单的菜品信息,把Orders转化为OrderVO
        List<OrderVO> orderVOList=getOrderVOList(page);
        return new PageResult(page.getTotal(), orderVOList);
    }
    private List<OrderVO> getOrderVOList(Page<Orders> page) {
        //需要返回订单信息,自定义OrderVO响应结果
        List<OrderVO> orderVOList=new ArrayList<>();
        List<Orders> ordersList =page.getResult();
        if (!CollectionUtils.isEmpty(ordersList)) {
            for (Orders orders : ordersList) {
                //把共同字段复制到orderVO里
                OrderVO orderVO = new OrderVO();
                BeanUtils.copyProperties(orders, orderVO);
                String orderDishes = getOrderDishesStr(orders);
                //把菜品信息封装到orderVO中,并添加到orderVOList
                orderVO.setOrderDishes(orderDishes);
                orderVOList.add(orderVO);
            }
        }
        return orderVOList;
    }

    /**
     * 根据订单id获取菜品信息
     * @param orders
     * @return
     */
    private String getOrderDishesStr(Orders orders) {
        //查询订单菜品详情信息,比如订单中菜品的菜品和数量
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());
        //把每一条订单菜品信息拼接为字符串(格式:xxxxxx菜品*x)
        List<String> orderDishList = orderDetailList.stream().map(x -> {
            String orderDish = x.getName() + "*" + x.getNumber() + ";";
            return orderDish;
        }).collect(Collectors.toList());
        //把订单对应的菜品信息拼接到一起
        return String.join(";", orderDishList);
    }
三.测试

在已取消状态下搜索订单号查询,能正确查出结果

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 管理端订单搜索功能
-查看详情:[Gitee 提交记录] 

feat: 管理端订单搜索功能 · 376daa5 · jh11/sky-take-out - Gitee.com

在各状态下的订单数量统计

一.问题分析

产品原型

接口设计

二.代码实现

OrderController(admin)

    @Autowired
    private OrderService orderService;
    /**
     * 各状态下的订单数量统计
     * @return
     */
    @GetMapping("/statistics")
    @ApiOperation("各状态下的订单数量统计")
    public Result<OrderStatisticsVO> statistics(){
        OrderStatisticsVO orderStatisticsVO = orderService.statistics();
        return Result.success(orderStatisticsVO);

    }

OrderService

    /**
     * 各状态下的订单数量统计
     * @return
     */
    OrderStatisticsVO statistics();

OrderServiceImpl

    /**
     * 各状态下的订单数量统计
     * @return
     */
    public OrderStatisticsVO statistics() {
        //根据状态,分别查询出接待但,待派送,派送中的订单数量
        Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED);
        Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED);
        Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS);
        //把查询出来的数据封装到orderStatisticsVO中相应
        OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO();
        orderStatisticsVO.setToBeConfirmed(toBeConfirmed);
        orderStatisticsVO.setConfirmed(confirmed);
        orderStatisticsVO.setDeliveryInProgress(deliveryInProgress);
        return orderStatisticsVO;

    }

OrderMapper

    /**
     * 各状态下的订单数量统计
     * @param toBeConfirmed
     * @return
     */
    @Select("select count(id) from orders where status = #{status}")
    Integer countStatus(Integer toBeConfirmed);
三.测试

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 管理端各状态下的订单数量统计功能
-查看详情:[Gitee 提交记录] 

feat: 管理端各状态下的订单数量统计功能 · 2445409 · jh11/sky-take-out - Gitee.com

查询订单详情

一.问题分析

产品原型

业务规则:

- 订单详情页面需要展示订单基本信息(状态、订单号、下单时间、收货人、电话、收货地址、金额等)
- 订单详情页面需要展示订单明细数据(商品名称、数量、单价)

接口设计

二.代码实现

OrderController(admin)

    /**
     * 查询订单详情
     *
     * @param id
     * @return
     */
    @GetMapping("/details/{id}")
    @ApiOperation("查询订单详情")
    public Result<OrderVO> details(@PathVariable("id") Long id) {
        OrderVO orderVO = orderService.details(id);
        return Result.success(orderVO);

    }
三.测试

四.gitee提交记录

 2025-08-05
- 提交说明:feat(admin): 管理端订单详情查看功能
-查看详情:[Gitee 提交记录] 

feat(admin): 管理端订单详情查看功能 · 00659a6 · jh11/sky-take-out - Gitee.com

接单

一.问题分析

接口设计

二.代码实现

OrderController(admin)

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

OrderService

    /**
     * 接单
     *
     * @param ordersConfirmDTO
     */
    void confirm(OrdersConfirmDTO ordersConfirmDTO);

OrderServiceImpl

    /**
     * 接单
     *
     * @param ordersConfirmDTO
     */
    public void confirm(OrdersConfirmDTO ordersConfirmDTO) {
        Orders orders = Orders.builder()
                .id(ordersConfirmDTO.getId())
                .status(Orders.CONFIRMED)
                .build();

        orderMapper.update(orders);
    }
三.测试

数据库中的status字段变为已接单

四.gitee提交记录

 2025-08-05
- 提交说明:feat(admin): 管理端接单功能
-查看详情:[Gitee 提交记录] 

feat(admin): 管理端接单功能 · 4402c3d · jh11/sky-take-out - Gitee.com

拒单

一.问题分析

产品原型

业务规则:

- 商家拒单其实就是将订单状态修改为“已取消”
- 只有订单处于“待接单”状态时可以执行拒单操作
- 商家拒单时需要指定拒单原因
- 商家拒单时,如果用户已经完成了支付,需要为用户退款

接口设计

二.代码实现

OrderController(admin)

    /**
     * 拒单
     * @param ordersRejectionDTO
     * @return
     * @throws Exception
     */
    @PutMapping("/rejection")
    @ApiOperation("拒单")
    public Result rejection(@RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception{
        orderService.rejection(ordersRejectionDTO);
        return Result.success();
    }

OrderService

    /**
     * 拒单
     *
     * @param ordersRejectionDTO
     */
    void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception;

OrderServiceImpl

    /**
     * 拒单
     *
     * @param ordersRejectionDTO
     */
    public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());

        // 订单只有存在且状态为待接单才可以拒单
        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        //根据支付状态判断
        Integer payStatus = ordersDB.getPayStatus();
        Orders orders = new Orders();
        if (payStatus == Orders.PAID) {
//            //用户已支付,需要退款
//            String refund = weChatPayUtil.refund(
//                    ordersDB.getNumber(),
//                    ordersDB.getNumber(),
//                    new BigDecimal(0.01),
//                    new BigDecimal(0.01));
//            log.info("申请退款:{}", refund);

            // 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间
            orders.setId(ordersDB.getId());
            orders.setStatus(Orders.CANCELLED);
            orders.setRejectionReason(ordersRejectionDTO.getRejectionReason());
            orders.setCancelTime(LocalDateTime.now());
        }

        orderMapper.update(orders);
    }

因为先前的微信支付是模拟支付,会影响到退款功能,所以这里修改代码,如果用户已经支付,那么进行退款,并且根据订单id更新订单状态、拒单原因、取消时间

三.测试

四.gitee提交记录

 2025-08-05
- 提交说明:feat(admin): 管理端拒单功能
-查看详情:[Gitee 提交记录] 

feat(admin): 管理端拒单功能 · 5665390 · jh11/sky-take-out - Gitee.com

管理端取消订单

一.问题分析

产品原型

业务规则:

- 取消订单其实就是将订单状态修改为“已取消”
- 商家取消订单时需要指定取消原因
- 商家取消订单时,如果用户已经完成了支付,需要为用户退款

接口设计

二.代码实现

OrderController(admin)

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

OrderService

    /**
     * 商家取消订单
     * @param ordersCancelDTO
     */
    void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception;

OrderServiceImpl

    /**
     * 取消订单
     *
     * @param ordersCancelDTO
     */
    public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());

        //支付状态
        Integer payStatus = ordersDB.getPayStatus();
        Orders orders = new Orders();
        if (payStatus == 1) {
//            //用户已支付,需要退款
//            String refund = weChatPayUtil.refund(
//                    ordersDB.getNumber(),
//                    ordersDB.getNumber(),
//                    new BigDecimal(0.01),
//                    new BigDecimal(0.01));
//            log.info("申请退款:{}", refund);


            // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
            orders.setId(ordersCancelDTO.getId());
            orders.setStatus(Orders.CANCELLED);
            orders.setCancelReason(ordersCancelDTO.getCancelReason());
            orders.setCancelTime(LocalDateTime.now());
        }
        orderMapper.update(orders);
    }

此代码基本与拒单退款代码一直,注释后修改代码即可

三.测试

四.gitee提交记录

 2025-08-05
- 提交说明:feat(admin): 管理端取消订单功能
-查看详情:[Gitee 提交记录] 

feat(admin): 管理端取消订单功能 · 0d93d3b · jh11/sky-take-out - Gitee.com

派送订单

一.问题分析

业务规则:

- 派送订单其实就是将订单状态修改为“派送中”
- 只有状态为“待派送”的订单可以执行派送订单操作

二.代码实现

OrderController(admin)

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

OrderService

    /**
     * 派送订单
     *
     * @param id
     */
    void delivery(Long id);

OrderServiceImpl

  /**
     * 派送订单
     * @param id
     */
    public void delivery(Long id) {
        //根据id查询订单
        Orders ordersDB = orderMapper.getById(id);
        //校验订单是否存在,且状态是否为已接单
        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.CONFIRMED)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        //更新订单状态,状态转换为派送中
        orders.setStatus(Orders.DELIVERY_IN_PROGRESS);
        orderMapper.update(orders);
    }
三.测试

点击派送

此订单成功派送

数据库orders表此订单status变为4 派送中

四.gitee提交记录

 2025-08-05
- 提交说明:feat(admin): 管理端派送订单功能
-查看详情:[Gitee 提交记录] 

feat(admin): 管理端派送订单功能 · 4c84f5c · jh11/sky-take-out - Gitee.com

完成订单

一.问题分析

产品原型

业务规则:

- 完成订单其实就是将订单状态修改为“已完成”
- 只有状态为“派送中”的订单可以执行订单完成操作

接口设计

二.代码实现

OrderController(admin)

    /**
     * 完成订单
     * @param id
     * @return
     */
    @PutMapping("/complete/{id}")
    @ApiOperation("完成订单")
    public Result complete(@PathVariable("id") Long id) {
        orderService.complete(id);
        return Result.success();
        
    }

OrderService

    /**
     * 完成订单
     *
     * @param id
     */
    void complete(Long id);

OrderServiceImpl

    /**
     * 完成订单
     * @param id
     */
    public void complete(Long id) {
        //根据id查询订单
        Orders ordersDB = orderMapper.getById(id);
        //检验订单是否存在,并且状态是否为派送中
        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        //更新订单状态,状态转换为完成
        orders.setStatus(Orders.COMPLETED);
        orders.setDeliveryTime(LocalDateTime.now());
        orderMapper.update(orders);

    }
三.测试

在派送中的订单中点完成

刚刚的订单已经完成

数据库orders两个订单status已变为5 已完成

四.gitee提交记录

 2025-08-05
- 提交说明:feat(admin): 管理端完成订单功能
-查看详情:[Gitee 提交记录] 

feat(admin): 管理端完成订单功能 · d0967ac · jh11/sky-take-out - Gitee.com

校验收货地址是否超出配送范围

一.环境准备

注册账号:https://passport.baidu.com/v2/?reg&tt=1671699340600&overseas=&gid=CF954C2-A3D2-417F-9FE6-B0F249ED7E33&tpl=pp&u=https%3A%2F%2Flbsyun.baidu.com%2Findex.php%3Ftitle%3D%E9%A6%96%E9%A1%B5

登录百度地图开放平台:https://lbsyun.baidu.com/

进入控制台,创建应用,获取AK:

相关接口:

https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

https://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1

二.代码实现

application.yml

  shop:
    address: ${sky.shop.address}
  baidu:
    ak: ${sky.baidu.ak}

applicationdev.yml

  shop:
    address: 填写你的店铺地址
  baidu:
    ak: 填写你的ak码

OrderServiceImpl

    @Value("${sky.shop.address}")
    private String shopAddress;

    @Value("${sky.baidu.ak}")
    private String ak;
 /**
     * 检查客户的收货地址是否超出配送范围
     * @param address
     */
    private void checkOutOfRange(String address) {
        Map map = new HashMap();
        map.put("address",shopAddress);
        map.put("output","json");
        map.put("ak",ak);

        //获取店铺的经纬度坐标
        String shopCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        JSONObject jsonObject = JSON.parseObject(shopCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("店铺地址解析失败");
        }

        //数据解析
        JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
        String lat = location.getString("lat");
        String lng = location.getString("lng");
        //店铺经纬度坐标
        String shopLngLat = lat + "," + lng;

        map.put("address",address);
        //获取用户收货地址的经纬度坐标
        String userCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        jsonObject = JSON.parseObject(userCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("收货地址解析失败");
        }

        //数据解析
        location = jsonObject.getJSONObject("result").getJSONObject("location");
        lat = location.getString("lat");
        lng = location.getString("lng");
        //用户收货地址经纬度坐标
        String userLngLat = lat + "," + lng;

        map.put("origin",shopLngLat);
        map.put("destination",userLngLat);
        map.put("steps_info","0");

        //路线规划
        String json = HttpClientUtil.doGet("https://api.map.baidu.com/directionlite/v1/driving", map);

        jsonObject = JSON.parseObject(json);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("配送路线规划失败");
        }

        //数据解析
        JSONObject result = jsonObject.getJSONObject("result");
        JSONArray jsonArray = (JSONArray) result.get("routes");
        Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance");

        if(distance > 5000){
            //配送距离超过5000米
            throw new OrderBusinessException("超出配送范围");
        }
    }

在用户下单功能中插入代码于图中位置

前端代码修改

在图中位置插入代码

.catch(function (error) {
        // 处理错误响应
        console.error('请求失败:', error);
        uni.showToast({
          title: error.msg || '请求失败',
          icon: 'none'
        });
      })
三.测试

我的地址为济南市,所以判断“超出配送范围”

四.gitee提交记录

 2025-08-05
- 提交说明:feat: 检测是否超出配送范围功能
-查看详情:[Gitee 提交记录] 

feat: 检测是否超出配送范围功能 · c1b99e1 · jh11/sky-take-out - Gitee.com


资料来源:B站 黑马程序员

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐