OrderController
// 取消订单
// 取消订单逻辑:
// 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
/**
* 取消订单
*
* @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
<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>