// データリスト初期化メソッド
        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);
        }
Пример #2
0
        // タイマー用メソッド
        private async void Check_Card(object sender, object e)
        {
            string mID = "";

            // タイマーの停止
            this._timer.Stop();

            // カードを離した際のGetmid()で例外が走るみたいなので応急措置です
            try
            {
                mID = await Getmid();
            }catch {
                this._timer.Start();
                return;
            }

            try
            {
                if (mID != "")
                {
                    // mIDが登録されていた場合
                    // mIDが登録されているかのチェック
                    DatabaseAccess db = new DatabaseAccess();
                    if (db.Search_UserInformation(mID))
                    {
                        // 事前処理
                        // 決済額のリセット
                        total_price = 0;

                        // カード情報表示
                        UsersInformation uis = db.Get_UserInformation(mID);
                        USER_INFO.Text = uis._user_name + " 様  残高 " + uis._balance + "円";

                        // 入力内容チェック
                        if (Items.Count <= 0)
                        {
                            this._timer.Start();
                            return;
                        }


                        foreach (Item checkItem in Items)
                        {
                            if (checkItem._num <= 0)
                            {
                                var msg = new ContentDialog();
                                msg.Title             = "Error";
                                msg.Content           = checkItem._itemName + "の個数が0になっています。";
                                msg.PrimaryButtonText = "OK";
                                await msg.ShowAsync();

                                JANCODE_TEXT.Focus(FocusState.Keyboard);
                                this._timer.Start();

                                return;
                            }

                            if (db.isStocked_Item(checkItem._janCode, checkItem._num))
                            {
                            }
                            else
                            {
                                var msg = new ContentDialog();
                                msg.Title             = "Error";
                                msg.Content           = checkItem._itemName + "の在庫数が不足しています。";
                                msg.PrimaryButtonText = "OK";
                                await msg.ShowAsync();

                                JANCODE_TEXT.Focus(FocusState.Keyboard);
                                this._timer.Start();
                                return;
                            }
                        }
                        // 入力内容チェックここまで

                        foreach (Item it in Items)
                        {
                            total_price += it._price * it._num;
                        }
                        // 決済可否チェック

                        if (db.Check_Payment(mID, total_price))
                        {
                            db.Exec_Payment(mID, total_price);
                            foreach (Item item in Items)
                            {
                                db.Insert_Purchase_Log(mID, item._janCode, item._num, item._price);
                                db.Reduce_Item(item._janCode, item._num);
                            }
                            UsersInformation ui = db.Get_UserInformation(mID);
                            // ここで音を出してもいいかも
                            SE.Play();
                            USER_INFO.Text = uis._user_name + " 様  残高 " + (uis._balance - total_price) + "円 決済成功";
                            var msg = new ContentDialog();
                            msg.FontSize          = 74;
                            msg.Title             = "決済に成功しました。";
                            msg.Content           = "残高 " + ui._balance + "円";
                            msg.PrimaryButtonText = "OK";
                            //await msg.ShowAsync();
                            Items.Clear();
                            JANCODE_TEXT.Focus(FocusState.Keyboard);
                            this._timer.Start();
                            return;
                        }
                        else
                        {
                            var msg = new ContentDialog();
                            msg.Title             = "Error";
                            msg.Content           = "残高が不足しています。";
                            msg.PrimaryButtonText = "OK";
                            await msg.ShowAsync();

                            JANCODE_TEXT.Focus(FocusState.Keyboard);
                            this._timer.Start();
                            return;
                        }

                        // 決済可否チェックここまで
                    }
                    else
                    {
                        // ダイアログ表示中も裏でタイマーが走るようなので一旦止めています。
                        // CheckFunction.Show_Messageを使用していないのは非同期スレッドが立つらしく確認する前にタイマーがスタートしてしまう為

                        var msg = new ContentDialog();
                        msg.Title             = "Error";
                        msg.Content           = "登録されていないカードです。";
                        msg.PrimaryButtonText = "OK";
                        await msg.ShowAsync();

                        JANCODE_TEXT.Focus(FocusState.Keyboard);
                        this._timer.Start();
                    }
                }
                else
                {
                    this._timer.Start();
                    USER_INFO.Text = "";
                }
            }
            catch (Exception es)
            {
                var msg = new ContentDialog();
                msg.Title             = "Error";
                msg.Content           = "不明なエラーです。管理者に問い合わせて下さい。\n" + es;
                msg.PrimaryButtonText = "OK";
                await msg.ShowAsync();

                JANCODE_TEXT.Focus(FocusState.Keyboard);
                this._timer.Start();
            }
        }
        private void Edit_Decide_Button_Click(object sender, RoutedEventArgs e)
        {
            // 入力パラメータチェック
            if (janCode_TEXT.Text == "")
            {
                // JANコードが未入力です。
                CheckFunction.Message_Show("Error", "JANコードが未入力です。");
                return;
            }
            else if (itemName_TEXT.Text == "")
            {
                // 商品名が未入力です。
                CheckFunction.Message_Show("Error", "商品名が未入力です。");
                return;
            }
            else if (price_TEXT.Text == "")
            {
                // 価格が未入力です。
                CheckFunction.Message_Show("Error", "価格が未入力です。");
                return;
            }
            else if (num_TEXT.Text == "")
            {
                // 在庫が未選択です。
                CheckFunction.Message_Show("Error", "在庫が未入力です。");
                return;
            }
            else if (category_TEXT.SelectedIndex == 0)
            {
                // カテゴリが未選択です。
                CheckFunction.Message_Show("Error", "カテゴリが未選択です。");
                return;
            }

            // フォーマットチェック
            if (!CheckFunction.JANCODE_Integrity_Check(janCode_TEXT.Text))
            {
                CheckFunction.Message_Show("Error", "JANコードのフォーマットが間違っています。なんでこのエラー出たの?");
                return;
            }
            else if (!CheckFunction.itemName_Integrity_Check(itemName_TEXT.Text))
            {
                CheckFunction.Message_Show("Error", "登録できる商品名は50文字以下です。");
                return;
            }
            else if (!CheckFunction.price_Integrity_Check(price_TEXT.Text))
            {
                CheckFunction.Message_Show("Error", "登録できる価格は0~5000の値です。");
                return;
            }
            else if (!CheckFunction.num_Integrity_Check(num_TEXT.Text))
            {
                CheckFunction.Message_Show("Error", "登録できる在庫数は0~200の値です。");
                return;
            }

            Enable_Toggle();
            DatabaseAccess db = new DatabaseAccess();

            if (db.Search_Item(item._janCode))
            {
                db.Delete_Item(item._janCode);
                Item add_item = new Item(janCode_TEXT.Text, itemName_TEXT.Text, category_TEXT.SelectedIndex, int.Parse(price_TEXT.Text), int.Parse(num_TEXT.Text));
                db.Insert_Item(add_item);
                db.Insert_Operation_Log(StaticParam._mID, "商品情報更新(JANコード = " + add_item._janCode + ", 商品名 = " + item._itemName + "→" + add_item._itemName + ", 価格 = " + item._price + "→" + add_item._price + ", 在庫数 = " + item._num + "→" + add_item._num + ")");
                CheckFunction.Message_Show(add_item._itemName + " の情報を更新しました。", "");
                Frame.Navigate(typeof(ProductListEditScreen));
            }
            else
            {
                CheckFunction.Message_Show("Error", "DB上に対象となるJANコードが存在しません。");
                Enable_Toggle();
                return;
            }
        }
Пример #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;
            }
        }