4

在 Magento 中使用信用卡/借记卡下订单时出现以下错误:

Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '282-189' for key 2

我无法获得确切的跟踪,因为它只是不想向我展示,但是,我已经将其追溯到app/code/core/Mage/Checkout/controllers/OnepageController.php在线501(未经编辑)。确切的行是:

$this->getOnepage()->saveOrder();

现在,逻辑告诉我,这只是两个订单在尝试添加订单时具有相同的键,还是我完全错了?

无论如何,除此之外,解决这个问题的最佳方法是什么?我曾想过导出订单,将它们全部删除,然后重新导入它们,但我觉得它行不通。

我正在使用 Magento 1.6.2.0

编辑:我刚刚意识到,如果我发现哪个表未通过完整性检查,我可能会清空该表(取决于它是哪个表),这会自行修复吗?关于如何找出哪个表搞砸的任何想法?

EDIT2:所以在 Oğuz Çelikdemir 的回答之后,事实证明以下是罪魁祸首:

2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)
2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)

显然不能插入两个相同的tax_id。有人知道如何解决吗?

4

3 回答 3

3

截断下log表。为了保护自己,请从 CONSOLE 进行备份,而不是在 Magento 中。

TRUNCATE `log_customer`;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
TRUNCATE `log_quote`;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
TRUNCATE `log_summary`;
ALTER TABLE `log_summary` AUTO_INCREMENT=1;
TRUNCATE `log_visitor_info`;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
TRUNCATE `log_url`;
ALTER TABLE `log_url` AUTO_INCREMENT=1;
TRUNCATE `log_url_info`;
ALTER TABLE `log_url_info` AUTO_INCREMENT=1;
TRUNCATE `log_visitor`;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
TRUNCATE `report_event`;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
TRUNCATE `log_summary_type`;
ALTER TABLE `log_summary_type` AUTO_INCREMENT=1;

编辑: 对于 SQL 调试,打开/lib/Varien/Db/Adapter/Pdo/Mysql.php文件并找到protected $_debug. 默认状态应该是false,更改为true

之后,日志文件应该在var/debug/sql.txt

另外,拿这个stackoverflow ansver How do I print all the queries in Magento?

编辑 2: 所以,这是您处理销售项目税的文件。 app/code/core/Mage/Tax/Model/Observer/Observer.php

# Line 144 ( Magento 1.6 edition )
Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();

这是调用sales_order_tax_item模型。

app/core/Mage/Tax/Model/Resource/Sales/Order/Tax/Itemp.php

# Line 51
public function getTaxItemsByItemId($item_id)
{
    $adapter = $this->_getReadAdapter();
    $select = $adapter->select()
        ->from(array('item' => $this->getTable('tax/sales_order_tax_item')), array('tax_id', 'tax_percent'))
        ->join(
            array('tax' => $this->getTable('tax/sales_order_tax')),
            'item.tax_id = tax.tax_id',
            array('title', 'percent', 'base_amount')
        )
        ->where('item_id = ?', $item_id);

    return $adapter->fetchAll($select);
}

这是从观察者调用的函数。所以,你现在能做什么,只需在 Observer 或 Function 上添加一个断点并查看调试器输出。为什么要两次调用这个函数!

于 2012-03-14T06:39:58.207 回答
2

我发现了一个快速肮脏的黑客。我会尝试将此作为错误发布给开发人员。打开文件app/code/core/Mmage/Tax/Model/Observer.php并转到第 132 行。在该语句中有一个if($item)语句,将代码包装在此周围:

$define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
if(!defined($define) || constant($define) != true) {
            // code
    define($define, true);
}

例子:

if (isset($ratesIdQuoteItemId[$id])) {
    foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) {
        if ($quoteItemId['code'] == $tax['code']) {
            $item = $order->getItemByQuoteItemId($quoteItemId['id']);
            if ($item) {
                $define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
                if(!defined($define) || constant($define) != true) {
                    $data = array(
                        'item_id'       => $item->getId(),
                        'tax_id'        => $result->getTaxId(),
                        'tax_percent'   => $quoteItemId['percent']
                    );
                    Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
                    define($define, true);
                }
            }
        }
    }
}
于 2012-03-14T15:52:35.537 回答
2

请转到Sales -> Tax -> Manage Tax Rules管理面板中的部分并检查那里的所有记录是否有重复的关系区域类。

在我的情况下,对于具有“应税货物”税类的产品,我在结帐页面上遇到了同样的错误,在税收规则中,我有两个该类别的条目,每个条目都具有相同的税区。因此,系统尝试对产品征收两次相同的税。

于 2012-12-04T13:37:11.057 回答