入場管理システム 仕様共有資料
0. ドキュメント情報
| 項目 | 内容 |
|---|---|
| プロジェクト名 | 入場管理 |
| 文書種別 | 実装向け仕様共有資料 |
| バージョン | v0.1.0 |
| 作成日 | 2026/7/22 |
| 原資料 | detail_01.md |
| ステータス | レビュー完了 |
0.1 本書の方針
- 本書は
detail_01.mdだけを根拠として作成する。 - 原資料に明記されていない仕様は補完しない。
- 未記載、複数案、不整合がある内容は「要確定」とする。
- 別プロジェクトの内部仕様を本システムの仕様として定義しない。
- 「要確定」の内容は、決定されるまで実装上の前提にしてはならない。
0.2 仕様状態
| 状態 | 意味 |
|---|---|
| 確定 | 原資料に明記されている |
| 条件付き | Could要件等、実装対象に含めるか未確定 |
| 要確定 | 原資料で未記載・不整合・別途検討となっている |
1. 概要
1.1 目的
- 入場時にQRコードを読み取り、入場処理を行う。
- 受付の行列を滞留させず、入場を円滑にする。
- 時間帯、受付、年齢層、性別、グループ人数の入場統計を取得する。
- 入場統計をSho-Roomで確認できるようにする。
1.2 対象範囲
- Panasonic FZ-N1のスキャン機能を利用した入場処理
- QRコードの照合
- 初回入場・再入場の判定
- 入場記録
- 専用端末による手動登録
- Sho-Roomでの入場者数表示
- 条件付きで、オフライン記録・同期・競合解消
1.3 対象外
- 来場者側でのQRコード発行・表示
- 別プロジェクトが管理する来場者向け画面
1.4 用語
| 用語 | 定義 |
|---|---|
| 蒼翔祭 | 会津大学の学園祭 |
| 学祭委員 | 本システムを運用する学園祭実行委員 |
| FZ-N1 | QR読取に使用するPanasonic製Android端末 |
| Sho-Room | 学祭委員向け管理画面 |
| 受付 | 正面、西等の入場処理場所 |
| 再入場 | 同一QRコードの2回目以降の読取 |
| 手動登録 | QR未所持者・当日未登録者を専用端末で登録する対応 |
| ゲスト1〜10 | 手動登録者に割り当てる仮の識別名 |
2. 利用者・関係者
2.1 利用者
- 当日シフト担当者
- 手動登録担当者
- Sho-Roomで統計を確認する学祭委員
2.2 ステークホルダー
| 役割 | 氏名 |
|---|---|
| プロジェクトリーダー | @二枚貝 |
| 開発担当 | @凶兆の黒猫 @novice |
| 利用者 | 当日シフト担当 |
3. システム構成
3.1 確定している構成
3.2 技術スタック
| 区分 | 技術 | 状態 |
|---|---|---|
| FZ-N1実装 | Java | 確定 |
| 端末SDK | Toughpad SDK | 確定 |
| API言語 | TypeScript | 確定 |
| APIフレームワーク | Hono | 確定 |
| インフラ | Cloudflare Workers | 確定 |
| データベース | Cloudflare D1 | 確定 |
| ORM | Drizzle ORM | 確定 |
| 端末認証 | APIキー | 確定 |
3.3 未確定の構成
- QR発行元とのAPIまたはデータ連携方式
- 入場管理APIとSho-Roomの接続方式
- Javaの具体的な言語レベル
- オフライン用ローカルストレージの方式
- 外部ログ・監視システム
4. 機能仕様
4.1 機能一覧
| ID | 機能 | 仕様 | 優先度 | 状態 |
|---|---|---|---|---|
| F-001 | QR読取モード起動 | FZ-N1をQRスキャン待機状態にする | Must | 確定 |
| F-002 | QRコード照合 | QR値をDB上の登録情報と照合する | Must | 確定 |
| F-003 | 入場情報記録 | 入場時刻、受付、来場者等を記録する | Must | 確定 |
| F-004 | 結果フィードバック | 入場OK、再入場、未登録を画面と音で表示する | Must | 確定 |
| F-005 | 手動登録 | 専用端末から来場者情報と入場を登録する | Must | 確定 |
| F-006 | 入場者数表示 | Sho-Roomへ集計値を表示する | Could | 条件付き |
| F-007 | オフライン記録 | 通信不通時の入場データを端末へ保存する | Could | 条件付き |
| F-008 | オフライン同期 | 通信復旧後にローカルデータを送信する | Could | 条件付き |
| F-009 | 重複・競合解消 | 複数端末の同期データを突合する | Could | 条件付き |
4.2 QR読取モード
入力
- シフト担当者によるスキャン開始操作
処理
- Toughpad SDKを用いてスキャナを起動する。
- QRスキャン待機画面へ遷移する。
出力
- スキャン待機状態
異常系
- スキャナ起動失敗時はエラーを表示し、再試行を案内する。
画面タップ、物理ボタン等の具体的な開始操作は要確定とする。
4.3 QRコード照合
入力
- FZ-N1が読み取ったQR値
処理
- APIキー認証付きでHono APIへ照会する。
- D1上の登録情報と照合する。
出力
- 入場OK
- 再入場
- 未登録
異常系
- QR破損・読取不可時は再スキャンを案内する。
- DBに該当しない場合はエラー音と表示を行う。
要確定
- QR文字列の形式
- 照合に使用する来場者ID
- APIのパス、要求・応答JSON
- APIキーの発行単位と送信ヘッダー
- QR失効・対象日外等の追加判定
4.4 入場情報記録
入力
- 来場者ID
- スキャン日時
- 受付場所
処理
- 入場記録テーブルへ追加する。
- DB書込み失敗時は、F-007を実装する場合にローカル記録へ切り替える。
出力
- 登録完了または失敗
受付場所を端末へ設定する方法、端末IDを記録するか、日時の基準は要確定とする。
4.5 初回入場・再入場
- 同一QRコードの2回目以降を再入場として扱う。
- 再入場の場合は以降の登録フローを省略し、通行可能とする。
- 再入場を初回入場と異なる画面・音で通知する。
次の内容は要確定とする。
- 再入場判定を日ごとにリセットするか
- 再入場スキャン自体を入場記録へ残すか
- 再入場をSho-Roomの人数へ加算するか
- 複数受付で同時に読み取った場合の判定
4.6 結果フィードバック
- 入場OK、再入場、未登録を一目で区別できること。
- 画面表示と効果音を組み合わせること。
- 判定に時間がかかる場合は処理中表示を行うこと。
色、アイコン、音、表示時間、次のスキャンへの復帰方法はUI設計で確定する。
4.7 手動登録
対象
- QR未所持者
- 端末未所持者
- 当日未登録者
入力
- 年齢層
- 性別
処理
- 実名を要求せず、
ゲスト1等の識別名を自動採番する。 - 登録区分「手動」で来場者レコードを作成する。
- 入場記録へ即時反映する。
異常系
- 必須項目が未入力の場合は登録しない。
要確定
- 専用端末の種類
- 年齢層・性別の選択肢
ゲスト1〜10の採番範囲と一意性- LINEによる当日登録との使い分け
- 手動登録者の再入場方法
4.8 Sho-Room入場統計
集計対象
- 入場者数
- 時間帯
- 受付場所
- 年齢層
- 性別
- グループ人数
表示
- 数値
- グラフ
異常系
- データ取得失敗時は前回値を保持し、エラーを表示する。
集計間隔、更新間隔、グラフ種別、再入場の扱いは要確定とする。
5. オフライン仕様
5.1 確定している要件
- 通信不通を検知する。
- 通信不通時は入場データを端末内へ一時保存する。
- 通信復旧を検知したら保存データをサーバーへ送信する。
- 送信成功分をローカルから削除する。
- 同期中に再切断した場合は再送対象として保持する。
- 複数端末の同一QR記録を重複として検出する。
- 最も早い記録を正として採用する。
5.2 要確定事項
- オフライン時に登録済みQRを判定する方法
- オフライン時に表示する結果
- 端末へ事前データを配布するか
- ローカルDB・ストレージ
- 保存可能件数と容量超過時の動作
- 同時刻記録の優先順位
- 端末時刻ずれの扱い
- 同期APIの形式、バッチ件数、再試行
- 二重送信を防ぐ識別子
これらが確定するまでF-007〜F-009の実装方式を固定しない。
6. 外部連携
6.1 QR発行元
- QR表示・発行は別プロジェクトの責務である。
- 本システムは、別プロジェクトが発行したQRを読み取る。
- 来場者ID、QR形式、発行タイミングは両担当間で確定する必要がある。
別プロジェクトのAPI、DB、内部構成は本書では定義しない。
6.2 Sho-Room
- Sho-Roomへ入場統計を提供する。
- Sho-Room側の認証は既存の学祭委員向け認証基盤に従う想定である。
統計API、認可、表示更新方法は要確定とする。
7. データ仕様
7.1 論理モデル
Attendee 1 --- N EntryLog
7.2 エンティティ
| エンティティ | 原資料にある属性 | 要確定 |
|---|---|---|
| Attendee | 来場者ID, 登録経路, 名前, 年齢層, 性別, 登録区分 | ID型、名前の保存方法、更新日時 |
| EntryLog | ログID, 来場者ID, スキャン日時, 受付場所, 日付, 登録区分 | 再入場、端末、同期状態 |
7.3 要確定事項
- 主キーの型と採番方式
- 来場者IDとQR発行元IDの対応
- 同一来場者に複数入場記録を許可する条件
- 再入場の保存方法
- 論理削除・物理削除
- データ保持期間
- オフライン操作・同期状態のエンティティ
8. 画面仕様
| 画面ID | 画面 | 内容 |
|---|---|---|
| S-01 | スキャン画面 | QR読取、待機、入場結果表示 |
| S-02 | 手動登録画面 | 年齢層・性別入力、登録結果表示 |
| S-03 | Sho-Room入場統計 | 入場者数のグラフ・数値表示 |
8.1 操作性
- IT部員以外のシフト担当者でも扱えること。
- 事前説明5分程度で主要操作を実行できること。
- 入場結果を画面と音で即座に判断できること。
具体的なレイアウト、文言、色、アイコン、物理ボタン割当は画面設計で確定する。
9. 認証・セキュリティ
- FZ-N1からHono APIへの要求はAPIキーで認証する。
- 端末とサーバー間はHTTPSを使用する。
- 不正端末からのアクセスを制限する。
- 来場者の個人情報を扱う場合はプライバシーポリシーを整備する。
次の内容は要確定とする。
- APIキーの発行単位
- APIキーの保存、配布、失効、再発行
- 端末紛失時の対応
- APIのレート制御
- 個人情報・ログの保存期間
10. 非機能要件
10.1 性能
| 記載箇所 | 要件 |
|---|---|
| 非機能要件 | QRスキャンから結果表示まで3秒以内 |
| 受け入れ条件 | 正常QRは1秒以内に記録・表示 |
1秒と3秒で不一致のため、正式な性能目標は要確定とする。
10.2 可用性
- イベント当日の受付時間中にサービス停止が発生しないことを目標とする。
- オフライン機能を実装する場合は通信障害時も記録を継続する。
数値目標と障害時運用は要確定とする。
10.3 互換性・端末
- Android 6.0.1に対応する。
- FZ-N1を7台使用する想定である。
- 内訳は正面3台、西4台である。
- 当日用Wi-Fiを使用する。
Javaの言語レベルは原資料にJavaとJava v7互換の記載があるため要確定とする。
11. 受け入れ条件
- 正常なQRをスキャンして入場記録と入場OKを表示できる
- 同じQRの2回目以降を再入場として処理できる
- 未登録QRを手動登録窓口へ案内できる
- 専用端末で手動登録し、入場記録へ反映できる
- F-007〜F-009を実装する場合、通信不通時に保存し、復旧後に重複なく同期できる
- シフト担当者が5分程度の説明で主要操作を行える
性能試験の合格値は、1秒・3秒の不一致を解消してから追加する。
12. 要確定事項
| ID | 分類 | 要確定事項 |
|---|---|---|
| TBD-001 | QR | QR形式、識別ID、発行タイミング |
| TBD-002 | QR | グループまたは個人のどちらを一回の入場単位にするか |
| TBD-003 | 入場 | 再入場の日付境界、ログ、統計 |
| TBD-004 | 入場 | 同時スキャン時の判定 |
| TBD-005 | 手動登録 | 専用端末とLINE登録の使い分け |
| TBD-006 | 手動登録 | 手動登録者の再入場方法 |
| TBD-007 | 統計 | 更新間隔、集計粒度、再入場の扱い |
| TBD-008 | オフライン | オフライン照合方法 |
| TBD-009 | オフライン | 保存、同期、競合、冪等性 |
| TBD-010 | API | APIパス、JSON、エラー、認証ヘッダー |
| TBD-011 | 認証 | APIキーのライフサイクル |
| TBD-012 | データ | ID、制約、削除、保持期間 |
| TBD-013 | 性能 | 1秒または3秒の目標値 |
| TBD-014 | Java | Java言語レベル |
| TBD-015 | 外部連携 | QR発行元・Sho-Roomとの連携方式 |
12.1 要確定事項の解消状況(2026/7/31 決定)
Epic issue #399 での方針協議により、以下の通り決定した。来場者向けプラットフォーム側(docs/files/specifications/guestApp/spec.md)とも整合する内容である。
| ID | 結論 |
|---|---|
| TBD-001 | QRは署名付きJWT。予約確認画面を開くたびに10分程度の短命JWTを発行する(LIFFはオンライン前提のため) |
| TBD-002 | groupId/guestId両方発行し、受付は代表QR(groupId)を基本運用とする |
| TBD-003 | 再入場は日ごとにリセット。記録(EntryLog)は残すが、Sho-Room人数統計には加算しない |
| TBD-004 | 同一QRの同時スキャンは、日付+QR識別子への一意制約で先着1件のみ入場成立とする |
| TBD-005 | LINE所持者は当日でも来場者向けプラットフォームの予約フローで登録。専用端末はLINE非対応者向け(現場判断で併用可) |
| TBD-006 | 手動登録者にQR等の再入場識別は設けない。入場後の再確認は不要とし、現場判断に委ねる |
| TBD-007 | フェーズ1はポーリング(数分間隔)。将来的にDurable Objectsでのリアルタイム化を検討 |
| TBD-008 | 通常はDB照合。DB問い合わせ失敗時のみJWT署名検証にフォールバックして一時的に通す |
| TBD-009 | 端末はSQLite保存(上限1,000件)。オンライン復帰時にバッチ同期。冪等キーは「QR文字列+スキャン日時」のハッシュ。優先度は低(余力があれば) |
| TBD-010 | RESTful API(/api/v1/entries, /entries/sync, /stats)。JSON、エラーは{ error: { code, message } }形式、認証はX-API-Keyヘッダー |
| TBD-011 | 単一APKで端末登録画面を用意し、Sho-Room発行のOTP(6桁)を入力してAPIKeyを紐付ける方式(端末ごとに個別キー発行) |
| TBD-012 | IDはUUID v4(Attendee)/auto increment(EntryLog)。論理削除が基本。大学への報告完了後に学祭委員側で削除 |
| TBD-013 | 性能目標は3秒以内を正式採用(1秒は参考値に降格) |
| TBD-014 | Java 8を採用(Android Gradle Plugin 3.0以降のcore library desugaringを利用) |
| TBD-015 | 来場者向けプラットフォームとのQR/ID連携は上記TBD-001, 002の通り確定 |
13. スケジュール
| フェーズ | 原資料の期限 | ステータス |
|---|---|---|
| 要件定義 | 2026/7/5 | 進行中 |
| 設計 | 2026/7/12 | 未着手 |
| 実装 | 2026/9/15 | 未着手 |
| テスト | 2026/9/30 | 未着手 |
| リリース | 2026/10/10 | 未着手 |
期限は原資料の記載をそのまま転記しており、現在日付に合わせた補正は行わない。
14. 承認
| 役割 | 氏名 | 承認日 | コメント |
|---|---|---|---|
| プロジェクトリーダー | @二枚貝 | ||
| 開発責任者 | |||
| 運用責任者 |