2024-07-26 17:48:07 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Services\GoodSku;
|
|
|
|
|
|
|
|
|
|
use App\Events\BatchStockUpdateEvent;
|
2024-07-27 16:51:00 +08:00
|
|
|
use App\Models\CombinationGood;
|
2024-07-26 17:48:07 +08:00
|
|
|
use App\Models\DailyStockRecord;
|
|
|
|
|
use App\Models\GoodsSku;
|
|
|
|
|
use App\Utils\DateTimeUtils;
|
2024-07-29 18:32:40 +08:00
|
|
|
use Illuminate\Support\Facades\Log;
|
2024-07-26 17:48:07 +08:00
|
|
|
|
|
|
|
|
class GoodSkuService
|
|
|
|
|
{
|
2024-07-30 15:30:32 +08:00
|
|
|
/**
|
|
|
|
|
* $skusWithCombinationGoods 除了携带组合商品的字段 还拼接了盘点的具体库存值inventory
|
|
|
|
|
* @param array $skusWithCombinationGoods
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function inventory(array $skusWithCombinationGoods)
|
2024-07-26 17:48:07 +08:00
|
|
|
{
|
2024-07-29 18:32:40 +08:00
|
|
|
//传进来的sku可能包含组合商品 所以这里需要事先计算好数据
|
2024-07-30 15:30:32 +08:00
|
|
|
$inventoryKeyBySkuIdMap = collect($skusWithCombinationGoods)->where('is_combination', "=", 0)
|
|
|
|
|
->pluck("inventory", "sku_id")->toArray();
|
|
|
|
|
//计算组合商品
|
|
|
|
|
foreach ($skusWithCombinationGoods as $sku) {
|
|
|
|
|
if (!empty($sku['is_combination'])) {
|
|
|
|
|
foreach ($sku['combination_goods'] as $combinationGoods) {
|
|
|
|
|
if (empty($inventoryKeyBySkuIdMap[$combinationGoods["item_id"]])) {
|
|
|
|
|
//没有盘点到的sku需要在原先的sku库存
|
|
|
|
|
$inventoryKeyBySkuIdMap[$combinationGoods["item_id"]] = GoodsSku::query()
|
|
|
|
|
->where('id', $combinationGoods["item_id"])->pluck('stock')->first()??0;
|
|
|
|
|
}
|
2024-07-29 18:32:40 +08:00
|
|
|
|
2024-07-30 15:30:32 +08:00
|
|
|
$inventoryKeyBySkuIdMap[$combinationGoods["item_id"]] += $combinationGoods['item_num'] * $sku['inventory'];
|
2024-07-29 18:32:40 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-26 17:48:07 +08:00
|
|
|
$today = DateTimeUtils::getToday();
|
|
|
|
|
$dateTime = date('Y-m-d H:i:s');
|
|
|
|
|
$updateIds = [];
|
2024-07-30 15:30:32 +08:00
|
|
|
Log::info("库存盘点前完整信息", $skusWithCombinationGoods);
|
|
|
|
|
Log::info("需要操作的库存数据", $inventoryKeyBySkuIdMap);
|
|
|
|
|
foreach ($inventoryKeyBySkuIdMap as $skuId => $totalInventory) {
|
2024-07-26 17:48:07 +08:00
|
|
|
// 更新
|
2024-07-30 15:30:32 +08:00
|
|
|
$record = DailyStockRecord::query()->firstOrCreate([
|
|
|
|
|
'sku_id' => $skuId,
|
2024-07-26 17:48:07 +08:00
|
|
|
'day' => $today,
|
|
|
|
|
]);
|
2024-07-30 15:30:32 +08:00
|
|
|
$record->inventory = $totalInventory;
|
2024-07-26 17:48:07 +08:00
|
|
|
$record->inventory_time = $dateTime;
|
|
|
|
|
$record->save();
|
|
|
|
|
//查询sku当前未发货的数量 目前数据看着有问题暂不操作
|
|
|
|
|
|
2024-07-30 15:30:32 +08:00
|
|
|
//库存修改 盘点是直接覆盖
|
|
|
|
|
GoodsSku::query()->where('id', $skuId)->update([
|
|
|
|
|
'stock' => $totalInventory
|
2024-07-26 17:48:07 +08:00
|
|
|
]);
|
2024-07-30 15:30:32 +08:00
|
|
|
$updateIds[] = $skuId;
|
2024-07-26 17:48:07 +08:00
|
|
|
}
|
|
|
|
|
// 批量更新
|
|
|
|
|
event(new BatchStockUpdateEvent($updateIds));
|
2024-07-27 16:51:00 +08:00
|
|
|
}
|
2024-07-26 17:48:07 +08:00
|
|
|
|
2024-07-27 16:51:00 +08:00
|
|
|
public static function computeSkuStock(array $goodsSkuItem, array $v): array
|
|
|
|
|
{
|
|
|
|
|
$updateIds = [];
|
2024-07-29 18:32:40 +08:00
|
|
|
Log::info("库存更新前完整商品信息", $goodsSkuItem);
|
|
|
|
|
Log::info("库存更新前完整请求信息", $v);
|
|
|
|
|
$updateParams = [];
|
2024-07-27 17:13:02 +08:00
|
|
|
if (empty($goodsSkuItem['is_combination'])) {
|
2024-07-29 18:32:40 +08:00
|
|
|
$updateParam = [
|
2024-07-27 16:51:00 +08:00
|
|
|
'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),
|
2024-07-29 18:32:40 +08:00
|
|
|
];
|
|
|
|
|
GoodsSku::query()->where('external_sku_id', $goodsSkuItem['external_sku_id'])->update($updateParams);
|
2024-07-27 16:51:00 +08:00
|
|
|
$updateIds[] = $goodsSkuItem['id'];
|
2024-07-29 18:32:40 +08:00
|
|
|
$updateParams[] = $updateParam;
|
2024-07-27 16:51:00 +08:00
|
|
|
} else {
|
2024-07-29 18:32:40 +08:00
|
|
|
//组合商品 这里需要重新获取 减少更新丢失概率
|
2024-07-27 16:51:00 +08:00
|
|
|
$combinationGood = CombinationGood::query()->with('goodsSkuItem:id,stock,sale_stock')
|
|
|
|
|
->where('goods_sku_id', $goodsSkuItem['id'])->get();
|
|
|
|
|
foreach ($combinationGood as $item) {
|
2024-07-29 18:32:40 +08:00
|
|
|
$updateParam = [
|
2024-07-27 16:51:00 +08:00
|
|
|
'stock' => $item['goodsSkuItem']['stock'] + $v['num'] * $item['item_num'],
|
|
|
|
|
'sale_stock' => $item['goodsSkuItem']['sale_stock'] + $v['num'] * $item['item_num'],
|
2024-07-29 18:32:40 +08:00
|
|
|
];
|
|
|
|
|
GoodsSku::query()->where('id', $item['goodsSkuItem']['id'])->update($updateParam);
|
2024-07-27 16:51:00 +08:00
|
|
|
$updateIds[] = $item['goodsSkuItem']['id'];
|
2024-07-29 18:32:40 +08:00
|
|
|
$updateParams[] = $updateParam;
|
2024-07-27 16:51:00 +08:00
|
|
|
}
|
|
|
|
|
}
|
2024-07-29 18:32:40 +08:00
|
|
|
Log::info("本次请求更新参数", $updateParams);
|
2024-07-27 16:51:00 +08:00
|
|
|
return $updateIds;
|
2024-07-26 17:48:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|