Esempio n. 1
0
        public static double CalcularPrimaDirecto(List <Maquinas> maquinas, List <EventoFichajeAsociacion> eventosFichaje, out double limitacionBancada)
        {
            limitacionBancada = 0;
            int vueltas = maquinas.Max(x => x.Pulsos.Where(y => y.IdOperario == Sesion.Operario.Id).Count());

            if (vueltas == 0)
            {
                return(0);
            }

            double horasJornada          = Horario.CalcularHorasJornada(DateTime.Now);
            double vueltasHora           = vueltas / horasJornada;
            double prima                 = 0;
            double CICLO_TEORICO         = 0;
            double TIEMPO_MAQUINA_100    = 0;
            double TIEMPO_MAQUINA_140    = 0;
            double TIEMPO_CAMBIO_TEORICO = 0;
            double TIEMPO_CAMBIO_MAX     = 0;

            double TM_100                 = 0;
            double TM_140                 = 0;
            double MM_100                 = 0;
            double MM_140                 = 0;
            double MP_100                 = 0;
            double MP_140                 = 0;
            double CICLO_100              = 0;
            double CICLO_140              = 0;
            double ACTIV_LIMIT            = 0;
            double tiempo_vuelta_real     = 0;
            double SALTAR_MOLDE_VACIO_100 = 0;
            double SALTAR_MOLDE_VACIO_140 = 0;
            int    saltos                 = 0;

            maquinas = maquinas.OrderBy(x => x.PosicionGlobal ?? 0).ToList();

            List <PulsoMaquina> pulsos = maquinas.SelectMany(x => x.Pulsos).OrderByDescending(x => x.Fecha).ToList();

            if (pulsos.Count < maquinas.Count)
            {
                // todavía no hay pulsos suficientes para calcular
                return(prima);
            }

            // tomo los ultimos N pulsos
            List <PulsoMaquina> ultimosPulsos = pulsos.Take(maquinas.Count).ToList();

            var pulsosAgrupadosPorPrensa = ultimosPulsos.GroupBy(x => x.PosicionGlobal);

            ultimosPulsos = new List <PulsoMaquina>();
            foreach (var grupo in pulsosAgrupadosPorPrensa)
            {
                if (grupo.Count() > 1)
                {
                    ultimosPulsos.Add(grupo.FirstOrDefault(x => x.Fecha == grupo.Max(y => y.Fecha)));
                }
                else
                {
                    ultimosPulsos.Add(grupo.First());
                }
            }

            // busco el ciclo teorico de las maquinas
            CICLO_TEORICO = CicloTeorico(ultimosPulsos.Select(x => x.Ciclo));

            // calculo la suma total del tiempo de cambio teorico
            TIEMPO_CAMBIO_TEORICO = ultimosPulsos.Sum(x => x.Control.TiempoBaseEjecucion + (x.Control.TiempoUtillajeEjecucion * x.Pares));
            // busco el maximo tiempo de cambio teorico
            TIEMPO_CAMBIO_MAX = (ultimosPulsos.Select(x => x.Control.TiempoBaseEjecucion + (x.Control.TiempoUtillajeEjecucion * x.Pares)).Max());

            // calculo el tiempo maquina al 100
            TIEMPO_MAQUINA_100 = CICLO_TEORICO + TIEMPO_CAMBIO_MAX;
            // calculo el tiempo maquina 40% mas rapido
            TIEMPO_MAQUINA_140 = TIEMPO_MAQUINA_100 / 140 * 100;

            // cuento los saltos que ha habido en la última vuelta
            saltos = ContarSaltos(ultimosPulsos);

            // calculo el tiempo de salto de molde al 100
            SALTAR_MOLDE_VACIO_100 = COEF_SALTAR_MOLDE_VACIO * saltos;
            // calculo el tiempo de salto de molde 40% más rapido
            SALTAR_MOLDE_VACIO_140 = SALTAR_MOLDE_VACIO_100 / 140 * 100;

            // el tiempo maquina al 100 y 140 se quedan como están
            TM_100 = TIEMPO_MAQUINA_100;
            TM_140 = TIEMPO_MAQUINA_140;

            // obtengo los cambios de barquilla que ha habido
            var fichajesCajas = ObtenerEventosFichajeUltimaVuelta(ultimosPulsos, eventosFichaje);

            // calculo el tiempo operario como la suma de los tiempos de cambio + los saltos de molde
            MM_100 = TIEMPO_CAMBIO_TEORICO + SALTAR_MOLDE_VACIO_100 + fichajesCajas.Sum(x => x.Control.TiempoCambioBarquilla);
            //  calculo el tiempo operario 40% mas rapido
            MM_140 = MM_100 / 140 * 100;

            // me quedo con el mayor del tiempo maquina o tiempo operario al 100
            CICLO_100 = (TM_100 > MM_100) ? TM_100 : MM_100;
            // me quedo con el mayor del tiempo maquina o tiempo operario al 140
            CICLO_140 = (TM_140 > MM_140) ? TM_140 + MP_140 : MM_140 + MP_140;

            // calculo la limitación de la bancada
            double limite_informativo = 1 / (CICLO_140 / MM_100);

            limitacionBancada = limite_informativo;

            // calculo el tiempo real que le ha costado dar la vuelta
            tiempo_vuelta_real = TiempoVuelta(ultimosPulsos);

            // si tiempo_vuelta es menor que CICLO_140 -> 1.4
            //si no tengo que calcular 1/(tiempo_vuelta/ciclo_100)
            prima = 1 / (tiempo_vuelta_real / (CICLO_100 * (1 + COEF_FATIGA)));

            if (prima > 3)
            {
                if (aux < 30)
                {
                    Log.Write(new Exception(string.Format("fichajesCajs={0}, TM100={1}, TM140={2}, MM100={3}, MM140={4}, Saltos={5}, {6}", fichajesCajas.Count, TM_100, TM_140, MM_100, MM_140, saltos, JsonConvert.SerializeObject(ultimosPulsos))));
                    aux++;
                }
            }
            return(Math.Round(prima, 2));
        }
Esempio n. 2
0
        public static double CalcularPrima(List <Maquinas> maquinas)
        {
            int vueltas = maquinas.Max(x => x.Pulsos.Where(y => y.IdOperario == Sesion.Operario.Id).Count());

            if (vueltas == 0)
            {
                return(0);
            }

            double horasJornada                = Horario.CalcularHorasJornada(DateTime.Now);
            double vueltasHora                 = vueltas / horasJornada;
            double prima                       = 0;
            double cicloMedio                  = 0;
            double tiempoCambioMax             = 0;
            double TIEMPO_MAQUINA              = 0;
            double TIEMPO_MAQUINA_100          = 0;
            double TIEMPO_MAQUINA_140          = 0;
            double FATIGA_MAQUINA_REGALADO     = 0;
            double FATIGA_MAQUINA_REGALADO_100 = 0;
            double FATIGA_MAQUINA_REGALADO_140 = 0;
            double TM_100                      = 0;
            double TM_140                      = 0;
            double MM_100                      = 0;
            double MM_140                      = 0;
            double MP_100                      = 0;
            double MP_140                      = 0;
            double CICLO_100                   = 0;
            double CICLO_140                   = 0;
            double ACTIV_LIMIT                 = 0;
            int    limpiarMoldes               = 0;
            int    cambiosMolde                = 0;
            int    cambiosTope                 = 0;
            int    cambiosNumero               = 0;
            double actividadAñadida            = 0;

            maquinas = maquinas.OrderBy(x => x.PosicionGlobal ?? 0).ToList();

            cicloMedio              = CicloTeorico(maquinas.SelectMany(x => x.Pulsos.Select(y => y.Ciclo)));
            tiempoCambioMax         = TiempoCambioMedio(maquinas.SelectMany(x => x.Pulsos).ToList());
            TIEMPO_MAQUINA          = cicloMedio + tiempoCambioMax;
            FATIGA_MAQUINA_REGALADO = COEF_FATIGA * TIEMPO_MAQUINA;

            TIEMPO_MAQUINA_100 = TIEMPO_MAQUINA * (1 + 0.00 + COEF_NECESIDAD);
            TIEMPO_MAQUINA_140 = TIEMPO_MAQUINA_100;

            FATIGA_MAQUINA_REGALADO_100 = FATIGA_MAQUINA_REGALADO * (1 + COEF_NECESIDAD);
            FATIGA_MAQUINA_REGALADO_140 = FATIGA_MAQUINA_REGALADO_100 / 140 * 100;

            TM_100 = TIEMPO_MAQUINA_100 + FATIGA_MAQUINA_REGALADO_100;
            TM_140 = TIEMPO_MAQUINA_140 + FATIGA_MAQUINA_REGALADO_140;
            MM_100 = tiempoCambioMax * maquinas.Count;
            MM_140 = MM_100 / 140 * 100;

            CICLO_100 = (TM_100 > MM_100) ? TM_100 + MP_100 : MM_100 + MP_100;
            CICLO_140 = (TM_140 > MM_140) ? TM_140 + MP_140 : MM_140 + MP_140;

            ACTIV_LIMIT = CICLO_100 / CICLO_140 * 100;


            actividadAñadida =
                LIMPIAR_MOLDE * limpiarMoldes
                + CAMBIAR_MOLDE * cambiosMolde
                + CAMBIAR_TOPE * cambiosTope
                + CAMBIAR_NUMERO * cambiosNumero;

            prima = ((((vueltas * 1.4) / (horasJornada * vueltasHora)) * horasJornada) + actividadAñadida) / horasJornada;

            return(prima);
        }