예제 #1
0
        public async Task <FileDto> SearchTendersToXLS(TenderSearchDto searchDto)
        {
            var currentUser = await _userService.GetCurrentUserAsync();

            var company = await _dataContext.Companies
                          .Include(c => c.Subscriptions)
                          .ThenInclude(s => s.Tariff)
                          .SingleOrDefaultAsync(c => c.Id == currentUser.Id);

            if (!company.Subscriptions?.Any(s => s.Active && s.EndDate > DateTime.Now.Date && s.Tariff.ExportToXL) ?? true)
            {
                throw new BusinessException("Выгрузка Exel не доступна. Продлить тариф можно в личном кабинете");
            }

            var query = await SearchTendersByPatternQuery(searchDto, auto : false);

            var results = await query.ToListAsync();

            using var stream = ExcelService.CreateTendersXLSXToStream(results);

            return(new FileDto()
            {
                Content = stream.ToArray(),
                ContentType = "application/vnd.ms-excel",
                Name = "Tenders.xlsx"
            });
        }
예제 #2
0
        public async Task <PagedResult <TenderListDto> > SearchTenders(TenderSearchDto searchDto, int pageNumber = 1, int pageSize = 20)
        {
            var currentUser = await _userService.GetCurrentUserAsync();

            var query = await SearchTendersByPatternQuery(searchDto, auto : false);

            return(await query
                   .Select(GetTenderListDtoExpression(currentUser.Id))
                   .OrderByDescending(t => t.PublishDate)
                   .GetPagedResult(pageSize, pageNumber));
        }
예제 #3
0
        public async Task <IActionResult> SearchToExcel([FromBody] TenderSearchDto searchDto)
        {
            var fileDto = await _tenderSearchService.SearchTendersToXLS(searchDto);

            return(File(fileDto.Content, fileDto.ContentType, fileDto.Name));
        }
예제 #4
0
        public async Task <IActionResult> Search([FromBody] TenderSearchDto searchDto, int pageSize = 20, int pageNumber = 1)
        {
            var pagedEntities = await _tenderSearchService.SearchTenders(searchDto, pageNumber, pageSize);

            return(Ok(_mapper.Map <PagedResultContract <TenderListContract> >(pagedEntities)));
        }
예제 #5
0
        private async Task <IQueryable <Tender> > SearchTendersByPatternQuery(TenderSearchDto searchDto, bool auto)
        {
            var query = GetFullQuery();

            if (auto)
            {
                query = query.Where(t => t.ChangeDate.Date >= searchDto.SinceDate);
            }
            else
            {
                query = query.Where(t => t.PublishDate.Date >= searchDto.SinceDate);
            }

            if (!searchDto.ShowEnded)
            {
                query = query.Where(t => t.Status == TenderStatus.GETTING_APPLICATIONS && t.SubmissionCloseDate.Date >= DateTime.Now.Date);
            }

            if (!string.IsNullOrEmpty(searchDto.SearchString))
            {
                if (searchDto.StrictEqual)
                {
                    query = query.Where(t => t.Name.Contains(searchDto.SearchString));
                }
                else
                {
                    query = query.Where(t => t.SearchVector.Matches(EF.Functions.PlainToTsQuery(searchDto.SearchString)));
                }
            }

            if (searchDto.RegionId.HasValue)
            {
                query = query.Where(t => t.RegionId == searchDto.RegionId);
            }

            if (searchDto.LawType.HasValue)
            {
                query = query.Where(t => t.LawType == searchDto.LawType.Value);
            }

            if (searchDto.PlacingWay.HasValue)
            {
                query = query.Where(t => t.PlacingWay == searchDto.PlacingWay);
            }

            if (searchDto.OnlySMP)
            {
                query = query.Where(t => new PlacingWay[] { PlacingWay.AESMBO, PlacingWay.KESMBO, PlacingWay.ZKESMBO, PlacingWay.ZPESMBO }.Contains(t.PlacingWay));
            }

            if (searchDto.OrganizationId.HasValue)
            {
                query = query.Where(t => t.OwnerId == searchDto.OrganizationId);
            }

            if (searchDto.CodesIds?.Any() ?? false)
            {
                var codesIds = new List <long>();
                codesIds.AddRange(searchDto.CodesIds);

                if (searchDto.IncludedCodes)
                {
                    var allcodes = await _dataContext.OkpdCodes.ToListAsync();

                    var childCodes = new List <long>();
                    foreach (var codeId in codesIds)
                    {
                        childCodes.AddRange(GetChildsCodesIds(codeId, allcodes));
                    }

                    codesIds.AddRange(childCodes);
                }

                query = query.Where(t => t.Lots.Any(lot => codesIds.Contains(lot.Id)));
            }

            if (searchDto.MinPrice.HasValue)
            {
                query = query.Where(t => t.PublishSum >= searchDto.MinPrice);
            }

            if (searchDto.MaxPrice.HasValue)
            {
                query = query.Where(t => t.PublishSum <= searchDto.MaxPrice);
            }

            return(query);
        }