/// <summary> /// The export statement. /// </summary> /// <param name="st"> /// The st. /// </param> /// <param name="log"> /// The log. /// </param> /// <param name="sessionAtl"> /// The session atl. /// </param> /// <param name="session"> /// The session. /// </param> private void ExportStatement(StatementMaximum st, Przlog log, ISession sessionAtl, ISession session) { // Поиск временного свидетельства var tempCertificate = st.MedicalInsurances.Where(x => x.IsActive).FirstOrDefault(x => x.PolisType.Id == PolisType.В); // Экспорт временного свидетельства if (!st.IsExportTemp && tempCertificate != null) { var przbuffTemp = WritePrzBuff(st, log, sessionAtl, tempCertificate, GetTypeOperationTemp(st)); st.PrzBuff = przbuffTemp; st.PrzBuffId = przbuffTemp.Id; st.IsExportTemp = true; st.Status = ObjectFactory.GetInstance <IConceptCacheManager>().GetById(StatusStatement.Performed); } if (st.IsExportPolis) { return; } // Поиск полиса var polisCertificate = st.MedicalInsurances.Where(x => x.IsActive).SingleOrDefault(x => x.PolisType.Id != PolisType.В); Przbuf przbuffPolis = null; // Если временное свидетельство заполненно и полис найден, то синхронизируем операцию // Выдача на руки полиса единого образца после временного свидетельства if (tempCertificate != null && polisCertificate != null) { // Экспорт полиса przbuffPolis = WritePrzBuff( st, log, sessionAtl, polisCertificate, ObjectFactory.GetInstance <IConceptCacheManager>().GetById(TypeOperation.П060).Code); } else { // Экспорт полиса if (polisCertificate != null) { przbuffPolis = WritePrzBuff(st, log, sessionAtl, polisCertificate, GetTypeOperationTemp(st)); } } if (przbuffPolis != null) { st.PrzBuffPolis = przbuffPolis; st.PrzBuffPolisId = przbuffPolis.Id; st.IsExportPolis = true; st.Status = ObjectFactory.GetInstance <IConceptCacheManager>().GetById(StatusStatement.Exercised); } }
/// <summary> /// The export by query. /// </summary> /// <param name="query"> /// The query. /// </param> /// <param name="sessionAtl"> /// The session atl. /// </param> /// <param name="log"> /// The log. /// </param> /// <param name="context"> /// The context. /// </param> private void ExportByQuery( IQueryOver <StatementMaximum, StatementMaximum> query, ISession sessionAtl, Przlog log, IJobExecutionContext context) { var session = sessionFactoryPvp.GetCurrentSession(); var count = query.RowCount(); var step = (count / 5000) + 1; for (var i = 0; i < step; i++) { var list = query.OrderBy(x => x.DateFiling) .Asc.ThenBy(x => x.Id) .Asc.Skip(i * 5000) .Take(5000) .RootCriteria.SetTimeout(int.MaxValue) .List <StatementMaximum>(); ExportByList(session, sessionAtl, log, list, context); sessionAtl.Flush(); } }
/// <summary> /// The run. /// </summary> /// <param name="context"> /// The context. /// </param> public override void Run(IJobExecutionContext context) { var session = sessionFactoryPvp.GetCurrentSession(); { var transactionPvp = session.BeginTransaction(); try { using (var sessionAtl = sessionFactorySrz.OpenSession()) { var transactionAtl = sessionAtl.BeginTransaction(); try { var log = new Przlog { Filename = Guid.NewGuid().ToString(), Dtin = DateTime.Now, Reccount = 0 }; sessionAtl.Save(log); // Синхронизируем операции с выдачей временного свидетельства StatementMaximum statement = null; var queryOver = session.QueryOver(() => statement) .Where( x => x.Status.Id == StatusStatement.New || x.Status.Id == StatusStatement.Performed || x.Status.Id == StatusStatement.Declined) .Where(x => !x.IsExportTemp) .And(x => x.AbsentPrevPolicy.Value) .And(x => x.PolicyIsIssued.Value == false); ExportByQuery(queryOver, sessionAtl, log, context); queryOver = session.QueryOver(() => statement) .Where( x => x.Status.Id == StatusStatement.New || x.Status.Id == StatusStatement.Performed || x.Status.Id == StatusStatement.Declined) .Where(x => !x.IsExportTemp || !x.IsExportPolis) .And(x => x.AbsentPrevPolicy.Value) .And(x => x.PolicyIsIssued.Value); ExportByQuery(queryOver, sessionAtl, log, context); // Синхронизируем операции без выдачи временного свидетельства queryOver = session.QueryOver(() => statement) .Where(x => x.Status.Id == StatusStatement.New || x.Status.Id == StatusStatement.Declined) .Where(x => !x.IsExportPolis) .AndNot(x => x.AbsentPrevPolicy.Value); ExportByQuery(queryOver, sessionAtl, log, context); transactionAtl.Commit(); } catch (Exception ex) { transactionAtl.Dispose(); logger.Error(ex.Message, ex); throw; } sessionAtl.Close(); } session.Flush(); transactionPvp.Commit(); } catch (Exception ex) { transactionPvp.Dispose(); logger.Error(ex.Message, ex); throw; } } }
/// <summary> /// The write prz buff. /// </summary> /// <param name="st"> /// The st. /// </param> /// <param name="log"> /// The log. /// </param> /// <param name="sessionAtl"> /// The session atl. /// </param> /// <param name="medicalInsurance"> /// The medical insurance. /// </param> /// <param name="op"> /// The op. /// </param> /// <returns> /// The <see cref="Przbuf"/>. /// </returns> private Przbuf WritePrzBuff( StatementMaximum st, Przlog log, ISession sessionAtl, MedicalInsurance medicalInsurance, string op) { var contentManager = ObjectFactory.GetInstance <IContentManager>(); var personData = st.InsuredPersonData; var documentUdl = st.DocumentUdl; var address = st.Address; var address2 = st.Address2 ?? st.Address; var documentResidency = st.ResidencyDocument; ////if (documentResidency == null && (st.InsuredPersonData.Citizenship == null || st.InsuredPersonData.Citizenship.Id != Country.RUS)) ////{ //// documentResidency = documentUdl; ////} var contactInfo = st.ContactInfo; var pvp = st.PointDistributionPolicy; var smo = pvp.Parent; var foto = contentManager.GetFoto(st.InsuredPersonData.Id); var signature = contentManager.GetSignature(st.InsuredPersonData.Id); var okatoRn = GetOkatoRn(address, sessionAtl) ?? string.Empty; var okatoPrn = GetOkatoRn(address2, sessionAtl) ?? string.Empty; var regulatoryAddress = address.Regulatory(); var regulatoryAddress2 = address2.Regulatory(); var przBuff = new Przbuf { Fam = personData.LastName, Im = personData.FirstName, Ot = personData.MiddleName, W = int.Parse(personData.Gender.Code), Dr = personData.Birthday, Dra = personData.IsIncorrectDate, Drt = personData.BirthdayType.HasValue ? personData.BirthdayType.Value : 1, Mr = personData.Birthplace, Ss = !string.IsNullOrEmpty(personData.Snils) ? SnilsChecker.SsToLong(personData.Snils) : null, Cn = personData.Citizenship != null ? personData.Citizenship.Code : "Б/Г", Kateg = int.Parse(personData.Category.Code), BirthOksm = personData.OldCountry != null ? personData.OldCountry.Code : null, // Документ УДЛ Doctp = documentUdl.DocumentType.Code, Docs = documentUdl.Series, Docn = documentUdl.Number, Docdt = documentUdl.DateIssue, Docend = documentUdl.DateExp, Docorg = documentUdl.IssuingAuthority, // Адрес регистрации Subj = !string.IsNullOrEmpty(address.Okato) ? address.Okato.Substring(0, Math.Min(2, address.Okato.Length)) + "000" : okatoRn.Substring(0, Math.Min(2, okatoRn.Length)) + "000", Rn = okatoRn, Indx = address.Postcode, Rnname = address.Area, City = address.City, Np = !string.IsNullOrEmpty(address.Town) ? address.Town : !string.IsNullOrEmpty(address.City) ? address.City : address.Subject, Ul = address.Street, Dom = address.House, Kor = address.Housing, Kv = address.Room.HasValue ? address.Room.Value.ToString(CultureInfo.InvariantCulture) : string.Empty, Dmj = address.DateRegistration, Kladrg = regulatoryAddress != null ? regulatoryAddress.Code : null, // Адрес проживания Psubj = !string.IsNullOrEmpty(address2.Okato) ? address2.Okato.Substring(0, Math.Min(2, address2.Okato.Length)) + "000" : okatoPrn.Substring(0, Math.Min(2, okatoPrn.Length)) + "000", Prn = okatoPrn, Pindx = address2.Postcode, Prnname = address2.Area, Pcity = address2.City, Pnp = !string.IsNullOrEmpty(address2.Town) ? address2.Town : !string.IsNullOrEmpty(address2.City) ? address2.City : address2.Subject, Pul = address2.Street, Pdom = address2.House, Pkor = address2.Housing, Pkv = address2.Room.HasValue ? address2.Room.Value.ToString(CultureInfo.InvariantCulture) : string.Empty, Pdmj = address2.DateRegistration, Kladrp = regulatoryAddress2 != null ? regulatoryAddress2.Code : null, // Документ регистрации // Контактная информация Email = contactInfo.Email, Phone = contactInfo.HomePhone, Enp = medicalInsurance.Enp ?? st.NumberPolicy, Q = smo.Code, Qogrn = smo.Ogrn, Prz = st.PointDistributionPolicy.Code, Dviz = st.DateFiling, Meth = int.Parse(st.ModeFiling.Code), Sp = personData.Category.Code, Petition = st.HasPetition, Photo = foto ?? string.Empty, Signat = signature ?? string.Empty, PRZLOG = log, Op = op, Opdoc = GetPolisType(medicalInsurance.PolisType.Id), Spol = !string.IsNullOrEmpty(medicalInsurance.PolisSeria) ? medicalInsurance.PolisSeria : null, Npol = medicalInsurance.PolisNumber, Dbeg = medicalInsurance.DateFrom, Dend = medicalInsurance.DateTo, Dstop = medicalInsurance.DateStop }; var repr = st.Representative; if (repr != null) { przBuff.Fiopr = string.Format("{0} {1} {2}", repr.FirstName, repr.LastName, repr.MiddleName).Crop(60); przBuff.Contact = repr.HomePhone; przBuff.Zphone = repr.WorkPhone; przBuff.Zt = repr.RelationType.Id - 317; przBuff.Zfam = repr.LastName; przBuff.Zim = repr.FirstName; przBuff.Zot = repr.MiddleName; if (repr.Document != null && repr.Document.DocumentType != null) { var doc = repr.Document; przBuff.Zdoctp = doc.DocumentType.Code; przBuff.Zdocs = doc.Series; przBuff.Zdocn = doc.Number; przBuff.Zdocdt = doc.DateIssue; przBuff.Zdocorg = doc.IssuingAuthority; przBuff.Zdr = doc.DateExp; } } if (address.IsHomeless.HasValue && address.IsHomeless.Value) { przBuff.Bomj = address.IsHomeless; przBuff.Subj = smo.Parent.Okato.Substring(0, Math.Min(2, smo.Parent.Okato.Length)) + "000"; przBuff.Psubj = smo.Parent.Okato.Substring(0, Math.Min(2, smo.Parent.Okato.Length)) + "000"; } if (st.PreviousStatement != null) { if (st.PreviousStatement.InsuredPersonData != null) { var oldpersonData = st.PreviousStatement.InsuredPersonData; przBuff.Oldfam = oldpersonData.LastName; przBuff.Oldim = oldpersonData.FirstName; przBuff.Oldot = oldpersonData.MiddleName; przBuff.Oldw = int.Parse(oldpersonData.Gender.Code); przBuff.Olddr = oldpersonData.Birthday; przBuff.Oldmr = oldpersonData.Birthplace; przBuff.Oldss = !string.IsNullOrEmpty(oldpersonData.Snils) ? SnilsChecker.SsToLong(oldpersonData.Snils) : null; } // Документ УДЛ if (st.PreviousStatement.DocumentUdl != null) { var olddoc = st.PreviousStatement.DocumentUdl; przBuff.Olddoctp = olddoc.DocumentType.Code; przBuff.Olddocs = olddoc.Series; przBuff.Olddocn = olddoc.Number; przBuff.Olddocdt = olddoc.DateIssue; przBuff.Olddocend = olddoc.DateExp; przBuff.Olddocorg = olddoc.IssuingAuthority; } // Документ УДЛ if (st.PreviousStatement.ResidencyDocument != null && st.PreviousStatement.ResidencyDocument.DocumentType != null) { var olddoc = st.PreviousStatement.ResidencyDocument; przBuff.Oldrdoctp = olddoc.DocumentType.Code; przBuff.Oldrdocs = olddoc.Series; przBuff.Oldrdocn = olddoc.Number; przBuff.Oldrdocdt = olddoc.DateIssue; przBuff.Oldrdocend = olddoc.DateExp; przBuff.Oldrdocorg = olddoc.IssuingAuthority; } } if (przBuff.Dend == new DateTime(2200, 1, 1)) { przBuff.Dend = null; } if (przBuff.Dstop == new DateTime(2200, 1, 1)) { przBuff.Dstop = null; } if (st.FormManufacturing != null) { przBuff.Polvid = GetPolisVid(st.FormManufacturing.Id); } if (documentResidency != null && documentResidency.DocumentType != null) { // Документ на право проживания в РФ przBuff.Rdoctp = documentResidency.DocumentType.Code; przBuff.Rdocs = documentResidency.Series; przBuff.Rdocn = documentResidency.Number; przBuff.Rdocdt = documentResidency.DateIssue; przBuff.Rdocorg = documentResidency.IssuingAuthority; przBuff.Rdocend = documentResidency.DateExp; } // Помечаем заявление созданные через нашу систему // Будет использовать впоследствии при импорте из СРЗ przBuff.Num = "-1"; // Помечаем адреса структурированный/не структурированный var args = address.IsNotStructureAddress.HasValue ? Convert.ToInt16(address.IsNotStructureAddress.Value) .ToString(CultureInfo.InvariantCulture) : "0"; var s = address2.IsNotStructureAddress.HasValue ? Convert.ToInt16(address2.IsNotStructureAddress.Value) .ToString(CultureInfo.InvariantCulture) : "0"; przBuff.Zaddr = string.Format("{0}{1}", args, s); sessionAtl.Save(przBuff); log.Reccount++; logger.Trace(przBuff); return(przBuff); }
/// <summary> /// The export by query. /// </summary> /// <param name="session"> /// The session. /// </param> /// <param name="sessionAtl"> /// The session atl. /// </param> /// <param name="log"> /// The log. /// </param> /// <param name="query"> /// The query. /// </param> /// <param name="context"> /// The context. /// </param> private void ExportByList( ISession session, ISession sessionAtl, Przlog log, IList <StatementMaximum> query, IJobExecutionContext context) { if (query.Count == 0) { return; } context.JobDetail.JobDataMap["progress"] = 0; var i = 0; var count = query.Count; // Экспортируем все заявления foreach (var st in query) { ExportStatement(st, log, sessionAtl, session); context.JobDetail.JobDataMap["progress"] = (int)(++i / (double)count * 40); } log.Dtout = DateTime.Now; sessionAtl.Save(log); sessionAtl.Flush(); // Запуск процедуры загрузки в СРЗ StartLoadBuff(sessionAtl, log.Id); context.JobDetail.JobDataMap["progress"] = 60; // Проходим еще раз с целью выявления не загрузившихся var errorsManager = ObjectFactory.GetInstance <IErrorManager>(); var errors = sessionAtl.QueryOver <Testproc>().List(); i = 0; foreach (var st in query) { var isError = false; errorsManager.Delete(x => x.Statement.Id == st.Id); Przbuf przBuff = null; Przbuf przBuffPolis = null; // Проверяем операцию с выдачей ВС if (st.PrzBuff != null) { przBuff = st.PrzBuff as Przbuf; sessionAtl.Refresh(przBuff); if (przBuff != null) { if (przBuff.St == 2 && !string.IsNullOrEmpty(przBuff.Sflk)) { isError = true; SetErrorsStatement(session, st, przBuff, errors); st.IsExportTemp = false; sessionAtl.Delete(przBuff); continue; } // Создаем ссвязку в базе данных СРЗ sessionAtl.Save(new ExchangePvp { PrzBuff = przBuff, StatementId = st.Id.ToString("D"), }); } } // Проверяем операцию с выдачей полиса if (st.PrzBuffPolis != null) { przBuffPolis = st.PrzBuffPolis as Przbuf; sessionAtl.Refresh(przBuffPolis); if (przBuffPolis != null) { if (przBuffPolis.St == 2 && !string.IsNullOrEmpty(przBuffPolis.Sflk)) { isError = true; SetErrorsStatement(session, st, przBuffPolis, errors); st.IsExportPolis = false; sessionAtl.Delete(przBuffPolis); } else { sessionAtl.Save(new ExchangePvp { PrzBuff = przBuffPolis, StatementId = st.Id.ToString("D"), }); } } } // Заполняем ссылки на People and Polis var buf = przBuff ?? przBuffPolis; if (buf != null) { st.PidId = buf.Pid; st.PolisId = buf.Polisid; } // Сохраняем статус заявления if (isError) { st.Status = ObjectFactory.GetInstance <IConceptCacheManager>().GetById(StatusStatement.Declined); } session.Save(st); context.JobDetail.JobDataMap["progress"] = 60 + (int)(++i / (double)count * 40); } }