Skip to content

表示サービスの自動更新とレシート印刷の非同期化 - #52

Merged
Atsumi3 merged 9 commits into
mainfrom
claude/app-jar-release-output-m2pekn
Aug 24, 2026
Merged

表示サービスの自動更新とレシート印刷の非同期化#52
Atsumi3 merged 9 commits into
mainfrom
claude/app-jar-release-output-m2pekn

Conversation

@Atsumi3

@Atsumi3 Atsumi3 commented Aug 24, 2026

Copy link
Copy Markdown
Member

概要

サーバー更新時に e-Paper 表示サービスも一緒に更新できるようにし、あわせて会計 API がレシート印刷を待ってタイムアウトする問題を修正します。

レシート印刷の非同期化

  • プリンターに到達できないとき、接続が OS 既定のタイムアウト(数十秒から数分)までブロックし、会計 API のレスポンスが返らずアプリ側がタイムアウトしていました
  • ReceiptPrinter.print に接続タイムアウトと読み書きタイムアウトを追加しました
  • ReceiptService に printReceiptAsync を新設し、プリンター IP の解決とレシートの組み立ては呼び出しスレッドで行い、ソケット送信のみ専用スレッドへ委譲します
  • プリンター未設定、または店舗が見つからない場合は送信を依頼せずそのまま返します
  • SaleApiController の会計処理 2 経路を非同期版へ差し替えました。印刷の成否は会計のレスポンスに影響しません
  • 接続タイムアウトは app.receipt.printer.connect-timeout-millis(環境変数 RECEIPT_PRINTER_CONNECT_TIMEOUT_MILLIS、既定 3000)で変更できます

表示サービスの自動更新

  • update-app.sh が配布物に含まれる raspberry-pi-display のコードで /opt/kidspos-display を差し替え、稼働中なら kidspos-display を再起動します
  • 表示サービスを導入していない Pi では何もしません。差し替えたくない場合は --skip-display を付けます
  • 差し替えや再起動に失敗した場合はスクリプトのバージョンを記録せず、次回の実行で再試行します

テスト

  • ReceiptPrinterTest を新規追加(送信できること、接続拒否時にすぐ失敗すること、到達できないホストで指定タイムアウトで打ち切られること)
  • ReceiptServiceTest に printReceiptAsync のテストを追加(未設定時に依頼しない、バックグラウンドで送信される、到達できないプリンターでも即座に返る)
  • SaleApiControllerTest と SaleApiControllerUnitTest を非同期版に合わせて更新
  • test-update-app.sh に表示サービス更新のテストを 8 件追加(141 assertions すべて成功)
  • ./gradlew build -x detekt と detekt が成功し、bootRun で /api/status の応答を確認済み

Generated by Claude Code

- 時刻同期後に fake-hwclock へ保存し、RTC のない Raspberry Pi で
  再起動時に時刻が巻き戻るのを防ぐ
- 選択商品のバーコード PDF もキャッシュ対象にし、枠線あり版も
  起動時にウォームアップ。商品の追加・更新・削除をイベントで受けて
  キャッシュを作り直す
- Danger Zone のパスワード照合に接続元ごとのレート制限を追加。
  連続失敗が上限に達している間は照合せず 429 と Retry-After を返す
update-app.sh の最後で upload-apk.sh を呼び、jar が同一バージョンで
早期終了する場合も APK の確認だけは行う。
APK の登録に失敗してもサーバーの更新は成功扱いにし、警告のみ出す。
オフライン更新(jar のパス指定)と --skip-apk 指定時は確認しない。
- main への push で app.jar と kidspos-scripts.tar.gz を添付した server-v* リリースを自動作成する Release Server ワークフローを追加
- app.jar の配布元を一本化するため generate-sdk.yml からは app.jar を外す
- update-app.sh がリリース同梱のスクリプトで自身と doctor.sh、upload-apk.sh を差し替えるようにする(--skip-self-update で無効化可能)
- 自己更新のテスト 11 件を追加(計 104 assertions)
- releases/latest/download/app.jar が使えなくなるためオフライン手順を releases API 経由に変更
- update-app.sh が /opt/kidspos-display のモジュールを配布物で差し替え、稼働中なら kidspos-display を再起動する
- 表示サービス未導入の Pi では何もしない。差し替え不要なら --skip-display
- 差し替えや再起動に失敗した場合はスクリプトのバージョンを記録せず次回に再試行する
- 上記の経路を test-update-app.sh に追加(141 assertions green)
プリンターに到達できないとき、接続が OS 既定のタイムアウトまで
ブロックして会計 API がタイムアウトしていた。

- ReceiptPrinter.print に接続タイムアウトと読み書きタイムアウトを追加
- ReceiptService.printReceiptAsync を新設し、送信のみ専用スレッドへ委譲
- プリンター未設定・店舗なしの場合は送信を依頼せず即座に返す
- 接続タイムアウトを app.receipt.printer.connect-timeout-millis で設定可能に
@github-actions

Copy link
Copy Markdown
Contributor

🎨 Visual Regression Test Results

All visual regression tests passed!

All page screenshots match the expected baselines.

📊 Test Coverage

  • Desktop (1280x720)
  • Tablet (iPad)
  • Mobile (iPhone 13)

最新バージョンはバージョンコードの降順で決まるため、手入力ミスで
実際より大きいコードが登録されると古いAPKが配信され続ける。
バージョン名の新しさとコードの大小が食い違う組み合わせを検出し、
APK管理画面に警告として表示する。
@github-actions

Copy link
Copy Markdown
Contributor

🎨 Visual Regression Test Results

All visual regression tests passed!

All page screenshots match the expected baselines.

📊 Test Coverage

  • Desktop (1280x720)
  • Tablet (iPad)
  • Mobile (iPhone 13)

@Atsumi3
Atsumi3 merged commit 7309eae into main Aug 24, 2026
7 checks passed
@Atsumi3
Atsumi3 deleted the claude/app-jar-release-output-m2pekn branch August 24, 2026 18:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant