diff --git a/sky-server/src/main/java/com/sky/controller/admin/OrderController.java b/sky-server/src/main/java/com/sky/controller/admin/OrderController.java new file mode 100644 index 0000000..7bdee4a --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/OrderController.java @@ -0,0 +1,127 @@ +package com.sky.controller.admin; + +import com.sky.dto.OrdersCancelDTO; +import com.sky.dto.OrdersConfirmDTO; +import com.sky.dto.OrdersPageQueryDTO; +import com.sky.dto.OrdersRejectionDTO; +import com.sky.result.PageResult; +import com.sky.result.Result; +import com.sky.service.OrderService; +import com.sky.vo.OrderStatisticsVO; +import com.sky.vo.OrderVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 订单管理 + */ +@RestController("adminOrderController") +@RequestMapping("/admin/order") +@Slf4j +@Api(tags = "订单管理接口") +public class OrderController { + + @Autowired + private OrderService orderService; + + /** + * 订单搜索 + * + * @param ordersPageQueryDTO + * @return + */ + @GetMapping("/conditionSearch") + @ApiOperation("订单搜索") + public Result conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) { + PageResult pageResult = orderService.conditionSearch(ordersPageQueryDTO); + return Result.success(pageResult); + } + + /** + * 各个状态的订单数量统计 + * + * @return + */ + @GetMapping("/statistics") + @ApiOperation("各个状态的订单数量统计") + public Result statistics() { + OrderStatisticsVO orderStatisticsVO = orderService.statistics(); + return Result.success(orderStatisticsVO); + } + + /** + * 订单详情 + * + * @param id + * @return + */ + @GetMapping("/details/{id}") + @ApiOperation("查询订单详情") + public Result details(@PathVariable("id") Long id) { + OrderVO orderVO = orderService.details(id); + return Result.success(orderVO); + } + + /** + * 接单 + * + * @return + */ + @PutMapping("/confirm") + @ApiOperation("接单") + public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) { + orderService.confirm(ordersConfirmDTO); + return Result.success(); + } + + /** + * 拒单 + * + * @return + */ + @PutMapping("/rejection") + @ApiOperation("拒单") + public Result rejection(@RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception { + orderService.rejection(ordersRejectionDTO); + return Result.success(); + } + + /** + * 取消订单 + * + * @return + */ + @PutMapping("/cancel") + @ApiOperation("取消订单") + public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception { + orderService.cancel(ordersCancelDTO); + return Result.success(); + } + + /** + * 派送订单 + * + * @return + */ + @PutMapping("/delivery/{id}") + @ApiOperation("派送订单") + public Result delivery(@PathVariable("id") Long id) { + orderService.delivery(id); + return Result.success(); + } + + /** + * 完成订单 + * + * @return + */ + @PutMapping("/complete/{id}") + @ApiOperation("完成订单") + public Result complete(@PathVariable("id") Long id) { + orderService.complete(id); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/OrderController.java b/sky-server/src/main/java/com/sky/controller/user/OrderController.java index 0d5b0fc..c5ba471 100644 --- a/sky-server/src/main/java/com/sky/controller/user/OrderController.java +++ b/sky-server/src/main/java/com/sky/controller/user/OrderController.java @@ -3,17 +3,19 @@ package com.sky.controller.user; import com.sky.dto.OrdersPaymentDTO; import com.sky.dto.OrdersSubmitDTO; +import com.sky.result.PageResult; import com.sky.result.Result; import com.sky.service.OrderService; import com.sky.vo.OrderPaymentVO; import com.sky.vo.OrderSubmitVO; +import com.sky.vo.OrderVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -@RestController +@RestController("userOrderController") @Slf4j @RequestMapping("/user/order") @Api(tags = "用户端订单相关的接口") @@ -48,4 +50,58 @@ public class OrderController { return Result.success(orderPaymentVO); } + + /** + * 历史订单查询 + * + * @param page + * @param pageSize + * @param status 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + * @return + */ + @GetMapping("/historyOrders") + @ApiOperation("历史订单查询") + public Result page(int page, int pageSize, Integer status) { + PageResult pageResult = orderService.pageQuery4User(page, pageSize, status); + return Result.success(pageResult); + } + + /** + * 查询订单详情 + * + * @param id + * @return + */ + @GetMapping("/orderDetail/{id}") + @ApiOperation("查询订单详情") + public Result details(@PathVariable("id") Long id) { + OrderVO orderVO = orderService.details(id); + return Result.success(orderVO); + } + + /** + * 用户取消订单 + * + * @return + */ + @PutMapping("/cancel/{id}") + @ApiOperation("取消订单") + public Result cancel(@PathVariable("id") Long id) throws Exception { + orderService.userCancelById(id); + return Result.success(); + } + + /** + * 再来一单 + * + * @param id + * @return + */ + @PostMapping("/repetition/{id}") + @ApiOperation("再来一单") + public Result repetition(@PathVariable Long id) { + orderService.repetition(id); + return Result.success(); + } + } diff --git a/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java index ee7a2e8..18a7ef9 100644 --- a/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java @@ -2,9 +2,11 @@ package com.sky.mapper; import com.sky.entity.OrderDetail; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; +import java.util.List; @Mapper public interface OrderDetailMapper { @@ -13,4 +15,12 @@ public interface OrderDetailMapper { * @param orderDetailList */ void insertBatch(ArrayList orderDetailList); + + /** + * 根据订单id查询订单明细 + * @param orderId + * @return + */ + @Select("select * from order_detail where order_id = #{orderId}") + List getByOrderId(Long orderId); } diff --git a/sky-server/src/main/java/com/sky/mapper/OrderMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java index cc582a9..efe15fb 100644 --- a/sky-server/src/main/java/com/sky/mapper/OrderMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java @@ -1,10 +1,9 @@ package com.sky.mapper; +import com.github.pagehelper.Page; +import com.sky.dto.OrdersPageQueryDTO; import com.sky.entity.Orders; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Options; -import org.apache.ibatis.annotations.Update; +import org.apache.ibatis.annotations.*; import java.time.LocalDateTime; @@ -23,4 +22,29 @@ public interface OrderMapper { //处理支付pem问题 @Update("update orders set status = #{orderStatus},pay_status = #{orderPaidStatus},checkout_time = #{checkOutTime} where id = #{id}") void updateStatus(Integer orderStatus, Integer orderPaidStatus, LocalDateTime checkOutTime, Long id); + + @Select("select * from orders where number = #{number}") + Orders getByNumber(String number); + + void update(Orders orders); + + /** + * 分页条件查询并按下单时间排序 + * @param ordersPageQueryDTO + */ + Page pageQuery(OrdersPageQueryDTO ordersPageQueryDTO); + + /** + * 根据id查询订单 + * @param id + */ + @Select("select * from orders where id=#{id}") + Orders getById(Long id); + + /** + * 根据状态统计订单数量 + * @param status + */ + @Select("select count(id) from orders where status = #{status}") + Integer countStatus(Integer status); } diff --git a/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java index a13c6ab..082a374 100644 --- a/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java @@ -29,4 +29,11 @@ public interface ShoppingCartMapper { @Delete("delete from shopping_cart where id = #{id}") void deleteById(Long id); + + /** + * 批量插入购物车数据 + * + * @param shoppingCartList + */ + void insertBatch(List shoppingCartList); } diff --git a/sky-server/src/main/java/com/sky/service/OrderService.java b/sky-server/src/main/java/com/sky/service/OrderService.java index 32bf288..e7d7bd8 100644 --- a/sky-server/src/main/java/com/sky/service/OrderService.java +++ b/sky-server/src/main/java/com/sky/service/OrderService.java @@ -1,9 +1,11 @@ package com.sky.service; -import com.sky.dto.OrdersPaymentDTO; -import com.sky.dto.OrdersSubmitDTO; +import com.sky.dto.*; +import com.sky.result.PageResult; import com.sky.vo.OrderPaymentVO; +import com.sky.vo.OrderStatisticsVO; import com.sky.vo.OrderSubmitVO; +import com.sky.vo.OrderVO; public interface OrderService { /** @@ -19,4 +21,82 @@ public interface OrderService { * @return */ OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception; + + + /** + * 用户端订单分页查询 + * @param page + * @param pageSize + * @param status + * @return + */ + PageResult pageQuery4User(int page, int pageSize, Integer status); + + /** + * 查询订单详情 + * @param id + * @return + */ + OrderVO details(Long id); + + /** + * 用户取消订单 + * @param id + */ + void userCancelById(Long id) throws Exception; + + /** + * 再来一单 + * + * @param id + */ + void repetition(Long id); + + /** + * 条件搜索订单 + * @param ordersPageQueryDTO + * @return + */ + PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO); + + /** + * 各个状态的订单数量统计 + * @return + */ + OrderStatisticsVO statistics(); + + /** + * 接单 + * + * @param ordersConfirmDTO + */ + void confirm(OrdersConfirmDTO ordersConfirmDTO); + + /** + * 拒单 + * + * @param ordersRejectionDTO + */ + void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception; + + /** + * 商家取消订单 + * + * @param ordersCancelDTO + */ + void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception; + + /** + * 派送订单 + * + * @param id + */ + void delivery(Long id); + + /** + * 完成订单 + * + * @param id + */ + void complete(Long id); } diff --git a/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java index 7f945b3..eeaa7ca 100644 --- a/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java +++ b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java @@ -1,26 +1,34 @@ package com.sky.service.impl; import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import com.sky.constant.MessageConstant; import com.sky.context.BaseContext; -import com.sky.dto.OrdersPaymentDTO; -import com.sky.dto.OrdersSubmitDTO; +import com.sky.dto.*; import com.sky.entity.*; import com.sky.exception.AddressBookBusinessException; +import com.sky.exception.OrderBusinessException; import com.sky.exception.ShoppingCartBusinessException; import com.sky.mapper.*; +import com.sky.result.PageResult; import com.sky.service.OrderService; import com.sky.vo.OrderPaymentVO; +import com.sky.vo.OrderStatisticsVO; import com.sky.vo.OrderSubmitVO; +import com.sky.vo.OrderVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; 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 public class OrderServiceImpl implements OrderService { @@ -124,4 +132,301 @@ public class OrderServiceImpl implements OrderService { orderMapper.updateStatus(OrderStatus, OrderPaidStatus, check_out_time, this.orders.getId()); return vo; } + + + /** + * 用户端订单分页查询 + * + * @param pageNum + * @param pageSize + * @param status + * @return + */ + public PageResult pageQuery4User(int pageNum, int pageSize, Integer status) { + // 设置分页 + PageHelper.startPage(pageNum, pageSize); + + OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO(); + ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());//只能查询自己的订单 + ordersPageQueryDTO.setStatus(status); + + // 分页条件查询 + Page page = orderMapper.pageQuery(ordersPageQueryDTO); + + List list = new ArrayList(); + + // 查询出订单明细,并封装入OrderVO进行响应 + if (page != null && page.getTotal() > 0) { + for (Orders orders : page) { + Long orderId = orders.getId();// 订单id + + // 查询订单明细 + List orderDetails = orderDetailMapper.getByOrderId(orderId); + + OrderVO orderVO = new OrderVO(); + BeanUtils.copyProperties(orders, orderVO); + orderVO.setOrderDetailList(orderDetails); + + list.add(orderVO); + } + } + return new PageResult(page.getTotal(), list); + } + + /** + * 查询订单详情 + * + * @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; + } + + /** + * 用户取消订单 + * + * @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()); + + // 更新订单状态、取消原因、取消时间 + orders.setStatus(Orders.CANCELLED); + orders.setCancelReason("用户取消"); + orders.setCancelTime(LocalDateTime.now()); + orderMapper.update(orders); + } + + /** + * 再来一单 + * + * @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); + } + + /** + * 订单搜索 + * + * @param ordersPageQueryDTO + * @return + */ + public PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) { + PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize()); + + Page page = orderMapper.pageQuery(ordersPageQueryDTO); + + // 部分订单状态,需要额外返回订单菜品信息,将Orders转化为OrderVO + List orderVOList = getOrderVOList(page); + + return new PageResult(page.getTotal(), orderVOList); + } + + private List getOrderVOList(Page page) { + // 需要返回订单菜品信息,自定义OrderVO响应结果 + List orderVOList = new ArrayList<>(); + + List ordersList = page.getResult(); + if (!CollectionUtils.isEmpty(ordersList)) { + for (Orders orders : ordersList) { + // 将共同字段复制到OrderVO + OrderVO orderVO = new OrderVO(); + BeanUtils.copyProperties(orders, orderVO); + String orderDishes = getOrderDishesStr(orders); + + // 将订单菜品信息封装到orderVO中,并添加到orderVOList + orderVO.setOrderDishes(orderDishes); + orderVOList.add(orderVO); + } + } + return orderVOList; + } + + /** + * 根据订单id获取菜品信息字符串 + * + * @param orders + * @return + */ + private String getOrderDishesStr(Orders orders) { + // 查询订单菜品详情信息(订单中的菜品和数量) + List orderDetailList = orderDetailMapper.getByOrderId(orders.getId()); + + // 将每一条订单菜品信息拼接为字符串(格式:宫保鸡丁*3;) + List orderDishList = orderDetailList.stream().map(x -> { + String orderDish = x.getName() + "*" + x.getNumber() + ";"; + return orderDish; + }).collect(Collectors.toList()); + + // 将该订单对应的所有菜品信息拼接在一起 + return String.join("", orderDishList); + } + + /** + * 各个状态的订单数量统计 + * + * @return + */ + public OrderStatisticsVO statistics() { + // 根据状态,分别查询出待接单、待派送、派送中的订单数量 + Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED); + Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED); + Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS); + + // 将查询出的数据封装到orderStatisticsVO中响应 + OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO(); + orderStatisticsVO.setToBeConfirmed(toBeConfirmed); + orderStatisticsVO.setConfirmed(confirmed); + orderStatisticsVO.setDeliveryInProgress(deliveryInProgress); + return orderStatisticsVO; + } + + /** + * 接单 + * + * @param ordersConfirmDTO + */ + public void confirm(OrdersConfirmDTO ordersConfirmDTO) { + Orders orders = Orders.builder() + .id(ordersConfirmDTO.getId()) + .status(Orders.CONFIRMED) + .build(); + + orderMapper.update(orders); + } + + /** + * 拒单 + * + * @param ordersRejectionDTO + */ + public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception { + // 根据id查询订单 + Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId()); + + // 订单只有存在且状态为2(待接单)才可以拒单 + if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); + } + + + // 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间 + Orders orders = new Orders(); + orders.setId(ordersDB.getId()); + orders.setStatus(Orders.CANCELLED); + orders.setRejectionReason(ordersRejectionDTO.getRejectionReason()); + orders.setCancelTime(LocalDateTime.now()); + + orderMapper.update(orders); + } + + /** + * 取消订单 + * + * @param ordersCancelDTO + */ + public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception { + // 根据id查询订单 + Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId()); + + + // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间 + Orders orders = new Orders(); + orders.setId(ordersCancelDTO.getId()); + orders.setStatus(Orders.CANCELLED); + orders.setCancelReason(ordersCancelDTO.getCancelReason()); + orders.setCancelTime(LocalDateTime.now()); + orderMapper.update(orders); + } + + /** + * 派送订单 + * + * @param id + */ + public void delivery(Long id) { + // 根据id查询订单 + Orders ordersDB = orderMapper.getById(id); + + // 校验订单是否存在,并且状态为3 + if (ordersDB == null || !ordersDB.getStatus().equals(Orders.CONFIRMED)) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); + } + + Orders orders = new Orders(); + orders.setId(ordersDB.getId()); + // 更新订单状态,状态转为派送中 + orders.setStatus(Orders.DELIVERY_IN_PROGRESS); + + orderMapper.update(orders); + } + + /** + * 完成订单 + * + * @param id + */ + public void complete(Long id) { + // 根据id查询订单 + Orders ordersDB = orderMapper.getById(id); + + // 校验订单是否存在,并且状态为4 + if (ordersDB == null || !ordersDB.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); + } + + Orders orders = new Orders(); + orders.setId(ordersDB.getId()); + // 更新订单状态,状态转为完成 + orders.setStatus(Orders.COMPLETED); + orders.setDeliveryTime(LocalDateTime.now()); + + orderMapper.update(orders); + } } diff --git a/sky-server/src/main/resources/mapper/OrderMapper.xml b/sky-server/src/main/resources/mapper/OrderMapper.xml index 800dd6e..4312a80 100644 --- a/sky-server/src/main/resources/mapper/OrderMapper.xml +++ b/sky-server/src/main/resources/mapper/OrderMapper.xml @@ -1,4 +1,59 @@ + + update orders + + + cancel_reason=#{cancelReason}, + + + rejection_reason=#{rejectionReason}, + + + cancel_time=#{cancelTime}, + + + pay_status=#{payStatus}, + + + pay_method=#{payMethod}, + + + checkout_time=#{checkoutTime}, + + + status = #{status}, + + + delivery_time = #{deliveryTime} + + + where id = #{id} + + + \ No newline at end of file diff --git a/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml index e0e0b27..a65cfaf 100644 --- a/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml +++ b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml @@ -18,4 +18,13 @@ + + + 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}) + + \ No newline at end of file