예제 #1
0
        public static Task <RegistrySDSP> Parse(string fileName)
        {
            RegistrySDSP sdsp = new RegistrySDSP();
            TaskCompletionSource <RegistrySDSP> tcs = new TaskCompletionSource <RegistrySDSP>();

            ThreadStart listenThread = delegate()
            {
                try
                {
                    ExcelXmlWorkbook book = ExcelXmlWorkbook.Import("data.xml");
                    var       r           = book.SheetCount;
                    Worksheet sheet       = book[0];

                    int columnCount = sheet.ColumnCount;
                    if (columnCount <= 0)
                    {
                        throw new InvalidDataException("В рабочем листе недопустимое количество колонок.");
                    }

                    int rowCount = sheet.RowCount;
                    if (rowCount <= 3)
                    {
                        throw new InvalidDataException("В рабочем листе недопустимое количество строк.");
                    }

                    String            departament = null;
                    RegistryCollector collector   = null;

                    // количество счётчиков очередной системы
                    int collectorMetersCount = 0;
                    // количество счётчиков для обработки
                    int countMetersToParse = 0;

                    #region парсер

                    // пропускаем название таблицы и шапку таблицы
                    for (int rowIndex = 2; rowIndex < sheet.RowCount; rowIndex++)
                    {
                        Row row       = sheet[rowIndex];
                        int cellCount = row.CellCount;

                        // имеются ли данные в строке
                        bool hasData = false;
                        for (int colIndex = 0; colIndex < row.CellCount; colIndex++)
                        {
                            if (!row[colIndex].IsEmpty())
                            {
                                hasData = true;
                                break;
                            }
                        }

                        if (hasData == false)
                        {
                            continue;
                        }

                        // первая ячейка в строке, это не первая ячейка в строке листа EXCEL !
                        Cell firstCell = row[0];

                        ContentType meterNameCellContentType = row[4].ContentType;

                        // если это какая-то категория
                        if (firstCell.ContentType == ContentType.None & meterNameCellContentType == ContentType.None)
                        {
                            // если это новая - добавляем предыдущую в список
                            if (departament != null)
                            {
                                sdsp.Departaments.Add(departament);
                            }
                            departament = String.Empty;

                            StringBuilder data = new StringBuilder();
                            for (int i = 0; i < row.CellCount; i++)
                            {
                                if (row[i].ContentType == ContentType.String)
                                {
                                    data.Append(row[i].Value);
                                }
                            }
                            departament = data.ToString();
                        }
                        // тогда если это данные
                        else
                        {
                            if (meterNameCellContentType == ContentType.UnresolvedValue)
                            {
                                U.L(LogLevel.Error, "EDITOR PARSER",
                                    String.Format("Не обнаружены данные:\nНомер строки таблицы {0}", rowIndex));
                                throw new InvalidDataException("Не обнаружены данные.");
                            }

                            if (meterNameCellContentType == ContentType.String)
                            {
                                RegistryCounter counter = new RegistryCounter();

                                // имеется более одного счётчика?
                                collectorMetersCount = firstCell.RowSpan;

                                if (collectorMetersCount > 1)
                                {
                                    countMetersToParse = collectorMetersCount;
                                }

                                // если значение в первом столбце имеется и является числовым значением
                                if (firstCell.ContentType == ContentType.Number)
                                {
                                    collector = new RegistryCollector();

                                    try
                                    {
                                        // номер по-порядку
                                        collector.NumberOfOrder = row[0].GetValue <uint>();
                                        // фидер
                                        collector.House = row[1].Value == null ? "<???>" : row[1].GetValue <string>();
                                        // тип модема
                                        collector.ModemType = row[2].Value == null ? "<???>" : row[2].GetValue <string>();
                                        // номер gsm
                                        collector.GsmNumber = row[3].Value == null ? "<???>" : row[3].Value.ToString();
                                        // место установки
                                        collector.Street = row[10].Value == null ? "<???>" : row[10].GetValue <string>();
                                        // примечание и номер договора
                                        if (row[11].ContentType == ContentType.String)
                                        {
                                            collector.Description += "Договор №" + Environment.NewLine + row[11].GetValue <string>();
                                        }
                                        collector.Description += row[12].GetValue <string>();

                                        collector.Departament = departament;

                                        //collector.CreationDate = row[13].Value == null ? "<?>" : row[13].GetValue<string>();
                                    }
                                    catch (Exception ex)
                                    {
                                        var s = ex.Message;
                                    }
                                }
                                try
                                {
                                    // присоединение
                                    counter.Name = row[4].Value == null ? "<???>" : row[4].GetValue <string>();
                                    // состояние
                                    // сетевой адрес
                                    counter.NetworkAddress = row[6].Value == null ? "<???>" : row[6].Value.ToString();
                                    // тип счётчика
                                    counter.CounterType = row[7].Value == null ? "<???>" : row[7].GetValue <string>();
                                    // номер счётчика
                                    counter.Number = row[8].Value == null ? "<???>" : row[8].Value.ToString();
                                    // количество тарифов
                                    counter.TarifsCount = row[9].Value == null ? (byte)0 : row[9].GetValue <byte>();
                                }
                                catch (Exception ex)
                                {
                                    var s = ex.Message;
                                }

                                //
                                countMetersToParse--;

                                if (collector == null)
                                {
                                    System.Diagnostics.Debugger.Break();
                                }

                                if (collector.Counters == null)
                                {
                                    System.Diagnostics.Debugger.Break();
                                }

                                if (counter == null)
                                {
                                    System.Diagnostics.Debugger.Break();
                                }

                                collector.Counters.Add(counter);

                                if (countMetersToParse == 0)
                                {
                                    sdsp.Collectors.Add(collector);
                                    collector = null;
                                }
                            }
                        }
                    }
                    #endregion

                    tcs.TrySetResult(sdsp);
                }
                catch (Exception e)
                {
                    U.L(LogLevel.Error, "EDITOR", "Ошибка при импорте данных.");
                    U.L(LogLevel.Error, "EDITOR", e.Message);
                }
            };

            Thread l_thread = new Thread(listenThread);

            l_thread.Name     = "Import data thread";
            l_thread.Priority = ThreadPriority.Highest;
            l_thread.Start();

            return(tcs.Task);
        }
예제 #2
0
    private void ProcessExcel()
    {
        var      isNativeFormat = true;
        Workbook book           = null;

        // Open native excel file format
        try
        {
            book = Workbook.getWorkbook(_fullPath);
        }
        catch (Exception)
        {
            isNativeFormat = false;
        }

        try
        {
            if (isNativeFormat)
            {
                var       worksheet  = book.getSheet(0);
                const int intRegHead = 1;

                if (worksheet.getColumn(1).Length > 0 && chboxDisableProducts.Checked)
                {
                    ProductService.DisableAllProducts();
                }
                ImportStatistic.TotalRow = worksheet.getColumn(1).Length - 1;
                // Step by rows
                for (int i = intRegHead; i <= worksheet.getColumn(1).Length - 1; i++)
                {
                    if (!ImportStatistic.IsRun)
                    {
                        return;
                    }

                    var artNo   = Convert.ToString(worksheet.getCell(0, i).Value);
                    var product = ProductService.GetProduct(artNo);

                    var name = Convert.ToString(worksheet.getCell(1, i).Value);
                    if (!string.IsNullOrEmpty(name))
                    {
                        product.Name = name;
                    }
                    else
                    {
                        LogInvalidData(name, 1, i);
                        continue;
                    }
                    string enabled = Convert.ToString(worksheet.getCell(4, i).Value);
                    product.Enabled = !string.IsNullOrEmpty(enabled) && enabled.Trim().Equals("+");

                    var discount = Convert.ToString(worksheet.getCell(9, i).Value);
                    try
                    {
                        product.Discount = (string.IsNullOrEmpty(discount)) ? 0 : (Convert.ToDecimal(discount));
                    }
                    catch (Exception)
                    {
                        LogInvalidData(discount, 9, i);
                        continue;
                    }

                    var weight = Convert.ToString(worksheet.getCell(11, i).Value);
                    try
                    {
                        product.Weight = (string.IsNullOrEmpty(weight)) ? 0 : (Convert.ToDecimal(weight));
                    }
                    catch (Exception)
                    {
                        LogInvalidData(weight, 11, i);
                        continue;
                    }

                    product.Size = GetSizeForBdFormat(Convert.ToString(worksheet.getCell(12, i).Value));

                    product.BriefDescription = Convert.ToString(worksheet.getCell(13, i).Value);
                    product.Description      = Convert.ToString(worksheet.getCell(14, i).Value);

                    var offr = new Offer {
                        OfferListId = CatalogService.DefaultOfferListId
                    };

                    var price = Convert.ToString(worksheet.getCell(5, i).Value);
                    try
                    {
                        offr.Price = (string.IsNullOrEmpty(price)) ? 0 : Convert.ToDecimal(price);
                    }
                    catch (Exception)
                    {
                        LogInvalidData(price, 5, i);
                        continue;
                    }

                    var sypplyprice = Convert.ToString(worksheet.getCell(6, i).Value);
                    try
                    {
                        offr.SupplyPrice = (string.IsNullOrEmpty(sypplyprice)) ? 0 : Convert.ToDecimal(sypplyprice);
                    }
                    catch (Exception)
                    {
                        LogInvalidData(sypplyprice, 6, i);
                        continue;
                    }

                    var shippingPrice = Convert.ToString(worksheet.getCell(10, i).Value);
                    try
                    {
                        offr.ShippingPrice = (string.IsNullOrEmpty(shippingPrice)) ? 0 : (Convert.ToDecimal(shippingPrice));
                    }
                    catch (Exception)
                    {
                        LogInvalidData(shippingPrice, 10, i);
                        continue;
                    }

                    var amount = Convert.ToString(worksheet.getCell(7, i).Value);
                    try
                    {
                        offr.Amount = (string.IsNullOrEmpty(amount)) ? 0 : (Convert.ToInt32(amount));
                    }
                    catch (Exception)
                    {
                        LogInvalidData(amount, 7, i);
                        continue;
                    }


                    offr.Unit = Convert.ToString(worksheet.getCell(8, i).Value);

                    product.Offers = new List <Offer> {
                        offr
                    };

                    string rewurl = Convert.ToString(worksheet.getCell(2, i).Value);
                    //var synonym = (string.IsNullOrEmpty(rewurl))  ? product.ArtNo : rewurl;
                    //product.Synonym = synonym;

                    // --- New Fix Code - XML
                    if (string.IsNullOrEmpty(rewurl)) // пустая строка
                    {
                        rewurl = product.ArtNo;
                    }
                    else
                    {
                        // Не пустая строка, Используется или нет этот синомим вообще ?
                        int productId = ProductService.GetProductId(product.ArtNo);
                        if (!UrlService.IsAvalibleUrl(productId, ParamType.Product, rewurl)) // RouteService.GetParamBySynonym(rewurl) != null
                        {
                            //TODO не компилится
                            // Ок, Используется, не у нашего ли товара?
                            //UrlSynonym synonym = RouteService.GetUrlSynonymByParamValue(productId, ParamType.Product);
                            //if (synonym != null && synonym.Synonym != rewurl)
                            //{
                            //    // Нет не унашего. Значит он занят, чтобы небыло дубликата,
                            //    // ставим Артикул как синоним
                            //    rewurl = product.ArtNo;
                            //}
                        }
                    }
                    product.UrlPath = rewurl;


                    UpdateInsertProduct(product);


                    //if (string.IsNullOrEmpty(rewurl) || RouteService.GetParamBySynonym(rewurl) != null) rewurl = product.ArtNo;
                    //RouteService.UpdateParamSynonym(ParamType.Product, product.ProductId,
                    //RouteService.InsertUpdateParam(rewurl, ParamType.Product, product.ProductId.ToString());

                    var parentCategory = Convert.ToString(worksheet.getCell(3, i).Value);
                    if (!string.IsNullOrEmpty(parentCategory))
                    {
                        try
                        {
                            CategoryService.SubParseAndCreateCategory(parentCategory, product.ProductId);
                        }
                        catch (Exception)
                        {
                            LogInvalidData(parentCategory, 3, i);
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            else
            {
                ExcelXmlWorkbook xmlbook  = ExcelXmlWorkbook.Import(_fullPath);
                Worksheet        xmlsheet = xmlbook[0];

                const int intRegHead = 1;

                if (xmlsheet.RowCount > 0 && chboxDisableProducts.Checked)
                {
                    ProductService.DisableAllProducts();
                }
                ImportStatistic.TotalRow = xmlsheet.RowCount - 1;
                // Step by rows

                for (int i = intRegHead; i <= xmlsheet.RowCount - 1; i++)
                {
                    if (!ImportStatistic.IsRun)
                    {
                        return;
                    }

                    var artNo   = Convert.ToString(xmlsheet[0, i].Value);
                    var product = ProductService.GetProduct(artNo);


                    var name = Convert.ToString(xmlsheet[1, i].Value);
                    if (!string.IsNullOrEmpty(name))
                    {
                        product.Name = name;
                    }
                    else
                    {
                        LogInvalidData(name, 1, i);
                        continue;
                    }

                    var enabled = Convert.ToString(xmlsheet[4, i].Value);
                    product.Enabled = !string.IsNullOrEmpty(enabled) && enabled.Trim().Equals("+");

                    var discount = Convert.ToString(xmlsheet[9, i].Value);
                    try
                    {
                        product.Discount = (string.IsNullOrEmpty(discount)) ? 0 : (Convert.ToDecimal(discount));
                    }
                    catch (Exception)
                    {
                        LogInvalidData(discount, 9, i);
                        continue;
                    }

                    var weight = Convert.ToString(xmlsheet[11, i].Value);
                    try
                    {
                        product.Weight = (string.IsNullOrEmpty(weight)) ? 0 : Convert.ToDecimal(weight);
                    }
                    catch (Exception)
                    {
                        LogInvalidData(weight, 11, i);
                        continue;
                    }

                    product.Size             = GetSizeForBdFormat(Convert.ToString(xmlsheet[12, i].Value));
                    product.BriefDescription = Convert.ToString(xmlsheet[13, i].Value);
                    product.Description      = Convert.ToString(xmlsheet[14, i].Value);

                    var offr = new Offer {
                        OfferListId = CatalogService.DefaultOfferListId
                    };

                    var price = Convert.ToString(xmlsheet[5, i].Value);
                    try
                    {
                        offr.Price = (string.IsNullOrEmpty(price)) ? 0 : Convert.ToDecimal(price);
                    }
                    catch (Exception)
                    {
                        LogInvalidData(price, 5, i);
                        continue;
                    }

                    var supplyPrice = Convert.ToString(xmlsheet[6, i].Value);
                    try
                    {
                        offr.SupplyPrice = (string.IsNullOrEmpty(supplyPrice)) ? 0 : Convert.ToDecimal(supplyPrice);
                    }
                    catch (Exception)
                    {
                        LogInvalidData(supplyPrice, 6, i);
                        continue;
                    }

                    var shippingPrice = Convert.ToString(xmlsheet[10, i].Value);
                    try
                    {
                        offr.ShippingPrice = (string.IsNullOrEmpty(shippingPrice)) ? 0 : (Convert.ToDecimal(shippingPrice));
                    }
                    catch (Exception)
                    {
                        LogInvalidData(shippingPrice, 10, i);
                        continue;
                    }

                    var amount = Convert.ToString(xmlsheet[7, i].Value);
                    try
                    {
                        offr.Amount = (string.IsNullOrEmpty(amount)) ? 0 : Convert.ToInt32(amount);
                    }
                    catch (Exception)
                    {
                        LogInvalidData(amount, 7, i);
                        continue;
                    }

                    offr.Unit = Convert.ToString(xmlsheet[8, i].Value);

                    product.Offers = new List <Offer> {
                        offr
                    };
                    string rewurl = Convert.ToString(xmlsheet[2, i].Value);
                    //string synonym = (string.IsNullOrEmpty(rewurl)) ? product.ArtNo : rewurl;
                    //product.Synonym = synonym;

                    // Todo
                    // --- New Fix Code - XML
                    if (string.IsNullOrEmpty(rewurl)) // пустая строка
                    {
                        rewurl = product.ArtNo;
                    }
                    else
                    {
                        // Не пустая строка, Используется или нет этот синомим вообще ?
                        int productId = ProductService.GetProductId(product.ArtNo);
                        if (!UrlService.IsAvalibleUrl(productId, ParamType.Product, rewurl)) // RouteService.GetParamBySynonym(rewurl) != null
                        {
                            //TODO не компилится
                            // Ок, Используется, не у нашего ли товара?
                            //UrlSynonym synonym = RouteService.GetUrlSynonymByParamValue(productId, ParamType.Product);
                            //if (synonym != null && synonym.Synonym != rewurl)
                            //{
                            //    // Нет не унашего. Значит он занят, чтобы небыло дубликата,
                            //    // ставим Артикул как синоним
                            //    rewurl = product.ArtNo;
                            //}
                        }
                    }
                    product.UrlPath = rewurl;

                    UpdateInsertProduct(product);

                    //RouteService.UpdateParamSynonym(ParamType.Product, product.ProductId, synonym);
                    //if (string.IsNullOrEmpty(rewurl) || RouteService.GetParamBySynonym(rewurl) != null) rewurl = product.ArtNo;

                    //RouteService.InsertUpdateParam(rewurl, ParamType.Product, product.ProductId.ToString());

                    var parentCategory = Convert.ToString(xmlsheet[3, i].Value);
                    if (string.IsNullOrEmpty(parentCategory))
                    {
                        continue;
                    }
                    try
                    {
                        CategoryService.SubParseAndCreateCategory(parentCategory, product.ProductId);
                    }
                    catch
                    {
                        LogInvalidData(parentCategory, 3, i);
                        //TODO: vk: тут надо бы вывести сообщение о том, что продукт уже есть в категории. или изменить try/catch блок на проверку существования продукта в категории
                        //наличие exception`ов здесь - нормально
                    }
                }
            }

            CategoryService.RecalculateProductsCountManual();

            //TODO find where is this function!
            //ProductService.SumImportLog(Resource.Admin_ImportXLS_UpdoadingSuccessfullyCompleted,Resource.Admin_ImportXLS_UpdoadingCompletedWithErrors);
        }
        catch (Exception ex)
        {
            MsgErr(ex.Message + " at xls");
            Debug.LogError(ex);
        }
        ImportStatistic.IsRun = false;
        //ImportStatistic.ThreadImport.Abort();
    }