Esempio n. 1
0
        public async Task <IEnumerable <BaseConhecimento> > GetWithBaseChildsAsync(string[] searchArr, decimal idUser, int?pageNumber, int pageSize)
        {
            List <Resumo>     resumos           = new List <Resumo>();
            List <BuscaChave> tags              = new List <BuscaChave>();
            var lsVersion                       = new List <BaseConhecimento>();
            IEnumerable <BaseConhecimento> data = null;
            Expression <Func <BaseConhecimento, bool> > WhereVisibilidadeBase = null;
            int totalFound = 0;
            int total      = 0;

            // Monta filtro de Tipo de Visualização da Base de Conhecimento
            if (idUser == 0)
            {
                WhereVisibilidadeBase = b => b.TpVisualizacao == EnumHelper.Visibilidade.PUBLICO.ToString();
            }
            else
            {
                WhereVisibilidadeBase = b =>
                                        (
                    b.TpVisualizacao != EnumHelper.Visibilidade.PRIVADO.ToString() ||
                    (b.TpVisualizacao == EnumHelper.Visibilidade.PRIVADO.ToString() && b.IdUsuarioRegistro == idUser)
                                        );
            }

            if (searchArr.Length > 0)
            {
                data = await _db
                       .Include(c => c.CausaRaiz)
                       .Include(r => r.Resumo)
                       .Include(s => s.SolucaoPaliativa)
                       .Include(s => s.BuscaChave)
                       .ThenInclude(e => e.PalavraChave)
                       .Include(p => p.BaseProduto)
                       .ThenInclude(e => e.Produto)

                       // Filtra a Base de Conhecimento de acordo com a(s) palavra(s) chave informada(s)
                       .Where(d => d.BuscaChave
                              .Where(a => searchArr.Contains(a.PalavraChave.Palavra.RemoveAccents().ToLower())).Any())

                       // Filtra a Base de Conhecimento de acordo com a Visibilidade
                       .Where(WhereVisibilidadeBase)

                       // Filtra Paginação na Base de Dados
                       .Skip(((pageNumber ?? 1) - 1) * pageSize).Take(pageSize)
                       .ToListAsync();

                total = await _db
                        .Where(d => d.BuscaChave
                               .Where(a => searchArr.Contains(a.PalavraChave.Palavra.RemoveAccents().ToLower())).Any())
                        .Where(WhereVisibilidadeBase).CountAsync();

                // Se não encontra, procura no Titulo, Resumo, etc
                if (data.Count() == 0)
                {
                    var WhereResumo = PredicateHelper.False <Resumo>();

                    foreach (var item in searchArr)
                    {
                        WhereResumo = WhereResumo.Or(p => p.DsTituloPuro.ToLower().Contains(item));
                        WhereResumo = WhereResumo.Or(p => p.TextoPuro.Contains(item));
                    }

                    data = await _db
                           .Include(c => c.CausaRaiz)
                           .Include(r => r.Resumo)
                           .Include(s => s.SolucaoPaliativa)
                           .Include(s => s.BuscaChave)
                           .ThenInclude(e => e.PalavraChave)
                           .Include(p => p.BaseProduto)
                           .ThenInclude(e => e.Produto)

                           // Filtra o Titulo e o Resumo de acordo com a(s) palavra(s) chave informada(s)
                           .Where(r => r.Resumo.AsQueryable()
                                  .Where(WhereResumo).Any())

                           // Filtra a Base de Conhecimento de acordo com a Visibilidade
                           .Where(WhereVisibilidadeBase)

                           // Filtra Paginação na Base de Dados
                           .Skip(((pageNumber ?? 1) - 1) * pageSize).Take(pageSize)
                           .ToListAsync();

                    total = await _db
                            .Where(r => r.Resumo.AsQueryable()
                                   .Where(WhereResumo).Any())
                            .Where(WhereVisibilidadeBase).CountAsync();
                }
            }
            else
            {
                data = await _db
                       .Include(c => c.CausaRaiz)
                       .Include(r => r.Resumo)
                       .Include(s => s.SolucaoPaliativa)
                       .Include(s => s.BuscaChave)
                       .ThenInclude(e => e.PalavraChave)
                       .Include(p => p.BaseProduto)
                       .ThenInclude(e => e.Produto)

                       // Filtra a Base de Conhecimento de acordo com a Visibilidade
                       .Where(WhereVisibilidadeBase)

                       // Filtra Paginação na Base de Dados
                       .Skip(((pageNumber ?? 1) - 1) * pageSize).Take(pageSize)
                       .ToListAsync();

                total = await _db.Where(WhereVisibilidadeBase).CountAsync();
            }

            // Adiciona Destaque(Cor Amarela) nas palavras encontradas na busca
            foreach (var item in data)
            {
                AddHighLightWord
                (
                    item.Resumo.Where(d => d.SeqVersao == item.Resumo.Select(y => y.SeqVersao).Max()),
                    item.BuscaChave,
                    searchArr,
                    resumos,
                    tags,
                    out totalFound,
                    searchArr.Length > 0
                );

                lsVersion.Add(

                    new BaseConhecimento
                {
                    Id                = item.Id,
                    DtHrRegistro      = item.DtHrRegistro,
                    IdUsuarioRegistro = item.IdUsuarioRegistro,
                    TpVisualizacao    = item.TpVisualizacao,
                    StBase            = item.StBase,
                    Usuario           = item.Usuario,
                    TipoVisualizacao  = item.TipoVisualizacao,
                    SituacaoBase      = item.SituacaoBase,
                    BuscaChave        = tags.Where(c => c.Id == item.Id).ToList(),
                    TotalMath         = total, //totalFound,

                    // Filtra a CausaRaiz de maior Versão
                    CausaRaiz = item.CausaRaiz
                                .Where(d => d.SeqVersao == item.CausaRaiz.Select(y => y.SeqVersao).Max()).ToList(),

                    // Filtra o Resumo de maior Versão
                    Resumo = resumos.Where(r => r.Id == item.Id).ToList(),

                    // Filtra a Solução Paliativa de maior Versão
                    SolucaoPaliativa = item.SolucaoPaliativa
                                       .Where(d => d.SeqVersao == item.SolucaoPaliativa.Select(y => y.SeqVersao).Max()).ToList(),

                    BaseProduto = item.BaseProduto
                }
                    );
            }

            lsVersion.OrderByDescending(b => b.DtHrRegistro);

            return(lsVersion);
        }