Разве расчет правил в каталоге не должен всегда происходить за 3 дня заранее?
-
16-10-2019 - |
Вопрос
У нас есть простое правило цены каталога, которое является действительным на неопределенный срок.
В нашем канале для покупок в Google, который генерируется в полночь, правило цены не применяется.
Моя теория заключается в том, что существуют небольшие временные рамки, где рассчитанные цены недоступны.
я проверил catalogrule_product_price
- Кажется, есть только цены, рассчитанные до сегодняшнего дня (2013-04-22
), поэтому они истекают в полночь:
mysql> select distinct rule_date from catalogrule_product_price; +------------+ | rule_date | +------------+ | 2013-04-20 | | 2013-04-21 | | 2013-04-22 | +------------+ 3 rows in set (0.05 sec)
Это нормально?cron_schedule
имеет недавние записи, поэтому я думаю, что система Cron обычно работает.
Я имел в виду, что правила цен всегда генерируются за несколько дней заранее, просто чтобы избежать такого времени с неправильными ценами - я ошибался с этим предположением? Что здесь происходит?
РЕДАКТИРОВАТЬ: Проверьте это снова сегодня (2013-04-25
) - та же проблема. Хотел бы я проверить его вчера, чтобы увидеть, также 23., 24. и 25. Где существующие и поэтому цены генерируются всегда в пучках или дереве, если цены всегда генерируются до сегодняшнего дня и трех дней назад.
mysql> select distinct rule_date from catalogrule_product_price; +------------+ | rule_date | +------------+ | 2013-04-23 | | 2013-04-24 | | 2013-04-25 | +------------+ 3 rows in set (0.00 sec)
Решение
Нет.
Работа Cron вызывает метод наблюдателя Mage_CatalogRule_Model_Observer::dailyCatalogUpdate()
. Анкет Это звонит Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange()
без аргументов.
Если applyAllRulesForDateRange()
вызывается без аргументов, предполагается один день +/- текущая дата.
Так что вы Можно Создайте новые или старые даты, но ночная работа Cron - нет.
Другие советы
Я трачу когда -нибудь, чтобы понять это :)
И сценарий рассчитывает цены на текущий день, предыдущий день а также следующий день.
В котором обновления включают интервал 3 дня [в Magento 2.2.x
- Текущий день - за 1 день до + 1 дня после
Ежедневное правило ценовой ценой ежедневного обновления от Cron
/vendor/magento/module-catalog-rule/cron/dailycatalogupdate.php
- Обновление включает интервал 3 дня - текущий день - за 1 день до + 1 дня после
- Этот метод вызывается из процесса Cron, Cron работает во время UTC и
- Мы должны генерировать данные для интервала -1 дня ... +1 день
Цены на продукты Reindex в соответствии с настройками правила.
/vendor/magento/module-catalog-rule/model/indexer/reindexruleproductprice.php
public function execute(
$batchCount,
\Magento\Catalog\Model\Product $product = null,
$useAdditionalTable = false
) {
$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);
/**
* Update products rules prices per each website separately
* because of max join limit in mysql
*/
-
-
-
$ruleData['from_time'] = $this->roundTime($ruleData['from_time']);
$ruleData['to_time'] = $this->roundTime($ruleData['to_time']);
/**
* Build prices for each day
*/
for ($time = $fromDate; $time <= $toDate; $time += IndexBuilder::SECONDS_IN_DAY) {
if (($ruleData['from_time'] == 0 ||
$time >= $ruleData['from_time']) && ($ruleData['to_time'] == 0 ||
$time <= $ruleData['to_time'])
) {
$priceKey = $time . '_' . $productKey;
if (isset($stopFlags[$priceKey])) {
continue;
}
if (!isset($dayPrices[$priceKey])) {
$dayPrices[$priceKey] = [
'rule_date' => $time,
'website_id' => $ruleData['website_id'],
'customer_group_id' => $ruleData['customer_group_id'],
'product_id' => $ruleProductId,
'rule_price' => $this->productPriceCalculator->calculate($ruleData),
'latest_start_date' => $ruleData['from_time'],
'earliest_end_date' => $ruleData['to_time'],
];
} else {
$dayPrices[$priceKey]['rule_price'] = $this->productPriceCalculator->calculate(
$ruleData,
$dayPrices[$priceKey]
);
$dayPrices[$priceKey]['latest_start_date'] = max(
$dayPrices[$priceKey]['latest_start_date'],
$ruleData['from_time']
);
$dayPrices[$priceKey]['earliest_end_date'] = min(
$dayPrices[$priceKey]['earliest_end_date'],
$ruleData['to_time']
);
}
if ($ruleData['action_stop']) {
$stopFlags[$priceKey] = true;
}
}
}
Итак, продолжительность расчета
$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);
В Magento 1.x это ошибка происходит, если вы живете в часовом поясе, который составляет более +01: 00 от GMT. Cronjob по умолчанию работает в 01:00 и использует время GMT, чтобы установить rule_date. В указанном случае дата будет «вчера», так что для текущего дня не будет правила цены.
Пример:
Current Datetime: 2017-07-19 01:00:00 (at current timezone)
Current Datetime at GMT: 2017-07-18 23:00:00
At 01:00 cronjob runs to write price rules with "$coreDate->gmtTimestamp('Today');"
Function will return "2017-07-18" which in this example is "yesterday"
Решение в 2.2.x
/vendor/magento/module-catalog-rule/model/indexer/indexbuilder.php
$fromTime = strtotime($rule->getFromDate());
$toTime = strtotime($rule->getToDate());
$toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;
использованная литература