众信系统部署
一、安装docker
二、必要的中间件安装
三、部署众信系统
四、常见问题
一、端口无法访问
二、CentOS7上设置或更改时区
三、移动端语音播报问题
centos7 查看、修改系统时间、时区
四、阿里OSS无法发布apk文件解决方案
查看容器时间
PVE下的CentOS虚拟机磁盘扩容
mysql统一字符集
Docker中清理none镜像操作步骤
创建MySQL容器密码错误,怎么修改密码
五、开通阿里OSS
五、数据异常问题临时处理方法
1、仓库库位和库位库存不一致的情况
从仓库商品维度查询库存有差异的商品
-
+
首页
1、仓库库位和库位库存不一致的情况
**WMS 库位库存(wms_sku_location_stock)** 和 **进销存库存(stk_sku_stock)** 出现了不一致,说明中间某些环节(入库、出库、移位、盘点、锁库等)有异常,或者数据同步逻辑出错。 ## 处理思路可以分两步: ## 一、先确认问题来源 1. **业务流向** * WMS 是按库位维度管理的(location_code 粒度),是真实仓储数据。 * stk_sku_stock 是进销存层面的汇总表,按 SKU + 仓库 + 批次 粒度,通常应该 = WMS 各库位库存的合计。 * 如果二者对不上,说明 **同步逻辑** 或 **异常单据** 出问题。 2. **定位差异** * 先跑一个差异对比 SQL,看看哪些 SKU / 仓库 / 批次对不上: ```sql SELECT a.sku_id, a.store_id, a.batch_code, SUM(a.stock) AS wms_stock, b.stock AS stk_stock, (SUM(a.stock) - b.stock) AS diff FROM wms_sku_location_stock a LEFT JOIN stk_sku_stock b ON a.sku_id = b.sku_id AND a.store_id = b.store_id AND a.batch_code = b.batch_code GROUP BY a.sku_id, a.store_id, a.batch_code, b.stock HAVING diff <> 0; ``` * 这能直观看到哪些 SKU 存在差异。 3. **确认差异来源** * 检查是否有 **未同步** 的出入库单。 * 检查是否有 **逻辑遗漏** :比如 WMS 中有库位调整单,但没传到进销存。 * 检查是否有 **事务失败 / 回滚不一致** (比如一个系统写成功,另一个失败)。 * 检查是否有 **批号维度差异** (WMS 可能按批号管理更细,而进销存被合并了)。 ## 二、解决方式 1. **临时修复(数据对齐)** * 用对比 SQL 生成差异清单。 * 决定谁为准: * 一般情况下 **以 WMS 为准** ,因为它是真实库位库存。 * 然后执行修正: ```sql UPDATE stk_sku_stock b JOIN ( SELECT sku_id, store_id, batch_code, SUM(stock) AS real_stock FROM wms_sku_location_stock GROUP BY sku_id, store_id, batch_code ) a ON a.sku_id = b.sku_id AND a.store_id = b.store_id AND a.batch_code = b.batch_code SET b.stock = a.real_stock; ``` 2. **长期方案(防止再次不一致)** * **建立校验机制** :每天定时对比 WMS 和 stk_sku_stock,发现差异就报警。 * **保证事务一致性** :单据过账时,WMS & 进销存要么都成功,要么都回滚。 * **引入对账/调账单** :如果发现差异,走一个“库存调整单”来修正,而不是直接改数据。 * **日志追踪** :记录每次库存变化的流水,方便追溯。 总结: * 短期:先跑对账 SQL,定位并修复差异。 * 长期:在流程中加 **同步校验** + **差异调账机制** ,避免 WMS 和进销存再脱节。 # 完整的解决方案 ## 1. 建立差异记录表(只需要建一次) 先准备一张表,把发现的不一致记录存下来,方便追溯: ```sql CREATE TABLE IF NOT EXISTS stock_diff_log ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', sku_id BIGINT NOT NULL COMMENT 'SKU ID', spu_id BIGINT DEFAULT NULL COMMENT 'SPU ID', store_id BIGINT NOT NULL COMMENT '仓库ID', batch_code VARCHAR(50) NOT NULL COMMENT '批号', wms_stock DECIMAL(22,6) DEFAULT 0 COMMENT 'WMS库存', stk_stock DECIMAL(22,6) DEFAULT 0 COMMENT '进销存库存', diff DECIMAL(22,6) DEFAULT 0 COMMENT '差异数量', record_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='WMS与进销存库存差异日志'; ``` ## 2. 执行差异对比并记录 先查出差异,插入日志表: ```sql INSERT INTO stock_diff_log (sku_id, spu_id, store_id, batch_code, wms_stock, stk_stock, diff) SELECT a.sku_id, a.spu_id, a.store_id, a.batch_code, SUM(a.stock) AS wms_stock, IFNULL(b.stock, 0) AS stk_stock, SUM(a.stock) - IFNULL(b.stock, 0) AS diff FROM wms_sku_location_stock a LEFT JOIN stk_sku_stock b ON a.sku_id = b.sku_id AND a.store_id = b.store_id AND a.batch_code = b.batch_code GROUP BY a.sku_id, a.spu_id, a.store_id, a.batch_code, b.stock HAVING diff <> 0; ``` ## 3. 修复进销存库存(以 WMS 为准) 把 WMS 的汇总库存同步更新到进销存表: ``` UPDATE stk_sku_stock b JOIN ( SELECT sku_id, store_id, batch_code, SUM(stock) AS real_stock FROM wms_sku_location_stock GROUP BY sku_id, store_id, batch_code ) a ON a.sku_id = b.sku_id AND a.store_id = b.store_id AND a.batch_code = b.batch_code SET b.stock = a.real_stock; ``` ## 4. 处理 WMS 有,但进销存没有的记录 有些 SKU/批次在 WMS 有库存,但进销存表里没有,需要插入: ``` INSERT INTO stk_sku_stock (sku_id, spu_id, store_id, stock, batch_code, create_time, version) SELECT a.sku_id, a.spu_id, a.store_id, SUM(a.stock) AS stock, a.batch_code, NOW(), 0 FROM wms_sku_location_stock a LEFT JOIN stk_sku_stock b ON a.sku_id = b.sku_id AND a.store_id = b.store_id AND a.batch_code = b.batch_code WHERE b.id IS NULL GROUP BY a.sku_id, a.spu_id, a.store_id, a.batch_code; ``` ## 5. 后续建议 * 可以把 **步骤 2~4** 做成一个定时任务(每天凌晨跑),自动校对并修复。 * 如果要更严谨,可以不要直接 `UPDATE`,而是生成一张 **库存调整单** ,再过账,这样能保证财务有痕迹。
KimiFeng
2025年9月11日 14:24
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期