苍穹外卖项目学习日记(12)

编程入门 行业动态 更新时间:2024-10-24 08:29:43

<a href=https://www.elefans.com/category/jswz/34/1726601.html style=苍穹外卖项目学习日记(12)"/>

苍穹外卖项目学习日记(12)

苍穹外卖项目学习日记(12) day09

历史订单查询

  • controller层OrderController添加历史订单查询方法
  • OrderController.java
    @GetMapping("/historyOrders")@ApiOperation("历史订单查询")public Result<PageResult> page(OrdersPageQueryDTO ordersPageQueryDTO){log.info("历史订单查询:{}",ordersPageQueryDTO);PageResult pageResult = orderService.pageQuery(ordersPageQueryDTO);return Result.success(pageResult);}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic PageResult pageQuery(OrdersPageQueryDTO ordersPageQueryDTO) {PageHelper.startPage(ordersPageQueryDTO.getPage(),ordersPageQueryDTO.getPageSize());Page<Orders> page = orderMapper.pageQuery(ordersPageQueryDTO);List<OrderVO> orderVOList = new ArrayList<>();if(page != null && page.size() > 0){for (Orders orders:page){Long id = orders.getId();List<OrderDetail> orderDetails = OrderDetailMapper.getByOrderId(id);OrderVO orderVO = new OrderVO();BeanUtils.copyProperties(orders,orderVO);orderVO.setOrderDetailList(orderDetails);}}return new PageResult(page.getTotal(),orderVOList);}
  • 在mapper层添加相应方法,并且在xml中实现
  • orderMapper.xml
    <select id="pageQuery" resultType="com.sky.entity.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 &gt;= #{beginTime}</if><if test="endTime != null">and order_time &lt;= #{endTime}</if></where>order by order_time desc</select>
  • orderDetailMapper.java
    @Select("select * from order_detail where order_id = #{orderId}")List<OrderDetail> getByOrderId(Long orderId);

查询订单详情

  • controller层OrderController添加订单详情方法
  • OrderController.java
   @GetMapping("/orderDetail/{id}")@ApiOperation("查询订单详情")public Result<OrderVO> details(@PathVariable("id") Long id) {OrderVO orderVO = orderService.details(id);return Result.success(orderVO);}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic OrderVO details(Long id) {OrderVO orderVO = new OrderVO();Orders orders = orderMapper.getByOrderId(id);List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());BeanUtils.copyProperties(orders,orderVO);orderVO.setOrderDetailList(orderDetailList);return orderVO;}

取消订单

  • controller层OrderController添加取消订单方法
  • OrderController.java
    @PutMapping("/cancel/{id}")@ApiOperation("取消订单")public Result cancel(@PathVariable Long id){log.info("取消订单:{}",id);orderService.cancelById(id);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic void cancelById(Long id) {Orders orders = orderMapper.getByOrderId(id);Integer status = orders.getStatus();// 校验订单是否存在if (orders == null) {throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);}//订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消if (orders.getStatus() > 2) {throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}if (status == Orders.PENDING_PAYMENT || status == Orders.TO_BE_CONFIRMED){orders.setStatus(Orders.CANCELLED);orders.setCancelTime(LocalDateTime.now());orders.setCancelReason("用户取消");orderMapper.update(orders);}}

再来一单

  • controller层OrderController添加再来一单方法
  • OrderController.java
    @PostMapping("/repetition/{id}")@ApiOperation("再来一单")public Result repeat(@PathVariable Long id){log.info("再来一单:{}",id);orderService.repeat(id);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic void repeat(Long id) {//查询订单详情List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);List<ShoppingCart> shoppingCartList = new ArrayList<>();Long currentId = BaseContext.getCurrentId();for (OrderDetail orderDetail:orderDetailList){ShoppingCart shoppingCart = new ShoppingCart();BeanUtils.copyProperties(orderDetail,shoppingCart);shoppingCart.setUserId(currentId);shoppingCart.setCreateTime(LocalDateTime.now());shoppingCartList.add(shoppingCart);}shoppingCartMapper.insertBatch(shoppingCartList);}
  • 在mapper层添加相应方法,并且在xml中实现
  • shoppingCartMapper.xml
    <insert id="insertBatch">insert into shopping_cart(name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time)values<foreach collection="shoppingCartList" item="sc" separator=",">(#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime})</foreach></insert>

订单搜索

  • admin的controller层创建OrderController类,并且添加条件搜索方法
  • OrderController.java
package com.sky.controller.admin;import com.sky.dto.OrdersPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.OrderService;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController("adminOrderController")
@Api(tags = "订单管理接口")
@RequestMapping("/admin/order")
@Slf4j
public class OrderController {@Autowiredprivate OrderService orderService;/*** 订单搜索* @param ordersPageQueryDTO* @return*/@GetMapping("/conditionSearch")@ApiOperation("订单搜索")public Result<PageResult> conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO){log.info("订单搜索:{}",ordersPageQueryDTO);PageResult pageResult = orderService.conditionSearch(ordersPageQueryDTO);return Result.success(pageResult);}
}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {PageHelper.startPage(ordersPageQueryDTO.getPage(),ordersPageQueryDTO.getPageSize());Page<Orders> page = orderMapper.pageQuery(ordersPageQueryDTO);List<OrderVO> orderVOList = getOrderVOList(page);return new PageResult(page.getTotal(),orderVOList);}private List<OrderVO> getOrderVOList(Page<Orders> page) {List<OrderVO> orderVOList = new ArrayList<>();List<Orders> ordersList= page.getResult();if(ordersList != null && ordersList.size() > 0){for(Orders orders : ordersList){OrderVO orderVO = new OrderVO();BeanUtils.copyProperties(orders,orderVO);orderVO.setOrderDishes(getOrderDishs(orders));orderVOList.add(orderVO);}}return orderVOList;}private String getOrderDishs(Orders orders) {// 查询订单菜品详情信息(订单中的菜品和数量)List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());// 将每一条订单菜品信息拼接为字符串(格式:宫保鸡丁*3;)List<String> orderDishList = orderDetailList.stream().map(x -> {String orderDish = x.getName() + "*" + x.getNumber() + ";";return orderDish;}).collect(Collectors.toList());// 将该订单对应的所有菜品信息拼接在一起return String.join("", orderDishList);}

各个状态的订单数量统计

  • admin的controller层OrderController类,添加条件订单数量统计方法
  • OrderController.java
    /*** 订单数量统计* @return*/@GetMapping("/statistics")@ApiOperation("订单数量统计")public Result<OrderStatisticsVO> statistics(){log.info("订单数量统计");OrderStatisticsVO orderStatisticsVO = orderService.statistics();return Result.success(orderStatisticsVO);}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    public OrderStatisticsVO statistics() {OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO();OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();ordersPageQueryDTO.setStatus(Orders.TO_BE_CONFIRMED);orderStatisticsVO.setToBeConfirmed(orderMapper.pageQuery(ordersPageQueryDTO).getResult().size());ordersPageQueryDTO.setStatus(Orders.CONFIRMED);orderStatisticsVO.setConfirmed(orderMapper.pageQuery(ordersPageQueryDTO).getResult().size());ordersPageQueryDTO.setStatus(Orders.DELIVERY_IN_PROGRESS);orderStatisticsVO.setDeliveryInProgress(orderMapper.pageQuery(ordersPageQueryDTO).getResult().size());return orderStatisticsVO;}
  • 发现问题:在获取page后,使用getTotal返回值一直为0,猜测可能是pageHelper的配置问题,所以使用先获取了result再获取sizie的方法

查询订单详情

  • admin的controller层OrderController类,添加查询订单详情方法
  • OrderController.java
    @GetMapping("/details/{id}")@ApiOperation("查询订单详情")public Result<OrderVO> details(@PathVariable("id") Long id) {OrderVO orderVO = orderService.details(id);return Result.success(orderVO);}

接单

  • admin的controller层OrderController类,添加接单方法
  • OrderController.java
    @PutMapping("/confirm")@ApiOperation("接单")public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) {log.info("接单:{}",ordersConfirmDTO);orderService.confirm(ordersConfirmDTO);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic void confirm(OrdersConfirmDTO ordersConfirmDTO) {Orders orders = new Orders();orders.setStatus(Orders.CONFIRMED);orders.setId(ordersConfirmDTO.getId());orderMapper.update(orders);}

拒单

  • admin的controller层OrderController类,添加拒单方法
  • OrderController.java
    @PutMapping("/rejection")@ApiOperation("拒单")public Result rejection(@RequestBody OrdersRejectionDTO OrdersRejectionDTO){log.info("拒单:{}",OrdersRejectionDTO);orderService.rejection(OrdersRejectionDTO);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic void rejection(OrdersRejectionDTO ordersRejectionDTO) {// 根据id查询订单Orders ordersDB = orderMapper.getByOrderId(ordersRejectionDTO.getId());// 订单只有存在且状态为2(待接单)才可以拒单if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}Orders orders = new Orders();orders.setStatus(Orders.CANCELLED);orders.setId(ordersRejectionDTO.getId());orders.setRejectionReason(ordersRejectionDTO.getRejectionReason());orders.setCancelTime(LocalDateTime.now());orderMapper.update(orders);}

取消订单

  • admin的controller层OrderController类,添加取消订单方法
  • OrderController.java
    @PutMapping("/cancel")@ApiOperation("取消订单")public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO){log.info("取消订单:{}",ordersCancelDTO);orderService.cancel(ordersCancelDTO);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    @Overridepublic void cancel(OrdersCancelDTO ordersCancelDTO) {Orders orders = new Orders();orders.setStatus(Orders.CANCELLED);orders.setId(ordersCancelDTO.getId());orders.setCancelReason(ordersCancelDTO.getCancelReason());orders.setCancelTime(LocalDateTime.now());orderMapper.update(orders);}

派送订单

  • admin的controller层OrderController类,添加派送订单方法
  • OrderController.java
    /*** 派送订单** @return*/@PutMapping("/delivery/{id}")@ApiOperation("派送订单")public Result delivery(@PathVariable("id") Long id) {orderService.delivery(id);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    public void delivery(Long id) {// 根据id查询订单Orders ordersDB = orderMapper.getByOrderId(id);// 校验订单是否存在,并且状态为3if (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);}

完成订单

  • admin的controller层OrderController类,添加完成订单方法
  • OrderController.java
    @PutMapping("/complete/{id}")@ApiOperation("完成订单")public Result complete(@PathVariable("id") Long id) {orderServiceplete(id);return Result.success();}
  • OrderService中添加相应方法,并且在实现类中实现
  • OrderServiceImpl.java
    public void complete(Long id) {// 根据id查询订单Orders ordersDB = orderMapper.getByOrderId(id);// 校验订单是否存在,并且状态为4if (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);}

优化用户下单

  • 配置外卖商家店铺地址和百度地图的AK:
  • application.yml
  shop:address: 青海省西宁市城北区宁大路235号青海大学baidu:ak: nbNi7uwUlppkzYC2pXsQafERrglnCf4G
  • 改造OrderServiceImpl,注入上面的配置项,并且在OrderServiceImpl中提供校验方法:
  • OrderServiceImpl.java
    @Value("${sky.shop.address}")private String shopAddress;@Value("${sky.baidu.ak}")private String ak;/*** 检查客户的收货地址是否超出配送范围* @param address*/private void checkOutOfRange(String address) {Map map = new HashMap();map.put("address",shopAddress);map.put("output","json");map.put("ak",ak);//获取店铺的经纬度坐标String shopCoordinate = HttpClientUtil.doGet("", map);JSONObject jsonObject = JSON.parseObject(shopCoordinate);if(!jsonObject.getString("status").equals("0")){throw new OrderBusinessException("店铺地址解析失败");}//数据解析JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");String lat = location.getString("lat");String lng = location.getString("lng");//店铺经纬度坐标String shopLngLat = lat + "," + lng;map.put("address",address);//获取用户收货地址的经纬度坐标String userCoordinate = HttpClientUtil.doGet("", map);jsonObject = JSON.parseObject(userCoordinate);if(!jsonObject.getString("status").equals("0")){throw new OrderBusinessException("收货地址解析失败");}//数据解析location = jsonObject.getJSONObject("result").getJSONObject("location");lat = location.getString("lat");lng = location.getString("lng");//用户收货地址经纬度坐标String userLngLat = lat + "," + lng;map.put("origin",shopLngLat);map.put("destination",userLngLat);map.put("steps_info","0");//路线规划String json = HttpClientUtil.doGet("", map);jsonObject = JSON.parseObject(json);if(!jsonObject.getString("status").equals("0")){throw new OrderBusinessException("配送路线规划失败");}//数据解析JSONObject result = jsonObject.getJSONObject("result");JSONArray jsonArray = (JSONArray) result.get("routes");Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance");if(distance > 5000){//配送距离超过5000米throw new OrderBusinessException("超出配送范围");}}
  • OrderServiceImpl的submitOrder方法中调用上面的校验方法:

windwos后台启动程序

  • 进入需要启动的文件目录下,输入powershell
  • 运行Start-Process -WindowStyle hidden 你的程序即可

前后端数据传参的区别(@RequestParam,@PathVariable和@RequestBody)

  • @RequestParam
http://localhost:8090/hello?id=2
public String Demo1(@RequestParam String id){System.out.println(id);return null;
}
  • @PathVariable
http://localhost:8090/hello/2
@RequestMapping(value = "/getBook/{id}", method = RequestMethod.GET)
public String getBook(@PathVariable Integer id) {System.out.println(id);return null;
}
  • @RequestBody
  • 一般是在请求体中,传递比较多参数时使用,可以实现自动封装,即可以以实体类在controller中作为形参

更多推荐

苍穹外卖项目学习日记(12)

本文发布于:2023-11-15 01:25:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1591231.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:苍穹   外卖   项目   日记

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!