OpenCart 3.x库存信息问题:删除商品后仓库信息丢失
解决方案:OpenCart 2.3.0.2 库存数据写入order_product及剩余库存更新
1. 将库存与仓库数据写入order_product表
首先需要在order_product表中新增存储库存和仓库的字段,执行以下SQL语句(替换前缀oc_为你的实际数据库前缀):
ALTER TABLE `oc_order_product` ADD `product_stock_quantity` INT(11) NOT NULL DEFAULT '0'; ALTER TABLE `oc_order_product` ADD `warehouse_id` INT(11) NOT NULL DEFAULT '0';
然后修改订单创建逻辑,打开catalog/model/checkout/order.php,找到addOrder方法中插入order_product的代码块,调整为:
// 获取当前商品的实时库存与仓库信息 $stock_query = $this->db->query("SELECT quantity, warehouse_id FROM " . DB_PREFIX . "stock WHERE product_id = " . (int)$product['product_id'] . " LIMIT 1"); $current_stock = $stock_query->num_rows ? $stock_query->row['quantity'] : 0; $warehouse_id = $stock_query->num_rows ? $stock_query->row['warehouse_id'] : 0; // 插入订单商品时携带库存与仓库数据 $this->db->query("INSERT INTO " . DB_PREFIX . "order_product SET order_id = '" . (int)$order_id . "', product_id = '" . (int)$product['product_id'] . "', name = '" . $this->db->escape($product['name']) . "', model = '" . $this->db->escape($product['model']) . "', quantity = '" . (int)$product['quantity'] . "', price = '" . (float)$product['price'] . "', total = '" . (float)$product['total'] . "', tax = '" . (float)$product['tax'] . "', reward = '" . (int)$product['reward'] . "', product_stock_quantity = '" . (int)$current_stock . "', warehouse_id = '" . (int)$warehouse_id . "'");
2. 更新剩余库存到数据库
当订单状态变更为需要扣减库存的状态(比如“已完成”)时,修改库存更新逻辑。在catalog/model/checkout/order.php的addOrderHistory方法中,找到订单状态判断的代码块,添加以下逻辑:
if ($order_status_id) { // 获取订单关联的所有商品 $order_products = $this->db->query("SELECT op.product_id, op.quantity, op.warehouse_id FROM " . DB_PREFIX . "order_product op WHERE op.order_id = " . (int)$order_id); foreach ($order_products->rows as $item) { // 扣减对应仓库的库存 $this->db->query("UPDATE " . DB_PREFIX . "stock SET quantity = quantity - " . (int)$item['quantity'] . " WHERE product_id = " . (int)$item['product_id'] . " AND warehouse_id = " . (int)$item['warehouse_id']); // 若使用单库存模式(无多仓库),替换为更新product表的库存字段 // $this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = quantity - " . (int)$item['quantity'] . " WHERE product_id = " . (int)$item['product_id']); } }
3. 解决删除商品时仓库信息丢失的问题
默认删除商品时,OpenCart会同步删除关联的库存记录,导致仓库信息丢失。修改admin/model/catalog/product.php中的deleteProduct方法,找到并注释掉删除库存的语句:
// 注释掉默认的库存删除逻辑,保留仓库与库存数据 // $this->db->query("DELETE FROM " . DB_PREFIX . "stock WHERE product_id = '" . (int)$product_id . "'");
如果需要标记库存为已删除而非保留,可以先给stock表添加deleted字段(TINYINT类型),再替换为:
$this->db->query("UPDATE " . DB_PREFIX . "stock SET deleted = 1 WHERE product_id = '" . (int)$product_id . "'");
内容的提问来源于stack exchange,提问作者Ivan Nikolaev
相关产品推荐
相关产品推荐

