无人自助拼豆系统从需求分析到落地部署全流程实战开发指南
随着线下手工体验业态的发展,无人自助拼豆模式逐渐成为手工店降低运营成本、提升用户体验的核心方案。该系统属于典型的物联网软硬件一体化系统,逻辑与成熟的无人共享柜、无人售卖系统高度同源,可以复用行业成熟技术栈实现快速落地。本文将从需求设计、技术选型、核心开发、部署运维四个维度,完整梳理无人自助拼豆系统的全流程开发方案。
一、需求分析与功能架构设计
无人自助拼豆系统的核心目标是实现24小时无值守运营,用户自助完成拼单、选豆、取货全流程,管理员无需到店即可完成库存、设备、订单的全链路管理,整体架构分为用户端、管理后台、物联网设备层三个核心部分:
核心功能梳理
-
**用户端功能**:支持小程序、H5多端访问,核心功能包括扫码进入对应门店设备页、查看拼豆颜色分类与剩余库存、发起公开/好友拼单、选择所需拼豆重量、拼单完成后获取取货码、一键导航到店、取货核销、历史订单查询等,匹配线下用户即到即用的使用习惯。
-
**管理后台功能**:支持多门店管理、拼豆库存上下架与阈值告警、订单数据统计、设备在线状态监控、用户权限分配、异常订单处理等,满足连锁门店的规模化运营需求。
-
**物联网设备层功能**:每个拼豆储料格口对应独立电控锁与高精度称重传感器,支持接收后端解锁指令、实时上报取货重量、格口异常状态告警等,实现硬件与业务数据的实时同步。
架构设计原则
整体采用前后端分离、软硬件解耦的分层架构,业务层与硬件通信层独立开发,后续更换硬件型号或者扩展新的业务场景时无需重构核心代码,复用率可达70%以上。
二、技术栈选型
本系统复用无人共享类业态成熟的技术栈,生态完善、开发效率高、运维成本低,具体选型如下:
-
**后端服务**:采用`Spring Boot + MyBatis Plus + MySQL`的组合,Spring Boot 无需复杂XML配置,开箱即用的特性可以大幅缩短开发周期;MyBatis Plus 封装了常规CRUD操作,避免大量重复代码编写;MySQL 作为关系型数据库存储用户信息、订单数据、库存数据、设备信息等结构化数据,同时搭配Redis做缓存,存储取货码、拼单临时数据、用户会话信息,提升接口响应速度。
-
**用户端**:采用`UniApp`开发,基于Vue语法编写一套代码即可同时编译为小程序、H5、APP等多端产物,无需多端重复开发,适配不同用户的访问习惯,符合线下场景轻量访问的需求。
-
**管理后台**:采用`Vue + Element UI`开发,Element UI提供了丰富的表单、表格、图表组件,可快速搭建后台管理页面,降低前端开发成本。
-
**物联网通信层**:采用MQTT协议实现后端与设备的双向通信,搭配EMQX作为MQTT Broker,支持高并发设备接入,消息延迟低于100ms,满足硬件实时控制的需求。
三、核心模块开发实战
1. 拼单逻辑模块
拼单是无人自助拼豆系统的核心业务逻辑,核心流程为:用户发起拼单→选择拼豆种类与重量→拼单有效期内凑单完成→生成取货凭证,核心代码示例如下:
```java
@Service
public class SpellOrderServiceImpl implements SpellOrderService {
@Autowired
private DeviceService deviceService;
@Autowired
private BeanStockService beanStockService;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public R createSpellOrder(SpellOrderDTO dto) {
// 校验当前门店设备状态是否正常
Device device = deviceService.getById(dto.getDeviceId());
if (device.getStatus() != DeviceStatusEnum.NORMAL.getCode()) {
return R.fail("当前门店设备暂不可用,请稍后再试");
}
// 校验所选拼豆库存是否满足用户需求
List<BeanStock> stocks = beanStockService.listByBeanIds(dto.getBeanIdList());
for (BeanStock stock : stocks) {
Integer requireWeight = dto.getRequireWeightMap().get(stock.getBeanId());
if (stock.getAvailableWeight() < requireWeight) {
return R.fail(stock.getBeanName() + "库存不足,请调整选择");
}
}
// 初始化拼单,默认有效期30分钟,超时自动关闭
SpellOrder order = new SpellOrder();
BeanUtil.copyProperties(dto, order);
order.setStatus(SpellOrderStatusEnum.WAIT_FULL.getCode());
order.setExpireTime(LocalDateTime.now().plusMinutes(30));
save(order);
// 拼单信息写入Redis,方便拼单成员快速查询
redisTemplate.opsForValue().set(
RedisKeyConstant.SPELL_ORDER_PREFIX + order.getId(),
JSON.toJSONString(order),
30,
TimeUnit.MINUTES
);
return R.ok(order.getId());
}
}
```
2. 物联网设备联动模块
拼单完成后触发设备联动,后端通过MQTT协议向对应设备下发解锁指令,用户取货完成后设备上传称重数据,后端自动完成库存扣减。其中MQTT Topic设计如下:
-
设备上行Topic:`/device/{deviceId}/report`,用于设备上报称重数据、状态告警信息
-
设备下行Topic:`/device/{deviceId}/command`,用于后端下发解锁、校准等指令
指令采用JSON格式封装,解锁指令示例:`{"command":"unlock","orderId":"123456","slotIdList":3,7,9}`,对应解锁3、7、9号拼豆储料格口。
3. 库存自动同步模块
设备上报取货重量后,后端自动校验重量数据合法性,若重量误差在允许范围内则扣减对应拼豆的可用库存,当库存低于预设阈值时,自动向管理员发送库存告警通知,无需人工盘点。
四、落地部署与运维优化
部署流程
-
**基础环境准备**:服务器选用CentOS 7.9操作系统,依次安装JDK 1.8、MySQL 8.0、Redis 6.x、EMQX 4.4、Nginx 1.20,配置MySQL表结构、Redis过期策略、EMQX认证规则,避免未授权设备接入。
-
**后端部署**:将Spring Boot项目打包为jar包,通过systemd进行进程托管,配置开机自启动,同时配置日志滚动策略,避免日志文件占用过多磁盘空间。
-
**前端部署**:UniApp用户端根据业务需求编译为H5和小程序版本,H5版本打包后上传至Nginx静态资源目录,小程序版本提交平台审核后发布;Vue管理后台编译为dist包后同样部署至Nginx,配置反向代理转发后端接口请求,解决跨域问题。
-
**设备调试**:逐台绑定设备与门店ID,测试MQTT通信链路是否正常,验证解锁、称重上报、库存扣减全链路流程是否符合预期,无异常后即可上线运营。
运维优化方案
-
**日志采集**:采用ELK栈收集前后端接口日志、设备上报日志,统一存储与检索,异常问题排查效率可提升80%以上。
-
**监控告警**:采用Prometheus + Grafana搭建监控体系,实时监控服务器CPU、内存、磁盘使用率,以及接口响应耗时、设备在线率、库存告警等核心指标,异常情况及时通知运维人员处理。
-
**数据备份**:配置MySQL每日定时全量备份,备份文件同步至对象存储服务,避免数据丢失。
本方案基于成熟的无人共享系统技术栈开发,稳定性经过大量线上场景验证,开发周期短、落地成本低,适配单店与连锁门店的不同需求,后续可根据业务扩展AI拼豆图案推荐、用户作品社区等功能,进一步提升用户体验。