public static List <CorrespondenciaDocs> GetSuggestions(List <DocumentoExterno> deList) { var ticks = DateTime.Now.Ticks; var raes = new HashSet <RegistoAutoridadeExterno>(); var decs = new HashSet <DocumentoComposto>(); var deas = new HashSet <DocumentoAnexo>(); var des = new HashSet <DocumentoSimples>(); foreach (var de in deList.OfType <DocumentoSimples>()) { des.Add(de); if (de.Tipologia != null) { raes.Add(de.Tipologia); } if (de.Onomastico != null) { raes.Add(de.Onomastico); } if (de.Toponimia != null) { raes.Add(de.Toponimia); } if (de.Ideografico != null) { raes.Add(de.Ideografico); } if (de.TecnicoDeObra != null) { raes.Add(de.TecnicoDeObra); } } foreach (var de in deList.OfType <DocumentoAnexo>()) { deas.Add(de); } foreach (var de in deList.OfType <DocumentoComposto>()) { decs.Add(de); if (de.Produtor != null) { raes.Add(de.Produtor); } if (de.Tipologia != null) { raes.Add(de.Tipologia); } de.LocalizacoesObraDesignacaoActual.ToList().ForEach(g => raes.Add(g.LocalizacaoObraDesignacaoActual)); de.TecnicosDeObra.ToList().ForEach(o => raes.Add(o)); } Dictionary <DocumentoSimples, DocumentoGisa> docsComCorrespAnteriores; Dictionary <DocumentoAnexo, DocumentoGisa> docsAnexosComCorrespAnteriores; Dictionary <DocumentoComposto, DocumentoGisa> docsCompostosComCorrespAnteriores; Dictionary <RegistoAutoridadeExterno, RegistoAutoridadeInterno> rasComCorrespAnteriores; Dictionary <DocumentoSimples, DocumentoGisa> docsComNovasCorrespEncontradas; Dictionary <DocumentoAnexo, DocumentoGisa> docsAnexosComNovasCorrespEncontradas; Dictionary <DocumentoComposto, DocumentoGisa> docsCompostosComNovasCorrespEncontradas; Dictionary <RegistoAutoridadeExterno, RegistoAutoridadeInterno> rasComNovasCorrespEncontradas; Dictionary <DocumentoSimples, DocumentoGisa> docsSimplesNovos; Dictionary <DocumentoAnexo, DocumentoGisa> docsAnexosNovos; Dictionary <DocumentoComposto, DocumentoGisa> docsCompostosNovos; Dictionary <RegistoAutoridadeExterno, RegistoAutoridadeInterno> rasNovos; var ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { GisaDataSetHelper.ManageDatasetConstraints(false); //obter dados gisa, com base nos dados externos docsComCorrespAnteriores = Database.Database.GetDocsCorrespondenciasAnteriores(des.Distinct().ToList(), ho.Connection); docsAnexosComCorrespAnteriores = Database.Database.GetDocsCorrespondenciasAnteriores(deas.Distinct().ToList(), ho.Connection); docsCompostosComCorrespAnteriores = Database.Database.GetDocsCorrespondenciasAnteriores(decs.Distinct().ToList(), ho.Connection); rasComCorrespAnteriores = Database.Database.GetRAsCorrespondenciasAnteriores(raes.Distinct().ToList(), ho.Connection); //recolher lista dos que nao têm match List <DocumentoSimples> docsSemCorrespAnteriores = des.Where(doc => !docsComCorrespAnteriores.ContainsKey(doc)).ToList(); List <DocumentoAnexo> docsAnexosSemCorrespAnteriores = deas.Where(doc => !docsAnexosComCorrespAnteriores.ContainsKey(doc)).ToList(); List <DocumentoComposto> docsCompostosSemCorrespAnteriores = decs.Where(doc => !docsCompostosComCorrespAnteriores.ContainsKey(doc)).ToList(); List <RegistoAutoridadeExterno> rasSemCorrespAnteriores = raes.Where(rae => !rasComCorrespAnteriores.ContainsKey(rae)).ToList(); //criar correspondencias com documentos já existentes docsComNovasCorrespEncontradas = Database.Database.GetDocsCorrespondenciasNovas(docsSemCorrespAnteriores, ho.Connection); docsAnexosComNovasCorrespEncontradas = Database.Database.GetDocsCorrespondenciasNovas(docsAnexosSemCorrespAnteriores, ho.Connection); docsCompostosComNovasCorrespEncontradas = Database.Database.GetDocsCorrespondenciasNovas(docsCompostosSemCorrespAnteriores, ho.Connection); rasComNovasCorrespEncontradas = Database.Database.GetRAsCorrespondenciasNovas(rasSemCorrespAnteriores, ho.Connection); //recolher lista dos que nao têm match List <DocumentoSimples> docsSemCorrespNovasEncontradas = des.Where(doc => !docsComCorrespAnteriores.ContainsKey(doc) && !docsComNovasCorrespEncontradas.ContainsKey(doc)).ToList(); List <DocumentoAnexo> docsAnexosSemCorrespNovasEncontradas = deas.Where(doc => !docsAnexosComCorrespAnteriores.ContainsKey(doc) && !docsAnexosComNovasCorrespEncontradas.ContainsKey(doc)).ToList(); List <DocumentoComposto> docsCompostosSemCorrespNovasEncontradas = decs.Where(doc => !docsCompostosComCorrespAnteriores.ContainsKey(doc) && !docsCompostosComNovasCorrespEncontradas.ContainsKey(doc)).ToList(); List <RegistoAutoridadeExterno> rasSemCorrespNovasEncontradas = raes.Where(ra => !rasComCorrespAnteriores.ContainsKey(ra) && !rasComNovasCorrespEncontradas.ContainsKey(ra)).ToList(); //criar documentos novos para os que não tinham match var docsNovos = InternalEntitiesFactory.CreateInternalEntities(docsSemCorrespNovasEncontradas.Cast <DocumentoExterno>().ToList()); docsSimplesNovos = docsNovos.ToDictionary(doc => (DocumentoSimples)doc.Key, doc => (DocumentoGisa)doc.Value); docsNovos = InternalEntitiesFactory.CreateInternalEntities(docsAnexosSemCorrespNovasEncontradas.Cast <DocumentoExterno>().ToList()); docsAnexosNovos = docsNovos.ToDictionary(doc => (DocumentoAnexo)doc.Key, doc => (DocumentoGisa)doc.Value); docsNovos = InternalEntitiesFactory.CreateInternalEntities(docsCompostosSemCorrespNovasEncontradas.Cast <DocumentoExterno>().ToList()); docsCompostosNovos = docsNovos.ToDictionary(doc => (DocumentoComposto)doc.Key, doc => (DocumentoGisa)doc.Value); rasNovos = InternalEntitiesFactory.CreateInternalEntities(rasSemCorrespNovasEncontradas); } catch (Exception e) { Console.WriteLine(e.ToString()); throw; } finally { GisaDataSetHelper.ManageDatasetConstraints(true); ho.Dispose(); } var dis = new List <DocumentoGisa>(); dis.AddRange(docsComCorrespAnteriores.Values.ToArray()); dis.AddRange(docsComNovasCorrespEncontradas.Values.ToArray()); dis.AddRange(docsSimplesNovos.Values.ToArray()); var rais = new List <RegistoAutoridadeInterno>(); rais.AddRange(rasComCorrespAnteriores.Values.ToArray()); rais.AddRange(rasComNovasCorrespEncontradas.Values.ToArray()); rais.AddRange(rasNovos.Values.ToArray()); // Dependências existentes entre objectos correspondencia: // - o objecto correspondencia referente à tipologia do processo é a mesma no objectos correspondencia desse processo referenciados nos documentos simples // - em cada documento simples, o objecto correspondencia referente ao produtor é o mesmo referenciado no seu processo // - cada documento simples ou composto tem na sua propriedade 'Processo' a referência para o 'CorrespondenciaDocs' do seu processo var correspondenciasDocs = new List <CorrespondenciaDocs>(); var tipologias = new Dictionary <DocumentoComposto, CorrespondenciaRAs>(); var processos = new Dictionary <DocumentoComposto, CorrespondenciaDocs>(); foreach (var de in decs) { CorrespondenciaDocs correspondenciaDocComposto = (CorrespondenciaDocs)AssembleCorrespondencia(de, docsCompostosComCorrespAnteriores, docsCompostosComNovasCorrespEncontradas, docsCompostosNovos, CreateCorrespondenciaDocsCompostos); correspondenciasDocs.Add(correspondenciaDocComposto); processos.Add(de, correspondenciaDocComposto); foreach (var rae in de.RegistosAutoridade) { CorrespondenciaRAs correspondenciaRAs = (CorrespondenciaRAs)AssembleCorrespondencia(rae, rasComCorrespAnteriores, rasComNovasCorrespEncontradas, rasNovos, CreateCorrespondenciaRAs); correspondenciaDocComposto.AddCorrespondenciaRA(correspondenciaRAs); DefineStatesCorrespondenciaRAs(correspondenciaDocComposto, correspondenciaRAs); } var correspTipologia = correspondenciaDocComposto.CorrespondenciasRAs.SingleOrDefault(c => ((RegistoAutoridadeInterno)c.EntidadeInterna).TipoNoticiaAut == TipoNoticiaAut.TipologiaInformacional); if (correspTipologia != null) { tipologias.Add(de, correspTipologia); } // definir entidades internas para a tipologia que já esteja associada ao documento (se existir alguma associada) if (correspondenciaDocComposto.EntidadeInterna.Id > 0 && docsCompostosComNovasCorrespEncontradas.ContainsKey((DocumentoComposto)correspondenciaDocComposto.EntidadeExterna)) { Database.Database.AddTipologiaOriginal(correspondenciaDocComposto); } } //documentos simples foreach (var de in des) { CorrespondenciaDocs correspondenciaDocs = (CorrespondenciaDocs)AssembleCorrespondencia(de, docsComCorrespAnteriores, docsComNovasCorrespEncontradas, docsSimplesNovos, CreateCorrespondenciaDocs); correspondenciasDocs.Add(correspondenciaDocs); ((DocumentoGisa)correspondenciaDocs.EntidadeInterna).Processo = processos[de.Processo]; foreach (var rae in de.RegistosAutoridade) { CorrespondenciaRAs correspondenciaRAs = (CorrespondenciaRAs)AssembleCorrespondencia(rae, rasComCorrespAnteriores, rasComNovasCorrespEncontradas, rasNovos, CreateCorrespondenciaRAs); correspondenciaDocs.AddCorrespondenciaRA(correspondenciaRAs); DefineStatesCorrespondenciaRAs(correspondenciaDocs, correspondenciaRAs); } if (correspondenciaDocs.TipoSugestao != TipoSugestao.Historico) { // definir entidades internas para a tipologia que já esteja associada ao documento (se existir alguma associada) if (correspondenciaDocs.EntidadeInterna.Id > 0 && docsComNovasCorrespEncontradas.ContainsKey((DocumentoSimples)correspondenciaDocs.EntidadeExterna)) { Database.Database.AddTipologiaOriginal(correspondenciaDocs); } } } //anexos foreach (var de in deas) { CorrespondenciaDocs correspondenciaDocsAnexos = (CorrespondenciaDocs)AssembleCorrespondencia(de, docsAnexosComCorrespAnteriores, docsAnexosComNovasCorrespEncontradas, docsAnexosNovos, CreateCorrespondenciaDocsAnexos); correspondenciasDocs.Add(correspondenciaDocsAnexos); ((DocumentoGisa)correspondenciaDocsAnexos.EntidadeInterna).Processo = processos[de.Processo]; } System.Diagnostics.Debug.WriteLine(">> " + new TimeSpan(DateTime.Now.Ticks - ticks).ToString()); return(correspondenciasDocs); }
public EntidadeInterna AddInternalEntity <X>(X InternalEntity) where X : EntidadeInterna { return(InternalEntitiesFactory.AddEntidade(lstEntidadesInternas, InternalEntity)); }