MIT 开源 · 轻量 WMS · 通信代维场景

库存永远等于
流水汇总

MonaWMS 是面向通信代维与中小仓库场景的轻量仓储管理系统:物资主数据 → 入库 → 出库 → 库存 → 盘点对账 → 报表导出 → 操作日志审计,全链路闭环。让每一件通信物资账实一致、全程可溯。

25+
后端接口控制器
32
张数据表 · 全链路建模
18
份幂等数据库迁移
2角色
录审分离 · 二维授权
Why MonaWMS

小仓库,也有大账要算清

通信代维物资种类多、分布散、周转快,Excel 台账和重型的 ERP 都靠不住。MonaWMS 用工程级的数据纪律,解决小仓库最常见的四个问题。

01没有 MonaWMS 之前

手工台账,月底对不上

Excel 记进出、记混型号,月底盘库存全凭感觉,账实两张皮。

出入库与库存脱节

单据记了、库存没扣,或直接改库存数字,越改越乱、无从查证。

盘点靠人海战术

年底大盘点大海捞针,差异说不清来龙去脉,只能拍脑袋调账。

责任无从追溯

谁在什么时候改了什么库存,查无实据,出问题互相推诿。

02有了 MonaWMS 之后

库存 = 流水汇总

库存由流水驱动、在同一事务内更新,永远等于所有出入库流水之和,账实恒一致。

全链路业务闭环

主数据 → 入库 → 出库 → 盘点 → 对账 → 报表 → 审计一站到底,不再需要多个系统拼凑。

盘点自动化

盲盘录入 → 双签 → 差异审核 → 自动生成盘盈 / 盘亏调整单,差异有据可依。

全量操作审计

每一次写操作留痕(操作人 / 动作 / 对象 / 前后差异 / IP),日志只读不可删,责任到人。

Core Capabilities

六项核心能力,撑起仓库的确定性

每一处设计都以「数据可信、责任可追、随时可查」为底线,不靠人盯,靠机制。

库存永不失真

库存由 inventory_transactions 流水驱动,inventory 只是流水汇总的物化快照,二者在同一事务内更新。任何库存变动必须走流水 + 行锁,禁止「先查后改」。

# 数据纪律

一物一码 SN 追溯

序列号全生命周期台账:在用 / 返修中 / 待报废 / 已报废,状态流转写入历史,出库 SN 联动扣减,每台设备去向清晰可查。

# 全程可溯

盘点对账闭环

盘点单 → 盲盘录入 → 双签确认 → 差异审核 → 自动生成盘盈 / 盘亏调整单;对账中心三规则核验(流水 vs 库存、SN 台账、批次台账),差异批量绑定。

# 差异自动处理

录审分离 + 二维授权

录入员只录单到 confirmed、不能过账;有效权限 = 全局角色 ∩ 仓库授权,未授权仓库不可见不可操作(403),仓库级经理也无法放大系统级权限。

# 权限模型

全量操作审计

所有写操作落 operation_log:操作人 / 动作 / 目标 / before-after JSON diff / IP,日志只读不可删,任何人也无法抹改,审计取证一步到位。

# 责任到人

报表开箱即用

xlsx(PhpSpreadsheet)+ CSV 流式导出,上万行数据走队列分批写出;金额一律按数量 × 流水固化单价计算,统计口径永远一致。

# 口径统一
How It Works

库存为什么永远算得清

MonaWMS 的核心机制:库存不是被「手动改」出来的,而是从每一笔业务流水「算」出来的。

入库 / 出库 / 调整 / 盘点业务单据
inventory_transactions一笔笔流水
inventory物化快照(同事务更新)
账实一致可对账 · 可追溯 · 可审计
库存金额 = Σ(流水数量 × 固化单价)=永远可复算

所有库存变动必须走 Db::transaction + 行锁,禁止直接 UPDATE 库存表;同一事务内流水与快照同步落库,掉电、并发都不会产生「账实分离」。

Modules

20+ 功能模块,覆盖仓库全业务

从物资主数据到审计日志,每一环都可独立使用,也天然串成一条完整的业务链。

库存与单据

  • 入库管理采购 / 调拨 / 归还 / 盘盈
  • 出库管理领用 / 领用人 / SN 联动
  • 库存查询仓库 / SKU / 批次 / 库位
  • 库存流水全量可追溯
  • 盘点盲盘 → 双签 → 差异审核
  • 对账中心三规则核验 + CSV 导出
  • 报废申请流程联动待报废状态

主数据与库内结构

  • 物资主数据SKU / 型号 / 计量方式
  • 分类管理一 / 二级树形
  • 供应商 · 客户往来单位台账
  • BOM 管理头明细 / 复制 / 展开
  • 数据字典12 类后台可维护
  • 四级库位仓库 / 库区 / 货架 / 库位

追溯与合规

  • 序列号 SN一物一码 · 状态流转
  • 操作日志写操作审计 · 只读
  • 授权矩阵账号 × 仓库二维授权
  • 用户管理角色分配 admin / operator
  • 项目台账项目物资预留
  • 无线备件无线侧专项台账

看板与移动端

  • Dashboard 看板库存金额 / 出入库趋势
  • 告警概览低库存 / 待办提醒
  • 报表导出xlsx + CSV 流式
  • 移动端uni-app H5 随时录单
  • 个人中心JWT 续签 / 资料
  • 设备管理台账收敛至 SN 体系

全部模块支持软删除归档与 Excel 批量导入,历史单据可翻查、可红冲。

Tech Stack

工程级技术底座,轻量但不将就

严格分层的架构与数据铁律,让「小而美」的系统同样经得起审计与并发。

后端

ThinkPHP 6.1think-orm 2.xfirebase/php-jwtPhpSpreadsheetPHP ≥ 7.2.5
严格分层:Controller 只收参数返响应,Service 承载业务规则与事务,Model 只做数据访问。
统一响应:{ code, message, data, trace_id },业务错误走业务码。

前端

React 18TypeScriptVite 4Ant Design 5Zustandreact-query 5rechartszod
移动端:uni-app(H5 发行产物)。
看板:库存金额、出入库趋势、告警概览实时图表。

数据与部署

MySQL 5.7InnoDButf8mb4Docker Composenginx + php-fpm
数值精度:DECIMAL(18,4) + bcmath 运算,禁止 float 累加。
迁移纪律:18 份幂等迁移 + 14 份种子数据,脚本可重复执行。
Deploy

三种方式,最快十分钟上线

从一台云服务器到 Windows 笔记本,都能跑起来。

方式 01

Docker Compose 一键部署

面向生产环境:MySQL 容器首次启动自动导入建库快照与演示数据,无需手动初始化。

git clone <仓库> MonaWMS_TX echo "MYSQL_ROOT_PASSWORD=..." > .env docker compose up -d # 访问 http://<IP>:9110/
方式 02

阿里云 ECS 生产部署

源码 volume 挂载,git pull 即时生效无需重建镜像;安全组只开放 9110 / 9111,数据库端口不暴露。

cd frontend && npm ci && npm run build # nginx 反代前端 + API # 改代码 / git pull 即生效
方式 03

本地开发一键启动

Windows 双击 start_all.bat:自动拉起 MySQL → 后端 8000 → 前端 Vite,开箱即改。

start_all.bat # 或手动: composer install php think run --port 8000 npm run dev
Live Demo

三十秒,亲眼看看「账实一致」

无需安装,直接用浏览器体验完整业务流程:录单、过账、盘点、对账、查审计。

http://8.152.97.191:9110/login
打开在线演示

演示环境为共享实例,请勿录入真实业务数据;管理员登录后可在「用户管理」修改密码。点击账号卡片可复制。

FAQ

常见问题

围绕部署、登录与数据安全的高频疑问。

库存必须由流水驱动:任何变动都写入 inventory_transactions,并在同一事务内更新库存快照(带行锁),禁止先查后改。这样库存永远等于流水汇总,账实分离在机制上不可能发生,也天然支持审计追溯。

access token 有效期 2 小时,前端会自动用 refresh token 续签,过期则强制登出。按顺序排查:后端 .env 的 JWT.KEY 是否被改动 → 数据库是否重新导入(密钥变化会使旧 token 失效)→ 浏览器清缓存后重新登录。

完整快照里的用户密码均为 password(bcrypt 加密)。若仍失败,确认 users.status = 'active' 且 deleted_at IS NULL,再检查是否覆盖了已存在的同名库。

MonaWMS 面向通信代维与中小仓库场景轻量设计:Docker 一键部署、双角色权限即可运转,没有重型系统的实施成本;同时保留工程级数据纪律(流水驱动、行锁事务、全量审计、幂等迁移),小团队也能获得「大厂级」的账实可信度。

有效权限 = 全局角色(admin / operator)∩ 仓库授权(user_warehouse_grant)。未授权仓库一律不可见、不可操作(403 WAREHOUSE_NOT_GRANTED);仓库级 manager 权限只能在本仓库内等同管理员,不能放大系统级权限。