目录
用户端订单模块
查询历史订单
user/OrderController
/**
* 历史订单查询
* @param page
* @param pageSize
* @return
*/
@GetMapping("/historyOrders")
public Result page(int page,int pageSize,
Integer status){
PageResult pageResult = orderService.pageQuery4User(page,pageSize,status);
return Result.success(pageResult);
}
int page: 当前页码,表示分页查询的第几页。
int pageSize: 每页显示的记录数,用于控制每页返回的数据量。
Integer status: 订单状态(可选参数),用于过滤特定状态的订单。
调用orderService.pageQuery4User(page, pageSize, status)方法:
将分页参数和订单状态传递给服务层,执行具体的分页查询逻辑。
返回一个PageResult对象,包含分页数据(如总记录数、当前页数据列表等)。
使用Result.success(pageResult)包装查询结果:
Result是一个通用的响应封装类,通常包含状态码、消息和数据。
将分页查询结果pageResult作为数据部分返回给前端。
接口:
/**
* 用户端历史订单分页查询
* @param page
* @param pageSize
* @param status
* @return
*/
PageResult pageQuery4User(int page, int pageSize, Integer status);
实现类:
/**
* 用户端历史订单分页查询
* @param pageNum
* @param pageSize
* @param status
* @return
*/
public PageResult pageQuery4User(int pageNum, int pageSize, Integer status) {
//设置分页
PageHelper.startPage(pageNum,pageSize);
//封装一个DTO用于存放查询条件
OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
ordersPageQueryDTO.setStatus(status);
//分页查询条件
Page page = orderMapper.pageQuery(ordersPageQueryDTO);
//创建一个 ArrayList 用于存储封装好的 OrderVO 对象。
List list = new ArrayList<>();
//查询出订单明细,并封装进orderVO进行响应
if (page != null && page.getTotal() > 0){
//使用 for-each 循环遍历 page 中的每个 Orders 对象
for (Orders orders : page) {
Long orderId = orders.getId();
//查询订单明细
//根据订单 ID 调用 orderDetailMapper
// 的 getByOrderId 方法查询该订单的所有明细。
List orderDetails = orderDetailMapper.getByOrderId(orderId);
//创建一个 OrderVO 对象,使用 BeanUtils.copyProperties
// 方法将 Orders 对象的属性复制到 OrderVO 中,
// 然后将查询到的订单明细列表设置到 OrderVO 中。
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders,orderVO);
orderVO.setOrderDetailList(orderDetails);
list.add(orderVO);
}
}
return new PageResult(page.getTotal(),list);
}
PageHelper.startPage(pageNum, pageSize);
使用PageHelper工具类开启分页功能,传入当前页码和每页记录数。
OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
ordersPageQueryDTO.setStatus(status);
创建一个OrdersPageQueryDTO对象,用于封装查询条件。
设置当前用户的ID(通过BaseContext.getCurrentId()获取)和订单状态。
使用PageQuery 分页查询
/**
* 分页查询
* @param ordersPageQueryDTO
* @return
*/
Page pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);
xml:
根据UserId查询订单数据。
List
list = new ArrayList<>();
if (page != null && page.getTotal() > 0) {
for (Orders orders : page) {
Long orderId = orders.getId();
ListorderDetails = orderDetailMapper.getByOrderId(orderId); OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders, orderVO);
orderVO.setOrderDetailList(orderDetails);
list.add(orderVO);
}
}
创建一个 List 用于存储封装的 VO 对象。
遍历分页查询结果中的每个Orders对象。
根据订单ID调用orderDetailMapper.getByOrderId方法,查询该订单的所有明细。
创建一个OrderVO对象,将Orders对象的属性复制到OrderVO中,并将订单明细列表设置到OrderVO中。
将封装好的OrderVO对象添加到结果列表中。
return new PageResult(page.getTotal(), list);
使用PageResult封装分页结果,包含总记录数和当前页的订单数据列表。
OrderoController:
/**
* 查询订单详情
* @param id
* @return
*/
@GetMapping("/orderDetail/{id}")
public Result details(@PathVariable("id") Long id){
OrderVO orderVO = orderService.details(id);
return Result.success(orderVO);
}
使用@PathVariable("id") Long id 表示从URL路径中提取 id 参数,并将其转换为 Long 类型
根据前端传入的id调用details方法查询订单详情,并将其存储在 OrderVO 对象中,返回给客户端
接口:
/**
* 查看订单详情
* @param id
* @return
*/
OrderVO details(Long id);
实现类:
/**
* 查看订单详情
* @param id
* @return
*/
public OrderVO details(Long id) {
//根据订单id查询订单
Orders orders = orderMapper.getById(id);
//查询该订单对应的菜品/套餐明细
List orderDetailList =
orderDetailMapper.getByOrderId(orders.getId());
//将订单及其详情封装进OrderVO并返回
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders,orderVO);
orderVO.setOrderDetailList(orderDetailList);
return orderVO;
}
getById方法:
/**
* 根据订单id查询订单
* @param id
* @return
*/
@Select("select * from orders where id = #{id}")
Orders getById(Long id);
调用 orderDetailMapper.getByOrderId(orders.getId()) 方法,根据订单ID查询该订单的菜品或套餐明细。
/**
* 查询订单明细
* @param orderId
* @return
*/
@Select("select * from order_detail where order_id = #{orderId}")
List getByOrderId(Long orderId);
OrderDetail 是一个实体类,表示订单中每个菜品或套餐的详细信息。
创建一个 OrderVO 对象,用于封装订单的详细信息。
使用 BeanUtils.copyProperties(orders, orderVO) 将 Orders 对象的属性复制到 OrderVO 中。
将查询到的订单明细列表 orderDetailList 设置到 OrderVO 对象的 orderDetailList 属性中。
返回封装好的 OrderVO 对象,包含订单的基本信息和菜品/套餐明细。
/**
* 删除订单
* @param id
* @return
* @throws Exception
*/
@PutMapping("/cancel/{id}")
@ApiOperation("取消订单")
public Result cancel(@PathVariable("id") Long id) throws Exception{
orderService.userCancelById(id);
return Result.success();
}
调用userCancelById方法,取消传入的id的订单
/**
* 删除订单
* @param id
*/
void userCancelById(Long id) throws Exception;
实现类:
/**
* 用户取消订单
* @param id
*/
public void userCancelById(Long id) throws Exception{
//根据id订单查询
Orders ordersDB = orderMapper.getById(id);
//校验订单是否存在
if (ordersDB == null){
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}
//订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
if (ordersDB.getStatus() > 2){
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
//订单处于待接单状态下取消,需要进行退款
if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)){
//调用微信支付退款接口
weChatPayUtil.refund(
ordersDB.getNumber(),
ordersDB.getNumber(),
new BigDecimal(0.01),
new BigDecimal(0.01));
}
//支付状态为 退款
orders.setPayStatus(Orders.REFUND);
//更新订单状态、取消原因、取消时间
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("用户取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
调用 orderMapper.getById(id) 方法,从数据库中查询订单的基本信息。
Orders 是一个实体类,表示订单的基本信息。
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}
如果查询到的订单为 null,说明订单不存在,抛出 OrderBusinessException 异常,提示“订单未找到”。
if (ordersDB.getStatus() > 2) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
订单状态为:
1:待付款
2:待接单
3:已接单
4:派送中
5:已完成
6:已取消
如果订单状态大于 2(即已接单、派送中、已完成或已取消),则抛出 OrderBusinessException 异常,提示“订单状态错误”
Orders orders = new Orders(); orders.setId(ordersDB.getId());
创建一个新的 Orders 对象,用于更新订单信息
if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
weChatPayUtil.refund(
ordersDB.getNumber(),
ordersDB.getNumber(),
new BigDecimal(0.01),
new BigDecimal(0.01));
}
如果订单状态为“待接单”(Orders.TO_BE_CONFIRMED),则需要调用微信支付退款接口 weChatPayUtil.refund 进行退款。
退款金额为 0.01 元(示例值,实际金额应根据业务逻辑调整)
Orders orders = new Orders();
orders.setId(ordersDB.getId());
orders.setPayStatus(Orders.REFUND);
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("用户取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
创建一个新的 Orders 对象,用于更新订单状态。
设置订单的支付状态为“退款”(Orders.REFUND)。
设置订单状态为“已取消”(Orders.CANCELLED)。
设置取消原因为“用户取消”。
设置取消时间为当前时间。
调用 orderMapper.update(orders) 方法,更新数据库中的订单信息。
update方法通过 XML 映射文件实现更新操作,不再赘述。
Controller:
/**
* 再来一单
* @param id
* @return
*/
@PostMapping("/repetition/{id}")
@ApiOperation("再来一单")
public Result repetition(@PathVariable Long id){
orderService.repetition(id);
return Result.success();
}
id:订单的唯一标识符,类型为 Long,通过 @PathVariable 从 URL 路径中提取。
返回值:Result 对象,表示操作结果,通常包含状态码和消息。
调用 orderService.repetition(id) 方法,将订单中的菜品重新加入购物车。
接口:
/**
* 再来一单
* @param id
*/
void repetition(Long id);
实现类:
/**
* 再来一单
* @param id
*/
public void repetition(Long id) {
//查询当前用户id
Long userId = BaseContext.getCurrentId();
//根据订单id查询当前订单详情
List orderDetailList = orderDetailMapper.getByOrderId(id);
//将订单详情对象转换为购物车对象
List 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);
}
查询订单详情:
OrderDetail 是一个实体类,表示订单中每个菜品或套餐的详细信息。
/**
* 查询订单明细
* @param orderId
* @return
*/
@Select("select * from order_detail where order_id = #{orderId}")
List getByOrderId(Long orderId);
List
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());
使用 stream().map() 方法,将 OrderDetail 对象转换为 ShoppingCart 对象。
BeanUtils.copyProperties(x, shoppingCart, "id"):将 OrderDetail 对象的属性复制到 ShoppingCart 对象中,忽略 id 属性。
设置购物车对象的用户ID为当前用户ID。
设置购物车对象的创建时间为当前时间。
stream().map()
是 Stream API 的核心方法之一,用于对集合中的元素进行 转换(映射)。它接受一个函数式接口(Function
),将流中的每个元素 T
转换为新的元素 R
,生成一个新的流。
List result = list.stream()
.map(element -> 转换逻辑)
.collect(Collectors.toList());
stream()
:将集合转换为流。
map()
:对每个元素应用映射函数。
collect()
:将流转换回集合或其他数据结构
shoppingCartMapper.insertBatch(shoppingCartList);
调用 shoppingCartMapper.insertBatch(shoppingCartList) 方法,将购物车对象批量插入到数据库中。
shoppingCartMapper 是购物车数据访问对象(DAO),用于操作数据库中的购物车表。
insert into shopping_cart
(name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount,
create_time)
VALUES
(#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},
#{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime})