예제 #1
0
        public bool StoreUAL(string filepath, String fcoNumber)
        {
            /*Import .csv to datatable*/
            DataTable dt = ImportSpreadSheet(filepath);

            /*Check if the ual has already imported*/
            if (FCOList.Contains(fcoNumber))
            {
                return(false);
            }

            /*Store datatable to database;*/
            using (var dbContext = new FcoDBEntities())
            {
                long id = GetDBCurMaxId(dbContext, (int)Constants.DBTABLE.MAINUAL);

                foreach (DataRow dr in dt.Rows)
                {
                    //Insert new item where no duplicates for specific fco
                    MainUAL newItem = new MainUAL();
                    newItem.Id = ++id;
                    newItem.ShippedSystemSerialNo    = dr[UALColHeaderShippedSN].ToString();
                    newItem.MaintainedSystemSerialNo = dr[UALColHeaderMaintainedSN].ToString();
                    newItem.ShippedCountryName       = dr[UALColHeaderCountryName].ToString();
                    newItem.UpgradeCode = dr[UALColHeaderUpgradeCode].ToString();
                    newItem.FCONo       = fcoNumber;
                    dbContext.MainUALs.Add(newItem);
                }

                //Add FCO number to databse if not exists
                long fcoId = GetDBCurMaxId(dbContext, (int)Constants.DBTABLE.FCO);

                FCO item = new FCO();
                item.Id        = ++fcoId;
                item.FcoNumber = fcoNumber;
                dbContext.FCOes.Add(item);

                dbContext.SaveChanges();
            }

            return(true);
        }
예제 #2
0
        /* 2019-03-14 Change StoreUAL() function to use SQL for Store UAL bulk insertion, which improves the performance a lot,
         * when insertion 33982 data into database using FCOEntity, it cost around 1-2 minutes,
         * while using insertion command directly, it cost 3-4 seconds.
         * And add error handling.
         */

        public async Task <bool> StoreUAL(string ualFilePath, string fcoNumber, string fcoRev)
        {
            LogHelper.Instance.Info(string.Format("START importing UAL file of FCONumber {0} from {1} to database.", fcoNumber, ualFilePath));
            /*Import .csv to datatable*/
            //DataTable dt = DailyReport.ImportSpreadSheet(ualFilePath);

            /*Check if the ual has already imported*/
            string uniqueFcoNumber = fcoNumber + fcoRev;

            if (UniqueFCONumber.Contains(uniqueFcoNumber))
            {
                LogHelper.Instance.Warn("Terminate importing as fco was already in database.");
                return(false);
            }

            try
            {
                Encoding curEncoding = DailyReport.GetEncoding(ualFilePath);


                using (StreamReader reader = new StreamReader(ualFilePath, curEncoding))
                {
                    //Map header and index, to make sure the contents are correctly mapped.
                    var headers = reader.ReadLine().Split(',');
                    Dictionary <string, int> mapHeaderIndex = new Dictionary <string, int>();

                    for (int i = 0; i < headers.Length; i++)
                    {
                        if (mapHeaderIndex.ContainsKey(headers[i].Trim()))
                        {
                            LogHelper.Instance.Error(string.Format("Duplicate column header {0}, please check the UAL file.", headers[i]));
                            return(false);
                        }
                        else
                        {
                            mapHeaderIndex.Add(headers[i].Trim(), i);
                        }
                    }

                    //Check if all the required columns are contained in the file.
                    if (!mapHeaderIndex.ContainsKey(UALColHeaderShippedSN))
                    {
                        LogHelper.Instance.Error("Fail to import UAL due to unable to find column " + UALColHeaderShippedSN);
                        return(false);
                    }

                    if (!mapHeaderIndex.ContainsKey(UALColHeaderMaintainedSN))
                    {
                        LogHelper.Instance.Error("Fail to import UAL due to unable to find column " + UALColHeaderMaintainedSN);
                        return(false);
                    }

                    if (!mapHeaderIndex.ContainsKey(UALColHeaderUpgradeCode))
                    {
                        LogHelper.Instance.Error("Fail to import UAL due to unable to find column " + UALColHeaderUpgradeCode);
                        return(false);
                    }

                    if (!mapHeaderIndex.ContainsKey(UALColHeaderCountryName))
                    {
                        LogHelper.Instance.Error("Fail to import UAL due to unable to find column " + UALColHeaderCountryName);
                        return(false);
                    }

                    if (mapHeaderIndex.ContainsKey(UALColHeaderModelNumber))
                    {
                        LogHelper.Instance.Info("Model Number column in the UAL table.");
                    }

                    //Connect database and insert all the items from UAL file.
                    var connectionString = "Data Source=" + System.AppDomain.CurrentDomain.BaseDirectory + "db\\FcoDB.db";

                    using (var conn = new SQLiteConnection(connectionString))
                    {
                        conn.Open();

                        var command     = conn.CreateCommand();
                        var transaction = conn.BeginTransaction();
                        command.Connection  = conn;
                        command.Transaction = transaction;

                        command.CommandText = "INSERT INTO MainUAL(Id, ShippedSystemSerialNo, MaintainedSystemSerialNo, CountryName, UpgradeCode, ModelNumber, FCONo, FCORev) " +
                                              "VALUES($Id, $shippedSN, $maintainedSN, $countryName,$upgradeCode, $modelNumber, $fcoNumber, $fcoRev);";

                        var idParameter = command.CreateParameter();
                        idParameter.ParameterName = "$Id";
                        command.Parameters.Add(idParameter);

                        var shippedSNParameter = command.CreateParameter();
                        shippedSNParameter.ParameterName = "$shippedSN";
                        command.Parameters.Add(shippedSNParameter);

                        var maintainedSNParameter = command.CreateParameter();
                        maintainedSNParameter.ParameterName = "$maintainedSN";
                        command.Parameters.Add(maintainedSNParameter);

                        var countryNameParameter = command.CreateParameter();
                        countryNameParameter.ParameterName = "$countryName";
                        command.Parameters.Add(countryNameParameter);

                        var upgradeCodeParameter = command.CreateParameter();
                        upgradeCodeParameter.ParameterName = "$upgradeCode";
                        command.Parameters.Add(upgradeCodeParameter);

                        var modelNumberParameter = command.CreateParameter();
                        modelNumberParameter.ParameterName = "$modelNumber";
                        command.Parameters.Add(modelNumberParameter);

                        var fcoNumberParameter = command.CreateParameter();
                        fcoNumberParameter.ParameterName = "$fcoNumber";
                        command.Parameters.Add(fcoNumberParameter);

                        var fcoRevParameter = command.CreateParameter();
                        fcoRevParameter.ParameterName = "$fcoRev";
                        command.Parameters.Add(fcoRevParameter);

                        while (!reader.EndOfStream)
                        {
                            var line   = reader.ReadLine();
                            var values = line.Split(',');

                            idParameter.Value           = Guid.NewGuid().ToString();
                            shippedSNParameter.Value    = values[mapHeaderIndex[UALColHeaderShippedSN]].Trim();
                            maintainedSNParameter.Value = values[mapHeaderIndex[UALColHeaderMaintainedSN]].Trim();
                            countryNameParameter.Value  = values[mapHeaderIndex[UALColHeaderCountryName]].Trim();
                            upgradeCodeParameter.Value  = values[mapHeaderIndex[UALColHeaderUpgradeCode]].Trim();
                            if (mapHeaderIndex.ContainsKey(UALColHeaderModelNumber)) //TC ual
                            {
                                modelNumberParameter.Value = values[mapHeaderIndex[UALColHeaderModelNumber]].Trim();
                            }
                            fcoNumberParameter.Value = fcoNumber;
                            fcoRevParameter.Value    = fcoRev;
                            command.ExecuteNonQuery();
                        }
                        try
                        {
                            transaction.Commit();
                        }
                        catch (Exception e)
                        {
                            LogHelper.Instance.Error("Fail to import UAL table due to " + e.Message);

                            //Attempt to roll back the transaction
                            try
                            {
                                transaction.Rollback();
                            }
                            catch (Exception e2)
                            {
                                LogHelper.Instance.Error("Fail to rollback transaction due to " + e2.Message);
                            }

                            return(false);
                        } //Catch the exception and rollback transaction

                        LogHelper.Instance.Info("COMPLETE importing UAL table of FCO number" + fcoNumber);
                    } //End using db connection
                }     //End using stream reader

                /*
                 * 2019-05-01 - Modify FCO template and store the total number of each country to save the
                 * multiple calculation time in weekly report generating.
                 */
                using (var dbContext = new FcoDBEntities())
                {
                    var queryAll = from a in dbContext.MainUALs
                                   where a.FCONo.Equals(fcoNumber)
                                   group a by a.CountryName into gp
                                   select new
                    {
                        country  = gp.Key,
                        countAll = gp.Select(q => q.ShippedSystemSerialNo).Distinct().Count(),
                    };
                    foreach (var q in queryAll)
                    {
                        var queryCurrent = from b in dbContext.FCOes
                                           where b.FcoNumber.Equals(fcoNumber) && b.CountryName.Equals(q.country)
                                           select b;

                        if (!queryCurrent.Any())
                        {
                            FCO item = new FCO();
                            item.Id          = Guid.NewGuid().ToString();
                            item.FcoNumber   = fcoNumber;
                            item.CountryName = q.country;
                            item.TotalCount  = q.countAll;
                            dbContext.FCOes.Add(item);
                        }
                        else
                        {
                            queryCurrent.ToList().ForEach(x => x.TotalCount = q.countAll);
                        }
                    }

                    FcoList fcoListItem = new FcoList();
                    fcoListItem.uniqueFcoNumber = uniqueFcoNumber;
                    dbContext.FcoLists.Add(fcoListItem);

                    dbContext.SaveChanges();
                    LogHelper.Instance.Info("Completed insertion into FCO table.");
                } //End using db context


                return(true);
            }
            catch (Exception e3)
            {
                LogHelper.Instance.Error("Fail to Store UAL or FCO table due to " + e3.Message);
                return(false);
            } //catch all the exceptions
        }