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 [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
- http://www.divisionlab.com/solvemagento/magento-catalog-price-rules/
- https://github.com/magento/magento2/issues/6610
- https://ipfs-sec.stackexchange.cloudflare-ipfs.com/magento/A/question/3161.html
- https://support.google.com/merchantsals/6069284?hl=vi