laravel 可以按仓库和时间范围筛选出入库流水,再按 sku 求带符号的数量之和。正数表示入库,负数表示出库,结果是期间净变动。
统一流水表的数量和时间约定
示例假定 stock_movements 含 warehouse_id、sku、quantity_delta 和 occurred_at,时间以 UTC 存储。查询前由已有授权层确认当前账号可以查看该仓库。
INSERT INTO stock_movements (warehouse_id, sku, quantity_delta, occurred_at)
VALUES (1, 'A01', 12, '2026-10-01 08:00:00'),
(1, 'A01', -3, '2026-10-01 09:00:00'),
(1, 'B01', -2, '2026-10-01 09:00:00');
在隔离测试库准备数据。起始时间计入,结束时间不计入,相邻日期就不会重复计算边界记录。
按 SKU 汇总带符号的数量
在控制器完成授权后,把已验证的仓库 ID 和 UTC 时间边界传给查询。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
$changes = \Illuminate\Support\Facades\DB::table('stock_movements')
->where('warehouse_id', $warehouseId)
->where('occurred_at', '>=', $fromUtc)
->where('occurred_at', '<', $toUtc)
->select('sku')
->selectRaw('SUM(quantity_delta) AS net_change')
->groupBy('sku')
->orderBy('sku')
->get();
return response()->json($changes);
SUM 的数值在部分数据库驱动中会以字符串返回,接口可以约定保留这种表示,或在数值范围明确时显式转换。
对照入库、出库和边界结果
仓库 1 查询 10 月 1 日 UTC 的流水时,预期得到以下净变动。
A01 9 B01 -2
再添加一条发生在次日零点的流水,确认它只出现在下一天的查询。要计算某个时点的库存,还需要期初库存或完整历史。

















