示例#1
0
        public async Task <List <MessageCalculates> > Calculates(int productionOrderId, double furnaceQuantity, Analysis analysis, bool ajuste)
        {
            List <MessageCalculates> messages     = new List <MessageCalculates> ();
            List <string>            stringReturn = new List <string> ();
            var productionOrder = await GetProductionOrder(productionOrderId);

            if (productionOrder == null)
            {
                MessageCalculates message = new MessageCalculates();
                message.key   = "Ordem não encontrada";
                message.value = "Ordem não encontrada";
                messages.Add(message);
            }
            else
            {
                var productionOrderQuality = await _productionOrderQualityService.GetProductionOrder(productionOrder.productionOrderId);

                if (productionOrderQuality == null)
                {
                    productionOrderQuality = await _productionOrderQualityService.AddProductionOrderQuality(productionOrder);
                }

                messages.AddRange(await CalculatesAnalysis(analysis, productionOrder, furnaceQuantity, productionOrderQuality, ajuste));

                if (!ajuste)
                {
                    productionOrderQuality.calculateInitial = messages;
                    await _productionOrderQualityService.updateProductionOrderQuality(productionOrderQuality.productionOrderQualityId, productionOrderQuality);
                }
            }
            return(messages);
        }
示例#2
0
        private async Task <(bool, List <MessageCalculates>)> RecipeSpecification(Analysis analysis, int productionOrderId, double qtdForno)
        {
            bool Approved = false;
            List <MessageCalculates> messages = new List <MessageCalculates>();
            var productionOrder = await GetProductionOrder(productionOrderId);

            if (productionOrder == null)
            {
                MessageCalculates message = new MessageCalculates();
                message.key   = "ERRO";
                message.value = "Não encontrado a ordem de produção na API";
                messages.Add(message);
                return(false, messages);
            }
            foreach (var phase in productionOrder.recipe.phases)
            {
                foreach (var comp in analysis.comp)
                {
                    var recipeComp = phase.phaseProducts.Where(x => x.product.productId == comp.productId).FirstOrDefault();

                    if (recipeComp == null)
                    {
                        MessageCalculates message = new MessageCalculates();
                        message.key   = "ERRO";
                        message.value = "Componente quimico não existe na receita, productId: " + comp.productId;
                        messages.Add(message);
                        return(false, messages);
                    }
                    comp.productName = recipeComp.product.productName;
                    if (recipeComp.minValue > comp.value || recipeComp.maxValue < comp.value)
                    {
                        Approved = false;
                        break;
                    }

                    Approved = true;
                }
            }

            if (Approved)
            {
                return(Approved, messages);
            }

            messages.AddRange(await _calculateAnalysisService.Calculates(productionOrder.productionOrderId, qtdForno, analysis, true));


            return(Approved, messages);
        }
示例#3
0
        private async Task <List <MessageCalculates> > CalculatesAnalysis(Analysis analysisReal, ProductionOrder productionOrder,
                                                                          double furnaceQuantity, ProductionOrderQuality productionOrderQuality, bool ajuste)
        {
            List <MessageCalculates> messages     = new List <MessageCalculates> ();
            List <string>            stringReturn = new List <string> ();
            double       maxForno              = Convert.ToDouble(_configuration["maxForno"]);
            double       porcentagemForno      = Convert.ToDouble(_configuration["porcentagemForno"]);
            int          cobreFosforosoId      = Convert.ToInt32(_configuration["cobreFosforosoId"]);
            AnalysisComp analysisCobreEstimada = new AnalysisComp();
            double       qtdForno              = 0;

            if (!ajuste)
            {
                maxForno = maxForno * (porcentagemForno / 100);
            }

            // Removendo cobre fosforoso dos calculos PONTO 1/2
            var cobreFosforosoComp = analysisReal.comp.Where(x => x.productId == cobreFosforosoId).FirstOrDefault();

            if (cobreFosforosoComp != null)
            {
                analysisReal.comp.Remove(cobreFosforosoComp);
            }
            // Fim da remoção 1/2

            foreach (var compAnalysis in analysisReal.comp)
            {
                var componenteRecipe = productionOrder.recipe.phases.FirstOrDefault()
                                       .phaseProducts
                                       .Where(x => x.product.productId == compAnalysis.productId).FirstOrDefault();

                if (componenteRecipe == null)
                {
                    compAnalysis.type = "contaminent";
                }
                else
                {
                    compAnalysis.type = componenteRecipe.phaseProductType.ToLower();
                }

                compAnalysis.valueKg = (compAnalysis.value / 100) * furnaceQuantity;
            }

            List <AnalysisComp> analysisRecipeList = new List <AnalysisComp> ();

            foreach (var compRecipe in productionOrder.recipe.phases.FirstOrDefault().phaseProducts)
            {
                // Removendo cobre fosforoso dos calculos PONTO 2/2
                if (compRecipe.product.productId == cobreFosforosoId)
                {
                    continue;
                }
                // Fim da remoção 2/2

                // Retirando contaminantes
                if (compRecipe.phaseProductType.ToLower() == "contaminent" || compRecipe.phaseProductType.ToLower() == "scrap" || compRecipe.phaseProductType.ToLower() == "semi_finished")
                {
                    continue;
                }

                AnalysisComp analysisRecipe = new AnalysisComp();
                analysisRecipe.productId   = compRecipe.product.productId;
                analysisRecipe.productName = compRecipe.product.productName;
                analysisRecipe.value       = ((compRecipe.maxValue - compRecipe.minValue) / 2) + compRecipe.minValue;
                analysisRecipe.valueKg     = (analysisRecipe.value / 100) * maxForno;

                analysisRecipeList.Add(analysisRecipe);
            }

            List <AnalysisComp> analysisEstimadaList = new List <AnalysisComp> ();

            qtdForno = analysisReal.comp.Where(a => a.type == "contaminent").Sum(a => a.valueKg);
            qtdForno = analysisReal.comp.Where(a => a.type == "scrap").Sum(a => a.valueKg);

            foreach (var comp in analysisRecipeList)
            {
                AnalysisComp analysisEstimada = new AnalysisComp();
                analysisEstimada.productId   = comp.productId;
                analysisEstimada.productName = comp.productName;

                AnalysisComp compAnalysis = analysisReal.comp.Where(x => x.productId == comp.productId).FirstOrDefault();

                if (compAnalysis == null)
                {
                    compAnalysis             = new AnalysisComp();
                    compAnalysis.productId   = comp.productId;
                    compAnalysis.productName = comp.productName;
                    compAnalysis.value       = 0;
                    compAnalysis.valueKg     = 0;
                }

                analysisEstimada.value = (comp.valueKg / maxForno) * 100;

                analysisEstimada.valueKg = comp.valueKg - compAnalysis.valueKg;

                if (analysisEstimada.valueKg < 0)
                {
                    qtdForno = qtdForno + (analysisEstimada.valueKg * -1) + compAnalysis.valueKg;
                }
                else
                {
                    qtdForno = qtdForno + analysisEstimada.valueKg + compAnalysis.valueKg;
                }

                Console.WriteLine("estimada " + analysisEstimada.valueKg);
                Console.WriteLine("analise " + compAnalysis.valueKg);
                Console.WriteLine("Forno " + qtdForno);
                if (qtdForno > maxForno)
                {
                    messages = new List <MessageCalculates> ();
                    MessageCalculates message = new MessageCalculates();
                    message.key       = "Excesso de Carga!";
                    message.value     = "0";
                    message.productId = 0;
                    messages.Add(message);
                    return(messages);
                }
                //productionOrderQuality.qntForno = qtdForno;
                if (analysisEstimada.valueKg > 0)
                {
                    MessageCalculates message = new MessageCalculates();
                    message.key       = analysisEstimada.productName;
                    message.productId = analysisEstimada.productId;
                    message.value     = analysisEstimada.valueKg.ToString();

                    messages.Add(message);
                }
            }
            await _productionOrderQualityService.updateProductionOrderQuality(productionOrderQuality.productionOrderQualityId, productionOrderQuality);

            return(messages);
        }