• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/ml/scoring.php
  • Класс: Bitrix\Crm\Ml\Scoring
  • Вызов: Scoring::queuePredictionUpdate
static function queuePredictionUpdate(int $entityTypeId, int $entityId, array $additionalParameters = [])
{
	if (
		!static::isMlAvailable()
		|| !static::isEnabled()
		|| !$entityTypeId
		|| !$entityId
	)
	{
		return false;
	}

	$scoringModel = static::getScoringModel($entityTypeId, $entityId);
	if (!$scoringModel || !$scoringModel->isReady())
	{
		return false;
	}

	if (isset($additionalParameters['TYPE']))
	{
		$type = $additionalParameters['TYPE'];
		unset($additionalParameters['TYPE']);
	}
	else
	{
		$type = self::PREDICTION_REAL_TIME;
	}

	// 1. checking for another pending request
	$latestPrediction = PredictionQueueTable::getList([
		'select' => ['ID'],
		'filter' => [
			'=ENTITY_TYPE_ID' => $entityTypeId,
			'=ENTITY_ID' => $entityId
		],
		'limit' => 1,
	])->fetch();

	if ($latestPrediction)
	{
		return $latestPrediction['ID'];
	}

	$scheduledRequest = new PredictionQueue();
	$scheduledRequest->setEntityTypeId($entityTypeId);
	$scheduledRequest->setEntityId($entityId);
	$scheduledRequest->setType($type);
	$scheduledRequest->setAdditionalParameters($additionalParameters);
	$insertResult = $scheduledRequest->save();

	if (!$insertResult->isSuccess())
	{
		return false;
	}

	$scheduledId = $insertResult->getId();
	if ($type === self::PREDICTION_REAL_TIME && $scoringModel->isReady())
	{
		Application::getInstance()->addBackgroundJob([PredictionQueue::class, 'executeRequest'], [$scheduledId]);
		$scheduledRequest->setState(PredictionQueue::STATE_EXECUTING);
		$scheduledRequest->save();
	}
	else if ($type === self::PREDICTION_IMMEDIATE && $scoringModel->isReady())
	{
		$scheduledRequest->setState(PredictionQueue::STATE_EXECUTING);
		$scheduledRequest->save();
		PredictionQueue::executeRequest($scheduledId);
	}
	else
	{
		$scheduledRequest->delay();
	}

	return $scheduledRequest->getId();
}