Không nên tính toán quy tắc giá danh mục luôn luôn xảy ra trước 3 ngày?


7

Chúng tôi có quy tắc giá danh mục đơn giản mà là hợp lệ vô thời hạn.

Trong nguồn cấp dữ liệu Google Mua sắm của chúng tôi được tạo vào lúc nửa đêm, quy tắc giá không được áp dụng.

Lý thuyết của tôi là, có một khung thời gian nhỏ, trong đó giá tính toán không có sẵn.

Tôi đã kiểm tra catalogrule_product_price- dường như chỉ có giá được tính cho đến hôm nay ( 2013-04-22), vì vậy chúng sẽ hết hạn vào nửa đêm:

mysql chọn rule_date riêng biệt từ catalogrule_product_price;
+ ------------ +
| quy tắc |
+ ------------ +
| 2013-04-20 |
| 2013-04-21 |
| 2013-04-22 |
+ ------------ +
3 hàng trong bộ (0,05 giây)

Điều này có bình thường không? cron_schedulecó các mục gần đây vì vậy tôi nghĩ rằng hệ thống cron thường chạy.

Tôi đã có ý nghĩ rằng các quy tắc giá luôn được tạo ra trước vài ngày, chỉ để tránh những khoảng thời gian như vậy với giá sai - tôi có sai với giả định này không? Chuyện gì đang xảy ra ở đây?

EDIT: đã kiểm tra lại ngày hôm nay ( 2013-04-25) - cùng một vấn đề. Tôi ước tôi đã kiểm tra nó ngày hôm qua để xem nếu cũng 23., 24. và 25. nơi hiện có và do đó, giá luôn được tạo thành bó hoặc cây nếu giá luôn được tạo cho đến ngày hôm nay và ba ngày trở lại.

mysql chọn rule_date riêng biệt từ catalogrule_product_price;
+ ------------ +
| quy tắc |
+ ------------ +
| 2013-04-23 |
| 2013-04-24 |
| 2013-04-25 |
+ ------------ +
3 hàng trong bộ (0,00 giây)

Tôi có cùng một vấn đề trong bối cảnh liên quan đến Google Mua sắm. Bạn đã tìm thấy một giải pháp? Đối với tôi nó là đủ để tính giá cho ngày hôm nay và ngày mai.
Bác sĩ Gianluigi Zane Zanettini

1
Vâng, tôi dành thời gian để hiểu điều này và Kịch bản tính giá cho ngày hiện tại, ngày hôm trước và ngày hôm sau. Trong đó, Cập nhật bao gồm khoảng 3 ngày - ngày hiện tại - 1 ngày trước + 1 ngày sau
Aditya Shah

Tạo dữ liệu cho khoảng -1 ngày ... +1 ngày
Aditya Shah

Câu trả lời:


6

Không.

Công việc cron gọi phương thức quan sát viên Mage_CatalogRule_Model_Observer::dailyCatalogUpdate(). Cái này gọi Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange()mà không tranh luận.

Nếu applyAllRulesForDateRange()được gọi mà không có đối số, một ngày +/- ngày hiện tại được giả sử.

Vì vậy, bạn có thể tạo ngày mới hơn hoặc cũ hơn nhưng công việc cron hàng đêm thì không.


Vì vậy, tôi đoán khi công việc cron hàng đêm được gọi là nó vẫn là 2013-04-24 trong UTC và nó tạo ra 23. và 25.? Đây là một mớ hỗn độn.
Alex

Ý tôi là tôi khá chắc chắn rằng có một khoảng thời gian nhỏ trong đó giá cả bị sai ...
Alex

Tại sao không chuyển công việc tính toán quy tắc giá danh mục sang 11p.m. Bạn có thể sử dụng Aoe_Schedulermô-đun cho việc này. Trong trường hợp này, cron tạo nguồn cấp dữ liệu Google Mua sắm của bạn sẽ luôn chọn đúng giá.
Dmytro Zavalkin

6

Tôi dành thời gian để hiểu điều này :)

Và kịch bản tính giá cho ngày hiện tại , ngày hôm trướcngày hôm sau .

Trong đó, Cập nhật bao gồm khoảng 3 ngày [trong Magento 2.2.X]

  • ngày hiện tại - 1 ngày trước + 1 ngày sau

Cập nhật quy tắc giá danh mục hàng ngày bởi cron

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

  • Cập nhật bao gồm khoảng 3 ngày - ngày hiện tại - 1 ngày trước + 1 ngày sau
  • Phương pháp này được gọi từ quá trình cron, cron đang hoạt động trong thời gian UTC và
  • chúng ta nên tạo dữ liệu cho khoảng -1 ngày ... +1 ngày

Reindex giá sản phẩm theo cài đặt quy tắc.

/vendor/magento/module-catalog-rule/Model/Indexer/ReindexRule SẢNtprice.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;
        }
    }
}

Vì vậy, thời gian tính toán

$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);

Trong Magento 1.X lỗi này xảy ra nếu bạn đang sống trong múi giờ lớn hơn +01: 00 từ GMT. Cronjob mặc định đang chạy lúc 01:00 và đang sử dụng thời gian GMT để đặt rule_date. Trong trường hợp đã nói, ngày sẽ là "ngày hôm qua", do đó sẽ không có quy tắc giá cho ngày hiện tại.

Thí dụ:

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"

Giải pháp trong 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;

Người giới thiệu

  1. http://www.divisionlab.com/solvemagento/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/merchantsals/6069284?hl=vi

1
Điều này có vẻ như nó! Tôi thực sự đang ở GMT + 2 bây giờ (tôi thường ở GMT + 1, nhưng giờ tiết kiệm ánh sáng ban ngày có hiệu lực). Bây giờ tôi đang trong kỳ nghỉ, nhưng ngày mai tôi sẽ quay lại văn phòng và thử nó.
Tiến sĩ Gianluigi Zane Zanettini

Vâng, vui lòng kiểm tra múi giờ máy chủ và múi giờ ứng dụng của bạn, mặc dù Magento quản lý nội bộ.
Aditya Shah

1
Tôi có thể xác nhận rằng đây thực sự là vấn đề. Tôi đã sửa nó bằng github.com/Chuvisco88/Chuvisco_CatalogRuleFix Cảm ơn sự giúp đỡ của bạn, hãy tận hưởng tiền thưởng của bạn :-)
Tiến sĩ Gianluigi Zane Zanettini

1
Tuyệt vời! Tôi biết có một vấn đề múi giờ ở đó :)
Alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.