예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public async Task <DatasourceResult <List <Product> > > GetByQuery(ElasticSearchQuery query)
        {
            var            roles                = _httpContextAccessor.HttpContext.GetRouteValue("roles")?.ToString().Split(",");
            var            userName             = _httpContextAccessor.HttpContext.User.Claims.FirstOrDefault(s => s.Type == "userName")?.Value;
            var            companyId            = _httpContextAccessor.HttpContext.Request?.Headers["CompanyId"].FirstOrDefault();
            QueryContainer accessRightContainer = new QueryContainer();

            if (!roles.Contains("COMPANY_DATA"))
            {
                accessRightContainer = Query <Product> .Term(t => t.CreatedBy, userName);
            }
            var listproducts = new DatasourceResult <List <Product> >
            {
                From = query.From,
                Size = query.Size
            };
            var searchResponse = await _esClient.SearchAsync <Product>(s => s
                                                                       .From(query.From)
                                                                       .Size(query.Size)
                                                                       .Sort(ss => ss.Field(query.Sort.Field, (SortOrder)query.Sort.SortOrder))
                                                                       .Source(so => so
                                                                               .Includes(i => i.Fields(query.Source.Includes.ToArray()))
                                                                               .Excludes(e => e.Fields(query.Source.Excludes.ToArray())))
                                                                       .Query(q => q
                                                                              .Raw(JsonConvert.SerializeObject(query.Query)) && q.Term(t => t.CompanyId, companyId) && q.Term(t => t.IsDelete, false) && accessRightContainer)
                                                                       );

            listproducts.Total = searchResponse.Total;
            listproducts.Data  = searchResponse.Documents.ToList();
            return(listproducts);
        }
        /// <summary>
        /// Executes simple _search query and with sarch_type=count parameter and returns only Aggregations part of result
        /// </summary>
        /// <param name="filledQuery">Filled query</param>
        public dynamic ExecuteAggregate(QueryBuilder filledQuery)
        {
            ElasticSearchQuery query = BuildQuery(filledQuery);
            var result = _elasticSearchExecutor.ExecuteQuery <dynamic>(query, new GetParam("search_type", "count"));

            return(result.Aggregations);
        }
예제 #3
0
        private static SelectMethod GetSelectMethod(ElasticSearchQuery compositeQuery)
        {
            var list = (from m in compositeQuery.Methods
                        where m.MethodType == QueryMethodType.Select
                        select(SelectMethod) m).ToList <SelectMethod>();

            return(list.Count != 1 ? null : list[0]);
        }
예제 #4
0
        public ActionResult Search(ElasticSearchQuery searchQuery)
        {
            //
            ElasticSearchService elasticService = new ElasticSearchService();

            var result = elasticService
                         .Search(User.Identity.Name, searchQuery.RawSearch, 1, 20);

            return(PartialView("_SearchResult", result));
        }
        private ElasticSearchQuery BuildQuery(QueryBuilder filledQuery)
        {
            var indexBuilder = new SmartIndexListBuilder(IndexDescriptors, filledQuery);

            string queryJson = _querySerializer.BuildJsonQuery(filledQuery);

            string[] queryInexes = indexBuilder.BuildLookupIndexes();

            ElasticSearchQuery query = new ElasticSearchQuery(queryJson, queryInexes);

            return(query);
        }
예제 #6
0
        public override IEnumerable <TElement> FindElements <TElement>(ElasticSearchQuery compositeQuery)
        {
            var searchResults = Execute(compositeQuery, typeof(TElement));
            var list          = (from m in compositeQuery.Methods
                                 where m.MethodType == QueryMethodType.Select
                                 select(SelectMethod) m).ToList <SelectMethod>();

            var selectMethod = (list.Count() == 1) ? list[0] : null;

            var results2 = new ElasticSearchResults <TElement>(_context, searchResults, selectMethod, compositeQuery.VirtualFieldProcessors);

            return(results2.GetSearchResults());
        }
예제 #7
0
        public async Task <IActionResult> Export([FromBody] ElasticSearchQuery query, [FromQuery] string language)
        {
            var userId = User.Claims.FirstOrDefault(s => s.Type == "sub").Value;
            var result = await _leadRepository.Export(query, language, userId);

            var path = Path.Combine(
                Directory.GetCurrentDirectory(),
                "wwwroot/Export", result);

            var memory = new MemoryStream();

            using (var stream = new FileStream(path, FileMode.Open))
            {
                await stream.CopyToAsync(memory);
            }
            memory.Position = 0;
            return(File(memory, GetContentType(path), $"{Path.GetFileName(path)}_{DateTime.Now.ToString("yyyyMMddHHmmss")}"));
        }
예제 #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public async Task <DatasourceResult <List <Lead> > > GetByQuery(ElasticSearchQuery query)
        {
            var roles     = _httpContextAccessor.HttpContext.GetRouteValue("roles")?.ToString().Split(",");
            var teams     = _httpContextAccessor.HttpContext.GetRouteValue("teams")?.ToString().Split(",");
            var companyId = _httpContextAccessor.HttpContext.Request?.Headers["CompanyId"].FirstOrDefault();
            var userId    = _httpContextAccessor.HttpContext.User.Claims.FirstOrDefault(s => s.Type == "sub")?.Value;

            QueryContainer accessRightContainer = new QueryContainer();

            if (!roles.Contains("COMPANY_DATA"))
            {
                if (roles.Contains("TEAM_DATA"))
                {
                    accessRightContainer = Query <Lead> .Terms(t => t.Field(f => f.TeamId).Terms(teams)) || Query <Lead> .Term(t => t.StaffInCharge, userId) || Query <Lead> .Term(t => t.SupportStaff, userId);
                }
                else
                {
                    accessRightContainer = Query <Lead> .Term(t => t.StaffInCharge, userId) || Query <Lead> .Term(t => t.SupportStaff, userId);
                }
            }

            var result = new DatasourceResult <List <Lead> >
            {
                From = query.From,
                Size = query.Size
            };
            var searchResponse = await _esClient.SearchAsync <Lead>(s => s
                                                                    .From(query.From)
                                                                    .Size(query.Size)
                                                                    .Sort(ss => ss.Field(query.Sort.Field, (SortOrder)query.Sort.SortOrder))
                                                                    .Source(so => so
                                                                            .Includes(i => i.Fields(query.Source.Includes.ToArray()))
                                                                            .Excludes(e => e.Fields(query.Source.Excludes.ToArray())))
                                                                    .Query(q => q
                                                                           .Raw(JsonConvert.SerializeObject(query.Query)) && q.Term(t => t.CompanyId, companyId) && q.Term(t => t.IsDelete, false) && accessRightContainer)
                                                                    );

            result.Total = searchResponse.Total;
            result.Data  = searchResponse.Documents.ToList();
            return(result);
        }
예제 #9
0
        public override TResult Execute <TResult>(ElasticSearchQuery query)
        {
            if (typeof(TResult).IsGenericType && (typeof(TResult).GetGenericTypeDefinition() == typeof(SearchResults <>)))
            {
                var resultType = typeof(TResult).GetGenericArguments()[0];
                var results    = Execute(query, resultType);

                var searchResultsType  = typeof(ElasticSearchResults <>).MakeGenericType(new[] { resultType });
                var applyScalarMethods = GetType().GetMethod("ApplyScalarMethods", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(new[] { typeof(TResult), resultType });

                var method = GetSelectMethod(query);
                var searchResultsInstance = Activator.CreateInstance(searchResultsType, new object[] { _context, results, method, query.VirtualFieldProcessors });

                return((TResult)applyScalarMethods.Invoke(this, new[] { query, searchResultsInstance }));
            }

            var searchResults    = Execute(query, typeof(TResult));
            var selectMethod     = GetSelectMethod(query);
            var processedResults = new ElasticSearchResults <TResult>(_context, searchResults, selectMethod, query.VirtualFieldProcessors);

            return(ApplyScalarMethods <TResult, TResult>(query, processedResults));
        }
예제 #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public async Task <DatasourceResult <List <Team> > > GetByQuery(ElasticSearchQuery query)
        {
            var companyId = _httpContextAccessor.HttpContext.Request?.Headers["CompanyId"].FirstOrDefault();
            var listTeams = new DatasourceResult <List <Team> >
            {
                From = query.From,
                Size = query.Size
            };
            var searchResponse = await _esClient.SearchAsync <Team>(s => s
                                                                    .From(query.From)
                                                                    .Size(query.Size)
                                                                    .Sort(ss => ss.Field(query.Sort.Field, (SortOrder)query.Sort.SortOrder))
                                                                    .Source(so => so
                                                                            .Includes(i => i.Fields(query.Source.Includes.ToArray()))
                                                                            .Excludes(e => e.Fields(query.Source.Excludes.ToArray())))
                                                                    .Query(q => q
                                                                           .Raw(JsonConvert.SerializeObject(query.Query)) && q.Term(t => t.CompanyId, companyId) && q.Term(t => t.IsDelete, false))
                                                                    );

            listTeams.Total = searchResponse.Total;
            listTeams.Data  = searchResponse.Documents.ToList();
            return(listTeams);
        }
 internal ElasticSearchBooleanOperation(ElasticSearchQuery search)
     : base(search)
 {
     _search = search;
 }
예제 #12
0
        public async Task <IActionResult> GetByQuery([FromBody] ElasticSearchQuery query)
        {
            var data = await _leadRepository.GetByQuery(query);

            return(Ok(data));
        }
        /// <summary>
        /// Executes query and returns original JSON response.
        /// Usefull when custom deserializer is needed or deserialization is not required
        /// </summary>
        public string ExecuteQueryRaw(QueryBuilder filledQuery, params GetParam[] additionGetParams)
        {
            ElasticSearchQuery query = BuildQuery(filledQuery);

            return(_elasticSearchExecutor.ExecuteQueryRaw(query, additionGetParams));
        }
예제 #14
0
        private TResult ApplyScalarMethods <TResult, TDocument>(ElasticSearchQuery query, ElasticSearchResults <TDocument> processedResults)
        {
            object scalarResult;
            var    method = query.Methods.First();

            switch (method.MethodType)
            {
            case QueryMethodType.All:
                scalarResult = true;
                break;

            case QueryMethodType.Any:
                scalarResult = processedResults.Any();
                break;

            case QueryMethodType.Count:
                scalarResult = processedResults.Count();
                break;

            case QueryMethodType.ElementAt:
                if (!((ElementAtMethod)method).AllowDefaultValue)
                {
                    scalarResult = processedResults.ElementAt(((ElementAtMethod)method).Index);
                }
                else
                {
                    scalarResult = processedResults.ElementAtOrDefault(((ElementAtMethod)method).Index);
                }
                break;

            case QueryMethodType.First:
                if (!((FirstMethod)method).AllowDefaultValue)
                {
                    scalarResult = processedResults.First();
                }
                else
                {
                    scalarResult = processedResults.FirstOrDefault();
                }
                break;

            case QueryMethodType.Last:
                if (!((LastMethod)method).AllowDefaultValue)
                {
                    scalarResult = processedResults.Last();
                }
                else
                {
                    scalarResult = processedResults.LastOrDefault();
                }
                break;

            case QueryMethodType.Single:
                if (!((SingleMethod)method).AllowDefaultValue)
                {
                    scalarResult = processedResults.Single();
                }
                else
                {
                    scalarResult = processedResults.SingleOrDefault();
                }
                break;

            case QueryMethodType.GetResults:
            {
                var searchHits = processedResults.GetSearchHits();
                var results2   = FormatFacetResults(processedResults.GetFacets(), query.FacetQueries);
                scalarResult = Activator.CreateInstance(typeof(TResult), new object[] { searchHits, processedResults.NumberFound, results2 });
                break;
            }

            case QueryMethodType.GetFacets:
                scalarResult = FormatFacetResults(processedResults.GetFacets(), query.FacetQueries);
                break;

            default:
                throw new InvalidOperationException("Invalid query method");
            }

            return((TResult)System.Convert.ChangeType(scalarResult, typeof(TResult)));
        }
        /// <summary>
        /// Executes simple _search query and fills results(_source) into provided TResultModel
        /// </summary>
        /// <param name="filledQuery">Filled query</param>
        /// <param name="additionGetParams">Additional get parameters to customize ES request</param>
        public SearchResult <TResultModel> ExecuteQuery <TResultModel>(QueryBuilder filledQuery, params GetParam[] additionGetParams)
        {
            ElasticSearchQuery query = BuildQuery(filledQuery);

            return(_elasticSearchExecutor.ExecuteQuery <TResultModel>(query, additionGetParams));
        }
예제 #16
0
        internal IQueryResponse <Dictionary <string, object> > Execute(ElasticSearchQuery query, Type resultType)
        {
            var index = _context.Index as ElasticSearchIndex;

            if (index == null)
            {
                return(new QueryResponse <Dictionary <string, object> >());
            }

            var descriptor = new SearchDescriptor <Dictionary <string, object> >();

            descriptor.Query(query.Query);

            //TODO: need to determine how to allow type specification, so that we don't have to hard-code AllTypes
            //NEST generates the search query URL based on the descriptor type, so if we use Dictionary<string, object> as the descriptor type, the query URL is:
            //http://[server]:9200/[indexname]/dictionary`2s/_search
            //instead we want it to be:
            //http://[server]:9200/[indexname]/_search
            //when searching over all types. so basically, we want the default to AllTypes unless a specific type is used.
            //In the context of Sitecore search, is it even possible to specify a type for the search? probably, but would need some sort of type mapping...
            descriptor.AllTypes();

            if (query.Filter != null)
            {
                descriptor.Filter(filterDescriptor => filterDescriptor.Query(q => query.Filter));
            }

            if (!Settings.DefaultLanguage.StartsWith(_cultureCode))
            {
                descriptor.Filter(f => f.Query(q => q.Term("_language", _cultureCode)));
            }

            var isResultsSizeSet = false;

            if (query.Methods != null)
            {
                var fields = new List <string>();

                var selectMethods = (from m in query.Methods
                                     where m.MethodType == QueryMethodType.Select
                                     select(SelectMethod) m).ToList <SelectMethod>();

                if (selectMethods.Any())
                {
                    foreach (var method in selectMethods)
                    {
                        fields.AddRange(method.FieldNames.Select(fieldName => fieldName.ToLowerInvariant()));
                    }

                    if (!_context.SecurityOptions.HasFlag(SearchSecurityOptions.DisableSecurityCheck))
                    {
                        fields.Add("_uniqueid");
                        fields.Add("_datasource");
                    }
                }

                var getResultsMethods = (from m in query.Methods
                                         where m.MethodType == QueryMethodType.GetResults
                                         select(GetResultsMethod) m).ToList <GetResultsMethod>();

                if (getResultsMethods.Any())
                {
                    if (fields.Count > 0)
                    {
                        fields.Add("score");
                    }
                }

                if (fields.Count > 0)
                {
                    descriptor.Fields(fields.ToArray());
                }

                var orderByMethods = (from m in query.Methods
                                      where m.MethodType == QueryMethodType.OrderBy
                                      select(OrderByMethod) m).ToList <OrderByMethod>();

                if (orderByMethods.Any())
                {
                    foreach (var method in orderByMethods)
                    {
                        var fieldName = method.Field;
                        switch (method.SortDirection)
                        {
                        case SortDirection.Ascending:
                            descriptor.SortAscending(fieldName);
                            break;

                        case SortDirection.Descending:
                            descriptor.SortDescending(fieldName);
                            break;
                        }
                    }
                }

                var skipMethods = (from m in query.Methods
                                   where m.MethodType == QueryMethodType.Skip
                                   select(SkipMethod) m).ToList <SkipMethod>();

                if (skipMethods.Any())
                {
                    var num = skipMethods.Sum(skipMethod => skipMethod.Count);
                    descriptor.Skip(num);
                }

                var takeMethods = (from m in query.Methods
                                   where m.MethodType == QueryMethodType.Take
                                   select(TakeMethod) m).ToList <TakeMethod>();

                if (takeMethods.Any())
                {
                    var num2 = takeMethods.Sum(takeMethod => takeMethod.Count);
                    descriptor.Size(num2);                     //Take is actually just an alias for Size in NEST, so just use Size instead.
                    isResultsSizeSet = true;
                }

                var countMethods = (from m in query.Methods
                                    where m.MethodType == QueryMethodType.Count
                                    select(CountMethod) m).ToList <CountMethod>();

                if (query.Methods.Count == 1 && countMethods.Any())
                {
                    descriptor.Size(0);                     //TODO: is using Size appropriate here? and is "0" the proper value to send?
                    isResultsSizeSet = true;
                }

                var anyMethods = (from m in query.Methods
                                  where m.MethodType == QueryMethodType.Any
                                  select(AnyMethod) m).ToList <AnyMethod>();

                if (query.Methods.Count == 1 && anyMethods.Any())
                {
                    descriptor.Size(0);                     //TODO: is using Size appropriate here? and is "0" the proper value to send?
                    isResultsSizeSet = true;
                }

                var getFacetsMethods = (from m in query.Methods
                                        where m.MethodType == QueryMethodType.GetFacets
                                        select(GetFacetsMethod) m).ToList <GetFacetsMethod>();

                //TODO: implement facet querying
                if ((query.FacetQueries.Count > 0) && (getFacetsMethods.Any() || getResultsMethods.Any()))
                {
                    //foreach (var facetQuery in GetFacetsPipeline.Run(new GetFacetsArgs(null, query.FacetQueries, _context.Index.Configuration.VirtualFieldProcessors, _context.Index.FieldNameTranslator)).FacetQueries.ToHashSet())
                    //{
                    //	if (!facetQuery.FieldNames.Any())
                    //		continue;

                    //	var nullable = facetQuery.MinimumResultCount;
                    //	if (facetQuery.FieldNames.Count() == 1)
                    //	{
                    //		var fieldNameTranslator = FieldNameTranslator as ElasticSearchFieldNameTranslator;
                    //		var indexFieldName = facetQuery.FieldNames.First();
                    //		if (((fieldNameTranslator != null) && (indexFieldName == fieldNameTranslator.StripKnownExtensions(indexFieldName))) && (_context.Index.Configuration.FieldMap.GetFieldConfiguration(indexFieldName) == null))
                    //		{
                    //			indexFieldName = fieldNameTranslator.GetIndexFieldName(indexFieldName.Replace("__", "!").Replace("_", " ").Replace("!", "__"), true);
                    //		}
                    //		IElasticSearchFacetQuery[] queries = new IElasticSearchFacetQuery[1];
                    //		ElasticSearchFacetFieldQuery query2 = new ElasticSearchFacetFieldQuery(indexFieldName)
                    //			{
                    //				MinCount = nullable
                    //			};
                    //		queries[0] = query2;
                    //		options.AddFacets(queries);
                    //	}
                    //	if (facetQuery.FieldNames.Any())
                    //	{
                    //		IElasticSearchFacetQuery[] queryArray2 = new IElasticSearchFacetQuery[1];
                    //		ElasticSearchFacetPivotQuery query3 = new ElasticSearchFacetPivotQuery
                    //			{
                    //				Fields = new[] { string.Join(",", facetQuery.FieldNames) },
                    //				MinCount = nullable
                    //			};
                    //		queryArray2[0] = query3;
                    //		options.AddFacets(queryArray2);
                    //	}
                    //}
                }
            }

            if (!isResultsSizeSet)
            {
                descriptor.Size(ContentSearchConfigurationSettings.SearchMaxResults);
            }

            //var blee = JsonConvert.SerializeObject(descriptor, Formatting.Indented);

            var serializedDescriptor = index.Client.Serialize(descriptor);

            SearchLog.Log.Info("Serialized Query - " + serializedDescriptor);

            var response = index.Client.Search(descriptor);

            if (!response.ConnectionStatus.Success)
            {
                SearchLog.Log.Error("Query exception - " + response.ConnectionStatus.Error.OriginalException);
            }

            return(response);
        }
예제 #17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="query"></param>
        /// <param name="language"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        public async Task <string> Export(ElasticSearchQuery query, string language, string userId)
        {
            query.From = 0;
            query.Size = QueryConstant.MaxLimit;
            var listLeads = await GetByQuery(query);

            var leads = listLeads.Data;
            var users = await _accountRepository.GetAll();

            var commonData = await _commonDataRepository.GetAll();

            var leadStatus         = commonData.Where(w => w.DataType == CommonDataType.Status);
            var definitionSources  = commonData.Where(w => w.DataType == CommonDataType.Source);
            var definitionChannels = commonData.Where(w => w.DataType == CommonDataType.Channel);
            var listVocative       = commonData.Where(w => w.DataType == CommonDataType.Vocative);
            var listMaritalStatus  = commonData.Where(w => w.DataType == CommonDataType.MaritalStatus);
            var listRelationship   = commonData.Where(w => w.DataType == CommonDataType.Relationship);
            var listGender         = commonData.Where(w => w.DataType == CommonDataType.Gender);

            string excelName = $"lead_export_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
            var    path      = Path.Combine(
                Directory.GetCurrentDirectory(),
                "wwwroot/Export", excelName);
            FileInfo     newFile   = new FileInfo(path);
            ExcelPackage excel     = new ExcelPackage();
            var          workSheet = excel.Workbook.Worksheets.Add("Lead");

            workSheet.TabColor         = Color.Black;
            workSheet.DefaultRowHeight = 12;

            //Header of table
            if (language == "vi")
            {
                workSheet.Row(1).Height = 20;
                workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                workSheet.Row(1).Style.Font.Bold           = true;
                workSheet.Cells[1, 1].Value  = "Họ tên";
                workSheet.Cells[1, 2].Value  = "Điện thoại";
                workSheet.Cells[1, 3].Value  = "Email";
                workSheet.Cells[1, 4].Value  = "Social Id";
                workSheet.Cells[1, 5].Value  = "Người phụ trách";
                workSheet.Cells[1, 6].Value  = "Người hỗ trợ";
                workSheet.Cells[1, 7].Value  = "Mối quan hệ";
                workSheet.Cells[1, 8].Value  = "Xưng hô";
                workSheet.Cells[1, 9].Value  = "Giới tính";
                workSheet.Cells[1, 10].Value = "Ngày sinh";
                workSheet.Cells[1, 11].Value = "Tình trạng hôn nhân";
                workSheet.Cells[1, 12].Value = "Trạng thái";
                workSheet.Cells[1, 13].Value = "Sản phẩm quan tâm";
                workSheet.Cells[1, 14].Value = "Ghi chú";
                workSheet.Cells[1, 15].Value = "Nguồn";
                workSheet.Cells[1, 16].Value = "Kênh";
                workSheet.Cells[1, 17].Value = "Chiến dịch";
                workSheet.Cells[1, 18].Value = "Địa chỉ";
                workSheet.Cells[1, 19].Value = "Số CMND";
                workSheet.Cells[1, 20].Value = "Ngày cấp";
                workSheet.Cells[1, 21].Value = "Nơi cấp";
            }
            else
            {
                workSheet.Row(1).Height = 20;
                workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                workSheet.Row(1).Style.Font.Bold           = true;
                workSheet.Cells[1, 1].Value  = "Fullname";
                workSheet.Cells[1, 2].Value  = "Phone";
                workSheet.Cells[1, 3].Value  = "Email";
                workSheet.Cells[1, 4].Value  = "Social Id";
                workSheet.Cells[1, 5].Value  = "Staff in charge";
                workSheet.Cells[1, 6].Value  = "Support";
                workSheet.Cells[1, 7].Value  = "Relationship";
                workSheet.Cells[1, 8].Value  = "Title";
                workSheet.Cells[1, 9].Value  = "Gender";
                workSheet.Cells[1, 10].Value = "Birthday";
                workSheet.Cells[1, 11].Value = "Marriage";
                workSheet.Cells[1, 12].Value = "Lead care status";
                workSheet.Cells[1, 13].Value = "Product interesting";
                workSheet.Cells[1, 14].Value = "Note";
                workSheet.Cells[1, 15].Value = "Source";
                workSheet.Cells[1, 16].Value = "Source channel";
                workSheet.Cells[1, 17].Value = "Campaign";
                workSheet.Cells[1, 18].Value = "Address";
                workSheet.Cells[1, 19].Value = "Identify";
                workSheet.Cells[1, 20].Value = "Date of issue";
                workSheet.Cells[1, 21].Value = "Place of issue";
            }

            //Body of table
            int recordIndex = 2;

            foreach (var lead in leads)
            {
                var status        = leadStatus.FirstOrDefault(f => f.Id == lead.Status);
                var source        = definitionSources.FirstOrDefault(f => f.Id == lead.Source);
                var channel       = definitionChannels.FirstOrDefault(f => f.Id == lead.Channel);
                var staffInCharge = users.FirstOrDefault(f => f.Id == lead.StaffInCharge);
                var supportStaff  = string.Join(", ", users.Where(w => lead.SupportStaff.Contains(w.Id)).Distinct().Select(s => s.FirstName + " " + s.LastName).ToList());
                var vocative      = listVocative.FirstOrDefault(f => f.Id == lead.Vocative);
                var maritalStatus = listMaritalStatus.FirstOrDefault(f => f.Id == lead.MaritalStatus);
                var relationship  = listRelationship.FirstOrDefault(f => f.Id == lead.Relationship);
                var gender        = listGender.FirstOrDefault(f => f.Id == lead.Gender);
                workSheet.Cells[recordIndex, 1].Value  = lead.FullName;
                workSheet.Cells[recordIndex, 2].Value  = lead.Phone;
                workSheet.Cells[recordIndex, 3].Value  = lead.Email;
                workSheet.Cells[recordIndex, 4].Value  = lead.SocialId;
                workSheet.Cells[recordIndex, 5].Value  = staffInCharge != null ? $"{staffInCharge.FirstName} {staffInCharge.LastName}" : string.Empty;
                workSheet.Cells[recordIndex, 6].Value  = supportStaff;
                workSheet.Cells[recordIndex, 7].Value  = relationship != null ? relationship.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 8].Value  = vocative != null ? vocative.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 9].Value  = gender != null ? gender.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 10].Value = lead.Birthday != null?lead.Birthday.Value.ToString("MM/dd/yyyy") : "";

                workSheet.Cells[recordIndex, 11].Value = maritalStatus != null ? maritalStatus.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 12].Value = status != null ? status.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 13].Value = lead.Interest;
                workSheet.Cells[recordIndex, 14].Value = lead.Note;
                workSheet.Cells[recordIndex, 15].Value = source != null ? source.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 16].Value = channel != null ? channel.DataValue : string.Empty;
                workSheet.Cells[recordIndex, 17].Value = lead.Campaign;
                workSheet.Cells[recordIndex, 18].Value = lead.Address;
                workSheet.Cells[recordIndex, 19].Value = lead.IdentityCard;
                workSheet.Cells[recordIndex, 20].Value = lead.DateOfIssue != null?lead.DateOfIssue.Value.ToString("MM/dd/yyyy") : "";

                workSheet.Cells[recordIndex, 21].Value = lead.PlaceOfIssue;
                recordIndex++;
            }

            //auto fit
            //for (int i = 1; i <= 24; i++)
            //{
            //    workSheet.Column(i).AutoFit();
            //}
            //color header
            Color colFromHex = System.Drawing.ColorTranslator.FromHtml("#1e88e5");

            workSheet.Cells["A1:U1"].Style.Fill.PatternType = ExcelFillStyle.Solid;
            workSheet.Cells["A1:U1"].Style.Fill.BackgroundColor.SetColor(colFromHex);
            workSheet.Cells["A1:U1"].Style.Font.Color.SetColor(Color.White);

            //border
            string modelRange = "A1:U" + (--recordIndex).ToString();
            var    modelTable = workSheet.Cells[modelRange];

            modelTable.Style.Border.Top.Style    = ExcelBorderStyle.Thin;
            modelTable.Style.Border.Left.Style   = ExcelBorderStyle.Thin;
            modelTable.Style.Border.Right.Style  = ExcelBorderStyle.Thin;
            modelTable.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;

            excel.SaveAs(newFile);

            return(excelName);
        }
예제 #18
0
        public async Task <IActionResult> GetByQuery([FromBody] ElasticSearchQuery query)
        {
            var result = await _teamRepository.GetByQuery(query);

            return(Ok(result));
        }
예제 #19
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="data"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string GetHashValueWithMoreParams(this ElasticSearchQuery data, dynamic[] param)
        {
            var hashValue = string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(data) + JsonConvert.SerializeObject(param))).Select(s => s.ToString("x2")));

            return(hashValue);
        }
예제 #20
0
        public async Task <IActionResult> GetByQuery([FromBody] ElasticSearchQuery data)
        {
            var result = await _activityHistoryLeadRepository.GetByQuery(data);

            return(Ok(result));
        }