Untitled

 avatar
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;
                }