erp/app/Listeners/CombinationGoodsStockUpdateListener.php

99 lines
3.0 KiB
PHP
Raw Normal View History

2023-04-21 19:43:17 +08:00
<?php
namespace App\Listeners;
use App\Models\CombinationGood;
use App\Models\GoodsSku;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use App\Events\StockUpdateEvent;
class CombinationGoodsStockUpdateListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param $event
* @return void
*/
public function handle($event)
{
if ($event->combinationGoodsUpdate) {
return false;
}
$updateIds = $combinationGoodsIds = $combinationGoodsItemIds = [];
if ($event->goodsSku) {
if ($event->goodsSku->is_combination) {
$combinationGoodsIds[] = $event->goodsSku->id;
} else {
2023-04-26 11:43:25 +08:00
$combinationGoodsItemIds[] = $event->goodsSku->id;
2023-04-21 19:43:17 +08:00
}
}
if ($event->goodsSkus) {
foreach ($event->goodsSkus as $sku) {
if ($sku->is_combination) {
$combinationGoodsIds[] = $sku->id;
} else {
2023-04-26 11:43:25 +08:00
$combinationGoodsItemIds[$sku->id] = $sku->id;
2023-04-21 19:43:17 +08:00
}
}
}
// 减子商品库存
if ($combinationGoodsIds) {
$combinationGoods = CombinationGood::query()
->with('goodsSku:id,stock')
->whereIn('goods_sku_id', $combinationGoodsIds)
->get();
foreach ($combinationGoods as $item) {
$sku = GoodsSku::query()->find($item['item_id']);
$sku->stock -= $item['item_num'];
$sku->save();
$updateIds[] = $sku->id;
}
}
// 计算主商品库存
if ($combinationGoodsItemIds) {
2023-04-26 11:43:25 +08:00
$goodsSkuIds = CombinationGood::query()
->whereIn('item_id', $combinationGoodsItemIds)
->pluck('goods_sku_id')
->toArray();
if (empty($goodsSkuIds)) {
2023-04-21 19:43:17 +08:00
return false;
}
2023-04-26 11:43:25 +08:00
foreach ($goodsSkuIds as $goodsSkuId) {
$combinationGoods = CombinationGood::query()
->with('goodsSkuItem:id,stock')
->where('goods_sku_id', $goodsSkuId)
->get();
$stock = 0;
foreach ($combinationGoods as $goods) {
$num = $goods['goodsSkuItem']['stock'] / $goods['item_num'];
if (0 === $stock) {
$stock = $num;
continue;
}
if ($num < $stock) {
$stock = $num;
}
2023-04-21 19:43:17 +08:00
}
2023-04-26 11:43:25 +08:00
GoodsSku::query()->where('id', $goodsSkuId)->update(['stock' => $stock]);
$updateIds[] = $goodsSkuId;
2023-04-21 19:43:17 +08:00
}
}
if ($updateIds) {
2023-04-26 10:51:15 +08:00
$updateIds = array_unique($updateIds);
2023-04-21 19:43:17 +08:00
event(new StockUpdateEvent($updateIds, 1, true));
}
}
}