huhai Posted October 14, 2010 Share Posted October 14, 2010 天,发现prestashop1.3.1(其它版本不知道是不是也一样)一个很奇怪的问题,在调用畅销产品这个Block的时候,发现销售数量对不上.我查了一下product_sale表,然后打开一个商品页我在后台设置商品总数为100位,然后,我在前台下了一个单,到后台发货,最后在product_sale表中得到以下结果:id_product quantity sale_nbr date_upd11 90 1 2010-10-09接着,我再下了一个单,同样是10个商品,得到的结果如下:id_product quantity sale_nbr date_upd11 170 2 2010-10-09这就让我感觉对不上了,商品总数是100,怎么会出来一个170呢。购买的数量怎么会超过商品的库存呢。我顺着代码找到了添加销售额的函数static public function addProductSale($product_id, $qty = 1){return Db::getInstance()->Execute(' INSERT INTO '._DB_PREFIX_.'product_sale (`id_product`, `quantity`, `sale_nbr`, `date_upd`) VALUES ('.intval($product_id).', '.intval($qty).', 1, NOW()) ON DUPLICATE KEY UPDATE `quantity` = `quantity` + '.intval($qty).', `sale_nbr` = `sale_nbr` + 1, `date_upd` = NOW()');}可以看到,函数是没有错,如果还没有购买则插入新记录,添加购买的产品数量。如果存在,则用原来的销售额加上当前的。这函数是没有错的,那应该就是传进来的参数有问题了.更新销售额需要点发货,那么,肯定在后台定单页面执行了这个操作。操作定单是调用了OrderHistory.php这个文件里面有一个changeIdOrderState() 方法。首先,我说一个,过程,在操作定单的时候,系统会根据当前的定单号(order_id)找到购物车id(cart_id),再由购物车ID找出购物车里面的产品.购物车查找产品调用了这个方法$cart->getProducts();你可以跟踪代码到classes/Cart.php找到这个方法,找到它的sql语句,语句很长,我这里取几个重要的字段$sql = 'SELECT cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, pl.`name`,p.`quantity`, p.`price`,....FROM `'._DB_PREFIX_.'cart_product` cpLEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`....明显,这里销售总额应该是cart_quantity这个才对。回到OrderHistroy.php找到changeIdOrderState()/* If becoming logable => adding sale */if ($newOS->logable AND (!$oldOrderStatus OR !$oldOrderStatus->logable)) ProductSale::addProductSale($product['id_product'], $product['quantity']);/* If becoming unlogable => removing sale */elseif (!$newOS->logable AND ($oldOrderStatus AND $oldOrderStatus->logable)) ProductSale::removeProductSale($product['id_product'], $product['quantity']);不难看出,开发者,在这里操作销售总额的时候,调用的是库存数量,而不是销售的数量,所以问题出现了.解决方案。把 $product['quantity'])改成 $product['cart_quantity'])原文地址:http://www.b2cpress.com/archives/182 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now