/// <summary>インポート処理</summary> /// <param name="source"></param> /// <param name="token"></param> /// <returns></returns> public async Task <ImportResult> ImportAsync(MasterImportSource source, CancellationToken token = default(CancellationToken)) { var mode = (ImportMethod)source.ImportMethod; var encoding = Encoding.GetEncoding(source.EncodingCodePage); var csv = encoding.GetString(source.Data); var companyTask = companyProcessor.GetAsync(new CompanySearch { Id = source.CompanyId, }, token); var loginUserTask = loginUserProcessor.GetAsync(new LoginUserSearch { Ids = new[] { source.LoginUserId }, }, token); var appConTask = applicationControlProcessor.GetAsync(source.CompanyId, token); var sectionTask = sectionProcessor.GetAsync(new SectionSearch { CompanyId = source.CompanyId, }, token); var departmentTask = departmentProcessor.GetAsync(new DepartmentSearch { CompanyId = source.CompanyId, }, token); await Task.WhenAll(companyTask, loginUserTask, appConTask, sectionTask, departmentTask); var company = companyTask.Result.First(); var loginUser = loginUserTask.Result.First(); var appCon = appConTask.Result; var sectionDictionary = sectionTask.Result.ToDictionary(x => x.Code); var departmentDictionary = departmentTask.Result.ToDictionary(x => x.Code); var definition = new SectionWithDepartmentFileDefinition(new DataExpression(appCon)); var parser = new CsvParser { Encoding = encoding, StreamCreator = new PlainTextMemoryStreamCreator(), }; definition.SectionCodeField.GetModelsByCode = codes => sectionDictionary; definition.DepartmentCodeField.GetModelsByCode = codes => departmentDictionary; var importer = definition.CreateImporter(x => new { x.SectionId, x.DepartmentId }, parser); importer.UserId = source.LoginUserId; importer.UserCode = loginUser.Code; importer.CompanyId = source.CompanyId; importer.CompanyCode = company.Code; importer.AdditionalWorker = async worker => { var dbItems = (await sectionWithDepartmentProcessor.GetAsync(new SectionWithDepartmentSearch { CompanyId = source.CompanyId, }, token)).ToList(); var dbDepartmentCheckList = new SortedList <int, SectionWithDepartment[]>(dbItems.GroupBy(x => x.DepartmentId) .ToDictionary(x => x.Key, x => x.ToArray())); var csvDepartmentCheckList = new SortedList <int, SectionWithDepartment[]>(worker.Models.Values .GroupBy(x => x.DepartmentId) .ToDictionary(x => x.Key, x => x.ToArray())); var def = worker.RowDef as SectionWithDepartmentFileDefinition; def.DepartmentCodeField.ValidateAdditional = (val, param) => { var reports = new List <WorkingReport>(); foreach (var pair in val) { if (IsDuped(dbDepartmentCheckList, pair.Value.DepartmentId, g => g.Any(x => x.SectionId != pair.Value.SectionId))) { reports.Add(new WorkingReport(pair.Key, def.DepartmentCodeField.FieldIndex, def.DepartmentCodeField.FieldName, "他の入金部門に登録されているため、インポートできません。" )); } if (IsDuped(csvDepartmentCheckList, pair.Value.DepartmentId, g => g.Any(x => x.SectionId != pair.Value.SectionId && pair.Value.DepartmentId != 0))) { reports.Add(new WorkingReport(pair.Key, def.DepartmentCodeField.FieldIndex, def.DepartmentCodeField.FieldName, "他の入金部門に登録されているため、インポートできません。" )); } } return(reports); }; }; importer.LoadAsync = () => sectionWithDepartmentProcessor.GetAsync(new SectionWithDepartmentSearch { CompanyId = source.CompanyId, }, token); importer.RegisterAsync = x => sectionWithDepartmentProcessor.ImportAsync(x.New, x.Dirty, x.Removed, token); var result = await importer.ImportAsync(csv, mode, token, null); result.Logs = importer.GetErrorLogs(); return(result); }
private void Import() { ClearStatusMessage(); try { ImportSetting importSetting = null; var task = Util.GetMasterImportSettingAsync(Login, ImportFileType.SectionWithDepartment); // 取込設定取得 ProgressDialog.Start(ParentForm, task, false, SessionKey); importSetting = task.Result; var definition = new SectionWithDepartmentFileDefinition(new DataExpression(ApplicationControl)); definition.SectionCodeField.GetModelsByCode = val => { Dictionary <string, Section> product = null; ServiceProxyFactory.LifeTime(factory => { var section = factory.Create <SectionMasterClient>(); var result = section.GetByCode(SessionKey, CompanyId, val); if (result.ProcessResult.Result) { product = result.Sections .ToDictionary(c => c.Code); } }); return(product ?? new Dictionary <string, Section>()); }; definition.DepartmentCodeField.GetModelsByCode = val => { Dictionary <string, Department> product = null; ServiceProxyFactory.LifeTime(factory => { var department = factory.Create <DepartmentMasterClient>(); var result = department.GetByCode(SessionKey, CompanyId, val); if (result.ProcessResult.Result) { product = result.Departments.ToDictionary(d => d.Code); } }); return(product ?? new Dictionary <string, Department>()); }; definition.DepartmentCodeField.ValidateAdditional = (val, param) => { var reports = new List <WorkingReport>(); Func <SortedList <int, SectionWithDepartment[]>, int, Func <SectionWithDepartment[], bool>, bool> dupeCheck = (list, key, condition) => { if (!list.ContainsKey(key)) { return(false); } return(condition?.Invoke(list[key]) ?? false); }; List <SectionWithDepartment> dbItems = null; ServiceProxyFactory.LifeTime(factory => { var sectionWithDepartment = factory.Create <SectionWithDepartmentMasterClient>(); var sectionWithDepartmentSearch = new SectionWithDepartmentSearch(); dbItems = sectionWithDepartment .GetItems(SessionKey, CompanyId, sectionWithDepartmentSearch) .SectionDepartments; }); var dbDepartmentCheckList = new SortedList <int, SectionWithDepartment[]>(dbItems.GroupBy(x => x.DepartmentId) .ToDictionary(x => x.Key, x => x.ToArray())); var csvDepartmentCheckList = new SortedList <int, SectionWithDepartment[]>(val.Select(x => x.Value) .GroupBy(x => x.DepartmentId) .ToDictionary(x => x.Key, x => x.ToArray())); foreach (var pair in val) { if (dupeCheck(dbDepartmentCheckList, pair.Value.DepartmentId, g => g.Any(x => x.SectionId != pair.Value.SectionId))) { reports.Add(new WorkingReport(pair.Key, definition.DepartmentCodeField.FieldIndex, definition.DepartmentCodeField.FieldName, "他の入金部門に登録されているため、インポートできません。" )); } if (dupeCheck(csvDepartmentCheckList, pair.Value.DepartmentId, g => g.Any(x => x.SectionId != pair.Value.SectionId && pair.Value.DepartmentId != 0))) { reports.Add(new WorkingReport(pair.Key, definition.DepartmentCodeField.FieldIndex, definition.DepartmentCodeField.FieldName, "他の入金部門に登録されているため、インポートできません。" )); } } return(reports); }; var importer = definition.CreateImporter(m => new { m.SectionId, m.DepartmentId }); importer.UserId = Login.UserId; importer.UserCode = Login.UserCode; importer.CompanyId = CompanyId; importer.CompanyCode = Login.CompanyCode; importer.LoadAsync = async() => await GetSectionWithDepartmentData(); importer.RegisterAsync = async unitOfWork => await RegisterForImportAsync(unitOfWork); var importResult = DoImport(importer, importSetting, Clear); } catch (Exception ex) { Debug.Fail(ex.ToString()); NLogHandler.WriteErrorLog(this, ex, SessionKey); ShowWarningDialog(MsgErrImportErrorWithoutLog); } }