毕设项目<<基于微信小程序的餐馆外卖系统的设计>>后端(八)

毕设项目<<基于微信小程序的餐馆外卖系统的设计后端>>(开发记录(八)商家端订单管理模块)

文章预览:

商家端订单管理模块

1.1 需求分析和设计
产品原型:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述

业务规则:
  • 输入订单号/手机号进行搜索,支持模糊搜索

  • 根据订单状态进行筛选

  • 下单时间进行时间筛选

  • 搜索内容为空,提示未找到相关订单

  • 搜索结果页,展示包含搜索关键词的内容

  • 分页展示搜索到的订单数据

接口设计:参见接口文档
1.2 代码实现
1.2.1 admin/OrderController

在admin包下创建OrderController


/**

 * 订单管理

 */

@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(pageResult);

    }

}

1.2.2 OrderService

    /**

     * 条件搜索订单

     * @param ordersPageQueryDTO

     * @return

     */

    PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);

1.2.3 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());

  

        // 将每一条订单菜品信息拼接为字符串(格式:宫保鸡丁*3;)

        List<String> orderDishList = orderDetailList.stream().map(x -> {

            String orderDish = x.getName() + "*" + x.getNumber() + ";";

            return orderDish;

        }).collect(Collectors.toList());

  

        // 将该订单对应的所有菜品信息拼接在一起

        return String.join("", orderDishList);

    }

1.3 功能测试

请添加图片描述

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

2.1 需求分析和设计
产品原型:

请添加图片描述

接口设计:参见接口文档

请添加图片描述

2.2 代码实现
2.2.1 admin/OrderController

    /**

     * 各个状态的订单数量统计

     *

     * @return

     */

    @GetMapping("/statistics")

    @ApiOperation("各个状态的订单数量统计")

    public Result<OrderStatisticsVO> statistics() {

        OrderStatisticsVO orderStatisticsVO = orderService.statistics();

        return Result.success(orderStatisticsVO);

    }

2.2.2 OrderService

    /**

     * 各个状态的订单数量统计

     * @return

     */

    OrderStatisticsVO statistics();

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

    }

2.2.4 OrderMapper

    /**

     * 根据状态统计订单数量

     * @param status

     */

    @Select("select count(id) from orders where status = #{status}")

    Integer countStatus(Integer status);

2.3 功能测试

请添加图片描述

3. 查询订单详情

3.1 需求分析和设计
产品原型:

请添加图片描述

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

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

接口设计:参见接口文档

请添加图片描述

3.2 代码实现
3.2.1 admin/OrderController

    /**

     * 订单详情

     *

     * @param id

     * @return

     */

    @GetMapping("/details/{id}")

    @ApiOperation("查询订单详情")

    public Result<OrderVO> details(@PathVariable("id") Long id) {

        OrderVO orderVO = orderService.details(id);

        return Result.success(orderVO);

    }

3.3 功能测试

请添加图片描述

4. 接单

4.1 需求分析和设计
产品原型:

请添加图片描述
请添加图片描述

4.2 代码实现
4.2.1 admin/OrderController

    /**

     * 接单

     *

     * @return

     */

    @PutMapping("/confirm")

    @ApiOperation("接单")

    public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) {

        orderService.confirm(ordersConfirmDTO);

        return Result.success();

    }

4.2.2 OrderService

    /**

     * 接单

     *

     * @param ordersConfirmDTO

     */

    void confirm(OrdersConfirmDTO ordersConfirmDTO);

4.2.3 OrderServiceImpl

    /**

     * 接单

     *

     * @param ordersConfirmDTO

     */

    public void confirm(OrdersConfirmDTO ordersConfirmDTO) {

        Orders orders = Orders.builder()

                .id(ordersConfirmDTO.getId())

                .status(Orders.CONFIRMED)

                .build();

  

        orderMapper.update(orders);

    }

5. 拒单

5.1 需求分析和设计
产品原型:

请添加图片描述
请添加图片描述

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

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

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

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

接口设计:参见接口文档业务规则:

请添加图片描述

5.2 代码实现
5.2.1 admin/OrderController

    /**

     * 拒单

     *

     * @return

     */

    @PutMapping("/rejection")

    @ApiOperation("拒单")

    public Result rejection(@RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception {

        orderService.rejection(ordersRejectionDTO);

        return Result.success();

    }

5.2.2 OrderService

    /**

     * 拒单

     *

     * @param ordersRejectionDTO

     */

    void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception;

5.2.3 OrderServiceImpl

    /**

     * 拒单

     *

     * @param ordersRejectionDTO

     */

    public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception {

        // 根据id查询订单

        Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());

  

        // 订单只有存在且状态为2(待接单)才可以拒单

        if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {

            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);

        }

  

        //支付状态

        Integer payStatus = ordersDB.getPayStatus();

        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 orders = new Orders();

        orders.setId(ordersDB.getId());

        orders.setStatus(Orders.CANCELLED);

        orders.setRejectionReason(ordersRejectionDTO.getRejectionReason());

        orders.setCancelTime(LocalDateTime.now());

  

        orderMapper.update(orders);

    }

6. 取消订单

6.1 需求分析和设计
产品原型:

请添加图片描述

业务规则:
  • 取消订单其实就是将订单状态修改为“已取消”

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

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

接口设计:参见接口文档

请添加图片描述

6.2 代码实现
6.2.1 admin/OrderController

    /**

     * 取消订单

     *

     * @return

     */

    @PutMapping("/cancel")

    @ApiOperation("取消订单")

    public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {

        orderService.cancel(ordersCancelDTO);

        return Result.success();

    }

6.2.2 OrderService

    /**

     * 商家取消订单

     *

     * @param ordersCancelDTO

     */

    void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception;

6.2.3 OrderServiceImpl

    /**

     * 取消订单

     *

     * @param ordersCancelDTO

     */

    public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {

        // 根据id查询订单

        Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());

  

        //支付状态

        Integer payStatus = ordersDB.getPayStatus();

        if (payStatus == 1) {

            //用户已支付,需要退款

            String refund = weChatPayUtil.refund(

                    ordersDB.getNumber(),

                    ordersDB.getNumber(),

                    new BigDecimal(0.01),

                    new BigDecimal(0.01));

            log.info("申请退款:{}", refund);

        }

  

        // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间

        Orders orders = new Orders();

        orders.setId(ordersCancelDTO.getId());

        orders.setStatus(Orders.CANCELLED);

        orders.setCancelReason(ordersCancelDTO.getCancelReason());

        orders.setCancelTime(LocalDateTime.now());

        orderMapper.update(orders);

    }

6.3 功能测试

请添加图片描述

7. 派送订单

7.1 需求分析和设计
产品原型:

请添加图片描述

业务规则:
  • 派送订单其实就是将订单状态修改为“派送中”

  • 只有状态为“待派送”的订单可以执行派送订单操作

接口设计:参见接口文档

请添加图片描述

7.2 代码实现
7.2.1 admin/OrderController

    /**

     * 派送订单

     *

     * @return

     */

    @PutMapping("/delivery/{id}")

    @ApiOperation("派送订单")

    public Result delivery(@PathVariable("id") Long id) {

        orderService.delivery(id);

        return Result.success();

    }

7.2.2 OrderService

    /**

     * 派送订单

     *

     * @param id

     */

    void delivery(Long id);

7.2.3 OrderServiceImpl

    /**

     * 派送订单

     *

     * @param id

     */

    public void delivery(Long id) {

        // 根据id查询订单

        Orders ordersDB = orderMapper.getById(id);

  

        // 校验订单是否存在,并且状态为3

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

    }

7.3 功能测试

请添加图片描述
请添加图片描述

8. 完成订单

8.1 需求分析和设计
产品原型:

请添加图片描述

业务规则:
  • 完成订单其实就是将订单状态修改为“已完成”

  • 只有状态为“派送中”的订单可以执行订单完成操作

接口设计:参见接口文档

请添加图片描述

8.2 代码实现
8.2.1 admin/OrderController
    /**
     * 完成订单
     *
     * @return
     */
    @PutMapping("/complete/{id}")
    @ApiOperation("完成订单")
    public Result complete(@PathVariable("id") Long id) {
        orderService.complete(id);
        return Result.success();
    }
8.2.2 OrderService
    /**
     * 完成订单
     *
     * @param id
     */
    void complete(Long id);
8.2.3 OrderServiceImpl
    /**
     * 完成订单
     *
     * @param id
     */
    public void complete(Long id) {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);

        // 校验订单是否存在,并且状态为4
        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);
    }
8.3 功能测试

请添加图片描述

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值