public string Post([FromBody] RequestFindShops req)
        {
            string json = "";

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


            return(json);
        }
Ejemplo n.º 2
0
        public void GetFindShops(string connectionString, RequestFindShops req)
        {
            //using (SqlConnection connection = new SqlConnection(connectionString))
            SqlConnection connection = new SqlConnection(connectionString);

            Shops_short = new List <Shop_short>();

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

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

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

            if (req.kategor != null)
            {
                idKategor = req.kategor.ID_KATEGOR;
            }

            // тип магазина
            //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;
            }
            if (req.DISCONT_CARD)
            {
                intDiscontCard = 1;
            }

            // подготовка к вставке в блок where
            string whereID_TYPE_SHOP = " AND sh.ID_TYPE_SHOP in (" + idTypesShop + ")";
            string whereTimeWayMetro = " AND sh.TimeWayMetro<=" + TimeWayMetro.ToString();
            string whereID_kategor   = " AND itk.ID_kategor = '" + idKategor + "'";
            string whereID_metro     = " AND met.ID_metro in (" + idMetro + ")";
            string whereBuy_card     = " AND sh.BuyCard=" + intBuyCard.ToString();
            string whereDISCONT_CARD = " AND sh.DISCONT_CARD=" + intDiscontCard.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 (intDiscontCard == 0)
            {
                whereDISCONT_CARD = "";
            }

            if (idKategor == "")
            {
                whereID_kategor = "";
            }

            if (String.IsNullOrEmpty(id_City))
            {
                whereID_CIty = "";
            }

            #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 ISNULL(sum(CC.Count_star),0) 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,

                    sh.IMG_LOGO

                    
                    

                    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 sh.ID_SHOP='6d0eb5f2-0ffd-411b-9cf2-318260b22604'
                        AND sh.VISIBLE=1
                             " + whereID_CIty + @"
                        " + whereID_TYPE_SHOP + @"
                        " + whereBuy_card + @" 
                        " + whereTimeWayMetro + @" 
                        " + whereID_kategor + @"
                        " + whereID_metro + @"
                        " + whereDISCONT_CARD + @"
                    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,

                    sh.IMG_LOGO
                    
                    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 ISNULL(sum(CC.Count_star),0) 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   ,

                    sh.IMG_LOGO                 
                    
                    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                     
                     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
                        AND sh.VISIBLE=1
                             " + whereID_CIty + @"
                        AND sh.ID_SHOP<>'6d0eb5f2-0ffd-411b-9cf2-318260b22604'
                        " + whereID_TYPE_SHOP + @"
                        " + whereBuy_card + @" 
                        " + whereTimeWayMetro + @" 
                        " + whereID_kategor + @"
                        " + whereID_metro + @"
                        " + whereDISCONT_CARD + @"

                    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,

                    sh.IMG_LOGO


                    ";

            #endregion

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

            Shop_short shop_ShortFirst = new Shop_short();
            int        tmp_count       = 0;

            if (reader.HasRows)     // если есть данные
            {
                //int genreIDIndex = reader.GetOrdinal("GenreID");
                //...
                //while...
                //GenreID = reader.IsDBNull(genreIDIndex) ? null : reader.GetInt32(genreIDIndex)
                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 shIMG_LOGO_index = reader.GetOrdinal("IMG_LOGO");

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


                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) ? "#CFD8DC" : 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  знаков


                    Shop_short item = new Shop_short
                    {
                        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(shIMG_LOGO_index) ? "": reader.GetString(shIMG_LOGO_index)
                    };

                    if (tmp_count == 0)
                    {
                        shop_ShortFirst = item;
                    }
                    else
                    {
                        Shops_short.Add(item);
                    }

                    tmp_count++;
                }
            }


            //distanseSortComparer dsc = new distanseSortComparer();

            //Shops_short.Sort(dsc);

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



            //}//return shops;
        }
    }