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);
}