erp/app/Services/GoodSku/GoodSkuService.php

90 lines
3.5 KiB
PHP
Raw Normal View History

2024-07-26 17:48:07 +08:00
<?php
namespace App\Services\GoodSku;
use App\Events\BatchStockUpdateEvent;
use App\Models\CombinationGood;
2024-07-26 17:48:07 +08:00
use App\Models\DailyStockRecord;
use App\Models\GoodsSku;
use App\Utils\DateTimeUtils;
use Illuminate\Support\Facades\Log;
2024-07-26 17:48:07 +08:00
class GoodSkuService
{
public function inventory(array $skusWithCombinationGoods,$skuInventoryMapKeyByExternalSkuId)
2024-07-26 17:48:07 +08:00
{
//传进来的sku可能包含组合商品 所以这里需要事先计算好数据
$inventoryKeyBySkuIdMap = [];
foreach($skusWithCombinationGoods as $sku){
if(!empty($sku['is_combination'])){
foreach ($sku['combination_goods'] as $combinationGoods){
}
}
}
$skus=[];
2024-07-26 17:48:07 +08:00
$today = DateTimeUtils::getToday();
$dateTime = date('Y-m-d H:i:s');
$updateIds = [];
foreach ($skus as $sku) {
if (!in_array($sku['external_sku_id'], $sku)) {
2024-07-26 17:48:07 +08:00
continue;
}
// 更新
$record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', $today)->firstOrCreate([
'sku_id' => $sku['id'],
'day' => $today,
]);
$record->inventory = $skuInventoryMapKeyByExternalSkuId[$sku['external_sku_id']]['inventory'];
2024-07-26 17:48:07 +08:00
$record->inventory_time = $dateTime;
$record->save();
//查询sku当前未发货的数量 目前数据看着有问题暂不操作
//库存修改 盘点是直接覆盖所以这里加个锁
2024-07-26 17:48:07 +08:00
GoodsSku::query()->where('id', $sku['id'])->lockForUpdate()->update([
'stock' => $requestSkusMap[$sku['external_sku_id']]['inventory']
]);
$updateIds[] = $sku['id'];
}
// 批量更新
event(new BatchStockUpdateEvent($updateIds));
}
2024-07-26 17:48:07 +08:00
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;
2024-07-26 17:48:07 +08:00
}
}