public static BillsRegister Create(IEnumerable <PERS_LIST> personsBills, IEnumerable <ZL_LIST> casesBills)
        {
            if (personsBills == null || !personsBills.Any())
            {
                throw new ArgumentException("Реестр должен содержать минимум 1 файл пациентов.");
            }

            if (casesBills == null || !casesBills.Any())
            {
                throw new ArgumentException("Реестр должен содержать минимум 1 файл случаев.");
            }

            var register = new BillsRegister(casesBills.First().SCHET.MONTH, casesBills.First().SCHET.YEAR);

            foreach (var personsBill in personsBills)
            {
                var casesBill = casesBills.Where(x => BillPair.IsPair(personsBill, x)).FirstOrDefault();

                if (casesBill == null)
                {
                    throw new InvalidOperationException("Не удалось сопоставить все пары файлов счетов.");
                }

                register.Add(new BillPair(personsBill, casesBill));
            }

            return(register);
        }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="filePaths">Пути к xml файлам реестров-счетов. (может быть папками, xml файлами и/или zip архивами)</param>
        /// <returns></returns>
        public Register GetRegister(IEnumerable <string> filePaths)
        {
            var xmlLoader = new XmlBillsLoader();

            xmlLoader.Load(filePaths);

            var billsRegister = BillsRegister.Create(xmlLoader.PersonsBills, xmlLoader.CasesBills);

            var register = new Register()
            {
                Month     = billsRegister.Month,
                Year      = billsRegister.Year,
                BuildDate = billsRegister.Bills.Max(x => x.Cases.ZGLV.DATA),
                Title     = GetTitle(billsRegister.Bills.First().Cases.ZGLV.FILENAME),
            };

            foreach (var bill in billsRegister.Bills)
            {
                //добавлен DistinctBy потому то реестрах МЭК пациент может дублироваться хотя в реестре ЛПУ этого не было
                var billPersons = bill.Persons.PERS.DistinctBy(x => x.ID_PAC).ToDictionary(x => x.ID_PAC, x => x);

                foreach (var billCase in bill.Cases.ZAP)
                {
                    var billPerson = billPersons[billCase.PACIENT.ID_PAC];

                    var mCase = MapToCase(billPerson, billCase);

                    register.Cases.Add(mCase);
                }
            }

            register.CasesCount = register.Cases.Count;

            return(register);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="filePaths">Пути к xml файлам реестров-счетов. (может быть папками, xml файлами и/или zip архивами)</param>
        /// <returns></returns>
        public List <PatientExaminations> GetPatientExaminationsList(IEnumerable <string> filePaths)
        {
            var xmlLoader = new XmlBillsLoader();

            xmlLoader.XmlFileNameStartsWithFilter = XmlFileNameStartsWithFilter;
            xmlLoader.Load(filePaths);
            var billsRegister = BillsRegister.Create(xmlLoader.PersonsBills, xmlLoader.CasesBills);

            var result = new Dictionary <string, PatientExaminations>();

            foreach (var bill in billsRegister.Bills)
            {
                int examinationStage;

                if (!TryGetExaminationStage(bill.Cases.SCHET.DISP, out examinationStage))
                {
                    continue;
                }

                var billPersons = bill.Persons.PERS.ToDictionary(x => x.ID_PAC, x => x);

                foreach (var billCase in bill.Cases.ZAP)
                {
                    var examination = GetExamination(billCase, examinationStage);

                    if (examination.HealthGroup == HealthGroup.None)
                    {
                        continue;
                    }

                    var insuranceNumber = GetInsuranceNumber(billCase.PACIENT);
                    var examinationYear = billCase.Z_SL.SL.DATE_2.Year;
                    var patient         = billPersons[billCase.PACIENT.ID_PAC];
                    var examinationKind = GetExaminationType(bill.Cases.SCHET.DISP, examinationYear - patient.DR.Year);

                    PatientExaminations patientExamination;

                    var key = $"{insuranceNumber}{examinationYear}{examinationKind}".ToUpper();
                    if (!result.TryGetValue(key, out patientExamination))
                    {
                        patientExamination = new PatientExaminations()
                        {
                            InsuranceNumber = insuranceNumber,
                            Year            = examinationYear,
                            Kind            = examinationKind,
                            Surname         = patient.FAM,
                            Name            = patient.IM,
                            Patronymic      = patient.OT,
                            Birthdate       = patient.DR
                        };

                        result.Add(key, patientExamination);
                    }

                    patientExamination.AddStage(examinationStage, examination);
                }
            }

            return(result.Values.ToList());
        }