コード例 #1
0
        public string Post([Microsoft.AspNetCore.Mvc.FromBody] RequestFindItem req)
        {
            string json = "";

            try
            {
                ResponseFindItems resp = new ResponseFindItems();
                resp.GetFindItems(Constants.connectDB, req);
                json = JsonConvert.SerializeObject(resp);
            }
            catch (Exception ex)
            {
                json += " err " + ex.Message;
            }


            return(json);
        }
コード例 #2
0
        public void GetFindItems(string connectionString, RequestFindItem req)
        {
            //using  настройка запроса выбора товара
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                Shops_short_item = new List <Shop_short_Item>();

                ////////////
                // ОБРАБОТКА ДАННЫХ ПЕРЕД ИНСЕРТОМ
                ///////////

                string idTypesShop  = "";
                int    intBuyCard   = 0;
                int    TimeWayMetro = req.TimeWayMetro;
                string idItem       = "";
                string idMetro      = "";
                string id_City      = "6d0eb5f2-01fd-411b-9cf2-318a60b22604";// Москва

                if (req.geoPhone == null)
                {
                    req.geoPhone = new Geo {
                        X = 0, Y = 0
                    }
                }
                ;

                if (req.item != null)
                {
                    idItem = req.item.ID_ITEM;
                }

                // тип магазина
                //for (int i=0; i< req.type_shop.Length; i++)
                //{
                //    if (i > 0) idTypesShop += ",";
                //    idTypesShop += "'" + req.type_shop[i].ID_TYPE_SHOP + "'";
                //}

                switch (req.type_shop_012)
                {
                case 0: idTypesShop = "'340eb5f2-0ffd-411b-9cf2-318a60b22604','350eb5f2-0ffd-411b-9cf2-318a60b22604'"; break;

                case 1: idTypesShop = "'340eb5f2-0ffd-411b-9cf2-318a60b22604'"; break;

                case 2: idTypesShop = "'350eb5f2-0ffd-411b-9cf2-318a60b22604'"; break;
                }

                // станции метро, если список не пустой
                if (req.metro != null && req.metro.Count > 0)
                {
                    for (int i = 0; i < req.metro.Count; i++)
                    {
                        if (i > 0)
                        {
                            idMetro += ",";
                        }
                        idMetro += "'" + req.metro[i].ID_metro + "'";
                    }
                }

                if (req.buy_card)
                {
                    intBuyCard = 1;
                }

                // подготовка к вставке в блок where
                string whereID_TYPE_SHOP = " AND sh.ID_TYPE_SHOP in (" + idTypesShop + ")";
                string whereTimeWayMetro = " AND sh.TimeWayMetro<=" + TimeWayMetro.ToString();
                string whereID_Item      = " AND itm.ID_ITEM = '" + idItem + "'";
                string whereID_metro     = " AND met.ID_metro in (" + idMetro + ")";
                string whereBuy_card     = " AND sh.BuyCard=" + intBuyCard.ToString();

                string whereID_CIty = "AND sh.ID_City='" + id_City + "' -- Москва  ";



                // если флаг стоит что поиск по всем станциям, то выборку по поределенным станциям убираем
                if (req.AllMetro)
                {
                    whereID_metro = "";
                }

                // параметр отвечает за кол-во минут ходьбы от метро до организации
                if (TimeWayMetro <= 0)
                {
                    whereTimeWayMetro = "";
                }

                // если оплаты за безнал нет, то тогда выводим все магазины, если есть то выводим только магазины с оплатой по карте
                if (intBuyCard == 0)
                {
                    whereBuy_card = "";
                }

                if (idItem == "")
                {
                    return;
                }

                #region SQL query
                string sqlFirstShopUnion = @"
                    SELECT 
                    sh.ID_shop,
                    sh.Type,
                    sh.Name,
                    sh.TimeWayMetro,
                    sh.Phone,
                    
                    met.ID_Metro,
                    met.station,
                    met.Color_hex,
                    
                    shgeo.X,
                    shgeo.Y,
                    
                    (
                        SELECT sum(CC.Count_star) AS avg_star FROM SPAVREMONT.Comment_client CC 
                        WHERE CC.ID_SHOP=sh.ID_Shop
                    ) AS AVG_Star,
                    (
                        SELECT count(*) AS count_feedback FROM SPAVREMONT.Comment_client CC 
                        WHERE CC.ID_SHOP=sh.ID_Shop
                            AND CC.visible=1
                    ) AS Count_feedback,

                    --параметры товара,
                    -- название цена
                    itm.ID_ITEM,
                    itm.NAME_ITEM,
                    itm.NOTE_ITEM,
                    itm.IMG_URL,
                    sh.IMG_LOGO,
                    
                    its.MIN_PRICE,
                    its.MAX_PRICE

                    
                    
                    FROM SPAVREMONT.SHOP sh
                     JOIN SPAVREMONT.ITEMS_SHOP its ON sh.ID_Shop=its.ID_Shop
                     JOIN SPAVREMONT.ITEM_KATEGOR itk ON its.ID_ITEM_KATEGOR=itk.ID_ITEM_KATEGOR
                     JOIN SPAVREMONT.KATEGOR kat ON itk.ID_KATEGOR=kat.ID_KATEGOR
                     JOIN SPAVREMONT.ITEM itm ON itk.ID_ITEM=itm.ID_ITEM
                     JOIN SPAVREMONT.Metro met ON met.ID_Metro=sh.ID_metro
                     JOIN SPAVREMONT.Geo shgeo ON shgeo.ID_Geo=sh.ID_Geo
                    WHERE sh.ID_SHOP='6d0eb5f2-0ffd-411b-9cf2-318260b22604'
                           AND sh.VISIBLE=1
                             " + whereID_CIty + @"
                        " + whereID_TYPE_SHOP + @"
                        " + whereID_Item + @"

                    GROUP BY sh.ID_shop,
                    sh.Type,
                    sh.Name,
                    sh.TimeWayMetro, 
                    sh.Phone,
                    
                    met.ID_Metro,
                    met.station,
                    met.Color_hex,
                    
                    shgeo.X,
                    shgeo.Y,

                    itm.ID_ITEM,
                    itm.NAME_ITEM,
                    itm.NOTE_ITEM,
                    itm.IMG_URL,
                    sh.IMG_LOGO,
                    
                    its.MIN_PRICE,
                    its.MAX_PRICE
                    
                    UNION ";

                string sqlExpression = sqlFirstShopUnion + @"
                    SELECT 
                    sh.ID_shop,
                    sh.Type,
                    sh.Name,
                    sh.TimeWayMetro,
                    sh.Phone,
                    
                    met.ID_Metro,
                    met.station,
                    met.Color_hex,

                    shgeo.X,
                    shgeo.Y,
                    
                    (
                        SELECT sum(CC.Count_star) AS avg_star FROM SPAVREMONT.Comment_client CC 
                        WHERE CC.ID_SHOP=sh.ID_Shop
                    ) AS AVG_Star,
                    (
                        SELECT count(*) AS count_feedback FROM SPAVREMONT.Comment_client CC 
                        WHERE CC.ID_SHOP=sh.ID_Shop
                            AND CC.visible=1
                    ) AS Count_feedback ,                    

                    --параметры товара,
                    -- название цена
                    itm.ID_ITEM,
                    itm.NAME_ITEM,
                    itm.NOTE_ITEM,
                    itm.IMG_URL,
                    sh.IMG_LOGO,
                    
                    its.MIN_PRICE,
                    its.MAX_PRICE
                    
                    FROM SPAVREMONT.SHOP sh
                     JOIN SPAVREMONT.ITEMS_SHOP its ON sh.ID_Shop=its.ID_Shop
                     JOIN SPAVREMONT.ITEM_KATEGOR itk ON its.ID_ITEM_KATEGOR=itk.ID_ITEM_KATEGOR
                     JOIN SPAVREMONT.KATEGOR kat ON itk.ID_KATEGOR=kat.ID_KATEGOR   
                     JOIN SPAVREMONT.ITEM itm ON itk.ID_ITEM=itm.ID_ITEM                  
                     LEFT JOIN SPAVREMONT.Metro met ON met.ID_Metro=sh.ID_metro
                     LEFT JOIN SPAVREMONT.Geo shgeo ON shgeo.ID_Geo=sh.ID_Geo
                    WHERE 1=1
                             " + whereID_CIty + @"
                        AND sh.ID_SHOP<>'6d0eb5f2-0ffd-411b-9cf2-318260b22604'
                        " + whereID_TYPE_SHOP + @"
                        " + whereID_Item + @"


                    GROUP BY sh.ID_shop,
                      sh.Type,
                      sh.Name,
                      sh.TimeWayMetro,
                      sh.Phone,
                      
                      met.ID_Metro,
                      met.station,
                      met.Color_hex,

                      shgeo.X,
                      shgeo.Y,

                      itm.ID_ITEM,
                      itm.NAME_ITEM,
                      itm.NOTE_ITEM,
                      itm.IMG_URL,
                      sh.IMG_LOGO,
                    
                    its.MIN_PRICE,
                    its.MAX_PRICE


                    ";

                #endregion

                connection.Open();
                SqlCommand command = new SqlCommand();
                command.CommandText = sqlExpression;
                command.Connection  = connection;
                SqlDataReader reader = command.ExecuteReader();

                Shop_short_Item Shop_short_ItemFirst = new Shop_short_Item();
                int             tmp_count            = 0;

                if (reader.HasRows) // если есть данные
                {
                    int sID_shopIndex       = reader.GetOrdinal("ID_shop");
                    int sTypeIndex          = reader.GetOrdinal("Type");
                    int sNameIndex          = reader.GetOrdinal("Name");
                    int sPhoneIndex         = reader.GetOrdinal("Phone");
                    int sTimeWayMetroIndex  = reader.GetOrdinal("TimeWayMetro");
                    int mID_MetroIndex      = reader.GetOrdinal("ID_Metro");
                    int mstationIndex       = reader.GetOrdinal("station");
                    int mColor_hexIndex     = reader.GetOrdinal("Color_hex");
                    int AVG_StarIndex       = reader.GetOrdinal("AVG_Star");
                    int Count_feedbackIndex = reader.GetOrdinal("Count_feedback");

                    //int katKategorIndex = reader.GetOrdinal("ID_KATEGOR");
                    int shgeoXIndex = reader.GetOrdinal("X");
                    int shgeoYIndex = reader.GetOrdinal("Y");

                    int itmID_ITEM_index   = reader.GetOrdinal("ID_ITEM");
                    int itmNAME_ITEM_index = reader.GetOrdinal("NAME_ITEM");
                    int itmNOTE_ITEM_index = reader.GetOrdinal("NOTE_ITEM");
                    int itmIMG_URL_index   = reader.GetOrdinal("IMG_URL");
                    int sIMG_LOGO_index    = reader.GetOrdinal("IMG_LOGO");

                    int MAX_PRICE_Index = reader.GetOrdinal("MAX_PRICE");
                    int MIN_PRICE_Index = reader.GetOrdinal("MIN_PRICE");

                    while (reader.Read()) // построчно считываем данные
                    {
                        Metro metro = new Metro
                        {
                            ID_metro  = reader.IsDBNull(mID_MetroIndex) ? "" : reader.GetString(mID_MetroIndex),
                            Station   = reader.IsDBNull(mstationIndex) ? "" : reader.GetString(mstationIndex),
                            Color_Hex = reader.IsDBNull(mColor_hexIndex) ? "" : reader.GetString(mColor_hexIndex)
                        };

                        Geo geoShop = new Geo
                        {
                            X = 0, // (float)reader.GetDouble(shgeoXIndex),
                            Y = 0  // (float)reader.GetDouble(shgeoYIndex)
                        };

                        // Вывести подсчет дистанции между двумя точками
                        float  distanse       = -1;
                        double distanseResult = 0;
                        float  xPhone         = req.geoPhone.X;
                        float  yPhone         = req.geoPhone.Y;

                        distanse       = (xPhone - geoShop.X) * (xPhone - geoShop.X) + (yPhone - geoShop.Y) * (yPhone - geoShop.Y);
                        distanseResult = Math.Sqrt(distanse);


                        // подсчет среднего кол-во звезд
                        double _avg_star       = reader.IsDBNull(AVG_StarIndex) ? 0 : (double)reader.GetInt32(AVG_StarIndex);
                        int    _Count_feedback = reader.IsDBNull(Count_feedbackIndex) ? 0 : reader.GetInt32(Count_feedbackIndex);

                        int tmp = _Count_feedback;
                        if (_Count_feedback == 0)
                        {
                            tmp = 1;
                        }
                        _avg_star = _avg_star / tmp;// округление до2  знаков

                        ITEM item_katalog = new ITEM
                        {
                            ID_ITEM   = reader.GetString(itmID_ITEM_index),
                            IMG_URL   = reader.GetString(itmIMG_URL_index),
                            NAME_ITEM = reader.GetString(itmNAME_ITEM_index),
                            NOTE_ITEM = reader.GetString(itmNOTE_ITEM_index)
                        };

                        Shop_short_Item item = new Shop_short_Item
                        {
                            ID_shop        = reader.GetString(sID_shopIndex),
                            Type           = reader.GetString(sTypeIndex),
                            Name           = reader.GetString(sNameIndex),
                            Metro          = metro,
                            AVG_Star       = Math.Round(_avg_star, 1),
                            Count_feedback = _Count_feedback,
                            Geo            = geoShop,
                            distanse       = distanseResult,
                            // id_kateg = reader.GetString(katKategorIndex),
                            Phone        = reader.IsDBNull(sPhoneIndex) ? null : reader.GetString(sPhoneIndex),
                            TimeWayMetro = reader.GetInt32(sTimeWayMetroIndex),
                            IMG_LOGO     = reader.IsDBNull(sIMG_LOGO_index) ? "emptylogo.png" : reader.GetString(sIMG_LOGO_index),

                            item     = item_katalog,
                            MaxPrice = reader.GetInt32(MAX_PRICE_Index),
                            MinPrice = reader.GetInt32(MIN_PRICE_Index)
                        };

                        if (tmp_count == 0)
                        {
                            Shop_short_ItemFirst = item;
                        }
                        else
                        {
                            Shops_short_item.Add(item);
                        }

                        tmp_count++;
                    }
                }


                // distanseSortItemComparer dsc = new distanseSortItemComparer();

                //Shops_short_item.Sort(dsc);

                if (tmp_count > 0)
                {
                    Shops_short_item.Insert(0, Shop_short_ItemFirst);
                }
                //по желанию заказчика, если магазин заказчика выводится в списке, он должен быть на первом месте
            }//return shops;
        }
    }