概要
在电商、金融、物流等行业中,用户历史订单查询是一项常见的业务需求。这项功能允许用户查看他们过去的交易记录,包括但不限于购买的商品、服务详情、交易金额、支付状态、配送信息等。对于企业而言,这不仅提升了用户体验,还能够帮助分析用户行为,优化产品和服务,以及处理售后问题。
整体构流程
数据库设计:合理设计订单表结构,使用索引提高查询效率。
分页查询:通过分页技术减少单次查询的数据量,提升性能
技术细节
1.Controller层代码:
给前端返回PageResult和成功的信息,调用Service层业务代码
@GetMapping("/historyOrders")
@ApiOperation("查询历史订单")
public Result<PageResult> historyOrders(OrdersPageQueryDTO orderPaymentDTO){
log.info("查询历史订单,参数:{}", orderPaymentDTO);
PageResult pageResult = orderService.historyOrders(orderPaymentDTO);
return Result.success(pageResult);
}
2.Service层代码:
- 首先我们利用PageHelper设置分页数据
- 然后我们需要获取到该订单查询的用户是谁?即获取到用户id后填充到dto中
- 然后利用用户id或订单状态等查询订单数据
- 遍历该数据(该用户的全部订单)
- 分别利用订单id查询每个订单数据的明细,并返回明细集合(因为一个订单会有多个菜品)
- 将订单明细copy到要返回的VO对象中
- 然后将每一个VO对象都加入到全部订单的VO集合中
- 返回集合和页面总数
public PageResult historyOrders(OrdersPageQueryDTO ordersPageQueryDTO) {
//设置分页数据
PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());
//填充该历史订单查询的用户
ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
//查询该订单基本数据(订单id)
Page<Orders> page = orderMapper.pageQuery(ordersPageQueryDTO);
//如果查到数据,则利用订单id查该订单的明细数据
ArrayList<OrderVO> orderVOs = new ArrayList<>();
if(page != null && page.size() > 0){
for (Orders orders : page) {
//利用订单id查该订单的明细数据,因为一个订单可能会有多个菜品所以返回的是list
List<OrderDetail> orderDetails = orderDetailMapper.selectByUserId(orders.getId());
OrderVO ordersVO = new OrderVO();
BeanUtils.copyProperties(orders,ordersVO);
//将这个订单的菜品明细都填充到该菜品的VO中
ordersVO.setOrderDetailList(orderDetails);
//将该订单加入到分页VO中
orderVOs.add(ordersVO);
}
}
return new PageResult(page.getTotal(),orderVOs);
}
Mapper层:
<select id="pageQuery" resultType="com.sky.entity.Orders">
select * from `sky-take-out`.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>
@Select("select * from `sky-take-out`.order_detail where order_id = #{orderId}")
List<OrderDetail> selectByOrderId(Long orderId);