# 1、背景说明 通过前面课程的学习,我们已经掌握了神领物流项目相关业务的开发,也参与了核心调度中心的开发,对于项目有了更深的理解,在此阶段中,我们将基于神领物流项目本身的基础之上扩展新的功能,这些新的功能将由你来完成。加油~ ![w.gif](https://cdn.nlark.com/yuque/0/2023/gif/27683667/1672987999526-6c95497c-ad19-44d6-990d-42a7d71c5739.gif#averageHue=%23ece2cd&clientId=uc8bb01a9-47d6-4&from=paste&height=160&id=u4eb41927&name=w.gif&originHeight=240&originWidth=240&originalType=binary&ratio=1&rotation=0&showTitle=false&size=87315&status=done&style=none&taskId=uad32aa0a-4682-4f5d-b3a1-dd91c2dbefa&title=&width=160) # 2、功能需求 项目分组实战,目标是完成三个需求,实现三个微服务,分别是 - 取派件任务搜索微服务 (★★★★☆) - 车辆轨迹微服务 (★★★☆☆) - 短信微服务 (★★☆☆☆) - 快递员派件时,下发短信通知收件人 - 快递员取件后,用户超时1小时未付款,下发短信通知付款 - 收件人签收后,下发短信邀请为快递员评价 - …… ## 2.1、取派件任务搜索 取派件任务搜索是在快递员端的操作,主要包含两个功能,分别是【任务搜索】和【最近搜索】,其中【最近搜索】已经在`sl-express-ms-web-courier`中实现,所以在实战中,只需要实现【任务搜索】即可。 任务搜索的需求如下:(仔细阅读需求) ![image.png](https://cdn.nlark.com/yuque/0/2022/png/27683667/1665050512674-e89b4f13-70ab-432e-b9bb-8322710c29f4.png#averageHue=%23f5e2c6&clientId=uf57bf908-e771-4&errorMessage=unknown%20error&from=paste&height=186&id=u95dab60d&name=image.png&originHeight=307&originWidth=1170&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53844&status=error&style=shadow&taskId=ude71c73a-3980-44bd-a862-2d293d365b2&title=&width=709.0908681065607) 功能界面: ![image.png](https://cdn.nlark.com/yuque/0/2022/png/27683667/1665051129876-512ab465-7397-400f-b554-95be2bbdbe4d.png#averageHue=%23edeff3&clientId=uf57bf908-e771-4&errorMessage=unknown%20error&from=paste&height=461&id=u2ac33c49&name=image.png&originHeight=760&originWidth=900&originalType=binary&ratio=1&rotation=0&showTitle=false&size=80763&status=error&style=shadow&taskId=ub595912d-5a0d-4bcd-97bc-17800389d00&title=&width=545.4545139281236) ## 2.2、车辆轨迹 车辆轨迹,首先是在创建运单后会对整个运输路线进行规划(借助高德地图服务),规划完成后轨迹点数据存于MongoDB,用于展现轨迹。(具体需求可参考需求文档) 车辆在运输中、快递员在派件中会上报位置自己的位置,具体由各自的APP进行上报,用于展现当前车辆所在的位置。 功能效果图如下: ![image.png](https://cdn.nlark.com/yuque/0/2022/png/27683667/1666833403124-d59fe54c-042f-43a3-8a4c-10c043d94bbf.png#averageHue=%23f2f5f2&clientId=u40ea5074-c5cd-4&from=paste&height=485&id=uc89de9c9&name=image.png&originHeight=728&originWidth=458&originalType=binary&ratio=1&rotation=0&showTitle=true&size=384273&status=done&style=shadow&taskId=u02ea86b7-d774-4049-b749-3d54f644b67&title=%E8%BD%A6%E8%BE%86%E8%BF%90%E8%BE%93%E4%B8%AD&width=305.3333333333333 "车辆运输中") ![image.png](https://cdn.nlark.com/yuque/0/2022/png/27683667/1666833433788-0138f105-8c7f-4f21-af38-2c3420fadbe4.png#averageHue=%23bfc9ba&clientId=u40ea5074-c5cd-4&from=paste&height=489&id=ua0f13194&name=image.png&originHeight=734&originWidth=435&originalType=binary&ratio=1&rotation=0&showTitle=true&size=162484&status=done&style=shadow&taskId=u8836a45b-5033-4fb8-b0f8-802feac083b&title=%E5%BF%AB%E9%80%92%E5%91%98%E6%B4%BE%E4%BB%B6%E4%B8%AD&width=290 "快递员派件中") # 3、实现分析 ## 3.1、取派件任务搜索 关于搜索的实现的,可以参考文档:[https://sl-express.itheima.net/#/zh-cn/modules/sl-express-ms-search](https://sl-express.itheima.net/#/zh-cn/modules/sl-express-ms-search) ### 3.1.1、业务流程 ![](https://cdn.nlark.com/yuque/__puml/625e22b4440d05858f53c190f635c9e3.svg#lake_card_v2=eyJ0eXBlIjoicHVtbCIsImNvZGUiOiJAc3RhcnR1bWxcblxuYXV0b251bWJlclxuXG5wYXJ0aWNpcGFudCBcIndlYi1jb3VyaWVyXCIgYXMgY291cmllclxucGFydGljaXBhbnQgXCJ3b3Jr5b6u5pyN5YqhXCIgYXMgd29ya1xucGFydGljaXBhbnQgXCJSYWJiaXRNUVwiIGFzIG1xXG5wYXJ0aWNpcGFudCBcInNlYXJjaOW-ruacjeWKoVwiIGFzIHNlYXJjaFxucGFydGljaXBhbnQgXCJFbGFzdGljc2VhcmNoXCIgYXMgZXNcblxud29yayAtLT4gbXEgLS0rKzog5paw5aKe5Y-W5rS-5Lu25Lu75YqhXG53b3JrIC0tPiBtcSA6IOabtOaWsOWPlua0vuS7tuS7u-WKoVxud29yayAtLT4gbXEgLS06IOWIoOmZpOWPlua0vuS7tuS7u-WKoVxuXG5tcSAtLT4gc2VhcmNoICsrOiDmlrDlop7lj5bmtL7ku7bku7vliqFcbm1xIC0tPiBzZWFyY2ggOiDmm7TmlrDlj5bmtL7ku7bku7vliqFcbm1xIC0tPiBzZWFyY2ggLS06IOWIoOmZpOWPlua0vuS7tuS7u-WKoVxuXG5zZWFyY2ggLT4gZXMgKys6IOaWsOWinuWPlua0vuS7tuS7u-WKoVxuc2VhcmNoIC0-IGVzIDog5pu05paw5Y-W5rS-5Lu25Lu75YqhXG5zZWFyY2ggLT4gZXMgLS06IOWIoOmZpOWPlua0vuS7tuS7u-WKoVxuZGVhY3RpdmF0ZSBlc1xuXG5jb3VyaWVyIC0-IHNlYXJjaCArKzog5pCc57Si5Y-W5rS-5Lu25Lu75YqhXG5hY3RpdmF0ZSBjb3VyaWVyXG5zZWFyY2ggLT4gZXMgKys6IOaQnOe0olxuZXMgLS0-IHNlYXJjaCAtLTog6L-U5ZueXG5zZWFyY2ggLS0-IGNvdXJpZXIgOiDov5Tlm57nu5PmnpxcbmRlYWN0aXZhdGUgY291cmllclxuXG5AZW5kdW1sIiwidXJsIjoiaHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlL19fcHVtbC82MjVlMjJiNDQ0MGQwNTg1OGY1M2MxOTBmNjM1YzllMy5zdmciLCJpZCI6IkRxdTFBIiwibWFyZ2luIjp7InRvcCI6dHJ1ZSwiYm90dG9tIjp0cnVlfSwiY2FyZCI6ImRpYWdyYW0ifQ==)由上面的业务流程可以看出: - 快递员的取派件任务都是通过work微服务发出消息与Elasticsearch中的数据同步的 - 快递员端微服务通过搜索微服务的查询,可以查询到符合条件的数据 ### 3.1.2、基础代码 在git中提供搜索微服务的基础代码,仅供实战参考。(学生可自行设计代码,不要求必须一样,能够实现业务功能即可) | 工程名 | git地址 | | --- | --- | | sl-express-ms-search-api | [http://git.sl-express.com/sl/sl-express-ms-search-api.git](http://git.sl-express.com/sl/sl-express-ms-search-api.git) | | sl-express-ms-search-domain | [http://git.sl-express.com/sl/sl-express-ms-search-domain.git](http://git.sl-express.com/sl/sl-express-ms-search-domain.git) | | sl-express-ms-search-service | [http://git.sl-express.com/sl/sl-express-ms-search-service.git](http://git.sl-express.com/sl/sl-express-ms-search-service.git) | ### 3.1.3、实现提示 #### 3.1.3.1、新版Java API学习 ElasticSearch自7.15版本以后,废弃了 RestHighLevelClient ,官方推荐使用 ElasticsearchClient ,该客户端的使用示例均已做了测试用例。 如下图中,IndexTest 是索引相关测试用例,DocumentTest 是文档相关测试用例,ComplexSearchTest 是复杂搜索相关测试用例。 另外,同学们也可参考官方文档进行自主学习:[https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/searching.html](https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/searching.html) ![image.png](https://cdn.nlark.com/yuque/0/2023/png/28217986/1678698979148-4a28be6d-60b6-451a-ba92-9a5ee7e27d38.png#averageHue=%23fcf7f5&clientId=ucfc63b50-f6cc-4&from=paste&height=437&id=u1d49139a&name=image.png&originHeight=437&originWidth=553&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23339&status=done&style=shadow&taskId=ub7b63666-5f3e-417d-bc9a-4cc58f55cfa&title=&width=553) #### 3.1.3.2、分词器学习 搜索微服务中,我们对于运单号、手机号、姓名字段进行搜索。运单号和手机号字段使用Ngram分词器,姓名字段先使用Ngram分词器,再使用拼音分词器。 以上两种分词器可参考官方文档进行自主学习: - Ngram分词器官方文档:[https://www.elastic.co/guide/en/elasticsearch/reference/6.8/analysis-ngram-tokenizer.html](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/analysis-ngram-tokenizer.html) - 拼音分词器官方文档:[https://github.com/medcl/elasticsearch-analysis-pinyin](https://github.com/medcl/elasticsearch-analysis-pinyin) #### 3.1.3.3、索引库结构 在kibana中,创建索引库和映射(仅供参考,可自行调整): ```shell PUT courier_task { "settings": { "index.max_ngram_diff":12,// ngram分词器设置最大最小步长间隔 "analysis": { "analyzer": {// 自定义分词器 "code_analyzer": {// 编码类分词器,适用于手机号和运单号 "tokenizer": "code_tokenizer" }, "name_analyzer":{// 姓名分词器 "tokenizer": "name_tokenizer", "filter": "py" // 分词后再用拼音分词器过滤 } }, "tokenizer": { "code_tokenizer": { "type": "ngram", "min_gram": 4, "max_gram": 15, "token_chars": [ "letter", "digit" ] }, "name_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 10, "token_chars": [ "letter", "digit" ] } }, "filter": {// 自定义tokenizer filter "py":{// 过滤器名称 "type": "pinyin",// 过滤器类型,这个自定义的过滤器使用的是pinyin分词器 "keep_full_pinyin": false,//不要把单个字ch "keep_joined_full_pinyin": true,//把词语转成全拼 "keep_original": true,//转完之后的中文保留 "limit_first_letter_length": 16,//转成的拼音首字母不能超过16个 "remove_duplicated_term": true,//转成的拼音不能有重复的,重复的删掉 "none_chinese_pinyin_tokenize": false } } } }, "mappings": { "properties": { "actualEndTime" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss" }, "actualStartTime" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss" }, "address" : { "type" : "text" }, "agencyId" : { "type" : "long" }, "courierId" : { "type" : "long" }, "created" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss" }, "estimatedEndTime" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss" }, "estimatedStartTime" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss" }, "id" : { "type" : "keyword" }, "isDeleted" : { "type" : "keyword" }, "name" : { "type" : "text", "analyzer": "name_analyzer", "search_analyzer": "keyword" }, "orderId" : { "type" : "long" }, "phone" : { "type" : "text", "analyzer": "code_analyzer", "search_analyzer": "keyword" }, "status" : { "type" : "keyword" }, "taskType" : { "type" : "keyword" }, "transportOrderId" : { "type" : "text", "analyzer": "code_analyzer", "search_analyzer": "keyword" }, "updated" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss" } } } } ``` ## 3.2、车辆轨迹 ### 3.2.1、业务流程 ![](https://cdn.nlark.com/yuque/__puml/1219b77fff89729619b1adc52e3d48e9.svg#lake_card_v2=eyJ0eXBlIjoicHVtbCIsImNvZGUiOiJAc3RhcnR1bWxcblxuYXV0b251bWJlclxuXG5wYXJ0aWNpcGFudCBcIndlYi1jdXN0b21lclwiIGFzIGN1c3RvbWVyXG5wYXJ0aWNpcGFudCBcIndvcmvlvq7mnI3liqFcIiBhcyB3b3JrXG5wYXJ0aWNpcGFudCBcIlJhYmJpdE1RXCIgYXMgbXFcbnBhcnRpY2lwYW50IFwic2wtZXhwcmVzcy1tcy10cmFja1wiIGFzIHRyYWNrXG5wYXJ0aWNpcGFudCBcIndlYi1jb3VyaWVyXCIgYXMgY291cmllclxucGFydGljaXBhbnQgXCJ3ZWItZHJpdmVyXCIgYXMgZHJpdmVyXG5cbndvcmsgLS0-IG1xIC0tKys6IOaWsOWinui_kOWNlVxubXEgLS0-IHRyYWNrIC0tKys6IOinhOWIkuWujOaVtOi_kOi-k-i3r-e6v1xudHJhY2sgLT4gdHJhY2sgOiDmjIHkuYXljJZcblxuY291cmllciAtPiB0cmFjayA6IOS4iuaKpeW_q-mAkuWRmOS9jee9rlxuZHJpdmVyIC0-IHRyYWNrIDog5LiK5oql6L2m6L6G5L2N572uXG5cbmN1c3RvbWVyIC0-IHRyYWNrOiDmn6Xor6Lovajov7lcblxuY3VzdG9tZXIgLS0-IG1xIC0tKys6IOetvuaUtlxubXEgLS0-IHRyYWNrIC0tOiDlrozmiJDovajov7lcblxuQGVuZHVtbCIsInVybCI6Imh0dHBzOi8vY2RuLm5sYXJrLmNvbS95dXF1ZS9fX3B1bWwvMTIxOWI3N2ZmZjg5NzI5NjE5YjFhZGM1MmUzZDQ4ZTkuc3ZnIiwiaWQiOiJXS21vciIsIm1hcmdpbiI6eyJ0b3AiOnRydWUsImJvdHRvbSI6dHJ1ZX0sImNhcmQiOiJkaWFncmFtIn0=)### 3.2.2、基础代码 在git中提供车辆轨迹微服务的基础代码,仅供实战参考。(学生可自行设计代码,不要求必须一样,能够实现业务功能即可) | 工程名 | git地址 | | --- | --- | | sl-express-ms-track-api | [http://git.sl-express.com/sl/sl-express-ms-track-api.git](http://git.sl-express.com/sl/sl-express-ms-track-api.git) | | sl-express-ms-track-domain | [http://git.sl-express.com/sl/sl-express-ms-track-domain.git](http://git.sl-express.com/sl/sl-express-ms-track-domain.git) | | sl-express-ms-track-service | [http://git.sl-express.com/sl/sl-express-ms-track-service.git](http://git.sl-express.com/sl/sl-express-ms-track-service.git) | ### 3.2.3、实现提示 实现思路: - 根据收发件人的地址通过高德地图查询路线数据,需要将转运节点作为途经点 - 解析高德返回的数据存储到MongoDB中,解析有一定难度 # 3.3、短信微服务 项目中需要搭建短信微服务,需要发送短信进行通知,在这里主要实现的业务是,运单开始派送时发送短信通知收件人。 基础代码,仅供实战参考。(学生可自行设计代码,不要求必须一样,能够实现业务功能即可) | 工程名 | git地址 | | --- | --- | | sl-express-ms-sms-domain | [http://git.sl-express.com/sl/sl-express-ms-sms-domain.git](http://git.sl-express.com/sl/sl-express-ms-sms-domain.git) | | sl-express-ms-sms-api | [http://git.sl-express.com/sl/sl-express-ms-sms-api.git](http://git.sl-express.com/sl/sl-express-ms-sms-api.git) | | sl-express-ms-sms-service | [http://git.sl-express.com/sl/sl-express-ms-sms-service.git](http://git.sl-express.com/sl/sl-express-ms-sms-service.git) | > 关于短信发送渠道,自行选择,不做强制要求。建议选择阿里云平台。 # 4、项目分组 ## 4.1、时间安排 此次项目实战安排2天课时(可以加一天自习调整为3天),具体的时间安排如下: - 第一天上午,由讲师带领学生了解项目实战中的内容 - 第一天的下午,第二天,第三天上午,这些时间段是学生实战开发的时间 - 第三天下午,成果演示 ## 4.2、分组安排 - 将一个班的学生分成若干小组,每个小组成员5~6人,最多不超过8人。 - 每个小组选取一名组长,组长负责组员的任务分工。 - 每个组员都要参与开发,不得以任何接口拒绝组长安排的任务。 - 每个小组都需要完成实战中的三个功能(搜索、车辆轨迹、短信)的开发。 ## 4.3、代码管理 在项目开发的过程中,我们都是基于虚拟机中的git提交代码的,在分组实战中,需要将代码共享,同组人员公共修改代码,此时虚拟机中的git就无法满足需求了,在这里,可以借助[码云](https://gitee.com/)来完成共享。基本的架构如下: ![](https://cdn.nlark.com/yuque/0/2022/jpeg/27683667/1665147200039-bab2d995-ef23-4279-8ea3-504f17b2a579.jpeg) 说明: - 组长在码云中创建相应的项目,并且邀请组员成为开发者 - 组长将本地虚拟机环境中的git代码提交到码云(只需要提交实战中涉及到工程即可) - 组员代码拉取到本地,即可进行项目开发,在开发完成后将代码提交到码云 - 待所有的功能开发完成后,组长将代码同步到本地虚拟机中的git中,最终基于组长的环境进行功能演示 - 同样,组员也将最终的代码同步到自己的本地环境中,提交到虚拟机中的git服务中 - 最终,所有人的本地虚拟机中的代码都应该是一致的 # 5、成果演示 - 每个组都需要准备一个演示ppt,在成果演示阶段使用,ppt风格不限 - 演示时,不仅是通过接口演示功能,还要通过四端进行演示,能够将完整的物流流程走通 - 如果有额外实现一些相关的功能,会有加分