diff --git a/app/Services/GoodSku/GoodSkuService.php b/app/Services/GoodSku/GoodSkuService.php index 301bef6..b42aef8 100644 --- a/app/Services/GoodSku/GoodSkuService.php +++ b/app/Services/GoodSku/GoodSkuService.php @@ -3,6 +3,7 @@ namespace App\Services\GoodSku; use App\Events\BatchStockUpdateEvent; +use App\Http\Enum\BusinessOrderShippingStatus; use App\Http\Enum\TargetTypeEnum; use App\Models\BusinessOrderItem; use App\Models\CombinationGood; @@ -15,6 +16,7 @@ use Carbon\Carbon; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; +use phpDocumentor\Reflection\Types\Collection; class GoodSkuService { @@ -101,26 +103,49 @@ class GoodSkuService public function handleSkusWithCombinationGoods(array $skusWithCombinationGoods) { //查询sku当前未发货的数量 需要扣减 - //$externalSkuIds = collect($skusWithCombinationGoods)->pluck("external_sku_id")->toArray(); + $externalSkuIds = collect($skusWithCombinationGoods)->pluck("external_sku_id")->toArray(); + $skuIds = collect($skusWithCombinationGoods)->pluck("id")->toArray(); + //关联的组合数据 + $combinationGoods = CombinationGood::query()->with("goodsSku:id,external_sku_id")->where('item_id', $skuIds)->get()->toArray(); + $externalSkuIds = collect($combinationGoods)->pluck("goods_sku.external_sku_id")->merge(collect($externalSkuIds))->toArray(); + //默认只查15天内未发货的数据 - $unshippedData = []; - //发货状态异常 先关闭扣减 - /*$startTime = Carbon::now()->subDays(15)->startOfDay()->toDateTimeString(); + $startTime = Carbon::now()->subDays(15)->startOfDay()->toDateTimeString(); $unshippedDataCollect = BusinessOrderItem::query() + ->with([ + 'shop:id,name', + 'goodsSku:id,external_sku_id,is_combination', + 'goodsSku.combinationGoods:id,goods_sku_id,item_id,item_num' + ]) ->leftJoin("business_orders as b", "business_order_id", "=", "b.id") - ->select("external_sku_id", DB::raw("sum(goods_number) as goods_total"), DB::raw("sum(already_cancel_number) as cancel_total")) - ->whereIn("external_sku_id", $externalSkuIds)->where("b.shipping_status", "=", 0) + ->select("external_sku_id", DB::raw("SUM(goods_number) - SUM(already_cancel_number) as number")) + ->whereIn("external_sku_id", $externalSkuIds) + ->where("b.shipping_status", "=", BusinessOrderShippingStatus::UNSHIP) ->where("business_order_items.created_at", ">=", $startTime)->where("business_order_items.cancel_status", "=", 0) ->groupBy('external_sku_id')->get()->toArray(); - $unshippedData = collect($unshippedDataCollect)->pluck(null, "external_sku_id")->toArray(); - Log::info("15日内未发货数据", $unshippedData); - */ - return collect($skusWithCombinationGoods)->map(function ($v) use ($unshippedData) { - $v['real_stock'] = $v['inventory'] ?? null; - if (!empty($unshippedData[$v['external_sku_id']]) && isset($v['inventory'])) { - $v['real_stock'] = $v['inventory'] - $unshippedData[$v['external_sku_id']]['goods_total'] - + $unshippedData[$v['external_sku_id']]['cancel_total']; + //重组订单 + foreach ($unshippedDataCollect as $businessOrderItem) { + if (is_null($businessOrderItem['goods_sku'])) { + continue; + } + $id = $businessOrderItem['goods_sku']['id']; + if ($businessOrderItem['goods_sku']['is_combination']) { + foreach ($businessOrderItem['goods_sku']['combination_goods'] ?? [] as $combinationGoods) { + $ids[$combinationGoods['item_id']] = ($ids[$combinationGoods['item_id']] ?? 0) + + ((int)$businessOrderItem['number']) * $combinationGoods['item_num']; + } + } + if (isset($ids[$id])) { + $ids[$id] += (int)$businessOrderItem['number']; + } else { + $ids[$id] = (int)$businessOrderItem['number']; + } + } + return collect($skusWithCombinationGoods)->map(function ($v) use ($ids) { + $v['real_stock'] = $v['inventory'] ?? null; + if (!empty($ids[$v['id']]) && isset($v['inventory'])) { + $v['real_stock'] = $v['inventory'] - $ids[$v['id']]; } return $v; })->toArray();