Example #1
0
        /// <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 });
            }
        }