/// <summary> /// Cancel asynchronous import. /// </summary> public static void CancelImport() { if (ImportWorker.IsBusy) { ImportWorker.CancelAsync(); } }
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")); }
//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")); }
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); }
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); } }
public AdditionalValidationWorker(ImportWorker <TModel> worker) { LoginCompanyId = worker.LoginCompanyId; LoginCompanyCode = worker.LoginCompanyCode; LoginUserId = worker.LoginUserId; LoginUserCode = worker.LoginUserCode; RecordCount = worker.RecordCount; Models = worker.Models; }
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; }
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")); }
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(); } }
/// <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(); } }
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()); }
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); }