# Issue Board 問題追蹤板系統 - 設置說明

## 系統概述

Issue Board 是一個問題追蹤系統，允許使用者建立、追蹤和管理問題，支援樹狀回覆結構。

### 主要功能

1. **問題分類**：工人問題、宿舍問題、公司問題、店鋪問題、其他問題
2. **問題管理**：新增、編輯、刪除問題
3. **回覆系統**：樹狀結構回覆，所有用戶可回覆，只能編輯自己的回覆
4. **狀態追蹤**：開啟、處理中、已完結
5. **優先級設定**：低、中、高、緊急
6. **處理期限**：可設定處理時間，逾期自動提示
7. **指派跟進人**：可指派特定用戶負責跟進
8. **通知系統**：儀表板小鈴鐺顯示逾期問題、指派給自己的問題

### 權限說明

- **管理員**：可以刪除任何問題
- **問題建立者**：可以編輯和刪除自己建立的問題
- **所有用戶**：可以回覆任何問題，但只能編輯自己的回覆
- **回覆**：無法刪除，只能編輯

---

## 資料庫設置

### 步驟 1：執行資料庫遷移

在專案根目錄執行以下命令：

```bash
php artisan migrate
```

這將會建立兩個資料表：
- `issues` - 問題主表
- `issue_replies` - 問題回覆表

### 步驟 2：驗證資料表

執行以下命令確認資料表已建立：

```bash
php artisan tinker
```

然後執行：

```php
Schema::hasTable('issues'); // 應該返回 true
Schema::hasTable('issue_replies'); // 應該返回 true
```

---

## 檔案結構

### 新增的檔案

#### 資料庫遷移
- `database/migrations/2026_08_27_000000_create_issues_table.php`
- `database/migrations/2026_08_27_000001_create_issue_replies_table.php`

#### 模型
- `app/Models/Issue.php` - 問題模型
- `app/Models/IssueReply.php` - 問題回覆模型

#### 控制器
- `app/Http/Controllers/IssueController.php` - 問題控制器

#### 視圖
- `resources/views/issues/index.blade.php` - 問題列表頁
- `resources/views/issues/create.blade.php` - 新增問題頁
- `resources/views/issues/show.blade.php` - 問題詳情頁
- `resources/views/issues/edit.blade.php` - 編輯問題頁
- `resources/views/issues/edit-reply.blade.php` - 編輯回覆頁
- `resources/views/issues/partials/reply.blade.php` - 回覆組件（樹狀結構）

#### 路由
已在 `routes/web.php` 新增以下路由：

```php
Route::resource('issues', IssueController::class);
Route::post('/issues/{issue}/replies', [IssueController::class, 'storeReply'])->name('issues.replies.store');
Route::get('/issues/replies/{reply}/edit', [IssueController::class, 'editReply'])->name('issues.replies.edit');
Route::put('/issues/replies/{reply}', [IssueController::class, 'updateReply'])->name('issues.replies.update');
Route::post('/issues/{issue}/close', [IssueController::class, 'close'])->name('issues.close');
Route::post('/issues/{issue}/reopen', [IssueController::class, 'reopen'])->name('issues.reopen');
```

---

## 使用說明

### 新增問題

1. 點擊左側選單的「問題追蹤板」
2. 點擊右上角的「新增問題」按鈕
3. 填寫問題資訊：
   - **問題分類**（必填）：選擇適當的分類
   - **問題簡介**（必填）：簡短描述問題主題
   - **問題內容**（必填）：詳細描述問題
   - **優先級**（必填）：低、中、高、緊急
   - **處理期限**（選填）：設定希望完成的時間
   - **指派跟進人**（選填）：指定負責的用戶

### 查看問題

- 問題列表會顯示所有問題
- 可使用篩選器依分類、狀態、優先級篩選
- 可使用搜尋框搜尋問題
- 逾期問題會以紅色標示
- 已完結的問題會以灰色刪除線顯示

### 回覆問題

1. 點擊問題進入詳情頁
2. 在底部回覆表單輸入內容
3. 點擊「送出回覆」
4. 可以回覆其他人的回覆（樹狀結構）

### 編輯回覆

1. 在問題詳情頁找到自己的回覆
2. 點擊「編輯」按鈕
3. 修改內容後點擊「儲存修改」

### 完結問題

1. 在問題詳情頁點擊「完結問題」按鈕
2. 問題狀態會變更為「已完結」
3. 問題標題和內容會顯示刪除線

### 刪除問題

- **管理員**：可以刪除任何問題
- **問題建立者**：只能刪除自己建立的問題
- 刪除後問題和所有回覆都會被移除

---

## 通知系統

### 儀表板小鈴鐺

系統會在儀表板右上角的通知鈴鐺顯示以下通知：

1. **逾期問題**：超過處理期限但尚未完結的問題
2. **指派給我的問題**：被指派給當前登入用戶的問題
3. **待處理問題**：所有狀態為「開啟」的問題

通知數量 = 逾期問題數 + 指派給我的問題數

---

## 資料庫結構

### issues 表

| 欄位 | 類型 | 說明 |
|------|------|------|
| id | bigint | 主鍵 |
| user_id | bigint | 建立者 ID |
| title | string | 問題簡介 |
| content | text | 問題內容 |
| category | enum | 分類（工人/宿舍/公司/店鋪/其他） |
| status | enum | 狀態（open/in_progress/closed） |
| priority | enum | 優先級（low/medium/high/urgent） |
| due_date | datetime | 處理期限 |
| assigned_to | bigint | 跟進人 ID |
| closed_at | timestamp | 完結時間 |
| created_at | timestamp | 建立時間 |
| updated_at | timestamp | 更新時間 |

### issue_replies 表

| 欄位 | 類型 | 說明 |
|------|------|------|
| id | bigint | 主鍵 |
| issue_id | bigint | 問題 ID |
| user_id | bigint | 回覆者 ID |
| parent_id | bigint | 父回覆 ID（樹狀結構） |
| content | text | 回覆內容 |
| created_at | timestamp | 建立時間 |
| updated_at | timestamp | 更新時間 |

---

## 樹狀回覆結構

```
問題
├── 回覆 A (頂層回覆)
│   ├── 回覆 A-1 (子回覆)
│   │   └── 回覆 A-1-1 (子回覆)
│   └── 回覆 A-2 (子回覆)
├── 回覆 B (頂層回覆)
└── 回覆 C (頂層回覆)
```

---

## 測試步驟

### 1. 建立測試用戶

```bash
php artisan tinker
```

```php
\App\Models\User::create([
    'name' => '測試用戶',
    'email' => 'test@example.com',
    'password' => bcrypt('password'),
    'role' => 'user'
]);
```

### 2. 測試問題功能

1. 登入系統
2. 點擊「問題追蹤板」
3. 新增一個問題
4. 回覆問題
5. 測試樹狀回覆
6. 完結問題
7. 驗證問題是否顯示刪除線

### 3. 測試通知系統

1. 建立一個逾期問題
2. 指派給自己
3. 返回儀表板
4. 檢查小鈴鐺是否顯示通知

---

## 常見問題

### Q: 為什麼無法刪除回覆？

A: 系統設計上不允許刪除回覆，只能編輯自己的回覆，以保留完整的討論記錄。

### Q: 如何重新開啟已完結的問題？

A: 只有管理員或問題建立者可以重新開啟已完結的問題。在問題詳情頁點擊「重新開啟」按鈕即可。

### Q: 逾期問題如何判定？

A: 當問題的處理期限已經過期，且問題狀態不是「已完結」時，系統會將其標記為逾期。

---

## 版本資訊

- **版本**：1.0
- **建立日期**：2026-08-27
- **適用系統**：勞工與宿舍管理系統
