protected void odsArquivoCalcEngine_Inserted(object sender, Colosoft.WebControls.VirtualObjectDataSourceStatusEventArgs e) { if (e.Exception == null) { // Salva o arquivo que será subido. var fluArquivoCalcEngine = ((FileUpload)dtvArquivoCalcEngine.FindControl("fluArquivoCalcEngine")); // Recupera o id do último arquivo CalcEngine inserido no sistema. var idArquivoCalcEngine = (uint)ArquivoCalcEngineDAO.Instance.ObtemUltimoIdArquivoCalcEngine(); try { // Variável criada para recuperar os arquivos do .calcpackage. CalcEngine.ProjectFilesPackage pacote = null; // Variável criada para ler a configuração do projeto. CalcEngine.Dxf.DxfProject projeto = null; // Lista criada para setar as variáveis do CalcEngine. var lstVariaveisCalcEngine = new List <ArquivoCalcEngineVariavel>(); using (System.IO.Stream pacoteStream = fluArquivoCalcEngine.FileContent) { // Esse método deserializa os dados do pacote que estão contidos na Stream a recupera a instância do pacote de configuração. pacote = CalcEngine.ProjectFilesPackage.LoadPackage(pacoteStream); } // Lê a configuração do projeto. projeto = CalcEngine.Dxf.DxfProject.LoadFromPackage(pacote); // Seta as variáveis do CalcEngine em uma lista. foreach (var variavel in projeto.Variables.Where(f => f.GetType() == typeof(CalcEngine.Variable))) { // Cria uma nova variável CalcEngine. var variavelCalcEngine = new ArquivoCalcEngineVariavel(); variavelCalcEngine.VariavelCalcEngine = variavel.Name; // Salva o valor padrão da variável somente se não forem medidas de altura ou largura. variavelCalcEngine.ValorPadrao = (decimal)(variavel.Name.ToLower() == "altura" || variavel.Name.ToLower() == "largura" || variavel.Name.ToLower() == "alturabase" || variavel.Name.ToLower() == "largurabase" ? 0 : variavel.Value); if (variavel.Name.ToLower() == "altura" || variavel.Name.ToLower() == "largura" || variavel.Name.ToLower() == "alturabase" || variavel.Name.ToLower() == "largurabase") { variavelCalcEngine.VariavelSistema = variavelCalcEngine.VariavelCalcEngine; } // Seta a variável CalcEngine na lista. lstVariaveisCalcEngine.Add(variavelCalcEngine); } // Salva as variáveis do CalcEngine. foreach (var variavel in lstVariaveisCalcEngine) { variavel.IdArquivoCalcEngine = idArquivoCalcEngine; // Insere a variável do arquivo CalcEngine e associa-a ao arquivo. ArquivoCalcEngineVariavelDAO.Instance.Insert(variavel); } } catch (Exception ex) { // Caso o arquivo tenha sido salvo, então deve ser excluído. if (System.IO.File.Exists(ProjetoConfig.CaminhoSalvarCalcEngine + fluArquivoCalcEngine.FileName)) { System.IO.File.Delete(ProjetoConfig.CaminhoSalvarCalcEngine + fluArquivoCalcEngine.FileName); } // Deleta as variáveis associadas ao arquivo CalcEngine. ArquivoCalcEngineVariavelDAO.Instance.DeletaPeloIdArquivoCalcEngine(idArquivoCalcEngine); ArquivoCalcEngineDAO.Instance.DeleteByPrimaryKey(idArquivoCalcEngine); // Retorna uma mensagem informando o erro ocorrido ao salvar o arquivo. throw ex; } Response.Redirect("CadArquivoCalcEngine.aspx?IdArquivoCalcEngine=" + idArquivoCalcEngine); } else { // Deleta as variáveis associadas ao arquivo CalcEngine. ArquivoCalcEngineVariavelDAO.Instance.DeletaPeloIdArquivoCalcEngine((uint)(ArquivoCalcEngineDAO.Instance.ObtemUltimoIdArquivoCalcEngine() + 1)); Glass.MensagemAlerta.ErrorMsg("Erro ao inserir o arquivo.", e.Exception.InnerException, this); e.ExceptionHandled = true; } }
/// <summary> /// Método criado para a importação da ferragem. Insere as ferragens do arquivo, no WebGlass. /// </summary> private static ResultadoImportacao SalvarItens(List <ExportarFerragem.Item> itens, bool substituirFerragemExistente) { #region Declaração de variáveis var ferragemFluxo = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <IFerragemFluxo>(); var ferragemId = new List <Tuple <int, Entidades.Ferragem> >(); var fabricanteFerragemId = new List <Tuple <int, Entidades.FabricanteFerragem> >(); var fabricantesFerragemInseridos = new List <Entidades.FabricanteFerragem>(); var repositorioImagemFerragem = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <Entidades.IFerragemRepositorioImagens>(); var repositorioCalcPackageFerragem = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <Entidades.IFerragemRepositorioCalcPackage>(); var resultadoImportacao = new ResultadoImportacao(); #endregion #region Recuperação dos objetos que devem ser atualizados ao invés de serem inseridos // Caso as ferragens devam ser substituídas, busca todas as ferragens, do arquivo de exportação, que existem no sistema de importação. if (substituirFerragemExistente) { // Recupera todas as ferragens, do sistema atual, com base no nome delas e no nome do fabricante associado. ferragemId = SourceContext.Instance.CreateQuery() .Select("f.IdFerragem, f.Nome, f.IdFabricanteFerragem") .From <Ferragem>("f") .Where(string.Join(" OR ", itens?.Select(f => string.Format("f.Nome='{0}'", f.Ferragem.Nome)))) // Seleciona os IDs de ferragem do arquivo de exportação, junto com as entidades de ferragens (correspondentes) no sistema de importação. .Execute()?.Select(f => new Tuple <int, Entidades.Ferragem>((itens.FirstOrDefault(g => g.Ferragem.Nome == f.GetString(1))?.Ferragem.IdFerragem).GetValueOrDefault(), ferragemFluxo.ObterFerragem(f.GetInt32(0)))).Distinct().ToList(); } // O fabricante deve ser sempre atualizado, caso exista no sistema de importação. Independentemente da existência da ferragem. if (itens.Any(f => f.FabricanteFerragem?.IdFabricanteFerragem > 0)) { // No sistema onde o arquivo está sendo importado, recupera os fabricantes que possuem o mesmo nome dos fabricantes inseridos no arquivo de exportação. fabricanteFerragemId = SourceContext.Instance.CreateQuery() .Select("ff.IdFabricanteFerragem, ff.Nome") .From <FabricanteFerragem>("ff") .Where(string.Join(" OR ", itens?.Select(f => string.Format("ff.Nome='{0}'", f.FabricanteFerragem.Nome)))) // Seleciona os IDs de fabricante de ferragem do arquivo de exportação, junto com as entidades de fabricantes de ferragens (correspondentes) no sistema de importação. .Execute()?.Select(f => new Tuple <int, Entidades.FabricanteFerragem>((itens.FirstOrDefault(g => g.FabricanteFerragem.Nome == f.GetString(1))?.FabricanteFerragem.IdFabricanteFerragem).GetValueOrDefault(), ferragemFluxo.ObterFabricanteFerragem(f.GetInt32(0)))).Distinct().ToList(); } #endregion // Percorre cada item, do arquivo de exportação, e os insere no sistema. for (var i = 0; i < itens.Count(); i++) { try { #region Declaração de variáveis // Entidade de ferragem. Entidades.Ferragem ferragem = null; // Entidade de fabricante de ferragem. Entidades.FabricanteFerragem fabricanteFerragem = null; #endregion #region Recuperação/criação da ferragem // Verifica se a ferragem existe no sistema atual. if (ferragemId != null && ferragemId.Any(f => f.Item1 == itens[i].Ferragem.IdFerragem)) { ferragem = ferragemId.FirstOrDefault(f => f.Item1 == itens[i].Ferragem.IdFerragem).Item2; } // Cria uma nova ferragem. else { ferragem = ferragemFluxo.CriarFerragem(); } #region Propriedades ferragem // Define/atualiza os dados da ferragem, com base no arquivo de importação. ferragem.Altura = itens[i].Ferragem.Altura; ferragem.EstiloAncoragem = itens[i].Ferragem.EstiloAncoragem; ferragem.Largura = itens[i].Ferragem.Largura; ferragem.MedidasEstaticas = itens[i].Ferragem.MedidasEstaticas; ferragem.Nome = itens[i].Ferragem.Nome; ferragem.PodeEspelhar = itens[i].Ferragem.PodeEspelhar; ferragem.PodeRotacionar = itens[i].Ferragem.PodeRotacionar; ferragem.Situacao = itens[i].Ferragem.Situacao; ferragem.UUID = itens[i].Ferragem.UUID; #endregion #region Fabricante ferragem // Verifica se o fabricante existe no sistema atual. if (fabricanteFerragemId?.Any(f => f.Item1 == itens[i].FabricanteFerragem.IdFabricanteFerragem) ?? false) { // Recupera o fabricante. Os dados não devem ser atualizados. fabricanteFerragem = fabricanteFerragemId.FirstOrDefault(f => f.Item1 == itens[i].FabricanteFerragem.IdFabricanteFerragem).Item2; } else if (fabricantesFerragemInseridos.Any(f => f.Nome.ToLowerInvariant() == itens[i].FabricanteFerragem.Nome.ToLowerInvariant())) { fabricanteFerragem = fabricantesFerragemInseridos.FirstOrDefault(f => f.Nome.ToLowerInvariant() == itens[i].FabricanteFerragem.Nome.ToLowerInvariant()); } else { // Cria um novo fabricante. fabricanteFerragem = new Entidades.FabricanteFerragem(); fabricanteFerragem.Nome = itens[i].FabricanteFerragem.Nome; fabricanteFerragem.Sitio = itens[i].FabricanteFerragem.Sitio; // Insere/atualiza o fabricante. var retornoFabricanteFerragem = ferragemFluxo.SalvarFabricanteFerragem(fabricanteFerragem); // Caso ocorra algum erro na atualização do fabricante, a ferragem não deve ser inserida. if (!retornoFabricanteFerragem) { throw new Exception(retornoFabricanteFerragem.Message.ToString()); } else { fabricantesFerragemInseridos.Add(fabricanteFerragem); } } // Atualiza a referência do fabricante na ferragem. ferragem.IdFabricanteFerragem = fabricanteFerragem.IdFabricanteFerragem; #endregion #region Código ferragem // Caso a ferragem exista e esteja sendo atualizada, os códigos devem ser removidos e adicionados novamente. ferragem.Codigos.Clear(); // Seta os códigos da ferragem. for (var j = 0; j < itens[i].CodigosFerragem.Count(); j++) { var codigoFerragem = new Entidades.CodigoFerragem(); codigoFerragem.IdFerragem = ferragem.IdFerragem; codigoFerragem.Codigo = itens[i].CodigosFerragem[j].Codigo; ferragem.Codigos.Add(codigoFerragem); } #endregion #region Constante ferragem // Caso a ferragem exista e esteja sendo atualizada, as constantes devem ser removidas e adicionadas novamente. ferragem.Constantes.Clear(); // Seta as constantes da ferragem. for (var j = 0; j < itens[i].ConstantesFerragem.Count(); j++) { var constanteFerragem = new Entidades.ConstanteFerragem(); constanteFerragem.IdFerragem = ferragem.IdFerragem; constanteFerragem.Nome = itens[i].ConstantesFerragem[j].Nome; constanteFerragem.Valor = itens[i].ConstantesFerragem[j].Valor; ferragem.Constantes.Add(constanteFerragem); } #endregion #endregion #region Inserção da imagem // Verifica se a ferragem exportada possui imagem. if (itens[i].ImagemFerragem != null) { EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null; var imagemStream = new MemoryStream(itens[i].ImagemFerragem, 0, itens[i].ImagemFerragem.Length); ferragemSalva = (sender, args) => { try { // Salva a imagem da ferragem. repositorioImagemFerragem.SalvarImagem(ferragem.IdFerragem, imagemStream); } finally { ferragem.Saved -= ferragemSalva; } }; ferragem.Saved += ferragemSalva; } #endregion #region Inserção do arquivo CalcPackage if (itens[i].ArquivoCalcPackage != null) { CalcEngine.Dxf.DxfProject projeto = null; CalcEngine.ProjectFilesPackage pacote = null; using (Stream pacoteStream = new MemoryStream(itens[i].ArquivoCalcPackage, 0, itens[i].ArquivoCalcPackage.Length)) { pacote = CalcEngine.ProjectFilesPackage.LoadPackage(pacoteStream); } try { projeto = CalcEngine.Dxf.DxfProject.LoadFromPackage(pacote); } catch (Exception ex) { throw new Exception(string.Format("Não foi possível carregar os dados do arquivo da ferragem de ID {0}.", itens[i].Ferragem.IdFerragem), ex); } EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null; // Configura o método anonimo para ser acionado quando os dados da ferragem forem salvos ferragemSalva = (sender, args) => { try { using (var stream = new MemoryStream()) { // Cria o pacote para onde serão salvo os dados do CalcPackage var package = CalcEngine.ProjectFilesPackage.CreatePackage(stream, false); projeto.Save(package); package.Close(); stream.Position = 0; // Salva os dados no repositório das ferragens repositorioCalcPackageFerragem.SalvarCalcPackage(ferragem.IdFerragem, stream); } } finally { ferragem.Saved -= ferragemSalva; } }; ferragem.Saved += ferragemSalva; } #endregion #region Inserção da ferragem // Insere/atualiza a ferragem. var retornoSalvarFerragem = ferragemFluxo.SalvarFerragem(ferragem); if (!retornoSalvarFerragem) { throw new Exception(retornoSalvarFerragem.Message.ToString()); } #endregion // Salva, na variável de retorno, o nome da ferragem importada. resultadoImportacao.FerragensImportadas.Add(itens[i].Ferragem.Nome); } catch (Exception ex) { // Salva, na variável de retorno, o nome da ferragem não importada e a mensagem de erro. resultadoImportacao.FerragensNaoImportadas.Add(itens[i].Ferragem.Nome); resultadoImportacao.MensagensErro.Add(ex.Message); ErroDAO.Instance.InserirFromException(HttpContext.Current != null ? HttpContext.Current.Request.Url.ToString() : null, ex); } } return(resultadoImportacao); }
/// <summary> /// Atualiza o arquivo selecionado na pasta dos arquivos CalcEngine. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void odsArquivoCalcEngine_Updating(object sender, Colosoft.WebControls.VirtualObjectDataSourceMethodEventArgs e) { var arquivoCalcEngine = e.InputParameters[0] as Glass.Data.Model.ArquivoCalcEngine; // Salva o arquivo que será subido. var fluArquivoCalcEngine = ((FileUpload)dtvArquivoCalcEngine.FindControl("fluArquivoCalcEngine")); if (fluArquivoCalcEngine != null && !String.IsNullOrEmpty(fluArquivoCalcEngine.FileName)) { // Salva o nome do arquivo CalcEngine. var nomeArquivo = fluArquivoCalcEngine.FileName; /* Chamado 62033. */ if (arquivoCalcEngine.Nome != nomeArquivo.ToUpper().Replace(".CALCPACKAGE", string.Empty)) { throw new Exception("Não é possível atualizar inserir um arquivo com o nome diferente do arquivo atualizado."); } // Variável criada para recuperar os arquivos do .calcpackage. CalcEngine.ProjectFilesPackage pacote = null; // Variável criada para ler a configuração do projeto. CalcEngine.Dxf.DxfProject projeto = null; // Lista criada para setar as variáveis do CalcEngine. var lstVariaveisCalcEngine = new List <ArquivoCalcEngineVariavel>(); // Apaga o arquivo CalcEngine antigo. if (System.IO.File.Exists(ProjetoConfig.CaminhoSalvarCalcEngine + arquivoCalcEngine.Nome + ".calcpackage")) { System.IO.File.Delete(ProjetoConfig.CaminhoSalvarCalcEngine + arquivoCalcEngine.Nome + ".calcpackage"); } // Salva o arquivo CalcEngine. using (var m = new System.IO.MemoryStream(fluArquivoCalcEngine.FileBytes)) { //if (!ArquivoMesaCorteDAO.Instance.ValidarCadastroCalcEngine(m)) // throw new Exception("O arquivo inserido está com falhas de validação"); //m.Position = 0; var buffer = new byte[1024]; var read = 0; using (var file = System.IO.File.Create(ProjetoConfig.CaminhoSalvarCalcEngine + fluArquivoCalcEngine.FileName)) { while ((read = m.Read(buffer, 0, buffer.Length)) > 0) { file.Write(buffer, 0, read); } file.Flush(); } } using (System.IO.Stream pacoteStream = fluArquivoCalcEngine.FileContent) { // Esse método deserializa os dados do pacote que estão contidos na Stream a recupera a instância do pacote de configuração. pacote = CalcEngine.ProjectFilesPackage.LoadPackage(pacoteStream); } // Lê a configuração do projeto. projeto = CalcEngine.Dxf.DxfProject.LoadFromPackage(pacote); try { // Seta as variáveis do CalcEngine em uma lista. foreach (var variavel in projeto.Variables.Where(f => f.GetType() == typeof(CalcEngine.Variable))) { // Cria uma nova variável CalcEngine. var variavelCalcEngine = new ArquivoCalcEngineVariavel(); variavelCalcEngine.VariavelCalcEngine = variavel.Name; // Salva o valor padrão da variável somente se não forem medidas de altura ou largura. variavelCalcEngine.ValorPadrao = (decimal)(variavel.Name.ToLower() == "altura" || variavel.Name.ToLower() == "largura" || variavel.Name.ToLower() == "alturabase" || variavel.Name.ToLower() == "largurabase" ? 0 : variavel.Value); if (variavel.Name.ToLower() == "altura" || variavel.Name.ToLower() == "largura" || variavel.Name.ToLower() == "alturabase" || variavel.Name.ToLower() == "largurabase") { variavelCalcEngine.VariavelSistema = variavelCalcEngine.VariavelCalcEngine; } // Seta a variável CalcEngine na lista. lstVariaveisCalcEngine.Add(variavelCalcEngine); } ArquivoCalcEngineVariavelDAO.Instance.DeletaPeloIdArquivoCalcEngine(arquivoCalcEngine.IdArquivoCalcEngine); // Salva as variáveis do CalcEngine. foreach (var variavel in lstVariaveisCalcEngine) { variavel.IdArquivoCalcEngine = arquivoCalcEngine.IdArquivoCalcEngine; // Insere a variável do arquivo CalcEngine e associa-a ao arquivo. ArquivoCalcEngineVariavelDAO.Instance.Insert(variavel); } } catch (Exception ex) { // Deleta as variáveis associadas ao arquivo CalcEngine. ArquivoCalcEngineVariavelDAO.Instance.DeletaPeloIdArquivoCalcEngine(arquivoCalcEngine.IdArquivoCalcEngine); // Retorna uma mensagem informando o erro ocorrido ao salvar o arquivo. throw ex; } } }