バージョン選択

フォーラム

メニュー

オンライン状況

33 人のユーザが現在オンラインです。 (23 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 33
もっと...

サイト内検索

質問 > 管理機能 > 受注管理>受注登録で他の商品が削除されてしまう

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
bbkids
投稿日時: 2014/6/20 14:43
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 43
受注管理>受注登録で他の商品が削除されてしまう
EC-CUBEバージョン 2.13.2
(2.13.1にて構築した環境に対し2.13.2差分の変更点を確認上の反映させました。)
PHPバージョン PHP 5.4.25
DBバージョン MySQL 5.5.36
サーバー:Linux
クライアントOS WINDOWS 8
ブラウザ FIREFOX最新版

以前に2.13.1の時に
「受注管理>受注登録でご注文商品の削除ができません」
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=14305&forum=11
という問題があり、確かその時に修正されたハズだったと思っていたのですが、
類似の問題が当方の環境で発生しております。


【不具合内容】
1配送先に1商品受注した注文に対し管理画面「受注管理>受注登録」から商品を追加したり
削除したりできる画面を開き
1.注文対し、新たに別の「商品B」を一つ追加
 →結果、二行目にその商品Bが追加される(問題なし)
2.一行目の「商品A」を別の「商品C」に変更
 →結果、一行目と二行目の商品の順番が入れ替わり一行目には「商品B」、二行目には「商品C」(入れ替わりは問題なし?)
3.二行目の「商品C」を削除
 →結果、一行目の「商品B」が削除されてしまう。(おかしい)


もしかすると当方の2.13.2へのマージミスはかもしれないのですが、おそらく不具合or修正モレではないかと思われます。
このあたりに詳しいかたご確認頂けませんでしょうかでしょうか?
sumida
投稿日時: 2014/6/20 17:12
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
とりあえず調べてみました。
まだ、解決していません。

たぶん、発生条件としては、
(1)受注商品は、規格のない商品(おなべ)
(2)追加した商品は、規格のある商品(アイスクリーム:抹茶)
(3)変更後の商品は、(2)の規格違いの商品(アイスクリーム:チョコ)
ではないのかな〜
(あくまで推測です。)

原因としては、
「商品の追加」において、受注情報の商品(order側)とお届け先の商品(shippment側)の内容に不一致が発生している。
そのため、
画面では、order側を見て、編集操作を行う。
実処理では、shippment側を見て、編集処理を行う。

具体的には、
class/pages/admin/order/LC_Page_Admin_Order_Edit.php
shipmentAddProduct関数

            //届け先に選択商品がない場合
            $objProduct = new SC_Product_Ex();
            $arrAddProductInfo = $objProduct->getDetailAndProductsClass($add_product_class_id);

            $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id][] = $add_product_class_id;
            $arrShipmentProducts['shipment_product_code'][$select_shipping_id][]     = $arrAddProductInfo['product_code'];
            $arrShipmentProducts['shipment_product_name'][$select_shipping_id][]     = $arrAddProductInfo['name'];

// added
            $arrShipmentProducts['shipment_classcategory_name1'][$select_shipping_id][]     = $arrAddProductInfo['classcategory_name1'];
            $arrShipmentProducts['shipment_classcategory_name2'][$select_shipping_id][]     = $arrAddProductInfo['classcategory_name2'];
// added

            $arrShipmentProducts['shipment_price'][$select_shipping_id][]            = $arrAddProductInfo['price02'];
            $arrShipmentProducts['shipment_quantity'][$select_shipping_id][]         = 1;

とすれば良い(商品追加の際、不足情報を追加)と思いましたが、

最初の商品に規格がない(おなべ)と
$arrShipmentProducts['shipment_classcategory_name2'][$select_shipping_id]
に配列要素がありません。
そのため規格ありの商品(アイスクリーム)を追加しても、2番目の配列要素ではなく1番目の配列要素とされ、解決にはいたりませんでした。
bbkids
投稿日時: 2014/6/20 17:33
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 43
Re: 受注管理>受注登録で他の商品が削除されてしまう
sumida 様

以前の2.13.1の時の「受注管理>受注登録でご注文商品の削除ができません」
でもお世話になりました。
この度もいち早く本件に対して解析に取り掛かって頂き本当に有難う御座います。
とても心強いです。

発生条件を試して見たのですが、
規格のない商品だけで、
(1)注文対し、新たに別の「商品B」を一つ追加
 →結果、二行目にその商品Bが追加される(問題なし)
(2)一行目の「商品A」を別の「商品C」に変更
 →結果、一行目と二行目の商品の順番が入れ替わり一行目には「商品B」、二行目には「商品C」(入れ替わりは問題なし?)
(3)二行目の「商品C」を削除
 →結果、一行目の「商品B」が削除されてしまう。(おかしい)
試して見たのですが、同様に問題が発生致しました。

まだ十分に検証できておらず、絶対とは言えないのですがちょっと試した限り
商品の追加、商品の削除、数量の増減、の組合せだけでは現時点で問題は確認できておりません。

上記の様に商品の変更し、その後別商品の追加、削除の組合せでおかしな現象が起きます。

どうぞよろしくお願い致します。
sumida
投稿日時: 2014/6/20 22:33
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
再度、途中経過を見てみました。
商品追加までは良いのですが、商品を変更すると、
受注情報(order側)は、順序が変化します。
お届け先(shippment側)は、順序が変化していないようです。
そのため、並び順に不一致を起こしていることが原因のようです。

追記:

商品を変更('select_product_detail')した場合、
  関数doRegisterProduct内
    関数shipmentEditProduct内
      お届け先の商品情報(shipmment側)は、上書きによって変更される。(関数changeShipmentProducts)
      受注情報(order側)は、変更後の商品(新規のとき)を後ろに追加する。(関数checkInsertOrderProducts)
      受注情報(order側)の変更前の商品(不要なとき)を削除する。(関数checkDeleteProducts)

※注 ここで、各配列内の順序が違ってくる。
shipmment側は、更新により、変更を実現している。
order側は、追加・削除により、変更を実現している。


たぶん、私案として提示していた処理は、画面表示直前に、order側とshipmment側を付き合わせていたのでこの不一致にならなかったものと思われます。


再追記:
原因は上記の通りです。
発生条件は、
(1)受注条件
 (a)お届け先が1口
 (b)商品が2品以上(商品数を n 品とする)
(2)管理画面:受注編集の操作
 (a)1 ~ (n-1) 番目にある商品を新規の商品に変更(変更した商品を m 番目とする)
 (b)m ~ n 番目の商品を削除
bbkids
投稿日時: 2014/6/21 12:54
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 43
Re: 受注管理>受注登録で他の商品が削除されてしまう
sumida 様
経過処理の解析有難う御座います。非常に複雑な処理をしていますね。
sumida様が解析し説明して頂いている内容を追いかけるだけでも複雑すぎて
正直訳分からなくなってしまいます。

ボヤいてもしょうがないですが、こんなに複雑な処理で実装するから問題
が出るんじゃないのって思えてならない程おそろしい処理してますね・・・

確か、2.13.0の時に、チェンジセット23355
にて、shipmment側の表示順序がorder側と同じ順序で表示されるように修正され、
各種処理においてもorder側とshipmment側で不一致が起きないようになったと
思っておりましたが

shipmment側は、更新により、変更を実現している。
order側は、追加・削除により、変更を実現している。

これらにより、それぞれの配列の中身の順序がかわってしまい、またつじつまが
合わなくなってくるんですね。

原因は何となく分かりましたが、処理が複雑すぎて私には手におえません・・・

「注文内容を管理するという」非常に重要な部分な訳で、
LC_Page_Admin_Order_Edit.php の根本的な問題がそろそろ本格的に修正される事を
望みますが
とり急ぎ本件に関してsumida 様が調査し纏めて頂いたものをご参考に
コミッターの方や詳しい方など、どうぞ修正案をお作り頂けないででしょうか?
sumida
投稿日時: 2014/6/21 13:19
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
単純には、修正できないように思えます。

チェンジセット23355は、DBから読み込んだ(修正前の受注情報)ときの順序を変更するものです。
今回は、画面内で「商品の変更」を行った時点では、DBは変更されていないので、
画面遷移の時、受注情報を持ち越しています。
そのため、チェンジセット23355は、無関係の状態にあります。
bbkids
投稿日時: 2014/6/21 14:17
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 43
Re: 受注管理>受注登録で他の商品が削除されてしまう
確かに良く考えると仰る通りですね。
今回は画面遷移時の受注情報の配列の中身の事なので、
DBからの読み込みだ時の順序は、今回とは関係ないですね。

本件はそう単純には修正できないんですね、
「注文内容を管理するという」実運用において使用頻度が多い所なだけに
実に困りました。
商品の変更は直接行わず、
幸い現状問題の出ていない「追加」と「削除」を組合せて使用し
運用回避して当面は凌ぐしかなさそうですね。
(運用回避が出来るので、まだ良しとすべきなのでしょうね。)

ec-cubeをベースに本格的に商用運用されている方は、多々おられると思いますが
このLC_Page_Admin_Order_Edit.phpの処理には皆様は困っていないのものなのでしょうか?
これまでにも
・商品が消せなかったり、
・税率が繁栄されていなかったり
などなど多々致命的な問題がありましたが、もっと大々的に問題となっても良いものだと
思うのですが、今一問題の重要度が低いような気がします。
それとも多くの運用者にとっては、独自カスタマイズ等で該当処理を修正して運用して
おられるので、それほど問題ではないものなのでしょうか。

当方にとっては、LC_Page_Admin_Order_Edit.php 内での処理は、よく致命的な
不具合が見つかりますが、私自身のスキル的には複雑すぎて中々手の付けられない
ブラックボックスで非常に困っております。

sumida
投稿日時: 2014/6/21 16:30
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
強引にやってみました。

内容は、
これまで、order側に追加されるとき、最後尾に追加されていました。
とりあえず、変更した商品の後ろに追加するようにしてみました。
(PHP5.3では、array_spliceという関数があるようですが。)
そして、不要になった商品が後で取り除かれるので、
結果として、入れ替えた格好になります。

LC_Page_Admin_Order_Edit.php

    public function checkInsertOrderProducts(&$objFormParam, $arrProductClassIds, $insert_product_class_id, $arrAddProductInfo)
    {
        if (!$arrProductClassIds || !in_array($insert_product_class_id, $arrProductClassIds)) {
            $arrAddProducts = array();
            $arrTax = SC_Helper_TaxRule_Ex::getTaxRule(0, $insert_product_class_id);

            $arrAddProductInfo['product_name'] = ($arrAddProductInfo['product_name'])
                ? $arrAddProductInfo['product_name']
                : $arrAddProductInfo['name'];

            $arrAddProductInfo['price'] = ($arrAddProductInfo['price'])
                ? $arrAddProductInfo['price']
                : $arrAddProductInfo['price02'];

            $arrAddProductInfo['quantity'] = 1;
            $arrAddProductInfo['tax_rate'] = ($objFormParam->getValue('order_tax_rate') == '')
                ? $arrTax['tax_rate']
                : $objFormParam->getValue('order_tax_rate');

            $arrAddProductInfo['tax_rule'] = ($objFormParam->getValue('order_tax_rule') == '')
                ? $arrTax['tax_rule']
                : $objFormParam->getValue('order_tax_rule');

            foreach ($this->arrProductKeys as $insert_key) {
                $value = $objFormParam->getValue($insert_key);
                $arrAddProducts[$insert_key]   = (is_array($value))? $value: array();
/* changed
                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
changed */
                $arrWorkProducts = array();
                $cnt = 0;
                foreach ($arrAddProducts[$insert_key] as $data) {
                    $arrWorkProducts[] = $data;
                    if ($cnt == $objFormParam->getValue('no')) {
                        $arrWorkProducts[] = $arrAddProductInfo[$insert_key];
                    }
                    $cnt++;
                }
                $arrAddProducts[$insert_key] = $arrWorkProducts;
// changed
            }

            return $arrAddProducts;
        } else {
            //受注商品の数量は、複数配送側の集計で出しているので、重複しても数量を増やさない。
            return null;
        }
    }
bbkids
投稿日時: 2014/6/21 17:30
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 43
Re: 受注管理>受注登録で他の商品が削除されてしまう
sumida 様

ご対応有難う御座いました。
早速ご教授頂いた修正を当て実験してみました。

結果
2アイテムで実験をする限り、問題は修正されたのですが、
2アイテムから3アイテムに商品追加し、変更、削除を数回繰り返していると、
やはり削除指示した商品とは別の商品が削除されてしまうようです。

具体的な再現方法は、まだ確定出来ておりませんが
3アイテムで色々試しておりますと、かなりの確率で再現致します。


sumida
投稿日時: 2014/6/21 17:52
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
「商品の追加」ボタンのときも、この関数を使用していました。
なので、以下のようにしてみました。
ただ、お届け先が複数の場合にどうなるか気にはなりますが。

            foreach ($this->arrProductKeys as $insert_key) {
                $value = $objFormParam->getValue($insert_key);
                $arrAddProducts[$insert_key]   = (is_array($value))? $value: array();
// added
        $product_class_id = $objFormParam->getValue('add_product_class_id');
        if (SC_Utils_Ex::isBlank($product_class_id)) {
                $arrWorkProducts = array();
                $cnt = 0;
                foreach ($arrAddProducts[$insert_key] as $data) {
                    $arrWorkProducts[] = $data;
                    if ($cnt == $objFormParam->getValue('no')) {
                        $arrWorkProducts[] = $arrAddProductInfo[$insert_key];
                    }
                    $cnt++;
                }
                $arrAddProducts[$insert_key] = $arrWorkProducts;
        } else {
// added
                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
// added
        }
// added
            }
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は64,344名です
総投稿数は97,196件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
468
2478
4
nanasess
2088
5
umebius
1649
6
yuh
1612
7
red
1410
8
h_tanaka
1029
9
fukap
907
10
tsuji
863
11
shutta
835
12
tao_s
792
13 ramrun 789
14 karin 657
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.