苍穹外卖day06
目录
前言:
用户端:
1.查询历史订单
2.查询订单详情
3.取消订单
4.再来一单
管理端:
1.订单搜索
2. 各个状态的订单数量统计
3 需求分析和设计
4.接单
5.拒单
6.取消订单
7.派送订单
8.完成订单
总结:
前言:
本文对应外卖视频的day09项目实战,主包将记录自己的代码和思考
用户端:
1.查询历史订单
基本信息
Path: /user/order/historyOrders
Method: GET
接口描述:
请求参数
Query
参数名称 | 是否必须 | 示例 | 备注 |
---|---|---|---|
page | 是 | 1 | 页面 |
pageSize | 是 | 10 | 每页记录数 |
status | 否 | 订单状态 |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | number | 非必须 | |||
msg | null | 非必须 | |||
data | object | 非必须 | |||
├─ total | number | 非必须 | |||
├─ records | object [] | 非必须 | item 类型: object | ||
├─ id | number | 非必须 | |||
├─ number | string | 非必须 | |||
├─ status | number | 非必须 | |||
├─ userId | number | 非必须 | |||
├─ addressBookId | number | 非必须 | |||
├─ orderTime | string | 非必须 | |||
├─ checkoutTime | string | 非必须 | |||
├─ payMethod | number | 非必须 | |||
├─ payStatus | number | 非必须 | |||
├─ amount | number | 非必须 | |||
├─ remark | string | 非必须 | |||
├─ userName | null | 非必须 | |||
├─ phone | string | 非必须 | |||
├─ address | string | 非必须 | |||
├─ consignee | string | 非必须 | |||
├─ cancelReason | null | 非必须 | |||
├─ rejectionReason | null | 非必须 | |||
├─ cancelTime | null | 非必须 | |||
├─ estimatedDeliveryTime | string | 非必须 | |||
├─ deliveryStatus | number | 非必须 | |||
├─ deliveryTime | null | 非必须 | |||
├─ packAmount | number | 非必须 | |||
├─ tablewareNumber | number | 非必须 | |||
├─ tablewareStatus | number | 非必须 | |||
├─ orderDetailList | object [] | 非必须 | item 类型: object | ||
├─ id | number | 必须 | |||
├─ name | string | 必须 | |||
├─ orderId | number | 必须 | |||
├─ dishId | number | 必须 | |||
├─ setmealId | null | 必须 | |||
├─ dishFlavor | null,string | 必须 | |||
├─ number | number | 必须 | |||
├─ amount | number | 必须 | |||
├─ image | string | 必须 |
看到这个数据,返回的是order类多了一个orderDetailList 我想到了就是用两次mapper查两次,再封装到一起
OrderController:
/*** 历史订单查询* @param ordersPageDTO* @return*/@GetMapping("/historyOeders")public Result<PageResult> historyOrders(OrdersPageDTO ordersPageDTO){log.info("分页查询历史订单:{}",ordersPageDTO);//开始分页查询 还是封装到之前的PageResult中//这里我设计了一个DTO来接收前端传进来的三个参数PageResult pageResult = orderService.historyOrders(ordersPageDTO);return Result.success(pageResult);}
OrderService:
PageResult historyOrders(OrdersPageDTO ordersPageDTO);
OrderServiceImpl:
public PageResult historyOrders(OrdersPageDTO ordersPageDTO){//利用分页插件传进去两个参数开始分页查询//这里我还设计了一个VO对象,因为订单表和订单明细表是1对多的关系,所以要返回订单表和订单明细表//但是order表是没有的,所以用voPageHelper.startPage(ordersPageDTO.getPage(), ordersPageDTO.getPageSize());Orders orders = new Orders();BeanUtils.copyProperties(ordersPageDTO, orders);orders.setUserId(BaseContext.getCurrentId());//查询对应的历史订单数据,这里还没有查到订单明细表Page<OrderPageVO> page = ordersMapper.pageQuery(orders);//查了两次mapper,其实是可以多表查询用resultMap的//遍历对应的订单集合,给每个订单找到它的明细表for(OrderPageVO p: page){List<OrderDetail> list = orderDetailMapper.listByOrderId(p.getId());p.setOrderDetails(list);}return PageResult.builder().total(page.getTotal()).records(page.getResult()).build();}/// 这里我使用build的时候报错了,要记得在对应类(Pagesult)上加@builder注解哦
OrdersMapper:
/*** 查询历史订单数据* @param orders* @return*/Page<OrderPageVO> pageQuery(Orders orders);
OrdersMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.OrdersMapper">
<select id="pageQuery" parameterType="com.sky.entity.Orders" resultType="com.sky.vo.OrderPageVO">
select * from orders
<where>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="userId != null and userId != ''">
and user_id = #{userId}
</if>
</where>order by order_time desc
</select></mapper>
OrderDetail:
@Select("select * from order_detail where order_id = #{orderId}")List<OrderDetail> listByOrderId(Long OrderId);
2.查询订单详情
基本信息
Path: /user/order/orderDetail/{id}
Method: GET
接口描述:
请求参数
路径参数
参数名称 | 示例 | 备注 |
---|---|---|
id | 101 | 订单id |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 非必须 | format: int32 | ||
data | object | 非必须 | |||
├─ address | string | 非必须 | |||
├─ addressBookId | integer | 非必须 | format: int64 | ||
├─ amount | number | 非必须 | |||
├─ cancelReason | string | 非必须 | |||
├─ cancelTime | string | 非必须 | format: date-time | ||
├─ checkoutTime | string | 非必须 | format: date-time | ||
├─ consignee | string | 非必须 | |||
├─ deliveryStatus | integer | 非必须 | format: int32 | ||
├─ deliveryTime | string | 非必须 | format: date-time | ||
├─ estimatedDeliveryTime | string | 非必须 | format: date-time | ||
├─ id | integer | 非必须 | format: int64 | ||
├─ number | string | 非必须 | |||
├─ orderDetailList | object [] | 非必须 | item 类型: object | ||
├─ amount | number | 非必须 | |||
├─ dishFlavor | string | 非必须 | |||
├─ dishId | integer | 非必须 | format: int64 | ||
├─ id | integer | 非必须 | format: int64 | ||
├─ image | string | 非必须 | |||
├─ name | string | 非必须 | |||
├─ number | integer | 非必须 | format: int32 | ||
├─ orderId | integer | 非必须 | format: int64 | ||
├─ setmealId | integer | 非必须 | format: int64 | ||
├─ orderTime | string | 非必须 | format: date-time | ||
├─ packAmount | integer | 非必须 | format: int32 | ||
├─ payMethod | integer | 非必须 | format: int32 | ||
├─ payStatus | integer | 非必须 | format: int32 | ||
├─ phone | string | 非必须 | |||
├─ rejectionReason | string | 非必须 | |||
├─ remark | string | 非必须 | |||
├─ status | integer | 非必须 | format: int32 | ||
├─ tablewareNumber | integer | 非必须 | format: int32 | ||
├─ tablewareStatus | integer | 非必须 | format: int32 | ||
├─ userId | integer | 非必须 | format: int64 | ||
├─ userName | string | 非必须 | |||
msg | string | 非必须 |
这个跟上一个几乎一样,是上一个简化版
OrderController:
/*** 查询订单详情* @param id* @return*/@GetMapping("/orderDetail")public Result<OrderPageVO> orderDetail(@PathVariable Long id){log.info("查询订单详情:{}",id);OrderPageVO orderPageVO = orderService.orderDetail(id);return Result.success(orderPageVO);}
OrderService:
OrderPageVO orderDetail(Long id);
OrderServiceImpl:
public OrderPageVO orderDetail(Long id){OrderPageVO orderPageVO = ordersMapper.getById(id);List<OrderDetail> list = orderDetailMapper.listByOrderId(id);orderPageVO.setOrderDetails(list);return orderPageVO;}
OrdersMapper:
@Select("SELECT * from orders where id = #{id}")
OrderPageVO getById(Long id);
3.取消订单
基本信息
Path: /user/order/cancel/{id}
Method: PUT
接口描述:
请求参数
路径参数
参数名称 | 示例 | 备注 |
---|---|---|
id | 101 | 订单id |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
业务规则:
-
待支付和待接单状态下,用户可直接取消订单
-
商家已接单状态下,用户取消订单需电话沟通商家
-
派送中状态下,用户取消订单需电话沟通商家
-
如果在待接单状态下取消订单,需要给用户退款
-
取消订单后需要将订单状态修改为“已取消”
OrderController:
/*** 取消订单* @param id* @Return*/@PutMapping("/cancel/{id}")public Result cancel(@PathVariable Long id){log.info("取消订单:{}",id);orderService.cancel(id);return Result.success();}
OrderService:
void cancel(Long id);
OrderServiceImpl:
public void cancel(Long id){OrderPageVO orderPageVO = ordersMapper.getById(id);Orders orders = new Orders();BeanUtils.copyProperties(orderPageVO, orders);Integer status = orders.getStatus();/// 待派送和派送中的订单,用户不可取消,取消的和商家联系if (status > 2 ) {throw new OrderBusinessException("和商家联系");}/// 待支付和待接单状态下,用户可直接取消订单/// 待支付退款if(status == Orders.PENDING_PAYMENT){//退款 因为没实现微信支付功能 所以直接修改订单状态为退款orders.setPayStatus(Orders.REFUND);}//取消订单orders.setStatus(Orders.CANCELLED);orders.setCancelReason("用户取消");orders.setCancelTime(LocalDateTime.now());ordersMapper.update(orders);}
OrdersMapper:
/*** 修改订单信息* @param orders*/void update(Orders orders);@Select("SELECT * from orders where id = #{id}")
OrderPageVO getById(Long id);
OrdersMapper.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>
4.再来一单
基本信息
Path: /user/order/repetition/{id}
Method: POST
接口描述:
请求参数
路径参数
参数名称 | 示例 | 备注 |
---|---|---|
id | 101 | 订单id |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
我选择复用加入购物车的代码
OrderController:
/*** 再来一单* @param id* @Return*/@PostMapping("/repetition/{id}")public Result repetition(@PathVariable Long id){log.info("再来一单:{}",id);orderService.repetition(id);return Result.success();}
OrderService:
void repetition(Long id);
OrderServiceImpl:
public void repetition(Long id){List<OrderDetail> orderDetails = orderDetailMapper.listByOrderId(id);for(OrderDetail orderDetail:orderDetails){ShoppingCartDTO cart = new ShoppingCartDTO();BeanUtils.copyProperties(orderDetail, cart);shoppingCartService.addShoppingCart(cart);}}
管理端:
1.订单搜索
基本信息
Path: /admin/order/conditionSearch
Method: GET
接口描述:
请求参数
Query
参数名称 | 是否必须 | 示例 | 备注 |
---|---|---|---|
beginTime | 否 | beginTime | |
endTime | 否 | endTime | |
number | 否 | number | |
page | 是 | page | |
pageSize | 是 | pageSize | |
phone | 否 | phone | |
status | 否 | status |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | number | 必须 | |||
msg | null | 非必须 | |||
data | object | 非必须 | |||
├─ total | number | 非必须 | |||
├─ records | object [] | 非必须 | item 类型: object | ||
├─ id | number | 必须 | |||
├─ number | string | 必须 | |||
├─ status | number | 必须 | |||
├─ userId | number | 必须 | |||
├─ addressBookId | number | 必须 | |||
├─ orderTime | string | 必须 | |||
├─ checkoutTime | null,string | 必须 | |||
├─ payMethod | number | 必须 | |||
├─ payStatus | number | 必须 | |||
├─ amount | number | 必须 | |||
├─ remark | string | 必须 | |||
├─ userName | string | 必须 | |||
├─ phone | string | 必须 | |||
├─ address | string | 必须 | |||
├─ consignee | string | 必须 | |||
├─ cancelReason | string | 必须 | |||
├─ rejectionReason | string | 必须 | |||
├─ cancelTime | string | 必须 | |||
├─ estimatedDeliveryTime | string | 必须 | |||
├─ deliveryStatus | number | 必须 | |||
├─ deliveryTime | string | 必须 | |||
├─ packAmount | number | 必须 | |||
├─ tablewareNumber | number | 必须 | |||
├─ tablewareStatus | number | 必须 | |||
├─ orderDishes | string | 必须 | 订单包含的菜品,以字符串形式展示 |
OrderController:
@GetMapping("conditionSearch")public Result<PageResult> conditionSearch( OrdersPageQueryDTO ordersPageQueryDTO) {log.info("订单条件查询");PageResult pageResult = orderService.conditionSearch(ordersPageQueryDTO);return Result.success(pageResult);}
OrderService:
PageResult conditionSearch( OrdersPageQueryDTO ordersPageQueryDTO);
OrderServiceImpl:
public PageResult conditionSearch( OrdersPageQueryDTO ordersPageQueryDTO){/// 开始分页查询PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());/// 创建order 接受前端穿过来的参数Orders orders = new Orders();BeanUtils.copyProperties(ordersPageQueryDTO, orders);/// 这里不要设置userId 因为是商家再查询所欲的用户订单,所以不用设置/// 这里刚开始写的是报错了 因为order刚开始是没有开始时间结束时间的 我又加上了而已Page<OrderPageVO> page = ordersMapper.pageQuery(orders);/// 返回参数是有字符串类型的订单信息的 所以遍历for循环 将OrderPageVO换成我们要传递的vo类型 顺便编写一个方法传递字符串类型的订单信息/// 黑马使用的是stream流的map 都一样List<OrderVO> list = new ArrayList<>();for(OrderPageVO p: page.getResult()){OrderVO orderVO = new OrderVO();BeanUtils.copyProperties(p, orderVO);orderVO.setOrderDishes(getOrderDishes(orderVO.getId()));list.add(orderVO);}return PageResult.builder().total(page.getTotal()).records(list).build();}public String getOrderDishes(Long id){/// 先查询出来对应的订单详细信息List<OrderDetail> list = orderDetailMapper.listByOrderId(id);/// 创建一个字符串集合List<String> dishes = new ArrayList<>();/// 遍历集合 拼接 要: 鱼香肉丝*3份for(OrderDetail orderDetail:list){String dish = orderDetail.getName() + "*" + orderDetail.getNumber() + "份";dishes.add(dish);}/// 把整个集合拼接起来return StringUtils.join(",", dishes);}
OrderDetailMapper:
@Select("select * from order_detail where order_id = #{orderId}")List<OrderDetail> listByOrderId(Long OrderId);
2. 各个状态的订单数量统计
OrderController:
@GetMapping("/statistics")public Result<OrderStatisticsVO > statistics(){log.info("各个状态的订单数量统计");return Result.success(orderService.getOrderStatistics());}
OrderService:
OrderStatisticsVO getOrderStatistics();
OrderDetailMapper:
public OrderStatisticsVO getOrderStatistics(){Integer toBeConfirmed = ordersMapper.getStatistics(Orders.TO_BE_CONFIRMED);Integer confirmed = ordersMapper.getStatistics(Orders.CONFIRMED);Integer deliveryInProgress = ordersMapper.getStatistics(Orders.DELIVERY_IN_PROGRESS);return OrderStatisticsVO.builder().toBeConfirmed(toBeConfirmed).confirmed(confirmed).deliveryInProgress(deliveryInProgress).build();}
3 需求分析和设计
基本信息
Path: /admin/order/details/{id}
Method: GET
接口描述:
请求参数
路径参数
参数名称 | 示例 | 备注 |
---|---|---|
id | 101 | 订单id |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
├─ address | string | 非必须 | |||
├─ addressBookId | integer | 非必须 | format: int64 | ||
├─ amount | number | 非必须 | |||
├─ cancelReason | string | 非必须 | |||
├─ cancelTime | string | 非必须 | format: date-time | ||
├─ checkoutTime | string | 非必须 | format: date-time | ||
├─ consignee | string | 非必须 | |||
├─ deliveryStatus | integer | 非必须 | format: int32 | ||
├─ deliveryTime | string | 非必须 | format: date-time | ||
├─ estimatedDeliveryTime | string | 非必须 | format: date-time | ||
├─ id | integer | 非必须 | format: int64 | ||
├─ number | string | 非必须 | |||
├─ orderDetailList | object [] | 非必须 | item 类型: object | ||
├─ amount | number | 非必须 | |||
├─ dishFlavor | string | 非必须 | |||
├─ dishId | integer | 非必须 | format: int64 | ||
├─ id | integer | 非必须 | format: int64 | ||
├─ image | string | 非必须 | |||
├─ name | string | 非必须 | |||
├─ number | integer | 非必须 | format: int32 | ||
├─ orderId | integer | 非必须 | format: int64 | ||
├─ setmealId | integer | 非必须 | format: int64 | ||
├─ orderDishes | string | 非必须 | |||
├─ orderTime | string | 非必须 | format: date-time | ||
├─ packAmount | integer | 非必须 | format: int32 | ||
├─ payMethod | integer | 非必须 | format: int32 | ||
├─ payStatus | integer | 非必须 | format: int32 | ||
├─ phone | string | 非必须 | |||
├─ rejectionReason | string | 非必须 | |||
├─ remark | string | 非必须 | |||
├─ status | integer | 非必须 | format: int32 | ||
├─ tablewareNumber | integer | 非必须 | format: int32 | ||
├─ tablewareStatus | integer | 非必须 | format: int32 | ||
├─ userId | integer | 非必须 | format: int64 | ||
├─ userName | string | 非必须 | |||
msg | string | 非必须 |
业务规则:
-
订单详情页面需要展示订单基本信息(状态、订单号、下单时间、收货人、电话、收货地址、金额等)
-
订单详情页面需要展示订单明细数据(商品名称、数量、单价)
这里之在写用户端的时候其实已经相当于写过了
现在只用写controllor层
@GetMapping("details/{id}")public Result<OrderPageVO> details(@PathVariable Long id) {log.info("订单详情查询");return Result.success(orderService.orderDetail(id));}
4.接单
基本信息
Path: /admin/order/confirm
Method: PUT
接口描述:
请求参数
Headers
参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
Content-Type | application/json | 是 |
Body
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
id | integer | 必须 | 订单id | format: int64 |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
业务规则:
-
商家接单其实就是将订单的状态修改为“已接单”
OrderController:
/*** 接单** @return*/@PutMapping("/confirm")public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) {orderService.confirm(ordersConfirmDTO);return Result.success();}
OrderService:
void confirm(OrdersConfirmDTO ordersConfirmDTO);
OrderServiceImpl:
public void confirm(OrdersConfirmDTO ordersConfirmDTO) {Orders orders = new Orders();BeanUtils.copyProperties(ordersConfirmDTO, orders);ordersMapper.update(orders);}
OrdersMapper.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>
5.拒单
基本信息
Path: /admin/order/rejection
Method: PUT
接口描述:
请求参数
Headers
参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
Content-Type | application/json | 是 |
Body
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
id | integer | 必须 | 订单id | format: int64 | |
rejectionReason | string | 必须 | 拒单原因 |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
业务规则:
-
商家拒单其实就是将订单状态修改为“已取消”
-
只有订单处于“待接单”状态时可以执行拒单操作
-
商家拒单时需要指定拒单原因
-
商家拒单时,如果用户已经完成了支付,需要为用户退款
OrderController:.
@PutMapping("/rejection")public Result rejection(@RequestBody OrdersCancelDTO ordersCancelDTO){log.info("拒单");orderService.rejection(ordersCancelDTO);return Result.success();
OrderService:
void rejection(OrdersCancelDTO ordersCancelDTO);
OrderServiceImpl:
public void rejection(OrdersCancelDTO ordersCancelDTO){Orders orders = new Orders();/// 先获取到订单 这里我的是vo 但是并不影响 用order转换一下OrderPageVO orderPageVO = ordersMapper.getById(ordersCancelDTO.getId());BeanUtils.copyProperties(orderPageVO, orders);/// 先判断订单存在吗 再判断订单状态if (orders == null || !orders.getStatus().equals(Orders.TO_BE_CONFIRMED)) {throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}/// 是2 才处理if(orders.getPayStatus() == Orders.PAID){log.info("退款");orders.setPayStatus(Orders.REFUND);}orders.setCancelReason(ordersCancelDTO.getCancelReason());orders.setStatus(Orders.CANCELLED);orders.setCancelTime(LocalDateTime.now());ordersMapper.update(orders);}
OrdersMapper.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>
6.取消订单
基本信息
Path: /admin/order/cancel
Method: PUT
接口描述:
请求参数
Headers
参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
Content-Type | application/json | 是 |
Body
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
cancelReason | string | 必须 | 订单取消原因 | ||
id | integer | 必须 | 订单id | format: int64 |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
业务规则:
-
取消订单其实就是将订单状态修改为“已取消”
-
商家取消订单时需要指定取消原因
-
商家取消订单时,如果用户已经完成了支付,需要为用户退款
其实跟上一个一模一样,还简单了些
OrderController:
/*** 取消订单** @return*/@PutMapping("/cancel")public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {orderService.admincancel(ordersCancelDTO);return Result.success();}
OrderService:
void admincancel(OrdersCancelDTO ordersCancelDTO);
OrderServiceImpl:
public void admincancel(OrdersCancelDTO ordersCancelDTO){Orders orders = new Orders();/// 先获取到订单 这里我的是vo 但是并不影响 用order转换一下OrderPageVO orderPageVO = ordersMapper.getById(ordersCancelDTO.getId());BeanUtils.copyProperties(orderPageVO, orders);/// 先判断订单存在吗if (orders == null ) {throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}if(orders.getPayStatus() == Orders.PAID){log.info("退款");orders.setPayStatus(Orders.REFUND);}orders.setCancelReason(ordersCancelDTO.getCancelReason());orders.setStatus(Orders.CANCELLED);orders.setCancelTime(LocalDateTime.now());ordersMapper.update(orders);}
OrdersMapper.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>
7.派送订单
基本信息
Path: /admin/order/delivery/{id}
Method: PUT
接口描述:
请求参数
路径参数
参数名称 | 示例 | 备注 |
---|---|---|
id | 101 | 订单id |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
OrderController:
/*** 派送订单** @return*/@PutMapping("/delivery/{id}")public Result delivery(@PathVariable("id") Long id) {orderService.delivery(id);return Result.success();}
OrderService:
void delivery(Long id);
OrderServiceImpl:
public void delivery(Long id) {Orders orders = new Orders();/// 先获取到订单 这里我的是vo 但是并不影响 用order转换一下// 根据id查询订单OrderPageVO orderPageVO = ordersMapper.getById(id);BeanUtils.copyProperties(orderPageVO, orders);// 校验订单是否存在,并且状态为3if (orders == null || !orders.getStatus().equals(Orders.CONFIRMED)) {throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}// 更新订单状态,状态转为派送中orders.setStatus(Orders.DELIVERY_IN_PROGRESS);ordersMapper.update(orders);}
OrdersMapper.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>
8.完成订单
基本信息
Path: /admin/order/complete/{id}
Method: PUT
接口描述:
请求参数
Headers
参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
Content-Type | application/json | 是 |
路径参数
参数名称 | 示例 | 备注 |
---|---|---|
id | 101 | 订单id |
返回数据
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | integer | 必须 | format: int32 | ||
data | object | 非必须 | |||
msg | string | 非必须 |
OrderController:
@PutMapping("/complete/{id}")public Result complete(@PathVariable("id") Long id) {orderService.complete(id);return Result.success();}
OrderService:
void complete(Long id);
OrderServiceImpl:
public void complete(Long id) {// 根据id查询订单Orders orders = new Orders();/// 先获取到订单 这里我的是vo 但是并不影响 用order转换一下// 根据id查询订单OrderPageVO orderPageVO = ordersMapper.getById(id);BeanUtils.copyProperties(orderPageVO, orders);// 校验订单是否存在,并且状态为4if (orders == null || !orders.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) {throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}// 更新订单状态,状态转为完成orders.setStatus(Orders.COMPLETED);orders.setDeliveryTime(LocalDateTime.now());ordersMapper.update(orders);}
OrdersMapper.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>
总结:
第九天的订单作业还是很值的一做的,很有锻炼意义