protected IBulbCacheReadObject ProlongOrChangeStatus(BulbSignal signal, Guid statusDataId) { var request = new AccountCacheRequest() { AccountId = signal.AccountId, ObjectId = statusDataId }; IBulbCacheReadObject rBulb = null; using (var wStatusData = AllCaches.StatusDatas.Write(request)) { rBulb = wStatusData; // если сигнал протух, то игнорируем его if (signal.ActualDate < wStatusData.EndDate) { return(rBulb); } // вставим пробел var startTime = GetStartDate(wStatusData, signal); if (wStatusData.ActualDate < startTime) { var noSignal = BulbSignal.CreateNoSignal(signal.AccountId, wStatusData.ActualDate, signal.NoSignalImportance); ChangeStatus(noSignal, wStatusData); } // теперь лампочка актуальная, обработаем сигнал if (wStatusData.Status == signal.Status && wStatusData.HasSignal == signal.HasSignal) { // продлим ProlongStatus(signal, wStatusData); } else { // изменим ChangeStatus(signal, wStatusData); } // запомним к какому статусу привело событие // сервис юнит-тестов сам обновит LastStatusId (в целях оптимизации) // if (wStatusData.EventCategory != EventCategory.UnitTestStatus) { UpdateLastStatusId(signal.AccountId, signal.EventId, wStatusData); } wStatusData.BeginSave(); } return(rBulb); }
public IBulbCacheReadObject GetActual( Guid accountId, Guid statusId, DateTime processDate, EventImportance noSignalImportance) { var request = new AccountCacheRequest() { AccountId = accountId, ObjectId = statusId }; var data = AllCaches.StatusDatas.Find(request); // статус актуальный if (data.Actual(processDate)) { return(data); } // статус протух IBulbCacheReadObject rStatus = null; using (var rStatus2 = AllCaches.StatusDatas.Write(request)) { rStatus = rStatus2; if (rStatus.Actual(processDate)) { return(rStatus); } var signal = BulbSignal.CreateNoSignal(accountId, data.ActualDate, noSignalImportance); //var signal = new BulbSignal() //{ // AccountId = accountId, // IsSpace = true, // ActualDate = EventHelper.InfiniteActualDate, // ProcessDate = processDate, // StartDate = data.ActualDate, // data.ActualDate всегда меньше processDate // Status = noSignalStatus, // Message = "Нет данных", // NoSignalImportance = noSignalImportance //}; ProlongOrChangeStatus(signal, statusId); } UpdateParentByChild(rStatus); return(rStatus); }