1.项目介绍
1.1项目归属
立可得是一个基于互联网概念下的智能售货机项目,
物联网(IOT:Internet of Things)是指通过信息传感设备,按约定的协议,将任何物体与网络相连接。
物体通过信息传播媒介进行信息交换和通信,以实现智能化识别、定位、跟踪、监管等功能。
典型的应用:智能家居、智能汽车等。
1.2核心技术
立可得项目核心技术参考图如下:
1.3产品终端介绍
本项目一共有五个终端、大体如下:
-
企业管理端:售货机所属企业的管理人员(平台管理员)使用,主要负责基础数据的维护
-
机子设备端:(嵌入式)安装在每个售货机中,主要负责处理出货请求
-
用户小程序端:消费者在手机微信应用中使用,主要完成购物操作
-
运维运营app端:供售货机所属企业的运维(上架、下架、修机子)和运营人员(补货)使用,主要作用是处理工单业务
-
合作商管理端:供合作商(售货机租借地归属者)使用,主要作用是合作商查看自己点位的分成
各终端大体功能如下图:
1.4微服务划分
业务方面我们一共有四个微服务:用户微服务、工单微服务、订单微服务、虚拟机微服务(售货机)。此外还有网关(GateWay)。具体可参考下图:
2.主要流程
2.1平台管理员
平台管理员主要负责基础数据的维护
-
点位管理:首先创建区域、创建合作商,然后在区域下添加点位,并为点位指定合作商
-
设备管理:创建设备类型,创建设备,并为设备分配点位
-
人员管理:新建运维和运营人员
-
商品管理:商品类型、创建商品、为设置的货道配置商品
-
订单管理:查询售后机产生的详细订单
-
对账管理:查询销售金额以及跟合作商的分成情况
-
工单管理:创建投放工单,由运维人员开始投放售货机;创建补货工单,由运营人员开始对售货机进行补货
2.2运维人员
运维人员主要负责对售货机进行安装、撤机和维修
这些操作需要由平台管理员通过后台管理系统创建工单,然后将工单分配给指定的运维人员处理
1.接受工单后在指定的投放点安装售货机,安装完毕后选择安装完成
2.拒绝工单该运维人员的工单结束
2.3运营人员
运营人员主要负责对售货机进行补货
补货工单可以由平台管理员手动创建,也可以由系统自动触发,然后分配给指定的运营人员处理
1.接受工单后在指定的售货机的商品进行补货,完毕后选择完成
2.拒绝工单该运营人员的工单结束
2.4消费者
消费者就是指在售货机上买货的人,它有两种方式可以买货:
-
通过扫描售货机二维码跳转到微信小程序,然后选择商品进行下单,支付成功后在售货机取货
-
用户在售货机上选择商品,然后售货机弹出商品的支付码,微信支付成功后在售货机取货
-
2.5合作商
合作商可以登录系统查看收益统计,核对账本信息
3.核心模块
本系统的核心在于营业只能售货机的业务,所以核心模块包括工单模块(售货机补货,维修,增删)、订单模块、出货模块。
主要参与角色有:平台管理员(创建)--运维、运营(处理)。
3.1工单模块
工单是一种专业名词,是指用于记录、处理、跟踪一项工作的完成情况
立可得工单分为两大类 :运营工单和运维工单
1.运营工单:运营人员来维护售货机货物,即补货工单
2.运维工单:运维人员来维护售货机设备,即投放工单、撤机工单、维修工单
工单的状态有四种:待处理、进行中(已接受)、已取消(作废单)、已完成
具体可以参考下图:
3.1.1手动创建工单
手动创建工单是由平台管理员创建工单的过程,时序图如下:
-
前端发送请求到工单微服务,请求创建工单
-
工单微服务调用售货机微服务,查询工单对应售货机的信息,并校验验售货机的状态与工单类型是否相符
-
如果是投放工单,状态必为未投放否则抛出异常
-
如果是补货工单,状态必为运营状态否则抛出异常
-
如果是撤机工单,状态必为运营状态则抛出异常
-
-
校验这台设备是否有未完成的同类型工单,如果存在则不能创建
-
调用用户微服务查询并校验执行工单的工作人员是否存在(根据工单类型和区域来选择工人)
-
保存工单信息
-
如果是补货工单,向工单明细表插入记录
3.1.2自动创建工单
对于维修工单和补货工单,其实我们是可以实现自动化创建的
-
自动维修工单:售货机
定时
扫描自己状态,一旦发现故障,系统就要自动创建维修工单 -
自动补货工单:系统
定时
扫描售货机库存,一旦发现低于警戒线,就要自动创建补货工单
3.1.3处理工单
工单处理需要运维或者运营人员通过app端操作,主要就是四种操作
-
接受工单:待处理--(接受)--已接受
-
拒绝工单:待处理--(拒绝)--已取消
-
取消工单:已接受--(取消)--已取消
-
完成工单:已接受--(完成)--已完成
-
工单处理操作主要是修改工单的状态,但是对于完成工单,还要额外修改售货机状态
-
投放工单:完成后将售货机状态更改为
运营
状态 -
撤机工单:完成后将售货机状态更改为
撤机
状态 -
维修工单:完成后不做处理
-
补货工单:完成后要更新售货机中货道的库存
-
这里需要工单微服务处理工单状态,售货机微服务处理售货机状态,也就是说一个业务需要2个微服务的参与
这时可以选择的方案:
-
使用基于Feign的同步方式,就是工单微服务完成后调用售货机微服务的接口,优点:可以即时获得返回结果 缺点:代码耦合,效率较低
-
使用基于MQ的异步方式,就是工单微服务完成后向MQ投递一个消息,售货机微服务订阅消息 优点:代码解耦,效率较高 缺点:无法即时获得返回结果
综合考虑,我们应该选择MQ来实现这个功能,在物联网项目中,使用最广的一款MQ是EMQ,它是一款基于EMQTT协议开发的消息中间件
3.2订单模块
3.2.1下单流程
商品下单指的就是根据用户选择的商品创建订单,并且从微信官网申请支付连接,生成支付二维码的过程
而售货机分为有屏幕和无屏幕两种,根据这个售货机种类的不同,对应的购买流程也也略有差别,下面我们分两种情况来分析一下
1.无屏幕售货机
无屏幕售货机,用户购买商品时的流程如下:
-
用户使用微信扫描售货机上的二维码
-
手机上会弹出相关的微信小程序
-
在小程序中完成商品选择,并完成支付
-
售货机通过在接受到支付成功后,会将商品出货
有屏幕版售货机,用户购买商品时的流程如下:
-
用户可以在售货机屏幕选择商品
-
屏幕显示支付二维码
-
用户使用手机扫描支付二维码完成付款
-
售货机通过在接受到支付成功后,会将商品出货
下面以有屏幕为例子说一下详细的流程
1.用户在售货机屏幕上选择商品(这需要先查询当前售货机中可以出售的商品进行展示)
2.选择购买商品后,售货机会调用后端小程序网关微服务
3.小程序网关微服务将请求转发到小程序微服务
4.小程序微服务远程调用订单服务创建订单
5.订单服务调用第三方支付平台扫码支付
6.第三方支付平台判断商户信息,如果合法创建支付数据返回支付链接地址
7.订单服务接受第三方支付平台返回的结果
8.小程序微服务将订单返回支付信息封装并继续放回到售货机终端
9.售货机通过支付地址生成支付二维码通过屏幕显示给用户
10.用户使用微信支付扫描售货机屏幕上的支付二维码进行支付
11.微信扫描支付二维码后和第三方支付系统进行交互完成支付
3.3.2支付结果通知
在用户对商品支付完后,不管是有屏幕版还是无屏幕版,都要获取支付结果,主要有两种方式:
-
被动等待:第三方支付平台会主动通知商家的应用服务,我们需要提供接口等待通知
-
主动查询:商家的应用服务也可以主动去第三方支付平台查询用户所支付的结果内容
-
3.2.3超时订单处理
当用户在创建订单后, 可能由于各种原因无法完成付款,此时系统需要将这类的订单在10分钟之后自动处理成无效订单
当创建订单完成的时候,向EMQ中投递一个延迟10分钟的消息,消费者10分钟后接到消息,检查当前订单状态,如果依旧是创建状态,就修改为无效
超时订单
-
定时任务:每隔10分钟运行一下定时任务 一旦发现有订单超过15分钟未支付,直接取消
-
延迟任务:redisson、rabbitmq延迟插件、EMQ延迟消息
3.3出货模块
3.3.1出货流程
用户通过售货机购买商品后,由第三方支付系统通知:修改订单状态,完成商品出货,业务如下:
用户支付成功之后:
-
订单微服务:1. 修改订单的状态 2. 通知售货机微服务扣库存和记流水
-
售货机微服务:1. 货道库存扣减 2. 记录出货的流水 3. 通知售货机出货
-
售货机终端:1. 出货 2. 反馈出货结果
拿到出货结果之后:
-
订单微服务:出货成功:修改订单状态为出货成功 | 出货失败:修改订单状态为出货失败,并使用第三方支付平台进行退款
-
设备微服务:出货成功:修改出货记录状态为true | 出货失败:并使用对货道库存恢复库存
3.3.2微服务调用关系
出货
拿到出货结果之后:
-
订单微服务:出货成功:修改订单状态为出货成功 | 出货失败:修改订单状态为出货失败,并使用第三方支付平台进行退款
-
设备微服务:出货成功:修改出货记录状态为true | 出货失败:并使用对货道恢复库存
4.面试题
常见的消息中间件及区别: