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