public async Task <AnalysisAddressResultNew> AnalysisAddressTuningUp(ListAnalysisAddressNewResultItem model)
        {
            var rs = new AnalysisAddressResultNew()
            {
                Result = Result.Success, ListResult = new List <AnalysisAddressNewResultItem>()
            };

            if (model.AnalysisAddressResultItems.Count > 0)
            {
                var cities = await _cityRepository.Query().OrderBy(c => c.DisplayOrder).Include(c => c.Exceptions)
                             .ToListAsync();

                List <AnalysisAddressNewResultItem> citiesRS = new List <AnalysisAddressNewResultItem>();
                foreach (var modelAnalysisAddressItem in model.AnalysisAddressResultItems)
                {
                    AnalysisAddressNewResultItem cityRS = new AnalysisAddressNewResultItem()
                    {
                        Result = Result.Success, Guid = modelAnalysisAddressItem.Guid
                    };
                    var beginNumber = Regex.Match(modelAnalysisAddressItem.Address, @"^\d+").ToString();
                    if (!string.IsNullOrEmpty(beginNumber))
                    {
                        var address = modelAnalysisAddressItem.Address;
                        modelAnalysisAddressItem.Address = modelAnalysisAddressItem.Address.Substring(beginNumber.Length, address.Length - beginNumber.Length);
                    }
                    string currentAddress;
                    cityRS = AnalysisCity(modelAnalysisAddressItem, cities, cityRS, out currentAddress);
                    if (rs.Result != Result.Success)
                    {
                        return(rs);
                    }
                    modelAnalysisAddressItem.Address = currentAddress;
                    citiesRS.Add(cityRS);
                }

                //District
                var cityIds   = citiesRS.Where(x => x.CityId > 0).Select(x => x.CityId).Distinct().ToList();
                var districts = await _districtRepository.Query().Where(x => cityIds.Contains(x.CityId)).OrderBy(c => c.DisplayOrder)
                                .Include(c => c.Exceptions).ToListAsync();

                List <AnalysisAddressNewResultItem> districtsRS = new List <AnalysisAddressNewResultItem>();
                foreach (var modelAnalysisAddressItem in model.AnalysisAddressResultItems)
                {
                    AnalysisAddressNewResultItem districtRS = new AnalysisAddressNewResultItem()
                    {
                        Result = Result.Success, Guid = modelAnalysisAddressItem.Guid
                    };
                    var cityCheck = citiesRS.FirstOrDefault(x => x.Guid == modelAnalysisAddressItem.Guid);
                    if (cityCheck != null && cityCheck.CityId > 0)
                    {
                        districtRS.CityId    = cityCheck.CityId;
                        districtRS.CityName  = cityCheck.CityName;
                        districtRS.CityRealm = cityCheck.CityRealm;
                    }
                    var beginNumber = Regex.Match(modelAnalysisAddressItem.Address, @"^\d+").ToString();
                    if (!string.IsNullOrEmpty(beginNumber))
                    {
                        var address = modelAnalysisAddressItem.Address;
                        modelAnalysisAddressItem.Address = modelAnalysisAddressItem.Address.Substring(beginNumber.Length, address.Length - beginNumber.Length);
                    }
                    string currentAddress;
                    var    districtCheck = districts.Where(x => x.CityId == districtRS.CityId).ToList();
                    districtRS = AnalysisDistrict(modelAnalysisAddressItem, districtCheck, districtRS, out currentAddress);
                    if (rs.Result != Result.Success)
                    {
                        return(rs);
                    }
                    modelAnalysisAddressItem.Address = currentAddress;
                    districtsRS.Add(districtRS);
                }

                //Ward
                var districtIds = districtsRS.Where(x => x.DistrictId > 0).Select(x => x.DistrictId).Distinct().ToList();
                var wards       = await _wardRepository.Query().Where(x => districtIds.Contains(x.DistrictId)).OrderBy(c => c.DisplayOrder).Include(c => c.Exceptions)
                                  .ToListAsync();

                List <AnalysisAddressNewResultItem> wardsRS = new List <AnalysisAddressNewResultItem>();
                foreach (var modelAnalysisAddressItem in model.AnalysisAddressResultItems)
                {
                    AnalysisAddressNewResultItem wardRS = new AnalysisAddressNewResultItem()
                    {
                        Result = Result.Success, Guid = modelAnalysisAddressItem.Guid
                    };
                    var districtCheck = districtsRS.FirstOrDefault(x => x.Guid == modelAnalysisAddressItem.Guid);
                    if (districtCheck != null && districtCheck.DistrictId > 0)
                    {
                        wardRS.DistrictId   = districtCheck.DistrictId;
                        wardRS.DistrictName = districtCheck.DistrictName;
                    }
                    var beginNumber = Regex.Match(modelAnalysisAddressItem.Address, @"^\d+").ToString();
                    if (!string.IsNullOrEmpty(beginNumber))
                    {
                        var address = modelAnalysisAddressItem.Address;
                        modelAnalysisAddressItem.Address = modelAnalysisAddressItem.Address.Substring(beginNumber.Length, address.Length - beginNumber.Length);
                    }
                    var wardCheck = wards.Where(x => x.DistrictId == wardRS.DistrictId).ToList();
                    wardRS = AnalysisWard(modelAnalysisAddressItem, wardCheck, wardRS);
                    if (rs.Result != Result.Success)
                    {
                        return(rs);
                    }
                    wardsRS.Add(wardRS);
                }
                foreach (var modelAnalysisAddressItem in model.AnalysisAddressResultItems)
                {
                    AnalysisAddressNewResultItem resultItem = new AnalysisAddressNewResultItem()
                    {
                        Result = Result.Success, Guid = modelAnalysisAddressItem.Guid
                    };
                    var resultCity = citiesRS.FirstOrDefault(x => x.Guid == modelAnalysisAddressItem.Guid);
                    if (resultCity != null)
                    {
                        resultItem.CityId    = resultCity.CityId;
                        resultItem.CityName  = resultCity.CityName;
                        resultItem.CityRealm = resultCity.CityRealm;
                    }
                    var resultDistrict = districtsRS.FirstOrDefault(x => x.Guid == modelAnalysisAddressItem.Guid);
                    if (resultDistrict != null)
                    {
                        resultItem.DistrictId   = resultDistrict.DistrictId;
                        resultItem.DistrictName = resultDistrict.DistrictName;
                    }
                    var resultWard = wardsRS.FirstOrDefault(x => x.Guid == modelAnalysisAddressItem.Guid);
                    if (resultWard != null)
                    {
                        resultItem.WardId       = resultWard.WardId;
                        resultItem.WardName     = resultWard.WardName;
                        resultItem.IsOutOfServe = resultWard.IsOutOfServe;
                    }
                    rs.ListResult.Add(resultItem);
                }
            }
            return(rs);
        }
        public async Task <AnalysisAddressNewResult> GetAddressByName(AnalysisAddressNewModel model)
        {
            var result = new AnalysisAddressNewResult()
            {
                Result = Result.Success
            };
            var analysisAddressModel = new ListAnalysisAddressNewResultItem
            {
                AnalysisAddressResultItems = new List <AnalysisAddressNewItem>()
            };
            var sourceOrderId = Guid.NewGuid().ToString();
            var destOrderId   = Guid.NewGuid().ToString();
            var returnOrderId = Guid.NewGuid().ToString();

            analysisAddressModel.AnalysisAddressResultItems.Add(new AnalysisAddressNewItem
            {
                Guid         = sourceOrderId,
                Address      = !string.IsNullOrEmpty(model.SourceAddress) ? model.SourceAddress.Trim() : "",
                CityName     = !string.IsNullOrEmpty(model.SourceCity) ? model.SourceCity.Trim() : "",
                DistrictName = !string.IsNullOrEmpty(model.SourceDistrict) ? model.SourceDistrict.Trim() : "",
                WardName     = !string.IsNullOrEmpty(model.SourceWard) ? model.SourceWard.Trim() : ""
            });
            analysisAddressModel.AnalysisAddressResultItems.Add(new AnalysisAddressNewItem
            {
                Guid         = destOrderId,
                Address      = !string.IsNullOrEmpty(model.DestAddress) ? model.DestAddress.Trim() : "",
                CityName     = !string.IsNullOrEmpty(model.DestCity) ? model.DestCity.Trim() : "",
                DistrictName = !string.IsNullOrEmpty(model.DestDistrict) ? model.DestDistrict.Trim() : "",
                WardName     = !string.IsNullOrEmpty(model.DestWard) ? model.DestWard.Trim() : ""
            });
            analysisAddressModel.AnalysisAddressResultItems.Add(new AnalysisAddressNewItem
            {
                Guid         = returnOrderId,
                Address      = !string.IsNullOrEmpty(model.ReturnAddress) ? model.ReturnAddress.Trim() : "",
                CityName     = !string.IsNullOrEmpty(model.ReturnCity) ? model.ReturnCity.Trim() : "",
                DistrictName = !string.IsNullOrEmpty(model.ReturnDistrict) ? model.ReturnDistrict.Trim() : "",
                WardName     = !string.IsNullOrEmpty(model.ReturnWard) ? model.ReturnWard.Trim() : ""
            });

            var analysisAddressResult = await AnalysisAddressTuningUp(analysisAddressModel);

            var sourceAddress = analysisAddressResult.ListResult.FirstOrDefault(x => x.Guid == sourceOrderId);
            var destAddress   = analysisAddressResult.ListResult.FirstOrDefault(x => x.Guid == destOrderId);
            var returnAddress = analysisAddressResult.ListResult.FirstOrDefault(x => x.Guid == returnOrderId);

            if (sourceAddress != null)
            {
                if (sourceAddress.CityId > 0 && sourceAddress.CityId != null)
                {
                    result.SourceCity   = sourceAddress.CityName;
                    result.SourceCityId = sourceAddress.CityId;
                }
                if (sourceAddress.DistrictId > 0 && sourceAddress.DistrictId != null)
                {
                    result.SourceDistrict   = sourceAddress.DistrictName;
                    result.SourceDistrictId = sourceAddress.DistrictId;
                }
                if (sourceAddress.WardId > 0 && sourceAddress.WardId != null)
                {
                    result.SourceWard   = sourceAddress.WardName;
                    result.SourceWardId = sourceAddress.WardId;
                }
            }
            if (destAddress != null)
            {
                if (destAddress.CityId > 0 && destAddress.CityId != null)
                {
                    result.DestCity   = destAddress.CityName;
                    result.DestCityId = destAddress.CityId;
                }
                if (destAddress.DistrictId > 0 && destAddress.DistrictId != null)
                {
                    result.DestDistrict   = destAddress.DistrictName;
                    result.DestDistrictId = destAddress.DistrictId;
                }
                if (destAddress.WardId > 0 && destAddress.WardId != null)
                {
                    result.DestWard   = destAddress.WardName;
                    result.DestWardId = destAddress.WardId;
                }
            }
            if (returnAddress != null)
            {
                if (returnAddress.CityId > 0 && returnAddress.CityId != null)
                {
                    result.ReturnCity   = returnAddress.CityName;
                    result.ReturnCityId = returnAddress.CityId;
                }
                if (returnAddress.DistrictId > 0 && returnAddress.DistrictId != null)
                {
                    result.ReturnDistrict   = returnAddress.DistrictName;
                    result.ReturnDistrictId = returnAddress.DistrictId;
                }
                if (returnAddress.WardId > 0 && returnAddress.WardId != null)
                {
                    result.ReturnWard   = returnAddress.WardName;
                    result.ReturnWardId = returnAddress.WardId;
                }
            }
            if (destAddress.IsOutOfServe == true || sourceAddress.IsOutOfServe == true || returnAddress.IsOutOfServe == true)
            {
                result.IsOutOfServe = true;
                result.Message      = "Ngoài vùng phục vụ";
            }
            if (sourceAddress.CityId == null && destAddress.CityId == null && returnAddress.CityId == null)
            {
                result.Result  = Result.Failed;
                result.Message = "Không tìm thấy tỉnh quận phường";
            }
            return(result);
        }