- Модуль: 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();
}