🎯 この記事の範囲
第 2 回 で読んだ結果を、どこに載せるかです。全部を一つの描画エンジン、一つのサーバー、一つのアプリビルドに寄せると、単純に見えて誤送と誤権限が増えます。
| 本記事 | 隣接 | |
|---|---|---|
| 本記事(第 3 回) | テナント付き DTO / A4 とラベル / 店舗と別拠点 / 端末設定と業務設定 / 方式のフォールバック禁止 | 受入、帳票エンジン置換 |
📦 データは、文書から拠点を推測しない
帳票も検品も、最初の境界は DTO です。テナント、拠点、発行 ID、スキーマ名を、呼出側が渡します。テンプレートが店名や住所から紙面を選ぶと、別テナントの帳票が混ざります。
許可するスキーマは明示します。共通帳票と、固定レイアウトの旧紙面。CLR の型名や任意 JSON は復元しません。未マップメンバーは拒否します。
比較用の変換結果は、通常の印刷キューに入れません。現行紙との重ね合わせ用アーティファクトと、現場に出るジョブは別物です。
ログイン拠点と DTO のテナント・拠点が一致しない場合は、描画も送信もしません。メニューを隠すことは、サーバー側認可の代わりになりません。
🖨 A4 は PDF、ラベルは SBPL
出力経路は二つです。一つにしないことが、この境界の本体です。
A4 は Scriban と Playwright です。ラベルは SBPL です。203 dpi の感熱紙を CSS ページに載せると、原点もバーコードも別物になります。PDF をラベル機へ送るフォールバックは、オペレーターが見るべき失敗です。
方式ルーターは、登録したディスパッチャーにだけジョブを渡します。未登録方式へ落とさない。サーバーは生の SBPL も、プリンター IP も返しません。返すのは不透明な印刷先 ID です。実キュー名と TCP 先は、その端末のローカル設定だけが解決します。
詳細な紙面とバーコードは 第 8 回(脱Microsoft) にあります。本記事が固定するのは、帳票エンジンの話ではなく、経路を混ぜない契約です。
🏪 複数の現場は、同じアプリで、違う正本
同じ MAUI を複数の現場業務で使います。テナントごとにソースを分岐しません。ログイン後に、拠点で有効な業務と担当者に許可された業務の積集合だけを出します。起動前とログアウト後に業務アイコンは出ません。
正本は画面ではなくサーバーです。
| 利用 | 業務 | 正本 |
|---|---|---|
| 店舗 | 検品・出荷・送り状など、店舗で完結する業務 | CTS-EC |
| 別拠点 | 店舗とは正本が違う業務。出荷連携は EC 側 | CTS-LOGI |
拠点固有の作業場所や優先分岐は、必要な拠点だけが有効にする設定であり、全テナントの既定にしません。店舗で完結する工程を、別拠点の一般入庫へ混ぜません。
EC 用と LOGI 用の認証・HTTP クライアントは分けます。同じトークンを両サービスへ使えるとは仮定しません。テナントや拠点を切り替えたら、前の通信・検品セッション・キャッシュを破棄します。画面の非表示を認可の代わりにしない。
別拠点のサーバーがまだ無いなら、無いと書きます。旧 API の URL 差し替えだけで完了とはしません。
🖥 業務設定と、端末のプリンターは分ける
テナントの帳票版、配送会社、発送元はサーバーが持ちます。Windows キュー名、SATO の IP、用紙原点は端末が持ちます。
混ざると、スマホに Windows キュー名が届き、印刷 PC にラベル機の IP が届きます。HTTP 本文にキュー名、IP、TCP ポート、資格情報、任意 SBPL を入れない、が境界の検査項目です。接続は HTTPS です。
設定には版を付けます。claim 時の端末設定版がサーバーと一致しなければ、印刷せず要確認にします。新しい設定を、稼働中の印刷へ途中適用しません。
WPF の無人印刷が引き継ぐのは役割だけです。ActiveReports は使いません。MAUI からの印刷と WPF の自動印刷は、同じ印刷ジョブ ID で追跡します。
🚫 送信と排出、取得と完了を寄せない
印刷エージェントは claim で短いリースを取ります。submitted はスプーラーまたは SATO 送信口の受理です。用紙排出でも配送完了でもありません。結果不明は自動再送せず、要確認です。再発行は権限付きの新しいジョブ ID です。同じ ID を履歴から消して再送しません。
期限切れの claim は再送待ちへ戻さず、要確認へ移します。ローカル履歴は再起動後の重複送信を防ぎますが、複数 PC の排他の正本にはなりません。排他の正本はサーバーです。
旧自動印刷の「10 分間隔で取りに行く」役割は残します。帳票種別をプロセス全体の可変値で選ぶ経路は残しません。サーバーが各ジョブのスキーマとレイアウトを指定します。
✅ 第 3 回まとめ
- 寄せるのは DTO とジョブ ID とログイン後のアプリ。寄せないのは描画エンジンと正本サーバーとプリンター解決
- テンプレートは拠点を推測しない。スキーマは許可したものだけ
- A4 は PDF、ラベルは SBPL。経路のフォールバックは禁止
- 店舗と別拠点は正本サーバーを分ける。同じ MAUI、違う認証
- 業務設定はサーバー、キュー名と IP は端末。設定には版を付ける
- submitted は排出ではない。不明は再送しない
次回「受入の機械化」では、この境界をどのテストで閉じるかを書きます。
📚 シリーズ記事
| 回 | タイトル | 主題 |
|---|---|---|
| 1 | レガシー置換とは | 旧実装を原典にし、先にテストへ落とす |
| 2 | 旧コードの読み方 | 地図が無い状態から四分類 |
| 3 | 寄せる境界・寄せない境界(本記事) | DTO、PDF と SBPL、店舗と別拠点 |
| 4 | 受入の機械化 | ユニットと Moq・フェイクで先に落とす |
| 5 | Linux から Mac / Windows へ出して TDD する | SSH 先で閉じる不足分、キャプチャまで AI |
| 6 | 人が残る切替 | 実機・実紙・契約・並行稼働 |
| 7 | 再現装置としてのハーネス | 台帳・禁止・ゲート・停止条件 |
🔗 関連リソース
- ActiveReports → Playwright + Scriban 移行 — A4 / SBPL 分離の紙面側
- SBPL — ラベル側の印字言語
- Playwright / Scriban
- .NET MAUI — 店舗と別拠点で共用する端末