カタログ価格ルールの計算は常に3日前に行われるべきではありませんか?


7

無期限に有効なシンプルなカタログ価格ルールがあります。

午前0時に生成されるGoogleショッピングフィードでは、価格ルールは適用されません。

私の理論では、計算された価格が利用できない短い時間枠があります。

私はチェックしましたcatalogrule_product_price-今日まで計算された価格のみがあるようです(2013-04-22)ので、それらは真夜中に期限切れになります:

mysql> catalogrule_product_priceから個別のrule_dateを選択します。
+ ------------ +
| rule_date |
+ ------------ +
| 2013-04-20 |
| 2013-04-21 |
| 2013-04-22 |
+ ------------ +
セットの3行(0.05秒)

これは正常ですか? cron_schedule最近のエントリがあるので、cronシステムは一般的に実行されていると思います。

価格ルールは常に間違った価格でそのような期間を回避するために、数日前に生成されることを念頭に置いていました-この仮定は間違っていましたか?ここで何が起こっているのですか?

編集:今日もチェックしました(2013-04-25)-同じ問題。昨日チェックして、23、24もチェックしたいです。25.既存の場合、価格は常に束またはツリーで生成されます。価格は常に今日まで、および3日前まで生成されます。

mysql> catalogrule_product_priceから個別のrule_dateを選択します。
+ ------------ +
| rule_date |
+ ------------ +
| 2013-04-23 |
| 2013-04-24 |
| 2013-04-25 |
+ ------------ +
セットの3行(0.00秒)

同じGoogleショッピング関連のコンテキストで同じ問題があります。解決策は見つかりましたか?私にとっては、今日と明日の価格を計算するだけで十分です。
Gianluigi Zane Zanettini博士

1
ええ、これを理解するためにいつか費やし、スクリプトは当日、前日、翌日の価格を計算します。そのうち、更新には3日-現在の日-1日前+ 1日後の間隔が含まれます
Aditya Shah

間隔-1日... +1日のデータを生成するもの
Aditya Shah

回答:


6

番号。

cronジョブはオブザーバーメソッドを呼び出しますMage_CatalogRule_Model_Observer::dailyCatalogUpdate()。これはMage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange()引数なしで呼び出します。

applyAllRulesForDateRange()が引数なしで呼び出された場合、1日+/-現在の日付と見なされます。

したがって、新しい日付または古い日付を作成できますが、毎晩のcronジョブは作成できません。


したがって、毎晩のcronジョブが呼び出されたとき、それはまだUTCで2013-04-24であり、23および25を生成します。これは混乱です。
Alex

価格が間違っている小さなタイムスパンがあることを私はかなり確信していることを意味します...
アレックス

なぜカタログ価格ルール計算のcronジョブを午後11時に移動しないのですか?Aoe_Schedulerこれにはモジュールを使用できます。この場合、Googleショッピングのフィード生成cronは常に適切な価格を選択します。
Dmytro Zavalkin 2013

6

私はいつかこれを理解するのに費やします:)

そして、のスクリプト計算の価格、当日前日翌日

更新には3日の間隔が含まれます(Magento 2.2.Xの場合)

  • 当日-1日前+翌1日

cronによるカタログ価格ルールの毎日の更新

/vendor/magento/module-catalog-rule/Cron/DailyCatalogUpdate.php

  • 更新には、3日-現在の日-1日前+ 1日後の間隔が含まれます
  • このメソッドはcronプロセスから呼び出され、cronはUTC時間で動作し、
  • 間隔-1日... +1日のデータを生成する必要があります

ルール設定に従って製品価格のインデックスを再作成します。

/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では、GMTから+01:00を超えるタイムゾーンに住んでいる場合にこのバグが発生します。デフォルトの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;

参考文献

  1. http://www.divisionlab.com/solvingmagento/magento-catalog-price-rules/
  2. https://github.com/magento/magento2/issues/6610
  3. https://ipfs-sec.stackexchange.cloudflare-ipfs.com/magento/A/question/3161.html
  4. https://support.google.com/merchants/answer/6069284?hl=en

1
これはそれのように見えます!私は確かに現在GMT + 2にいます(私は通常GMT + 1にいますが、夏時間が有効になっています)。今は休暇中ですが、明日は事務所に戻ってこれを試してみます。
Gianluigi Zane Zanettini博士

そうです、サーバーのタイムゾーンとアプリケーションのタイムゾーンを確認してください。ただし、Magentoは内部で管理しています。
Aditya Shah

1
これが本当に問題であることを確認できます。私はこれでこれを修正しましたgithub.com/Chuvisco88/Chuvisco_CatalogRuleFixご協力いただきありがとうございます。賞金をお楽しみください:-)
Dr. Gianluigi Zane Zanettini

1
驚くばかり!私はそこにタイムゾーンの問題があることを知っていました:)
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.