苍穹外卖day06
目录
前言:
本文对应外卖视频的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表是没有的,所以用vo
PageHelper.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);
// 校验订单是否存在,并且状态为3
if (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);
// 校验订单是否存在,并且状态为4
if (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>
总结:
第九天的订单作业还是很值的一做的,很有锻炼意义
更多推荐

所有评论(0)