# ロゲイニングシステム 操作マニュアル

## 📋 目次

1. [システム概要](#システム概要)
2. [基本操作](#基本操作)
3. [チーム管理機能](#チーム管理機能)
4. [イベント管理機能](#イベント管理機能)
5. [チェックポイント管理機能](#チェックポイント管理機能)
6. [GPS位置情報管理](#gps位置情報管理)
7. [スコアボード・ランキング機能](#スコアボードランキング機能)
8. [データ編集・管理機能](#データ編集管理機能)
9. [管理画面操作](#管理画面操作)
10. [トラブルシューティング](#トラブルシューティング)

---

## 📊 システム概要

### 🎯 統合システムの特徴

- **統合データベース**: Django + PostGIS統合データベース
- **REST API**: 完全REST API対応（8,165行の実装）
- **地理情報**: PostGIS空間データベース対応
- **リアルタイム**: GPS位置情報リアルタイム追跡
- **管理機能**: Web管理画面 + API管理
- **フロントエンド**: スーパーバイザー管理画面完備

### 📊 データ統合状況

| 機能 | 統合件数 | 状況 |
|------|----------|------|
| イベント | 64件 | ✅ 完全統合 |
| チーム | 1,088件 | ✅ 完全統合 |
| チェックポイント | 2,020件 | ✅ 完全統合 |
| GPS位置情報 | 12,352件 | ✅ 完全統合 |

### 🖥️ 実装済みフロントエンド機能

| 画面 | URL | 機能 |
|------|-----|------|
| **ランキング表示** | `/supervisor/html/ranking.html` | リアルタイムランキング、TOP3表示 |
| **リアルタイムモニター** | `/supervisor/html/realtime_monitor.html` | GPS追跡、ルート表示、地図表示 |
| **チェックイン編集** | `/supervisor/html/index.html` | 通過審査、編集、管理 |
| **写真審査** | `/supervisor/html/view_photo_list2.html` | 写真審査、承認 |
| **証明書印刷** | API + PDF生成 | プレビュー機能付きスコアボード、通過証明書 |

---

## 🌐 システムアクセス情報

### 💻 Web管理画面URL

| 画面 | URL | 説明 |
|------|-----|------|
| **Django管理画面** | `http://localhost:8100/admin/` | システム管理、データベース管理 |
| **スーパーバイザー管理画面** | `http://localhost:8100/` | フロントエンド操作画面 |
| **API エンドポイント** | `http://localhost:8100/api/` | REST API インターフェース |

### 🔑 ログイン情報

#### Django管理画面 (`/admin/`)
- **Email**: `admin@sumasen.net`
- **Password**: (設定済み)
- **管理者ユーザー数**: 1名
- **一般ユーザー数**: 1,105名

#### 📝 管理者パスワード変更手順

管理者ユーザー(`admin@sumasen.net`)のパスワードを変更する場合：

```bash
# 1. プロジェクトディレクトリに移動
cd /Volumes/PortableSSD1TB/main/GifuTabi/rogaining_srv_exdb-2/rogaining_srv

# 2. Djangoパスワード変更コマンドを実行
docker compose exec app python manage.py changepassword admin@sumasen.net
```

**コマンド実行手順**:
1. 上記コマンドを実行すると対話式プロンプトが表示
2. **新しいパスワード**を入力（入力は表示されません）
3. **パスワード確認**で同じパスワードを再入力
4. `Password changed successfully for user 'admin@sumasen.net'` が表示されれば完了

**注意事項**:
- パスワードはセキュリティのため画面に表示されません
- パスワード変更後は新しいパスワードで管理画面にログインしてください
- パスワード変更履歴は自動的にログに記録されます

#### データベース直接接続
- **Host**: `localhost:5432`
- **User**: `admin`
- **Password**: `admin123456`
- **Database**: `rogdb`

### 🔧 Docker環境情報

| サービス | ポート | 説明 |
|----------|--------|------|
| **nginx** | 8100 | Webプロキシサーバー |
| **app** | 内部8000 | Django アプリケーション |
| **postgres-db** | 5432 | PostgreSQL + PostGIS |

---

## 基本操作

### 🚀 システム起動

```bash
# システム起動
cd /path/to/rogaining_srv
docker compose up -d

# 起動確認
docker compose ps
```

### 🌐 アクセスURL

| 機能 | URL | 説明 |
|------|-----|------|
| **スーパーバイザー画面** | `http://localhost:8100/` | チェックイン管理、リアルタイム監視 |
| **Django管理画面** | `http://localhost:8100/admin/` | システム管理、データベース管理 |
| **REST API** | `http://localhost:8100/api/` | RESTful API エンドポイント |

### 🔐 ログイン情報

| システム | ユーザー名 | パスワード | 説明 |
|----------|------------|------------|------|
| **Django管理画面** | `admin@sumasen.net` | (設定済み) | スーパーユーザー |
| **スーパーバイザー画面** | `admin@sumasen.net` | (設定済み) | API経由ログイン |
| **データベース直接** | `admin` | `admin123456` | PostgreSQL接続 |

**注意**: スーパーバイザー画面は Django管理ユーザーと同じ認証情報を使用します。

---

## チーム管理機能

### 📝 チーム登録

#### API経由での登録

```bash
# 新規チーム登録
curl -X POST "http://localhost:8000/api/teams/register_team/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "team_name": "サンプルチーム",
    "password": "team123",
    "event_code": "sample_event",
    "class_name": "3時間"
  }'
```

#### 管理画面での登録

1. **管理画面アクセス**: http://localhost:8000/admin/
2. **ログイン**: admin / admin123456
3. **Teams** → **追加**
4. **必須項目入力**:
   - チーム名
   - ゼッケン番号
   - イベント選択
   - カテゴリ選択

### 🔍 チーム検索・一覧

#### API経由

```bash
# 全チーム一覧
curl "http://localhost:8000/api/teams/"

# イベント別チーム一覧
curl "http://localhost:8000/api/teams/?event=イベント名"

# ゼッケン番号検索
curl "http://localhost:8000/api/teams/?zekken_number=1001"
```

#### 管理画面

1. **Teams** → **チーム一覧**
2. **フィルタ機能**:
   - イベント別
   - カテゴリ別
   - ゼッケン番号範囲

### ✏️ チーム情報更新

#### チーム名変更

```bash
# API経由でチーム名変更
curl -X POST "http://localhost:8000/api/teams/update_team_name/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "new_team_name": "新チーム名"
  }'
```

#### クラス変更

```bash
# チームクラス変更
curl -X POST "http://localhost:8000/api/teams/team_class_changer/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "new_class": "5時間"
  }'
```

---

## イベント管理機能

### 🎪 イベント作成

#### 管理画面での作成

1. **NewEvent2** → **追加**
2. **基本情報入力**:
   - イベント名
   - 開始日時
   - 終了日時
   - 申込締切日時
3. **詳細設定**:
   - 公開設定
   - 3時間/5時間クラス設定
   - カテゴリ設定（一般/ファミリー/男女別）

#### API経由での作成

```bash
# 新規イベント作成
curl -X POST "http://localhost:8000/api/events/" \
  -H "Content-Type: application/json" \
  -d '{
    "event_name": "第1回サンプルロゲイニング",
    "event_code": "sample_event_2025",
    "start_datetime": "2025-09-15T09:00:00Z",
    "end_datetime": "2025-09-15T14:00:00Z",
    "deadlineDateTime": "2025-09-10T23:59:59Z",
    "public": true,
    "hour_3": true,
    "hour_5": true
  }'
```

### 📅 イベント一覧・管理

#### イベント状況確認

```bash
# 全イベント一覧
curl "http://localhost:8000/api/events/"

# 公開イベントのみ
curl "http://localhost:8000/api/events/?public=true"

# アクティブイベント
curl "http://localhost:8000/api/events/active/"
```

#### イベント詳細情報

```bash
# 特定イベントの詳細
curl "http://localhost:8000/api/events/1/"

# イベント参加チーム数
curl "http://localhost:8000/api/events/1/teams/"
```

---

## チェックポイント管理機能

### 📍 チェックポイント登録

#### 基本登録

```bash
# チェックポイント登録
curl -X POST "http://localhost:8000/api/checkpoints/" \
  -H "Content-Type: application/json" \
  -d '{
    "cp_number": 1,
    "event": 1,
    "cp_name": "岐阜駅前",
    "location": {
      "type": "Point",
      "coordinates": [136.7581, 35.4091]
    },
    "photo_point": 10,
    "buy_point": 20
  }'
```

#### 管理画面での登録

1. **Checkpoints** → **追加**
2. **基本情報**:
   - CP番号
   - CP名
   - イベント選択
3. **位置情報**:
   - 緯度・経度入力
   - 地図上で位置指定
4. **ポイント設定**:
   - 写真ポイント
   - 買い物ポイント

### 🗺️ チェックポイント一覧・検索

#### 地理的検索

```bash
# 範囲内チェックポイント検索
curl "http://localhost:8000/api/checkpoints/nearby/" \
  -G -d "lat=35.4091" -d "lng=136.7581" -d "radius=1000"

# イベント別チェックポイント
curl "http://localhost:8000/api/checkpoints/?event=1"
```

#### 管理画面での管理

1. **Checkpoints** → **一覧**
2. **地図表示**: 位置情報の視覚的確認
3. **フィルタ機能**:
   - イベント別
   - CP番号範囲
   - ポイント設定別

---

## GPS位置情報管理

### 📱 チェックイン登録

#### アプリからのチェックイン

```bash
# チェックポイント通過登録
curl -X POST "http://localhost:8000/api/checkins/input_cp/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "cp_number": 1,
    "image_address": "https://example.com/photo.jpg",
    "latitude": 35.4091,
    "longitude": 136.7581,
    "buy_flag": false
  }'
```

#### ゴール登録

```bash
# ゴール登録
curl -X POST "http://localhost:8000/api/checkins/goal_from_rogapp/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "goal_time": "2025-09-15T13:45:00Z",
    "image_address": "https://example.com/goal.jpg"
  }'
```

### 📊 GPS追跡・モニタリング

#### リアルタイム位置確認

```bash
# チーム位置情報取得
curl "http://localhost:8000/api/monitor/team_location/" \
  -G -d "zekken_number=1001" -d "event_code=sample_event"

# 全チーム位置一覧
curl "http://localhost:8000/api/monitor/all_teams/" \
  -G -d "event_code=sample_event"
```

#### チェックイン履歴

```bash
# チェックイン履歴取得
curl "http://localhost:8000/api/checkins/history/" \
  -G -d "zekken_number=1001" -d "event_code=sample_event"
```

---

## スコアボード・ランキング機能

### 🏆 スコア計算

#### リアルタイムランキング

```bash
# 現在のランキング取得
curl "http://localhost:8000/api/ranking/current/" \
  -G -d "event_code=sample_event"

# カテゴリ別ランキング
curl "http://localhost:8000/api/ranking/by_category/" \
  -G -d "event_code=sample_event" -d "class_name=3時間"

# 上位3位のみ
curl "http://localhost:8000/api/ranking/top3/" \
  -G -d "event_code=sample_event"
```

#### 個別スコア確認

```bash
# 特定チームのスコア詳細
curl "http://localhost:8000/api/ranking/team_score/" \
  -G -d "zekken_number=1001" -d "event_code=sample_event"
```

### 📊 スコアボード生成

#### PDF生成

```bash
# スコアボード生成
curl -X POST "http://localhost:8000/api/scoreboard/generate/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "format": "pdf"
  }'
```

#### Excel出力

```bash
# Excel形式でエクスポート
curl -X POST "http://localhost:8000/api/export/excel/" \
  -H "Content-Type: application/json" \
  -d '{
    "event_code": "sample_event",
    "format": "ranking"
  }'
```

---

## データ編集・管理機能

### ✏️ チェックイン編集

#### チェックイン削除

```bash
# チェックイン削除
curl -X DELETE "http://localhost:8000/api/edit/delete_checkin/" \
  -H "Content-Type: application/json" \
  -d '{
    "checkin_id": 123,
    "zekken_number": "1001",
    "event_code": "sample_event"
  }'
```

#### チェックイン追加

```bash
# 手動チェックイン追加
curl -X POST "http://localhost:8000/api/edit/add_checkin/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "cp_number": 5,
    "checkin_time": "2025-09-15T12:30:00Z",
    "reason": "手動追加"
  }'
```

#### ゴール時刻変更

```bash
# ゴール時刻修正
curl -X POST "http://localhost:8000/api/edit/change_goal_time/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event",
    "new_goal_time": "2025-09-15T13:50:00Z"
  }'
```

### 🔧 サービスチェック

#### 未承認チェックイン管理

```bash
# 未承認チェックイン一覧
curl "http://localhost:8000/api/edit/pending_checkins/" \
  -G -d "event_code=sample_event"

# チェックイン承認
curl -X POST "http://localhost:8000/api/edit/approve_checkin/" \
  -H "Content-Type: application/json" \
  -d '{
    "checkin_id": 123,
    "approved": true
  }'
```

---

## 管理画面操作

### 🖥️ Django管理画面

#### アクセス・ログイン手順

1. **URL**: `http://localhost:8100/admin/`
2. **ログイン情報**:
   - **Email**: `admin@sumasen.net`
   - **Password**: (設定済みパスワード)
3. **認証方式**: カスタムユーザーモデル（Email認証）

> **⚠️ 注意**: 新しい統合システムではポート8100番を使用し、Nginx経由でアクセスします。

#### 主要機能

**📁 データ管理**
- **イベント管理**: NewEvent2（64件統合済み）
- **チーム管理**: Team, Member（1,088件統合済み）
- **カテゴリ管理**: NewCategory
- **チェックポイント**: Checkpoint（2,020件統合済み）
- **GPS情報**: GpsCheckin（12,352件統合済み）

**👥 ユーザー管理**
- **ユーザー一覧**: CustomUser（1,105名登録済み）
- **権限管理**: Groups, Permissions
- **管理者**: 1名（admin@sumasen.net）

**📊 データ分析**
- **参加統計**: Entry
- **位置情報**: Location, GpsCheckin
- **チェックイン履歴**: GpsCheckin

### 🎮 スーパーバイザー管理画面

#### フロントエンド管理画面（実装済み）

**📍 アクセスURL**
- **メイン管理画面**: `http://localhost:8100/supervisor/html/index.html`
- **ランキング表示**: `http://localhost:8100/supervisor/html/ranking.html`
- **リアルタイムモニター**: `http://localhost:8100/supervisor/html/realtime_monitor.html`
- **写真審査**: `http://localhost:8100/supervisor/html/view_photo_list2.html`

#### 🏆 ランキング表示画面

**機能説明**: リアルタイムランキング表示・管理

**アクセス方法**:
```bash
# ブラウザでアクセス
open http://localhost:8100/supervisor/html/ranking.html
```

**主要機能**:
- ✅ **リアルタイムランキング表示**
- ✅ **イベント選択**
- ✅ **クラス別表示**（3時間/5時間）
- ✅ **TOP3表示切り替え**
- ✅ **チーム状況表示**（完走/途中リタイア/参加中）

**操作手順**:
1. イベント選択ドロップダウンから対象イベントを選択
2. クラス選択で表示対象を絞り込み
3. 「TOP3表示」ボタンで表示モード切り替え
4. 自動更新でリアルタイム反映

#### 🗺️ リアルタイムモニター画面

**機能説明**: GPS位置情報リアルタイム追跡・ルート表示

**アクセス方法**:
```bash
# ブラウザでアクセス
open http://localhost:8100/supervisor/html/realtime_monitor.html
```

**主要機能**:
- ✅ **リアルタイム位置追跡**
- ✅ **通過ルート表示**
- ✅ **地図上でのチーム位置表示**
- ✅ **アニメーション表示**
- ✅ **ユーザー別経路表示**
- ✅ **Leaflet地図統合**

**操作手順**:
1. イベント選択でモニタリング対象設定
2. 地図上でチーム位置をリアルタイム確認
3. 「アニメーション表示」で移動経路のアニメーション再生
4. 「ユーザーごとの経路表示」で個別チーム追跡

#### ✏️ チェックイン編集画面

**機能説明**: チェックイン情報の編集・審査・管理

**アクセス方法**:
```bash
# メイン管理画面経由
open http://localhost:8100/supervisor/html/index.html
```

**主要機能**:
- ✅ **チェックイン一覧表示**
- ✅ **通過審査管理**
- ✅ **チェックイン編集・削除**
- ✅ **手動チェックイン追加**
- ✅ **ゴール時刻修正**
- ✅ **サービスチェック承認**
- ✅ **ドラッグ&ドロップによる順序変更**

**操作手順**:
1. ログイン（ユーザー名・パスワード入力）
2. イベントコード選択
3. ゼッケン番号選択
4. チェックイン一覧で編集対象を選択
5. 編集・削除・承認操作を実行

#### 📸 写真審査画面

**機能説明**: チェックイン写真の審査・承認

**アクセス方法**:
```bash
# 写真審査画面
open http://localhost:8000/supervisor/html/view_photo_list2.html
```

**主要機能**:
- ✅ **チェックイン写真一覧**
- ✅ **写真審査・承認**
- ✅ **位置情報確認**
- ✅ **不正写真の検出・削除**

#### 📊 証明書・スコアボード印刷

**機能説明**: 通過証明書とスコアボードのPDF生成

**スーパーバイザー画面での印刷** ⭐NEW⭐:

通過証明書の印刷機能が2つのボタンに分かれています：

1. **プレビューボタン** (黄色)
   - ゼッケン番号とイベントコードを選択
   - 「プレビュー」ボタンをクリック
   - 新しいウィンドウでPDFプレビュー表示
   - 印刷ダイアログは表示されません
   - 内容確認用

2. **通過証明書印刷ボタン** (緑色)
   - ゼッケン番号とイベントコードを選択
   - 「通過証明書印刷」ボタンをクリック
   - 新しいウィンドウでPDF表示
   - 自動的に印刷ダイアログが表示
   - 実際の印刷用

**推奨フロー**:
```
1. プレビューで内容確認 → 2. 問題なければ印刷実行
```

**API経由での印刷**:
```bash
# スコアボードPDF生成
curl -X POST "http://localhost:8000/api/scoreboard/generate_pdf/" \
  -H "Content-Type: application/json" \
  -d '{
    "zekken_number": "1001",
    "event_code": "sample_event"
  }'

# Excel形式スコアボード
curl -X GET "http://localhost:8000/api/scoreboard/getScoreboard/" \
  -G -d "zekken_number=1001" -d "event_code=sample_event"
```

**管理画面での印刷**:
1. **Django管理画面** → **GpsCheckin**
2. 対象チェックインを選択
3. **Actions** → **証明書生成**
4. PDF形式でダウンロード

**印刷可能な書類**:
- ✅ **個人スコアボード**（PDF/Excel）
- ✅ **通過証明書**
- ✅ **総合ランキング表**
- ✅ **クラス別ランキング**
- ✅ **チェックイン履歴一覧**

### 🔍 検索・フィルタ機能

#### 高度な検索

```bash
# 複合条件検索
curl "http://localhost:8000/api/teams/" \
  -G -d "event__event_name=sample_event" \
     -d "category__category_name=3時間" \
     -d "created_at__gte=2025-09-01"
```

#### 地理的検索

```bash
# 範囲内検索
curl "http://localhost:8000/api/checkpoints/in_bounds/" \
  -G -d "north=35.5" -d "south=35.3" \
     -d "east=136.9" -d "west=136.6"
```

---

## API リファレンス

## 🔗 主要エンドポイント

#### 認証・ユーザー管理
```
POST /api/auth/login/          # ログイン
POST /api/auth/register/       # ユーザー登録
POST /api/auth/logout/         # ログアウト
```

#### チーム管理
```
GET    /api/teams/             # チーム一覧
POST   /api/teams/             # チーム作成
GET    /api/teams/{id}/        # チーム詳細
PUT    /api/teams/{id}/        # チーム更新
DELETE /api/teams/{id}/        # チーム削除
```

#### イベント管理
```
GET    /api/events/            # イベント一覧
POST   /api/events/            # イベント作成
GET    /api/events/{id}/       # イベント詳細
PUT    /api/events/{id}/       # イベント更新
```

#### チェックポイント管理
```
GET    /api/checkpoints/       # CP一覧
POST   /api/checkpoints/       # CP作成
GET    /api/checkpoints/{id}/  # CP詳細
PUT    /api/checkpoints/{id}/  # CP更新
```

#### GPS・チェックイン
```
POST   /api/checkins/input_cp/     # チェックイン
GET    /api/checkins/history/      # 履歴取得
POST   /api/checkins/goal/         # ゴール登録
```

#### ランキング・スコア
```
GET    /api/ranking/current/       # 現在ランキング
GET    /api/ranking/by_category/   # カテゴリ別
GET    /api/ranking/team_score/    # 個別スコア
```

#### 管理・編集機能
```
POST   /api/edit/add_checkin/      # 手動チェックイン追加
DELETE /api/edit/delete_checkin/   # チェックイン削除
POST   /api/edit/move_checkin/     # チェックイン順序変更
POST   /api/edit/change_goal_time/ # ゴール時刻変更
GET    /api/edit/pending_checkins/ # 未承認一覧
POST   /api/edit/approve_checkin/  # チェックイン承認
```

#### 印刷・出力機能
```
POST   /api/scoreboard/generate_pdf/    # PDF証明書生成
GET    /api/scoreboard/getScoreboard/   # Excelスコアボード
POST   /api/export/excel/              # Excel出力
GET    /api/export/ranking/            # ランキング出力
```

#### フロントエンド画面
```
GET    /supervisor/html/index.html          # メイン管理画面
GET    /supervisor/html/ranking.html        # ランキング表示
GET    /supervisor/html/realtime_monitor.html # リアルタイムモニター
GET    /supervisor/html/view_photo_list2.html # 写真審査画面
```

### 📝 リクエスト例

#### 認証が必要なAPI

```bash
# トークン取得
TOKEN=$(curl -X POST "http://localhost:8000/api/auth/login/" \
  -H "Content-Type: application/json" \
  -d '{"email":"user@example.com","password":"password"}' \
  | jq -r '.token')

# 認証付きリクエスト
curl -X GET "http://localhost:8000/api/teams/" \
  -H "Authorization: Token $TOKEN"
```

---

## トラブルシューティング

### 🔧 よくある問題と解決方法

#### 1. データベース接続エラー

**症状**: API呼び出し時にデータベース接続エラー

**解決方法**:
```bash
# データベース状態確認
docker compose exec postgres-db pg_isready -h localhost -p 5432

# データベース再起動
docker compose restart postgres-db

# 接続テスト
docker compose exec -e PGPASSWORD=admin123456 postgres-db \
  psql -h localhost -U admin -d rogdb -c "SELECT 1;"
```

#### 2. マイグレーションエラー

**症状**: モデル変更後にマイグレーションエラー

**解決方法**:
```bash
# マイグレーション状態確認
python manage.py showmigrations rog

# マイグレーション実行
python manage.py migrate rog

# fake適用（必要に応じて）
python manage.py migrate rog --fake
```

#### 3. GPS位置情報エラー

**症状**: 位置情報が正しく保存されない

**解決方法**:
```bash
# PostGIS拡張確認
docker compose exec postgres-db psql -h localhost -U admin -d rogdb \
  -c "SELECT PostGIS_Version();"

# 空間データ修復
docker compose exec postgres-db psql -h localhost -U admin -d rogdb \
  -c "UPDATE rog_checkpoint SET location = ST_SetSRID(location, 4326) 
      WHERE ST_SRID(location) = 0;"
```

#### 4. API応答が遅い

**症状**: API呼び出しのレスポンスが遅い

**解決方法**:
```bash
# インデックス使用状況確認
docker compose exec postgres-db psql -h localhost -U admin -d rogdb \
  -c "EXPLAIN ANALYZE SELECT * FROM rog_team WHERE zekken_number = '1001';"

# 統計情報更新
docker compose exec postgres-db psql -h localhost -U admin -d rogdb \
  -c "ANALYZE;"
```

### 📊 システム監視

#### パフォーマンス監視

```bash
# CPU・メモリ使用率
docker stats

# データベースプロセス確認
docker compose exec postgres-db psql -h localhost -U admin -d rogdb \
  -c "SELECT pid, usename, application_name, state, query 
      FROM pg_stat_activity WHERE state = 'active';"

# ディスク使用量
df -h
```

#### ログ確認

```bash
# Djangoログ
docker compose logs app

# PostgreSQLログ
docker compose logs postgres-db

# Nginxログ
docker compose logs nginx

# 特定期間のログ
docker compose logs --since "2025-08-21T00:00:00" app
```

### 🛠️ よくある問題と解決方法

#### Django管理画面にアクセスできない

**問題**: `http://localhost:8000/admin/` でアクセスできない

**解決方法**:
```bash
# 1. 正しいURLを使用
URL: http://localhost:8100/admin/

# 2. サービス状況確認
docker compose ps

# 3. Nginxの再起動
docker compose restart nginx

# 4. すべてのサービス再起動
docker compose restart
```

#### スーパーバイザー画面にアクセスできない

**問題**: `http://localhost:8100/` でnginxデフォルト画面が表示される

**解決方法**:
```bash
# 1. ボリュームマウント確認
docker compose exec nginx ls -la /usr/share/nginx/html/

# 2. supervisor/htmlディレクトリの確認
ls -la ./supervisor/html/

# 3. nginxサービス完全再起動
docker compose down nginx
docker compose up -d nginx

# 4. マウント設定確認
docker compose config | grep -A 5 "nginx:"
```

**期待される結果**:
- `/usr/share/nginx/html/` に `index.html`, `ranking.html` などのファイルが表示される
- `http://localhost:8100/` でスーパーバイザーログイン画面が表示される

#### ログイン認証エラー

**問題**: Django管理画面でログインできない

**解決方法**:
```bash
# 1. 管理者ユーザー確認
docker compose exec app python manage.py shell -c \
  "from rog.models import CustomUser; print(CustomUser.objects.filter(is_superuser=True).values_list('email', flat=True))"

# 2. パスワードリセット
docker compose exec app python manage.py changepassword admin@sumasen.net
```

**問題**: スーパーバイザー画面でログインできない

**解決方法**:
```bash
# 1. ログインAPIのテスト
curl -X POST -H "Content-Type: application/json" \
  -d '{"identifier": "admin@sumasen.net", "password": "YOUR_PASSWORD"}' \
  http://localhost:8100/api/login/

# 2. Django アプリケーション再起動
docker compose restart app

# 3. ログの確認
docker compose logs app | grep -i login
```

**よくあるエラー**:
- `{'email': [ErrorDetail(string='This field is required.', code='required')]}` 
  → フィールドマッピングエラー（修正済み）
- 認証失敗 → パスワード確認・リセット

**問題**: ログイン後に画面が真っ白になる

**原因**:
- メインコンテンツの表示設定ミス（`style="display: none;"`）
- API_BASE_URLの設定ミス（外部URL設定）
- JavaScriptエラー

**解決方法**:
```bash
# 1. ブラウザの開発者ツール（F12）でコンソールエラーを確認
# 2. index.htmlの設定確認
docker compose exec nginx cat /usr/share/nginx/html/index.html | grep -A5 -B5 "mainContent\|API_BASE_URL"

# 3. 修正済み設定の確認
# - API_BASE_URL = '/api' (ローカル設定)
# - mainContent の初期状態: style="display: none;"
# - 認証成功後の表示切替: checkAuth() 関数
```

#### API接続エラー

**問題**: API エンドポイントにアクセスできない

**解決方法**:
```bash
# 1. APIテスト
curl http://localhost:8100/api/events/

# 2. トークン認証確認
curl -H "Authorization: Token YOUR_TOKEN" http://localhost:8100/api/events/
```

#### 通過証明書出力問題

**問題**: 通過証明書出力で印刷がされない

**原因**:
- 証明書APIがファイルを返していない
- フロントエンドの印刷機能が未実装
- ブラウザのポップアップブロック

**✅ 解決済み** (2025/08/21):

**解決方法**:
- ✅ API: export_excel エンドポイントでPDFファイル直接返却
- ✅ フロントエンド: プレビュー機能 + 印刷機能の分離実装
  - **プレビューボタン**: 内容確認用（印刷ダイアログなし）
  - **印刷ボタン**: 実際の印刷用（自動印刷ダイアログ）

**現在の実装**:
- ✅ バックエンド: PDFコンテンツ直接返却（application/pdf）
- ✅ フロントエンド: 新しいウィンドウでPDF表示 → プレビュー/印刷選択可能

**テスト結果**:
```bash
# 証明書APIの動作確認（✅成功）
curl -H "Authorization: Token YOUR_TOKEN" \
  "http://localhost:8100/api/export_excel/1001/FC岐阜/" \
  --output test_certificate.pdf

# ファイル形式確認結果
$ file test_certificate.pdf
test_certificate.pdf: PDF document, version 1.5, 1 pages
```

3. **フロントエンド確認**:
```javascript
// ブラウザの開発者ツールで確認
console.log('API_BASE_URL:', API_BASE_URL);
console.log('Auth headers:', getAuthHeaders());
```

**修正済み機能**:
- ✅ API: PDFファイルを直接返すように修正（`Content-Type: application/pdf`）
- ✅ フロントエンド: 新しいウィンドウでPDF表示 → 自動印刷ダイアログ
- ✅ S3アップロード: バックアップとして証明書をクラウドに保存

**正常な動作フロー**:
1. ゼッケン番号とイベントコード選択
2. 「通過証明書出力」ボタンクリック
3. PDFが新しいウィンドウで開く
4. 自動的に印刷ダイアログが表示される
5. 印刷実行または保存選択

#### データベース接続エラー

**問題**: PostgreSQL接続失敗

**解決方法**:
```bash
# 1. データベース接続テスト
docker compose exec postgres-db psql -h localhost -U admin -d rogdb -c "SELECT version();"

# 2. データベースサービス再起動
docker compose restart postgres-db

# 3. 設定確認
cat .env | grep POSTGRES
```

---

## 🆕 最新アップデート情報

### 2025年8月21日 - 証明書印刷機能改善

**✅ 新機能追加**: 
- **プレビュー機能**: 印刷前の内容確認が可能
- **印刷機能分離**: プレビューと印刷を別ボタンで操作

**改善点**:
- オペレーターが印刷前に証明書内容を確認可能
- 印刷ミスの防止
- ユーザビリティの向上

**操作方法**:
1. **スーパーバイザー画面** → `/supervisor/html/index.html`
2. ゼッケン番号とイベントコードを選択
3. **プレビューボタン** (黄色) → 内容確認
4. **通過証明書印刷ボタン** (緑色) → 実際の印刷

---

## 📞 サポート情報

### 技術仕様

- **Django**: 4.x + GeoDjango
- **データベース**: PostgreSQL 12.0 + PostGIS
- **API**: Django REST Framework
- **認証**: Token Authentication + カスタムユーザーモデル
- **地理情報**: PostGIS spatial database
- **プロキシ**: Nginx 1.19

### 更新履歴

- **v1.1** (2025-08-21): 管理画面アクセス修正版
  - Nginx設定修正 (`/admin/` プロキシ追加)
  - 正しいアクセスURL更新 (ポート8100番)
  - 管理者認証情報確認・更新
- **v1.0** (2025-08-21): 初版リリース
  - MobServer統合完了
  - 全機能API実装完了
  - データ統合完了

### 開発・保守

- **統合データベース**: rogdb (Django) + gifuroge (MobServer)
- **API実装**: 8,165行のコード
- **データ統合**: 完全統合済み
- **管理者**: 1名（admin@sumasen.net）
- **登録ユーザー**: 1,105名

---

**📝 注意**: 本マニュアルは統合システムの現在の実装状況に基づいています。新機能追加や仕様変更に伴い、適宜更新してください。

---

## 🆕 新機能: 一括写真アップロード・審査管理 (2025年8月追加)

### 📸 一括写真アップロード機能

#### 概要
複数の写真を一度にアップロードし、EXIF情報から自動的にチェックイン処理を行う機能です。GPS座標と撮影時刻を使用して、適切なチェックポイントへの自動通過処理を実行します。

#### 操作手順

1. **管理画面へアクセス**
   ```
   URL: http://localhost:8100/supervisor/html/
   認証: 管理者アカウントでログイン
   ```

2. **表示モード設定**
   - 画面上部の「表示モード」で「個別表示」を選択
   - イベントコードを選択

3. **一括アップロード実行**
   - 「一括写真アップロード」ボタンをクリック
   - ファイル選択ダイアログで複数の写真を選択
   - アップロード実行

4. **処理結果確認**
   ```
   処理結果例:
   ✅ 処理済み: 15件
   ✅ 成功: 12件
   ❌ 失敗: 3件
   ```

#### 自動処理の仕組み

**EXIF情報抽出**:
- GPS座標（緯度・経度）
- 撮影日時
- カメラ情報

**自動チェックイン条件**:
- チェックポイントから50m以内
- イベント期間内の撮影
- 重複防止（同一CP 30分以内チェック）

**処理結果**:
- 成功 → `validation_status: 'AUTO_APPROVED'`
- 失敗 → エラーメッセージ表示

#### 対応ファイル形式
- **JPEG**: EXIF情報付き推奨
- **PNG**: EXIF情報付きのみ
- **サイズ制限**: 1ファイル10MB以下
- **一括制限**: 100ファイル/回

---

### 🔍 通過審査管理機能

#### 概要
自動処理されたチェックインや手動エントリーを管理者が確定・否認する機能です。

#### 審査ステータス

| ステータス | 表示 | 説明 |
|------------|------|------|
| `PENDING` | 🟡 審査待ち | 手動確認が必要 |
| `AUTO_APPROVED` | 🔵 自動承認 | システム自動処理 |
| `APPROVED` | 🟢 承認 | 管理者確認済み |
| `REJECTED` | 🔴 却下 | 管理者により否認 |

#### 操作手順

1. **個別審査**
   - チェックイン一覧で各項目の審査ボタンを使用
   - 「承認」または「却下」をクリック
   - 必要に応じてコメント入力

2. **一括審査**
   - 参加者を選択後、画面下部の一括処理ボタンを使用
   - 「一括確定」: 表示中の全チェックインを承認
   - 「一括否認」: 表示中の全チェックインを却下

3. **審査履歴確認**
   - 各チェックインに審査者、審査日時、コメントが記録
   - 監査証跡として保存

#### 得点計算
```
確定得点 = APPROVED + AUTO_APPROVED のポイント合計
未確定得点 = PENDING のポイント合計
却下得点 = REJECTED のポイント（加算されない）
```

---

### 📊 全参加者ランキング表示

#### 概要
イベント全参加者の得点と審査状況をクラス別に一覧表示する機能です。

#### 表示切り替え方法

1. **ランキングモードへ切り替え**
   - 表示モード選択で「ランキング表示」を選択
   - または、ゼッケン番号で「ALL」を選択

2. **クラス別表示**
   - 画面上部のタブでクラスを切り替え
   - 各クラス内で確定得点降順表示

#### 表示項目

| 項目 | 説明 |
|------|------|
| 順位 | クラス内での順位 |
| ゼッケン | 参加者ゼッケン番号 |
| チーム名 | チーム名称 |
| クラス | 参加クラス |
| 確定得点 | APPROVED + AUTO_APPROVED |
| 未確定得点 | PENDING状態のポイント |
| 合計得点 | 確定 + 未確定 |
| 確定率 | 確定数 / 総チェックイン数 |
| アクション | 詳細表示ボタン |

#### 確定率の色分け
- 🟢 **90%以上**: 緑色（優良）
- 🟡 **70-89%**: 黄色（要注意）
- 🔴 **70%未満**: 赤色（要確認）

---

### 🔧 管理者操作のベストプラクティス

#### 一括アップロード時の注意点

1. **事前準備**
   - 写真のEXIF情報確認
   - ファイル名の整理
   - 重複チェック

2. **処理中の注意**
   - 大量アップロード時は時間がかかる場合があります
   - ブラウザを閉じずに処理完了まで待機
   - エラーが発生した場合は個別確認

3. **事後確認**
   - 処理結果レポートの確認
   - 失敗分の手動処理
   - 得点計算の検証

#### 審査業務の効率化

1. **審査順序**
   ```
   1. 自動承認分の抜き打ち確認
   2. 審査待ち分の優先処理
   3. 疑問のある項目の詳細確認
   4. 一括処理での効率化
   ```

2. **審査基準**
   - 写真の撮影場所確認
   - 撮影時刻の妥当性
   - チェックポイントとの位置関係
   - 重複チェックインの確認

3. **コメント記入例**
   ```
   ✅ 承認: "写真で確認、適切な通過"
   ✅ 承認: "GPS精度良好、時刻も妥当"
   ❌ 却下: "撮影場所が不明確"
   ❌ 却下: "時刻がイベント期間外"
   ```

#### 緊急時対応

1. **システム障害時**
   - 手動でのチェックイン記録
   - 審査状況のバックアップ
   - 復旧後の照合作業

2. **データ不整合時**
   - 管理者画面での確認
   - 必要に応じてデータベース直接確認
   - ログファイルでの追跡

3. **参加者対応**
   - 審査結果の説明
   - 再審査の依頼対応
   - 紛争解決プロセス

---

### 📱 モバイル対応

#### レスポンシブデザイン
管理画面はタブレット・スマートフォンでも操作可能です。

**推奨環境**:
- **デスクトップ**: Chrome, Firefox, Safari最新版
- **タブレット**: iPad（Safari）, Android（Chrome）
- **スマートフォン**: iOS Safari, Android Chrome

**画面サイズ別最適化**:
- **デスクトップ**: 全機能利用可能
- **タブレット**: 主要機能利用可能
- **スマートフォン**: 基本操作のみ

---

### 🔐 セキュリティ・権限管理

#### アクセス権限
- **管理者権限**: すべての機能にアクセス可能
- **審査権限**: 審査機能のみ利用可能
- **閲覧権限**: 表示機能のみ利用可能

#### セキュリティ対策
- **レート制限**: 1時間に10回までの一括アップロード制限
- **ファイル検証**: アップロードファイルの安全性チェック
- **操作ログ**: すべての管理者操作を記録
- **セッション管理**: 自動ログアウト機能

#### 監査ログ
```
操作例:
[2025-08-24 15:30:00] admin@example.com: bulk_upload_photos (15 files, event: 岐阜2412)
[2025-08-24 15:35:00] admin@example.com: confirm_checkin (ID: 1234, action: APPROVED)
[2025-08-24 15:40:00] admin@example.com: view_ranking (event: 岐阜2412)
```

---
