先看一张图:单据的一生
仓簿里没有“库存表”这个东西——库存是算出来的。你只需要录单据, 系统按「期初 + 入库 − 出库 + 调整」实时算出现存量。所以每一笔库存变化, 背后一定有一张可以点开的单据。
入库登记
收货时只做一件事:把「哪天、什么货、多少件、放在哪」记下来。 一条入库单只对应一个商品和一个数量——这是刻意的单行模型, 录入时不用先想“这张单有几行”,手机上也不会出现表格横向滚动。
能做什么
- 业务日期可回填:货是上周到的、今天才补录,日期填上周即可;但不能落进已关账的月份
- 手机扫码录单:商品条码、货位条码都能扫;不扫码就搜图号或品名,一个输入框两用
- 到货单拍照留存:照片挂在单据上,事后供应商说“我发了 500”,能当场翻出来
- 批量导入:期初或历史数据用 Excel 导入,导入前先预览,确认了才落库
| 字段 | 说明 |
|---|---|
| 业务日期 | 计入哪个期间,由它决定;早于商品期初生效日的历史流水不计入库存 |
| 数量 | 按件计,可为负(冲销单);0 不允许 |
| 货位 | 启用货位管理后必填;可一张单拆到多个货位 |
| 备注 | 随单据进入查询与导出,方便写“某某供应商补货” |
出库登记与售后件
出库比入库多三个决定:给谁(客户/业务线)、从哪出(货位)、 算什么性质(正常销售还是售后补发)。前两个影响库存, 第三个只影响销售口径——但恰恰是这一项,决定了月底对账会不会吵架。
三个容易踩的坑,系统里已经处理了
- 负库存只提示、不硬拦:现场“先发货、后补录”太常见,硬拦会逼人去改数据。 数量超过现存时弹确认,确认后照常出库,库存显示为负数并标红,看得见就不会忘
- 售后件单独标记:库存照扣(货真的走了),但销售口径不计入; 对账单上单独列「其中售后」,客户问起那 3 件的差,一眼能解释
- 客户归属可更正:录错客户不用冲销重开,改一次会留下更正次数与时间, 下个月对账时看得见“这笔是从另一条线挪过来的”
库存与货位
库存页把五个数并排放在一起:期初、入库、出库、调整、期末。 这五个数不是分别查出来的,而是同一个公式的不同项,所以永远自洽。
- 按商品看:默认视图,一屏能扫完几十个图号的进出
- 按货位展开:同一商品散在几个货位一目了然;合计必须等于现存量, 不等就是 bug,不是数据问题
- 只看负库存:一键筛出所有欠账,红色标出差异
- 导出 Excel:导出的列与界面一致,不另做一套口径
货位不是“仓库的第二层名字”
很多系统里的货位只是一个备注字段;仓簿把它做成了账:期初落位、 每张单据写货位明细、按货位汇总成一本独立的账。这样才能回答 “A-02-01 上还有多少”,而不是“大概在那个架子附近”。
| 能力 | 行为 |
|---|---|
| 扫码定位 | 先按条码精确匹配,匹配不到再按编码匹配,少一次“扫不出来” |
| 出库推荐 | 按批次先进先出推荐货位,一次点选即可 |
| 多货位拆单 | 一张单可以拆到多个货位,合计必须等于单据数量 |
| 开关 | 货位管理默认关闭;只有一个仓、几十个 SKU 时,开着反而是负担 |
单据查询与冲销
入库、出库、调整三类单据在一个页面里检索:按日期区间、按客户、按单号或商品, 还可以只看“售后件”。查到之后能看详情、看货位明细、看附件、导出。
为什么不能删单
仓簿在数据库层给单据表加了触发器:删除、以及修改数量/日期/商品,都会被直接拒绝。 这不是界面上的“按钮变灰”,而是绕过程序、直接改数据库也改不动。
- 录错了:开一张反向冲销单,原单标记「已冲销」并保留
- 为什么:月底回看时,你需要的是“当时发生了什么”,不是“现在看起来是什么”
- 能改的只有客户归属:因为它不改变账,只改变“这笔算给谁”,且必须留痕
报表与客户对账
报表分三层:月度报表看每个商品的进出与结存;客户对账回答“这个月卖给某客户多少”; 产值报表把它们换成钱。
月度报表
- 期初 / 入库 / 各客户出库 / 其中售后 / 调整 / 期末,一屏到底
- 每个客户一列,售后件再单独一列——不是把售后混在客户列里
- 可以切到任意历史月份;已关账月份读的是当时的快照,不受后来的数据影响
客户对账
对账单按「客户 × 商品 × 月份」列出:已发数量、其中售后、已确认数量。 发出去让客户核对,确认后系统记下核对人与时间;下个月再对,能看到上个月是怎么结的。
| 列 | 含义 |
|---|---|
| 已发数量 | 实物出库总量,含售后件 |
| 其中售后 | 补发瑕疵品的数量,不结算 |
| 销售数量 | 已发 − 售后,用于产值 |
| 已确认 | 客户核对后的数量与核对时间 |
产值与单价历史
产值 = 销售数量 × 未税单价。数量来自对账口径(不含售后), 单价来自一张单独的价目表——因为同一图号卖给不同客户,价格本来就不一样。
- 按「商品 × 客户 × 生效月」存价:某个月的单价 = 生效月不晚于该月的最后一条
- 调价不改历史:9 月调价只影响 9 月及以后,1–8 月的产值不会被回头改写
- 导入与导出:价目表可以先导出模板、批量填好,再预览、再落库
- 权限分开:能看产值(price.read)和能改价(price.write)是两个权限
出库计划与外贴标签
现场的顺序通常是「先有计划、再发货、最后打外贴」。仓簿把这三步拆开: 计划不动库存,只决定“这批要发什么、打什么标签”;发货时才生成出库单、扣库存。
- 计划行带批次、日期码、生产日期、每箱数量:这些只属于这一批货,不写进物料主数据
- 客户物料号可覆盖:外贴上印的是客户认的那个号,不是内部图号
- 打印留痕:谁在什么时候、打了哪张单、几张、第几次补打,都记录下来
- 权限单独授予:库管能打外贴,财务不能——打印权限不跟着“看库存”走
账号、权限与审计
新建账套时会自动带出四个内置角色,不用从零配权限:
| 角色 | 能做什么 | 刻意不给什么 |
|---|---|---|
| 库管 | 收货、发货、查库存、打外贴(只看本人单据) | 改价、关账、冲销 |
| 业务主管 | 录单、冲销、调整、计划、看审计、定价 | 管账号、改系统配置 |
| 财务主管 | 看库存与产值、导表、关账/反关账 | 录单、改价 |
| 系统管理员 | 全部业务权限 + 账号 + 系统配置 | —(租户内最高) |
- 权限落到按钮:没有权限的按钮不渲染,不是点了才报错
- 自助改联系方式要验证:本人改手机/邮箱必须过验证码;管理员代改不需要
- 口令策略:长度、复杂度、历史不得重复、有效期,都能在平台侧统一设
- 操作留痕:登录、录单、冲销、导出、关账、改配置,都写操作日志(含 IP 与时间)
多账套与授权
一套仓簿程序可以同时跑多个账套(租户)。登录时用「企业编码 + 账号 + 口令」三件套定位到人——
不同账套里可以都有叫 admin 的账号,互不相干。
- 数据完全隔离:单据、商品、客户、账号都按账套隔离,接口里不出现租户 ID,杜绝越权改 ID
- 授权按到期日:到期前按设定天数提醒;可设宽限期;是否“到期即禁止登录”由平台决定
- 平台与租户分离:平台超管管账套与授权,不参与任何一家的业务数据
两种交付:本地部署与云端开通
同一份代码、同一个数据库结构,跑在你机器上叫本地版,跑在我们的服务器上就是云端版。 差别不在功能,而在「谁负责那台机器」。
| 项 | 本地部署 | 云端开通 |
|---|---|---|
| 要装什么 | 一个 exe,约 20 MB | 什么都不用装 |
| 怎么访问 | 本机 127.0.0.1:8080,局域网用主机 IP | 浏览器打开 es.aily.uno |
| 数据在哪 | 程序目录下的 data/ | 我们境内的服务器,按账套隔离 |
| 备份 | 复制 data/ 目录即完成 | 我们定时备份,你也可导出 Excel |
| 升级 | 停服、换 exe、重启,两分钟 | 我们安排,你这边无需操作 |
| 外网访问 | 要公网 IP 或内网穿透,并自己处理证书 | 天然可访问,出差在酒店也能查 |
| 断网 | 局域网内照常录单 | 需要网络 |
| 适合 | 数据不出门、仓库网络不稳 | 没有常开电脑、多地办公、想当天上手 |
data/ 目录取走即可——
也就意味着不会被“只有云端才有某个功能”绑住。技术底座
技术选型的唯一标准是:客户机上不要有任何“要先装好”的东西。
| 层 | 选择 | 为什么 |
|---|---|---|
| 后端 | Go 单二进制 | 编译成一个 exe,无运行时依赖 |
| 数据库 | 纯 Go 实现的 SQLite | 不用 CGO,交叉编译干净;数据就是一个文件 |
| 前端 | 无构建的单页应用 | 改一行刷新就生效,内嵌进 exe,不怕版本不一致 |
| 部署 | 双击运行 + 浏览器 | 没有安装向导,也没有“配置数据库连接”这一步 |
| 适配 | 手机 / 电脑双外壳,中英双语,深浅主题 | 仓库现场用手机,办公室用电脑,是同一套账 |