【1】立项背景与目标
自动化立体库是新能源锂电、汽车零部件等行业的主流仓储形态,库内由四向车、提升机、输送线、接驳口协同完成托盘出入库。上游 WMS/WES 只下发"某个托盘要入库或出库",而"分配到哪个货位、走哪条路、派哪台车、每一段由谁执行"全部由中间的调度系统(RMS)计算并驱动——本项目就是一个立库调度中间件 + 配套的调度监控管理后台。目标:把"任务下发→货位分配→路径规划→派车→分段执行→库存过账"做成可跑通、可观测、可人工干预的闭环,并解决现场最头疼的三个问题:调度计划与现场执行脱节、设备与货位状态不可见、故障(走不通、卡住)无日志可查。
【2】核心功能模块
①基础数据:仓库/货区/货位(层-x-y 坐标、深浅位)/设备/物料建模。
②权限体系:JWT + RBAC 用户-角色-菜单三级权限,菜单级与接口级双重校验。
③上游任务管理(内置 WES 模拟器):批量下发出入库任务,一键生成托盘号。
④任务调度与分段:任务状态机(待下发/执行中/已完成/异常/取消),入库按固定拓扑自动拆 3 段(库外输送线→提升机→目标层接驳口→货位),出库镜像反向。
⑤路径规划:库内 A* 网格寻路(巷道四向可走、货架区仅纵向、有货货位视为障碍),按"空闲且电量>40% + 曼哈顿距离最近"自动派车,支持小车避让、等待点与自动移库(倒库)。
⑥设备仿真引擎:无真实 PLC,用定时任务按可配置节拍推进每段任务并驱动设备沿路径移动。
⑦实时监控:WebSocket 每秒推送设备位置、状态与任务进度,地图大屏显示库位占用与小车轨迹,另配小车/设备监控页。
⑧库存与数据中心:托盘维度库存、分层占用统计、库存流水(任务完成自动过账)。
⑨接口日志中心:按上游/RCS/WCS 三个通道记录每次调用的请求与返回报文、方向、结果、耗时,支持按托盘号/任务号全链路检索与改报文重发。
⑩AI 作业助手:接入大模型,自然语言下发任务、异常诊断与智能问答,SSE 流式输出,模型不可用自动降级为本地规则。
⑪单车手动控制:顶升/放下/移动/充电/恢复/释放任务等指令,应急时人工接管。
【3】业务流程与功能路径
上游下发(托盘号 + 出入库类型)→ RMS 自动分配货位(浅位优先、低层优先)→ 生成分段计划 → A* 计算路径并派最近的空闲车 → 仿真引擎按节拍推进各段 → 全段完成后自动过账(货位占用/释放、绑定或解绑托盘、写库存流水与系统日志)→ 任务归档。
功能路径:登录 → 首页看板(货位占用 + 任务趋势)→ 上游任务管理下发任务 → 资源监控中心地图大屏观察执行 → 立库任务中心(任务视图/任务管理)→ 数据中心查库存与流水 → 报表数据中心查接口日志 → AI 助手用自然语言下单。
【1】整体架构与设计思路
前后端分离的单体应用。后端按"业务模块分包、模块内分层"组织(common、security、system、task、device、inventory、monitor、report、apilog、sim、ai,模块内再分 controller/service/mapper/entity/dto/vo),便于定位代码;跨模块用事件解耦,做到子包级无依赖环。
技术栈:后端 JDK 17 + Spring Boot 3 + MyBatis-Plus + MySQL 8 + Redis + JWT + WebSocket/SSE + 定时仿真 + A* 寻路;前端 Vue3 + Element Plus + ECharts。
核心思路:把"调度(做计划)"与"执行(干计划)"分离——任务下发只写计划、算路径、派车,仿真引擎只按节拍推进计划;将来接真实 PLC 时只需替换仿真引擎。货物"取走/送达"以动作完成时刻为准,而非用计划耗时去猜,保证计划与现场同源。
【2】我负责的模块与结果
需求分析、数据库设计、编码、联调全部独立完成:后端 162 个 Java 文件约 1.4 万行,前端 25 个 Vue 组件约 1.1 万行,共 17 张表、69 个接口、25 条路由,22 台设备、252 个货位仿真建模。
量化结果:单笔入库 3 段全流程约 25 秒跑通,入库/出库/移库均实测通过;A* 实时路径 18 步(曼哈顿最优解);14 条任务并发下发时积压 46→32 稳定消化,可 2~4 段并行、2~3 台车同时作业;WebSocket 每秒 1 帧、22 台设备全量快照;接口日志三通道实测 345 条。
【3】我遇到的难点与解决方案
①取货时刻错乱:货在小车没到时就"凭空消失"。根因是 A* 从"停在有货货位"的起点出发会返回 null,早期把 null 当空路径写库,引擎误读为"零距离",段开始 3 秒就判定货已上车。改为:算不出路径即视为该段不该开工,退回队列下轮重试;交接时刻绑定"到达耗时 + 顶升 3 秒"。
②两条任务段同时占用同一工位,货物被误清:给接驳口加"里面有没有货"的占用判断,提升机不锁(卸完即空,可接下一托)。曾按"设备被占用就排队"锁死提升机,14 条任务并发时整条入库线堵死。
③任务无声卡死:目标货位是深位、两侧浅位都有货,四向车进不去,A* 永远返回 null,任务长期挂在"执行中"且日志无报错。改为连续 30 轮算不出路径即判异常并写明原因(需倒库),让"走不通"可见。
④实时推送与前端细节:注解式 WebSocket 端点每个连接 new 一个实例,连接集合必须静态、广播需加锁;ECharts 在未显示的 Tab 里初始化会画成 0 宽,多通道共用组件时实例被复用,需监听路由刷新。