public static void UpdateClientAttaches(IBackgroundContext context, LpuExecParams args) { if (context.CancellationPending) return; context.ProgressSeparator(); context.ReportProgress(@"ОБНОВЛЕНИЕ СВЕДЕНИЙ О ПРИКРЕПЛЕНИИ ЗАСТРАХОВАННЫХ ЛИЦ К ЛПУ"); context.ReportProgress(""); using (var dataContext = new AttacherDataContext(context)) { var dupMiac = (from org in dataContext.VistaMed.Organisations where !string.IsNullOrEmpty(org.MiacCode) group org by org.MiacCode into g select g).Where(x => x.Count() > 1); if (dupMiac.Any()) { foreach (var dupGroup in dupMiac) { context.ReportError(@"В справочнике организаций найдено {0} записей с кодом МИАЦ = {1}", dupGroup.Count(), dupGroup.Key); } context.ReportProgress(@"Пожалуйста устраните указанные ошибки"); } else { dataContext.Load(context, Properties.Settings.Default.DataDir); // словарь организаций по коду МИАЦ var lpuDict = (from lpu in dataContext.VistaMed.Organisations where !lpu.Deleted && !string.IsNullOrEmpty(lpu.MiacCode) select lpu).ToDictionary(x => x.MiacCode); var idOrgDict = (from lpu in dataContext.VistaMed.Organisations where !lpu.Deleted select lpu).ToDictionary(x => x.Id); var errorMiacCodes = new HashSet<string>(); var updateStatements = new List<string>(); var insertStatements = new List<string>(); foreach (var smoData in dataContext.SmoPacients) { context.ReportProgress(@"Обрабатываем СМО {0} - {1} застрахованных лиц ...", smoData.Key, smoData.Value.Count); int smoClientIndex = 0; foreach (var smoPacient in smoData.Value.Where(x => !string.IsNullOrEmpty(x.MCOD))) { if (context.CancellationPending) break; if (lpuDict.ContainsKey(smoPacient.MCOD)) { // выбираем ЛПУ по колу МИАЦ var lpu = lpuDict[smoPacient.MCOD]; // по ДР var clients = dataContext.VistaMed.Clients.Where(x => x.BirthDate == smoPacient.DR).ToList(); // клиенты по фио clients = clients.Where( x => x.LastName.ToUpper() == smoPacient.FAM.ToUpper() && x.FirstName.ToUpper() == smoPacient.IM.ToUpper() && x.PatrName.ToUpper() == smoPacient.OT.ToUpper()) .ToList(); // по ключу clients = clients.Where(x => x.GetKey(dataContext.VistaMed) == smoPacient.Key).ToList(); foreach (var client in clients) { var attachInfo = new AttachInfo(smoPacient, dataContext.VistaMed, lpu); // крайняя по дате запись о прикреплении var attachRec = client.ClientAttaches.OrderByDescending(x => x.BegDate).FirstOrDefault(); // создаем новую запись о прикреплении когда var shouldCreateNew = attachRec == null /* битый ID организации ЛПУ */ || !idOrgDict.ContainsKey(attachRec.LPUId) /* не то ЛПУ и код миац не пустой (при пустом коде миац корректируем последнюю запись о привязке) */ || ((attachInfo.Lpu.Id != attachRec.LPUId) && !string.IsNullOrEmpty(idOrgDict[attachRec.LPUId].MiacCode)); if (shouldCreateNew) attachInfo.CreateAttachRecord(client, insertStatements); else attachInfo.UpdateAttachRecord(attachRec, updateStatements); } } else { if (!errorMiacCodes.Contains(smoPacient.MCOD)) { context.ReportError( @"Код МИАЦ {0} для ЛПУ не найден в справочнике организаций Виста-Мед. Привязка к этому ЛПУ не проводится", smoPacient.MCOD); errorMiacCodes.Add(smoPacient.MCOD); } } smoClientIndex++; if(smoClientIndex%50000 == 0) context.ReportProgress(@"Обработано {0} записей", smoClientIndex); } if (context.CancellationPending) break; else { context.ReportProgress("Записываем изменения в БД ..."); execInsertStatements(insertStatements, dataContext, context); execUpdateStatements(updateStatements, dataContext, context); insertStatements.Clear(); updateStatements.Clear(); } context.ProgressSeparator(); } } } context.ProgressSeparator('-'); }
private static void execUpdateStatements(List<string> updateStatements, AttacherDataContext dataContext, IBackgroundContext context) { int i = 0; if (updateStatements.Count > 0) { while (updateStatements.Count > 0) { dataContext.VistaMed.ExecuteCommand(updateStatements[0]); i++; if (i % 5000 == 0) dataContext.VistaMed.SubmitChanges(); updateStatements.RemoveAt(0); } dataContext.VistaMed.SubmitChanges(); } }
private static void execInsertStatements(List<string> insertStatements, AttacherDataContext dataContext, IBackgroundContext context) { if (insertStatements.Count > 0) { var insertLine = insertStatements[0]; insertStatements.RemoveAt(0); while (insertStatements.Count > 0) { var batch = insertStatements.Take(5000).ToList(); for (int i = 0; i < batch.Count; i++) { if(i > 0) batch[i] = ", " + batch[i]; } var insertCmd = insertLine + " " + string.Join("", batch) + ";"; dataContext.VistaMed.ExecuteCommand(insertCmd); dataContext.VistaMed.SubmitChanges(); insertStatements.RemoveRange(0, batch.Count); } } }