예제 #1
0
 /// <summary>
 /// Cancel asynchronous import.
 /// </summary>
 public static void CancelImport()
 {
     if (ImportWorker.IsBusy)
     {
         ImportWorker.CancelAsync();
     }
 }
예제 #2
0
        public ActionResult GetLoadPurchasePriceToQuote(string orderNumbers, string date1, string lineNumbers, string amount4s)
        {
            List <ImportColumn> listOfColumns = new List <ImportColumn>();

            var orderNumberColumn = new ImportColumn("OrderNumber", orderNumbers);

            listOfColumns.Add(new ImportColumn("OrderNumber", orderNumberColumn[0]));
            listOfColumns.Add(new ImportColumn("OrderType", "Комм. предложение"));
            listOfColumns.Add(new ImportColumn("Date1", date1));

            var importSection = new ImportSection("ORDERHEADER", ImportMode.Change, listOfColumns);

            List <ImportColumn> secondListOfColumns = new List <ImportColumn>();

            secondListOfColumns.Add(orderNumberColumn);
            secondListOfColumns.Add(new ImportColumn("OrderType", "Комм. предложение"));
            secondListOfColumns.Add(new ImportColumn("LineNumber", lineNumbers));
            secondListOfColumns.Add(new ImportColumn("Amount4", amount4s));

            var secondImportSection = new ImportSection("ORDERLINE", ImportMode.Change, listOfColumns);

            var worker = new ImportWorker("LoadPricesToIPO");

            worker.DoWork(ImportWorker.CreateDataSet(new ImportSection[] { importSection, secondImportSection }));
            return(DownloadTxt(worker.GetResult(), "test"));
        }
예제 #3
0
        //TODO Не реализовано. Жду реализации функции от коллег
        public ActionResult GetUpdateDeliveryDates(string vendorNumbers, string dates, string numberPOs, string numberIPOs, Inventory inventory)
        {
            // Пилим список столбцов файла импорта
            List <ImportColumn> listOfColumns = new List <ImportColumn>();

            // Класс колонки сам распарсит строку
            // Если в строке всего один ряд, он возмет строку как значение по умолчанию
            var IPOColumn = new ImportColumn("ItemPurchaseOrderNumber", vendorNumbers);

            listOfColumns.Add(IPOColumn);
            var LinesColumn = new ImportColumn("LineNumber", "1");

            listOfColumns.Add(LinesColumn);
            var ItemsColumn = new ImportColumn("ItemNumber", "itemnumber");

            listOfColumns.Add(ItemsColumn);
            var Date2Column = new ImportColumn("Date2", dates);

            listOfColumns.Add(Date2Column);

            // Подгружаем из базы необходимые данные

            listOfColumns.Add(new ImportColumn("ExpectedCommitmentDate", numberPOs));
            listOfColumns.Add(new ImportColumn("Date1", numberIPOs));
            listOfColumns.Add(new ImportColumn("Date4", numberIPOs));
            // Создаем секцию файла импорта, передав ему название таблицы, режим и список столбцов и их значений
            var importSection = new ImportSection("ITEMPURCHASELINE", ImportMode.CreateChange, listOfColumns);
            // Создаем класс-создатель файла импорта
            var importWorker = new ImportWorker("GetUpdateDeliveryDates");

            // Передаем ему секцию и заставляем работать.
            importWorker.DoWork(importSection);
            return(DownloadTxt(importWorker.GetResult(), "test"));
        }
예제 #4
0
        public static bool ValidateDuplicated <TModel, TIdentity>(this ImportMethod method,
                                                                  UnitOfWorkWithReference <TModel, TIdentity> unitOfWork,
                                                                  ImportWorker <TModel> worker)
            where TModel : class, new()
        {
            if (method != ImportMethod.InsertOnly)
            {
                return(true);
            }

            var valid = true;

            foreach (var pair in worker.Models)
            {
                TModel    product        = pair.Value;
                TIdentity importedUnique = unitOfWork.GetIdentity(product);

                if (unitOfWork.All.ContainsKey(importedUnique))
                {
                    valid = false;
                    worker.AddKeyDuplicatedError(pair.Key);
                }
            }
            return(valid);
        }
예제 #5
0
        private static bool InsertAndUpdate <TModel, TIdentity>(
            UnitOfWorkWithReference <TModel, TIdentity> unitOfWork,
            ImportWorker <TModel> worker)
            where TModel : class, new()
        {
            foreach (var pair in worker.Models)
            {
                TModel    product        = pair.Value;
                TIdentity importedUnique = unitOfWork.GetIdentity(product);

                TModel target = null;
                if (unitOfWork.All.TryGetValue(importedUnique, out target))
                {
                    Model.CopyTo(product, target, false);
                    unitOfWork.RegisterDirty(target);
                }
                else
                {
                    unitOfWork.RegisterNew(product);
                }
            }
            Model.SetUpdateBy(unitOfWork.New.Concat(unitOfWork.Dirty), worker.LoginUserId);

            return(worker.Models.Any());
        }
 public void detectInstall()
 {
     if (this.detectedInstall == null)
     {
         this.detectedInstall = new DetectInstall();
         this.worker          = new ImportWorker(this.detectedInstall);
     }
 }
예제 #7
0
 public AdditionalValidationWorker(ImportWorker <TModel> worker)
 {
     LoginCompanyId   = worker.LoginCompanyId;
     LoginCompanyCode = worker.LoginCompanyCode;
     LoginUserId      = worker.LoginUserId;
     LoginUserCode    = worker.LoginUserCode;
     RecordCount      = worker.RecordCount;
     Models           = worker.Models;
 }
예제 #8
0
 public CodeToIdWorker(ImportWorker <TModel> import)
 {
     LoginCompanyId      = import.LoginCompanyId;
     LoginCompanyCode    = import.LoginCompanyCode;
     LoginUserId         = import.LoginUserId;
     LoginUserCode       = import.LoginUserCode;
     RecordCount         = import.RecordCount;
     Models              = import.Models;
     CodeResolutionQueue = import.CodeResolutionQueue;
 }
예제 #9
0
        public ActionResult GetImportFileForLoadPrice(string numberIPOs, string lineNumbers, string itemNumbers, string newPrices)
        {
            List <ImportColumn> listOfColumns = new List <ImportColumn>();

            listOfColumns.Add(new ImportColumn("ItemPurchaseOrderNumber", numberIPOs));
            listOfColumns.Add(new ImportColumn("LineNumber", lineNumbers));
            listOfColumns.Add(new ImportColumn("ItemNumber", itemNumbers));
            listOfColumns.Add(new ImportColumn("UnitPriceCurrency", newPrices));

            var importSection = new ImportSection("ITEMPURCHASELINE", ImportMode.Change, listOfColumns);

            var worker = new ImportWorker("LoadPricesToIPO");

            worker.DoWork(importSection);
            return(DownloadTxt(worker.GetResult(), "test"));
        }
예제 #10
0
        public static bool Import <TModel, TIdentity>(this ImportMethod method,
                                                      UnitOfWorkWithReference <TModel, TIdentity> unitOfWork,
                                                      ImportWorker <TModel> worker)
            where TModel : class, new()
        {
            switch (method)
            {
            case ImportMethod.Replace: return(Replace(unitOfWork, worker));

            case ImportMethod.InsertOnly: return(InsertOnly(unitOfWork, worker));

            case ImportMethod.InsertAndUpdate: return(InsertAndUpdate(unitOfWork, worker));

            default: throw new InvalidOperationException();
            }
        }
예제 #11
0
        /// <summary>
        /// Imports users and groups from active directory.
        /// </summary>
        /// <param name="provider">IPrincipalProvider</param>
        /// <param name="messageLog">Provides message logging</param>
        /// <param name="workerCompleted">Action to perform on worker completed.</param>
        public static void ImportAsync(IPrincipalProvider provider, IMessageLog messageLog, RunWorkerCompletedEventHandler workerCompleted = null)
        {
            if (!ImportWorker.IsBusy)
            {
                // Set AD provider
                PrincipalProvider = provider;

                // Set message logs
                MessageLog = messageLog;

                if (ImportProfile.LogImportProcess)
                {
                    MessageLog = new FileMessageLog(MessageLog, Path.GetDirectoryName(ImportProfile.LogPath), Path.GetFileName(ImportProfile.LogPath));
                }

                // Run import
                if (workerCompleted != null)
                {
                    ImportWorker.RunWorkerCompleted += workerCompleted;
                }

                ImportWorker.RunWorkerAsync();
            }
        }
예제 #12
0
        private static bool Replace <TModel, TIdentity>(
            UnitOfWorkWithReference <TModel, TIdentity> unitOfWork,
            ImportWorker <TModel> worker)
            where TModel : class, new()
        {
            foreach (var pair in worker.Models)
            {
                TModel    product        = pair.Value;
                TIdentity importedUnique = unitOfWork.GetIdentity(product);

                TModel target = null;
                if (unitOfWork.All.TryGetValue(importedUnique, out target))
                {
                    Model.CopyTo(product, target, false);
                    unitOfWork.RegisterDirty(target);
                }
                else
                {
                    unitOfWork.RegisterNew(product);
                }
            }
            IEnumerable <TModel> newAndDirty = unitOfWork.Dirty.Concat(unitOfWork.New);

            Model.SetUpdateBy(newAndDirty, worker.LoginUserId);
            foreach (TModel model in unitOfWork.All.Values.Except(newAndDirty))
            {
                unitOfWork.RegisterRemoved(model);
            }

            if (worker.RecordCount != worker.Models.Count)
            {
                worker.Models.Clear(); // 全件取込不可
            }

            return(worker.Models.Any());
        }
예제 #13
0
        public async Task <ImportResult> ImportAsync(string csvPath,
                                                     ImportMethod method,
                                                     CancellationToken?token,
                                                     IProgress <int> progress)
        {
            IEnumerable <TModel> original = (LoadAsync == null) ? Enumerable.Empty <TModel>() : await LoadAsync();

            if (token?.IsCancellationRequested ?? false)
            {
                return(null);
            }
            progress?.Report(20); // 進捗:取込対象データ読込完了

            var unitOfWork = new UnitOfWorkWithReference <TModel, TIdentity>(
                original, createIdentity);

            var worker = new ImportWorker <TModel>(RowDef);

            worker.LoginUserId      = UserId;
            worker.LoginUserCode    = UserCode;
            worker.LoginCompanyId   = CompanyId;
            worker.LoginCompanyCode = CompanyCode;

            await InitializeWorker?.Invoke(worker);

            var valid = true;
            var csv   = Parser.Parse(csvPath);

            RowDef.SetupFields();
            var fieldDefs = RowDef.Fields
                            .Where(f => !f.Ignored)
                            .OrderBy(f => f.FieldNumber)
                            .ToArray();

            foreach (var fields in csv.Skip(RowDef.StartLineNumber))
            {
                worker.NewRecord(fields);
                if (fields.Length < fieldDefs.Length)
                {
                    foreach (var field in fieldDefs.Skip(fields.Length))
                    {
                        Errors.Add(new WorkingReport
                        {
                            LineNo    = worker.RecordCount,
                            FieldNo   = field.FieldIndex,
                            FieldName = field.FieldName,
                            Value     = string.Empty,
                            Message   = $"{field.FieldName}がありません。",
                        });
                    }
                }
                valid &= RowDef.Do(worker); // 書式チェック&エラー情報収集

                if (worker.Reports.Any())
                {
                    Errors.AddRange(worker.Reports);
                    worker.Reports.Clear();
                }
            }
            progress?.Report(40); // 進捗:CSVファイル読込完了

            // DB関連チェック
            var validate = new CodeToIdWorker <TModel>(worker); // importの結果を引き渡す

            valid &= RowDef.Do(validate);                       // DBチェック&エラー情報収集
            Errors.AddRange(validate.Reports);

            await AdditionalWorker?.Invoke(worker);

            var additionalValidate = new AdditionalValidationWorker <TModel>(worker)
            {
                ImportMethod = method,
            };

            valid &= RowDef.Do(additionalValidate); // DBチェック&エラー情報収集
            Errors.AddRange(additionalValidate.Reports);

            foreach (var lineNo in Errors.Where(x => x.LineNo.HasValue).Select(x => x.LineNo.Value).Distinct())
            {
                worker.Models.Remove(lineNo);
            }

            // DB重複チェック
            if (!method.ValidateDuplicated(unitOfWork, worker))
            {
                worker.Reports.ForEach(r => worker.Models.Remove(r.LineNo.Value));
                Errors.AddRange(worker.Reports);
                worker.Reports.Clear();
            }

            // ファイル内キー重複チェック
            var uniqueKeys = new Dictionary <TIdentity, int>();

            var duplicatedLines = new List <int>();

            foreach (var pair in validate.Models)
            {
                // 必須項目が空欄の時は、Nullまたはゼロになっている。
                // キー項目が部分的にでも空欄の場合、重複チェックをパスする。
                var identity = createIdentity(pair.Value);
                if (ContainsNull(identity))
                {
                    identity = default(TIdentity);
                }
                if (identity == null || identity.Equals(default(TIdentity)))
                {
                    continue;
                }

                if (uniqueKeys.ContainsKey(identity))
                {
                    switch (RowDef.DuplicateAdoption)
                    {
                    case DuplicateAdoption.BothAreErrors:
                        var duplicated = uniqueKeys[identity];
                        if (!duplicatedLines.Contains(duplicated))
                        {
                            duplicatedLines.Add(duplicated);
                        }
                        duplicatedLines.Add(pair.Key);
                        break;

                    case DuplicateAdoption.First:
                        duplicatedLines.Add(pair.Key);
                        break;
                    }
                }
                else
                {
                    uniqueKeys.Add(identity, pair.Key);
                }
                if (token.HasValue && token.Value.IsCancellationRequested)
                {
                    return(null);
                }
            }
            progress?.Report(60); // 進捗:データベース関連チェック完了

            switch (RowDef.TreatDuplicateAs)
            {
            case TreatDuplicateAs.Error:
                duplicatedLines.ForEach(lineNo =>
                {
                    Errors.Add(new WorkingReport()     // キー重複
                    {
                        LineNo    = lineNo,
                        FieldName = RowDef.KeyFields?.FirstOrDefault().FieldName ?? string.Empty,
                        Message   = "重複しているため、インポートできません。",
                        Value     = createIdentity(validate.Models[lineNo]).ToString(),
                    });
                });
                break;

            case TreatDuplicateAs.Ignore:
                // エラーにはせず、ここで取込対象から取り除く。
                duplicatedLines.ForEach(lineNo => worker.Ignore(lineNo));
                break;
            }
            if (token.HasValue && token.Value.IsCancellationRequested)
            {
                return(null);
            }

            // エラーデータを更新対象から取り除く
            var errorLines = Errors
                             .GroupBy(report => report.LineNo)
                             .Select(g => g.Key)
                             .ToList();

            if (errorLines.Any(lineNo => !lineNo.HasValue))
            {
                validate.Models.Clear();
            }
            else
            {
                errorLines.ForEach(lineNo => validate.Models.Remove(lineNo.Value));
            }
            if (token.HasValue && token.Value.IsCancellationRequested)
            {
                return(null);
            }
            progress?.Report(80); // 進捗:すべてのデータチェック完了

            ImportResult result = null;

            if (method.Import(unitOfWork, worker) && RegisterAsync != null)
            {
                result = await RegisterAsync(unitOfWork);

                PostImportHanlder?.Invoke(worker, result);
                Debug.Assert(result != null,
                             $"{nameof(RegisterAsync)}()が{nameof(ImportResult)}を返しませんでした。");
            }
            else // 登録処理をしなかった、または取込可能件数がゼロ
            {
                result = new ImportResult
                {
                    ProcessResult = new ProcessResult {
                        Result = true
                    },
                    InsertCount = 0,
                    UpdateCount = 0,
                    DeleteCount = 0,
                };
            }
            Errors.AddRange(worker.Reports);

            if (Errors.Any() && !string.IsNullOrWhiteSpace(ErrorLogPath))
            {
                OutputErrorLog(ErrorLogPath, Errors, csvPath);
            }
            result.ValidItemCount   = worker.Models.Count;
            result.InvalidItemCount = worker.RecordCount - result.ValidItemCount;

            UnitOfWork = unitOfWork;
            progress?.Report(100); // 進捗:取込完了

            return(result);
        }