基础资料、商品与库存

模块职责

基础资料是所有单据的前置口径,决定“谁买、买什么、从哪里出、按什么价格、走什么权限”。库存模块负责把各种入库、出库、调拨、盘点、关闭和撤销动作落成库存流水,并维护实时库存。

主要入口

  • 基础资料控制器:application/controllers/basedata
  • 商品控制器:application/controllers/inner/Goods.phpapplication/controllers/inner/Materiel.php
  • 库存控制器:application/controllers/Storage.phpapplication/controllers/scm/InvOi.phpapplication/controllers/scm/InvTf.phpapplication/controllers/pda
  • App 商品和库存 API 映射:application/config/appapis.php
  • 商品同步老接口映射:application/config/apis.php

关键 Service

  • application/Services/Materiels/MaterielSer.php:物料格式化、新增/更新、分类、扩展数据、供货状态、VIN 同步通知。
  • application/Services/Materiels/MaterielCacheSer.php:物料缓存。
  • application/Services/Materiels/MaterielCacheQuerySer.php:普通物料缓存查询。
  • application/Services/Materiels/MaterielCacheQueryEsSer.php:ES 物料查询。
  • application/Services/Materiels/MaterielCacheStationSer.php:服务站维度物料缓存。
  • application/Services/BaseData/StockSer.php:仓库/货位库存查询。
  • application/Services/Storage/InventorySer.php:库存流水保存、删除、实时库存加减。
  • application/Services/KzInventory/KzInventorySer.php:库存中心相关能力。
  • application/Services/BaseData/PriceManagerSer.phpQuoteManagerSer.php:价格、报价、客户价格规则。

关键模型

  • 商品:application/models/bs/GoodsModel.phpGoodsExtModel.phpGoodsCategoryModel.phpGoodsBarCodeModel.php
  • 物料:application/models/materiels
  • 库存:application/models/bs/InventoryModel.phpInventorySubModel.phpInventoryRealTimeModel.php
  • 仓库货位:application/models/bs/StockModel.phpapplication/models/bs/StoreModel.php
  • 客户和供应商:application/models/bs/ContactModel.phpSupplierModel.php
  • 价格:ContactPriceModel.phpQuoteRuleModel.phpCostPriceModel.php

商品主流程

商品中心/后台录入
  -> MaterielSer::formatData / formatGoodsData 规整字段
  -> 校验分类、品牌、单位、供货状态、备货状态
  -> 写入 bs_goods / goods_ext / materiels 相关表
  -> 刷新缓存或 ES
  -> MqSer::sendGoodsUpdateToVin 通知 VIN/数据平台
  -> 被采购、销售、活动、移动商城查询

关键业务字段:

  • skuId:外部或商品中心 SKU 编码。
  • invId:站管家内部商品 ID,单据明细大量使用。
  • numbernamebrandcategory:商品展示和筛选字段。
  • status:供货状态,具体值看 application/KzData/Enums/MaterielEnums.php
  • stockType:备货状态。

库存主流程

库存不是只看一张表,系统同时维护流水和实时库存:

  • 库存流水:记录每次业务单据引起的库存变化,来源是 InventorySubModel
  • 实时库存:按服务站、商品、仓库、货位汇总当前数量,来源是 InventoryRealTimeModel
  • 库存查询:采购、销售、活动、移动商城大多最终会查实时库存或库存中心封装。

InventorySer::save() 的业务含义:

  • 接收业务单据组装好的库存明细。
  • 写入库存流水,包含 sidiidbillTypetransTypeinvIdskuIdlocationIdlocationAreaIdqty
  • 调用 changeInventoryQty() 增减实时库存。
  • 销售出库时还会触发商品销量或搜索数据更新。

InventorySer::delete() 的业务含义:

  • 根据单据 ID、单据类型、交易类型找到旧库存流水。
  • 按反向数量回滚实时库存。
  • 删除或标记旧流水。

常见库存交易类型

交易类型在 application/KzData/Enums/TransTypeEnums.php

  • 150501:采购入库。
  • 150502:销售退货入库。
  • 150601:普通销售出库。
  • 150602:销售订单退货。
  • 150706:其他入库。
  • 150806:其他出库。
  • 150701:盘盈。
  • 150801:盘亏。
  • 103091:调拨单。
  • 103092:服务站间调拨单。
  • 170500170501170502:货位调整。

业务边界

  • 采购入库增加库存,采购退货或未发货关闭不一定直接减库存,要看单据状态和是否已经入库/出库。
  • 销售出库减少库存,销售退货入库增加库存。
  • 盘点调整可能增加或减少库存。
  • 货位调整需要同时处理调出货位和调入货位,不能只看商品总库存。
  • 秒杀、活动、移动商城会额外检查活动库存、锁定库存、服务站仓库存或指定仓库存。

排查建议

  • 商品查不到:先查 skuIdinvId 是否对应,再看物料状态、分类、服务站缓存。
  • 列表有库存但下单库存不足:确认查询口径是服务站对应仓、指定仓、全局预留还是库存中心返回。
  • 库存异常:先看库存流水,再看实时库存;如果流水正确但实时库存错,重点查 InventorySer::changeInventoryQty() 调用链。
  • 报表库存和业务库存不一致:业务库实时库存与 Hologres/BI 表有同步延迟或口径差异,报表入口在 application/Services/Report