概要
在电商、外卖、票务等在线交易场景中,用户取消订单是一个常见的业务需求。当用户因为各种原因(如购买决策改变、商品信息错误、支付问题等)需要取消已下的订单
整体架构流程
技术细节
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>
效果展示