目录
用户端历史订单
从产品原型,我们知道点进历史订单,需要查询订单数据,可以是全部订单 ,也可以选择查询待付款或退款的订单。因此第一接口分页查询历史订单。对每一条订单,我们还可以点击进去查询详细的信息。因此第二个接口查询订单详情。此外,还有再来一单,和取消订单的功能。
因此,我们需要完成:查询历史订单、查询订单详情、取消订单和再来一单,四个功能,我们用四个接口来对应这些功能。
-
历史订单查询
用什么方法请求?传入什么参数?返回什么数据?
该请求使用get方式请求。传入分页相关的数据里面包含页面,页数,以及订单状态(用于查询全部或待付款或已取消的订单)。需要放回订单相关的数据,这些数据用OrderVO封装。
分页查询,我们以往都是用一个DTO对象去接收前端传过来的数据。而这一次前端直接传了int page, int pageSize, Integer status。因此我们在查询的时候需要将这些数据先封装成一个DTO对象后,在进行分页查询。
OrdersPageQueryDTO ordersPageQueryDTO=new OrdersPageQueryDTO();
ordersPageQueryDTO.setStatus(status);
ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
Page<Orders> listPage=orderMapper.historyOrder(ordersPageQueryDTO);
<select id="historyOrder" resultType="orders">
select * from orders
<where>
<if test="number != null and number!=''">
and number like concat('%',#{number},'%')
</if>
<if test="phone != null and phone!=''">
and phone like concat('%',#{phone},'%')
</if>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="beginTime != null">
and order_time >= #{beginTime}
</if>
<if test="endTime != null">
and order_time <= #{endTime}
</if>
</where>
order by order_time desc
</select>
查询返回来的结构是Orders,我们需要返回给前端的是OrderVO。创建一个List<OrderVO>,这个集合是我们最终要返回给前端的。对于刚刚查询到的订单,遍历先查询到它的详细订单,然后把orders和orderdetail一块封装到orderVO最后添加到集合List<OrderVO>。
List<OrderVO> list = new ArrayList();
List<Orders> result = listPage.getResult();
if(listPage !=null &&total>0){
for (Orders order : result) {
List<OrderDetail> orderDetails = orderDetailMapper.getByOrderId(order.getId());
OrderVO orderVO=new OrderVO();
orderVO.setOrderDetailList(orderDetails);
BeanUtils.copyProperties(order,orderVO);
list.add(orderVO);
}
}
-
查询订单详情
用什么方法请求?传入什么参数?返回什么数据?
该请求使用get方式请求。传入的是订单id的路径参数。需要将订单状态封装成OrderVO返回给前端。
-
取消一单
用什么方法请求?传入什么参数?返回什么数据?
该请求使用put方式。传入的是订单id的路径参数。无额外需要返回的数据。
public void cancel(OrdersCancelDTO ordersCancelDTO) {
Orders order = orderMapper.getById(ordersCancelDTO.getId());
//支付状态
Integer payStatus = order.getPayStatus();
if (payStatus == 1) {
//用户已支付,需要退款
// String refund = weChatPayUtil.refund(
// order.getNumber(),
// order.getNumber(),
// new BigDecimal(0.01),
// new BigDecimal(0.01));
log.info("申请退款");
}
// 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
Orders orders = new Orders();
orders.setId(ordersCancelDTO.getId());
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason(ordersCancelDTO.getCancelReason());
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
由于微信的功能不能用,所以直接注释掉。后边直接修改数据库中订单信息即可。
-
再来订单
用什么方法请求?传入什么参数?返回什么数据?
该请求使用post方式请求。传入的是订单id的路径参数。无额外需要返回的数据。
一开始我的思路就是,根据订单id查询订单相关的所有信息,直接往数据库添加一份数据。结果,数据添加了,但是前端页面没有变化。所有就知道出问题了。
后来,才知道,需要把订单添加到购物车中才行。
// 查询当前用户id
Long userId = BaseContext.getCurrentId();
// 根据订单id查询当前订单详情
List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);
// 将订单详情对象转换为购物车对象
List<ShoppingCart> shoppingCartList = orderDetailList.stream().map(x -> {
ShoppingCart shoppingCart = new ShoppingCart();
// 将原订单详情里面的菜品信息重新复制到购物车对象中
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
return shoppingCart;
}).collect(Collectors.toList());
// 将购物车对象批量添加到数据库
shoppingCartMapper.insertBatch(shoppingCartList);
商家端订单管理
由产品原型得该模块需要完成:订单搜索、各个状态的订单数量统计、接单、拒单、取消订单、派送订单、完成订单。从后边接单开始,其实就是更新数据库中订单状态(只需要注意订单在什么情况下,才能取消、派送、完成、接单、拒单等)这里不冗余再展开说了。
-
各个状态的订单数量统计
用什么方法请求?传入什么参数?返回什么数据?
该请求使用get方式。不需要传入参数。需要放回包含待派送数量、派送中数量和待接单数量的OrderStatisticsVO。
// 根据状态,分别查询出待接单、待派送、派送中的订单数量
Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED);
Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED);
Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS);
OrderStatisticsVO orderStatisticsVO=new OrderStatisticsVO();
orderStatisticsVO.setToBeConfirmed(toBeConfirmed);
orderStatisticsVO.setConfirmed(confirmed);
orderStatisticsVO.setDeliveryInProgress(deliveryInProgress);
return orderStatisticsVO;
//xml
@Select("select count(id) from sky_take_out.orders where status=#{status}")
Integer countStatus(Integer status);
-
订单搜索
用什么方法请求?传入什么参数?返回什么数据?
该请求使用get方式请求。传入分页相关的数据封装在ordersPageQueryDTO后传入。返回订单信息OrderVO。
封装List<OrderVO>的过程如下。
private List<OrderVO> getOrderVO(Page<Orders> page) {
List<OrderVO> orderVOList=new ArrayList<>();
List<Orders> ordersList = page.getResult();
//先判断是否有无订单即集合是否为空
if(!CollectionUtils.isEmpty(ordersList)){
for (Orders orders : ordersList) {
OrderVO orderVO=new OrderVO();
BeanUtils.copyProperties(orders,orderVO);
String orderDishes = getOrderDishesStr(orders);
orderVO.setOrderDishes(orderDishes);
orderVOList.add(orderVO);
}
}
return orderVOList;
}
如果有帮助到你,希望可以点赞收藏转发~