public static void ClearColorMakers(IBackgroundContext context, LpuExecParams executorParams) { context.ProgressSeparator(); context.ReportProgress(@"УДАЛЕНИЕ МАРКЕРОВ НЕДЕЙСТВИТЕЛЬНЫХ ПОЛИСОВ"); context.ProgressSeparator(); using (var dataContext = new VistaMedDataContext(context)) { var invMarkerType = getInvMarkerType(dataContext); if(invMarkerType != null) { context.ReportProgress(@""); try { dataContext.VistaMed.ExecuteCommand(@"DELETE FROM Client_StatusObservation WHERE statusObservationType_id IS NULL"); dataContext.VistaMed.ExecuteCommand(@"DELETE FROM Client_StatusObservation WHERE statusObservationType_id = {0}", invMarkerType.Id); dataContext.VistaMed.SubmitChanges(); context.ReportProgress(@"Удаление маркеров проведено"); } catch (Exception exception) { context.ReportError(@"{0}", exception.Message); } } else { //context.ReportError(@"Тип маркера недействительного полиса не найден в БД ВистаМед"); } } context.ProgressSeparator('-'); }
public static void AnalyzeErrors(IBackgroundContext context, LpuExecParams executorParams) { if (context.CancellationPending) return; context.ProgressSeparator(); context.ReportProgress(@"АНАЛИЗ ОШИБОК"); context.ReportProgress(""); using (var dataContext = new ErrorsAnalyzerDataContext()) { var dir = Settings.Default.DataDir; dataContext.Load(context, dir, dir, dir); if (context.CancellationPending) return; foreach (var errorDataSet in dataContext.Errors.TakeWhile(x => !context.CancellationPending)) { analyzeErrorsDataSet(context, dataContext, errorDataSet); } } context.ProgressSeparator('-'); }
public static void ValidateBills(IBackgroundContext context, LpuExecParams executorParams) { if (context.CancellationPending) return; context.ProgressSeparator(); context.ReportProgress(@"ПРОВЕРКА СЧЕТОВ"); context.ReportProgress(""); using (var dataContext = new BillsValidatorDataContext()) { var dir = Properties.Settings.Default.DataDir; dataContext.Load(context, dir, dir, dir); if (context.CancellationPending) return; foreach (var bill in dataContext.Bills.TakeWhile(x => !context.CancellationPending)) { validateBill(context, dataContext, bill); } } context.ProgressSeparator('-'); }
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('-'); }
public static void LoadAddressAndSnils(IBackgroundContext context, LpuExecParams executorParams) { context.ProgressSeparator(); context.ReportProgress(@"ÇÀÃÐÓÇÊÀ ÀÄÐÅÑÎÂ È ÑÍÈËÑ"); context.ProgressSeparator(); using (var dataContext = new VistaMedDataContext(context)) { var dir = Properties.Settings.Default.DataDir; dataContext.LoadSmoPacients(context, dir); var npp = 0; foreach (var pacientList in dataContext.SmoPacients.Values) { if (context.CancellationPending) break; foreach (var smoPacient in pacientList.Where(x => x.MCOD == executorParams.LpuCode)) { if (context.CancellationPending) break; var policyList = dataContext.VistaMed.ClientPolicies.Where(x => x.Number == smoPacient.N_POL && x.Serial == smoPacient.S_POL && !x.Deleted); if (policyList.Count() == 1) { var client = policyList.First().Client; if (client.LastName.ToLower() == smoPacient.FAM.ToLower() && client.FirstName.ToLower() == smoPacient.IM.ToLower() && client.PatrName.ToLower() == smoPacient.OT.ToLower() && client.BirthDate == smoPacient.DR) { npp++; var address = string.Join(", ", (new[] { smoPacient.RNNAME, smoPacient.NPNAME, smoPacient.UL, string.IsNullOrEmpty(smoPacient.DOM) ? "" : "ä." + smoPacient.DOM, string.IsNullOrEmpty(smoPacient.KV) ? "" : "êâ." + smoPacient.KV }).Where(x => !string.IsNullOrEmpty(x))); var snils = smoPacient.SNILS; var phone = smoPacient.TEL; if (!string.IsNullOrEmpty(address)) { var ulCode = smoPacient.ULCODE; if (ulCode == "0") ulCode = ""; var adrReg = client.ClientAddresses.LastOrDefault(x => x.Type == 0); setAddress(adrReg, address, ulCode); var adrFact = client.ClientAddresses.LastOrDefault(x => x.Type == 1); setAddress(adrFact, address, ulCode); } if (!string.IsNullOrEmpty(snils)) client.SNILS = snils; if (npp % 10000 == 0) { dataContext.VistaMed.SubmitChanges(); context.ReportProgress(@"{0} çàïèñåé", npp); } } } } } } }
public static void SetColorMakers(IBackgroundContext context, LpuExecParams executorParams) { ClearColorMakers(context, null); context.ProgressSeparator(); context.ReportProgress(@"УСТАНОВКА МАРКЕРОВ НЕДЕЙСТВИТЕЛЬНЫХ ПОЛИСОВ"); context.ProgressSeparator(); using (var dataContext = new SetColorMakersDataContext(context)) { dataContext.Load(context); var invMarkerType = getInvMarkerType(dataContext); if (invMarkerType == null) { invMarkerType = new RbStatusObservationClientType(); invMarkerType.Code = InvalidPolicyMarkerCode; invMarkerType.Color = InvalidPolicyMarkerColor; invMarkerType.Name = InvalidPolicyMarkerName; dataContext.VistaMed.SubmitChanges(); } invMarkerType = getInvMarkerType(dataContext); if (invMarkerType != null) { context.ReportProgress(@""); foreach (var smoPacient in dataContext.SmoPacients.TakeWhile(x => !context.CancellationPending)) { var smoCode = smoPacient.Key; var smoPolicyNumbers = new HashSet<string>(); // smoPacient.Value.Select(x => x.SerialNum).Distinct().ToList().ForEach(z => smoPolicyNumbers.Add(z)); // 14/01/14 поиск по более полному ключу smoPacient.Value.Select(x => x.Key).Distinct().ToList().ForEach(z => smoPolicyNumbers.Add(z)); var smo = dataContext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == smoCode && x.IsInsurer); if(smo != null) { var smoId = smo.Id; context.ReportProgress(@"СМО {0}", smo.FullName); try { var allPolicies = from p in dataContext.VistaMed.ClientPolicies where p.InsurerId == smoId && p.Id == dataContext.VistaMed.GetClientPolicyId(p.ClientId, 1) select new { p.Id, p.ClientId, p.Serial, p.Number, p.Client.LastName, p.Client.FirstName, p.Client.PatrName, p.Client.BirthDate }; context.ReportProgress(@"Проверяем полисы"); var invalidPolicies = new List<Tuple<int,int>>(); int i = 1; foreach (var policy in allPolicies) { if (context.CancellationPending) break; // 14/01/14 поиск по полному ключу var policyKey = (policy.Serial + "|" + policy.Number + "|" + policy.LastName + "|" + policy.FirstName + "|" + policy.PatrName + "|" + policy.BirthDate.ToShortDateString()).ToUpper(); if (!smoPolicyNumbers.Contains(policyKey)) invalidPolicies.Add(new Tuple<int, int>(policy.Id, policy.ClientId)); if(i % 50000 == 0) context.ReportProgress(); i++; } if(invalidPolicies.Count == 0) context.ReportProgress(@"Недействительные полисы не найдены"); else { context.ReportProgress(@"Обнаружено {0} недействительных полисов", invalidPolicies.Count); var invalidClients = invalidPolicies.Select(x => x.Item2).Distinct(); var batch = new List<int>(); context.ReportProgress(@"Простановка маркеров"); foreach (var invalidClient in invalidClients) { batch.Add(invalidClient); execBatch(context, dataContext, batch, invMarkerType.Id); } execBatch(context, dataContext, batch, invMarkerType.Id, true); } } catch (Exception exception) { context.ReportError(exception.Message); } context.ProgressSeparator('+'); } else context.ReportError(@"СМО с кодом МИАЦ {0} не найдена в БД ВистаМед", smoCode); } } else { context.ReportError(@"Тип маркера недействительного полиса не найден в БД ВистаМед"); } } context.ProgressSeparator('-'); }