/**
- * Ð\9cеÑ\82од вÑ\8bÑ\87иÑ\81лÑ\8fеÑ\82 взвеÑ\88енное знаÑ\87ение пÑ\80одаж длÑ\8f Ñ\82оваÑ\80ов без иÑ\81Ñ\82оÑ\80ии.
+ * Метод вычисляет значение продаж для товаров без истории.
*
* @param int $storeId Идентификатор магазина.
* @param string $selectedMonth Выбранный месяц в формате "mm" (целевой месяц).
*
* @return array Возвращает массив, где ключ – GUID товара, а значение – рассчитанное взвешенное значение продаж.
*/
- public static function calculateWeightedSalesForProductsWithoutHistory($storeId, $selectedMonth, $selectedYear, $productsWithoutHistory)
+ public static function calculateMedianSalesForProductsWithoutHistoryExtended($storeId, $selectedMonth, $selectedYear, $productsWithoutHistory)
{
- $t0 = hrtime(true);
$targetDate = strtotime("{$selectedYear}-{$selectedMonth}-01");
$periods = self::getPeriods($targetDate, 3);
- $weightedResults = [];
- $initTime = (hrtime(true) - $t0) / 1e6; // миллисекунды
- Yii::warning( "Init (periods): {$initTime} ms\n");
+ $medianSalesResults = [];
+
foreach ($productsWithoutHistory as $product) {
$guid = $product['guid'];
- $t1 = hrtime(true);
+
+
$similarProductIds = self::getSimilarProductIDs($guid);
if (empty($similarProductIds)) {
- $weightedResults[$guid] = 0;
+ $medianSalesResults[$guid] = 0;
continue;
}
- $dur = (hrtime(true) - $t1) / 1e6;
- Yii::warning( "getSimilarProductIDs for product {$guid} {$storeId}: {$dur} ms\n");
+
$medianSales = [];
$salesValuesForEachMonth = [];
- $t2 = hrtime(true);
+
foreach ($periods as $periodKey => $monthInfo) {
list($median, $salesValues) = self::calculateMedianSalesForPeriod($storeId, $similarProductIds, $monthInfo);
$medianSales[$periodKey] = $median;
$salesValuesForEachMonth[$periodKey] = $salesValues;
}
- $dur = (hrtime(true) - $t2) / 1e6;
- Yii::warning("calculateMedianSalesForPeriod for product {$guid} {$storeId}: {$dur} ms\n");
- $t3 = hrtime(true);
$median3 = self::calculateMedianSalesOverPeriods($storeId, $similarProductIds, $periods);
- $weightedResults[$guid] = [
+ $medianSalesResults[$guid] = [
+ 'store_id' => $storeId,
+ 'category' => $product['category'],
+ 'subcategory' => $product['subcategory'],
+ 'species' => $product['species'],
'weightedValue' => $median3,
'medianSales' => $medianSales,
'salesValues' => $salesValuesForEachMonth,
];
- $dur = (hrtime(true) - $t3) / 1e6;
- Yii::warning( "computeWeightedValue for product {$guid} {$storeId}: {$dur} ms\n");
- }
- $totalTime = (hrtime(true) - $t0) / 1e6;
- Yii::warning( "Total calculateWeightedSalesForProductsWithoutHistory: {$totalTime} ms\n");
+ }
- return $weightedResults;
+ return $medianSalesResults;
}
+
/**
* Возвращает среднюю цену $productId для месяца, отстоящего на $offset месяцев
* от заданного $year-$month, в контексте $storeId.