Jump to content

Prestashop 1.3.1畅销产品统计BUG


huhai

Recommended Posts

天,发现prestashop1.3.1(其它版本不知道是不是也一样)一个很奇怪的问题,
在调用畅销产品这个Block的时候,发现销售数量对不上.
我查了一下product_sale表,然后打开一个商品页
我在后台设置商品总数为100位,
然后,我在前台下了一个单,到后台发货,
最后在product_sale表中得到以下结果:

id_product quantity sale_nbr date_upd
11 90 1 2010-10-09
接着,我再下了一个单,同样是10个商品,得到的结果如下:

id_product quantity sale_nbr date_upd
11 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` cp
LEFT 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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...