# プログラム仕様書　BU20400P（配車入力（増、傭）センター照会）

| 項目 | 内容 |
|---|---|
| システムID | BU |
| 参考資料 | ・現行ソース BU20400P.pl1<br/>・現行の解析資料 BU0040_配車入力（自社増）.xlsx（シート「資産一覧」「レコードフォーマット」「SRC_BU20400P」） |
| 項目名の出典 | 送受信データ・マスターの項目は解析資料のシート「レコードフォーマット」の日本語名称 |

---

## 1. 概要

| 項目 | 内容 |
|---|---|
| プログラムID | BU20400P（手続き名：BU20400） |
| プログラム名称 | 配車入力（増、傭）センター照会 |
| 言語 | PL/I（CICS コマンドレベル） |
| 処理形態 | オンライン（APPC 会話の相手側。画面なし） |
| 動作環境 | CIC1（センター側） |
| トランザクションID | B04U（DDP の BU10400P から CONNECT PROCESS で起動される） |
| パターンID | PPOC030P（1987/04/30）、業務 BUSHRE30 |
| 呼出し元 | BU10400P（配車入力（自社増便、傭車増・定便）照会） |
| 参照・更新ファイル | VKUNKSH（運行指令マスター、指令書ＮＯ キー）参照<br/>VHSHIRA（運行指令マスター、出発月日・発店・計画便コードの代替索引）参照<br/>VKUNNOK（運行指令書ＮＯ管理マスター）参照・更新 |
| 呼出しモジュール | LSO0020（チェックデジット生成、区分 '07'、タイプ 'G'）、LSS0030A（応答コードの16進文字変換） |

### 1.1 機能概要

DDP から受け取った照会データ（DPCEB04U）の内容で、次のどれかを行い、結果（CEDPBU04）を DDP に返す。

| 受信データ | 処理 |
|---|---|
| 指令書ＮＯ あり | 指令書ＮＯ で運行指令マスターを読み、指令書の内容を返す |
| 指令書ＮＯ なし、計画便コード あり | 出発月日・発店・計画便コードで運行指令マスター（代替索引）を読み、指令書の内容を返す |
| 指令書ＮＯ・計画便コード とも なし（増便） | 運行指令書ＮＯ管理マスターで新しい指令書ＮＯ を採番して返す |

```mermaid
flowchart LR
    DDP[DDP BU10400P<br/>BU04] -- 照会データ 35バイト --> B04U[B04U<br/>本プログラム]
    B04U -- 照会結果 233／61バイト --> DDP
    B04U --> UNKSH[(VKUNKSH／VHSHIRA<br/>運行指令マスター)]
    B04U <--> UNNOK[(VKUNNOK<br/>運行指令書ＮＯ管理マスター)]
```

---

## 2. インターフェース

### 2.1 受信データ（35バイト）

トランザクションID（4）＋予備（1）＋ DPCEB04U（配車入力照会データ（増、傭）ＤＤＰ＝＞、30バイト）。

| 項目ID | 項目名 | 桁 | 本プログラムでの用途 |
|---|---|---|---|
| UNQTERM | 端末ID | 4 | 使用しない |
| UNQDTID | データ区分 | 1 | 使用しない |
| UNQSTYM | 出発月日（MMDD） | 4 | 代替索引のキー |
| UNQSTTC | 出発店所 | 4 | 代替索引のキー |
| UNQSHIN | 指令書ＮＯ | 9 | 0 以外なら指令書ＮＯ で読む |
| UNQBINC | 計画便コード | 6 | 0 以外なら代替索引のキー |

### 2.2 送信データ

トランザクションID（'BU04'）＋エラーフラグ（'0' 固定）＋エラーコード（4）＋ CEDPBU04（配車入力照会後、検証後データ（増、傭））。送信長は、指令書の照会が 233バイト、新規採番が 61バイト。送信前に全体を空にし、エラーコードは 'B000' を初期値とする。

本プログラムでセットする項目：

| 項目ID | 項目名 | 編集元（運行指令マスター） |
|---|---|---|
| UNKDTKB | データ区分 | 指令書の照会は 'D'、新規採番は 'N' |
| UNKNYUK | 入力結果 | '0'（指令書の照会のとき） |
| UNKSHNO | 指令書ＮＯ | 指令書ＮＯ（VBKBSRSH）。新規採番では採番した番号 |
| UNKSHCN | 指令書発行枚数 | 指令書発行枚数（VBKBSHIC） |
| UNKSHYM | 指令月日（＝出発年月日） | 指令年月日（VBKBSRDD）の月日 |
| UNKBNCD | 計画便コード | 計画便コード（VBKBKEIK） |
| UNKBNNM | 便名（漢字） | 便名（漢字）（VBKBKANG）のシフトコードを除いた16バイト |
| UNKKUBN | 運行車区分 | 運行車区分（VBKBYKKN） |
| UNKKEIT | 運行形態区分 | 運行形態（VBKBUKTI） |
| UNKINKB | 入力区分 | 3.4 |
| UNKSTID・UNKSTTC | 発支社区分・発店 | 運行区間の実績の発店（VBKGJHSK・VBKGJHCD）。実績の発店コードが 0 なら計画の発店（VBKKKHSK・VBKKKHCD） |
| UNKSTYY～UNKSTMI | 出発 年・月・日・時・分 | 始発の予定年月日時分（VBKYATIM） |
| UNKENID・UNKENTC | 最終卸支社区分・最終卸店 | 運行区間の実績の着店（最終卸店）（VBKGJCSK・VBKGJCCD）。実績が 0 なら計画の着店（VBKKKCSK・VBKKKCCD） |
| UNKENYY～UNKENMI | 最終卸店到着 年・月・日・時・分 | 最終卸店の予定年月日時分（VBKYBTIM） |
| UNKFUID・UNKFUTC | 次運行発支社・次運行発店 | 支社区分（VBKYSSCD）・予定店コード（VBKYYTCD） |
| UNKCARS・UNKTONS・UNKSYAS | 積載車番・積載車標屯・積載車種 | 始発の積載（VBKGSBN1・VBKGFYT1・VBKGSAS1）。車種が 'F' の場合はセミ頭・フル子・回送（VBKGSBN2・VBKGFYT2・VBKGSAS2） |
| UNKCART・UNKTONT・UNKSYAT | トレーラ頭・コンテナ車 車番・標屯・車種 | 上の逆（通常はセミ頭・フル子・回送、車種が 'F' の場合は積載） |
| UNKDRIA・UNKDRIB | 乗務員 Ａ・Ｂ | 始発の乗務員コード（Ａ：VBKGJMIN、Ｂ：VBKGBJMI） |
| UNKNAMC | 便名（カナ） | 便名（カナ）（VBKBKANA） |
| UNKGHKB・UNKGHCD・UNKGHTC | 直配区分・直配着地コード・直配着地最寄りの店所 | 直配区分（VBKBHIKB）・直配着地コード（VBKBHICD）・直配着地標準最終扱店所（VBKBHITC） |
| UNKINFO | 連絡事項 | 連絡事項（漢字）（VBKBRENR） |
| UNKKBID・UNKTKCD | 特定便区分・特定便ＮＯ | 特定便区分（VBKBKBID）・特定便ＮＯ（VBKBTKCD） |
| UNKFISH | 一車保険料（自社、鮮魚の場合） | 一車保険料（自社鮮魚）（VBKBHOKN） |
| UNKSAIT | 最低保障 | 使用形態（VBKGKITI）が 2 で定額傭車料（VBKGTGKU）が 0 以外なら 1、それ以外は 0（1990/03/07 追加） |
| UNKYOSK | 傭車使用形態 | 自動車利用運送区分（VBKKSAGK）が '1' なら 4（差額的傭車）、それ以外は使用形態（VBKGKITI）（1992/03/03 変更） |
| UNKYSRY | 定額傭車料 | 定額傭車料（VBKGTGKU） |
| UNKYOSH | 一車保険料（傭車の場合） | 一車保険料（傭車）（VBKGYOHO） |
| UNKYOSC | 傭車会社コード | 運行車区分が 2 のとき、フェリー会社・傭車コード（VBKGFYCD） |
| UNKFRCD | フェリー、ライナーコード | 運行車区分が 2 以外のとき、フェリー会社・傭車コード（VBKGFYCD） |

### 2.3 ファイル

| ファイル | 内容 | キー | 読み方 |
|---|---|---|---|
| VKUNKSH | 運行指令マスター（UNKOSHIR） | 指令書ＮＯ（9） | 参照 |
| VHSHIRA | 運行指令マスター（UNKOSHIR）の代替索引 | 出発月日（4）＋発店（4）＋計画便コードの6桁目（1）＋計画便コードの頭5桁（5）＝14バイト | 参照（EQUAL） |
| VKUNNOK | 運行指令書ＮＯ管理マスター（UNKSNOKN） | ＩＤ 'CD' ＋ ファイルＮＯ '0000001' | 更新（READ UPDATE・REWRITE） |

---

## 3. 処理仕様

### 3.1 処理の流れ

```mermaid
flowchart TD
    S([開始]) --> RCV[照会データを受信]
    RCV --> SEL{指令書ＮＯ・計画便コード}
    SEL -- 指令書ＮＯ あり --> R1[VKUNKSH を指令書ＮＯで読む]
    SEL -- 計画便コード あり --> R2[VHSHIRA を代替キーで読む]
    SEL -- どちらもなし --> NEW[新しい指令書ＮＯを採番 3.3]
    R1 --> RES{読込結果}
    R2 --> RES
    RES -- 正常 --> EDT[照会結果の編集 2.2・3.4]
    RES -- エラー --> ERR[入力区分にエラーをセット 3.2]
    EDT --> SND
    ERR --> SND
    NEW --> SND[照会結果を送信 INVITE]
    SND --> FIN[DDP の終了データを受信して終了]
```

### 3.2 指令書の照会

1. 指令書ＮＯ（UNQSHIN）が 0 以外なら、運行指令マスター（VKUNKSH）を指令書ＮＯ で読む。
2. 指令書ＮＯ が 0 で計画便コード（UNQBINC）が 0 以外なら、代替索引（VHSHIRA）を「出発月日＋発店＋計画便コードの6桁目＋頭5桁」で読む。
3. 読めた場合は、2.2 のとおり照会結果を編集する。
4. 読めなかった場合は、指令書ＮＯ で読んだときは指令書ＮＯ を、計画便コードで読んだときは計画便コードを返し、入力区分を次のようにする。

| 読込結果 | 入力区分 | エラーコード |
|---|---|---|
| レコードなし（NOTFND） | 6 | 'B000' |
| 重複キー（DUPKEY） | 5 | 応答コード（EIBRCODE の先頭2バイト）を16進文字に変換した値 |
| その他 | 7 | 同上 |

### 3.3 新しい指令書ＮＯ の採番（増便）

1. 運行指令書ＮＯ管理マスター（VKUNNOK）のキー「'CD'＋'0000001'」のレコードを更新モードで読む。
2. ９番代（自社・傭車増便）の最終ＮＯ（VBUNLNO9）に 1 を足す。結果が 9000000 以下なら 9000000 にする。
3. マスターを書き換える。
4. 書き換えが正常なら、データ区分を 'N' にし、「最終ＮＯ（7桁）＋'1'」にチェックデジットを付けて（LSO0020、区分 '07'、タイプ 'G'）指令書ＮＯ（9桁）とする。チェックデジットの生成に失敗したら入力区分を 9 にする。
5. 読込み・書換えに失敗したら入力区分を 7 にする。

### 3.4 入力区分の判定

運行指令マスターの入力区分（VBKBNURK）と運行車区分（VBKBYKKN）で決める。

| 運行車区分 | マスターの入力区分 | 返す入力区分 | DDP での意味 |
|---|---|---|---|
| 2（傭車） | 0 | 0 | 入力可 |
| 2（傭車） | 9 | 9 | 減便入力済み |
| 2（傭車） | 上記以外 | 1 | 入力済み |
| 2 以外（自社） | 0 | 3 | 自社定便の画面で入力 |
| 2 以外（自社） | 9 | 9 | 減便入力済み |
| 2 以外（自社） | 上記以外 | 1 | 入力済み |

### 3.5 送受信

1. 照会結果のトランザクションID を 'BU04' にして、照会結果を送信し応答を待つ（SEND INVITE WAIT）。
2. DDP からの終了データを受信して終了する。

---

## 4. 補足・留意事項

1. **エラーフラグは常に '0'**：読込みエラーやマスターの更新エラーでも、エラーフラグは '0' のまま返す（エラーフラグ '2' をセットする処理はコメントアウトされている）。エラーは入力区分で DDP に伝える。
2. **新規採番のエラーコード**：新規採番で失敗した場合（入力区分 7・9）、エラーコードは 'B000' のまま。
3. **最終ＮＯの上限**：９番代の最終ＮＯ は 1 ずつ増えるだけで、9999999 を超えた場合の扱いはない。
4. **代替索引の年**：代替索引のキーは出発月日（年なし）のため、同じ月日・発店・計画便コードの指令書が複数年分あると重複キー（入力区分 5）になる。
5. **入力年月日**：入力年月日（UNKIYMD）は本プログラムではセットしない（DDP の BU10400P がセットする）。
6. **送信長**：新規採番の送信長は 61バイトで、照会結果の前半（指令書ＮＯ・入力区分など）だけを返す。
7. **受信データの未使用項目**：端末ID（UNQTERM）・データ区分（UNQDTID）は使わない。
