Untitled
unknown
csharp
3 years ago
4.6 kB
1
Indexable
using (var transaction = _clientServerDbContext.Database.BeginTransaction()) { try { // снимаем блокировку заданного типа var resUnblock = DogovorServiceDao.CancelDogovorBlock(demand.DogovorId, demand.DemandBlockingType, demand.Id).GetAwaiter().GetResult(); if (!resUnblock.IsSuccessfully) { return resUnblock; } // Актуализируем статус договора. var blokedDogovorList = DogovorServiceDao.GetBlockListForDogovor(demand.DogovorId); if (!blokedDogovorList.Any(x => x.IsActive)) { // получаем историю изменений из триггера var histDogovorList = DogovorServiceDao.GetHistOnDogovor(demand.DogovorId); // на всякий случай, если не было истории по договору (или был перенос из старых договоров) var previousDogovorStatus = DogovorStatus.Working; if (histDogovorList.Count > 0) { // перебираем историю начиная с последнего события foreach (var histItem in histDogovorList.OrderByDescending(x => x.HistData.DateEvent)) { // находим первую запись в которой статус договора был не блокирован if (!histItem.Status.In(DogovorStatus.Blocked, DogovorStatus.BlockedNotActiveDogovor, DogovorStatus.PartiallyBlocked)) { previousDogovorStatus = histItem.Status; break; } } } result = CommonDogovor.ChangeDogovorStatus(demand.DogovorId, previousDogovorStatus); if (!result.IsSuccessfully) { return result; } var dogoovorServiceList = dogovorInfo.DogovorServices; // TODO: возможно это стоит делать на событие изменения статуса договора var serviceAccptiList = dogoovorServiceList.Where( x => x.ServiceType.In( DogovorServiceType.RckAcceptance, DogovorServiceType.RckView, DogovorServiceType.DU, DogovorServiceType.DuAcceptanceParticipant, DogovorServiceType.NPF, DogovorServiceType.NpfAcceptanceParticipant, DogovorServiceType.Others, DogovorServiceType.OthersAcceptanceParticipant, DogovorServiceType.OtherMonitoring, DogovorServiceType.OtherMonitoringParticipant ) && x.State == DogovorServiceStatus.Blocked).ToList(); // разблокируем части акцептантов if (serviceAccptiList.Count > 0) { foreach (var serviceItem in serviceAccptiList) { var srv = CommonServiceFactory.GetService(serviceItem.ServiceType); var resultChangeStatus = srv.ChangeServiceStatus(serviceItem.Id, DogovorServiceStatus.Enabled); if (!resultChangeStatus.IsSuccessfully) { return resultChangeStatus; } } } } else { if (dogovorInfo.Status != DogovorStatus.BlockedNotActiveDogovor) { if (blokedDogovorList.Where(x => x.IsActive).All(x => x.BlockType == BlockType.PodFf || x.BlockType == BlockType.DTBIPR)) { result = CommonDogovor.ChangeDogovorStatus(demand.DogovorId, DogovorStatus.PartiallyBlocked); } else { result = CommonDogovor.ChangeDogovorStatus(demand.DogovorId, DogovorStatus.Blocked); } } } transaction.Commit(); // пишем в события договора что с него снята блокировка заданного типа EventServiceDao.WriteObjectEvent(demand.DogovorId, ObjectType.Agreement, string.Format("С договора снята блокировка \"{0}\"", demand.DemandBlockingType.ToName()), EventState.Normal, demand.Id, ObjectType.Demand); result.Result = 1; } catch (Exception) { transaction.Rollback(); DBLogger.Instance.Error(string.Format("Ошибка при разблокировке договора. Откат до предыдущего состояния. Заявка: {0}", demand.Id)); //удаление уже созданной заявки DemandServiceDao.ChangeStatus(demand.Id, DemandStatus.Removed).GetAwaiter().GetResult(); throw; }
Editor is loading...