Esempio n. 1
0
        /// <summary>
        /// 受信メッセージからID=C5のSMART属性情報を取得する
        /// </summary>
        /// <param name="diskDrive">ディスクドライブ</param>
        /// <param name="messageId">メッセージID</param>
        /// <param name="smartAttirubteInfoC5">SMART属性情報C5</param>
        /// <returns>成功した場合true、失敗した場合falseを返す</returns>
        public bool ReadSmartAttirubteInfoC5(DiskDrive diskDrive, string messageId, out DiskDrive.SmartAttributeInfoSchema smartAttirubteInfoC5)
        {
            smartAttirubteInfoC5 = null;

            try
            {
                _logger.EnterJson("{0}", new { diskDrive, messageId });

                // ID=C5のSMART属性情報を取得
                var smartAttributeInfos = diskDrive.SmartAttributeInfo?.Where(x => x.Id == SmartAttributeInfoIdC5);

                // SMART属性情報が存在しない場合は正常
                if (smartAttributeInfos == null || smartAttributeInfos.Count() == 0)
                {
                    return(true);
                }

                // SMART属性情報が複数存在する場合はエラー
                if (smartAttributeInfos.Count() > 1)
                {
                    throw new RmsException("SMART属性情報が複数存在しています(ID=C5)");
                }

                smartAttirubteInfoC5 = smartAttributeInfos.First();

                // SMART属性情報のC5生の値が存在しない場合はエラー
                if (string.IsNullOrEmpty(smartAttirubteInfoC5.RawData))
                {
                    throw new RmsException("SMART属性情報の生の値がnullまたは空文字です(ID=C5)");
                }

                return(true);
            }
            catch (RmsException e)
            {
                // SMART属性情報異常
                _logger.Error(e, nameof(Resources.UT_DDP_DDP_002), new object[] { messageId, e.Message });
                return(false);
            }
            finally
            {
                _logger.LeaveJson("{0}", new { smartAttirubteInfoC5 });
            }
        }
Esempio n. 2
0
        /// <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();
            }
        }
Esempio n. 3
0
        /// <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 });
            }
        }