流程:报价单 → 订单 → ERP → 仓库 → 库存 → 统计。
订单明细按中文名称匹配 ERP 商品。未匹配的行会跳过,单据保持草稿状态由经理修改。
库存 = 该商品该仓库所有 moves 之和。没有其他来源 —— ERP、仓库、经理工作台都读取同一个视图 v_stock。
| 操作 | 位置 | 写入 | 库存 |
|---|---|---|---|
| 入库(到货) | 仓库、ERP | moves.kind=in | + |
| 销售 / 发货 | ERP,单据过账 | moves.kind=out | − |
| 损耗出库 | 仓库 | kind=writeoff | − |
| 仓库调拨 | 仓库 | kind=move, wh_id → wh_to | 0 |
| 盘点 | ERP,单据过账 | kind=adjust | ± |
仓库不允许负库存:出库前校验当前数量。销售只在过账时减库存,草稿不减。
| 事项 | 做法 |
|---|---|
| 独立账号 | ERP → 用户:登录名、密码、角色 admin / manager / staff、停用。admin 只有一个,管理档案与人员。 |
| 各自的单据 | 每张草稿记录创建人(sales.user);经理只看自己的,管理员看全部。 |
| 并发写入 | SQLite WAL 模式、busy_timeout 10 秒:读不阻塞写,写排队等待,不会出现 database is locked。 |
| 单据编号 | XSCK-YYYYMMDD-00001;编号冲突时自动重试(最多6次),不会撞号。 |
| 防止重复过账 | 过账是带 approved=0 条件的 BEGIN IMMEDIATE 事务。第二个经理得到「已过账」,流水不会重复。 |
| 操作记录 | 每个操作带登录名写入 audit:谁过账、谁出库、谁建了账号。 |
实践:4 名经理录单与做草稿,过账集中在一个点(管理员)。无需锁和等待即可避免重复出库与库存偏差。
| 系统 | 地址 | 数据 |
|---|---|---|
| 管理中心 | hub.redbutton.beer | 只读两个数据库,不做修改 |
| ERP | erp2.redbutton.beer | bb_erp.db |
| 仓库 | stock.redbutton.beer | bb_erp.db · moves |
| 经理工作台 | manager.redbutton.beer | bb_erp.db · 草稿 |
| 报价单 | bbprice.redbutton.beer | bb_reg.db · orders |