mirror of
https://gitee.com/hzchunfen/erp.git
synced 2025-12-01 06:30:49 +00:00
76 lines
3.1 KiB
PHP
76 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Services\GoodSku;
|
|
|
|
use App\Events\BatchStockUpdateEvent;
|
|
use App\Models\CombinationGood;
|
|
use App\Models\DailyStockRecord;
|
|
use App\Models\GoodsSku;
|
|
use App\Utils\DateTimeUtils;
|
|
|
|
class GoodSkuService
|
|
{
|
|
|
|
public function inventory(array $requestSkus)
|
|
{
|
|
$requestSkusMap = collect($requestSkus)->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;
|
|
}
|
|
|
|
}
|