pluck(null, 'external_sku_id')->toArray(); $externalSkuIds = collect($requestSkus)->pluck('external_sku_id')->toArray(); $skus = GoodsSku::query() ->whereIn('external_sku_id', $externalSkuIds) ->get(['id', 'external_sku_id']) ->toArray(); $today = DateTimeUtils::getToday(); $dateTime = date('Y-m-d H:i:s'); $updateIds = []; foreach ($skus as $sku) { if (!in_array($sku['external_sku_id'], $externalSkuIds)) { continue; } // 更新 $record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', $today)->firstOrCreate([ 'sku_id' => $sku['id'], 'day' => $today, ]); $record->inventory = $requestSkusMap[$sku['external_sku_id']]['inventory']; $record->inventory_time = $dateTime; $record->save(); //查询sku当前未发货的数量 目前数据看着有问题暂不操作 //库存修改 盘点是直接覆盖所以这里加个锁 GoodsSku::query()->where('id', $sku['id'])->lockForUpdate()->update([ 'stock' => $requestSkusMap[$sku['external_sku_id']]['inventory'] ]); $updateIds[] = $sku['id']; } // 批量更新 event(new BatchStockUpdateEvent($updateIds)); } public static function computeSkuStock(array $goodsSkuItem, array $v): array { $updateIds = []; if (!empty($v['is_combination'])) { GoodsSku::query()->where('external_sku_id', $v['external_sku_id'])->update([ '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), ]); $updateIds[] = $goodsSkuItem['id']; } else { //组合商品 这里需要重新获取 减少更新丢失概率 后续考虑库存管理用redis $combinationGood = CombinationGood::query()->with('goodsSkuItem:id,stock,sale_stock') ->where('goods_sku_id', $goodsSkuItem['id'])->get(); foreach ($combinationGood as $item) { GoodsSku::query()->where('id', $item['goodsSkuItem']['id'])->update([ 'stock' => $item['goodsSkuItem']['stock'] + $v['num'] * $item['item_num'], 'sale_stock' => $item['goodsSkuItem']['sale_stock'] + $v['num'] * $item['item_num'], ]); $updateIds[] = $item['goodsSkuItem']['id']; } } return $updateIds; } }