后台显示 Table Rate CSV 导入完成,结账页却没有任何报价。导入成功只说明文件能被解析,是否命中还取决于 Website Scope、Condition、地址、重量或订单金额以及 CSV 中的国家地区代码。

先固定复现条件和影响范围

固定一个 Quote,记录 website、目的国家、region_id、邮编、包裹重量、含税和未税金额。导出同一网站当前配置作为模板,不要凭记忆自行拼表头。

php bin/magento config:show carriers/tablerate/active --scope=websites --scope-code=base
php bin/magento config:show carriers/tablerate/condition_name --scope=websites --scope-code=base
SELECT dest_country_id,dest_region_id,dest_zip,condition_name,condition_value,price,cost
FROM shipping_tablerate ORDER BY pk DESC LIMIT 30;
SELECT country_id,region_id,postcode,weight,subtotal,base_subtotal
FROM quote_address WHERE quote_id=12345 AND address_type='shipping';

根据证据分支定位

表中没有目标 website 的记录,说明导入时作用域错误;有记录但国家或地区不符,检查 ISO 国家代码与 region_id;地址匹配而 condition_value 不匹配,则核对 Package Weight、Order Subtotal 等条件口径和虚拟商品。邮编通配规则应按实际实现测试,不能假设星号支持任意位置。

修复时保留回滚路径

在正确 Website Scope 重新导入由系统导出的模板,只保留一条可验证规则作为小样本。确认命中后再分批加入区间和地区;不要直接复制 shipping_tablerate 行到另一网站,因为 website_id、地区与条件可能不同。

上线验收

测试同城邮编、边界重量、边界金额、不允许国家和虚拟购物车。购物车估算、结账重新计算与最终订单运费必须一致,切换地址后旧 rate 不得残留。

生产环境操作前的检查

处理“Magento 2 Table Rate 导入成功却没有运费”前,先记录 Magento 版本、部署模式、问题 Store View、复现时间和最近一次发布。所有 SQL 默认先执行 SELECT;任何写操作、目录清理或配置切换都应确认影响范围、保留备份并准备回滚。多节点环境要核对各节点代码版本、app/etc/env.php 配置摘要与流量分布。

php bin/magento --version
php bin/magento deploy:mode:show
php bin/magento maintenance:status
php bin/magento indexer:status
php bin/magento cache:status

命令应由 Magento 文件所有者在项目根目录执行。不要在生产高峰同时运行全量索引、静态部署和数据修复;涉及客户、支付、税费或订单的改动,先在脱敏数据副本验证。

建立可比较的排查记录

每次实验只改变一个变量,记录操作前值、命令、开始与结束时间、结果和回滚方式。准备一个正常对象与一个异常对象对照;若旧对象恢复而新对象仍能复现,说明根因尚未消除。

检查层需要保存的证据通过标准
入口层 URL、状态码、请求 ID、节点 路由和协议一致
应用层 异常堆栈、模块、作用域 无新异常且可重复
数据层 主键、时间、关联行数 关系完整且无重复副作用
业务层 正常、失败、重试路径 最终结果一致

修复后的观察窗口

上线后至少观察一轮 Cron、队列和索引周期,并在两台节点、无痕浏览器和目标 Store View 重复验证。临时调试日志必须脱敏,确认错误率、响应时间和数据量稳定后及时关闭。