where('is_combination', "=", 0) ->pluck("inventory", "sku_id")->toArray(); //计算组合商品 foreach ($skusWithCombinationGoods as $sku) { if (!empty($sku['is_combination'])) { foreach ($sku['combination_goods'] as $combinationGoods) { if (empty($inventoryKeyBySkuIdMap[$combinationGoods["item_id"]])) { //没有盘点到的sku需要在原先的sku库存 $inventoryKeyBySkuIdMap[$combinationGoods["item_id"]] = GoodsSku::query() ->where('id', $combinationGoods["item_id"])->pluck('stock')->first()??0; } $inventoryKeyBySkuIdMap[$combinationGoods["item_id"]] += $combinationGoods['item_num'] * $sku['inventory']; } } } $today = DateTimeUtils::getToday(); $dateTime = date('Y-m-d H:i:s'); $updateIds = []; Log::info("库存盘点前完整信息", $skusWithCombinationGoods); Log::info("需要操作的库存数据", $inventoryKeyBySkuIdMap); foreach ($inventoryKeyBySkuIdMap as $skuId => $totalInventory) { // 更新 $record = DailyStockRecord::query()->firstOrCreate([ 'sku_id' => $skuId, 'day' => $today, ]); $record->inventory = $totalInventory; $record->inventory_time = $dateTime; $record->save(); //查询sku当前未发货的数量 目前数据看着有问题暂不操作 //库存修改 盘点是直接覆盖 GoodsSku::query()->where('id', $skuId)->update([ 'stock' => $totalInventory ]); $updateIds[] = $skuId; } // 批量更新 event(new BatchStockUpdateEvent($updateIds)); } public static function computeSkuStock(array $goodsSkuItem, array $v): array { $updateIds = []; Log::info("库存更新前完整商品信息", $goodsSkuItem); Log::info("库存更新前完整请求信息", $v); $updateParams = []; if (empty($goodsSkuItem['is_combination'])) { $updateParam = [ 'stock' => $goodsSkuItem['stock'] + $v['num'], 'sale_stock' => $goodsSkuItem['sale_stock'] + $v['num'], 'cost' => number_format(($goodsSkuItem['stock'] * $goodsSkuItem['cost'] + $v['cost'] * $v['num']) / ($goodsSkuItem['stock'] + $v['num']), 2), ]; GoodsSku::query()->where('external_sku_id', $goodsSkuItem['external_sku_id'])->update($updateParams); $updateIds[] = $goodsSkuItem['id']; $updateParams[] = $updateParam; } else { //组合商品 这里需要重新获取 减少更新丢失概率 $combinationGood = CombinationGood::query()->with('goodsSkuItem:id,stock,sale_stock') ->where('goods_sku_id', $goodsSkuItem['id'])->get(); foreach ($combinationGood as $item) { $updateParam = [ 'stock' => $item['goodsSkuItem']['stock'] + $v['num'] * $item['item_num'], 'sale_stock' => $item['goodsSkuItem']['sale_stock'] + $v['num'] * $item['item_num'], ]; GoodsSku::query()->where('id', $item['goodsSkuItem']['id'])->update($updateParam); $updateIds[] = $item['goodsSkuItem']['id']; $updateParams[] = $updateParam; } } Log::info("本次请求更新参数", $updateParams); return $updateIds; } }