# ⑥ 業務ロジック — Mapping (InMsg/OutMsg): 5 methods

| 項目 | 内容 |
|---|---|
| 完全修飾名 | `com.fujitsu.futurity.bp.custom.common.JKKHakkoSODCC` |
| レイヤー | CC（Common Component、パッケージ名およびクラス名から判定） |
| モジュール | common（パッケージ名：com.fujitsu.futurity.bp.custom.commonより） |


<style>
.mermaid { display: flex !important; justify-content: center !important; overflow-x: auto !important; overflow-y: hidden; background: #f9f9f9; padding: 20px; border-radius: 8px; margin: 0 auto; }
.mermaid svg { max-width: 100% !important; height: auto !important; width: fit-content !important; margin: 0 auto; }
.node rect { fill: #e1f5fe !important; stroke: #01579b !important; }
.label { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
</style>

<a id="method-mappingEKK0401A010SCInMsg"></a>
### mappingEKK0401A010SCInMsg()

---

#### 1. 役割

サブオプションサービス契約一意照会（EKK0401A010）向けの入力メッセージを生成するマッピング処理。  
具体的には、引数として受け取ったテンプレート（CAANMsg）および入力情報（inHash, funcCode）から、  
- テンプレートID（`TEMPLATE_ID_EKK0401A010 = "EKK0401A010"`）  
- 機能コード（funcCode）  
- オプションサービス契約番号（`OP_SVC_KEI_NO = "op_svc_kei_no"`）  
- サブオプションサービス契約番号（`SBOP_SVC_KEI_NO = "sbop_svc_kei_no"`）  
をセットし、さらに機能コードによって  
- 世代登録年月日時分秒（`GENE_ADD_DTM = "gene_add_dtm"`）または  
- 予約適用年月日（`OPE_DATE = "ope_date"`）  
のいずれかをセットする。  
本メソッドは複数のSC呼出しの事前データ編集で共通利用される。

---

#### 2. 処理パターン（詳細ビジネスロジック）

```mermaid
---
config:
  securityLevel: loose
  flowchart:
    useMaxWidth: false
    htmlLabels: true
    curve: basis
---
flowchart TD
  START["mappingEKK0401A010SCInMsg（template, inHash, funcCode）"] --> S1["Step1: fillCAANMSGNullMapping（template, EKK0401A010CBSMsg.getContents（））"]
  S1 --> S2["Step2: テンプレートIDをセット （TEMPLATE_ID_EKK0401A010 = 'EKK0401A010'）"]
  S2 --> S3["Step3: 機能コードをセット （funcCode）"]
  S3 --> S4["Step4: オプションサービス契約番号をセット （inHash.get（OP_SVC_KEI_NO））"]
  S4 --> S5["Step5: サブオプションサービス契約番号をセット （inHash.get（SBOP_SVC_KEI_NO））"]
  S5 --> IF1{"funcCode の値"}
  IF1 -.- NOTE_FUNC1["FUNC_CODE_1 = '1' （機能コード1）"]
  IF1 -.- NOTE_FUNC2["FUNC_CODE_2 = '2' （機能コード2）"]
  IF1 -->|"Yes: funcCode == FUNC_CODE_1"| S6["Step6: 世代登録年月日時分秒をセット （inHash.get（GENE_ADD_DTM））"]
  IF1 -->|"No: funcCode == FUNC_CODE_2"| S7["Step7: 予約適用年月日をセット （inHash.get（OPE_DATE））"]

  style IF1 fill:#ffcc00
```

**処理ステップ詳細:**

1. Step1: `fillCAANMSGNullMapping(template, new EKK0401A010CBSMsg().getContents())`  
   - 全条件項目をNullで初期化する（Nullマッピング）
2. Step2: `template.set(EKK0401A010CBSMsg.TEMPLATEID, JKKHakkoSODConstCC.TEMPLATE_ID_EKK0401A010)`  
   - テンプレートID（SIFのID）を設定。定数 `TEMPLATE_ID_EKK0401A010 = "EKK0401A010"`
3. Step3: `template.set(EKK0401A010CBSMsg.FUNC_CODE, funcCode)`  
   - 機能コードをセット
4. Step4: `template.set(EKK0401A010CBSMsg.KEY_OP_SVC_KEI_NO, inHash.get(JKKHakkoSODConstCC.OP_SVC_KEI_NO))`  
   - オプションサービス契約番号をセット。定数 `OP_SVC_KEI_NO = "op_svc_kei_no"`
5. Step5: `template.set(EKK0401A010CBSMsg.KEY_SBOP_SVC_KEI_NO, inHash.get(JKKHakkoSODConstCC.SBOP_SVC_KEI_NO))`  
   - サブオプションサービス契約番号をセット。定数 `SBOP_SVC_KEI_NO = "sbop_svc_kei_no"`
6. Step6: 機能コードが `FUNC_CODE_1 = "1"` の場合、  
   `template.set(EKK0401A010CBSMsg.KEY_GENE_ADD_DTM, inHash.get(JKKHakkoSODConstCC.GENE_ADD_DTM))`  
   - 世代登録年月日時分秒をセット。定数 `GENE_ADD_DTM = "gene_add_dtm"`
7. Step7: 機能コードが `FUNC_CODE_2 = "2"` の場合、  
   `template.set(EKK0401A010CBSMsg.KEY_RSV_APLY_YMD, inHash.get(JKKHakkoSODConstCC.OPE_DATE))`  
   - 予約適用年月日をセット。定数 `OPE_DATE = "ope_date"`

---

#### 3. パラメータ分析

| No  | パラメータ名 | 型            | 業務説明                                      |
| --- | ------------ | ------------- | --------------------------------------------- |
| 1   | template     | CAANMsg       | SC入力メッセージテンプレート                  |
| 2   | inHash       | HashMap<String, Object> | 入力情報（パラメータマップ）          |
| 3   | funcCode     | String        | 機能コード（処理モード分岐用）                |

---

#### 4. CRUD操作 / 呼出サービス

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作説明 |
| ---- | -------- | -------- | ----------------- | -------- |
| - | (なし — 直接DB/SC呼び出しなし) | - | - | サブメソッド経由で処理 |
#### 5. 依存トレース (Dependency Trace)

| # | 呼出元 (Screen/Batch) | 呼出チェーン (Full Path → 本メソッド) | 終端 (SC → CRUD → エンティティ) |
|---|---|---|---|
| 1 | `Screen:KKSV0004` | `KKSV0004OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 2 | `Screen:KKSV0008` | `KKSV0008OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 3 | `Screen:KKSV0009` | `KKSV0009OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 4 | `Screen:KKSV0031` | `KKSV0031OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 5 | `Screen:KKSV0073` | `KKSV0073OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 6 | `Screen:KKSV0136` | `KKSV0136OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 7 | `Screen:KKSV0162` | `KKSV0162OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 8 | `Screen:KKSV0428` | `KKSV0428OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 9 | `Screen:KKSV0429` | `KKSV0429OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |
| 10 | `Screen:KKSV0430` | `KKSV0430OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCInMsg` | - |

##### 5.1 内部呼出元 (Internal Callers)

> 同クラス内で本メソッドを呼び出す内部メソッドの一覧です。

| # | 呼出元メソッド (Internal Caller) | 可視性 | 説明 (Javadoc抜粋) |
|---|---|---|---|
| 1 | `callEKK0401A010SC` | private | サブオプションサービス契約一意照会SIFを呼び出し |

---

#### 📋 Per-Branch 詳細ブロック — `mappingEKK0401A010SCInMsg()`

> 各分岐を制御フロー構造に従い、ブロック単位で表示します（depth に応じたネスト）。

##### Block 1 — 🔀 IF `(JKKHakkoSODConstCC.FUNC_CODE_1.equals(funcCode))` [FUNC_CODE_1="1"] (L27511)

> 📌 機能コードにより分岐

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | 📋 SET | `template.set(EKK0401A010CBSMsg.KEY_GENE_ADD_DTM, inHash.get(JKKHakkoSODConstCC.GENE_ADD_DTM));` [➔ KEY_GENE_ADD_DTM="key_gene_add_dtm", GENE_ADD_DTM="gene_add_dtm"] \| [➔ GENE_ADD_DTM="gene_add_dtm" (世代登録年月日時分秒)] |

##### Block 2 — 🔀 ELSE-IF `(JKKHakkoSODConstCC.FUNC_CODE_2.equals(funcCode))` [FUNC_CODE_2="2"] (L27515)

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | 📋 SET | `template.set(EKK0401A010CBSMsg.KEY_RSV_APLY_YMD, inHash.get(JKKHakkoSODConstCC.OPE_DATE));` [➔ KEY_RSV_APLY_YMD="key_rsv_aply_ymd", OPE_DATE="ope_date"] \| [➔ OPE_DATE="ope_date" (運用日)] |

> **合計**: 2 blocks (1 depth levels)

### mappingEKK0341A010SCInMsg()

---

#### 1. 役割

機器提供サービス契約一意照会（EKK0341A010）向けの入力メッセージを生成するマッピング処理。  
具体的には、テンプレート（CAANMsg）および入力情報（inHash, funcCode）から、  
- テンプレートID（`TEMPLATE_ID_EKK0341A010 = "EKK0341A010"`）  
- 機能コード（funcCode）  
- 機器提供サービス契約番号（`KKTK_SVC_KEI_NO = "kktk_svc_kei_no"`）  
をセットし、その後機能コードによって  
- 世代登録年月日時分秒（`GENE_ADD_DTM = "gene_add_dtm"`）または  
- 予約適用年月日（`OPE_DATE = "ope_date"`）  
を追加セットする。  
本メソッドは複数のSC呼出しの入力データ編集で汎用的に利用される。

---

#### 2. 処理パターン（詳細ビジネスロジック）

```mermaid
---
config:
  securityLevel: loose
  flowchart:
    useMaxWidth: false
    htmlLabels: true
    curve: basis
---
flowchart TD
  START["mappingEKK0341A010SCInMsg（template, inHash, funcCode）"] --> S1["Step1: fillCAANMSGNullMapping（template, EKK0341A010CBSMsg.getContents（））"]
  S1 --> S2["Step2: テンプレートIDをセット （TEMPLATE_ID_EKK0341A010 = 'EKK0341A010'）"]
  S2 --> S3["Step3: 機能コードをセット （funcCode）"]
  S3 --> S4["Step4: 機器提供サービス契約番号をセット （inHash.get（KKTK_SVC_KEI_NO））"]
  S4 --> IF1{"funcCode の値"}
  IF1 -.- NOTE_FUNC1["FUNC_CODE_1 = '1' （機能コード1）"]
  IF1 -.- NOTE_FUNC2["FUNC_CODE_2 = '2' （機能コード2）"]
  IF1 -->|"Yes: funcCode == FUNC_CODE_1"| S5["Step5: 世代登録年月日時分秒をセット （inHash.get（GENE_ADD_DTM））"]
  IF1 -->|"No: funcCode == FUNC_CODE_2"| S6["Step6: 予約適用年月日をセット （inHash.get（OPE_DATE））"]

  style IF1 fill:#ffcc00
```

**処理ステップ詳細:**

1. Step1: `fillCAANMSGNullMapping(template, new EKK0341A010CBSMsg().getContents())`  
   - 全条件項目をNullで初期化
2. Step2: `template.set(EKK0341A010CBSMsg.TEMPLATEID, JKKHakkoSODConstCC.TEMPLATE_ID_EKK0341A010)`  
   - テンプレートID（SIFのID）セット。定数 `TEMPLATE_ID_EKK0341A010 = "EKK0341A010"`
3. Step3: `template.set(EKK0341A010CBSMsg.FUNC_CODE, funcCode)`  
   - 機能コードをセット
4. Step4: `template.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, inHash.get(JKKHakkoSODConstCC.KKTK_SVC_KEI_NO))`  
   - 機器提供サービス契約番号をセット。定数 `KKTK_SVC_KEI_NO = "kktk_svc_kei_no"`
5. Step5: 機能コードが `FUNC_CODE_1 = "1"` の場合、  
   `template.set(EKK0341A010CBSMsg.KEY_GENE_ADD_DTM, inHash.get(JKKHakkoSODConstCC.GENE_ADD_DTM))`  
   - 世代登録年月日時分秒をセット。定数 `GENE_ADD_DTM = "gene_add_dtm"`
6. Step6: 機能コードが `FUNC_CODE_2 = "2"` の場合、  
   `template.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD, inHash.get(JKKHakkoSODConstCC.OPE_DATE))`  
   - 予約適用年月日をセット。定数 `OPE_DATE = "ope_date"`

---

#### 3. パラメータ分析

| No  | パラメータ名 | 型            | 業務説明                                      |
| --- | ------------ | ------------- | --------------------------------------------- |
| 1   | template     | CAANMsg       | SC入力メッセージテンプレート                  |
| 2   | inHash       | HashMap<String, Object> | 入力情報（パラメータマップ）          |
| 3   | funcCode     | String        | 機能コード（処理モード分岐用）                |

---

#### 4. CRUD操作 / 呼出サービス

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作説明 |
| ---- | -------- | -------- | ----------------- | -------- |
| - | (なし — 直接DB/SC呼び出しなし) | - | - | サブメソッド経由で処理 |
#### 5. 依存トレース (Dependency Trace)

| # | 呼出元 (Screen/Batch) | 呼出チェーン (Full Path → 本メソッド) | 終端 (SC → CRUD → エンティティ) |
|---|---|---|---|
| 1 | `Screen:KKSV0004` | `KKSV0004OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 2 | `Screen:KKSV0008` | `KKSV0008OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 3 | `Screen:KKSV0009` | `KKSV0009OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 4 | `Screen:KKSV0031` | `KKSV0031OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 5 | `Screen:KKSV0073` | `KKSV0073OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 6 | `Screen:KKSV0136` | `KKSV0136OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 7 | `Screen:KKSV0162` | `KKSV0162OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 8 | `Screen:KKSV0428` | `KKSV0428OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 9 | `Screen:KKSV0429` | `KKSV0429OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |
| 10 | `Screen:KKSV0430` | `KKSV0430OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCInMsg` | - |

##### 5.1 内部呼出元 (Internal Callers)

> 同クラス内で本メソッドを呼び出す内部メソッドの一覧です。

| # | 呼出元メソッド (Internal Caller) | 可視性 | 説明 (Javadoc抜粋) |
|---|---|---|---|
| 1 | `callEKK0341A010SC` | private | 機器提供サービス契約一意照会SIFを呼び出し |

---

#### 📋 Per-Branch 詳細ブロック — `mappingEKK0341A010SCInMsg()`

> 各分岐を制御フロー構造に従い、ブロック単位で表示します（depth に応じたネスト）。

##### Block 1 — 🔀 IF `(JKKHakkoSODConstCC.FUNC_CODE_1.equals(funcCode))` [FUNC_CODE_1="1"] (L27322)

> 📌 機能コードにより分岐

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | 📋 SET | `template.set(EKK0341A010CBSMsg.KEY_GENE_ADD_DTM, inHash.get(JKKHakkoSODConstCC.GENE_ADD_DTM));` [➔ KEY_GENE_ADD_DTM="key_gene_add_dtm", GENE_ADD_DTM="gene_add_dtm"] \| [➔ GENE_ADD_DTM="gene_add_dtm" (世代登録年月日時分秒)] |

##### Block 2 — 🔀 ELSE-IF `(JKKHakkoSODConstCC.FUNC_CODE_2.equals(funcCode))` [FUNC_CODE_2="2"] (L27326)

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | 📋 SET | `template.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD, inHash.get(JKKHakkoSODConstCC.OPE_DATE));` [➔ KEY_RSV_APLY_YMD="key_rsv_aply_ymd", OPE_DATE="ope_date"] \| [➔ OPE_DATE="ope_date" (運用日)] |

> **合計**: 2 blocks (1 depth levels)

### mappingEKK0401A010SCOutMsg()

---

#### 1. 役割

サブオプションサービス契約一意照会（EKK0401A010）のSC実行後、戻り値であるCAANMsg配列から、業務で必要なデータをHashMap形式に変換するアウトマッピング処理。  
具体的には、  
- 戻り値配列resultMsgsの0番目からメッセージ（CAANMsg）を抽出  
- そのメッセージからサブオプションサービス契約一意照会明細リスト（`EKK0401A010CBSMSG1LIST`）を取得  
- リストが空の場合は空のHashMapを返却  
- 1件以上ある場合はその先頭のCAANMsgのデータ部（getMsgData()）を返却  
となる。  
本メソッドはSC呼出後の結果データを業務ロジックで利用可能な形式に変換する共通処理であり、各種照会処理のレスポンス解析で利用される。

---

#### 2. 処理パターン（詳細ビジネスロジック）

```mermaid
---
config:
  securityLevel: loose
  flowchart:
    useMaxWidth: false
    htmlLabels: true
    curve: basis
---
flowchart TD
  START["mappingEKK0401A010SCOutMsg（resultMsgs）"] --> S1["Step1: resultMsgs[0] からCAANMsgを抽出"]
  S1 --> S2["Step2: msg.getMsgData（）.get（EKK0401A010CBSMSG1LIST） で明細リスト取得"]
  S2 --> IF1{"msgList == null または msgList.length == 0"}
  IF1 -->|"Yes: 空"| S3["Step3: 空のHashMapをretHashとして返却"]
  IF1 -->|"No: 1件以上"| S4["Step4: msgList[0].getMsgData（） をretHashとして返却"]
  S3 --> RET["return retHash"]
  S4 --> RET

  IF1 -.- NOTE1["EKK0401A010CBSMSG1LIST （サブオプションサービス契約一意照会明細リスト）"]
  style IF1 fill:#ffcc00
```

**処理ステップ詳細:**

1. Step1: `CAANMsg msg = resultMsgs[0];`  
   - SC戻り値配列の先頭からCAANMsgを取得
2. Step2: `CAANMsg[] msgList = (CAANMsg[])msg.getMsgData().get(EKK0401A010CBSMsg.EKK0401A010CBSMSG1LIST);`  
   - サブオプションサービス契約一意照会明細リスト（定数名）を取得
3. Step3: リストがnullまたは長さ0の場合、`retHash = new HashMap<String, Object>();`  
   - 空のHashMapを返却
4. Step4: それ以外の場合、`retHash = msgList[0].getMsgData();`  
   - 明細リストの先頭CAANMsgからデータ部（Map）を返却
5. Step5: `return retHash;`  
   - 呼び出し元へ返却

---

#### 3. パラメータ分析

| No  | パラメータ名 | 型            | 業務説明                                |
| --- | ------------ | ------------- | --------------------------------------- |
| 1   | resultMsgs   | CAANMsg[]     | SC実行結果メッセージ配列                |

---

#### 4. CRUD操作 / 呼出サービス

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作説明 |
| ---- | -------- | -------- | ----------------- | -------- |
| - | (なし — 直接DB/SC呼び出しなし) | - | - | サブメソッド経由で処理 |
#### 5. 依存トレース (Dependency Trace)

| # | 呼出元 (Screen/Batch) | 呼出チェーン (Full Path → 本メソッド) | 終端 (SC → CRUD → エンティティ) |
|---|---|---|---|
| 1 | `Screen:KKSV0004` | `KKSV0004OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 2 | `Screen:KKSV0008` | `KKSV0008OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 3 | `Screen:KKSV0009` | `KKSV0009OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 4 | `Screen:KKSV0031` | `KKSV0031OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 5 | `Screen:KKSV0073` | `KKSV0073OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 6 | `Screen:KKSV0136` | `KKSV0136OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 7 | `Screen:KKSV0162` | `KKSV0162OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 8 | `Screen:KKSV0428` | `KKSV0428OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 9 | `Screen:KKSV0429` | `KKSV0429OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |
| 10 | `Screen:KKSV0430` | `KKSV0430OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0401A010SCOutMsg` | - |

##### 5.1 内部呼出元 (Internal Callers)

> 同クラス内で本メソッドを呼び出す内部メソッドの一覧です。

| # | 呼出元メソッド (Internal Caller) | 可視性 | 説明 (Javadoc抜粋) |
|---|---|---|---|
| 1 | `callEKK0401A010SC` | private | サブオプションサービス契約一意照会SIFを呼び出し |

---

#### 📋 Per-Branch 詳細ブロック — `mappingEKK0401A010SCOutMsg()`

> 各分岐を制御フロー構造に従い、ブロック単位で表示します（depth に応じたネスト）。

##### Block 1 — 🔀 IF `(null == msgList || 0 == msgList.length)` (L27539)

> 📌 結果の取得

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | ⚡ EXEC | `retHash = new HashMap<String, Object>();` |

##### Block 2 — ↪️ ELSE `(else)` (L27544)

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | ⚡ EXEC | `retHash = msgList[0].getMsgData();` |

> **合計**: 2 blocks (1 depth levels)

### mappingEKK0341A010SCOutMsg()

---

#### 1. 役割

機器提供サービス契約一意照会（EKK0341A010）のSC実行後、戻り値であるCAANMsg配列から、業務で必要なデータをHashMap形式に変換するアウトマッピング処理。  
具体的には、  
- resultMsgsの0番目のCAANMsgから  
- 機器提供サービス契約一意照会明細リスト（`EKK0341A010CBSMSG1LIST`）を取得  
- リストがnullまたは空の場合は空のHashMapを返却  
- 1件以上の場合はその先頭CAANMsgのデータ部（getMsgData()）を返却  
となる。  
本メソッドはSC呼出後のレスポンスを、業務ロジックで利用しやすい形に展開する変換処理であり、機器提供サービス契約に関する各種照会・判定処理で利用される。

---

#### 2. 処理パターン（詳細ビジネスロジック）

```mermaid
---
config:
  securityLevel: loose
  flowchart:
    useMaxWidth: false
    htmlLabels: true
    curve: basis
---
flowchart TD
  START["mappingEKK0341A010SCOutMsg（resultMsgs）"] --> S1["Step1: resultMsgs[0] からCAANMsgを抽出"]
  S1 --> S2["Step2: msg.getMsgData（）.get（EKK0341A010CBSMSG1LIST） で明細リスト取得"]
  S2 --> IF1{"msgList == null または msgList.length == 0"}
  IF1 -->|"Yes: 空"| S3["Step3: 空のHashMapをretHashとして返却"]
  IF1 -->|"No: 1件以上"| S4["Step4: msgList[0].getMsgData（） をretHashとして返却"]
  S3 --> RET["return retHash"]
  S4 --> RET

  IF1 -.- NOTE1["EKK0341A010CBSMSG1LIST （機器提供サービス契約一意照会明細リスト）"]
  style IF1 fill:#ffcc00
```

**処理ステップ詳細:**

1. Step1: `CAANMsg msg = resultMsgs[0];`  
   - SC戻り値配列の先頭からCAANMsgを取得
2. Step2: `CAANMsg[] msgList = (CAANMsg[])msg.getMsgData().get(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);`  
   - 機器提供サービス契約一意照会明細リスト（定数名）を取得
3. Step3: リストがnullまたは長さ0の場合、`retHash = new HashMap<String, Object>();`  
   - 空のHashMapを返却
4. Step4: それ以外の場合、`retHash = msgList[0].getMsgData();`  
   - 明細リストの先頭CAANMsgからデータ部（Map）を返却
5. Step5: `return retHash;`  
   - 呼び出し元へ返却

---

#### 3. パラメータ分析

| No  | パラメータ名 | 型            | 業務説明                                |
| --- | ------------ | ------------- | --------------------------------------- |
| 1   | resultMsgs   | CAANMsg[]     | SC実行結果メッセージ配列                |

---

#### 4. CRUD操作 / 呼出サービス

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作説明 |
| ---- | -------- | -------- | ----------------- | -------- |
| - | (なし — 直接DB/SC呼び出しなし) | - | - | サブメソッド経由で処理 |
#### 5. 依存トレース (Dependency Trace)

| # | 呼出元 (Screen/Batch) | 呼出チェーン (Full Path → 本メソッド) | 終端 (SC → CRUD → エンティティ) |
|---|---|---|---|
| 1 | `Screen:KKSV0004` | `KKSV0004OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 2 | `Screen:KKSV0008` | `KKSV0008OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 3 | `Screen:KKSV0009` | `KKSV0009OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 4 | `Screen:KKSV0031` | `KKSV0031OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 5 | `Screen:KKSV0073` | `KKSV0073OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 6 | `Screen:KKSV0136` | `KKSV0136OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 7 | `Screen:KKSV0162` | `KKSV0162OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 8 | `Screen:KKSV0428` | `KKSV0428OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 9 | `Screen:KKSV0429` | `KKSV0429OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |
| 10 | `Screen:KKSV0430` | `KKSV0430OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0341A010SCOutMsg` | - |

##### 5.1 内部呼出元 (Internal Callers)

> 同クラス内で本メソッドを呼び出す内部メソッドの一覧です。

| # | 呼出元メソッド (Internal Caller) | 可視性 | 説明 (Javadoc抜粋) |
|---|---|---|---|
| 1 | `callEKK0341A010SC` | private | 機器提供サービス契約一意照会SIFを呼び出し |

---

#### 📋 Per-Branch 詳細ブロック — `mappingEKK0341A010SCOutMsg()`

> 各分岐を制御フロー構造に従い、ブロック単位で表示します（depth に応じたネスト）。

##### Block 1 — 🔀 IF `(null == msgList || 0 == msgList.length)` (L27350)

> 📌 結果の取得

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | ⚡ EXEC | `retHash = new HashMap<String, Object>();` |

##### Block 2 — ↪️ ELSE `(else)` (L27355)

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | ⚡ EXEC | `retHash = msgList[0].getMsgData();` |

> **合計**: 2 blocks (1 depth levels)

### mappingEKK0081A010SCInMsg()

---

#### 1. 役割

サービス契約一意照会（EKK0081A010）向けの入力メッセージを生成するマッピング処理。  
具体的には、テンプレート（CAANMsg）・入力情報（inHash, funcCode）から、  
- テンプレートID（`TEMPLATE_ID_EKK0081A010 = "EKK0081A010"`）  
- 機能コード（funcCode）  
- サービス契約番号（`SVC_KEI_NO = "svc_kei_no"`）  
をセットし、さらに機能コードによって  
- 世代登録年月日時分秒（`GENE_ADD_DTM = "gene_add_dtm"`）または  
- 予約適用年月日（`OPE_DATE = "ope_date"`）  
を追加セットする。  
本メソッドはサービス契約情報の個別照会等、各種SC呼出の入力データ編集で共通利用される。

---

#### 2. 処理パターン（詳細ビジネスロジック）

```mermaid
---
config:
  securityLevel: loose
  flowchart:
    useMaxWidth: false
    htmlLabels: true
    curve: basis
---
flowchart TD
  START["mappingEKK0081A010SCInMsg（template, inHash, funcCode）"] --> S1["Step1: fillCAANMSGNullMapping（template, EKK0081A010CBSMsg.getContents（））"]
  S1 --> S2["Step2: テンプレートIDをセット （TEMPLATE_ID_EKK0081A010 = 'EKK0081A010'）"]
  S2 --> S3["Step3: 機能コードをセット （funcCode）"]
  S3 --> S4["Step4: サービス契約番号をセット （inHash.get（SVC_KEI_NO））"]
  S4 --> IF1{"funcCode の値"}
  IF1 -.- NOTE_FUNC1["FUNC_CODE_1 = '1' （機能コード1）"]
  IF1 -.- NOTE_FUNC2["FUNC_CODE_2 = '2' （機能コード2）"]
  IF1 -->|"Yes: funcCode == FUNC_CODE_1"| S5["Step5: 世代登録年月日時分秒をセット （inHash.get（GENE_ADD_DTM））"]
  IF1 -->|"No: funcCode == FUNC_CODE_2"| S6["Step6: 予約適用年月日をセット （inHash.get（OPE_DATE））"]

  style IF1 fill:#ffcc00
```

**処理ステップ詳細:**

1. Step1: `fillCAANMSGNullMapping(template, new EKK0081A010CBSMsg().getContents())`
   - 全条件項目をNullで初期化
2. Step2: `template.set(EKK0081A010CBSMsg.TEMPLATEID, JKKHakkoSODConstCC.TEMPLATE_ID_EKK0081A010)`
   - テンプレートID（SIFのID）セット。定数 `TEMPLATE_ID_EKK0081A010 = "EKK0081A010"`
3. Step3: `template.set(EKK0081A010CBSMsg.FUNC_CODE, funcCode)`
   - 機能コードをセット
4. Step4: `template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inHash.get(JKKHakkoSODConstCC.SVC_KEI_NO))`
   - サービス契約番号をセット。定数 `SVC_KEI_NO = "svc_kei_no"`
5. Step5: 機能コードが `FUNC_CODE_1 = "1"` の場合、
   `template.set(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, inHash.get(JKKHakkoSODConstCC.GENE_ADD_DTM))`
   - 世代登録年月日時分秒をセット。定数 `GENE_ADD_DTM = "gene_add_dtm"`
6. Step6: 機能コードが `FUNC_CODE_2 = "2"` の場合、
   `template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, inHash.get(JKKHakkoSODConstCC.OPE_DATE))`
   - 予約適用年月日をセット。定数 `OPE_DATE = "ope_date"`

---

#### 3. パラメータ分析

| No  | パラメータ名 | 型            | 業務説明                                      |
| --- | ------------ | ------------- | --------------------------------------------- |
| 1   | template     | CAANMsg       | SC入力メッセージテンプレート                  |
| 2   | inHash       | HashMap<String, Object> | 入力情報（パラメータマップ）          |
| 3   | funcCode     | String        | 機能コード（処理モード分岐用）                |

---

#### 4. CRUD操作 / 呼出サービス

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作説明 |
| ---- | -------- | -------- | ----------------- | -------- |
| - | (なし — 直接DB/SC呼び出しなし) | - | - | サブメソッド経由で処理 |
#### 5. 依存トレース (Dependency Trace)

| # | 呼出元 (Screen/Batch) | 呼出チェーン (Full Path → 本メソッド) | 終端 (SC → CRUD → エンティティ) |
|---|---|---|---|
| 1 | `Screen:KKSV0004` | `KKSV0004OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 2 | `Screen:KKSV0008` | `KKSV0008OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 3 | `Screen:KKSV0009` | `KKSV0009OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 4 | `Screen:KKSV0031` | `KKSV0031OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 5 | `Screen:KKSV0073` | `KKSV0073OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 6 | `Screen:KKSV0136` | `KKSV0136OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 7 | `Screen:KKSV0162` | `KKSV0162OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 8 | `Screen:KKSV0428` | `KKSV0428OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 9 | `Screen:KKSV0429` | `KKSV0429OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |
| 10 | `Screen:KKSV0430` | `KKSV0430OPBPCheck.invokeCheck → getInvokeCBS → mappingEKK0081A010SCInMsg` | - |

##### 5.1 内部呼出元 (Internal Callers)

> 同クラス内で本メソッドを呼び出す内部メソッドの一覧です。

| # | 呼出元メソッド (Internal Caller) | 可視性 | 説明 (Javadoc抜粋) |
|---|---|---|---|
| 1 | `callEKK0081A010SC` | private | サービス契約一意照会SIFを呼び出し |
---
---

#### 📋 Per-Branch 詳細ブロック — `mappingEKK0081A010SCInMsg()`

> 各分岐を制御フロー構造に従い、ブロック単位で表示します（depth に応じたネスト）。

##### Block 1 — 🔀 IF `(JKKHakkoSODConstCC.FUNC_CODE_1.equals(funcCode))` [FUNC_CODE_1="1"] (L27137)

> 📌 機能コードにより分岐

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | 📋 SET | `template.set(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, inHash.get(JKKHakkoSODConstCC.GENE_ADD_DTM));` [➔ KEY_GENE_ADD_DTM="key_gene_add_dtm", GENE_ADD_DTM="gene_add_dtm"] \| [➔ GENE_ADD_DTM="gene_add_dtm" (世代登録年月日時分秒)] |

##### Block 2 — 🔀 ELSE-IF `(JKKHakkoSODConstCC.FUNC_CODE_2.equals(funcCode))` [FUNC_CODE_2="2"] (L27141)

| # | 種別 | 処理内容 |
|---|---|---|
| 1 | 📋 SET | `template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, inHash.get(JKKHakkoSODConstCC.OPE_DATE));` [➔ KEY_RSV_APLY_YMD="key_rsv_aply_ymd", OPE_DATE="ope_date"] \| [➔ OPE_DATE="ope_date" (運用日)] |

> **合計**: 2 blocks (1 depth levels)



---

## 📋 全分岐詳細 (deterministic per-branch table)

> 以下のテーブルはソースコードから deterministic に生成されたものです。全条件分岐を網羅します。

### 📞 Screen/Batch 呼び出し元 (External Entry Points)

> このクラスを呼び出すScreen/Batchの一覧です（クラスレベルの呼び出し元）。
> **「呼出チェーン」列**: CC直接エントリメソッド → IntraClass経由 → 本チャンクの対象メソッド（**太字**）の実際の呼出パス。
> ※ 例: `CCエントリメソッド → 中間メソッド → **対象メソッド**` — 左端がCC入口、太字が本チャンクの対象メソッド。
> **「種別」列**: BPCheck＝業務確認チェック, Batch＝バッチ処理, Operation＝オペレーション, CC＝制御クラス。

| # | Screen/Batch | 種別 | 呼び出しクラス | 呼び出しメソッド | 呼出チェーン（CC入口 → IntraClass → 対象） |
|---|---|---|---|---|---|
| 1 | `KKSV0004` | BPCheck | `KKSV0004OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 2 | `KKSV0008` | BPCheck | `KKSV0008OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 3 | `KKSV0009` | BPCheck | `KKSV0009OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 4 | `KKSV0031` | BPCheck | `KKSV0031OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 5 | `KKSV0073` | BPCheck | `KKSV0073OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 6 | `KKSV0136` | BPCheck | `KKSV0136OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 7 | `KKSV0162` | BPCheck | `KKSV0162OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 8 | `KKSV0428` | BPCheck | `KKSV0428OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 9 | `KKSV0429` | BPCheck | `KKSV0429OPBPCheck` | `invokeCheck` | `getInvokeCBS` |
| 10 | `KKSV0430` | BPCheck | `KKSV0430OPBPCheck` | `invokeCheck` | `getInvokeCBS` |

## ③.6 制御フロー分岐 (Control Flow Branching)

### `mappingEKK0341A010SCOutMsg()` (L27336) — 3 branches

| # | 種別 | 深度 | 条件 | 説明 | 定数値 | 呼出メソッド | 行番号 |
|---|---|---|---|---|---|---|---|
| 1 | 🔀 IF | D0 | (null == msgList ｜｜ 0 == msgList.length) | 結果の取得 | - | - | L27350 |
| 2 | 🔀 ELSE | D0 | (else) | - | - | - | L27355 |
| 3 | ↩️ RETURN | D0 | retHash | - | - | - | L27359 |

```mermaid
%%{init: {"securityLevel": "loose"}}%%
flowchart TD
  START["mappingEKK0341A010SCOutMsg()"] --> CF0{"制御フロー分岐"}
  B0["IF: （null == msgList || 0 == msgList.length）"]
  CF0 -->|"L27350"| B0
  B1["ELSE"]
  CF0 -->|"L27355"| B1
  B2["RETURN: retHash"]
  CF0 -->|"L27359"| B2
```

### `mappingEKK0401A010SCOutMsg()` (L27525) — 3 branches

| # | 種別 | 深度 | 条件 | 説明 | 定数値 | 呼出メソッド | 行番号 |
|---|---|---|---|---|---|---|---|
| 1 | 🔀 IF | D0 | (null == msgList ｜｜ 0 == msgList.length) | 結果の取得 | - | - | L27539 |
| 2 | 🔀 ELSE | D0 | (else) | - | - | - | L27544 |
| 3 | ↩️ RETURN | D0 | retHash | - | - | - | L27549 |

```mermaid
%%{init: {"securityLevel": "loose"}}%%
flowchart TD
  START["mappingEKK0401A010SCOutMsg()"] --> CF0{"制御フロー分岐"}
  B0["IF: （null == msgList || 0 == msgList.length）"]
  CF0 -->|"L27539"| B0
  B1["ELSE"]
  CF0 -->|"L27544"| B1
  B2["RETURN: retHash"]
  CF0 -->|"L27549"| B2
```

> **制御フロー合計**: 2 methods, 6 branches
