《苍穹外卖》C端用户订单_全部业务代码【简单易懂注释版】
本文档详细介绍了C端用户订单相关接口的实现,包括用户下单、历史订单查询、订单详情查询、订单取消和再来一单等功能。通过OrderController、OrderService接口及其实现类OrderServiceImpl、以及OrderMapper的代码展示,说明了各功能的业务逻辑处理方式,包括异常处理、事务管理、数据查询和更新等操作。接口设计遵循RESTful风格,使用Swagger进行API文档
·
目录
一、C端用户订单相关接口
C端用户订单相关接口-用户下单+历史订单查询+查询订单详情+用户取消订单+再来一单
1.OrderController.java
package com.sky.controller.user;
import com.sky.dto.OrdersSubmitDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.OrderService;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Tag(name = "C端-用户订单相关接口")
@Slf4j
@RestController("amdinOrderController")
@RequestMapping("/user/order")
public class OrderController {
@Autowired
private OrderService orderService;
// 用户下单
@Operation(summary = "用户下单")
@PostMapping("/submit")
public Result<OrderSubmitVO> submit(@RequestBody OrdersSubmitDTO ordersSubmitDTO){
log.info("用户下单的数据为:{}",ordersSubmitDTO);
OrderSubmitVO orderSubmitVO = orderService.submitOrder(ordersSubmitDTO);
return Result.success(orderSubmitVO);
}
// 历史订单查询
@Operation(summary = "历史订单查询")
@GetMapping("/historyOrders")
public Result<PageResult> page(Integer page, Integer pageSize, Integer status){
log.info("历史订单查询:page:{},pageSize:{},status:{}",page,pageSize,status);
// 历史订单条件分页查询
PageResult pageResult = orderService.pageQuery(page,pageSize,status);
return Result.success(pageResult);
}
// 查询订单详情
@Operation(summary = "查询订单详情")
@GetMapping("/orderDetail/{id}")
public Result<OrderVO> details(@PathVariable Long id){
log.info("根据id查询订单详情:{}",id);
OrderVO orderVO = orderService.details(id);
return Result.success(orderVO);
}
// 用户取消订单
@Operation(summary = "用户取消订单")
@PutMapping("/cancel/{id}")
public Result cancel(@PathVariable Long id) throws Exception {
log.info("用户取消订单:{}",id);
orderService.userCancelById(id);
return Result.success();
}
// 再来一单
@Operation(summary = "再来一单")
@PostMapping("/repetition/{id}")
public Result repetition(@PathVariable Long id) {
log.info("再来一单:{}",id);
orderService.repetition(id);
return Result.success();
}
}
2.interface OrderService
package com.sky.service;
import com.sky.dto.*;
import com.sky.result.PageResult;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;
public interface OrderService {
// 用户下单
OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);
// 历史订单条件分页查询
PageResult pageQuery(Integer page, Integer pageSize, Integer status);
// 查询订单详情
OrderVO details(Long id);
// 用户取消订单
void userCancelById(Long id) throws Exception;
// 再来一单
void repetition(Long id);
// 订单搜索
PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO);
// 各个状态的订单数量统计
OrderStatisticsVO statistics();
// 接单
void confirm(OrdersConfirmDTO ordersConfirmDTO);
// 拒单
void rejection(OrdersRejectionDTO ordersRejectionDTO);
// 取消订单
void cancel(OrdersCancelDTO ordersCancelDTO);
// 派送订单
void delivery(Long id);
// 完成订单
void complete(Long id);
}
3.OrderServiceImpl.java
package com.sky.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.context.BaseContext;
import com.sky.dto.*;
import com.sky.entity.AddressBook;
import com.sky.entity.OrderDetail;
import com.sky.entity.Orders;
import com.sky.entity.ShoppingCart;
import com.sky.exception.AddressBookBusinessException;
import com.sky.exception.OrderBusinessException;
import com.sky.exception.ShoppingCartBusinessException;
import com.sky.mapper.AddressBookMapper;
import com.sky.mapper.OrderDetailMapper;
import com.sky.mapper.OrderMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.result.PageResult;
import com.sky.service.OrderService;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderDetailMapper orderDetailMapper;
@Autowired
private AddressBookMapper addressBookMapper;
@Autowired
private ShoppingCartMapper shoppingCartMapper;
// @Autowired
// private WeChatPayUtil weChatPayUtil;
// 用户下单
@Transactional
@Override
public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {
// 1处理各种业务异常(地址薄为空、购物车为空)
// 1.1判断地址薄是否为空
AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId());
if (addressBook == null) {
// 抛出业务异常--MessageConstant.ADDRESS_BOOK_IS_NULL = 用户地址为空,不能下单
throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);
}
// TODO 检查客户的收货地址是否超出配送范围
// 1.2判断购物车是否为空
// 获取微信用户登录id
Long userId = BaseContext.getCurrentId();
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.setUserId(userId);
List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);
if (shoppingCartList == null || shoppingCartList.size() == 0) {
// 抛出业务异常--MessageConstant.SHOPPING_CART_IS_NULL = 购物车数据为空,不能下单
throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);
}
// 向订单表插入1条数据
Orders orders = new Orders();
BeanUtils.copyProperties(ordersSubmitDTO,orders);
orders.setOrderTime(LocalDateTime.now()); //下单时间
orders.setPayStatus(Orders.UN_PAID); //支付状态 0未支付 1已支付 2退款
orders.setStatus(Orders.PENDING_PAYMENT); //订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款
orders.setNumber(String.valueOf(System.currentTimeMillis())); //订单号
orders.setPhone(addressBook.getPhone()); //手机号
orders.setConsignee(addressBook.getConsignee()); //收货人
orders.setAddress(addressBook.getProvinceName() + addressBook.getCityName() + addressBook.getDistrictName() + addressBook.getDetail()); //收货地址
orders.setUserId(userId); //微信用户登录id
// 插入数据
orderMapper.insert(orders);
List<OrderDetail> orderDetailList = new ArrayList<>();
// 向订单明细表插入n条数据
for (ShoppingCart cart : shoppingCartList) {
OrderDetail orderDetail = new OrderDetail(); //订单明细表
BeanUtils.copyProperties(cart,orderDetail);
orderDetail.setOrderId(orders.getId()); //设置当前订单相关联的订单id
orderDetailList.add(orderDetail);
}
// 批量插入订单明细
orderDetailMapper.insertBatch(orderDetailList);
// 清空购物车
shoppingCartMapper.deleteShoppingCartAll(userId);
// 封装VO返回结果
OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder()
.id(orders.getId())
.orderNumber(orders.getNumber())
.orderAmount(orders.getAmount())
.orderTime(orders.getOrderTime())
.build();
return orderSubmitVO;
}
// 历史订单条件分页查询
@Override
public PageResult pageQuery(Integer page, Integer pageSize, Integer status) {
PageHelper.startPage(page,pageSize);
OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
ordersPageQueryDTO.setStatus(status);
// 条件分页查询
Page<Orders> ordersPage = orderMapper.pageQuery(ordersPageQueryDTO);
List<OrderVO> list = new ArrayList<>();
if (ordersPage != null && ordersPage.size() > 0) {
for (Orders orders : ordersPage) {
Long ordersId = orders.getId();
// 根据订单id查询订单明细
List<OrderDetail> orderDetailList = orderDetailMapper.getOrdersId(ordersId);
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders,orderVO);
orderVO.setOrderDetailList(orderDetailList);
list.add(orderVO);
}
}
return new PageResult(ordersPage.getTotal(),list);
}
// 查询订单详情
@Override
public OrderVO details(Long id) {
// 根据id查询订单
Orders orders = orderMapper.getById(id);
// 查询该订单对应的菜品/套餐明细
Long ordersId = orders.getId();
List<OrderDetail> orderDetailList = orderDetailMapper.getOrdersId(ordersId);
// 将该订单及其详情封装到OrderVO并返回
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders,orderVO);
orderVO.setOrderDetailList(orderDetailList);
return orderVO;
}
// 用户取消订单
@Override
public void userCancelById(Long id) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(id);
// 校验订单是否存在
if (ordersDB == null) {
// MessageConstant.ORDER_NOT_FOUND = 订单不存在
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}
//订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
if (ordersDB.getStatus() > 2) {
// MessageConstant.ORDER_STATUS_ERROR = 订单状态错误
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
// TODO-----因为没有微信支付证书,这里的退款接口无法实现------
// 订单处于待接单状态下取消,需要进行退款
// 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);
}
// 再来一单
@Override
public void repetition(Long id) {
// 查询当前用户id
Long userId = BaseContext.getCurrentId();
// 根据订单id查询当前订单详情
List<OrderDetail> orderDetailList = orderDetailMapper.getOrdersId(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);
}
}
4.interface OrderMapper
package com.sky.mapper;
import com.github.pagehelper.Page;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.Orders;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface OrderMapper {
// 向订单表插入1条数据
void insert(Orders orders);
// 历史订单条件分页查询
Page<Orders> pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);
// 根据id查询订单
@Select("select * from orders where id = #{id}")
Orders getById(Long id);
// 更新订单状态
void update(Orders orders);
// 各个状态的订单数量统计
@Select("select count(id) from orders where status = #{status}")
Integer countStatus(Integer status);
}
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)