203 lines
5.8 KiB
Markdown
203 lines
5.8 KiB
Markdown
# TaskService 未完成事项
|
||
|
||
> 生成时间:2026-04-14
|
||
|
||
## 一、阻塞性问题(阻断编译/运行)
|
||
|
||
### 1. Proto 编译未执行
|
||
|
||
**问题**:编译脚本已修改但未执行,`pkg/proto/` 下无生成代码。
|
||
|
||
**影响**:`go build ./...` 会失败,找不到 `task.pb.go` 和 `task.triple.go`。
|
||
|
||
**操作**:
|
||
```bash
|
||
cd backend && sh scripts/compile-proto.sh
|
||
```
|
||
|
||
**前提**:环境需安装 `go` 和 `protoc`。
|
||
|
||
---
|
||
|
||
### 2. Dubbo Server 注册代码被注释
|
||
|
||
**文件**:`backend/services/taskService/main.go:120-124`
|
||
|
||
```go
|
||
// 注意:这里需要 TaskMobileService 和 TaskInternalService 的 RegisterHandler
|
||
// 这些会在 proto 编译后生成。在 proto 编译之前,这里会报编译错误。
|
||
// Task 15 完成 proto 编译后,需要将下面的注释替换为实际的注册代码。
|
||
|
||
logger.Logger.Info(fmt.Sprintf("taskService configured on port %d, awaiting proto registration", *port))
|
||
```
|
||
|
||
**影响**:服务启动后没有注册任何 RPC handler,客户端无法调用。
|
||
|
||
**修复**:proto 编译后需添加类似以下代码:
|
||
```go
|
||
pb.RegisterTaskMobileServiceHandler(srv, mobileProvider)
|
||
pb.RegisterTaskInternalServiceHandler(srv, internalProvider)
|
||
```
|
||
|
||
---
|
||
|
||
## 二、代码缺陷(运行时 Bug)
|
||
|
||
### 3. `UpdateOnboardingProgress` 方法缺失
|
||
|
||
**文件**:`backend/services/taskService/repository/onboarding_repo.go`
|
||
|
||
**问题**:
|
||
- 接口 `OnboardingRepository` 缺少 `UpdateOnboardingProgress` 方法
|
||
- `onboarding_service.go:172-176` 的 `updateOnboardingProgress` 直接返回 `nil`,未实际更新数据
|
||
|
||
```go
|
||
func (s *onboardingService) updateOnboardingProgress(progress *model.UserOnboardingProgress) error {
|
||
// 需要在 repository 中添加 UpdateOnboardingProgress 方法
|
||
// 这里暂时用 GORM 直接更新
|
||
return nil // ← BUG: 没有真正更新
|
||
}
|
||
```
|
||
|
||
**影响**:`CompleteGuide` 完成任务后进度状态不会更新。
|
||
|
||
**修复**:在 `onboarding_repo.go` 添加:
|
||
```go
|
||
// OnboardingRepository 接口添加:
|
||
UpdateOnboardingProgress(progress *model.UserOnboardingProgress) error
|
||
|
||
// 实现:
|
||
func (r *onboardingRepository) UpdateOnboardingProgress(progress *model.UserOnboardingProgress) error {
|
||
progress.UpdatedAt = gorm.NowFunc().Unix()
|
||
return r.db.Save(progress).Error
|
||
}
|
||
```
|
||
|
||
然后 `onboarding_service.go` 中调用 `s.onboardingRepo.UpdateOnboardingProgress(progress)`。
|
||
|
||
---
|
||
|
||
### 4. `ListCompletedDailyTasks` 方法缺失
|
||
|
||
**文件**:`backend/services/taskService/repository/daily_task_repo.go`
|
||
|
||
**问题**:`daily_task_service.go:204` 调用 `s.dailyRepo.ListCompletedDailyTasks()`,但该方法不存在。
|
||
|
||
**影响**:`ClaimAllDailyTasks` 调用会编译报错。
|
||
|
||
**修复**:在 `daily_task_repo.go` 添加:
|
||
```go
|
||
// DailyTaskRepository 接口添加:
|
||
ListCompletedDailyTasks(userID, starID int64) ([]*model.UserDailyTaskProgress, error)
|
||
|
||
// 实现:
|
||
func (r *dailyTaskRepository) ListCompletedDailyTasks(userID, starID int64) ([]*model.UserDailyTaskProgress, error) {
|
||
var progressList []*model.UserDailyTaskProgress
|
||
err := r.db.Where("user_id = ? AND star_id = ? AND status = ?", userID, starID, "completed").
|
||
Find(&progressList).Error
|
||
return progressList, err
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 5. `CompleteGuide` 中死代码
|
||
|
||
**文件**:`backend/services/taskService/onboarding_service.go:154-156`
|
||
|
||
```go
|
||
if err := s.onboardingRepo.UpdateOnboardingStatus(&model.UserOnboardingStatus{UserID: userID}); err != nil {
|
||
// UpdateOnboardingStatus is for status table, not progress
|
||
} // ← 无意义的空调用,应该删除
|
||
```
|
||
|
||
**影响**:代码冗余,不影响功能但影响可读性。
|
||
|
||
**修复**:删除第 154-156 行。
|
||
|
||
---
|
||
|
||
## 三、前端缺陷
|
||
|
||
### 6. `guide.vue` 任务完成状态判断错误
|
||
|
||
**文件**:`frontend/pages/tasks/guide.vue:129-134`
|
||
|
||
```javascript
|
||
function isTaskCompleted(stage, taskKey) {
|
||
// 这里需要根据实际数据结构判断
|
||
// 假设 completed 状态的任务 key 会被标记
|
||
// 暂时返回 false,实际需要后端返回更详细的状态
|
||
return false // ← BUG: 永远返回 false
|
||
}
|
||
```
|
||
|
||
**影响**:引导页面的任务永远显示为未完成,用户无法正确看到进度。
|
||
|
||
**修复**:参考后端 `GetOnboardingStatus` 的逻辑,从 `stage.required_task_keys` 和进度数据判断。
|
||
|
||
---
|
||
|
||
### 7. `daily_task_service.go` 错误被忽略
|
||
|
||
**文件**:`backend/services/taskService/service/daily_task_service.go:229,234`
|
||
|
||
```go
|
||
// 发放水晶奖励
|
||
if def.CrystalReward > 0 {
|
||
s.userClient.UpdateCrystalBalance(ctx, userID, starID, def.CrystalReward) // ← 错误被忽略
|
||
}
|
||
|
||
// 发放经验奖励
|
||
if def.ExpReward > 0 {
|
||
s.userClient.AddExperience(ctx, userID, starID, def.ExpReward) // ← 错误被忽略
|
||
}
|
||
```
|
||
|
||
**影响**:`ClaimAllDailyTasks` 中奖励发放失败时不报错,可能导致用户未收到奖励。
|
||
|
||
**修复**:添加错误处理和日志。
|
||
|
||
---
|
||
|
||
## 四、已完成的修复
|
||
|
||
### 8. `AddExperience` RPC 已添加
|
||
|
||
- **user.proto**:已添加 `AddExperienceRequest/Response` 消息和 RPC 定义
|
||
- **user_rpc_client.go**:已有完整实现
|
||
|
||
等待 proto 编译后即可使用。
|
||
|
||
---
|
||
|
||
## 五、待执行的操作清单
|
||
|
||
| # | 操作 | 优先级 | 依赖 |
|
||
|---|------|--------|------|
|
||
| 1 | 执行 `sh scripts/compile-proto.sh` | P0 | go + protoc 环境 |
|
||
| 2 | 添加 `UpdateOnboardingProgress` 到 onboarding_repo | P0 | 无 |
|
||
| 3 | 添加 `ListCompletedDailyTasks` 到 daily_task_repo | P0 | 无 |
|
||
| 4 | 修复 main.go Dubbo 注册代码 | P0 | #1 |
|
||
| 5 | 修复 guide.vue isTaskCompleted | P1 | 无 |
|
||
| 6 | 删除 onboarding_service.go 死代码 | P2 | 无 |
|
||
| 7 | 修复 ClaimAllDailyTasks 错误处理 | P2 | 无 |
|
||
|
||
---
|
||
|
||
## 六、执行顺序建议
|
||
|
||
```
|
||
1. 先执行 proto 编译(#1)
|
||
↓
|
||
2. 修复 onboarding_repo + daily_task_repo(#2, #3)
|
||
↓
|
||
3. 修复 main.go 注册代码(#4)
|
||
↓
|
||
4. 编译验证:go build ./...
|
||
↓
|
||
5. 修复前端 guide.vue(#5)
|
||
↓
|
||
6. 可选优化(#6, #7)
|
||
```
|