EC-CUBE3.0.14
管理画面の受注マスターから受注情報を更新すると、購入回数と購入金額を更新する処理が走るのですが、情報を取得するSQLがおかしいと思われます。
たとえば次のように3回の購入があった場合、購入回数は3、購入金額は6000となるはずですが、購入回数は1、購入金額は1000となってしまいます。
order_id total
注文ID 購入金額
101 1000
102 2000
103 3000
発行されるSQLをdumpしてみたところ、次のようになっていました。
SELECT
COUNT(o.order_id) AS buy_times,
SUM(o.total) AS buy_total
FROM
dtb_order o
WHERE
o.customer_id = xxxx -- 会員ID
AND o.status in(1,2,4,5,6)
GROUP BY
o.order_id
ORDER BY
o.order_id ASC
SQLの実行結果は次のとおりです。
■想定している結果
buy_times buy_total
3 6000
■実際の結果
buy_times buy_total
1 1000
1 2000
1 3000
この結果の 0 番目のデータで更新しているため、購入回数は1、購入金額は1000となっているようです。
SQL文中の GROUP BY で o.order_id はグルーピングできないため、 o.customer_id の間違いと思われます。
src/Eccube/Repository/CustomerRepository.php
/**
* 会員の初回購入時間、購入時間、購入回数、購入金額を更新する
*
* @param $app
* @param Customer $Customer
* @param $orderStatusId
*/
public function updateBuyData($app, Customer $Customer, $orderStatusId)
{
// 会員の場合、初回購入時間・購入時間・購入回数・購入金額を更新
$arr = array($app['config']['order_new'],
$app['config']['order_pay_wait'],
$app['config']['order_back_order'],
$app['config']['order_deliv'],
$app['config']['order_pre_end'],
);
$result = $app['eccube.repository.order']->getCustomerCount($Customer, $arr);
if (!empty($result)) {
$data = $result[0];
$now = new \DateTime();
$firstBuyDate = $Customer->getFirstBuyDate();
if (empty($firstBuyDate)) {
$Customer->setFirstBuyDate($now);
}
if ($orderStatusId == $app['config']['order_cancel'] ||
$orderStatusId == $app['config']['order_pending'] ||
$orderStatusId == $app['config']['order_processing']) {
// キャンセル、決済処理中、購入処理中は購入時間は更新しない
} else {
$Customer->setLastBuyDate($now);
}
$Customer->setBuyTimes($data['buy_times']);
$Customer->setBuyTotal($data['buy_total']);
} else {
// 受注データが存在しなければ初期化
$Customer->setFirstBuyDate(null);
$Customer->setLastBuyDate(null);
$Customer->setBuyTimes(0);
$Customer->setBuyTotal(0);
}
$app['orm.em']->persist($Customer);
$app['orm.em']->flush();
}
src/Eccube/Repository/OrderRepository.php
/**
* 会員の合計購入金額を取得、回数を取得
*
* @param \Eccube\Entity\Customer $Customer
* @param array $OrderStatuses
* @return QueryBuilder
*/
public function getCustomerCount(\Eccube\Entity\Customer $Customer, array $OrderStatuses)
{
$result = $this->createQueryBuilder('o')
->select('COUNT(o.id) AS buy_times, SUM(o.total) AS buy_total')
->where('o.Customer = :Customer')
->andWhere('o.OrderStatus in (:OrderStatuses)')
->setParameter('Customer', $Customer)
->setParameter('OrderStatuses', $OrderStatuses)
->groupBy('o.id') // ★ ->groupBy('o.Customer') が正解
->orderBy('o.id', 'ASC')
->getQuery()
->getResult();
return $result;
}
----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。