Non dovrebbe catalogare prezzo regola di calcolo sempre accade 3 giorni di anticipo?
-
16-10-2019 - |
Domanda
Abbiamo catalogo semplice regola prezzo che è valida a tempo indeterminato.
Nel nostro feed di Google Shopping che è generato a mezzanotte, non si applica la regola di prezzo.
La mia teoria è che c'è un piccolo lasso di tempo, in cui i prezzi calcolati non sono disponibili.
Ho controllato catalogrule_product_price
- sembra che ci siano solo i prezzi calcolati fino ad oggi (2013-04-22
), in modo che sarebbe scade alla mezzanotte:
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)
E 'normale?
cron_schedule
ha voci recenti e quindi penso che il sistema cron è generalmente in esecuzione.
ho avuto in mente, che le regole di prezzo sono sempre generati diversi giorni di anticipo, proprio per evitare tali intervalli di tempo con prezzi sbagliati - ero sbagliato in questa ipotesi? Che cosa sta succedendo qui?
EDIT: controllato di nuovo oggi (2013-04-25
) - lo stesso problema.
Vorrei controllato ieri per vedere se anche 23., 24. e 25. Laddove esistono e quindi i prezzi sono generati sempre in mazzi o albero di se i prezzi sono sempre generati fino ad oggi e tre giorni di nuovo.
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)
Soluzione
No.
Il processo di cron chiama il metodo osservatore Mage_CatalogRule_Model_Observer::dailyCatalogUpdate()
. Questo si chiama Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange()
senza argomenti.
Se applyAllRulesForDateRange()
viene chiamato senza argomenti, un giorno +/- è assunto la data corrente.
può creare date più recenti o meno recenti, ma il processo di cron notte non lo fa.
Altri suggerimenti
I trascorrere del tempo prima di capire questo :)
E i prezzi Calcolare script per il giorno corrente , il giorno precedente e il giorno successivo .
In cui, aggiornamenti includono intervallo di 3 giorni [in Magento 2.2.X]
- attuale giorno - 1 giorni prima + 1 giorno dopo
Aggiornamento quotidiano regola prezzo di catalogo da cron
/vendor/magento/module-catalog-rule/Cron/DailyCatalogUpdate.php
- Aggiornamento includono intervallo di 3 giorni - giorno corrente - 1 giorni prima + 1 giorni dopo
- Questo metodo viene chiamato dal processo di cron, cron sta lavorando in ora UTC e
- ci dovrebbe generare dati per intervallo -1 giorno ... 1 giorno
Reindicizza prezzi dei prodotti secondo le impostazioni delle regole.
/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;
}
}
}
Quindi, la durata di calcolo
$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);
In Magento 1.X questo bug si verifica se si vive in un fuso orario è più di 01: 00 da GMT. Il cronjob di default è in esecuzione alle 01:00 e sta usando ora GMT per impostare la rule_date. In tale caso la data sarà essere "ieri" così non ci sarebbe alcuna regola del prezzo per il giorno corrente.
Esempio:
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"
Soluzione in 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;
Riferimenti