Example #1
0
        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('-');
        }
Example #2
0
 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();
     }
 }
Example #3
0
        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);
                }
            }
        }