diff --git a/app/Events/BatchStockUpdateEvent.php b/app/Events/BatchStockUpdateEvent.php new file mode 100644 index 0000000..0036b31 --- /dev/null +++ b/app/Events/BatchStockUpdateEvent.php @@ -0,0 +1,45 @@ +goodsSkus = GoodsSku::query()->whereIn('id', $goodsSkuIds)->get(); + $this->stockWarning = $stockWarning; + $this->combinationGoodsUpdate = $combinationGoodsUpdate; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/app/Events/BusinessOrdersUpdate.php b/app/Events/BusinessOrdersUpdate.php index c07a90e..3556d88 100644 --- a/app/Events/BusinessOrdersUpdate.php +++ b/app/Events/BusinessOrdersUpdate.php @@ -16,35 +16,28 @@ class BusinessOrdersUpdate { use Dispatchable, InteractsWithSockets, SerializesModels; + public $businessGoodSku; public $num; - public $businessGoods; public $goodsSku; - public $goodsSkus; - public $combinationGoodsUpdate; + public $combinationGoodsUpdate = true; /** * Create a new event instance. * * @return void */ - public function __construct($item, $num) + public function __construct($businessGoodSku, $num) { - $this->combinationGoodsUpdate = false; - $this->businessGoods = $item->toArray(); + $this->businessGoodSku = $businessGoodSku->toArray(); $this->num = $num; $this->updateStock(); } private function updateStock() { - try { - $this->goodsSku = GoodsSku::query() - ->where('external_sku_id', $this->businessGoods['external_sku_id']) - ->first(); - } catch (\Exception $e) { - Log::error('事件库存更新失败: ' . $e->getMessage()); - return false; - } + $this->goodsSku = GoodsSku::query() + ->where('external_sku_id', $this->businessGoodSku['external_sku_id']) + ->first(); if ($this->goodsSku) { $this->goodsSku->stock += $this->num; $this->goodsSku->save(); diff --git a/app/Events/StockUpdateEvent.php b/app/Events/StockUpdateEvent.php index fb8acf8..f29af60 100644 --- a/app/Events/StockUpdateEvent.php +++ b/app/Events/StockUpdateEvent.php @@ -2,7 +2,6 @@ namespace App\Events; -use App\Models\GoodsSku; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PresenceChannel; @@ -14,30 +13,16 @@ use Illuminate\Queue\SerializesModels; class StockUpdateEvent { use Dispatchable, InteractsWithSockets, SerializesModels; - public $goodsSku; - public $goodsSkus; - public $isBatch; - public $combinationGoodsUpdate; /** * Create a new event instance. * - * @param $data array|object - * - * @return void + * @param $goodsSku */ - public function __construct($data, $isBatch = 0, $combinationGoodsUpdate = false) + public function __construct($goodsSku) { - $this->isBatch = $isBatch; - $this->combinationGoodsUpdate = $combinationGoodsUpdate; - if (is_array($data)) { - // ids集合 - $this->goodsSkus = GoodsSku::query()->whereIn('id', $data)->get(); - } else { - // GoodsSku Elo模型对象 - $this->goodsSku = $data; - } + $this->goodsSku = $goodsSku; } /** diff --git a/app/Http/Controllers/Goods/GoodsCombinationController.php b/app/Http/Controllers/Goods/GoodsCombinationController.php index 7cbfb92..f81afdb 100644 --- a/app/Http/Controllers/Goods/GoodsCombinationController.php +++ b/app/Http/Controllers/Goods/GoodsCombinationController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers\Goods; -use App\Events\StockUpdateEvent; use App\Http\Controllers\Controller; use App\Http\Resources\GoodsSkuResource; use App\Imports\CombinationGoodsImport; @@ -141,7 +140,6 @@ class GoodsCombinationController extends Controller CombinationGood::query()->create(['goods_sku_id' => $sku->id, 'item_id' => $item['item_id'], 'item_num' => $item['item_num']]); } DB::commit(); -// event(new StockUpdateEvent($sku, 0, true)); } catch (\Exception $exception) { DB::rollBack(); $this->res = [ diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index 25d7360..c34032f 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Goods; +use App\Events\BatchStockUpdateEvent; use App\Events\StockUpdateEvent; use App\Exports\GoodsSkusExport; use App\Http\Controllers\Controller; @@ -234,7 +235,8 @@ class GoodsSkusController extends Controller $log = new LogModel(); $log->batchInsert($logs); DB::commit(); - event(new StockUpdateEvent(array_column($request->skus, 'id'))); + // 批量更新 + event(new BatchStockUpdateEvent(array_column($request->skus, 'id'))); } catch (\Exception $exception) { DB::rollBack(); $this->res = [ diff --git a/app/Imports/CombinationGoodsImport.php b/app/Imports/CombinationGoodsImport.php index e836795..f56a137 100644 --- a/app/Imports/CombinationGoodsImport.php +++ b/app/Imports/CombinationGoodsImport.php @@ -2,10 +2,8 @@ namespace App\Imports; -use App\Events\StockUpdateEvent; use App\Models\CombinationGood; use App\Models\GoodsSku; -use App\Models\GoodsSkuLocation; use App\Utils\ArrayUtils; use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Concerns\SkipsEmptyRows; @@ -72,7 +70,6 @@ class CombinationGoodsImport implements ToArray, SkipsEmptyRows, WithStartRow CombinationGood::query()->create(['goods_sku_id' => $sku->id, 'item_id' => $skus[$item['item_code']]['id'], 'item_num' => $item['item_num']]); } DB::commit(); -// event(new StockUpdateEvent($sku, 0, true)); } catch (\Exception $exception) { DB::rollBack(); } diff --git a/app/Imports/InventoryImport.php b/app/Imports/InventoryImport.php index 74b2d37..5d1e7aa 100644 --- a/app/Imports/InventoryImport.php +++ b/app/Imports/InventoryImport.php @@ -2,6 +2,7 @@ namespace App\Imports; +use App\Events\BatchImportStockEvent; use App\Jobs\SyncCostToMiaoXuan; use App\Models\DailyStockRecord; use App\Models\GoodsSku; @@ -11,7 +12,6 @@ use Exception; use Maatwebsite\Excel\Concerns\SkipsEmptyRows; use Maatwebsite\Excel\Concerns\ToArray; use App\Utils\ArrayUtils; -use App\Events\StockUpdateEvent; class InventoryImport implements ToArray, SkipsEmptyRows { @@ -98,6 +98,7 @@ class InventoryImport implements ToArray, SkipsEmptyRows } } sleep(2); - event(new StockUpdateEvent($onSkuIds, 1)); + // 批量更新 + event(new BatchImportStockEvent($onSkuIds)); } } diff --git a/app/Imports/NewSetImport.php b/app/Imports/NewSetImport.php index 0320a2d..37f7848 100644 --- a/app/Imports/NewSetImport.php +++ b/app/Imports/NewSetImport.php @@ -2,16 +2,15 @@ namespace App\Imports; +use App\Events\BatchImportStockEvent; use App\Jobs\SyncCostToMiaoXuan; use App\Models\DailyStockRecord; use App\Models\GoodsSku; -use App\Models\TodayPrice; use App\Utils\DateTimeUtils; use Exception; use Maatwebsite\Excel\Concerns\SkipsEmptyRows; use Maatwebsite\Excel\Concerns\ToArray; use App\Utils\ArrayUtils; -use App\Events\StockUpdateEvent; class NewSetImport implements ToArray, SkipsEmptyRows { @@ -59,6 +58,7 @@ class NewSetImport implements ToArray, SkipsEmptyRows $record->save(); } sleep(2); - event(new StockUpdateEvent($updateIds, 1)); + // 批量更新 + event(new BatchImportStockEvent($updateIds)); } } diff --git a/app/Listeners/BatchStockUpdateListener.php b/app/Listeners/BatchStockUpdateListener.php new file mode 100644 index 0000000..79c233b --- /dev/null +++ b/app/Listeners/BatchStockUpdateListener.php @@ -0,0 +1,50 @@ +whereNotIn('status', [Shop::$STATUS_UNAUTHORIZED, Shop::$STATUS_STOP])->get(['id', 'plat_id']); + if (empty($shops)) { + return; + } + foreach ($shops as $shop) { + foreach ($event->goodsSkus as $goodsSku) { + $num = $goodsSku->stock; + $businessGoodsSkus = BusinessGoodsSku::query() + ->select(['goods_id', 'sku_id', 'external_sku_id']) + ->where('shop_id', $shop->id) + ->where('is_sync', 1) + ->where('external_sku_id', $goodsSku->external_sku_id) + ->get(); + BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); + } + } + } +} diff --git a/app/Listeners/BatchStockWarning.php b/app/Listeners/BatchStockWarning.php new file mode 100644 index 0000000..64d650c --- /dev/null +++ b/app/Listeners/BatchStockWarning.php @@ -0,0 +1,49 @@ +stockWarning) { + return; + } + $warningIds = $normalIds = $downIds = []; + foreach ($event->goodsSkus as $goodsSku) { + if (0 >= $goodsSku['stock']) { + $downIds[] = $goodsSku['id']; + } elseif (5 < $goodsSku['stock']) { + $normalIds[] = $goodsSku['id']; + } else { + $warningIds[] = $goodsSku['id']; + } + } + if ($warningIds) { + GoodsSku::query()->whereIn('id', $warningIds)->update(['status' => 2]); + } + if ($normalIds) { + GoodsSku::query()->whereIn('id', $normalIds)->update(['status' => 1]); + } + if ($downIds) { + GoodsSku::query()->whereIn('id', $downIds)->update(['status' => 0]); + } + } +} diff --git a/app/Listeners/CombinationGoodsStockUpdateListener.php b/app/Listeners/CombinationGoodsStockUpdateListener.php index f77a8f8..10f7c9b 100644 --- a/app/Listeners/CombinationGoodsStockUpdateListener.php +++ b/app/Listeners/CombinationGoodsStockUpdateListener.php @@ -6,7 +6,7 @@ use App\Models\CombinationGood; use App\Models\GoodsSku; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; -use App\Events\StockUpdateEvent; +use App\Events\BatchStockUpdateEvent; class CombinationGoodsStockUpdateListener { @@ -28,18 +28,18 @@ class CombinationGoodsStockUpdateListener */ public function handle($event) { - if ($event->combinationGoodsUpdate) { - return false; + if (!$event->combinationGoodsUpdate) { + return; } $updateIds = $combinationGoodsIds = $combinationGoodsItemIds = []; - if ($event->goodsSku) { + if (!empty($event->goodsSku)) { if ($event->goodsSku->is_combination) { $combinationGoodsIds[] = $event->goodsSku->id; } else { $combinationGoodsItemIds[] = $event->goodsSku->id; } } - if ($event->goodsSkus) { + if (!empty($event->goodsSkus)) { foreach ($event->goodsSkus as $sku) { if ($sku->is_combination) { $combinationGoodsIds[] = $sku->id; @@ -68,7 +68,7 @@ class CombinationGoodsStockUpdateListener ->pluck('goods_sku_id') ->toArray(); if (empty($goodsSkuIds)) { - return false; + return; } foreach ($goodsSkuIds as $goodsSkuId) { $combinationGoods = CombinationGood::query() @@ -86,7 +86,8 @@ class CombinationGoodsStockUpdateListener } if ($updateIds) { $updateIds = array_unique($updateIds); - event(new StockUpdateEvent($updateIds, 1, true)); + // 批量更新 + event(new BatchStockUpdateEvent($updateIds, false)); } } } diff --git a/app/Listeners/StockUpdateListener.php b/app/Listeners/StockUpdateListener.php index ecd1ea4..ab658c3 100644 --- a/app/Listeners/StockUpdateListener.php +++ b/app/Listeners/StockUpdateListener.php @@ -3,7 +3,6 @@ namespace App\Listeners; use App\Events\StockUpdateEvent; -use App\Jobs\BusinessGoodsSkuIncrQuantity; use App\Models\BusinessGoodsSku; use App\Models\Shop; use Illuminate\Contracts\Queue\ShouldQueue; @@ -35,40 +34,14 @@ class StockUpdateListener return; } foreach ($shops as $shop) { - if (isset($event->goodsSku)) { - $num = $event->goodsSku->stock; - $businessGoodsSkus = BusinessGoodsSku::query() - ->select(['goods_id', 'sku_id', 'external_sku_id']) - ->where('shop_id', $shop->id) - ->where('is_sync', 1) - ->where('external_sku_id', $event->goodsSku->external_sku_id) - ->get(); - if ($event->isBatch) { - BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); - } else { - foreach ($businessGoodsSkus as $businessGoodsSku) { - BusinessGoodsSkuIncrQuantity::dispatch($shop, $businessGoodsSku->toArray(), $num, false); - } - } - } - if (isset($event->goodsSkus)) { - foreach ($event->goodsSkus as $goodsSku) { - $num = $goodsSku->stock; - $businessGoodsSkus = BusinessGoodsSku::query() - ->select(['goods_id', 'sku_id', 'external_sku_id']) - ->where('shop_id', $shop->id) - ->where('is_sync', 1) - ->where('external_sku_id', $goodsSku->external_sku_id) - ->get(); - if ($event->isBatch) { - BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); - } else { - foreach ($businessGoodsSkus as $businessGoodsSku) { - BusinessGoodsSkuIncrQuantity::dispatch($shop, $businessGoodsSku->toArray(), $num, false); - } - } - } - } + $num = $event->goodsSku->stock; + $businessGoodsSkus = BusinessGoodsSku::query() + ->select(['goods_id', 'sku_id', 'external_sku_id']) + ->where('shop_id', $shop->id) + ->where('is_sync', 1) + ->where('external_sku_id', $event->goodsSku->external_sku_id) + ->get(); + BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); } } } diff --git a/app/Listeners/StockWarning.php b/app/Listeners/StockWarning.php index 3d5d52a..4cf2095 100644 --- a/app/Listeners/StockWarning.php +++ b/app/Listeners/StockWarning.php @@ -22,36 +22,13 @@ class StockWarning implements ShouldQueue public function handle($event) { - if (isset($event->goodsSku)) { - $event->goodsSku->status = 2; - if (0 >= $event->goodsSku->stock) { - $event->goodsSku->status = 0; - } - if (5 < $event->goodsSku->stock) { - $event->goodsSku->status = 1; - } - $event->goodsSku->save(); + $event->goodsSku->status = 2; + if (0 >= $event->goodsSku->stock) { + $event->goodsSku->status = 0; } - if (isset($event->goodsSkus)) { - $warningIds = $normalIds = $downIds = []; - foreach ($event->goodsSkus as $goodsSku) { - if (0 >= $goodsSku['stock']) { - $downIds[] = $goodsSku['id']; - } elseif (5 < $goodsSku['stock']) { - $normalIds[] = $goodsSku['id']; - } else { - $warningIds[] = $goodsSku['id']; - } - } - if ($warningIds) { - GoodsSku::query()->whereIn('id', $warningIds)->update(['status' => 2]); - } - if ($normalIds) { - GoodsSku::query()->whereIn('id', $normalIds)->update(['status' => 1]); - } - if ($downIds) { - GoodsSku::query()->whereIn('id', $downIds)->update(['status' => 0]); - } + if (5 < $event->goodsSku->stock) { + $event->goodsSku->status = 1; } + $event->goodsSku->save(); } } diff --git a/app/Listeners/UpdateBusinessGoodsStock.php b/app/Listeners/UpdateBusinessGoodsStock.php index a8f436f..b4eb240 100644 --- a/app/Listeners/UpdateBusinessGoodsStock.php +++ b/app/Listeners/UpdateBusinessGoodsStock.php @@ -29,7 +29,7 @@ class UpdateBusinessGoodsStock implements ShouldQueue * Handle the event. * * @param BusinessOrdersUpdate $event - * @return void + * @return false|void */ public function handle(BusinessOrdersUpdate $event) { @@ -41,17 +41,19 @@ class UpdateBusinessGoodsStock implements ShouldQueue $log->target_id = $event->goodsSku->id ?? 0; $log->target_field = 'stock'; $log->user_id = 999; - $log->message = '未找到' . json_encode($event->businessGoods, 256); + $log->message = '未找到' . json_encode($event->businessGoodSku, 256); $log->save(); return false; } + $builder = Shop::query()->whereNotIn('status', [Shop::$STATUS_UNAUTHORIZED, Shop::$STATUS_STOP]); // 非订单影响库存变更,只更新本店铺下商品 - if (!isset($event->businessGoods['business_order_id'])) { - $builder->where('id', $event->businessGoods['shop_id']); + if (!isset($event->businessGoodSku['business_order_id'])) { + $builder->where('id', $event->businessGoodSku['shop_id']); } $shops = $builder->get(['id', 'plat_id']); + if (empty($shops)) { LogFile::info('可操作店铺为空'); return false; @@ -59,7 +61,7 @@ class UpdateBusinessGoodsStock implements ShouldQueue foreach ($shops as $shop) { $num = $event->goodsSku->stock; - $businessGoodsSkus = BusinessGoodsSku::query()->where('shop_id', $shop->id)->where('is_sync', 1)->where('external_sku_id', $event->businessGoods['external_sku_id'])->get(); + $businessGoodsSkus = BusinessGoodsSku::query()->where('shop_id', $shop->id)->where('is_sync', 1)->where('external_sku_id', $event->businessGoodSku['external_sku_id'])->get(); foreach ($businessGoodsSkus as $businessGoodsSku) { BusinessGoodsSkuIncrQuantity::dispatch($shop, $businessGoodsSku->toArray(), $num, false); } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 4a0b710..97a1b5a 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,9 +2,13 @@ namespace App\Providers; +use App\Events\BatchImportStockEvent; use App\Events\BusinessOrdersUpdate; -use App\Events\GroupSetEvent; use App\Events\StockUpdateEvent; +use App\Events\GroupSetEvent; +use App\Events\BatchStockUpdateEvent; +use App\Listeners\BatchStockUpdateListener; +use App\Listeners\BatchStockWarning; use App\Listeners\CreateLogisticListener; use App\Listeners\GroupQueryListener; use App\Listeners\StockUpdateListener; @@ -29,6 +33,11 @@ class EventServiceProvider extends ServiceProvider StockWarning::class, CombinationGoodsStockUpdateListener::class, ], + BatchStockUpdateEvent::class => [ + BatchStockUpdateListener::class, + BatchStockWarning::class, + CombinationGoodsStockUpdateListener::class, + ], StockUpdateEvent::class => [ StockUpdateListener::class, StockWarning::class,