苍穹外卖 商家取消、派送、完成订单

OrderController

java 复制代码
// 取消订单
    // 取消订单逻辑:
    // 1.商家需要将订单状态修改为"已取消"
    // 2.商家取消订单时需要指定取消原因
    // 3.商家取消订单时,若用户已经完成了支付,那么需要为用户退款
    /**
     * 取消订单
     *
     * @param ordersCancelDTO
     * @return
     */
    @PutMapping("/cancel")
    @ApiOperation("取消订单")
    public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {
        orderService.cancel(ordersCancelDTO);
        return Result.success();
    }

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

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

OrderService

java 复制代码
/**
     * 取消订单
     *
     * @param ordersCancelDTO
     */
    @Override
    public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
        // 根据id查询需要取消的订单
        Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());
        // 查询支付状态判断是否应该退款
        Integer payStatus = ordersDB.getPayStatus();
        if (payStatus.equals(Orders.PAID)) {
            //用户已支付,需要退款
            refund(ordersDB);
        }

        // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
        // 封装一个Orders对象便于mapper操作数据库
        Orders orders = new Orders();
        // orderCancelDTO中的id和这个封装的Orders对象是一样的
        orders.setId(ordersCancelDTO.getId());
        // 修改订单状态
        orders.setStatus(Orders.CANCELLED);
        // 修改订单取消原因
        orders.setCancelReason(ordersCancelDTO.getCancelReason());
        // 修改订单取消时间
        orders.setCancelTime(LocalDateTime.now());
        // 在数据库中完成修改
        orderMapper.update(orders);
    }

    /**
     * 派送订单
     *
     * @param id
     */
    @Override
    public void delivery(Long id) {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);

        // 校验订单是否存在,并且状态是已接单(3)
        if (ordersDB == null) {
            // 若订单不存在,抛出订单不存在异常
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        if (!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);
    }

    /**
     * 完成订单
     *
     * @param id
     */
    @Override
    public void complete(Long id) {
        // 根据id查询订单
        Orders ordersDB = orderMapper.getById(id);
        // 检验订单是否存在,并且状态为派送中
        if (ordersDB == null) {
            // 若订单不存在,抛出订单不存在异常
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        if (!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);
    }

OrderMapper

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>
相关推荐
我笔记1 天前
.net4和core的差异与iis部署差异
java
白宇横流学长1 天前
基于SpringBoot实现的垃圾分类管理系统
java·spring boot·后端
tang&1 天前
【Python自动化测试】Selenium常用函数详解
开发语言·python·selenium
卜锦元1 天前
Golang项目开发过程中好用的包整理归纳(附带不同包仓库地址)
开发语言·后端·golang
Tony Bai1 天前
“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈:Go 的诞生、演进与未来
开发语言·后端·golang
sali-tec1 天前
C# 基于halcon的视觉工作流-章66 四目匹配
开发语言·人工智能·数码相机·算法·计算机视觉·c#
45288655上山打老虎1 天前
C++完美转发
java·jvm·c++
Seven971 天前
查找算法
java
hnlgzb1 天前
安卓app开发,如何快速上手kotlin和compose的开发?
android·开发语言·kotlin
无敌最俊朗@1 天前
STL-deque面试剖析(面试复习4)
开发语言