实习项目|苍穹外卖|day9

实战作业。

用户端新增功能

1. 查询历史订单

接口设计

在这里插入图片描述
返回的是order+orderdetails(那我这里就先查order,再根据order_id查)

分页

pageHelper的使用:

//controller相关函数@GetMapping("/historyOrders")@ApiOperation("历史订单查询")//query 不用@RequestBody public Result<PageResult> historyOrders(OrdersPageQueryDTO ordersPageQueryDTO){log.info("历史订单查询:{}", ordersPageQueryDTO);PageResult pageResult = orderService.historyOrders(ordersPageQueryDTO);return Result.success(pageResult);
//service实现类相关函数public PageResult historyOrders(OrdersPageQueryDTO ordersPageQueryDTO) {Long userId = BaseContext.getCurrentId();ordersPageQueryDTO.setUserId(userId);// 原型就是select * from employee limit 0, 10PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());Page<OrderVO> page = orderMapper.pageQuery(ordersPageQueryDTO);long total = page.getTotal();List<OrderVO> results = page.getResult();for (OrderVO result : results) {Long orderId = result.getId();List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orderId);result.setOrderDetailList(orderDetailList);}return new PageResult(total, results);}
// mapper.xml<select id="pageQuery" resultType="com.sky.vo.OrderVO">select * from orders<where><if test="status != null and status != ''">and status = #{status}</if></where>order by order_time desc</select>

2.查询历史订单详情

已知orderId查询,与上一个功能类似。

3.取消订单

在这里插入图片描述
非常简单的修改状态+修改时间?
是不是要有逻辑判断啊?(什么状态下是可以取消的?)

3.再来一单

在这里插入图片描述

这里有一个难点,就是如何插入新的订单(好多信息,比如预计送达时间等等要怎么处理?)

管理端

1.订单搜索

个人觉得难点就在于,啊啊啊,好多条件用来搜索,sql语言怎么写啊!!!
service的逻辑不太清楚是不是以下这样的:

PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());Page<OrderVO> page = orderMapper.conditionSearch(ordersPageQueryDTO);long total = page.getTotal();List<OrderVO> result = page.getResult();for (OrderVO orderVO : result) {StringBuffer orderDishs = new StringBuffer();Long id = orderVO.getId();List<OrderDetail> orderDetails = orderDetailMapper.getByOrderId(id);for (OrderDetail orderDetail : orderDetails) {Long dishId = orderDetail.getDishId();//判断是不是菜品Dish dish;if(dishId != null){//是菜品,直接查询菜品表dish = dishMapper.getById(dishId);orderDishs.append(dish.toString());}else {//是套餐,查询套餐表//根据套餐ID,查下面的菜品ID,再查菜品信息Long setmealId = orderDetail.getSetmealId();List<SetmealDish> bySetmealId = setmealDishMapper.getBySetmealId(setmealId);for (SetmealDish setmealDish : bySetmealId) {dish = dishMapper.getById(setmealDish.getDishId());orderDishs.append(dish.toString());}}orderVO.setOrderDishes(orderDishs.toString());}

mapper

    <select id="conditionSearch" resultType="com.sky.vo.OrderVO">select * from orders<where><if test="number != null and number != ''">and number = #{number}</if><if test="phone != null and phone != ''">and phone = #{phone}</if><if test="beginTime != null">and order_time &gt;= #{beginTime}</if><if test="endTime != null">and order_time &lt;= #{endTime}</if><if test="status != null and status != ''">and status = #{status}</if></where>order by order_time desc</select>

2.各个状态的订单数量统计

    public OrderStatisticsVO statistics() {OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO();Integer confirmed = orderMapper.countInStatus(Orders.CONFIRMED);Integer deliveryInProgress = orderMapper.countInStatus(Orders.DELIVERY_IN_PROGRESS);Integer  toBeConfirmed = orderMapper.countInStatus(Orders.TO_BE_CONFIRMED);orderStatisticsVO.setConfirmed(confirmed);orderStatisticsVO.setDeliveryInProgress(deliveryInProgress);orderStatisticsVO.setToBeConfirmed(toBeConfirmed);return orderStatisticsVO;}

3.查询订单详情

与用户端共用一个service实现。

4.接单

改变订单状态。

5.拒单

这里面有逻辑我不是很清晰,拒单算作取消订单还是完成订单?

6.取消订单

和拒单几乎一样

7.派送订单

8.完成订单

在这里插入图片描述

        //这里自己设置一个状态检测吧,并不是任何状态都可以Orders order = orderMapper.getById(id);if (order.getStatus() != Orders.DELIVERY_IN_PROGRESS){throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}else{order.setStatus(Orders.COMPLETED);order.setDeliveryTime(LocalDateTime.now());orderMapper.update(order);}

已有功能优化

优化用户下单功能,加入校验逻辑,如果用户的收货地址距离商家门店超出配送范围(配送范围为5公里内),则下单失败。

提示:

​ 1. 基于百度地图开放平台实现(https://lbsyun.baidu.com/)

​ 2. 注册账号—>创建应用获取AK(服务端应用)—>调用接口

  1. 相关接口

    https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

    https://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1

  2. 商家门店地址可以配置在配置文件中,例如:

    sky:shop:address: 北京市海淀区上地十街10号
    

自己的分析

我要知道我门店的位置(给的提示是写在配置里面,那应该是有对应的类了,那就可以直接依赖注入使用),要知道用户的位置(用户提交订单里面的地址提取出来!)。然后计算。

package com.sky.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "sky.shop")
@Data
public class ShopProperties {private String address;}

API学习:地理编码+骑行路线规划

直接用百度的代码,感觉还是不行,这样代码风格不统一,自己阅读起来也很难受。

  1. 如何获取application.yam中的配置:@Value注解 更多方法
  2. 如何使用HttpClient:基于老师已给的HttpClientUtil进行的,直接doGet。
  3. 解析api调用返回的String报错。JSON.parseObject(str)。报错信息
    @Value("${sky.shop.address}")String shopAddress;@Value("${sky.baidumap.AK}")String Ak;@Value("${sky.baidumap.geocodingUrl}")String geocodingUrl;@Value("${sky.baidumap.distanceUrl}")String distanceUrl;
  1. 我现在纠结的点在于如何反馈,能够让客户端知道是距离问题导致的。

对答案

原本计划两天前就完成的,但是电脑出了些问题,如今重装了系统,一切恢复如常。还是一句话:有用的东西装D盘,所以基本上就是下下几个版本号错误的软件,重新安装一下mysql(数据都保存在D盘,简单恢复一下就好),就没多大事!!!

实战内容

完成用户端历史订单模块、商家端订单管理模块相关业务新功能开发和已有功能优化,具体任务列表如下:

1. 新功能开发

用户端历史订单模块:

  • 查询历史订单
  • 查询订单详情
  • 取消订单 //考虑不足,没有考虑到订单是否存在;没有理清状态改变。待接单状态下要退钱,退完钱要更新到取消状态。
// 校验订单是否存在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);
  • 再来一单 //答案思路是把数据库的数据转为购物车对象:
public void repetition(Long id) {// 查询当前用户idLong userId = BaseContext.getCurrentId();// 根据订单id查询当前订单详情List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(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);}

商家端订单管理模块:(校验订单是否存在,和退款都是没有考虑到的。)

  • 订单搜索 (好奇怪,答案里的代码里没有考虑套餐的问题?答:直接套餐名*数量)
  • 各个状态的订单数量统计
  • 查询订单详情
  • 接单
  • 拒单 (没考虑已付款要退钱的问题。)
  • 取消订单
  • 派送订单
  • 完成订单
2. 已有功能优化

优化用户下单功能,加入校验逻辑,如果用户的收货地址距离商家门店超出配送范围(配送范围为5公里内),则下单失败。

提示:

​ 1. 基于百度地图开放平台实现(https://lbsyun.baidu.com/)

​ 2. 注册账号—>创建应用获取AK(服务端应用)—>调用接口

  1. 相关接口

    https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

    https://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1

  2. 商家门店地址可以配置在配置文件中,例如:

    sky:shop:address: 北京市海淀区上地十街10号
    

实战要求

  1. 根据产品原型进行需求分析和接口设计
  2. 根据接口设计进行代码实现
  3. 分别通过swagger接口文档和前后端联调进行功能测试
  4. 分组实战(具体任务分工由组长分配)

主要的问题是:如何从配置中获取信息@value。如何访问接口(doGet,doPost,map)。如何解析得到的返回值(难,至今没搞懂,出了问题是照着答案抄的。)

@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("https://api.map.baidu.com/geocoding/v3", 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("https://api.map.baidu.com/geocoding/v3", 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("https://api.map.baidu.com/directionlite/v1/driving", 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("超出配送范围");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423265.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GBase 8c V5_3.0.0 分布式数据库常用几个SQL】

1.检查应用连接数 以管理员用户 gbase&#xff0c;登录数据库主节点。 接数据库&#xff0c;并执行如下 SQL 语句查看连接数。 SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;2.查看空闲连接 查看空闲(state 字段为”idle”)且长时间没有更…

AI问答-Vue实例属性/实例方法:$refs、$emit、$attrs、$props、$data...

一、本文简介 在Vue.js中&#xff0c;$ 符号通常用于表示Vue实例或组件上的内置属性和方法&#xff0c;这些被称为“实例属性”或“实例方法”。以下是一些常见的以$开头的Vue实例属性和方法 1.1、实例属性 序号实例属性解释1$dataVue实例的数据对象&#xff0c;用于存储组件…

Linux - 探秘/proc/sys/net/ipv4/ip_local_port_range

文章目录 Pre概述默认值及其意义评估需求如何调整临时修改永久修改测试和验证 修改的潜在影响 Pre Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置 计划&#xff1a; 简要解释 /proc/sys/net/ipv4/ip_local_port_range 文件的功能和作用。介绍该文件的默认值及其影响。说明…

ChatGPT: A Simulator Who Passed the Turing Test?

文章目录 引言Introduction:Applications:Discussion:Future Outlook:汉语翻译 引言 本文是一篇英语课前pre&#xff0c;简单介绍了ChatGPT的功能&#xff0c;内容一般&#xff0c;希望能帮到你。&#x1f642; Introduction: Standing at the intersection of natural lan…

Failed building wheel for opencv-python-headless

Failed building wheel for opencv-python-headless 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人…

UiBot教程:实现复杂流程图的高效方法

在自动化测试和RPA&#xff08;机器人流程自动化&#xff09;领域&#xff0c;使用UiBot绘制复杂流程图是日常工作中常见的挑战之一。如何在繁杂的逻辑中保持高效&#xff1f;如何实现复杂流程的自动化设计而不迷失于其中&#xff1f;这是许多测试工程师和自动化开发者所面临的…

存储课程学习笔记1_访问scsi磁盘读写测试(struct sg_io_hdr,ioctl,mmap)

创建虚拟机时&#xff0c;可以选择SCSI,STAT,NVME不同类型的磁盘。 0&#xff1a;总结 》了解内核提供的访问scsi的结构和方法 &#xff08;主要是sg_io_hdr_t 结构体和ioctl函数&#xff09;。 》需要读scsi协议文档&#xff0c;了解相关指令&#xff0c;只演示了16字节固定…

智启新机,云驱增长 | 华宇亮相2024腾讯全球数字生态大会

9月5日-6日&#xff0c;以“智启新机&#xff0c;云驱增长”为主题的2024腾讯全球数字生态大会在深圳国际会展中心举办。本次大会聚集了多位企业领军人物及行业专家&#xff0c;共同聚焦数字化下的产业新增长&#xff0c;以前沿探索为基石&#xff0c;以行业最佳实践为标杆&…

解密SERP代理:如何提高排名跟踪效率

一、什么是 SERP 代理&#xff1f; SERP代理是指专门用于访问搜索引擎结果页面&#xff08;SERP&#xff09;的代理服务器。这些代理服务器能够模拟真实的用户请求&#xff0c;从而避免因频繁查询或位置变化而导致IP被封禁或数据不准确。通过使用SERP代理&#xff0c;您可以获…

java 项目结构 文件说明 潜规则 java入门

java 项目结构 潜规则 java入门 一、controller、service、serviceImpl、Mapper、Xml等文件的作用 下图为java约定俗成的几个文件的作用 二、在项目中的使用情况&#xff0c;由于业务逻辑很简单&#xff0c;所以每个文件中的代码行数都很少 controller.java /*** 资产rim项目…

Java许可政策再变,Oracle JDK 17 免费期将结束!

原文地址&#xff1a;https://www.infoworld.com/article/3478122/get-ready-for-more-java-licensing-changes.html Oracle JDK 17的许可协议将于9月变更回Oracle Technology Network License Agreement&#xff0c;这将迫使用户重新评估他们的使用策略。 有句老话说&#xf…

个人hic分析流程搭建4—compartment模块分析

参考我的上一篇博客https://blog.csdn.net/weixin_62528784/article/details/142132891?spm1001.2014.3001.5502&#xff0c; 在处理完hic上游分析模块之后&#xff0c;接下来就是正式的3层次模块分析了&#xff0c;compartmentTADloop 3大主层次&#xff0c;本篇介绍compart…

Linux 挂载磁盘与开机自动挂载操作指南

Linux 挂载磁盘与开机自动挂载操作指南 文章目录 Linux 挂载磁盘与开机自动挂载操作指南一 挂载磁盘1 查看硬盘信息2 新增数据盘执行分区3 新建分区4 创建一个主分区5 分区编号6 初始磁柱编号7 截止磁柱编号8 查看新建分区信息9 分区结果写入10 新分区同步操作系统11 设置新分区…

如何编译OpenHarmony SDK API

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 startup子系统之syspara_lite系统属性部件 &#xff08;1&#xff09; startup子系统之syspara_lite系统属性部件 &#xff08;2&#xff09; startup子系…

跟《经济学人》学英文:2024年09月07日这期 What to read about the British economy

What to read about the British economy Britain used to be the world’s richest country. These six books explain how it came to be, and why it is no longer 原文&#xff1a; IN RECENT YEARS the British economy has tended to be in the news for the wrong re…

逆向工程 反编译 C# net core

索引器访问 在您的代码中&#xff0c;您试图使用 configurationRoot.get_Item("AgileConfig:appId") 来访问配置项&#xff0c;但这里存在几个问题&#xff1a; 错误的访问方法&#xff1a;在 .NET 的 IConfigurationRoot 接口中&#xff0c;没有直接名为 get_Item 的…

kkFileView PDF Image Mode Preview BUG

kkFileView PDF & Image Mode Preview BUG lazyload.js officePicture.ftl pdf.ftl kkFileView getCorsFile?urlPath 会触发SSRF漏洞 kkFileView SSRF-CSDN博客 commonHeader.ftl initWaterMark() 修改代码的工作量&#xff0c;主要是先部署项目&#xff0c;解…

OpenAI全新发布o1模型:开启 AGI 的新时代

OpenAI全新发布o1模型&#xff1a;开启 AGI 的新时代 欢迎关注【youcans的AGI学习笔记】原创作品 2024年9月13日&#xff0c;OpenAI新模型o1 正式发布。o1 在测试化学、物理和生物学专业知识的基准 GPQA-diamond 上&#xff0c;全面超过了人类博士专家。 OpenAI 宣称&#xff…

VSCode C++ Tasks.json中的变量

前言 上文介绍了在VSCode中创建C项目和编译多文件的情况。本文将介绍Tasks.json中一些变量的含义&#xff1b; 内容 tasks.json文件 下文参考VSCode文档&#xff1a;Visual Studio Code 变量参考 预定义标量 ${userHome} - 用户主文件夹的路径${workspaceFolder} - 在 VS Co…

软件测试之测试用例详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、通用测试用例八要素   1、用例编号&#xff1b;    2、测试项目&#xff1b;   3、测试标题&#xff1b; 4、重要级别&#xff1b;    5、预置条…