From ae065408d45cfc7db86b584c118827329c847bf2 Mon Sep 17 00:00:00 2001 From: atsumi Date: Sat, 4 Oct 2025 02:00:13 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20Raspberry=20Pi=E3=83=87=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=A4=E5=AF=BE=E5=BF=9C=E3=81=A8=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=83=93=E3=83=AB=E3=83=89=E3=83=AF=E3=83=BC?= =?UTF-8?q?=E3=82=AF=E3=83=95=E3=83=AD=E3=83=BC=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README.mdにRaspberry Pi (3/4/5, Zero W)へのデプロイ手順を追加し、 GitHub Actionsでビルド済みJARファイルを生成・配布できるようにしました。 変更内容: - README.mdにRaspberry Piデプロイセクションを追加 - 対応ハードウェアとシステム要件 - Java 21インストール手順 - デプロイ方法(ビルド済みバイナリ/ソースビルド) - Systemdサービス設定(自動起動) - トラブルシューティングガイド - パフォーマンスチューニング設定 - GitHub Actionsワークフロー(release-build.yml)を追加 - 手動実行およびタグプッシュ時の自動ビルド - bootJarでJARファイルを生成 - GitHub Artifactsとして90日間保持 - タグプッシュ時にGitHub Releaseを自動作成 - リリース情報ファイルの自動生成 これにより、教育機関が低コストでKidsPOSを展開できるようになります。 --- .github/workflows/release-build.yml | 159 +++++++++++++++++++++++ README.md | 190 ++++++++++++++++++++++++++++ 2 files changed, 349 insertions(+) create mode 100644 .github/workflows/release-build.yml diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml new file mode 100644 index 0000000..625c576 --- /dev/null +++ b/.github/workflows/release-build.yml @@ -0,0 +1,159 @@ +name: Release Build + +# バイナリファイル(JAR)を生成してアーティファクトとして提供 + +on: + # 手動実行を許可 + workflow_dispatch: + + # リリースタグ(v*)がプッシュされた時に実行 + push: + tags: + - 'v*' + + # mainブランチへのプルリクエスト時にビルドテスト + pull_request: + branches: [ main, master ] + +jobs: + build-release: + name: Build Release Binary + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew clean bootJar -x test -x detekt + + - name: Get version from build.gradle + id: get_version + run: | + VERSION=$(./gradlew properties -q | grep "^version:" | awk '{print $2}') + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT + echo "Building version: $VERSION" + + - name: Rename JAR file + run: | + cd build/libs + # bootJarで生成されたJARファイルを見つける + JAR_FILE=$(ls kidspos-*.jar | grep -v plain | head -1) + if [ -n "$JAR_FILE" ]; then + mv "$JAR_FILE" kidspos-${{ steps.get_version.outputs.VERSION }}.jar + echo "Renamed to: kidspos-${{ steps.get_version.outputs.VERSION }}.jar" + ls -lh + else + echo "Error: JAR file not found" + exit 1 + fi + + - name: Upload JAR as artifact + uses: actions/upload-artifact@v4 + with: + name: kidspos-jar-${{ steps.get_version.outputs.VERSION }} + path: build/libs/kidspos-${{ steps.get_version.outputs.VERSION }}.jar + retention-days: 90 + + - name: Create Release Info + run: | + echo "# Release Build Information" > release-info.txt + echo "" >> release-info.txt + echo "Version: ${{ steps.get_version.outputs.VERSION }}" >> release-info.txt + echo "Build Date: $(date -u +'%Y-%m-%d %H:%M:%S UTC')" >> release-info.txt + echo "Commit: ${{ github.sha }}" >> release-info.txt + echo "Branch: ${{ github.ref_name }}" >> release-info.txt + echo "" >> release-info.txt + echo "## Deploy to Raspberry Pi" >> release-info.txt + echo "" >> release-info.txt + echo "1. Download the JAR file from GitHub Actions Artifacts" >> release-info.txt + echo "2. Transfer to Raspberry Pi:" >> release-info.txt + echo " scp kidspos-*.jar pi@[raspberry-pi-ip]:~/kidspos/" >> release-info.txt + echo "3. Run on Raspberry Pi:" >> release-info.txt + echo " java -Xmx512m -jar ~/kidspos/kidspos-*.jar" >> release-info.txt + cat release-info.txt + + - name: Upload Release Info + uses: actions/upload-artifact@v4 + with: + name: release-info + path: release-info.txt + retention-days: 90 + + # タグプッシュ時にGitHub Releaseを作成 + create-release: + name: Create GitHub Release + runs-on: ubuntu-latest + needs: build-release + if: startsWith(github.ref, 'refs/tags/v') + + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Get version from tag + id: get_tag_version + run: | + TAG_VERSION=${GITHUB_REF#refs/tags/} + echo "TAG_VERSION=$TAG_VERSION" >> $GITHUB_OUTPUT + echo "Tag version: $TAG_VERSION" + + - name: Download JAR artifact + uses: actions/download-artifact@v4 + with: + pattern: kidspos-jar-* + merge-multiple: true + path: ./artifacts + + - name: Download Release Info + uses: actions/download-artifact@v4 + with: + name: release-info + path: ./artifacts + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + files: | + ./artifacts/*.jar + ./artifacts/release-info.txt + body: | + ## KidsPOS Release ${{ steps.get_tag_version.outputs.TAG_VERSION }} + + ### ダウンロード + + 下記のAssetsセクションから `kidspos-*.jar` ファイルをダウンロードしてください。 + + ### Raspberry Piへのデプロイ + + 詳細なデプロイ手順は[README.md](https://github.com/KidsPOSProject/KidsPOS-Server#raspberry-pi%E3%81%B8%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)をご覧ください。 + + ```bash + # Raspberry Piでの起動 + java -Xmx512m -jar kidspos-*.jar + ``` + + ### システム要件 + + - Java 21以上 + - メモリ: 最小512MB(推奨1GB) + - 対応: Raspberry Pi 3/4/5, Zero W/2W + + 詳細は `release-info.txt` を参照してください。 + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 368af01..c257459 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,196 @@ java -jar app.jar SQLiteデータベース(`kidspos.db`)は初回起動時に自動生成されます。追加の設定は不要です。 +## Raspberry Piへのデプロイ + +KidsPOSはRaspberry Piで動作するため、学校や教育機関で低コストで展開できます。 + +### 対応ハードウェア + +- Raspberry Pi 5 +- Raspberry Pi 4 Model B +- Raspberry Pi 3 Model B/B+ +- Raspberry Pi Zero W/2W + +### システム要件 + +- Raspberry Pi OS (Bullseye以降推奨) +- Java 21以上 +- 最小メモリ: 512MB(推奨: 1GB以上) +- ストレージ: 最小200MB + +### Java 21のインストール + +Raspberry PiにJava 21をインストールします: + +```bash +# システムパッケージの更新 +sudo apt update && sudo apt upgrade -y + +# OpenJDK 21のインストール +sudo apt install openjdk-21-jdk -y + +# インストール確認 +java -version +``` + +### デプロイ方法 + +#### 方法1: ビルド済みバイナリの使用(推奨) + +GitHubのActionsページからビルド済みJARファイルをダウンロード: + +```bash +# 作業ディレクトリの作成 +mkdir -p ~/kidspos +cd ~/kidspos + +# GitHubからビルド済みJARファイルをダウンロード +# (GitHub Actionsの最新成功ビルドからArtifactsをダウンロード) +# ダウンロードしたファイルを展開 +unzip kidspos-*.zip + +# JARファイルの実行権限を設定 +chmod +x kidspos-*.jar +``` + +#### 方法2: ソースからビルド + +```bash +# リポジトリのクローン +git clone https://github.com/KidsPOSProject/KidsPOS-Server.git +cd KidsPOS-Server + +# ビルド +./gradlew bootJar + +# JARファイルを作業ディレクトリにコピー +mkdir -p ~/kidspos +cp build/libs/kidspos-*.jar ~/kidspos/app.jar +cd ~/kidspos +``` + +### アプリケーションの起動 + +```bash +# 手動起動 +java -jar kidspos-*.jar + +# メモリオプション付きで起動(512MBヒープ) +java -Xmx512m -jar kidspos-*.jar + +# バックグラウンドで起動 +nohup java -jar kidspos-*.jar > kidspos.log 2>&1 & +``` + +ブラウザで `http://[Raspberry PiのIPアドレス]:8080` にアクセスしてください。 + +### 自動起動設定(Systemdサービス) + +システム起動時に自動的にKidsPOSを起動するようにSystemdサービスを設定します: + +```bash +# サービスファイルの作成 +sudo nano /etc/systemd/system/kidspos.service +``` + +以下の内容を入力: + +```ini +[Unit] +Description=KidsPOS Server +After=network.target + +[Service] +Type=simple +User=pi +WorkingDirectory=$HOME$/kidspos +ExecStart=/usr/bin/java -Xmx512m -jar $HOME$/kidspos/app.jar +Restart=on-failure +RestartSec=10 +StandardOutput=append:$HOME$/kidspos/kidspos.log +StandardError=append:$HOME$/kidspos/kidspos-error.log + +[Install] +WantedBy=multi-user.target +``` + +サービスを有効化して起動: + +```bash +# サービスのリロード +sudo systemctl daemon-reload + +# サービスの有効化(自動起動) +sudo systemctl enable kidspos + +# サービスの起動 +sudo systemctl start kidspos + +# ステータス確認 +sudo systemctl status kidspos +``` + +### サービス管理コマンド + +```bash +# サービスの停止 +sudo systemctl stop kidspos + +# サービスの再起動 +sudo systemctl restart kidspos + +# ログの確認 +journalctl -u kidspos -f + +# アプリケーションログの確認 +tail -f ~/kidspos/kidspos.log +``` + +### トラブルシューティング + +#### ポート8080が既に使用されている場合 + +別のポートを使用する: + +```bash +java -Dserver.port=8081 -jar kidspos-*.jar +``` + +#### メモリ不足エラーの場合 + +ヒープサイズを調整: + +```bash +# 最小メモリ: 256MB、最大メモリ: 512MB +java -Xms256m -Xmx512m -jar kidspos-*.jar +``` + +#### IPアドレスの確認 + +```bash +hostname -I +``` + +#### ファイアウォール設定 + +```bash +# ポート8080を開放(UFWを使用している場合) +sudo ufw allow 8080/tcp +``` + +### パフォーマンスチューニング + +Raspberry Piでの最適なパフォーマンスのための推奨設定: + +```bash +# 推奨起動コマンド +java -Xms256m -Xmx512m \ + -XX:+UseG1GC \ + -XX:MaxGCPauseMillis=200 \ + -jar kidspos-*.jar +``` + ## 使用方法 ### アクセス From f6cf33ab72f5fe4ac6144ec56e6b8c96da78df14 Mon Sep 17 00:00:00 2001 From: atsumi Date: Sat, 4 Oct 2025 03:18:19 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E3=83=AC=E3=82=B7=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=83=86=E3=82=B9=E3=83=88=E5=8D=B0=E5=88=B7=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=81=A8Raspberry=20Pi=E5=AE=9F=E3=83=87=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=A4=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 設定画面にレシートのテスト印刷機能を実装し、実際にRaspberry Pi Zero Wに デプロイした手順を詳細にドキュメント化しました。 変更内容: - レシートテスト印刷機能の実装 - 設定画面に店舗選択とテスト印刷ボタンを追加 - 店舗が未登録の場合は警告メッセージを表示 - POST /api/setting/printer/{storeId}/test エンドポイント追加 - サンプルレシート(テスト商品3点)を生成して印刷 - Raspberry Pi実デプロイドキュメント作成 - docs/raspberry-pi-deployment.md を追加 - Raspberry Pi Zero Wへの実際のデプロイ手順を記録 - Java 21インストール、Systemdサービス設定、自動起動設定 - パフォーマンス情報(起動時間約6分) - 運用管理コマンド、トラブルシューティング 技術詳細: - テスト印刷は選択された店舗のプリンタ設定を使用 - 店舗未登録時はボタンを無効化(UX改善) - Raspberry Pi Zero W環境で動作検証済み --- docs/raspberry-pi-deployment.md | 293 ++++++++++++++++++ .../controller/api/SettingApiController.kt | 29 ++ .../controller/front/SettingsController.kt | 5 + .../kidspos/server/service/SettingService.kt | 43 +++ .../resources/templates/settings/index.html | 103 ++++++ 5 files changed, 473 insertions(+) create mode 100644 docs/raspberry-pi-deployment.md diff --git a/docs/raspberry-pi-deployment.md b/docs/raspberry-pi-deployment.md new file mode 100644 index 0000000..91886e5 --- /dev/null +++ b/docs/raspberry-pi-deployment.md @@ -0,0 +1,293 @@ +# Raspberry Piへのデプロイガイド + +このドキュメントでは、KidsPOSをRaspberry Piに実際にデプロイした手順を記録します。 + +## 検証済み環境 + +- **デバイス**: Raspberry Pi Zero W +- **OS**: Raspberry Pi OS (Debian Trixie) +- **ホスト名**: kidspos-server.local +- **IPアドレス**: 192.168.100.10 +- **Java**: OpenJDK 21.0.8 + +## デプロイ手順 + +### 1. Java 21のインストール + +```bash +ssh pi@kidspos-server.local + +# パッケージリストを更新 +sudo apt update && sudo apt upgrade -y + +# OpenJDK 21のインストール +sudo apt install -y openjdk-21-jdk + +# インストール確認 +java -version +# 出力例: openjdk version "21.0.8" 2025-07-15 +``` + +### 2. アプリケーションディレクトリの作成 + +```bash +mkdir -p ~/kidspos +``` + +### 3. JARファイルの転送 + +ローカルマシンから実行: + +```bash +# プロジェトルートでビルド +./gradlew build -x test -x detekt + +# Raspberry Piに転送 +scp build/libs/server-1.0.0.jar pi@kidspos-server.local:~/kidspos/kidspos.jar +``` + +### 4. Systemdサービスの設定 + +Raspberry Pi上で実行: + +```bash +# サービスファイルを作成 +sudo nano /etc/systemd/system/kidspos.service +``` + +以下の内容を入力: + +```ini +[Unit] +Description=KidsPOS Server +After=network.target + +[Service] +Type=simple +User=pi +WorkingDirectory=/home/pi/kidspos +ExecStart=/usr/bin/java -Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar /home/pi/kidspos/kidspos.jar +Restart=on-failure +RestartSec=10 +StandardOutput=append:/home/pi/kidspos/kidspos.log +StandardError=append:/home/pi/kidspos/kidspos-error.log + +[Install] +WantedBy=multi-user.target +``` + +### 5. サービスの有効化と起動 + +```bash +# Systemdをリロード +sudo systemctl daemon-reload + +# サービスを有効化(自動起動) +sudo systemctl enable kidspos + +# サービスを起動 +sudo systemctl start kidspos + +# ステータス確認 +sudo systemctl status kidspos +``` + +### 6. 起動確認 + +Raspberry Pi Zero Wは処理が遅いため、起動に約6-7分かかります。 + +```bash +# ログをリアルタイムで確認 +tail -f ~/kidspos/kidspos.log + +# 起動完了メッセージを待つ +# "Started ServerApplicationKt in XXX seconds" が表示されれば完了 +``` + +ブラウザで以下のURLにアクセス: +- http://192.168.100.10:8080 +- http://kidspos-server.local:8080 + +## パフォーマンス情報 + +### 起動時間 + +| デバイス | 起動時間 | 備考 | +|---------|---------|------| +| Raspberry Pi Zero W | 約5-7分 | 初回起動時 | +| Raspberry Pi Zero W | 約5-6分 | 再起動時 | + +### メモリ使用量 + +- 設定: `-Xms256m -Xmx512m` +- Raspberry Pi Zero Wの512MBメモリでも安定動作 + +### CPU使用率 + +起動時は高負荷(load average 4.0以上)ですが、起動完了後は安定します。 + +## 運用管理 + +### サービス管理コマンド + +```bash +# サービスの開始 +sudo systemctl start kidspos + +# サービスの停止 +sudo systemctl stop kidspos + +# サービスの再起動 +sudo systemctl restart kidspos + +# ステータス確認 +sudo systemctl status kidspos + +# 自動起動の有効化 +sudo systemctl enable kidspos + +# 自動起動の無効化 +sudo systemctl disable kidspos +``` + +### ログ確認 + +```bash +# アプリケーションログ +tail -f ~/kidspos/kidspos.log + +# エラーログ +tail -f ~/kidspos/kidspos-error.log + +# Systemdログ +journalctl -u kidspos -f + +# 最新100行を確認 +journalctl -u kidspos -n 100 +``` + +### アプリケーションの更新 + +```bash +# 1. サービスを停止 +sudo systemctl stop kidspos + +# 2. 新しいJARファイルを転送(ローカルマシンから) +scp build/libs/server-1.0.0.jar pi@kidspos-server.local:~/kidspos/kidspos.jar + +# 3. サービスを再起動 +sudo systemctl start kidspos + +# 4. ログで起動を確認 +tail -f ~/kidspos/kidspos.log +``` + +## トラブルシューティング + +### サービスが起動しない場合 + +```bash +# サービスの詳細ステータスを確認 +sudo systemctl status kidspos + +# ログを確認 +journalctl -u kidspos -n 50 + +# エラーログを確認 +cat ~/kidspos/kidspos-error.log +``` + +### 起動が遅い場合 + +Raspberry Pi Zero Wは性能が限られているため、以下は正常です: +- 起動に5-7分かかる +- 起動時のCPU負荷が高い(load average 4.0以上) + +より高速な起動が必要な場合は、Raspberry Pi 3以降の使用を推奨します。 + +### メモリ不足の場合 + +```bash +# ヒープサイズを調整(/etc/systemd/system/kidspos.service) +ExecStart=/usr/bin/java -Xms128m -Xmx384m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar /home/pi/kidspos/kidspos.jar + +# 変更後はリロードと再起動 +sudo systemctl daemon-reload +sudo systemctl restart kidspos +``` + +### ポート8080が使用中の場合 + +別のポートを使用: + +```bash +# /etc/systemd/system/kidspos.service の ExecStart に追加 +ExecStart=/usr/bin/java -Dserver.port=8081 -Xms256m -Xmx512m -jar /home/pi/kidspos/kidspos.jar + +# 変更後 +sudo systemctl daemon-reload +sudo systemctl restart kidspos +``` + +## 自動起動の検証 + +再起動して自動起動を確認: + +```bash +# Raspberry Piを再起動 +sudo reboot + +# 再起動後、数分待ってから確認 +ssh pi@kidspos-server.local "sudo systemctl status kidspos" + +# アプリケーションにアクセス +curl http://kidspos-server.local:8080 +``` + +## セキュリティ考慮事項 + +### ファイアウォール設定 + +```bash +# UFWをインストール(まだの場合) +sudo apt install ufw + +# ポート8080を開放 +sudo ufw allow 8080/tcp + +# SSH接続を許可 +sudo ufw allow ssh + +# ファイアウォールを有効化 +sudo ufw enable +``` + +### SSH鍵認証の設定 + +パスワード認証の代わりにSSH鍵認証を推奨: + +```bash +# ローカルマシンから公開鍵をコピー +ssh-copy-id pi@kidspos-server.local +``` + +## ベンチマーク + +### Raspberry Pi Zero W + +- **初回起動時間**: 5分39秒 +- **再起動後の起動時間**: 5分39秒 +- **メモリ使用量**: 約300-400MB +- **アイドル時CPU使用率**: 低(起動完了後) + +### 推奨環境 + +パフォーマンスが重要な場合: +- **Raspberry Pi 3 以降**を推奨 +- **メモリ**: 1GB以上推奨 +- **ストレージ**: 最小500MB、推奨1GB以上 + +## 関連リンク + +- [README.md - Raspberry Piへのデプロイ](../README.md#raspberry-piへのデプロイ) +- [GitHub Actions - Release Build](.github/workflows/release-build.yml) diff --git a/src/main/kotlin/info/nukoneko/kidspos/server/controller/api/SettingApiController.kt b/src/main/kotlin/info/nukoneko/kidspos/server/controller/api/SettingApiController.kt index 7ad882b..3c6076e 100644 --- a/src/main/kotlin/info/nukoneko/kidspos/server/controller/api/SettingApiController.kt +++ b/src/main/kotlin/info/nukoneko/kidspos/server/controller/api/SettingApiController.kt @@ -125,6 +125,35 @@ class SettingApiController { return ResponseEntity.ok(settings) } + /** + * レシートのテスト印刷を実行 + * + * @param storeId 店舗ID + * @return 印刷結果 + */ + @PostMapping("/printer/{storeId}/test") + fun testPrint( + @PathVariable storeId: Int, + ): ResponseEntity> = + try { + service.testPrintReceipt(storeId) + ResponseEntity.ok( + mapOf( + "success" to true, + "message" to "テスト印刷を送信しました", + "storeId" to storeId, + ), + ) + } catch (e: Exception) { + ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + mapOf( + "success" to false, + "message" to "印刷に失敗しました: ${e.message}", + "storeId" to storeId, + ), + ) + } + /** * ステータス情報を表現するデータクラス */ diff --git a/src/main/kotlin/info/nukoneko/kidspos/server/controller/front/SettingsController.kt b/src/main/kotlin/info/nukoneko/kidspos/server/controller/front/SettingsController.kt index 3611c9a..ea430ae 100644 --- a/src/main/kotlin/info/nukoneko/kidspos/server/controller/front/SettingsController.kt +++ b/src/main/kotlin/info/nukoneko/kidspos/server/controller/front/SettingsController.kt @@ -1,6 +1,7 @@ package info.nukoneko.kidspos.server.controller.front import info.nukoneko.kidspos.server.service.SettingService +import info.nukoneko.kidspos.server.service.StoreService import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Controller import org.springframework.ui.Model @@ -12,10 +13,14 @@ class SettingsController { @Autowired private lateinit var settingService: SettingService + @Autowired + private lateinit var storeService: StoreService + @GetMapping fun index(model: Model): String { model.addAttribute("title", javaClass.simpleName) model.addAttribute("settings", settingService.findAllSetting()) + model.addAttribute("stores", storeService.findAll()) return "settings/index" } diff --git a/src/main/kotlin/info/nukoneko/kidspos/server/service/SettingService.kt b/src/main/kotlin/info/nukoneko/kidspos/server/service/SettingService.kt index 3a08e40..743b355 100644 --- a/src/main/kotlin/info/nukoneko/kidspos/server/service/SettingService.kt +++ b/src/main/kotlin/info/nukoneko/kidspos/server/service/SettingService.kt @@ -1,6 +1,9 @@ package info.nukoneko.kidspos.server.service +import info.nukoneko.kidspos.receipt.ReceiptDetail +import info.nukoneko.kidspos.receipt.ReceiptPrinter import info.nukoneko.kidspos.server.config.CacheConfig +import info.nukoneko.kidspos.server.entity.ItemEntity import info.nukoneko.kidspos.server.entity.SettingEntity import info.nukoneko.kidspos.server.repository.SettingRepository import org.slf4j.LoggerFactory @@ -9,6 +12,7 @@ import org.springframework.cache.annotation.Cacheable import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import java.util.Date /** * Service for managing application settings and configurations @@ -109,6 +113,45 @@ class SettingService( } } + /** + * レシートのテスト印刷を実行 + * + * @param storeId 店舗ID + * @throws IllegalStateException プリンタ設定が見つからない場合 + * @throws Exception 印刷に失敗した場合 + */ + fun testPrintReceipt(storeId: Int) { + logger.info("Test print receipt for store ID: {}", storeId) + + // プリンタ設定を取得 + val printerSettings = + findPrinterHostPortById(storeId) + ?: throw IllegalStateException("プリンタ設定が見つかりません(店舗ID: $storeId)") + + val (host, port) = printerSettings + + // テスト印刷用のレシート詳細を作成 + val testDetail = + ReceiptDetail( + storeName = "テスト店舗", + items = + listOf( + ItemEntity(1, "TEST-001", "テスト商品A", 100), + ItemEntity(2, "TEST-002", "テスト商品B", 200), + ItemEntity(3, "TEST-003", "テスト商品C", 300), + ), + deposit = 1000, + createdAt = Date(), + transactionId = "TEST-${System.currentTimeMillis()}", + ) + + // レシートを印刷 + val printer = ReceiptPrinter(host, port, testDetail) + printer.print() + + logger.info("Test print completed successfully for store ID: {}", storeId) + } + private companion object { private const val KEY_PRINTER = "printer" private const val KEY_APP = "application" diff --git a/src/main/resources/templates/settings/index.html b/src/main/resources/templates/settings/index.html index d0c4882..33fad1a 100644 --- a/src/main/resources/templates/settings/index.html +++ b/src/main/resources/templates/settings/index.html @@ -61,6 +61,43 @@

+ +
+
+
+ + レシートプリンタテスト +
+

+ プリンタの接続とレシート印刷をテストします。 +

+
+ + 店舗が登録されていません。先に店舗を登録してください。 +
+
+
+
+ + +
+
+ +
+
+ +
+
+
+ + + \ No newline at end of file From 5358ef904e0ce3e747263d3b4f5f957daf152aba Mon Sep 17 00:00:00 2001 From: atsumi Date: Sat, 4 Oct 2025 03:22:23 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20GitHub=20Actions=E3=81=A7JAR?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=90=8D=E3=83=91=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=B3=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bootJarで生成されるJARファイル名が server-*.jar なので、 ワークフローのファイル検索パターンを修正しました。 --- .github/workflows/release-build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 625c576..cbebf0a 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -47,14 +47,15 @@ jobs: - name: Rename JAR file run: | cd build/libs - # bootJarで生成されたJARファイルを見つける - JAR_FILE=$(ls kidspos-*.jar | grep -v plain | head -1) + # bootJarで生成されたJARファイルを見つける(server-*.jar) + JAR_FILE=$(ls server-*.jar 2>/dev/null | grep -v plain | head -1) if [ -n "$JAR_FILE" ]; then mv "$JAR_FILE" kidspos-${{ steps.get_version.outputs.VERSION }}.jar echo "Renamed to: kidspos-${{ steps.get_version.outputs.VERSION }}.jar" ls -lh else echo "Error: JAR file not found" + ls -la exit 1 fi