using System.Collections.Generic; using System.Text.RegularExpressions; namespace EdiApiGateway.Services; /// /// ACMS/WS APIのエラーメッセージをユーザーフレンドリーな日本語メッセージにマッピング /// public static class AcmsErrorMessageMapper { /// /// 通信サービス(COM)のエラーメッセージマッピング /// ソース: ACMS/WS ユーザーズガイド 第5章 /// private static readonly Dictionary ErrorMessages = new() { // COM001-010: システム・接続エラー { "COM001", new ErrorInfo("システムエラーが発生しました", "予期せぬシステムエラーが発生しました。システムを調査してください。") }, { "COM002", new ErrorInfo("TCP/IP接続エラーが発生しました", "TCP/IPで接続エラーが発生しました。IPアドレスとポート番号、ネットワークの状態を確認してください。") }, { "COM003", new ErrorInfo("TLS接続エラーが発生しました", "TLS接続で接続エラーが発生しました。TLS設定情報の設定内容を確認してください。") }, { "COM004", new ErrorInfo("不正なパラメータエラーで起動されました", "不正なパラメータエラーで起動されました。要求したプログラムを調べてください。") }, { "COM005", new ErrorInfo("ファイルアクセスエラーが発生しました", "ファイルアクセスエラーが発生しました。要求したプログラムを調べてください。") }, { "COM006", new ErrorInfo("固定長ファイルのサイズが間違っています", "固定長ファイルのサイズが間違っています。固定長の設定でファイルのサイズを確認してください。") }, // COM007-018: 電文送信エラー { "COM007", new ErrorInfo("開局要求電文が送信できませんでした", "開局要求電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM008", new ErrorInfo("開局回答電文が送信できませんでした", "開局回答電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM009", new ErrorInfo("モード変更要求電文が送信できませんでした", "モード変更要求電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM010", new ErrorInfo("モード変更回答電文が送信できませんでした", "モード変更回答電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM011", new ErrorInfo("閉局要求電文が送信できませんでした", "閉局要求電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM012", new ErrorInfo("閉局回答電文が送信できませんでした", "閉局回答電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM013", new ErrorInfo("開始要求電文が送信できませんでした", "開始要求電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM014", new ErrorInfo("開始回答電文が送信できませんでした", "開始回答電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM015", new ErrorInfo("再送要求電文が送信できませんでした", "再送要求電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM016", new ErrorInfo("終了要求電文が送信できませんでした", "終了要求電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM017", new ErrorInfo("終了回答電文が送信できませんでした", "終了回答電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, { "COM018", new ErrorInfo("データ電文が送信できませんでした", "データ電文が送信できませんでした。回線が切られた可能性があります。再度、通信してください。") }, // COM019-045: 回答電文エラー { "COM019", new ErrorInfo("開局回答電文に電文区分エラーが設定されていました", "相手側の状態を調べて、再度、通信してください。") }, { "COM020", new ErrorInfo("開局回答電文に相手センタ確認コードエラーが設定されていました", "相手側の状態を調べて、再度、通信してください。") }, { "COM021", new ErrorInfo("開局回答電文に当方センタ確認コードエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM022", new ErrorInfo("開局回答電文にサービス時間帯エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM023", new ErrorInfo("開局回答電文に全銀パスワードエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM024", new ErrorInfo("開局回答電文にアプリケーションIDエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM025", new ErrorInfo("開局回答電文にモードエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM026", new ErrorInfo("開局回答電文にその他エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM027", new ErrorInfo("モード変更回答電文に電文区分エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM028", new ErrorInfo("モード変更回答電文にモード変更不可が設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM029", new ErrorInfo("モード変更回答電文にその他エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM030", new ErrorInfo("閉局回答電文に電文区分エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM031", new ErrorInfo("閉局回答電文にその他エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM032", new ErrorInfo("開始回答電文に電文区分エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM033", new ErrorInfo("開始回答電文にファイル名エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM034", new ErrorInfo("開始回答電文にファイルアクセスキーエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM035", new ErrorInfo("開始回答電文にレコード長エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM036", new ErrorInfo("開始回答電文に二重ファイル伝送が設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM037", new ErrorInfo("開始回答電文にファイルなしが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM038", new ErrorInfo("開始回答電文にレコードIDエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM039", new ErrorInfo("開始回答電文にデータ圧縮IDエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM040", new ErrorInfo("開始回答電文にその他エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM041", new ErrorInfo("終了回答電文に電文区分エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM042", new ErrorInfo("終了回答電文にファイルアクセスキーエラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM043", new ErrorInfo("終了回答電文にテキスト数エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM044", new ErrorInfo("終了回答電文にレコード数エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, { "COM045", new ErrorInfo("終了回答電文にその他エラーが設定されていました", "相手側の設定を調べて、再度、通信してください。") }, // COM046-062: TTCエラー電文受信 { "COM046", new ErrorInfo("TTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM047", new ErrorInfo("開局要求電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM048", new ErrorInfo("開局回答電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM049", new ErrorInfo("モード変更回答送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM050", new ErrorInfo("モード変更要求および閉局要求電文受信時後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM051", new ErrorInfo("開始回答電文送信後応答(ファイルなし)受信時にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM052", new ErrorInfo("データ電文および終了要求電文送信後応答(ファイルあり)受信時にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM053", new ErrorInfo("再送要求電文送信後応答受信時にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM054", new ErrorInfo("終了回答電文送信後応答受信時にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM055", new ErrorInfo("データ電文受信時にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM056", new ErrorInfo("開局要求電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM057", new ErrorInfo("閉局要求電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM058", new ErrorInfo("モード変更要求送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM059", new ErrorInfo("開始要求電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM060", new ErrorInfo("終了要求電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM061", new ErrorInfo("再送要求電文送信後にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM062", new ErrorInfo("データ電文待ち時にTTCエラー電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, // COM063-079: 回線切断エラー { "COM063", new ErrorInfo("回線切断されました", "電文待ち時に切断されました。相手側の設定を調べて、再度、通信してください。") }, { "COM064", new ErrorInfo("開局要求電文送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM065", new ErrorInfo("開局回答電文送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM066", new ErrorInfo("モード変更回答送信後応答受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM067", new ErrorInfo("モード変更要求および閉局要求電文受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM068", new ErrorInfo("開始回答電文送信後応答(ファイルなし)受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM069", new ErrorInfo("データ電文および終了要求電文送信後応答(ファイルあり)受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM070", new ErrorInfo("再送要求電文送信後応答受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM071", new ErrorInfo("終了回答電文送信後応答受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM072", new ErrorInfo("データ電文受信時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM073", new ErrorInfo("TCP-Z手順エラー", "開局要求電文送信後に回線切断されました。相手側のサーバー状態を確認して、再度、通信してください。") }, { "COM074", new ErrorInfo("閉局要求電文送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM075", new ErrorInfo("モード変更要求送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM076", new ErrorInfo("開始要求電文送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM077", new ErrorInfo("終了要求電文送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM078", new ErrorInfo("再送要求電文送信後に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM079", new ErrorInfo("データ電文待ち時に回線切断されました", "相手側の設定を調べて、再度、通信してください。") }, // COM080-096: 不正ステート・電文エラー { "COM080", new ErrorInfo("不正なステートで開局要求電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM081", new ErrorInfo("不正なステートで開局回答電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM082", new ErrorInfo("不正なステートで閉局要求電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM083", new ErrorInfo("不正なステートで閉局回答電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM084", new ErrorInfo("不正なステートでモード変更要求電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM085", new ErrorInfo("不正なステートでモード変更回答電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM086", new ErrorInfo("不正なステートで開始要求電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM087", new ErrorInfo("不正なステートで開始回答電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM088", new ErrorInfo("不正なステートで再送要求電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM089", new ErrorInfo("不正なステートで終了要求電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM090", new ErrorInfo("不正なステートで終了回答電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM091", new ErrorInfo("不正なステートでデータ電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM092", new ErrorInfo("不正なステートで不正電文を受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM093", new ErrorInfo("データ電文送信時に回線が切断されました", "相手側の設定を調べて、再度、通信してください。") }, { "COM094", new ErrorInfo("電文区分エラーを受信しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM095", new ErrorInfo("テキスト数エラーが発生しました", "相手側の設定を調べて、再度、通信してください。") }, { "COM096", new ErrorInfo("レコード数エラーが発生しました", "相手側の設定を調べて、再度、通信してください。") }, // COM097-135: その他エラー { "COM097", new ErrorInfo("ユーザからキャンセルされました", "通信相手先に状況を確認してください。") }, { "COM098", new ErrorInfo("ユーザからキャンセルされました", "通信相手先に状況を確認してください。") }, { "COM099", new ErrorInfo("データ電文の中に不正な圧縮データがありました", "通信相手先に状況を確認してください。") }, { "COM100", new ErrorInfo("受信ファイルをオープンできませんでした", "受信ファイルの状態を確認してください。") }, { "COM101", new ErrorInfo("受信ファイルにライトができませんでした", "受信ファイルの状態を確認してください。") }, { "COM102", new ErrorInfo("受信ファイルをクローズできませんでした", "受信ファイルの状態を確認してください。") }, { "COM103", new ErrorInfo("送信ファイルをオープンできませんでした", "送信ファイルの状態を確認してください。") }, { "COM104", new ErrorInfo("送信ファイルからリードできませんでした", "送信ファイルの状態を確認してください。") }, { "COM105", new ErrorInfo("送信ファイルをクローズできませんでした", "送信ファイルの状態を確認してください。") }, { "COM106", new ErrorInfo("データが固定長ではありませんでした", "データの属性を確認してください。") }, { "COM107", new ErrorInfo("データ電文が固定長ではありませんでした", "データの属性を確認してください。") }, { "COM108", new ErrorInfo("データ電文長が不正でした", "データの電文長を確認してください。") }, { "COM109", new ErrorInfo("電送エラーが発生しました", "通信相手先に状況を確認してください。") }, { "COM110", new ErrorInfo("環境不正が発生しました", "環境を調査してください。") }, { "COM111", new ErrorInfo("ファイル数が不正でした", "ファイル数を確認してください。") }, { "COM112", new ErrorInfo("ファイル番号が不正でした", "ファイル番号を確認してください。") }, { "COM113", new ErrorInfo("相手センタ確認コード不正", "相手センタ確認コードを確認してください。") }, { "COM114", new ErrorInfo("当方センタ確認コード不正", "当方センタ確認コードを確認してください。") }, { "COM115", new ErrorInfo("全銀パスワード不正", "全銀パスワードを確認してください。") }, { "COM116", new ErrorInfo("TCP-Zアドレス不正", "TCP-Zアドレスを確認してください。") }, { "COM117", new ErrorInfo("TCP-Zポート番号不正", "TCP-Zポート番号を確認してください。") }, { "COM118", new ErrorInfo("全銀ファイル名不正", "全銀ファイル名を確認してください。") }, { "COM119", new ErrorInfo("ファイルアクセスキー不正", "ファイルアクセスキーを確認してください。") }, { "COM120", new ErrorInfo("ファイル名不正", "ファイル名を確認してください。") }, { "COM121", new ErrorInfo("サイクルNO不正", "サイクルNOを確認してください。") }, { "COM122", new ErrorInfo("集配信区分不正", "集配信区分を確認してください。") }, { "COM123", new ErrorInfo("レコードID不正", "データの属性を確認してください。") }, { "COM124", new ErrorInfo("レコード長不正", "データのレコード長を確認してください。") }, { "COM125", new ErrorInfo("レコード数不正", "データのレコード数を確認してください。") }, { "COM126", new ErrorInfo("電文区分不正", "電文区分を確認してください。") }, { "COM132", new ErrorInfo("同一IPアドレスから着呼したため転送を中止しました", "不要です。") }, { "COM133", new ErrorInfo("TLS設定情報取得エラーが発生しました", "TLSの設定情報の設定内容を確認してください。") }, { "COM134", new ErrorInfo("PROXY設定情報取得エラーが発生しました", "プロキシの設定情報の設定内容を確認してください。") }, { "COM135", new ErrorInfo("PROXY接続エラーが発生しました", "プロキシ設定情報のIPアドレスとポート番号、ユーザID、パスワードを確認してください、およびネットワークの状態を調べてください。") }, }; /// /// ACMS APIから返されたメッセージバッファをユーザーフレンドリーなメッセージに変換 /// /// ACMSCallRecv/Sendからの戻り値 /// ACMS APIから返されたメッセージバッファ(Shift-JISエンコード) /// ユーザーフレンドリーな日本語メッセージ public static string GetUserFriendlyMessage(int returnCode, byte[] messageBuffer) { // 正常終了 if (returnCode == 0) { return "正常終了"; } // メッセージバッファをShift-JISからUTF-8にデコード string rawMessage = AcmsApiWrapper.DecodeMessage(messageBuffer); // エラーコードを抽出(例: "COM073: ..." → "COM073") // パターン: COM/APC/APS/RAS + 数字 var match = Regex.Match(rawMessage, @"^(COM\d{3}|APC\d{3}|APS\d{3}|RAS\d+):"); if (match.Success) { string errorCode = match.Groups[1].Value; // 既知のエラーコードの場合、信頼できる日本語メッセージを返す if (ErrorMessages.TryGetValue(errorCode, out var errorInfo)) { return $"{errorCode}: {errorInfo.Title}\n\n【対処方法】\n{errorInfo.Description}"; } } // 未知のエラーまたはパース失敗 → 元のメッセージを返す // (文字化けしている可能性があるが、情報を失わないため) return $"EDIシステムエラーが発生しました\n\n{rawMessage}"; } /// /// エラー情報を格納するレコード /// /// エラータイトル(簡潔な説明) /// 対処方法(詳細な説明) private record ErrorInfo(string Title, string Description); }