// 別のページから遷移してきた時に呼び出されるメソッド
 // 画面描画は完了していないのでLoadedメソッドを利用?
 // 参照 : ttps://qiita.com/nagasakulllo/items/0b06ccc66b9fe0909b3f
 protected override void OnNavigatedTo(NavigationEventArgs e)
 {
     if (e.Parameter != null)
     {
         string         parent_jan_code = e.Parameter as string;
         DatabaseAccess db = new DatabaseAccess();
         item = db.Get_Item(parent_jan_code);
     }
 }
 // 登録確定イベント
 private void Registration_Decide_Button_Click(object sender, RoutedEventArgs e)
 {
     Enable_Toggle();
     try
     {
         DatabaseAccess db = new DatabaseAccess();
         // 1件ずつ処理
         foreach (Item regItem in Items)
         {
             if (db.Search_Item(regItem._janCode))
             {
                 // DB上に存在している場合
                 // →既登録されている在庫数を今回追加するデータに加えて上書き
                 // →流れとしては登録データを削除、在庫数他を更新して再登録
                 Item oldItem = db.Get_Item(regItem._janCode);
                 regItem._num += oldItem._num;
                 db.Delete_Item(regItem._janCode);
                 db.Insert_Item(regItem);
                 db.Insert_Operation_Log(StaticParam._mID, "商品在庫更新(JANコード = " + regItem._janCode + ", 商品名 = " + oldItem._itemName + "→" + regItem._itemName + ", 価格 = " + oldItem._price + "→" + regItem._price + ", 在庫数 = " + oldItem._num + "→" + regItem._num + ")");
             }
             else
             {
                 // DB上に存在していない場合
                 // →普通に登録
                 db.Insert_Item(regItem);
                 db.Insert_Operation_Log(StaticParam._mID, "商品登録(JANコード = " + regItem._janCode + ", 商品名 = " + regItem._itemName + ", 価格 = " + regItem._price + ", 在庫数 = " + regItem._num + ")");
             }
         }
         db.Insert_Charge_Log(StaticParam._mID, (StaticParam._usePrice * -1));
         CheckFunction.Message_Show("商品の登録に成功しました。", "");
         StaticParam._usePrice = 0;
         Frame.Navigate(typeof(MenuScreen));
     }
     catch {
         CheckFunction.Message_Show("Error", "DBの登録に失敗しました。");
         Enable_Toggle();
     }
 }
        // データリスト初期化メソッド
        private ObservableCollection <PaymentLog> GetData()
        {
            DatabaseAccess db       = new DatabaseAccess();
            var            all_Logs = db.Get_AllPayment();


            // 売上商品の集計
            foreach (var buf in all_Logs)
            {
                if (buf._type == "購入")
                {
                    if (sellingList.ContainsKey(buf._janCode))
                    { // 既にリストに存在する場合、個数を加算
                        sellingList[buf._janCode] += buf._num;
                        // 件数の記録
                        sellingScore[buf._janCode]++;
                    }
                    else
                    {
                        sellingList.Add(buf._janCode, buf._num); // リストに含まれない場合、新規追加
                        sellingScore.Add(buf._janCode, 1);
                    }
                }
            }

            // 売れ筋評価
            foreach (var item in sellingList)
            {
                // 売上日時リスト
                DateTime[] sellingDate = db.Get_AllSellingDate(item.Key);
                // 売上個数リスト
                int[] sellingHistory = new int[0];
                // 仕入れ日時リスト
                DateTime[] stockingDate = db.Get_AllStockingDate(item.Key);
                // 仕入れインデックス
                int stockingidx = 0;
                // itemの売上件数
                int total_record = sellingScore[item.Key];
                // 初期化(ここまでは売上件数の保持につかっていたが、ここからはスコアを保存する)
                sellingScore[item.Key] = 0;
                // 仕入れ個数履歴
                int[] history = db.Get_AllStockingHistory(item.Key);
                // 仕入れ履歴インデックス
                int historyidx = 0, total_sell = 0;


                // 売上商品の集計
                foreach (var buf in all_Logs)
                {
                    if (buf._type == "購入")
                    {
                        if (item.Key == buf._janCode)
                        { // リストの追加
                            Array.Resize(ref sellingHistory, sellingHistory.Length + 1);
                            sellingHistory[sellingHistory.Length - 1] = buf._num;
                        }
                        else
                        {
                        }
                    }
                }

                // スコア計算
                for (int i = 0; i < sellingDate.Length; i++)
                {
                    total_sell += sellingHistory[i];
                    for (; ;)
                    {
                        if (stockingidx == stockingDate.Length - 1)
                        {
                            // 現在参照している仕入れ日時が最終仕入れの場合
                            break;
                        }
                        // 現在参照している仕入れ日時よりも後に仕入れがあった場合
                        if (stockingDate[stockingidx + 1] > sellingDate[i])
                        {
                            // 現在参照している仕入れ日時と後の仕入れ日時の間の売上日時の場合
                            break;
                        }
                        else
                        {
                            // 現在参照している仕入れ日時の後の仕入れ日時以降の売上日時の場合

                            for (; ;)
                            {
                                if (history[historyidx] - total_sell >= 0)
                                {
                                    break;
                                }
                                else
                                {
                                }
                                if (total_sell >= history[historyidx])
                                {
                                    total_sell = total_sell - history[historyidx];
                                    historyidx++;
                                    stockingidx++;
                                    continue;
                                }
                            }
                            break;
                        }
                    }
                    // 売上日時と、直前の仕入れ日時の差を分換算にてスコア算出(大きいほど売れていない)
                    TimeSpan ts = new TimeSpan();
                    if (i == 0)
                    {
                        // 初売上の場合
                        ts = sellingDate[i] - stockingDate[stockingidx];
                    }
                    else if (sellingDate[i - 1] > stockingDate[stockingidx])
                    {
                        // 直前のデータが売上日時の場合
                        ts = sellingDate[i] - sellingDate[i - 1];
                    }
                    else
                    {
                        // 直前のデータが仕入れ日時の場合
                        ts = sellingDate[i] - stockingDate[stockingidx];
                    }
                    sellingScore[item.Key] += (int)ts.TotalMinutes;
                }

                sellingScore[item.Key] /= item.Value;
                // (売上件数/売上個数)のレートでスコアを減らす手法(一度に多く買っている場合の考慮)
                float r = ((float)total_record / (float)item.Value);
                sellingScore[item.Key] = (int)(sellingScore[item.Key] * r);
            }


            foreach (var log in sellingScore)
            {
                PaymentLog pl = new PaymentLog();

                if (log.Key != "")
                {
                    Item item = db.Get_Item(log.Key);
                    pl._price    = log.Value;
                    pl._type     = CheckFunction.Get_categoryName(item._categoryId);
                    pl._itemName = item._itemName;
                    pl._num      = item._num;
                }
                Data.Add(pl);
            }
            List <Item> itemlist = db.Get_AllItem();

            foreach (var item in itemlist)
            {
                if (!sellingList.ContainsKey(item._janCode))
                {
                    PaymentLog pl = new PaymentLog();
                    pl._price    = 99999;
                    pl._type     = CheckFunction.Get_categoryName(item._categoryId);
                    pl._itemName = item._itemName;
                    pl._num      = item._num;
                    Data.Add(pl);
                }
            }
            Data = new ObservableCollection <PaymentLog>(from i in Data orderby i._price ascending select i);
            return(Data);
        }
Exemplo n.º 4
0
        private void JANCODE_TEXT_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            //Encoding Enc = Encoding.GetEncoding("");
            //if (Enc.GetByteCount(JANCODE_TEXT.Text) == JANCODE_TEXT.Text.Length * 2
            //JANCODE_TEXT.Text = Regex.Replace(JANCODE_TEXT.Text, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString());
            if (e.Key == Windows.System.VirtualKey.Enter)
            {
                JANCODE_TEXT.IsReadOnly = true;
                if (!CheckFunction.JANCODE_Integrity_Check(JANCODE_TEXT.Text))
                {
                    JANCODE_TEXT.IsReadOnly = false;
                    CheckFunction.Message_Show("Error", "JANコードが正しくありません");
                    JANCODE_TEXT.Text = "";
                    return;
                }

                // 謎ポイント
                // 初回、if (Items.First(x => x._janCode == last_jan)._janCode == JANCODE_TEXT.Text)でマッチするレコードがなかった場合例外発生、2回目以降は例外は発生せずelseに飛ぶ
                // 応急措置として同じコードを書いています
                // いろいろおかしい
                try
                {
                    // リスト上に存在する場合
                    if (Items.First(x => x._janCode == JANCODE_TEXT.Text)._janCode == JANCODE_TEXT.Text)
                    {
                        last_jan = JANCODE_TEXT.Text;
                        Items.First(x => x._janCode == JANCODE_TEXT.Text)._num += 1;
                    }
                    else
                    {
                        // リスト上に存在しない場合
                        DatabaseAccess db = new DatabaseAccess();
                        if (db.Search_Item(JANCODE_TEXT.Text))
                        {
                            // DB既登録の場合
                            Item item = db.Get_Item(JANCODE_TEXT.Text);
                            item._num = 1;
                            last_jan  = JANCODE_TEXT.Text;
                            Items.Add(item);
                        }
                        else
                        {
                            // DB未登録の場合
                            CheckFunction.Message_Show("Error", "データベースに存在しない商品です。");
                        }
                    }
                }
                catch
                {
                    // リスト上に存在しない場合
                    DatabaseAccess db = new DatabaseAccess();
                    if (db.Search_Item(JANCODE_TEXT.Text))
                    {
                        // DB既登録の場合
                        Item item = db.Get_Item(JANCODE_TEXT.Text);
                        item._num = 1;
                        last_jan  = JANCODE_TEXT.Text;
                        Items.Add(item);
                    }
                    else
                    {
                        // DB未登録の場合
                        CheckFunction.Message_Show("Error", "データベースに存在しない商品です。");
                    }
                }


                // 処理完了後
                JANCODE_TEXT.Text       = "";
                JANCODE_TEXT.IsReadOnly = false;
            }
        }
        private async void JANCODE_TEXT_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            if (e.Key == Windows.System.VirtualKey.Enter)
            {
                JANCODE_TEXT.IsReadOnly = true;
                if (!CheckFunction.JANCODE_Integrity_Check(JANCODE_TEXT.Text))
                {
                    JANCODE_TEXT.IsReadOnly = false;
                    CheckFunction.Message_Show("Error", "JANコードが正しくありません");
                    JANCODE_TEXT.Text = "";
                    return;
                }

                try
                {
                    string s = await RakutenSearchAPI.JAN_Search(JANCODE_TEXT.Text);

                    Candidate_Set(s);
                }
                catch {
                    JANCODE_TEXT.Text = "";
                    return;
                }
                finally{
                }

                // 謎ポイント
                // 初回、if (Items.First(x => x._janCode == last_jan)._janCode == JANCODE_TEXT.Text)でマッチするレコードがなかった場合例外発生、2回目以降は例外は発生せずelseに飛ぶ
                // 応急措置として同じコードを書いています
                // いろいろおかしい
                try
                {
                    // リスト上に存在する場合
                    if (Items.First(x => x._janCode == JANCODE_TEXT.Text)._janCode == JANCODE_TEXT.Text)
                    {
                        last_jan = JANCODE_TEXT.Text;
                        Items.First(x => x._janCode == JANCODE_TEXT.Text)._num += 1;
                    }
                    else
                    {
                        DatabaseAccess db = new DatabaseAccess();
                        if (db.Search_Item(JANCODE_TEXT.Text))
                        {
                            // DB既登録の場合
                            Item item = db.Get_Item(JANCODE_TEXT.Text);
                            item._num = 1;
                            last_jan  = JANCODE_TEXT.Text;
                            Items.Add(item);
                        }
                        else
                        {
                            // DB未登録の場合
                            Item item = new Item(JANCODE_TEXT.Text, "", 0, 0, 1);
                            last_jan = JANCODE_TEXT.Text;
                            Items.Add(item);
                        }
                    }
                }catch {
                    DatabaseAccess db = new DatabaseAccess();
                    if (db.Search_Item(JANCODE_TEXT.Text))
                    {
                        // DB既登録の場合
                        Item item = db.Get_Item(JANCODE_TEXT.Text);
                        item._num = 1;
                        last_jan  = JANCODE_TEXT.Text;
                        Items.Add(item);
                    }
                    else
                    {
                        // DB未登録の場合
                        Item item = new Item(JANCODE_TEXT.Text, "", 0, 0, 1);
                        last_jan = JANCODE_TEXT.Text;
                        Items.Add(item);
                    }
                }

                //DatabaseAccess db = new DatabaseAccess();
                //db.Insert_Item(item);

                // 処理完了後
                JANCODE_TEXT.Text       = "";
                JANCODE_TEXT.IsReadOnly = false;
            }
        }