无人自助拼豆系统开发实战 从需求拆解到落地部署全流程实操指南
随着线下手工DIY业态的快速发展,拼豆作为低门槛、高趣味性的手工项目受到年轻人欢迎,传统拼豆门店依赖人工值守、高峰时段核销效率低、拼单凑单流程繁琐的痛点愈发突出。基于无人共享设备的技术积累,我们设计并落地了一套无人自助拼豆系统,用户可通过扫码完成拼团、取料、计时消费全流程,商家可通过管理后台实现全链路数字化管控,本文将从需求到部署完整拆解系统开发全流程。
一、需求拆解与架构设计
核心需求梳理
参考同类无人共享系统的成熟功能,我们将系统需求拆分为三个端口:
2.商家管理端:支持物料库存管理、订单统计、设备状态监控、门店数据看板、拼团规则配置等功能;
3.物联网端:实现智能物料柜锁控、操作台计时传感器对接、设备心跳上报、指令双向通信等能力,做到软硬件一体化管控。
整体架构与技术选型
采用分层架构设计,从下到上分为设备层、数据层、服务层、应用层四个层级,技术选型参考成熟的无人共享类系统方案:
- 后端服务:采用Spring Boot + MyBatis Plus搭建,轻量易扩展,适合快速迭代业务逻辑;
- 数据存储:核心业务数据存储用MySQL,高频访问数据(如拼团状态、设备在线状态)用Redis做缓存,物联网消息采用EMQX作为MQTT Broker;
- 前端应用:用户端基于UniApp(Vue语法)开发,一次编译适配多端;管理后台采用Vue + Element UI搭建,适配PC端商家操作需求;
- 物联网通信:采用MQTT 3.1.1协议实现设备与服务端的双向通信,支持弱网环境下的消息可靠传输。
二、核心功能模块技术实现
1. 拼团逻辑实现
拼团是无人自助拼豆系统的核心业务逻辑,支持2-3人凑团享受组合物料包权益,核心流程如下:
用户发起拼团后,系统生成拼团主订单写入数据库,同时在Redis中设置24小时过期时间,过期未成团自动触发失效回调;其他用户通过分享链接进入拼团页面,校验拼团状态后可参与拼团,拼团人数达到设定阈值后自动标记为已成团,批量生成所有参团用户的订单,并同步开通对应门店的物料柜开锁权限、操作台使用权限。
核心业务代码示例:
@ServicepublicclassGroupBuyServiceImplimplementsGroupBuyService{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;@AutowiredprivateOrderServiceorderService;@AutowiredprivateGroupBuyMappergroupBuyMapper;// 参团接口@OverridepublicResultjoinGroup(LonggroupId,LonguserId){// 校验拼团是否存在GroupBuygroupBuy=groupBuyMapper.selectById(groupId);if(Objects.isNull(groupBuy)){returnResult.fail("拼团不存在");}// 校验拼团状态if(groupBuy.getStatus()!=GroupStatusEnum.WAIT.getCode()){returnResult.fail("拼团已结束或已失效");}// 校验是否已满员if(groupBuy.getJoinNum()>=groupBuy.getTotalNum()){returnResult.fail("拼团已满员");}// 加分布式锁避免并发超卖RLocklock=redissonClient.getLock("group:lock:"+groupId);try{lock.lock(3,TimeUnit.SECONDS);// 二次校验拼团人数groupBuy=groupBuyMapper.selectById(groupId);if(groupBuy.getJoinNum()>=groupBuy.getTotalNum()){returnResult.fail("拼团已满员");}// 更新拼团人数groupBuy.setJoinNum(groupBuy.getJoinNum()+1);groupBuyMapper.updateById(groupBuy);// 判断是否成团if(groupBuy.getJoinNum().equals(groupBuy.getTotalNum())){groupBuy.setStatus(GroupStatusEnum.SUCCESS.getCode());groupBuyMapper.updateById(groupBuy);// 删除过期缓存redisTemplate.delete("group:expire:"+groupId);// 批量生成用户订单orderService.batchGenerateOrder(groupId);}}finally{lock.unlock();}returnResult.success();}}2. 物联网设备管控实现
参考无人共享球杆柜的软硬件一体化设计,我们采用MQTT协议实现设备与服务端的双向通信,核心规则如下:
- 主题设计:设备上报消息主题为
/device/{sn}/report,服务端下发指令主题为/device/{sn}/command,按设备SN做隔离避免消息串扰; - 设备注册:设备上电后主动上报SN、门店ID、设备类型等信息,服务端校验绑定关系后返回注册结果,设备每30秒上报一次心跳,超过3分钟未收到心跳标记为离线;
3. 多端适配实现
用户端采用UniApp开发,针对不同端的能力差异做统一封装:比如扫码能力,小程序端调用.scanCodeAPI,H5端调用自定义扫码组件,APP端调用原生扫码API,上层业务只需调用统一的scanCode工具方法即可,无需关心端差异;管理后台采用Vue + Element UI开发,针对高频操作场景做了快捷入口优化,支持批量导出订单数据、设备状态批量导出等功能。
三、系统部署与性能优化
部署流程
系统采用前后端分离架构部署,具体步骤如下:
- 环境准备:安装JDK1.8、MySQL8.0、Redis6.x、EMQX4.x、Node14.x;
- 后端部署:拉取代码后配置数据库、Redis、MQTT连接信息,执行
mvn package打成jar包,通过nohup java -jar xxx.jar &启动服务; - 前端部署:用户端执行
npm run build:{端类型}编译对应端的代码,小程序直接上传代码包,H5/APP打包后部署到静态服务器;管理后台执行npm run build编译后,将dist目录文件放到Nginx静态资源目录; - 设备联调:逐个绑定设备SN与门店,测试开锁、计时、上报等功能是否正常,验证全流程链路通畅。
性能优化方案
针对高并发场景做了三点优化:
- 热点数据缓存:拼团状态、设备在线状态、门店列表等高频访问数据全部存入Redis,缓存过期时间设置为5分钟,减少DB查询压力;
- 数据分表:订单表按月份做分表处理,超过6个月的历史数据归档到冷数据表,提升订单查询效率;
- 静态资源加速:前端静态资源全部上传到CDN,Nginx开启gzip压缩,页面加载速度提升60%以上。
四、常见问题与踩坑经验
- 弱网环境下指令丢失问题:初期测试时发现部分门店网络不稳定,开锁指令下发后设备无响应,我们优化了指令重试机制,服务端下发指令后3秒未收到响应则重试,多重试3次,重试失败后给用户推送重试提醒,问题解决率达到99.9%;
- 拼团并发超卖问题:上线初期曾出现过拼团人数超过设定阈值的问题,后续通过引入Redisson分布式锁,参团时锁定拼团ID做二次校验,彻底解决了并发超卖问题;
- 跨端样式兼容问题:UniApp开发时曾出现小程序、H5端样式不一致的问题,后续统一采用rpx作为尺寸单位,配置postcss插件做单位自动转换,同时针对不同端的特殊样式做条件编译,实现了多端样式的一致性。
整套系统从需求拆解到上线落地共耗时4周,上线后覆盖12家线下拼豆门店,设备在线率稳定在99.5%以上,用户自助操作流程平均耗时1分钟以内,大幅降低了门店的人工成本,提升了高峰时段的运营效率,相关技术方案也可复用至其他无人共享类系统的开发中。