用户取消订单业务

概要

在电商、外卖、票务等在线交易场景中,用户取消订单是一个常见的业务需求。当用户因为各种原因(如购买决策改变、商品信息错误、支付问题等)需要取消已下的订单

整体架构流程

技术细节

1.Controller层:

 @PutMapping("/cancel/{id}")
    @ApiOperation("取消订单")
    public Result cancelOrder(@PathVariable Long id){
        log.info("用户取消订单,订单号:{}",id);
        orderService.cancelOrder(id);
        return Result.success();
    }

2.Service层:

public void cancelOrder(Long id) {
        //根据订单id查询该订单
        Orders order = orderMapper.getById(id);
        //如果订单不存在,则报错
        if (order == null) {
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        //如果订单状态不能退款,则报错
        if (order.getStatus() > 2) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        //如果是待接单或者未付款,则可以直接取消,待接单需要退款
        if(order.getStatus() == Orders.TO_BE_CONFIRMED){
            //待接单需要退款
            //支付状态修改为 退款
            order.setPayStatus(Orders.REFUND);
        }
        //如果已接单或者在配送,则需要打商家电话沟通
        //取消成功修改订单状态,并更新订单表
        order.setStatus(Orders.CANCELLED);
        order.setCancelReason("用户取消");
        order.setCancelTime(LocalDateTime.now());
        orderMapper.update(order);
    }

3.Mapper层:

@Select("select * from `sky-take-out`.orders where id = #{id}")
    Orders getById(Long id);
<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>

 

效果展示

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值