- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/product2product.php
- Класс: BitrixSaleInternalsProduct2ProductTable
- Вызов: Product2ProductTable::addProductsByAgent
static function addProductsByAgent($limit = 100)
{
$limit = (int)$limit;
$connection = MainApplication::getConnection();
$type = $connection->getType();
$isTableExists = $connection->isTableExists('b_sale_order_product_stat');
if ($type == "mysql" && $isTableExists)
{
$params = array(
"filter" => array("PRODUCTS_ADDED" => 'N'),
"select" => array("ORDER_ID")
);
if ($limit > 0)
{
$params['limit'] = $limit;
}
$orderIds = array();
$processingData = SaleOrderProcessingTable::getList($params);
while ($processingOrder = $processingData->fetch())
{
$orderIds[] = (int)$processingOrder['ORDER_ID'];
}
if (!empty($orderIds))
{
$sqlOrderIds = implode(',', $orderIds);
SaleOrderProcessingTable::markProductsAddedByList($orderIds);
$sqlInsert = "
INSERT INTO b_sale_order_product_stat (CNT, PRODUCT_ID, RELATED_PRODUCT_ID, ORDER_DATE)
SELECT SUMM, PRODUCT_ID, PARENT_PRODUCT_ID, TODAY
FROM (
SELECT COUNT(1) as SUMM,
b.PRODUCT_ID as PRODUCT_ID,
b1.PRODUCT_ID as PARENT_PRODUCT_ID,
CURDATE() as TODAY
FROM b_sale_basket b, b_sale_basket b1
WHERE
b1.ORDER_ID = b.ORDER_ID
AND b1.ID <> b.ID
AND b.ORDER_ID IN ($sqlOrderIds)
GROUP BY b.PRODUCT_ID, b1.PRODUCT_ID
ORDER BY NULL
) cacl
ON DUPLICATE KEY UPDATE CNT = CNT + cacl.SUMM;";
$connection->query($sqlInsert);
$sqlUpdate = "
UPDATE b_sale_product2product p2p,
(
SELECT COUNT(1) as CNT,
b.PRODUCT_ID as PRODUCT_ID,
b1.PRODUCT_ID as PARENT_PRODUCT_ID
FROM b_sale_basket b, b_sale_basket b1
WHERE
b1.ORDER_ID = b.ORDER_ID
AND b1.ID <> b.ID
AND b.ORDER_ID IN ($sqlOrderIds)
GROUP BY b.PRODUCT_ID, b1.PRODUCT_ID
ORDER BY NULL
) calc
SET p2p.CNT = p2p.CNT + calc.CNT
WHERE p2p.PRODUCT_ID = calc.PRODUCT_ID AND p2p.PARENT_PRODUCT_ID = calc.PARENT_PRODUCT_ID";
$connection->query($sqlUpdate);
$sqlInsert = "
INSERT INTO b_sale_product2product (PRODUCT_ID, PARENT_PRODUCT_ID, CNT)
SELECT b.PRODUCT_ID, b1.PRODUCT_ID, 1
FROM b_sale_basket b, b_sale_basket b1
WHERE b.ORDER_ID = b1.ORDER_ID AND
b.ORDER_ID IN ($sqlOrderIds) AND
b.ID <> b1.ID AND
NOT EXISTS (SELECT 1 FROM b_sale_product2product d WHERE d.PRODUCT_ID = b.PRODUCT_ID AND d.PARENT_PRODUCT_ID = b1.PRODUCT_ID)";
$connection->query($sqlInsert);
if (defined("BX_COMP_MANAGED_CACHE"))
{
$app = MainApplication::getInstance();
$app->getTaggedCache()->clearByTag('sale_product_buy');
}
}
}
$agentName = "\Bitrix\Sale\Product2ProductTable::addProductsByAgent($limit);";
$agentData = CAgent::GetList(array(), array("NAME" => $agentName, "MODULE_ID" => "sale"));
$agent = $agentData->Fetch();
$processingData = SaleOrderProcessingTable::getList(
array(
"filter" => array("PRODUCTS_ADDED" => 'N')
)
);
if ($processingData->fetch())
{
if ($isTableExists && $agent['ID'] && $agent['ID'] > 60)
{
CAgent::Delete($agent["ID"]);
CAgent::AddAgent("Bitrix\Sale\Product2ProductTable::addProductsByAgent($limit);", "sale", "N", 60, "", "Y");
}
}
else
{
if ($agent['ID'])
{
CAgent::Update($agent["ID"], array("AGENT_INTERVAL" => 60*60*24));
}
}
return $agentName;
}