/** * Transfer sku from one stock (src) to another (dst) * * @param int $src_id * @param int $dst_id * @param int $sku_id * @param int $count * @return boolean */ public function transfer($src_id, $dst_id, $sku_id, $count = null) { $src_id = (int) $src_id; $dst_id = (int) $dst_id; $sku_id = (int) $sku_id; $stock_model = new shopStockModel(); $data = $stock_model->getByField('id', array($src_id, $dst_id), true); if (count($data) < 2) { return false; } // count data $data = $this->query("\n SELECT stock_id, count, product_id\n FROM {$this->table}\n WHERE sku_id = {$sku_id} AND stock_id IN({$src_id}, {$dst_id})")->fetchAll('stock_id', true); $src_count = isset($data[$src_id]) ? $data[$src_id]['count'] : null; $dst_count = isset($data[$dst_id]) ? $data[$dst_id]['count'] : null; if ($dst_count === null) { return true; } $product_id = $data[$dst_id]['product_id']; if ($count === null) { // get all from src if src has numeric count if ($src_count !== null) { $count = $src_count; } } else { if ($src_count !== null) { if ($src_count <= 0) { $count = 0; } else { $count = min((int) $count, $src_count); } } else { $count = (int) $count; } } if (!$count) { return true; } $log_model = new shopProductStocksLogModel(); if (!$this->updateByField(array('sku_id' => $sku_id, 'stock_id' => $src_id), array('count' => $src_count - $count))) { return false; } $log_model->insert(array('product_id' => $product_id, 'sku_id' => $sku_id, 'stock_id' => $src_id, 'before_count' => $src_count, 'after_count' => $src_count - $count, 'diff_count' => -$count)); if (!$this->updateByField(array('sku_id' => $sku_id, 'stock_id' => $dst_id), array('count' => $dst_count + $count))) { return false; } $log_model->add(array('product_id' => $product_id, 'sku_id' => $sku_id, 'stock_id' => $dst_id, 'before_count' => $dst_count, 'after_count' => $dst_count + $count, 'diff_count' => $count)); return true; }
public function updateStockCount($data) { if (!$data) { return; } $product_skus_model = new shopProductSkusModel(); $product_stocks_model = new shopProductStocksModel(); $stocks_log_model = new shopProductStocksLogModel(); $sku_ids = array_map('intval', array_keys($data)); if (!$sku_ids) { return; } $skus = $product_skus_model->select('id,product_id')->where("id IN(" . implode(',', $sku_ids) . ")")->fetchAll('id'); $sku_ids = array_keys($skus); if (!$sku_ids) { return; } $product_ids = array(); foreach ($data as $sku_id => $sku_stock) { $sku_id = (int) $sku_id; if (!isset($skus[$sku_id]['product_id'])) { continue; } $product_id = $skus[$sku_id]['product_id']; foreach ($sku_stock as $stock_id => $count) { $stock_id = (int) $stock_id; if ($stock_id) { $item = $product_stocks_model->getByField(array('sku_id' => $sku_id, 'stock_id' => $stock_id)); if (!$item) { continue; } $product_stocks_model->set(array('sku_id' => $sku_id, 'product_id' => $product_id, 'stock_id' => $stock_id, 'count' => $item['count'] + $count)); } else { $old_count = $product_skus_model->select('count')->where('id=i:sku_id', array('sku_id' => $sku_id))->fetchField(); if ($old_count !== null) { $log_data = array('product_id' => $product_id, 'sku_id' => $sku_id, 'before_count' => $old_count, 'after_count' => $old_count + $count, 'diff_count' => $count); $stocks_log_model->insert($log_data); } $this->exec("UPDATE `shop_product_skus` SET count = count + ({$count})\n WHERE id = {$sku_id}"); } if (isset($skus[$sku_id]['product_id'])) { $product_ids[] = $product_id; } } } if (!$product_ids) { return; } // correct sku counters $sql = "\n UPDATE `shop_product_skus` sk JOIN (\n SELECT sk.id, SUM(st.count) AS count FROM `shop_product_skus` sk\n JOIN `shop_product_stocks` st ON sk.id = st.sku_id\n WHERE sk.id IN(" . implode(',', $sku_ids) . ")\n GROUP BY sk.id\n ORDER BY sk.id\n ) r ON sk.id = r.id\n SET sk.count = r.count\n WHERE sk.count IS NOT NULL"; $this->exec($sql); // correct product counters $sql = "\n UPDATE `shop_product` p JOIN (\n SELECT p.id, SUM(sk.count) AS count FROM `shop_product` p\n JOIN `shop_product_skus` sk ON p.id = sk.product_id\n WHERE p.id IN(" . implode(',', array_unique($product_ids)) . ") AND sk.available = 1\n GROUP BY p.id\n ORDER BY p.id\n ) r ON p.id = r.id\n SET p.count = r.count\n WHERE p.count IS NOT NULL"; $this->exec($sql); }