/// <summary> /// DT_ALARM_SMART_PREMONITORテーブルからDtAlarmSmartPremonitorを取得する /// </summary> /// <param name="smartAttributeInfoId">取得するデータのSMART項目ID</param> /// <returns>取得したデータ</returns> public DtAlarmSmartPremonitor ReadDtAlarmSmartPremonitor(string smartAttributeInfoId) { DtAlarmSmartPremonitor model = null; try { _logger.EnterJson("{0}", new { smartAttributeInfoId }); DBAccessor.Models.DtAlarmSmartPremonitor entity = null; _dbPolly.Execute(() => { using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { // 取得できるアラーム定義は1つのみという前提 entity = db.DtAlarmSmartPremonitor.FirstOrDefault(x => x.SmartId == smartAttributeInfoId); } }); if (entity != null) { model = entity.ToModel(); } return(model); } catch (Exception e) { throw new RmsException("DT_ALARM_SMART_PREMONITORテーブルのSelectに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// アラーム定義を取得する /// </summary> /// <param name="messageId">メッセージID</param> /// <param name="model">DBから取得したパラメータ</param> /// <returns>成功した場合true、失敗した場合falseを返す</returns> public bool ReadAlarmDefinition(string messageId, out DtAlarmSmartPremonitor model) { model = null; try { _logger.EnterJson("{0}", new { messageId }); // ディスクドライブ予兆監視アラーム定義を取得 model = _dtAlarmSmartPremonitorRepository.ReadDtAlarmSmartPremonitor(SmartAttributeInfoIdC5); return(true); } catch (RmsException e) { // DBにアクセスできない(基本設計書 5.1.2.4 エラー処理) _logger.Error(e, nameof(Resources.UT_DDP_DDP_003), new object[] { messageId }); return(false); } finally { _logger.LeaveJson("{0}", new { model }); } }
/// <summary> /// アラーム情報を作成しQueueStorageへ登録する /// </summary> /// <param name="diskDrive">ディスクドライブ</param> /// <param name="smartAttirubteInfoC5">SMART属性情報(C5)</param> /// <param name="messageId">メッセージID</param> /// <param name="analysisResult">解析判定結果</param> /// <param name="alarmDef">アラーム定義</param> /// <returns>成功した場合true、失敗した場合falseを返す</returns> public bool CreateAndEnqueueAlarmInfo(DiskDrive diskDrive, DiskDrive.SmartAttributeInfoSchema smartAttirubteInfoC5, string messageId, DtSmartAnalysisResult analysisResult, DtAlarmSmartPremonitor alarmDef) { _logger.EnterJson("{0}", new { diskDrive, smartAttirubteInfoC5, messageId, analysisResult, alarmDef }); string message = null; try { // アラームキューを生成する var alarmInfo = new AlarmInfo { SourceEquipmentUid = diskDrive.SourceEquipmentUid, TypeCode = string.Empty, ErrorCode = alarmDef.AnalysisResultErrorCode, AlarmLevel = alarmDef.AlarmLevel, AlarmTitle = alarmDef.AlarmTitle, AlarmDescription = string.Format(alarmDef.AlarmDescription, analysisResult.DiskSerialNumber, analysisResult.C5ChangesThreshholdOverCount, analysisResult.C5ChangesThreshholdLastDatetime?.ToString(Utility.Const.AlarmQueueDateTimeFormat)), AlarmDatetime = _timeProvider.UtcNow.ToString(Utility.Const.AlarmQueueDateTimeFormat), EventDatetime = diskDrive.CollectDt, AlarmDefId = $"{_settings.SystemName}_{_settings.SubSystemName}_{alarmDef.Sid.ToString()}", MessageId = messageId }; message = JsonConvert.SerializeObject(alarmInfo); // キューを登録する _queueRepository.SendMessageToAlarmQueue(message); return(true); } catch (Exception e) { // アラーム生成エラー or アラームキューにアラーム情報を送信できない(基本設計書 5.1.2.4 エラー処理) _logger.Error(e, string.IsNullOrEmpty(message) ? nameof(Resources.UT_DDP_DDP_007) : nameof(Resources.UT_DDP_DDP_008), new object[] { messageId }); return(false); } finally { _logger.Leave(); } }
/// <summary> /// アラーム判定を実行しSMART解析判定結果を更新する /// </summary> /// <param name="diskDrive">ディスクドライブ</param> /// <param name="messageId">メッセージID</param> /// <param name="analysisResult">解析判定結果</param> /// <param name="alarmDef">アラーム定義</param> /// <param name="smartAttirubteInfoC5">SMART属性情報C5</param> /// <param name="needsAlarmCreation">アラーム生成要・不要フラグ</param> /// <returns>成功した場合true、失敗した場合falseを返す</returns> public bool JudgeAlarmCreationAndUpdateSmartAnalysisResult(DiskDrive diskDrive, string messageId, DtSmartAnalysisResult analysisResult, DtAlarmSmartPremonitor alarmDef, DiskDrive.SmartAttributeInfoSchema smartAttirubteInfoC5, out bool needsAlarmCreation) { needsAlarmCreation = false; try { _logger.EnterJson("{0}", new { diskDrive, smartAttirubteInfoC5, messageId, analysisResult, alarmDef }); if (alarmDef == null || smartAttirubteInfoC5 == null) { // アラーム生成、解析結果更新不要 return(true); } if (analysisResult == null) { // 解析結果がまだ登録されていない場合はアラーム判定を行わずに登録する // TODO: ER図の変位回数閾値(ChangeCountThreshold)が整数値に修正されるので後で修正する var c5RawData = ConvertRawDataStringToLong(smartAttirubteInfoC5.RawData); var registAnalysisResult = new DtSmartAnalysisResult { EquipmentUid = diskDrive.SourceEquipmentUid, DiskSerialNumber = diskDrive.SerialNo, C5RawData = c5RawData, C5RawDataChanges = 0, C5ChangesThreshhold = short.Parse(alarmDef.ChangeCountThreshold), C5ChangesThreshholdOverCount = 0, C5ChangesThreshholdLastDatetime = null }; _dtSmartAnalysisResultRepository.CreateDtSmartAnalysisResult(registAnalysisResult); } else { var c5RawData = ConvertRawDataStringToLong(smartAttirubteInfoC5.RawData); var c5RawDataDiff = c5RawData - analysisResult.C5RawData; if (c5RawDataDiff > 0) { analysisResult.C5RawData = c5RawData; analysisResult.C5RawDataChanges++; // TODO: ER図の変位回数閾値(ChangeCountThreshold)が整数値に修正されるので後で修正する if (short.Parse(alarmDef.ChangeCountThreshold) <= analysisResult.C5RawDataChanges) { analysisResult.C5ChangesThreshholdOverCount++; analysisResult.C5ChangesThreshholdLastDatetime = DateTime.Parse(diskDrive.CollectDt, null, System.Globalization.DateTimeStyles.RoundtripKind); needsAlarmCreation = true; } } else if (c5RawDataDiff < 0) { analysisResult.C5RawData = c5RawData; } // C5生の値の差分が0の場合も日時の更新は必要 _dtSmartAnalysisResultRepository.UpdateDtSmartAnalysisResult(analysisResult); } return(true); } catch (RmsException e) { // DBにアクセスできない(基本設計書 5.1.2.4 エラー処理) _logger.Error(e, nameof(Resources.UT_DDP_DDP_005), new object[] { messageId }); return(false); } finally { _logger.LeaveJson("{0}", new { needsAlarmCreation }); } }