Пример #1
0
        public void Iniciar(object sender, DoWorkEventArgs e)
        {
            TRABAJANDO = true;

            // Obtengo lista hash (ultimas modificaciones de LOTES en SQL)
            Hash.getFromSql();
            OP.DownloadAll();

            if (Hash.Database.Count() > 0)
            {
                try
                {
                    // Recorro carpetas de ingenieria
                    DirectoryInfo dir = new DirectoryInfo(@"\\USH-NT-3\v1\Users\INSAUT\PLANTA_3\TECNICOS_3\Programacion\LISTAS");

                    DirectoryInfo[] Folders     = dir.GetDirectories();
                    int             totalFolder = Folders.Count();
                    int             countEstado = 0;
                    progreso.Invoke((MethodInvoker)(() => progreso.Maximum = totalFolder));

                    // Recorro carpetas de modelos
                    foreach (DirectoryInfo modelo in Folders)
                    {
                        OP.Procesar(modelo);
                        // Aumento progreso.
                        countEstado++;

                        // Lista de lotes, solo extencion .txt
                        FileInfo[] lotes = modelo.GetFiles("*.txt");

                        TreeNode idmodelo = null;
                        treeLista.Invoke((MethodInvoker)(() => idmodelo = treeLista.Nodes.Add(modelo.Name)));

                        // Recorro lotes del modelo actual
                        foreach (FileInfo lote in lotes)
                        {
                            string loteNombre = lote.Name.Split('.')[0];

                            // Verifico fecha de modificacion.
                            string lote_fecha_modificacion = lote.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");

                            TreeNode idlote = null;

                            treeLista.Invoke((MethodInvoker)(() => idlote = idmodelo.Nodes.Add(loteNombre)));

                            // Verifico si existe el modelo y lote en la base de datos.
                            Hash ModeloLote = Hash.Database.Find(o =>
                                                                 o.modelo.Equals(modelo.Name) &&
                                                                 o.lote.Equals(loteNombre)
                                                                 );
                            string loteHash = "";
                            if (ModeloLote == null)
                            {
                                // Si no existe en SQL....

                                // genero un HASH del lote actual (ultima fecha de modificacion)
                                loteHash = Hash.generar(lote.FullName.ToString());
                                // Agrego a SQL
                                string version = "1";
                                if (!loteHash.Equals(""))
                                {
                                    addModeloLote(lote.FullName, modelo.Name, loteNombre, loteHash, lote_fecha_modificacion, version);
                                }
                            }
                            else
                            {
                                // Verifico si existe en SQL el Modelo/lote
                                int HashListIndex = Hash.Database.FindIndex(o => o.id == ModeloLote.id);
                                if (HashListIndex >= 0)
                                {
                                    // Agrego flag de existencia no solo en SQL sino en carpeta INGENIERIA
                                    Hash hash = Hash.Database[HashListIndex];
                                    hash.existe = true;
                                }

                                if (!ModeloLote.fecha_modificacion.Equals(lote_fecha_modificacion))
                                {
                                    // Si la fecha de modificacion en SQL no es igual a la fecha de modificacion actual.

                                    // Por defecto se detecto una modificacion.

                                    string enuso          = "";
                                    string loteModificado = "";

                                    try
                                    {
                                        // genero un HASH del lote actual
                                        loteHash = Hash.generar(lote.FullName.ToString());
                                    }
                                    catch (Exception)
                                    {
                                        enuso = " EN USO ";
                                    }

                                    if (ModeloLote.hash.Equals(loteHash))
                                    {
                                        // El hash es el mismo, no hay modificacion.
                                        loteModificado = "No";

                                        // Actualizo ultima fecha de modificacion en SQL.
                                        IngenieriaSql.updateFecha(ModeloLote.id, lote_fecha_modificacion);

                                        dgvMain.Invoke((MethodInvoker)(() =>
                                                                       dgvMain.Rows.Add(modelo.Name + " " + loteNombre, loteHash, ModeloLote.hash, loteModificado + " (fecha actualizada)" + enuso)
                                                                       ));
                                    }
                                    else
                                    {
                                        // En caso de que el HASH sea diferente
                                        loteModificado = "Si, actualizando...";

                                        /*
                                         * NOTA:
                                         * Aca Deberia ELIMINAR la version anterior y guardar la nueva version....
                                         * O podria enviar la version anterior a un LOG y guardar la nueva version....
                                         * Hay que pensarlo... queda pendiente...
                                         */

                                        // Elimino Modelo/Lote + Lote de ingenieria en cascada.
                                        // En la proxima ejecucion se agregara la version nueva.
                                        IngenieriaSql.del(ModeloLote.id);

                                        addModeloLote(lote.FullName, modelo.Name, loteNombre, loteHash, lote_fecha_modificacion, (int.Parse(ModeloLote.version) + 1).ToString());

                                        idlote.BackColor   = ColorTranslator.FromHtml("#FF0000");
                                        idmodelo.BackColor = ColorTranslator.FromHtml("#FF0000");

                                        dgvMain.Invoke((MethodInvoker)(() =>
                                                                       dgvMain.Rows.Add(modelo.Name + " " + loteNombre, loteHash, ModeloLote.hash, loteModificado + enuso)
                                                                       ));
                                    } // EN IF HASH
                                }     // END IF FECHA_MODIFICACION
                            }         // ENF IF MODELO NULL
                        }             // END FOREACH LOTE
                        bw.ReportProgress(countEstado);
                    }                 // END FOREACH MODELO

                    // Listo todos los modelos que NO se hallan listado en INGENIERIA pero si existen en SQL
                    List <Hash> Removidos = Hash.Database.FindAll(o => o.existe == false);
                    foreach (Hash removido in Removidos)
                    {
                        dgvMain.Invoke((MethodInvoker)(() =>
                                                       dgvMain.Rows.Add(removido.modelo + " " + removido.lote, "", removido.hash, "Removido de ingenieria " + removido.id)
                                                       ));
                    }
                }
                catch (Exception ex)
                {
                    logBox.Invoke((MethodInvoker)(() => logBox.Items.Add(ex.Message)));
                }
            }
            else
            {
                logBox.Invoke((MethodInvoker)(() => logBox.Items.Add("No se encontraron resultados de HASH en SMTDatabase")));
            }
        }