/// <summary> /// UtilityモデルをレスポンスDTOに変換する /// </summary> /// <param name="utilParam">Utilityパラメータ</param> /// <returns>Dtoクラスパラメータ</returns> public static InstallResultHistoryResponseDto ConvertUtilityToResponseDto(this DtInstallResult utilParam) { return(utilParam == null ? null : new InstallResultHistoryResponseDto() { Sid = utilParam.Sid, DeviceSid = utilParam.DeviceSid, DeliveryResultSid = utilParam.DeliveryResultSid, InstallResultStatusSid = utilParam.InstallResultStatusSid, SourceEquipmentUid = utilParam.SourceEquipmentUid, ReleaseVersion = utilParam.ReleaseVersion, BeforeVersion = utilParam.BeforeVersion, AfterVervion = utilParam.AfterVervion, IsSuccess = utilParam.IsSuccess, ErrorCode = utilParam.ErrorCode, ErrorDescription = utilParam.ErrorDescription, IsAuto = utilParam.IsAuto, Method = utilParam.Method, Process = utilParam.Process, UpdateStratDatetime = utilParam.UpdateStratDatetime, UpdateEndDatetime = utilParam.UpdateEndDatetime, ComputerName = utilParam.ComputerName, IpAddress = utilParam.IpAddress, ServerClientKind = utilParam.ServerClientKind, HasRepairReport = utilParam.HasRepairReport, EventDatetime = utilParam.EventDatetime, CollectDatetime = utilParam.CollectDatetime, MessageId = utilParam.MessageId, CreateDatetime = utilParam.CreateDatetime, }); }
/// <summary> /// 引数に指定したDtInstallResultをDT_INSTALL_RESULTテーブルへ登録する /// </summary> /// <param name="inData">登録するデータ</param> /// <param name="state">状態。適用結果ステータスマスタテーブルのコード値が入る。</param> /// <returns>追加したデータ。配信グループデータテーブルの更新に失敗した場合はnullを返す。</returns> /// <remarks> /// すべての処理に成功した場合には適用結果データテーブルに登録したデータを返す。 /// 配信グループデータテーブルの更新に失敗した場合はnullを返す。 /// 適用結果データテーブルへの登録に失敗した場合には、例外を投げる。 /// </remarks> public DtInstallResult CreateDtInstallResultIfAlreadyMessageThrowEx(DtInstallResult inData, string state) { DtInstallResult model = null; try { _logger.EnterJson("{0}", inData); // グループステータス更新失敗フラグ bool failedToUpdateGroupStatus = false; DBAccessor.Models.DtDeliveryGroup deliveryGroupEntity = new DBAccessor.Models.DtDeliveryGroup { DeliveryGroupStatusSid = 0 }; _dbPolly.Execute(() => { // メッセージIDがなければ追加 using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { // マスタテーブルから適用結果ステータスSIDを取得 var installResultStatus = db.MtInstallResultStatus.FirstOrDefault(x => x.Code == state); if (installResultStatus == null || installResultStatus.Sid == 0) { throw new RmsException(string.Format("状態[{0}]がマスタテーブルに存在しません。", state)); } var addedAlready = db.DtInstallResult.FirstOrDefault(x => x.MessageId == inData.MessageId); if (addedAlready != null) { throw new RmsAlreadyExistException(string.Format("MessageId [{0}] はすでに追加済みです。", inData.MessageId)); } // 適用結果データテーブルの更新処理 DBAccessor.Models.DtInstallResult dbdata; { // 適用結果ステータスSIDを設定 inData.InstallResultStatusSid = installResultStatus.Sid; DBAccessor.Models.DtInstallResult entity = new DBAccessor.Models.DtInstallResult(inData); // メッセージを適用結果データテーブルに保存 // 適用結果データテーブルの更新は、配信グループデータテーブル更新の成功/失敗に依存しない仕様のため、先にDB保存処理を呼ぶ dbdata = db.DtInstallResult.Add(entity).Entity; db.SaveChanges(_timePrivder); } // 配信グループデータテーブルの更新処理 { // 適用結果ステータスマスタテーブルから"completed"に該当するSIDを取得する long completedStatusSid = db.MtDeliveryGroupStatus.FirstOrDefault(x => x.Code == Const.DeliveryGroupStatus.Completed).Sid; // 更新された配信グループデータテーブルのレコード数 int affectedRows = 0; // 適用結果データテーブルの配信結果SIDから配信結果データテーブルのレコードを抽出 var deliveryResult = db.DtDeliveryResult.FirstOrDefault(x => x.Sid == inData.DeliveryResultSid); if (deliveryResult != null) { // メッセージが所属する配信グループのSID long targetDeliveryGroupSid = deliveryResult.DeliveryGroupSid; // SQL文を発行する var sqlParamForSid = new SqlParameter(SqlKeyForSid, targetDeliveryGroupSid); var sqlParamForGroupStatusSid = new SqlParameter(SqlKeyForGroupStatusSid, completedStatusSid); var sqlParams = new[] { sqlParamForGroupStatusSid, sqlParamForSid }; try { affectedRows = db.Database.ExecuteSqlCommand(SqlCommandToUpdateDeliveryGroupStatus, sqlParams); if (affectedRows <= 0) { _logger.Debug(string.Format("メッセージ[{0}]が所属する配信グループIDのステータスに変更はありませんでした。", inData.MessageId)); } } catch (Exception) { // 配信グループデータ更新失敗フラグを立てる failedToUpdateGroupStatus = true; _logger.Debug(string.Format("メッセージ[{0}]が所属する配信グループIDのステータス更新に失敗しました。", inData.MessageId)); } } else { // 配信結果はメッセージの定義上null許可のため、配信結果が存在しないケースがある _logger.Debug(string.Format("メッセージ[{0}]が所属する配信グループIDがnullであるため配信グループデータテーブルは更新しませんでした。", inData.MessageId)); } db.SaveChanges(_timePrivder); } model = dbdata.ToModel(); } }); if (failedToUpdateGroupStatus) { // 配信グループデータ更新失敗時にはnullを返す return(null); } return(model); } catch (RmsAlreadyExistException) { // メッセージ追加済みエラー throw; } catch (RmsException) { throw; } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_INSTALL_RESULTテーブルへのInsertまたはDT_DELIVERY_GROUPのUpdateに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }
/// <summary> /// 配信結果ステータスを更新する /// </summary> /// <param name="gatewaySid">最上位(ゲートウェイ)機器SID</param> /// <param name="statusCode">ステータス</param> /// <returns>結果</returns> /// <remarks>ステータスはUtility.Consts.InstallResultStatusに定義されている</remarks> private DtInstallResult UpdateInstallResultStatus(long gatewaySid, string statusCode) { DtInstallResult model = null; try { _logger.EnterJson("{0}", new { gatewaySid, statusCode }); _dbPolly.Execute(() => { using (DBAccessor.Models.RmsDbContext db = new DBAccessor.Models.RmsDbContext(_appSettings)) { DBAccessor.Models.DtInstallResult entity = null; // 更新対象レコードを取得する entity = db.DtInstallResult.Where(x => /*x.IsLatest &&*/ x.DeliveryResultS.GwDeviceSid == gatewaySid).FirstOrDefault(); if (entity == null || entity.Sid == 0) { // 対象レコードなしエラー throw new RmsException("更新対象となる適用結果データレコードが見つかりませんでした。"); } // 「送信済」の適用結果ステータスSIDを取得する var status = db.MtInstallResultStatus.Where(x => x.Code.Equals(statusCode)).FirstOrDefault(); if (status == null || status.Sid == 0) { // 対象レコードなしエラー throw new RmsException("指定したステータスコードが.MT_INSTALL_RESULT_STATUSテーブルに存在しませんでした。"); } // ステータスSIDを更新 entity.InstallResultStatusSid = status.Sid; // DB更新処理 db.DtInstallResult.Attach(entity); db.Entry(entity).Property(x => x.InstallResultStatusSid).IsModified = true; if (db.SaveChanges() > 0) { model = entity.ToModel(); } db.SaveChanges(_timePrivder); model = entity.ToModel(); } }); return(model); } catch (ValidationException e) { throw new RmsParameterException(e.ValidationResult.ErrorMessage, e); } catch (Exception e) { throw new RmsException("DT_INSTALL_RESULTテーブルへのInsertに失敗しました。", e); } finally { _logger.LeaveJson("{0}", model); } }