/// <summary> /// DT_SMART_ANALYSIS_RESULTテーブルからDtSmartAnalysisResultを取得する /// </summary> /// <param name="diskDrive">ディスクドライブ</param> /// <returns>取得したデータ</returns> public DtSmartAnalysisResult ReadDtSmartAnalysisResult(DiskDrive diskDrive) { DtSmartAnalysisResult model = null; try { _logger.EnterJson("{0}", diskDrive); DBAccessor.Models.DtSmartAnalysisResult entity = null; _dbPolly.Execute(() => { using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { entity = db.DtSmartAnalysisResult.FirstOrDefault(x => x.EquipmentUid == diskDrive.SourceEquipmentUid && x.DiskSerialNumber == diskDrive.SerialNo); } }); if (entity != null) { model = entity.ToModel(); } return(model); } catch (Exception e) { throw new RmsException("DT_SMART_ANALYSIS_RESULTテーブルのSelectに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// 引数に指定したDtSmartAnalysisResultでDT_SMART_ANALYSIS_RESULTテーブルを更新する /// </summary> /// <param name="inData">更新するデータ</param> /// <returns>更新したデータ</returns> public DtSmartAnalysisResult UpdateDtSmartAnalysisResult(DtSmartAnalysisResult inData) { DtSmartAnalysisResult model = null; try { _logger.EnterJson("{0}", inData); DBAccessor.Models.DtSmartAnalysisResult entity = new DBAccessor.Models.DtSmartAnalysisResult(inData); // バリデーション Validator.ValidateObject(entity, new ValidationContext(entity, null, null)); _dbPolly.Execute(() => { entity.UpdateDatetime = _timePrivder.UtcNow; using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { db.DtSmartAnalysisResult.Attach(entity); // 全フィールドを更新する // 特定フィールドだけUpdateする場合は下記のように記述してください // db.Entry(entity).Property(x => x.UpdateDatetime).IsModified = true; db.Entry(entity).State = Microsoft.EntityFrameworkCore.EntityState.Modified; if (db.SaveChanges() > 0) { model = entity.ToModel(); } } }); return(model); } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_SMART_ANALYSIS_RESULTテーブルのUpdateに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// 引数に指定したDtSmartAnalysisResultをDT_SMART_ANALYSIS_RESULTテーブルへ登録する /// </summary> /// <param name="inData">登録するデータ</param> /// <returns>処理結果</returns> public DtSmartAnalysisResult CreateDtSmartAnalysisResult(DtSmartAnalysisResult inData) { DtSmartAnalysisResult model = null; try { _logger.EnterJson("{0}", inData); DBAccessor.Models.DtSmartAnalysisResult entity = new DBAccessor.Models.DtSmartAnalysisResult(inData); // バリデーション Validator.ValidateObject(entity, new ValidationContext(entity, null, null)); _dbPolly.Execute(() => { entity.CreateDatetime = _timePrivder.UtcNow; entity.UpdateDatetime = _timePrivder.UtcNow; using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { var dbdata = db.DtSmartAnalysisResult.Add(entity).Entity; db.SaveChanges(); model = dbdata.ToModel(); } }); return(model); } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_SMART_ANALYSIS_RESULTテーブルへのInsertに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// 登録済みのSMART解析結果判定テーブルを取得する /// </summary> /// <param name="diskDrive">ディスクドライブ</param> /// <param name="messageId">メッセージID</param> /// <param name="model">DBから取得したパラメータ</param> /// <returns>成功した場合true、失敗した場合falseを返す</returns> public bool ReadSmartAnalysisResult(DiskDrive diskDrive, string messageId, out DtSmartAnalysisResult model) { model = null; try { _logger.EnterJson("{0}", new { diskDrive, messageId }); // SMART解析判定結果を取得 model = _dtSmartAnalysisResultRepository.ReadDtSmartAnalysisResult(diskDrive); return(true); } catch (RmsException e) { // DBにアクセスできない(基本設計書 5.1.2.4 エラー処理) _logger.Error(e, nameof(Resources.UT_DDP_DDP_004), 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 }); } }