DaoSales 培训手册

库管

面向仓库管理员:出入库、盘点、批次追溯

今天要做什么

按节拍守账实:每天过昨夜流水与红色预警,每周循环盘点 + 过期批次,每月全仓盘点配合财务月结。

每日(开班 ~15 分钟)

  1. 打开库存总览,扫低于「补货点」的红标行,确认是否需要补货。
  2. 翻库存流水:核对昨夜 / 早班的「入库」「出库」「调拨」「调整」四类记录,看每条引用的上游单据类型是否对得上。
  3. 处理红色补货预警:点「生成采购单」转一张草稿采购单给采购。
  4. 推进在途调拨:昨日发起、今日应到仓的「在途」调拨单点「完成入库」。
  5. 扫销售预留池:状态为「可用」的预留对应订单该备货了就按 FIFO 分配批次。
日常入口:/dashboard/inventory/stock/dashboard/inventory/movements/dashboard/inventory/reorder-alerts/dashboard/inventory/transfers/dashboard/inventory/reservations

每周

  • 循环盘点:对高周转 / 贵重 SKU 新建「草稿」盘点单,录入实盘数后提交,系统自动生成差异调整流水。
  • 过期预警:看 30 天内到期批次清单,批量走异常出库(「赠品」 / 「内部领用」 / 「过期报废」)。
  • 序列号抽盘:核对在库序列号与实物一致,状态为「在库」才可出。

每月

  • 全仓盘点:每仓一张盘点单,提交后在估值报表核对账面价值变动。
  • 配合财务月结:冻结期内不再做库存调整,差异留到下月走反向流水。
  • 账实差异报告:按仓 / 按品类出汇总,交财务。
warehouse/nav-overview.jpg

权限红线(先看这 5 条)

  • 不能跨账套调拨——源仓与目的仓必须同属一个账套,否则系统拦截。
  • 盘点中的仓位锁定——同一仓不能同时存在两张「草稿」盘点单;状态为「已提交」的盘点不能改项,只能新建反向盘点。
  • 库存为正的批次 / 已售的序列号不能删——批次可用数量 > 0 或序列号状态为「已售」时直接删会被拒,必须走异常出库。
  • 月结冻结期内禁手工调整——冻结期间做库存调整会破坏上月账面,差异留到下月反向入账。
  • 销售 / 采购 / 会计的写入权限不给——销售订单、采购订单、发票等单据库管只读;库存流水只能通过上游单据触发,不能直接写库存流水表。

Quickstart — 日常核心任务

2.1 采购到货入库核对

采购在收货模块确认到货后,系统自动生成一条「入库」流水;库管负责核对数量、批次与 QC 状态是否与实物一致。

  1. 打开库存流水页,按类型筛选「入库」。(见图 ①)
  2. 逐行核对:产品、数量、仓库是否与采购单 / 送货单一致。
  3. 若仓库开启了「QC 冻结」,批次会自动进入「隔离中」——等 QC 放行前不可出库。
  4. 批次物料点进批次列表,确认新批次的效期、单位成本、批号都已录入。(见图 ②)
  5. 若数量对不上:先跟采购核实是否补发,再按差异走异常单(「损坏」 / 「质检不合格」),不手工调整。
warehouse/movements-list.jpg
warehouse/batches-list.jpg
何时不该做:对批次物料,在上游收货单未确认前不要先建批次——会出现批次和收货流水对不上的孤儿记录;对 QC 仓的货,未放行前别用「库存调整」绕过,「隔离中」状态存在就是让你等 QC 结论。
观测信号:
  1. 流水页顶部出现新的「入库」行,引用对应收货单号。
  2. 库存总览对应 SKU 的「账面库存」列数字增加。
  3. 若 QC 开启,批次列表新批次状态显示「隔离中」徽标。
技术追溯:stock_movements.movement_type='receipt'stock_movements.reference_type='goods_receipt'stock.quantity 等额增加;若 qc_hold_enabled=truestock_batches.status='hold'
系统动作:getStockMovementsgetBatchescreateBatchActionupdateBatchAction

2.2 手工库存调整(单条盘盈 / 盘亏)

巡检发现账实不符、差异小(单条、数量 < 10)、不想开正式盘点单时用此入口。正式盘点见 2.4。

  1. 库存总览定位到目标 SKU + 仓库行,右侧点「调整」图标打开弹窗。(见图 ①)
  2. 选「增加」或「减少」;填数量(小数点后 3 位);填调整原因(必填,审计要查)。(见图 ②)
  3. 点「提交」——系统写一条「调整」流水,账面库存同步更新。
  4. 差异 > 10 件或涉及多 SKU:关闭弹窗,改走 2.4 正式盘点。
warehouse/stock-list.jpg
warehouse/stock-adjust-dialog.jpg
何时不该做:月结冻结期禁止调整——冻结期做库存调整会串上月账面,差异必须等解冻后走反向流水。差异数量大、涉及多 SKU 别走手工调整——无留痕的批量调整被审计会要求每条都找原因,走正式盘点才有盘点单号做审计轨迹。
观测信号:
  1. 库存总览该行「账面库存」列数字更新。
  2. 流水页最顶部出现一条「调整」记录(绿色为入、红色为出),原因字段有值。
  3. 估值报表的账面价值按移动平均 / FIFO 重新计算。
技术追溯:stock_movements.movement_type='adjustment'quantity 可正可负;stock.quantity 同步更新;触发 revalidatePath('/dashboard/inventory/valuation')
系统动作:adjustStockadjustStockById

2.3 多仓调拨(两步式在途)

总仓 → 展厅、跨城分仓补货。两步式:发起时源仓立即扣,货到目的仓再点「完成入库」;中间状态为「在途」。

  1. 调拨列表右上点「新建调拨」。(见图 ①)
  2. 弹窗选源仓 + 目的仓;两仓必须同一账套。(见图 ②)
  3. 加行:每行选产品 + 数量(可选单位成本用于账面估值)。
  4. 点「发起调拨」——源仓立即扣减,生成一条「出库」流水,状态变「在途」。
  5. 货到目的仓后,回列表找该单点「完成入库」——再写一条「入库」流水,状态推到「已完成」。
  6. 若途中货丢 / 单据作废,点「取消」回滚到源仓(仅「在途」可撤)。
warehouse/transfers-list.jpg
warehouse/transfer-initiate-dialog.jpg
何时不该做:同仓内移库别用此功能——两步式会多生成成对流水,污染账面;同仓移位走「库存调整」或库位管理(如启用)。跨账套调拨会被系统拦截——源仓与目的仓不在同一账套直接报错。已「已完成」的调拨不能撤——货已入目的仓,必须反向发一张新调拨。
观测信号:
  1. 调拨列表顶部出现新行,状态徽标从「在途」推进到「已完成」。
  2. 流水页按引用类型「调拨单」可查到成对的出 / 入流水。
  3. 库存总览源仓对应 SKU 账面减少、目的仓等额增加(完成后)。
技术追溯:stock_transfers.status ∈ {in_transit,completed,cancelled}stock_transfer_items.out_movement_id / in_movement_id 成对;stock_movements.movement_type='transfer'
系统动作:initiateTransferActioncompleteTransferActioncancelTransferAction

2.4 循环 / 全仓盘点

每周对高周转 SKU 抽盘、每月对每仓全盘。流程:建「草稿」盘点单 → 录入实盘数 → 提交,系统把差异写入「调整」流水。

  1. 盘点列表右上点「新建盘点」。(见图 ①)
  2. 弹窗选仓库、盘点日、用途(如「月末全盘」)、备注。(见图 ②)
  3. 提交后进盘点详情,按产品加行——系统自动带出账面数。(见图 ③)
  4. 逐行录入实盘数;差异数自动算出。
  5. 全部录完点「提交」——状态变「已提交」,每条差异行生成一条「调整」流水。
  6. 录错想重来:仅「草稿」可「取消」或「删除」;「已提交」后只能新建反向盘点。
warehouse/reconciliations-list.jpg
warehouse/reconciliation-create-dialog.jpg
warehouse/reconciliation-detail.jpg
何时不该做:同仓已有「草稿」盘点时别再建——后端会拦截并提示「已有草稿」,先处理旧草稿再说。盘点未交完别点「提交」——提交后不可改行,漏盘的 SKU 只能新建反向盘点补差。
观测信号:
  1. 盘点列表顶部出现新行,状态从「草稿」推到「已提交」。
  2. 每条差异行在流水页生成一条「调整」记录,引用该盘点单号。
  3. 估值报表的账面价值同步重算。
技术追溯:stock_reconciliations.status ∈ {draft,submitted,cancelled}stock_reconciliation_items.differenceQty / differenceValuestock_movements.movement_type='adjustment'
系统动作:createReconciliationActionaddReconciliationItemActionremoveReconciliationItemActionsubmitReconciliationActioncancelReconciliationActiondeleteReconciliationAction

2.5 批次建档与过期清理

有效期敏感品类(板材、胶水、化工辅料)入库必须落批次,并定期扫 30 天内到期清单做异常出库。

  1. 批次列表右上点「新建批次」。(见图 ①)
  2. 弹窗选产品 + 仓库,填数量、生产日期、效期;批号留空则系统自动生成 BATCH-YYYYMM-NNNN
  3. 若有 QC 单关联,在批次详情关联对应的质检单。
  4. 扫到期:切「即将过期」视图,看 30 天内到期批次。
  5. 过期批次按用途分流:样品 → 走「样品出库」异常单、内部领用 → 走「内部领用」、作废 → 走「过期报废」;提交异常单走审批。
warehouse/batch-create-dialog.jpg
何时不该做:批次可用数量 > 0 时不能删——系统直接拒绝。删前先把库存走异常出库清零,再删;不然审计会找不到这批货去向。效期字段别漏填——漏填后过期预警扫不出来,实物过期客户退货才发现已晚。
观测信号:
  1. 批次列表顶部出现新批次,批号 BATCH-YYYYMM- 前缀。
  2. 「即将过期」视图把 30 天内到期项高亮。
  3. 批次状态徽标按「可用 → 隔离中 → 已放行 → 已耗尽」推进。
技术追溯:stock_batches.batch_numberavailable_quantitystatus ∈ {active,hold,released,depleted}stock_batches.expiry_date
系统动作:createBatchActionupdateBatchActionupdateBatchFromFormActiondeleteBatchActiongetExpiringBatchesAction

2.6 序列号批量录入 / 更新

贵重单件(家具成品、电子组件)需单件追溯——入库建序列号、出库标「已发货」、售后按序列号查保修期。

  1. 序列号列表右上点「批量导入」。(见图 ①)
  2. 弹窗选产品 + 仓库;粘贴多行序列号(每行一个或逗号分隔)。
  3. 点提交——系统批量建为「在库」状态。
  4. 改仓位或保修期:单行点编辑;售出时由销售发货流程自动标「已发货」。
warehouse/serial-numbers-list.jpg
何时不该做:序列号处于「已售」 / 「已发货」状态不能直接删——售后还要查保修,删了丢追溯。要作废已售单品走「客户退货」异常单回收,不硬删。
观测信号:
  1. 序列号列表总数增加 N 条,状态全为「在库」。
  2. 按产品筛选后每条序列号的仓库、保修期、关联批次字段都有值。
  3. 销售发货后状态自动从「在库」→「已预留」→「已发货」。
技术追溯:serial_numbers.serial_noserial_numbers.status ∈ {in_stock,reserved,sold,shipped,returned}serial_numbers.warranty_until
系统动作:createSerialNumberActioncreateBulkSerialNumbersActionupdateSerialNumberActiondeleteSerialNumberAction

2.7 补货预警 → 生成采购单

早班看红色预警(账面库存 ≤ 补货点),按建议供应商一键生成草稿采购单交给采购。

  1. 补货预警页按「高优先级」过滤,看红色清单。(见图 ①)
  2. 勾选要补的多条预警——同供应商的可一次合单。
  3. 点「生成采购单」。(见图 ②)
  4. 弹窗里系统按产品→供应商映射推荐供应商,必要时改选。
  5. 确认后生成一张来源标记「补货预警」的草稿采购单,交给采购继续下单流程。
  6. 需求不急:保留预警不转单;AI 辅助决策点「预测」看下周 / 下月缺货趋势。
warehouse/reorder-alerts-list.jpg
warehouse/reorder-create-po-dialog.jpg
何时不该做:同一 SKU 已有未结采购单时别重复生成——采购方会拒单,白占库管时间;先去采购列表确认已有单的到货日再决定。低优先级预警可延后——按红 → 黄 → 绿排,每天最多处理 3-5 条红,不一股脑生成拉长付款周期。
观测信号:
  1. 采购模块出现新草稿采购单,来源标记「补货预警」。
  2. 被勾选的预警条目从清单消失(或标「已转单」)。
  3. 采购收到企微 / 邮件推送「新补货采购单」。
技术追溯:purchase_orders.source='reorder_alert'stock.quantity ≤ stock.reorder_point(客户端过滤,PostgREST 不支持列比较)。
系统动作:fetchReorderAlertsfetchSuppliersForAlertscreatePurchaseOrderActiongetForecastActiongetAIForecastActiongetReorderRecommendationsActiongetInventoryHealthAction

2.8 库存异常单(损坏 / 赠品 / 报废 / 客退)

客诉退货、展厅样品、生产报废、搬运损坏、盘盈 —— 凡走审批的非正常出入库都开异常单,留完整审计链。

  1. 异常单列表右上点「新建异常」。(见图 ①)
  2. 弹窗选异常类型(损坏 / 客户退货 / 内部领用 等);系统按类型自动推断方向(盘盈 / 客户退货 → 入库,其余默认出库)。
  3. 选仓库、填备注,提交后进详情页加明细行:产品、数量、批次(可选)。
  4. 点「提交」→ 审批人「批准」或「驳回」→ 批准后点「完成」真实扣减 / 入库。
  5. 草稿态发现填错:直接「删除」;已提交用「撤销」;已完成不可撤。
warehouse/exceptions-list.jpg
warehouse/exception-create-dialog.jpg
何时不该做:未审批通过别点「完成」——完成就真实扣库存,绕过审批会让财务的报废 / 赠品成本无法归集。已「已完成」不可改——要纠正只能反向再开一张(用「盘盈」类型做回补)。
观测信号:
  1. 异常单列表顶部出现新行,状态徽标按「草稿 → 已提交 → 已批准 → 已完成」推进。
  2. 完成后流水页生成一条「调整」(或对应方向的流水),引用异常单号。
  3. 库存总览对应 SKU 账面按入库 / 出库方向加 / 减。
技术追溯:stock_exceptions.status ∈ {draft,submitted,approved,rejected,completed,cancelled}exception_type ∈ {damage,theft,found,sample,return_to_supplier,customer_return,production_scrap,quality_reject,gift,internal_use,expired,other}direction ∈ {in,out}
系统动作:createExceptionActionaddExceptionItemActionremoveExceptionItemActionsubmitExceptionActionapproveExceptionActionrejectExceptionActioncompleteExceptionActioncancelExceptionActiondeleteExceptionAction

上下游交接契约

库管是账实一致的最后关口。每笔上游动作要核、每笔下游动作要对——字段缺失的后果都落在库管台账上。

采购 → 库管:收货入库核对

我做什么:采购在收货模块确认到货后,我在库存流水页按「入库」筛选,核对数量、批次、QC 状态;有批次物料的确认批次已建档;若仓库开启 QC,等批次从「隔离中」放行再算可售。

下游看到什么:库存总览 SKU 账面增加;有 QC 仓的批次显示「隔离中」;未建批次的有效期物料会进「风险清单」。

缺失会回来找我:数量对不上 → 采购找我核对要补发还是做差异。批次字段漏填 → 财务月末估值分不清批次成本。QC 未放行直接分配给销售 → 出货后品控回退。

技术字段(给 IT/采购交叉核对)

上游触发:采购模块 confirmReceipt*purchasing/goods-receipts)→ 系统自动 adjust_stock_atomic(receipt)

库管动作:createBatchAction(批次建档)、updateBatchAction(效期 / 成本 / 关联 inspection_id)。必传字段:productId, warehouseId, quantity, manufactureDate?, expiryDate?, unitCost?, batchNumber?

销售 / 跟单 → 库管:订单预留 + 备货

我做什么:销售订单确认后看预留清单,对状态为「可用」的预留按 FIFO 分配批次;订单取消时释放预留;预留过期定时清理。

下游看到什么:跟单 / 销售在订单详情看到「已预留」数量;发货单生成时可发余量已扣完预留;物流接到发货单备货。

缺失会回来找我:没分配批次 → 跟单不知按哪批发,效期混乱。订单取消未释放预留 → 预留数量占着账面库存,别的订单看不到可售。过期预留不清 → 账面可用量永远偏少。

技术字段(给 IT/跟单交叉核对)

触发动作:createReservationActionfulfillReservationActionreleaseReservationActionreleaseExpiredAction

必传字段:salesOrderId, salesOrderItemId, productId, warehouseId, quantity, batchId?, expiresAt?stock.reserved_qty 反向对应。

库管 → 采购:补货预警转采购单

我做什么:扫红色预警清单,勾选同供应商的可合单项,生成一张来源标记「补货预警」的草稿采购单,系统按产品→供应商映射自动带出推荐供应商。

下游看到什么:采购在采购列表看到新草稿采购单,来源标记「补货预警」;采购继续审批 + 下单流程。

缺失会回来找我:同 SKU 已有未结采购单我还转 → 采购拒单,浪费双方时间。勾错供应商 → 采购需改供应商再审批,周期拉长。需求量算错(没看周转) → 采购订多了占库存,订少了又缺货。

技术字段(给 IT/采购交叉核对)

触发动作:createPurchaseOrderAction

必传字段:supplierId, alertIds[], expectedDeliveryDate?, notes?;生成的 purchase_orders.source='reorder_alert'

库管 → 生产 / 物流:领料与发货

我做什么:生产按工单 BOM 领料走「内部领用」异常单(或生产模块直接扣料);销售发货时系统按预留自动扣减,序列号物料标「已发货」。

下游看到什么:生产拿到原料、成品仓的对应批次扣减;物流看到发货单有可发清单、序列号与批号可追溯。

缺失会回来找我:没按 FIFO 走批次 → 效期近的留仓过期,效期远的先出。序列号漏标 → 客户收货后售后查不到保修记录。异常单未完成就当已扣 → 下一单实际库存不够发。

技术字段(给 IT/生产交叉核对)

触发动作:createExceptionActionexception_type='internal_use')→ submitExceptionActionapproveExceptionActioncompleteExceptionAction。发货侧:销售建发货单时系统自动按预留扣减(由 fulfillReservationAction 关联完成)。

必传字段:warehouseId, exception_type, direction='out', items[].productId, items[].quantity, items[].batchId?

库管 → 财务:月末估值与账实差异

我做什么:月末全仓盘点一次,提交后在估值报表核对账面价值变动(按「移动平均」或「先进先出」);按仓 / 按品类出差异报告交财务。

下游看到什么:财务拿到月末库存估值做资产负债表;差异报告反推成本归集是否正确;估值法切换影响下月成本结转。

缺失会回来找我:盘点未做 → 月末资产负债表的存货科目无依据。估值法中途切换没通知财务 → 上下月成本对不上。差异未报告 → 财务月结时被迫延期。

技术字段(给 IT/财务交叉核对)

触发动作:submitReconciliationAction(盘点)、getValuationReport / getWarehouseValuation / getCategoryValuationupdateValuationMethodAction(估值法切换)。

必传字段:reconciliationId, method ∈ {moving_average, fifo}

异常回滚

误操作不要直接改 DB。按下表选对应入口按业务规则回滚——库存流水留审计轨迹比「干净账面」重要。

症状 做什么 前置条件 / 后果
调拨发起后发现填错 / 货丢 调拨详情点「取消」 仅「在途」可撤;源仓数量回滚;「已完成」后必须反向发一张新调拨
盘点单录错(草稿态) 盘点详情点「取消」或「删除」 仅「草稿」可撤 / 删;「已提交」后只能新建反向盘点
盘点已提交但数字错 新建反向盘点,按差异把账调回 保留原审计轨迹;两张单的差异行合并看
异常单录错 「草稿」点「删除」;「已提交」/「已批准」点「撤销」 按状态机流转规则;「已完成」不可撤,需反向发新单(用「盘盈」类型做回补)
预留错挂(订单已取消但未释放) 预留列表行内点「释放」 仅「可用」可释放;「已履约」不可退;过期批量走「释放过期」
库存调整录错数量 / 方向 反向再做一次「调整库存」(数量取反) 不支持「撤销」——保留审计轨迹,两条流水都留底
批次 / 序列号错建 批次:先把库存清零再删;序列号:单条点「删除」 批次可用数量 > 0 或序列号已售 / 已发货时系统直接拒;走异常单转走后再删
仓库停用误操作 仓库详情改「启用」状态恢复 删仓库会校验是否有库存或未释放预留,默认仓不可删
对应系统动作(IT 追溯)
  • cancelTransferAction — 撤销 in_transit 调拨,源仓数量回滚
  • cancelReconciliationAction / deleteReconciliationAction — 仅 draft 可用
  • cancelExceptionAction / deleteExceptionAction — 按状态机(draft 删、submitted / approved 撤)
  • releaseReservationAction — 释放单条 active 预留;releaseExpiredAction 批量清过期
  • adjustStock / adjustStockById — 反向调整(数量取反)回滚错录,不支持撤销
  • deleteBatchActionavailable_quantity=0 才可删
  • deleteSerialNumberActionin_stock 状态可删;sold / shippedcustomer_return 异常单
  • updateWarehouse / deleteWarehouse — 校验库存 / 预留 / 默认仓后允许操作

进阶功能

估值报表(Moving Average / FIFO 切换)

月末全盘后在估值报表核对账面价值。可按仓 / 按品类汇总,配合财务月结取数;估值法切换影响下月成本结转,必须与财务同步。

入口:/dashboard/inventory/valuation。系统动作:getValuationReportgetWarehouseValuationgetCategoryValuationupdateValuationMethodActiongetCurrentValuationMethodgetLowValueProductsgetHighValueProducts

warehouse/valuation-report.jpg
AI 补货预测与健康度

按销售历史 + 预计交期推测下周 / 下月缺货风险;适合季节性商品或新品铺货。输出给采购做下单决策,省去手工拉报表。

入口:补货预警页「AI 预测」区。系统动作:getForecastActiongetAIForecastActiongetReorderRecommendationsActiongetInventoryHealthAction

仓库 CRUD 与默认仓设置

新建 / 停用仓库、切换默认仓(影响新建流水、预留、发货默认值)。仅管理员或库管主管执行,新仓上线前必须确认库位 / QC 配置。

入口:/dashboard/inventory/warehouses。系统动作:createWarehouseupdateWarehouseupdateWarehouseFromFormdeleteWarehousesetDefaultWarehouseAction

warehouse/warehouses-list.jpg
预留池高级操作

销售订单预留管理:手工创建预留(场景:VIP 客户先占货)、定时清理过期预留、批次级预留(指定 batchId)。

入口:/dashboard/inventory/reservations。系统动作:createReservationActionfulfillReservationActionreleaseReservationActionreleaseExpiredActionfetchReservationStats

序列号生命周期追溯

单件追溯链:「在库 → 已预留 → 已售 → 已发货 → 已退回」(底层 enum:in_stock → reserved → sold → shipped → returned)。售后按序列号查保修期、历史仓库、关联批次。

入口:/dashboard/inventory/serial-numbers。系统动作:updateSerialNumberAction(改仓、状态、保修)。

流水筛选与追溯

流水页按流水类型(「入库」「出库」「调整」「调拨」「入库反冲」)+ 引用单据类型过滤,定位到上游单据。用于对账和审计。

入口:/dashboard/inventory/movements

相关业务场景

库管参与 6 大场景中的 5 条——是销售 / 采购 / 生产 / 财务的账实接口;「报销审批流」作为申请人。

  1. 标准成单流(询盘 → 报价 → 订单 → 发货 → 开票): 库管在订单确认后管预留;销售创建发货单时按预留扣减;序列号 / 批次按 FIFO 分配。 → 场景详解
  2. 定制家具项目流: 库管管原料入库(板材 / 五金的批次建档),生产领料走 internal_use;成品入库再做序列号建档。 → 场景详解
  3. 回款流:库管不参与——由销售 / 出纳处理。库管只关心销售侧的预留与发货扣减是否按时完成。 → 场景(了解即可)
  4. 采购付款流(收货入库侧): 库管验收 + 触发「入库」流水,异常走「损坏」 / 「质检不合格」类型异常单;收货数量与采购单对不上要通知采购。 → 场景详解
  5. 月结流: 库管牵头全仓盘点 + 估值报表,把账实差异报告交财务;冻结期内禁手工调整,差异留下月反向。 → 场景详解
  6. 报销审批流:库管作为申请人走 /dashboard/expenses(搬运费 / 仓库杂支报销),非库管核心动作——不在 Quickstart 范围。 → 场景(作为申请人)

外部协作入口

权限与范围

看得到什么(RLS 边界)

  • 当前 organization_id 下的所有 stock / stock_movements / stock_batches / stock_transfers / stock_reconciliations / stock_exceptions / stock_reservations / serial_numbers / warehouses
  • 当前 book_id 下的库存数据——多账套下账本隔离,切账套后数据变;调拨不允许跨账套。
  • 补货预警(reorder_alerts)按仓 + SKU 维度,客户端过滤 stock.quantity ≤ stock.reorder_point(PostgREST 不支持列比较)。
  • 采购 PO / 销售订单 / 发票 只读——写入权限分别由采购 / 销售角色持有。

核心概念

  • book_id — 账套隔离键。所有库存相关表都带 book_id,切账套后数据完全隔离;调拨源 / 目的仓必须同账套。
  • organization_id — 租户隔离键。多租户场景下跨组织数据通过 RLS 隔离。
  • 库存原子 RPC:adjust_stock_atomictransfer_stock_atomic —— 所有 mutation 必经这两个 RPC,保证并发下数据一致。
  • 库存状态机:stock_movements.movement_type ∈ {receipt, shipment, adjustment, transfer, receipt_reversal};流水只增不改、不删。
  • 估值法:组织级配置 moving_average(移动平均)/ fifo(先进先出),影响月末成本结转,切换必须与财务同步。

术语表

账面库存 book_qty
stock.quantity(系统记录的数量)
可用库存 available_qty
stock.quantity - stock.reserved_qty(前端计算列)
预留库存 reserved_qty
stock.reserved_qty(销售订单 / 调拨锁定)
在途 in_transit
stock_transfers.status='in_transit'(源仓已扣、目的仓未加)
补货点 reorder_point
stock.reorder_point(触发红色预警阈值)
库存流水
stock_movements.movement_typereceipt | shipment | adjustment | transfer | receipt_reversal
调拨单号
stock_transfers.transfer_reference
盘点单号
stock_reconciliations.reconciliation_no;状态 draft | submitted | cancelled
异常单 enum
damage | theft | found | sample | return_to_supplier | customer_return | production_scrap | quality_reject | gift | internal_use | expired | other
异常状态机
draft → submitted → approved / rejected → completed(或 cancelled
批次 batch
stock_batches.batch_numberBATCH-YYYYMM-NNNN);状态 active | hold | released | depleted
序列号 serial_no
serial_numbers.serial_no;状态 in_stock → reserved → sold / shipped → returned
库位 warehouse
warehouses.id(当前仅支持仓库级,无库位细分字段)
估值法 valuation_method
moving_average | fifo(组织级配置)
QC 冻结 qc_hold_enabled
warehouses.qc_hold_enabled;开启后批次入库默认 status='hold'
预留状态
stock_reservations.status ∈ {active, fulfilled, released}
账套隔离键
book_id(所有库存表)
原子 RPC
adjust_stock_atomictransfer_stock_atomic(所有库存 mutation 必经)

常见问题

库存调整和盘点单什么区别?什么时候用哪个?

库存调整单条、快,适合差异小(< 10 件、一个 SKU)的微调;盘点单带审计链(reconciliation 号 + 差异明细),适合差异大 / 多 SKU / 月末。审计只认盘点单——大差异走手工调整会被回退。

盘点单提交后发现某行数字录错了怎么办?

不能改。只能新建一张反向盘点,把该 SKU 的差异调回。两张单都留档,审计可以看到整段修正轨迹。别走手工调整——绕过盘点单的修正没有关联号,月结对账对不上。

调拨发起后货还没发就发现选错目的仓了,怎么撤?

在调拨详情点「取消」,状态会变「已取消」,源仓数量立即回滚。注意:仅「在途」可撤;若已点「完成入库」变「已完成」,必须反向发一张新调拨(原目的仓 → 原源仓),两张单的审计轨迹都留底。

QC 仓批次一直是 hold,怎么放行?

放行由 QC 角色操作——他们在 QC 结论页批准后批次状态自动变「可用」。库管不手工切状态(会破坏质检轨迹)。若 QC 拒绝,批次走「质检不合格」异常单出库。

客户退货流程是什么?

销售开贷项单并勾选「退回库存」+ 选目的仓;库管在异常单列表看到「客户退货」类型单据,复核明细后点「完成」入库。方向自动识别为「入库」,做反向入库。

补货预警的数量建议是怎么算的?

基础算法:历史 30/60/90 天平均销量 × 供应商交期天数 + 安全库存。AI 预测在此基础上叠加季节性 / 趋势。实际下单前自己判断供应商 MOQ 和近期促销计划,不盲信推荐量。

批次库存为 0 但系统不让删?

删前先确认批次可用数量为 0(列表数量列)。若还是被拒,可能是预留占用未释放——去预留池释放对应批次,再删批次。

为什么预留释放后账面可用量还是没变?

先确认释放是否成功(预留详情状态变「已释放」)。若还未变,可能是客户端缓存——刷新列表或切仓库再切回。库存的预留数量和预留表双向同步,释放后实时减。

估值法切换有什么影响?需要通知谁?

切换「移动平均」↔「先进先出」后,下月成本结转按新方法算——上下月账面价值可能出现不连续。切换前必须与财务、总经理沟通;切换时机建议财务年度开始或系统初始化,不要年中乱切。