Преглед изворни кода

docs(Activity): 添加活动模块文档

- 新增活动模块数据库设计文档
- 添加开心农场活动模块文档
- 创建活动模块README
- 编写掉落组文档
- 制定任务模块开发计划
Your Name пре 8 месеци
родитељ
комит
6ad1b4c0a1

+ 75 - 0
app/Module/Activity/Docs_RooGemini2.5/DATABASE.md

@@ -0,0 +1,75 @@
+# 活动模块数据库设计文档
+
+## 1. 数据表总览
+| 表名 | 说明 |
+|------|------|
+| activity_config | 活动基础配置表 |
+| activity_reward | 活动奖励配置表 | 
+| activity_participation | 活动参与记录表 |
+| user_activity_data | 用户活动数据表 |
+
+## 2. 详细表结构
+
+### 2.1 activity_config (活动基础配置表)
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | bigint | 主键 |
+| name | varchar(100) | 活动名称 |
+| type | tinyint | 活动类型 |
+| start_time | datetime | 开始时间 |
+| end_time | datetime | 结束时间 |
+| status | tinyint | 活动状态 |
+| created_at | timestamp | 创建时间 |
+| updated_at | timestamp | 更新时间 |
+
+### 2.2 activity_reward (活动奖励配置表)
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | bigint | 主键 |
+| activity_id | bigint | 关联活动ID |
+| reward_type | tinyint | 奖励类型 |
+| item_id | int | 道具ID |
+| item_count | int | 道具数量 |
+| probability | decimal(5,2) | 获得概率 |
+
+### 2.3 activity_participation (活动参与记录表)
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | bigint | 主键 |
+| user_id | bigint | 用户ID |
+| activity_id | bigint | 活动ID |
+| participate_time | datetime | 参与时间 |
+| reward_status | tinyint | 奖励状态 |
+
+### 2.4 user_activity_data (用户活动数据表)
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | bigint | 主键 |
+| user_id | bigint | 用户ID |
+| activity_id | bigint | 活动ID |
+| progress | int | 活动进度 |
+| last_update | timestamp | 最后更新时间 |
+
+## 3. 表关系图
+```mermaid
+erDiagram
+    activity_config ||--o{ activity_reward : "1:N"
+    activity_config ||--o{ activity_participation : "1:N" 
+    activity_config ||--o{ user_activity_data : "1:N"
+    activity_participation }|--|| user_activity_data : "关联"
+```
+
+## 4. SQL示例
+```sql
+-- 创建活动基础配置表
+CREATE TABLE `activity_config` (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `name` varchar(100) NOT NULL,
+  `type` tinyint NOT NULL,
+  `start_time` datetime NOT NULL,
+  `end_time` datetime NOT NULL,
+  `status` tinyint DEFAULT '0',
+  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

+ 28 - 0
app/Module/Activity/Docs_RooGemini2.5/README.md

@@ -0,0 +1,28 @@
+# 开心农场活动模块文档
+
+## 1. 礼包活动系统
+
+### 1.1 礼包类型
+- 推荐礼包
+- 补偿礼包  
+- 新人礼包
+- 认证礼包
+- 签到礼包
+
+### 1.2 礼包配置
+- 可自定义奖励池内容
+- 支持增删修改奖励道具
+- 可设置文字说明
+- 可开启/关闭礼包状态
+
+### 1.3 奖励发放机制
+- 发放方式:全部发放或随机发放
+- 补偿礼包支持多批次开启
+- 奖励组可共用
+- 客户端按钮领取,物品直接入包
+
+### 1.4 活动管理
+- 支持自定义奖励池
+- 可配置活动时间范围
+- 可设置参与条件
+- 支持活动状态监控

+ 1 - 0
app/Module/Activity/README.md

@@ -0,0 +1 @@
+# 活动模块

+ 161 - 0
app/Module/GameItems/Docs/掉落组.md

@@ -0,0 +1,161 @@
+# 掉落组文档
+
+> 本文档描述了物品模块中的掉落组功能,包括定义、使用方式和最佳实践。
+
+## 1. 概述
+
+掉落组是一组相关物品的集合,用于定义物品的随机掉落规则。主要用途包括:
+
+- 宝箱内容配置
+- 任务奖励发放
+- 随机事件奖励
+- 其他需要随机掉落物品的场景
+
+## 2. 数据库结构
+
+### 2.1 物品组表 (item_groups)
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | int | 物品组ID,主键 |
+| name | string | 物品组名称 |
+| code | string | 物品组编码(唯一) |
+| description | string | 物品组描述 |
+| created_at | timestamp | 创建时间 |
+| updated_at | timestamp | 更新时间 |
+
+### 2.2 物品组内容表 (item_group_items)
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | int | 记录ID,主键 |
+| group_id | int | 物品组ID,外键 |
+| item_id | int | 物品ID,外键 |
+| weight | float | 权重,决定选择概率 |
+| created_at | timestamp | 创建时间 |
+| updated_at | timestamp | 更新时间 |
+
+## 3. 核心类
+
+### 3.1 ItemGroup 模型
+
+```php
+/**
+ * 物品组模型
+ */
+class ItemGroup extends ModelCore
+{
+    // 关联物品组内容
+    public function groupItems(): HasMany
+    {
+        return $this->hasMany(ItemGroupItem::class, 'group_id','id');
+    }
+
+    // 关联宝箱内容配置
+    public function chestContents(): HasMany
+    {
+        return $this->hasMany(ItemChestContent::class, 'group_id','id');
+    }
+}
+```
+
+### 3.2 ItemGroupItem 模型
+
+```php
+/**
+ * 物品组内容模型
+ */
+class ItemGroupItem extends ModelCore
+{
+    // 关联物品组
+    public function group(): BelongsTo
+    {
+        return $this->belongsTo(ItemGroup::class, 'group_id');
+    }
+
+    // 关联物品
+    public function item(): BelongsTo
+    {
+        return $this->belongsTo(Item::class, 'item_id');
+    }
+}
+```
+
+### 3.3 Group 逻辑类
+
+```php
+/**
+ * 物品组逻辑类
+ */
+class Group
+{
+    /**
+     * 根据权重随机获取物品组中的一个物品
+     */
+    public function getRandomItem(ItemGroup $group): ?Item
+    {
+        // 实现逻辑...
+    }
+}
+```
+
+## 4. 使用示例
+
+### 4.1 创建掉落组
+
+```php
+// 创建掉落组
+$group = ItemGroup::create([
+    'name' => '初级宝箱掉落组',
+    'code' => 'beginner_chest_drops',
+    'description' => '初级宝箱可能掉落的物品'
+]);
+
+// 添加掉落组内容
+ItemGroupItem::create([
+    'group_id' => $group->id,
+    'item_id' => 101, // 物品ID
+    'weight' => 0.5   // 权重
+]);
+```
+
+### 4.2 使用掉落组
+
+```php
+// 获取随机物品
+$group = ItemGroup::find(1);
+$randomItem = app(Group::class)->getRandomItem($group);
+
+// 在宝箱内容中使用掉落组
+ItemChestContent::create([
+    'chest_id' => 201, // 宝箱ID
+    'group_id' => $group->id, // 使用掉落组
+    'min_quantity' => 1,
+    'max_quantity' => 3,
+    'weight' => 1.0
+]);
+```
+
+## 5. 最佳实践
+
+1. **权重设计**:
+   - 总权重不需要等于1或100,系统会自动计算比例
+   - 权重值应保持合理范围(如0.1-10.0),避免极端值
+
+2. **性能优化**:
+   - 对于大型掉落组,考虑缓存计算结果
+   - 使用预加载关联数据避免N+1查询
+
+3. **测试验证**:
+   - 验证权重分布是否符合预期
+   - 测试边界情况(空组、零权重等)
+
+4. **文档维护**:
+   - 记录每个掉落组的用途和内容
+   - 更新文档以反映配置变更
+
+## 6. 扩展建议
+
+1. **动态权重**:可根据玩家等级、VIP等级等因素动态调整权重
+2. **保底机制**:实现类似宝箱保底的掉落组保底机制
+3. **条件掉落**:增加条件判断,如特定时间、活动期间的特殊掉落

+ 200 - 0
app/Module/Task/DEV.md

@@ -0,0 +1,200 @@
+# 任务模块开发计划
+
+## 1. 创建基本目录结构 ✅
+
+- [x] 创建 AdminControllers 目录
+- [x] 创建 Commands 目录
+- [x] 创建 Docs 目录
+- [x] 创建 Dtos 目录
+- [x] 创建 Enums 目录
+- [x] 创建 Events 目录
+- [x] 创建 Listeners 目录
+- [x] 创建 Models 目录
+- [x] 创建 Providers 目录
+- [x] 创建 Repositorys 目录
+- [x] 创建 Services 目录
+
+## 2. 实现数据库结构 ✅
+
+- [x] 创建数据库设计文档
+- [x] 创建数据库创建脚本 (create.sql)
+- [x] 实现数据库表结构
+  - [x] task_categories - 任务分类表
+  - [x] task_tasks - 任务定义表
+  - [x] task_rewards - 任务奖励定义表
+  - [x] task_costs - 任务接取消耗表
+  - [x] task_conditions - 任务条件表
+  - [x] task_achievement_conditions - 任务达成条件表
+  - [x] task_user_tasks - 用户任务关联表
+  - [x] task_user_progress - 用户任务进度表
+  - [x] task_completion_logs - 任务完成日志表
+  - [x] task_reward_logs - 任务奖励发放日志表
+  - [x] task_cost_logs - 任务消耗日志表
+  - [x] task_reset_logs - 任务重置日志表
+
+## 3. 实现模型类 ✅
+
+- [x] TaskCategory - 任务分类模型
+- [x] Task - 任务模型
+- [x] TaskReward - 任务奖励模型
+- [x] TaskCost - 任务接取消耗模型
+- [x] TaskCondition - 任务条件模型
+- [x] TaskAchievementCondition - 任务达成条件模型
+- [x] TaskUserTask - 用户任务关联模型
+- [x] TaskUserProgress - 用户任务进度模型
+- [x] TaskCompletionLog - 任务完成日志模型
+- [x] TaskRewardLog - 任务奖励发放日志模型
+- [x] TaskCostLog - 任务消耗日志模型
+- [x] TaskResetLog - 任务重置日志模型
+
+## 4. 实现数据仓库 ✅
+
+- [x] TaskCategoryRepository - 任务分类数据仓库
+- [x] TaskRepository - 任务数据仓库
+- [x] TaskRewardRepository - 任务奖励数据仓库
+- [x] TaskCostRepository - 任务接取消耗数据仓库
+- [x] TaskConditionRepository - 任务条件数据仓库
+- [x] TaskAchievementConditionRepository - 任务达成条件数据仓库
+- [x] TaskUserTaskRepository - 用户任务关联数据仓库
+- [x] TaskUserProgressRepository - 用户任务进度数据仓库
+- [x] TaskCompletionLogRepository - 任务完成日志数据仓库
+- [x] TaskRewardLogRepository - 任务奖励发放日志数据仓库
+- [x] TaskCostLogRepository - 任务消耗日志数据仓库
+- [x] TaskResetLogRepository - 任务重置日志数据仓库
+
+## 5. 实现事件和监听器 ✅
+
+- [x] 创建基础监听器类
+  - [x] BaseTaskEventListener - 任务事件监听器基类
+
+- [x] 创建事件类
+  - [x] TaskCompletedEvent - 任务完成事件
+  - [x] TaskRewardClaimedEvent - 任务奖励领取事件
+
+- [x] 创建监听器类
+  - [x] TaskCompletedListener - 任务完成事件监听器
+  - [x] TaskRewardClaimedListener - 任务奖励领取事件监听器
+
+## 6. 实现服务提供者 ✅
+
+- [x] TaskServiceProvider - 任务模块服务提供者
+  - [x] 合并事件监听器注册功能,移除单独的TaskEventServiceProvider
+
+## 7. 实现枚举类 🔄
+
+- [ ] TASK_TYPE - 任务类型枚举
+- [ ] TASK_STATUS - 任务状态枚举
+- [ ] TASK_CONDITION_TYPE - 任务条件类型枚举
+- [ ] TASK_REWARD_TYPE - 任务奖励类型枚举
+- [ ] TASK_RESET_TYPE - 任务重置类型枚举
+
+## 8. 实现服务类 🔄
+
+- [ ] TaskService - 任务服务类
+- [ ] TaskConditionService - 任务条件服务类
+- [ ] TaskRewardService - 任务奖励服务类
+- [ ] TaskProgressService - 任务进度服务类
+
+## 9. 实现DTO类 🔄
+
+- [ ] TaskDto - 任务数据传输对象
+- [ ] TaskConditionDto - 任务条件数据传输对象
+- [ ] TaskRewardDto - 任务奖励数据传输对象
+- [ ] TaskProgressDto - 任务进度数据传输对象
+
+## 10. 实现后台控制器 🔄
+
+- [ ] TaskCategoryController - 任务分类控制器
+- [ ] TaskController - 任务控制器
+- [ ] TaskRewardController - 任务奖励控制器
+- [ ] TaskCostController - 任务接取消耗控制器
+- [ ] TaskConditionController - 任务条件控制器
+- [ ] TaskAchievementConditionController - 任务达成条件控制器
+- [ ] TaskUserTaskController - 用户任务关联控制器
+- [ ] TaskUserProgressController - 用户任务进度控制器
+- [ ] TaskCompletionLogController - 任务完成日志控制器
+- [ ] TaskRewardLogController - 任务奖励发放日志控制器
+- [ ] TaskCostLogController - 任务消耗日志控制器
+- [ ] TaskResetLogController - 任务重置日志控制器
+
+## 11. 实现命令行工具 ⏳
+
+- [ ] ResetDailyTasksCommand - 重置每日任务命令
+- [ ] ResetWeeklyTasksCommand - 重置每周任务命令
+- [ ] ResetMonthlyTasksCommand - 重置每月任务命令
+- [ ] CheckTaskProgressCommand - 检查任务进度命令
+- [ ] CleanExpiredTasksCommand - 清理过期任务命令
+
+## 12. 实现文档 🔄
+
+- [x] 数据库设计文档
+- [x] Proto设计文档
+- [x] 开发指南文档
+- [x] 事件系统文档
+- [x] 配置表设计文档
+- [x] 与其他模块集成文档
+
+## 开发进度
+
+- ✅ 已完成
+- 🔄 进行中
+- ⏳ 待开始
+
+### 当前进度
+
+- 已完成基本目录结构创建
+- 已完成数据库设计和创建脚本
+- 已完成所有模型类的实现
+- 已完成所有数据仓库类的实现
+- 已完成事件和监听器的实现
+- 已完成服务提供者的实现
+- 进行中的工作:枚举类、服务类、DTO类、后台控制器和文档的实现
+
+### 下一步计划
+
+1. 完成枚举类的实现
+2. 完成服务类的实现
+3. 完成DTO类的实现
+4. 完成后台控制器的实现
+5. 完成命令行工具的实现
+6. 完善模块文档
+
+## 开发规范
+
+### 命名规范
+
+1. **类名**:使用大驼峰命名法(PascalCase),如`TaskService`
+2. **方法名**:使用小驼峰命名法(camelCase),如`getTaskById`
+3. **变量名**:使用小驼峰命名法(camelCase),如`taskId`
+4. **常量名**:使用全大写下划线命名法(SNAKE_CASE),如`TASK_STATUS_COMPLETED`
+5. **枚举类**:使用全大写下划线命名法(SNAKE_CASE),如`TASK_TYPE`
+
+### 代码规范
+
+1. 遵循PSR-12编码规范
+2. 使用强类型声明
+3. 编写完整的PHPDoc注释
+4. 遵循SOLID原则
+
+### 文档规范
+
+1. 使用Markdown格式编写文档
+2. 文档应包含标题、概述、正文和总结等部分
+3. 代码示例应包含注释
+4. 保持文档与代码同步更新
+
+## 依赖项
+
+1. 用户模块 - 获取用户信息
+2. 物品模块 - 发放物品奖励
+3. 货币模块 - 发放货币奖励
+4. 经验模块 - 发放经验奖励
+5. 事件系统 - 监听游戏事件
+
+## 注意事项
+
+1. 任务模块是游戏系统的核心功能之一,需要确保高性能和稳定性
+2. 任务条件和奖励类型可能会不断增加,需要设计良好的扩展机制
+3. 任务进度更新频繁,需要考虑缓存和批量更新策略
+4. 任务重置需要考虑时区问题,确保在正确的时间点重置
+5. 任务完成和奖励发放需要考虑并发问题,确保数据一致性

+ 0 - 258
app/Module/Task/Docs/DEV.md

@@ -1,258 +0,0 @@
-# 任务模块开发计划
-
-## 1. 概述
-
-本文档描述了任务模块的开发计划,包括开发阶段、任务分解、时间线和关键里程碑。任务模块是游戏系统中的核心功能,用于管理各类任务的定义、完成条件、奖励发放和进度跟踪。
-
-## 2. 开发阶段
-
-任务模块的开发分为以下几个主要阶段:
-
-1. **需求分析与设计** - 1周
-2. **数据库结构实现** - 1周
-3. **核心功能开发** - 2周
-4. **配置工具开发** - 1周
-5. **单元测试与集成测试** - 1周
-6. **文档完善与上线准备** - 1周
-
-总计开发时间:约7周
-
-## 3. 任务分解
-
-### 3.1 需求分析与设计 (第1周)
-
-- [x] 分析任务系统需求
-- [x] 设计数据库结构
-- [x] 设计模块接口
-- [x] 设计任务配置表结构
-- [x] 设计任务触发与完成机制
-- [x] 设计奖励发放机制
-- [x] 完成设计文档
-
-### 3.2 数据库结构实现 (第2周)
-
-- [ ] 创建任务表 (task_tasks)
-- [ ] 创建任务条件表 (task_conditions)
-- [ ] 创建任务奖励表 (task_rewards)
-- [ ] 创建用户任务表 (task_user_tasks)
-- [ ] 创建用户任务进度表 (task_user_progress)
-- [ ] 创建任务完成日志表 (task_completion_logs)
-- [ ] 创建奖励发放日志表 (task_reward_logs)
-- [ ] 创建任务重置日志表 (task_reset_logs)
-- [ ] 编写数据库迁移文件
-- [ ] 创建数据库索引
-
-### 3.3 核心功能开发 (第3-4周)
-
-#### 第3周:基础功能
-
-- [ ] 实现任务模型类
-- [ ] 实现任务条件模型类
-- [ ] 实现任务奖励模型类
-- [ ] 实现用户任务模型类
-- [ ] 实现任务服务类 (TaskService)
-- [ ] 实现条件处理器基类
-- [ ] 实现基本条件处理器 (登录、等级等)
-- [ ] 实现任务进度跟踪机制
-
-#### 第4周:高级功能
-
-- [ ] 实现任务条件验证器
-- [ ] 实现任务完成检查器
-- [ ] 实现奖励发放服务
-- [ ] 实现任务重置机制
-- [ ] 实现任务事件监听器
-- [ ] 实现任务事件分发器
-- [ ] 实现复杂条件处理器 (种植、收获等)
-
-### 3.4 模块接口开发 (第4周)
-
-- [ ] 实现任务获取方法
-- [ ] 实现任务详情查询方法
-- [ ] 实现任务接取方法
-- [ ] 实现任务放弃方法
-- [ ] 实现任务进度查询方法
-- [ ] 实现任务完成方法
-- [ ] 实现任务奖励领取方法
-- [ ] 实现任务事件监听器
-
-### 3.5 配置工具开发 (第5周)
-
-- [ ] 实现任务配置生成命令
-- [ ] 实现任务配置导入命令
-- [ ] 实现任务配置验证命令
-- [ ] 实现任务配置导出命令
-- [ ] 实现任务配置版本控制
-- [ ] 开发任务管理后台界面
-
-### 3.6 单元测试与集成测试 (第6周)
-
-- [ ] 编写任务服务单元测试
-- [ ] 编写条件处理器单元测试
-- [ ] 编写奖励发放服务单元测试
-- [ ] 编写模块接口单元测试
-- [ ] 编写集成测试
-- [ ] 编写性能测试
-- [ ] 修复测试中发现的问题
-
-### 3.7 文档完善与上线准备 (第7周)
-
-- [ ] 完善模块接口文档
-- [ ] 完善数据库设计文档
-- [ ] 完善配置表文档
-- [ ] 编写开发者指南
-- [ ] 编写运维指南
-- [ ] 准备上线检查清单
-- [ ] 进行上线前最终测试
-
-## 4. 关键里程碑
-
-1. **设计完成** - 第1周末
-   - 完成所有设计文档
-   - 确定数据库结构
-   - 确定模块接口
-
-2. **数据库结构实现完成** - 第2周末
-   - 所有数据库表创建完成
-   - 迁移文件编写完成
-   - 索引创建完成
-
-3. **核心功能开发完成** - 第4周末
-   - 所有模型类实现完成
-   - 所有服务类实现完成
-   - 所有处理器实现完成
-
-4. **模块接口开发完成** - 第4周末
-   - 所有模块接口实现完成
-   - 任务事件监听器实现完成
-   - 模块内部集成测试通过
-
-5. **配置工具开发完成** - 第5周末
-   - 所有命令行工具实现完成
-   - 管理后台界面开发完成
-
-6. **测试完成** - 第6周末
-   - 所有单元测试通过
-   - 所有集成测试通过
-   - 性能测试达标
-
-7. **上线准备完成** - 第7周末
-   - 所有文档完善
-   - 上线检查清单完成
-   - 最终测试通过
-
-## 5. 开发资源
-
-### 5.1 人员配置
-
-- 1名后端开发工程师(全职)
-- 1名前端开发工程师(兼职,负责管理后台界面)
-- 1名测试工程师(兼职)
-- 1名产品经理(兼职)
-
-### 5.2 技术栈
-
-- 后端:PHP 8.1 + Laravel 9.x
-- 数据库:MySQL 8.0
-- 缓存:Redis 6.x
-- 前端:Vue.js 3.x + Element Plus
-- 协议:Protocol Buffers 3
-
-### 5.3 开发环境
-
-- 开发环境:Docker容器化
-- 版本控制:Git
-- CI/CD:Jenkins
-- 代码质量:PHPStan + PHP_CodeSniffer
-- 测试框架:PHPUnit
-
-## 6. 风险评估与应对策略
-
-### 6.1 潜在风险
-
-1. **性能风险**:任务进度更新频繁可能导致数据库压力过大
-   - 应对策略:使用Redis缓存任务进度,定期批量更新数据库
-
-2. **扩展性风险**:任务类型和条件类型可能不断增加
-   - 应对策略:采用策略模式和工厂模式,便于扩展新的任务类型和条件类型
-
-3. **数据一致性风险**:奖励发放过程中可能出现中断
-   - 应对策略:使用事务确保奖励发放的原子性,记录详细的操作日志
-
-4. **并发风险**:多个条件同时触发可能导致任务状态混乱
-   - 应对策略:使用乐观锁或悲观锁确保任务状态更新的一致性
-
-### 6.2 依赖项
-
-1. 用户模块 - 获取用户信息
-2. 物品模块 - 发放物品奖励
-3. 货币模块 - 发放货币奖励
-4. 经验模块 - 发放经验奖励
-5. 事件系统 - 监听游戏事件
-
-## 7. 上线计划
-
-1. **预发布环境部署** - 第8周初
-   - 部署到预发布环境
-   - 进行最终测试
-   - 修复发现的问题
-
-2. **灰度发布** - 第8周中
-   - 选择5%的用户进行灰度测试
-   - 监控系统性能和稳定性
-   - 收集用户反馈
-
-3. **全量发布** - 第8周末
-   - 部署到生产环境
-   - 全量开放功能
-   - 持续监控系统状态
-
-4. **上线后支持** - 第9周
-   - 密切监控系统运行情况
-   - 及时响应用户反馈
-   - 准备必要的热修复
-
-## 8. 后续迭代计划
-
-### 8.1 第二阶段(上线后1-2个月)
-
-- 实现更多类型的任务条件
-- 优化任务推荐算法
-- 增加任务链功能
-- 增加任务成就系统
-
-### 8.2 第三阶段(上线后3-6个月)
-
-- 实现任务数据分析功能
-- 增加任务A/B测试功能
-- 实现任务自动生成功能
-- 优化任务系统性能
-
-## 9. 开发规范
-
-### 9.1 代码规范
-
-- 遵循PSR-12编码规范
-- 使用强类型声明
-- 编写完整的PHPDoc注释
-- 遵循SOLID原则
-
-### 9.2 Git提交规范
-
-- 使用语义化提交信息
-- 每个功能创建独立分支
-- 提交前进行代码审查
-- 合并前确保测试通过
-
-### 9.3 文档规范
-
-- API文档使用OpenAPI规范
-- 代码文档使用PHPDoc规范
-- 设计文档使用Markdown格式
-- 保持文档与代码同步更新
-
-## 10. 总结
-
-任务模块是游戏系统的核心功能之一,通过本开发计划,我们将在8周内完成任务模块的设计、开发、测试和上线。开发过程中将遵循敏捷开发方法,每周进行迭代和评审,确保开发质量和进度。
-
-上线后,我们将持续收集用户反馈,不断优化和完善任务系统,提升用户体验和系统性能。

+ 0 - 418
app/Module/Task/Docs/Proto设计.md

@@ -1,418 +0,0 @@
-# 任务模块Proto设计
-
-## 1. 概述
-
-本文档描述了任务模块的Protocol Buffers (proto) 设计,包括请求和响应消息的定义、字段说明以及与现有系统的集成方式。任务模块的proto设计遵循系统现有的proto通信模式,提供标准化的数据交换格式。
-
-## 2. Proto文件结构
-
-任务模块的proto定义建议添加到系统的主proto文件(`proto/game.proto`)中,或者创建独立的`task.proto`文件并在主文件中导入。
-
-### 2.1 建议的文件结构
-
-```protobuf
-// task.proto
-syntax = "proto3";
-
-package uraus.kku;
-
-// 导入公共定义
-import "common.proto";
-
-// 任务相关请求消息
-
-// RequestTaskList: 获取任务列表的请求
-// 用于获取符合条件的任务列表,支持分页和多种过滤条件
-// 可根据分类、类型和状态进行过滤,并支持分页显示
-// 客户端可以使用该接口实现任务列表页面的数据加载
-// 对应响应:ResponseTaskList
-message RequestTaskList {
-  int32 category_id = 1;        // 任务分类ID,可选
-  string type = 2;              // 任务类型,可选
-  int32 status = 3;             // 任务状态,可选
-  int32 page = 4;               // 页码,默认1
-  int32 page_size = 5;          // 每页数量,默认20
-}
-
-// RequestTaskDetail: 获取任务详情的请求
-// 用于获取指定任务的详细信息,包括任务基本信息、条件和进度
-// 客户端可以使用该接口实现任务详情页面的数据加载
-// 对应响应:ResponseTaskDetail
-message RequestTaskDetail {
-  int32 task_id = 1;            // 任务ID,必填
-}
-
-// RequestTaskAccept: 接取任务的请求
-// 用于接取指定的任务,将任务添加到用户的任务列表中
-// 接取任务后,用户可以开始完成任务并获得进度跟踪
-// 对应响应:ResponseTaskAccept
-message RequestTaskAccept {
-  int32 task_id = 1;            // 任务ID,必填
-}
-
-// RequestTaskAbandon: 放弃任务的请求
-// 用于放弃已接取但尚未完成的任务
-// 放弃任务后,任务进度将被重置,需要重新接取才能继续
-// 对应响应:ResponseTaskAbandon
-message RequestTaskAbandon {
-  int32 task_id = 1;            // 任务ID,必填
-}
-
-
-
-
-// 任务相关响应消息
-
-// ResponseTaskList: 任务列表查询的响应
-// 返回符合条件的任务列表,包含分页信息和任务基本数据
-// 客户端可以使用该响应渲染任务列表页面
-// 对应请求:RequestTaskList
-message ResponseTaskList {
-  int32 total = 1;                      // 总任务数
-  int32 page = 2;                       // 当前页码
-  int32 page_size = 3;                  // 每页数量
-  repeated TaskInfo tasks = 4;          // 任务列表
-}
-
-// ResponseTaskDetail: 任务详情查询的响应
-// 返回指定任务的详细信息,包括任务基本信息、条件和当前进度
-// 客户端可以使用该响应渲染任务详情页面
-// 对应请求:RequestTaskDetail
-message ResponseTaskDetail {
-  TaskInfo task = 1;                    // 任务详情
-  repeated TaskConditionInfo conditions = 2;  // 任务条件详情
-  TaskProgressInfo progress = 3;        // 任务进度
-}
-
-// ResponseTaskAccept: 接取任务的响应
-// 返回任务接取的结果,包括成功标志、提示消息、任务信息和消耗信息
-// 如果接取成功,返回任务的详细信息和消耗的资源;如果失败,返回错误消息
-// 对应请求:RequestTaskAccept
-message ResponseTaskAccept {
-  bool success = 1;                     // 是否成功
-  string message = 2;                   // 消息
-  TaskInfo task = 3;                    // 接取的任务信息
-  repeated CostInfo costs = 4;          // 消耗的资源
-}
-
-// ResponseTaskAbandon: 放弃任务的响应
-// 返回任务放弃的结果,包括成功标志和提示消息
-// 如果放弃成功,任务将从用户的任务列表中移除
-// 对应请求:RequestTaskAbandon
-message ResponseTaskAbandon {
-  bool success = 1;                     // 是否成功
-  string message = 2;                   // 消息
-}
-
-// ResponseTaskComplete: 完成任务的响应
-// 返回任务完成的结果,包括成功标志、提示消息和可领取的奖励
-// 如果完成成功,返回可领取的奖励列表;如果失败,返回错误消息
-// 对应请求:RequestTaskComplete
-message ResponseTaskComplete {
-  bool success = 1;                     // 是否成功
-  string message = 2;                   // 消息
-  repeated RewardInfo rewards = 3;      // 可领取的奖励
-}
-
-// ResponseTaskClaimReward: 领取任务奖励的响应
-// 返回奖励领取的结果,包括成功标志、提示消息和已领取的奖励
-// 如果领取成功,返回已领取的奖励列表;如果失败,返回错误消息
-// 对应请求:RequestTaskClaimReward
-message ResponseTaskClaimReward {
-  bool success = 1;                     // 是否成功
-  string message = 2;                   // 消息
-  repeated RewardInfo rewards = 3;      // 已领取的奖励
-}
-
-// ResponseTaskProgress: 任务进度查询的响应
-// 返回用户当前的任务进度情况,包含一个或多个任务的进度信息
-// 客户端可以使用该响应更新任务进度显示
-// 对应请求:RequestTaskProgress
-message ResponseTaskProgress {
-  repeated TaskProgressInfo progress_list = 1;  // 任务进度列表
-}
-
-// 任务信息
-// TaskInfo: 任务的基本信息
-// 包含任务的完整属性,用于在客户端显示任务信息和状态
-// 在任务列表、任务详情和任务接取等响应中使用
-message TaskInfo {
-  int32 id = 1;                         // 任务ID
-  string name = 2;                      // 任务名称
-  string description = 3;               // 任务描述
-  string type = 4;                      // 任务类型
-  CategoryInfo category = 5;            // 任务分类
-  string target_type = 6;               // 目标类型
-  int32 target_count = 7;               // 目标数量
-  int32 current_progress = 8;           // 当前进度
-  int32 status = 9;                     // 任务状态
-  repeated RewardInfo rewards = 10;     // 奖励列表
-  repeated CostInfo costs = 11;         // 接取消耗列表
-  int32 time_limit = 12;                // 时间限制(秒)
-  string expire_at = 13;                // 过期时间
-  bool is_available = 14;               // 是否可用
-  int32 level_required = 15;            // 所需等级
-  string reset_type = 16;               // 重置类型
-  string display_params = 17;           // 显示参数(JSON字符串)
-  int32 max_completions = 18;           // 最大完成次数
-  int32 sort_order = 19;                // 排序权重
-}
-
-// 任务分类信息
-// CategoryInfo: 任务分类的基本信息
-// 包含任务分类的ID、名称和编码,用于在客户端对任务进行分类显示
-// 在TaskInfo中作为子字段使用
-message CategoryInfo {
-  int32 id = 1;                         // 分类ID
-  string name = 2;                      // 分类名称
-  string code = 3;                      // 分类编码
-}
-
-// 任务条件信息
-// TaskConditionInfo: 任务完成条件的信息
-// 包含任务条件的完整属性,用于在客户端显示任务条件和进度
-// 在ResponseTaskDetail响应中作为条件列表使用
-message TaskConditionInfo {
-  int32 id = 1;                         // 条件ID
-  string condition_type = 2;            // 条件类型
-  int32 target_value = 3;               // 目标值
-  string operator = 4;                  // 运算符
-  bool is_required = 5;                 // 是否必须
-  string params_json = 6;               // 条件参数(JSON字符串)
-}
-
-// 任务进度信息
-// TaskProgressInfo: 任务完成进度的信息
-// 包含任务的当前进度和目标值,以及各条件的进度详情
-// 在ResponseTaskProgress响应和ResponseTaskDetail响应中使用
-message TaskProgressInfo {
-  int32 task_id = 1;                    // 任务ID
-  int32 current_value = 2;              // 当前值
-  int32 target_value = 3;               // 目标值
-  int32 percentage = 4;                 // 完成百分比
-  bool is_completed = 5;                // 是否已完成
-  repeated ConditionProgressInfo condition_progress = 6;  // 条件进度
-}
-
-// 条件进度信息
-// ConditionProgressInfo: 单个条件的进度信息
-// 包含条件的当前进度和目标值,以及完成状态
-// 在TaskProgressInfo中作为条件进度列表使用
-message ConditionProgressInfo {
-  int32 condition_id = 1;               // 条件ID
-  int32 current_value = 2;              // 当前值
-  int32 target_value = 3;               // 目标值
-  bool is_completed = 4;                // 是否已完成
-}
-
-// 奖励信息
-// RewardInfo: 任务奖励的信息
-// 包含奖励的类型、参数、名称、数量和图标等信息
-// 在TaskInfo中作为奖励列表使用,以及在奖励相关响应中使用
-message RewardInfo {
-  string reward_type = 1;               // 奖励类型
-  string reward_param1 = 2;             // 奖励参数1
-  string reward_param2 = 3;             // 奖励参数2
-  string reward_name = 4;               // 奖励名称
-  int32 quantity = 5;                   // 数量
-  string icon = 6;                      // 图标
-  int32 sort_order = 7;                 // 排序权重
-}
-
-// 消耗信息
-// CostInfo: 任务接取消耗的信息
-// 包含消耗的类型、参数、名称、数量和图标等信息
-// 在TaskInfo中作为消耗列表使用,以及在任务接取相关响应中使用
-message CostInfo {
-  string cost_type = 1;                 // 消耗类型
-  string cost_param1 = 2;               // 消耗参数1
-  string cost_param2 = 3;               // 消耗参数2
-  string cost_name = 4;                 // 消耗名称
-  int32 quantity = 5;                   // 数量
-  string icon = 6;                      // 图标
-  int32 sort_order = 7;                 // 排序权重
-}
-```
-
-## 3. 与现有系统集成
-
-### 3.1 在主proto文件中添加任务模块
-
-在`proto/game.proto`文件中,需要在Request和Response消息中添加任务模块的字段:
-
-```protobuf
-// 在Request消息中添加
-message Request {
-  // 现有字段...
-
-  RequestTaskList task_list = 500;
-  RequestTaskDetail task_detail = 501;
-  RequestTaskAccept task_accept = 502;
-  RequestTaskAbandon task_abandon = 503;
-  RequestTaskComplete task_complete = 504;
-  RequestTaskClaimReward task_claim_reward = 505;
-  RequestTaskProgress task_progress = 506;
-}
-
-// 在Response消息中添加
-message Response {
-  // 现有字段...
-
-  ResponseTaskList task_list = 500;
-  ResponseTaskDetail task_detail = 501;
-  ResponseTaskAccept task_accept = 502;
-  ResponseTaskAbandon task_abandon = 503;
-  ResponseTaskComplete task_complete = 504;
-  ResponseTaskClaimReward task_claim_reward = 505;
-  ResponseTaskProgress task_progress = 506;
-}
-```
-
-### 3.2 更新proto路由配置
-
-在`config/proto_route.php`文件中添加任务模块的路由配置:
-
-```php
-'task' => [
-    'list',
-    'detail',
-    'accept',
-    'abandon',
-    'complete',
-    'claim_reward',
-    'progress',
-],
-```
-
-## 4. 处理器实现
-
-为了处理任务模块的proto请求,需要在`App\Module\AppGame\Handler\Task`目录下创建相应的处理器类:
-
-```
-app/Module/AppGame/Handler/Task/
-├── ListHandler.php
-├── DetailHandler.php
-├── AcceptHandler.php
-├── AbandonHandler.php
-├── CompleteHandler.php
-├── ClaimRewardHandler.php
-└── ProgressHandler.php
-```
-
-每个处理器类需要实现相应的处理逻辑,并返回对应的响应消息。
-
-### 4.1 处理器示例
-
-```php
-<?php
-
-namespace App\Module\AppGame\Handler\Task;
-
-use App\Module\AppGame\Handler\BaseHandler;
-use App\Module\Task\Services\TaskService;
-use Uraus\Kku\Request\RequestTaskList;
-use Uraus\Kku\Response\ResponseTaskList;
-
-class ListHandler extends BaseHandler
-{
-    protected $taskService;
-
-    public function __construct(TaskService $taskService)
-    {
-        $this->taskService = $taskService;
-    }
-
-    public function handle(RequestTaskList $request)
-    {
-        // 获取请求参数
-        $categoryId = $request->getCategoryId();
-        $type = $request->getType();
-        $status = $request->getStatus();
-        $page = $request->getPage() ?: 1;
-        $pageSize = $request->getPageSize() ?: 20;
-
-        // 调用服务获取任务列表
-        $result = $this->taskService->getTaskList(
-            $this->userId,
-            $categoryId,
-            $type,
-            $status,
-            $page,
-            $pageSize
-        );
-
-        // 构建响应
-        $response = new ResponseTaskList();
-        $response->setTotal($result['total']);
-        $response->setPage($page);
-        $response->setPageSize($pageSize);
-
-        // 添加任务列表
-        foreach ($result['list'] as $task) {
-            $taskInfo = $this->buildTaskInfo($task);
-            $response->addTasks($taskInfo);
-        }
-
-        return $response;
-    }
-
-    protected function buildTaskInfo($task)
-    {
-        // 构建TaskInfo对象
-        // ...
-    }
-}
-```
-
-## 5. 事件通知
-
-任务模块可以通过WebSocket或其他实时通信方式向客户端推送事件通知。以下是建议的事件通知proto定义:
-
-```protobuf
-// 任务进度更新通知
-// TaskProgressUpdatedEvent: 任务进度更新的事件通知
-// 当任务进度发生变化时,服务器向客户端推送该事件
-// 客户端可以根据该事件实时更新任务进度显示
-message TaskProgressUpdatedEvent {
-  int32 task_id = 1;                // 任务ID
-  int32 old_progress = 2;           // 旧进度
-  int32 new_progress = 3;           // 新进度
-  int32 target_count = 4;           // 目标数量
-  int32 percentage = 5;             // 完成百分比
-  bool is_completed = 6;            // 是否已完成
-}
-
-// 任务完成通知
-// TaskCompletedEvent: 任务完成的事件通知
-// 当任务完成时,服务器向客户端推送该事件
-// 客户端可以根据该事件显示任务完成提示和奖励信息
-message TaskCompletedEvent {
-  int32 task_id = 1;                // 任务ID
-  string task_name = 2;             // 任务名称
-  repeated RewardInfo rewards = 3;  // 奖励列表
-  string completed_at = 4;          // 完成时间
-}
-
-// 任务过期通知
-// TaskExpiringEvent: 任务即将过期的事件通知
-// 当任务即将过期时,服务器向客户端推送该事件
-// 客户端可以根据该事件显示任务即将过期的提示,提醒用户尽快完成
-message TaskExpiringEvent {
-  int32 task_id = 1;                // 任务ID
-  string task_name = 2;             // 任务名称
-  string expire_at = 3;             // 过期时间
-  int32 time_remaining = 4;         // 剩余时间(秒)
-}
-
-// 任务消耗通知
-// TaskCostEvent: 任务接取消耗的事件通知
-// 当用户接取需要消耗资源的任务时,服务器向客户端推送该事件
-// 客户端可以根据该事件显示资源消耗提示,并更新用户资源显示
-message TaskCostEvent {
-  int32 task_id = 1;                // 任务ID
-  string task_name = 2;             // 任务名称
-  repeated CostInfo costs = 3;      // 消耗资源列表
-  string cost_at = 4;               // 消耗时间
-}
-```
-

+ 0 - 138
app/Module/Task/Docs/Proto设计_新版.md

@@ -1,138 +0,0 @@
-# 任务模块Proto设计(新版)
-
-## 1. 概述
-
-本文档描述了任务模块的Protocol Buffers (proto) 设计,专注于任务进度相关的内容。由于任务的基本信息、奖励和其他静态数据已通过配置表提供给客户端,proto设计仅包含进度跟踪、任务完成和奖励领取相关的消息结构。本设计支持数据库中定义的多条件任务模型。
-
-## 2. Proto文件结构
-
-任务模块的proto定义建议添加到系统的主proto文件(`proto/game.proto`)中,或者创建独立的`task.proto`文件并在主文件中导入。
-
-### 2.1 建议的文件结构
-
-```protobuf
-// task.proto
-syntax = "proto3";
-
-package uraus.kku;
-
-// 导入公共定义
-import "common.proto";
-
-// 任务相关请求消息
-
-// RequestTaskProgress: 查询任务进度的请求
-// 用于查询一个或多个任务的当前进度
-// 客户端可以使用该接口更新任务进度显示
-// 对应响应:ResponseTaskProgress
-message RequestTaskProgress {
-  repeated int32 task_ids = 1;  // 任务ID列表,可选(为空则查询所有进行中的任务)
-}
-
-// RequestTaskClaimReward: 领取任务奖励的请求
-// 用于领取已完成任务的奖励
-// 领取奖励后,任务状态将更新为已领取奖励
-// 对应响应:ResponseTaskClaimReward
-message RequestTaskClaimReward {
-  int32 task_id = 1;            // 任务ID,必填
-}
-
-// 任务相关响应消息
-
-// ResponseTaskProgress: 任务进度查询的响应
-// 返回用户当前的任务进度情况,包含一个或多个任务的进度信息
-// 客户端可以使用该响应更新任务进度显示
-// 对应请求:RequestTaskProgress
-message ResponseTaskProgress {
-  repeated TaskProgressInfo progress_list = 1;  // 任务进度列表
-}
-
-// ResponseTaskClaimReward: 领取任务奖励的响应
-// 返回奖励领取的结果,包括成功标志和提示消息
-// 如果领取成功,返回成功标志;如果失败,返回错误消息
-// 对应请求:RequestTaskClaimReward
-message ResponseTaskClaimReward {
-  bool success = 1;                     // 是否成功
-  string message = 2;                   // 消息
-}
-
-// 任务进度信息
-// TaskProgressInfo: 任务完成进度的信息
-// 包含任务的当前进度和目标值,以及各条件的进度详情
-// 在ResponseTaskProgress响应中使用
-message TaskProgressInfo {
-  int32 task_id = 1;                    // 任务ID
-  int32 overall_percentage = 2;         // 总体完成百分比(0-100)
-  bool is_completed = 3;                // 是否已完成
-  repeated ConditionProgressInfo condition_progress = 4;  // 条件进度列表
-  int32 status = 5;                     // 任务状态(0:未接取, 1:进行中, 2:已完成, 3:已领取奖励, 4:已失败, 5:已过期)
-}
-
-// 条件进度信息
-// ConditionProgressInfo: 单个条件的进度信息
-// 包含条件的当前进度和目标值,以及完成状态
-// 在TaskProgressInfo中作为条件进度列表使用
-message ConditionProgressInfo {
-  int32 condition_id = 1;               // 条件ID
-  int32 achievement_condition_id = 2;   // 任务达成条件ID
-  string condition_type = 3;            // 条件类型('prerequisite'=前置条件,'progress'=进度条件)
-  int32 current_value = 4;              // 当前值
-  int32 target_value = 5;               // 目标值
-  int32 percentage = 6;                 // 完成百分比(0-100)
-  bool is_completed = 7;                // 是否已完成
-  bool is_required = 8;                 // 是否必须满足
-}
-```
-
-## 3. 事件通知
-
-任务模块可以通过WebSocket或其他实时通信方式向客户端推送事件通知。以下是建议的事件通知proto定义:
-
-```protobuf
-// 任务进度更新通知
-// TaskProgressUpdatedEvent: 任务进度更新的事件通知
-// 当任务进度发生变化时,服务器向客户端推送该事件
-// 客户端可以根据该事件实时更新任务进度显示
-message TaskProgressUpdatedEvent {
-  int32 task_id = 1;                // 任务ID
-  int32 overall_percentage = 2;     // 总体完成百分比(0-100)
-  bool is_completed = 3;            // 是否已完成
-  repeated ConditionProgressInfo updated_conditions = 4; // 更新的条件进度
-}
-
-// 任务完成通知
-// TaskCompletedEvent: 任务完成的事件通知
-// 当任务完成时,服务器向客户端推送该事件
-// 客户端可以根据该事件显示任务完成提示
-message TaskCompletedEvent {
-  int32 task_id = 1;                // 任务ID
-  string completed_at = 2;          // 完成时间
-}
-
-// 任务奖励领取通知
-// TaskRewardClaimedEvent: 任务奖励领取的事件通知
-// 当用户领取任务奖励时,服务器向客户端推送该事件
-// 客户端可以根据该事件显示奖励领取提示
-message TaskRewardClaimedEvent {
-  int32 task_id = 1;                // 任务ID
-  string claimed_at = 2;            // 领取时间
-}
-```
-
-## 4. 设计说明
-
-本设计专注于任务进度相关的内容,具有以下特点:
-
-1. **多条件支持**:
-   - 通过ConditionProgressInfo结构支持一个任务有多个条件
-   - 区分前置条件和进度条件,分别跟踪
-
-2. **进度计算**:
-   - 每个条件单独计算进度百分比
-   - 任务总体进度基于所有必要条件的完成情况
-
-3. **简化设计**:
-   - 移除了与进度无关的字段,如任务名称、描述、奖励等
-   - 事件通知中也只保留必要的进度相关信息
-
-这些变更使Proto设计能够更好地支持数据库中定义的多条件任务模型,同时保持了与现有系统的兼容性。

+ 66 - 0
app/Module/Task/Docs/README.md

@@ -0,0 +1,66 @@
+# 任务模块文档索引
+
+## 概述
+
+任务模块是游戏系统中的核心功能,用于管理各类任务的定义、完成条件、奖励发放和进度跟踪。本目录包含了任务模块的详细设计文档。
+
+## 文档目录
+
+### 1. 基础设计文档
+
+- [设计概述](设计概述.md) - 模块的整体设计思路和架构
+- [数据库设计](数据库设计.md) - 详细的数据库表结构和关系设计
+- [DEV](../DEV.md) - 模块的开发计划和进度
+
+### 2. 功能领域文档
+
+- [任务定义系统](任务定义系统.md) - 任务类型、条件和奖励的定义机制
+- [任务完成系统](任务完成系统.md) - 任务进度跟踪、完成检查和奖励发放机制
+- [任务重置系统](任务重置系统.md) - 任务重置类型和机制
+
+### 3. 开发与实现文档
+
+- [开发指南](开发指南.md) - 模块开发的快速入门指南
+- [事件系统](事件系统.md) - 模块的事件系统设计与实现
+- [配置表设计](配置表设计.md) - 任务模块的配置表设计
+- [缓存策略](缓存策略.md) - 任务模块的缓存策略设计与实现
+
+### 4. 模块集成文档
+
+- [与其他模块集成](与其他模块集成.md) - 任务模块与其他模块的集成方案
+
+## 文档更新记录
+
+| 日期 | 文档 | 更新内容 |
+|------|------|---------|
+| 2023-06-01 | 全部文档 | 初始创建 |
+| 2023-06-02 | 数据库设计 | 添加任务接取消耗表和任务消耗日志表 |
+| 2023-06-04 | 设计概述 | 更新模块架构图和核心组件说明 |
+| 2023-06-10 | 开发指南 | 创建任务模块开发指南文档 |
+| 2023-06-10 | 事件系统 | 创建任务模块事件系统文档 |
+| 2023-06-10 | 配置表设计 | 创建任务模块配置表设计文档 |
+| 2023-06-11 | 文档整理 | 移除重复文档,修复文档引用 |
+| 2023-06-12 | DEV.md | 移除“模块接口文档”,因为任务模块没有API接口 |
+| 2023-06-15 | 任务重置系统 | 创建任务重置系统文档 |
+| 2023-06-16 | 设计概述 | 移除架构设计部分,增加任务机制的详细描述 |
+| 2023-06-17 | 任务重置系统 | 移除具体代码实现,改用伪代码描述思路 |
+| 2023-06-18 | 任务被动重置机制规划 | 创建新文档,规划基于被动重置的任务重置机制 |
+| 2023-06-19 | 任务被动重置机制规划 | 更新文档,添加已执行的SQL语句 |
+| 2023-06-19 | 数据库设计 | 更新数据库表结构,添加被动重置相关字段 |
+
+## 文档规范
+
+1. **命名规范**:文档文件名使用中文,以便于理解
+2. **格式规范**:所有文档使用Markdown格式
+3. **结构规范**:文档应包含标题、概述、正文和总结等部分
+4. **引用规范**:文档间相互引用使用相对路径
+
+## 待完成文档
+
+1. **任务定义系统** - 任务类型、条件和奖励的定义机制
+2. **任务完成系统** - 任务进度跟踪、完成检查和奖励发放机制
+3. **缓存策略** - 任务模块的缓存策略设计与实现
+
+## 联系方式
+
+如有文档相关问题,请联系任务模块负责人。

+ 0 - 370
app/Module/Task/Docs/事件监听设计.md

@@ -1,370 +0,0 @@
-# 任务模块事件监听设计
-
-## 1. 概述
-
-任务模块采用事件驱动架构,通过事件机制与其他模块进行松耦合通信。本文档描述任务模块提供的核心事件以及如何监听这些事件。
-
-## 2. 核心事件
-
-任务模块提供以下核心事件:
-
-### 2.1 任务完成事件 (TaskCompletedEvent)
-
-当用户完成任务时触发此事件。
-
-```php
-/**
- * 当任务完成时触发
- */
-class TaskCompletedEvent
-{
-    public int $userId;        // 用户ID
-    public int $taskId;        // 任务ID
-    public string $taskName;   // 任务名称
-    public string $taskType;   // 任务类型
-    public string $completedAt; // 完成时间
-    public array $rewards;     // 任务奖励内容
-}
-```
-
-### 2.2 任务奖励领取事件 (TaskRewardClaimedEvent)
-
-当用户领取任务奖励时触发此事件。
-
-```php
-/**
- * 当用户领取任务奖励时触发
- */
-class TaskRewardClaimedEvent
-{
-    public int $userId;        // 用户ID
-    public int $taskId;        // 任务ID
-    public string $taskName;   // 任务名称
-    public array $rewards;     // 实际发放的奖励
-    public string $claimedAt;  // 领取时间
-    public bool $isSuccess;    // 奖励是否成功发放
-}
-```
-
-## 3. 事件监听器设计
-
-### 3.1 监听器基类
-
-为了统一处理逻辑,我们设计一个基础监听器类:
-
-```php
-abstract class BaseTaskEventListener
-{
-    /**
-     * 处理事件
-     *
-     * @param mixed $event 事件对象
-     * @return void
-     */
-    abstract public function handle($event): void;
-    
-    /**
-     * 记录事件日志
-     *
-     * @param string $message 日志消息
-     * @param array $context 上下文数据
-     * @return void
-     */
-    protected function logEvent(string $message, array $context = []): void
-    {
-        Log::info($message, $context);
-    }
-}
-```
-
-### 3.2 任务完成事件监听器
-
-```php
-class TaskCompletedListener extends BaseTaskEventListener
-{
-    protected UserService $userService;
-    protected ItemService $itemService;
-    
-    /**
-     * 构造函数
-     */
-    public function __construct(UserService $userService, ItemService $itemService)
-    {
-        $this->userService = $userService;
-        $this->itemService = $itemService;
-    }
-    
-    /**
-     * 处理任务完成事件
-     *
-     * @param TaskCompletedEvent $event
-     * @return void
-     */
-    public function handle($event): void
-    {
-        // 记录日志
-        $this->logEvent("用户 {$event->userId} 完成了任务 {$event->taskName}", [
-            'user_id' => $event->userId,
-            'task_id' => $event->taskId,
-            'task_type' => $event->taskType,
-            'completed_at' => $event->completedAt
-        ]);
-        
-        // 更新用户统计数据
-        $this->userService->incrementTaskCompletionCount($event->userId, $event->taskType);
-        
-        // 发送通知
-        $this->sendTaskCompletionNotification($event->userId, $event->taskName);
-    }
-    
-    /**
-     * 发送任务完成通知
-     *
-     * @param int $userId 用户ID
-     * @param string $taskName 任务名称
-     * @return void
-     */
-    private function sendTaskCompletionNotification(int $userId, string $taskName): void
-    {
-        // 发送通知逻辑
-        // 可以调用通知模块的服务
-    }
-}
-```
-
-### 3.3 任务奖励领取事件监听器
-
-```php
-class TaskRewardClaimedListener extends BaseTaskEventListener
-{
-    protected ItemService $itemService;
-    protected TeamProfitService $teamProfitService;
-    
-    /**
-     * 构造函数
-     */
-    public function __construct(ItemService $itemService, TeamProfitService $teamProfitService)
-    {
-        $this->itemService = $itemService;
-        $this->teamProfitService = $teamProfitService;
-    }
-    
-    /**
-     * 处理任务奖励领取事件
-     *
-     * @param TaskRewardClaimedEvent $event
-     * @return void
-     */
-    public function handle($event): void
-    {
-        // 记录日志
-        $this->logEvent("用户 {$event->userId} 领取了任务 {$event->taskName} 的奖励", [
-            'user_id' => $event->userId,
-            'task_id' => $event->taskId,
-            'rewards' => $event->rewards,
-            'claimed_at' => $event->claimedAt,
-            'is_success' => $event->isSuccess
-        ]);
-        
-        // 如果奖励发放成功
-        if ($event->isSuccess) {
-            // 处理团队收益分成
-            $this->processTeamProfit($event);
-            
-            // 发送奖励领取通知
-            $this->sendRewardNotification($event->userId, $event->taskName, $event->rewards);
-        }
-    }
-    
-    /**
-     * 处理团队收益分成
-     *
-     * @param TaskRewardClaimedEvent $event
-     * @return void
-     */
-    private function processTeamProfit(TaskRewardClaimedEvent $event): void
-    {
-        // 遍历奖励
-        foreach ($event->rewards as $reward) {
-            if (isset($reward['item_id']) && isset($reward['quantity'])) {
-                // 记录任务完成收益
-                $this->teamProfitService->recordTaskCompleteProfit(
-                    $event->userId,
-                    $event->taskId,
-                    $reward['item_id'],
-                    $reward['quantity']
-                );
-            }
-        }
-    }
-    
-    /**
-     * 发送奖励领取通知
-     *
-     * @param int $userId 用户ID
-     * @param string $taskName 任务名称
-     * @param array $rewards 奖励内容
-     * @return void
-     */
-    private function sendRewardNotification(int $userId, string $taskName, array $rewards): void
-    {
-        // 发送通知逻辑
-        // 可以调用通知模块的服务
-    }
-}
-```
-
-## 4. 事件注册
-
-在任务模块的服务提供者中注册事件监听器:
-
-```php
-// app/Module/Task/Providers/TaskServiceProvider.php
-public function boot()
-{
-    // 注册事件监听器
-    $this->app['events']->listen(
-        \App\Module\Task\Events\TaskCompletedEvent::class,
-        \App\Module\Task\Listeners\TaskCompletedListener::class
-    );
-    
-    $this->app['events']->listen(
-        \App\Module\Task\Events\TaskRewardClaimedEvent::class,
-        \App\Module\Task\Listeners\TaskRewardClaimedListener::class
-    );
-}
-```
-
-## 5. 与其他模块的集成
-
-### 5.1 与物品模块集成
-
-任务奖励领取事件可以触发物品模块的相关操作:
-
-```php
-// 在TaskRewardClaimedListener中
-private function processItemRewards(TaskRewardClaimedEvent $event): void
-{
-    foreach ($event->rewards as $reward) {
-        if (isset($reward['item_id']) && isset($reward['quantity'])) {
-            // 调用物品模块服务添加物品
-            $this->itemService->addItem(
-                $event->userId,
-                $reward['item_id'],
-                $reward['quantity'],
-                [
-                    'source_type' => 'task_reward',
-                    'source_id' => $event->taskId,
-                    'details' => ['task_name' => $event->taskName]
-                ]
-            );
-        }
-    }
-}
-```
-
-### 5.2 与团队模块集成
-
-任务奖励领取事件可以触发团队收益分成:
-
-```php
-// 在TaskRewardClaimedListener中
-private function processTeamProfit(TaskRewardClaimedEvent $event): void
-{
-    foreach ($event->rewards as $reward) {
-        if (isset($reward['item_id']) && isset($reward['quantity'])) {
-            // 调用团队模块服务记录任务完成收益
-            $this->teamProfitService->recordTaskCompleteProfit(
-                $event->userId,
-                $event->taskId,
-                $reward['item_id'],
-                $reward['quantity']
-            );
-        }
-    }
-}
-```
-
-### 5.3 与通知模块集成
-
-任务完成和奖励领取事件可以触发通知发送:
-
-```php
-// 在TaskCompletedListener中
-private function sendTaskCompletionNotification(int $userId, string $taskName): void
-{
-    // 调用通知模块服务发送通知
-    $this->notificationService->send(
-        $userId,
-        'task_completed',
-        [
-            'task_name' => $taskName,
-            'message' => "恭喜您完成了任务:{$taskName}!"
-        ]
-    );
-}
-```
-
-## 6. 事件触发
-
-在任务服务中触发事件:
-
-```php
-// app/Module/Task/Services/TaskService.php
-
-/**
- * 完成任务
- *
- * @param int $userId 用户ID
- * @param int $taskId 任务ID
- * @return array 完成结果
- */
-public function completeTask(int $userId, int $taskId): array
-{
-    // 任务完成逻辑...
-    
-    // 触发任务完成事件
-    event(new TaskCompletedEvent(
-        $userId,
-        $taskId,
-        $task->name,
-        $task->type,
-        now()->toDateTimeString(),
-        json_decode($task->rewards, true)
-    ));
-    
-    return [
-        'success' => true,
-        'message' => '任务完成成功',
-        'task_id' => $taskId
-    ];
-}
-
-/**
- * 领取任务奖励
- *
- * @param int $userId 用户ID
- * @param int $taskId 任务ID
- * @return array 领取结果
- */
-public function claimTaskReward(int $userId, int $taskId): array
-{
-    // 奖励领取逻辑...
-    
-    // 触发任务奖励领取事件
-    event(new TaskRewardClaimedEvent(
-        $userId,
-        $taskId,
-        $task->name,
-        $rewardsData,
-        now()->toDateTimeString(),
-        true
-    ));
-    
-    return [
-        'success' => true,
-        'message' => '奖励领取成功',
-        'rewards' => $rewardsData
-    ];
-}
-```

+ 493 - 0
app/Module/Task/Docs/事件系统.md

@@ -0,0 +1,493 @@
+# 任务模块事件系统
+
+## 1. 概述
+
+任务模块的事件系统是基于Laravel的事件机制实现的,用于处理任务完成、奖励领取等关键业务流程。通过事件系统,可以实现模块间的解耦,提高代码的可维护性和可扩展性。
+
+本文档详细介绍了任务模块的事件系统设计与实现,包括事件类型、事件监听器、事件分发机制以及如何扩展事件系统。
+
+## 2. 事件类型
+
+任务模块定义了以下核心事件:
+
+### 2.1 TaskCompletedEvent
+
+当用户完成任务时触发此事件。
+
+**事件属性:**
+
+```php
+/**
+ * 用户ID
+ * @var int
+ */
+public int $userId;
+
+/**
+ * 任务ID
+ * @var int
+ */
+public int $taskId;
+
+/**
+ * 任务名称
+ * @var string
+ */
+public string $taskName;
+
+/**
+ * 任务类型
+ * @var string
+ */
+public string $taskType;
+
+/**
+ * 完成时间
+ * @var string
+ */
+public string $completedAt;
+
+/**
+ * 任务奖励内容
+ * @var array
+ */
+public array $rewards;
+```
+
+**触发时机:**
+
+- 用户完成任务的所有条件
+- 系统自动标记任务为已完成
+- 管理员手动标记任务为已完成
+
+### 2.2 TaskRewardClaimedEvent
+
+当用户领取任务奖励时触发此事件。
+
+**事件属性:**
+
+```php
+/**
+ * 用户ID
+ * @var int
+ */
+public int $userId;
+
+/**
+ * 任务ID
+ * @var int
+ */
+public int $taskId;
+
+/**
+ * 任务名称
+ * @var string
+ */
+public string $taskName;
+
+/**
+ * 实际发放的奖励
+ * @var array
+ */
+public array $rewards;
+
+/**
+ * 领取时间
+ * @var string
+ */
+public string $claimedAt;
+
+/**
+ * 奖励是否成功发放
+ * @var bool
+ */
+public bool $isSuccess;
+```
+
+**触发时机:**
+
+- 用户手动领取任务奖励
+- 系统自动发放任务奖励
+- 管理员手动发放任务奖励
+
+## 3. 事件监听器
+
+任务模块实现了以下事件监听器:
+
+### 3.1 TaskCompletedListener
+
+监听任务完成事件,执行相关操作。
+
+**主要功能:**
+
+- 记录任务完成日志
+- 更新用户任务统计数据
+- 发送任务完成通知
+- 检查成就解锁
+
+**实现示例:**
+
+```php
+/**
+ * 处理任务完成事件
+ *
+ * @param TaskCompletedEvent $event
+ * @return void
+ */
+public function handle($event): void
+{
+    // 记录日志
+    $this->logEvent("用户 {$event->userId} 完成了任务 {$event->taskName}", [
+        'user_id' => $event->userId,
+        'task_id' => $event->taskId,
+        'task_type' => $event->taskType,
+        'completed_at' => $event->completedAt,
+        'rewards' => $event->rewards
+    ]);
+    
+    // 更新用户统计数据
+    // $this->updateUserTaskStats($event->userId, $event->taskType);
+    
+    // 发送任务完成通知
+    $this->sendTaskCompletionNotification($event);
+    
+    // 检查成就解锁
+    $this->checkAchievementUnlock($event);
+}
+```
+
+### 3.2 TaskRewardClaimedListener
+
+监听任务奖励领取事件,执行相关操作。
+
+**主要功能:**
+
+- 记录奖励领取日志
+- 更新用户奖励统计数据
+- 发送奖励领取通知
+- 检查特殊奖励触发
+- 处理奖励发放失败情况
+
+**实现示例:**
+
+```php
+/**
+ * 处理任务奖励领取事件
+ *
+ * @param TaskRewardClaimedEvent $event
+ * @return void
+ */
+public function handle($event): void
+{
+    // 记录日志
+    $this->logEvent("用户 {$event->userId} 领取了任务 {$event->taskName} 的奖励", [
+        'user_id' => $event->userId,
+        'task_id' => $event->taskId,
+        'rewards' => $event->rewards,
+        'claimed_at' => $event->claimedAt,
+        'is_success' => $event->isSuccess
+    ]);
+    
+    // 如果奖励发放成功
+    if ($event->isSuccess) {
+        // 更新用户统计数据
+        // $this->updateUserRewardStats($event->userId, $event->rewards);
+        
+        // 发送奖励领取通知
+        $this->sendRewardClaimedNotification($event);
+        
+        // 检查特殊奖励触发
+        $this->checkSpecialRewardTrigger($event);
+    } else {
+        // 处理奖励发放失败的情况
+        $this->handleRewardFailure($event);
+    }
+}
+```
+
+## 4. 事件注册与分发
+
+任务模块通过TaskServiceProvider注册事件和监听器:
+
+```php
+/**
+ * 应用程序的事件监听器映射
+ *
+ * @var array
+ */
+protected $listen = [
+    TaskCompletedEvent::class => [
+        TaskCompletedListener::class,
+    ],
+    TaskRewardClaimedEvent::class => [
+        TaskRewardClaimedListener::class,
+    ],
+];
+
+/**
+ * 引导服务
+ *
+ * @return void
+ */
+public function boot(): void
+{
+    // 注册事件监听器
+    foreach ($this->listen as $event => $listeners) {
+        foreach ($listeners as $listener) {
+            $this->app['events']->listen($event, $listener);
+        }
+    }
+}
+```
+
+## 5. 事件分发示例
+
+### 5.1 分发任务完成事件
+
+```php
+use App\Module\Task\Events\TaskCompletedEvent;
+use Illuminate\Support\Facades\Event;
+
+// 在任务服务中分发任务完成事件
+public function completeTask($userId, $taskId)
+{
+    // 获取任务信息
+    $task = $this->taskRepository->find($taskId);
+    
+    // 更新任务状态
+    $userTask = $this->userTaskRepository->getUserTask($userId, $taskId);
+    $userTask->status = 2; // 已完成
+    $userTask->completed_at = now();
+    $userTask->save();
+    
+    // 获取任务奖励
+    $rewards = $this->rewardRepository->getRewardsByTaskId($taskId);
+    
+    // 分发任务完成事件
+    Event::dispatch(new TaskCompletedEvent(
+        $userId,
+        $taskId,
+        $task->name,
+        $task->type,
+        now()->toDateTimeString(),
+        $rewards
+    ));
+    
+    return true;
+}
+```
+
+### 5.2 分发任务奖励领取事件
+
+```php
+use App\Module\Task\Events\TaskRewardClaimedEvent;
+use Illuminate\Support\Facades\Event;
+
+// 在奖励服务中分发任务奖励领取事件
+public function claimReward($userId, $taskId)
+{
+    // 获取任务信息
+    $task = $this->taskRepository->find($taskId);
+    
+    // 获取任务奖励
+    $rewards = $this->rewardRepository->getRewardsByTaskId($taskId);
+    
+    // 发放奖励
+    $isSuccess = $this->dispatchRewards($userId, $rewards);
+    
+    // 更新任务状态
+    if ($isSuccess) {
+        $userTask = $this->userTaskRepository->getUserTask($userId, $taskId);
+        $userTask->status = 3; // 已领取奖励
+        $userTask->rewarded_at = now();
+        $userTask->save();
+    }
+    
+    // 分发任务奖励领取事件
+    Event::dispatch(new TaskRewardClaimedEvent(
+        $userId,
+        $taskId,
+        $task->name,
+        $rewards,
+        now()->toDateTimeString(),
+        $isSuccess
+    ));
+    
+    return $isSuccess;
+}
+```
+
+## 6. 扩展事件系统
+
+### 6.1 添加新的事件
+
+要添加新的事件,需要创建事件类并在TaskServiceProvider中注册:
+
+```php
+// 创建新的事件类
+namespace App\Module\Task\Events;
+
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+class TaskResetEvent
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+    
+    /**
+     * 重置类型
+     * @var string
+     */
+    public string $resetType;
+    
+    /**
+     * 重置时间
+     * @var string
+     */
+    public string $resetTime;
+    
+    /**
+     * 受影响的任务ID列表
+     * @var array
+     */
+    public array $affectedTasks;
+    
+    /**
+     * 创建一个新的事件实例
+     *
+     * @param string $resetType
+     * @param string $resetTime
+     * @param array $affectedTasks
+     */
+    public function __construct(string $resetType, string $resetTime, array $affectedTasks)
+    {
+        $this->resetType = $resetType;
+        $this->resetTime = $resetTime;
+        $this->affectedTasks = $affectedTasks;
+    }
+}
+```
+
+### 6.2 添加新的监听器
+
+要添加新的监听器,需要创建监听器类并在TaskServiceProvider中注册:
+
+```php
+// 创建新的监听器类
+namespace App\Module\Task\Listeners;
+
+use App\Module\Task\Events\TaskResetEvent;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+class TaskResetListener extends BaseTaskEventListener implements ShouldQueue
+{
+    /**
+     * 创建监听器实例
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * 处理任务重置事件
+     *
+     * @param TaskResetEvent $event
+     * @return void
+     */
+    public function handle($event): void
+    {
+        // 记录日志
+        $this->logEvent("任务重置:{$event->resetType}", [
+            'reset_type' => $event->resetType,
+            'reset_time' => $event->resetTime,
+            'affected_tasks' => $event->affectedTasks
+        ]);
+        
+        // 处理任务重置逻辑
+        // ...
+    }
+}
+```
+
+### 6.3 在TaskServiceProvider中注册新的事件和监听器
+
+```php
+/**
+ * 应用程序的事件监听器映射
+ *
+ * @var array
+ */
+protected $listen = [
+    TaskCompletedEvent::class => [
+        TaskCompletedListener::class,
+    ],
+    TaskRewardClaimedEvent::class => [
+        TaskRewardClaimedListener::class,
+    ],
+    TaskResetEvent::class => [
+        TaskResetListener::class,
+    ],
+];
+```
+
+## 7. 最佳实践
+
+1. **事件应该是轻量级的**:事件对象应该只包含必要的数据,避免包含大量数据或复杂对象
+2. **监听器应该是专注的**:每个监听器应该只关注一个特定的功能,避免在一个监听器中实现多个不相关的功能
+3. **使用队列处理耗时操作**:对于耗时的操作,应该使用队列处理,避免阻塞主流程
+4. **记录关键日志**:在事件处理过程中记录关键日志,便于问题排查
+5. **使用事务确保数据一致性**:在涉及多个数据操作的场景中,使用事务确保数据一致性
+
+## 8. 常见问题与解决方案
+
+### 8.1 事件没有被触发
+
+可能的原因:
+- 事件没有被正确分发
+- 事件类名或命名空间错误
+
+解决方案:
+- 检查事件分发代码
+- 检查事件类名和命名空间是否正确
+
+### 8.2 监听器没有执行
+
+可能的原因:
+- 监听器没有被正确注册
+- 监听器类名或命名空间错误
+- 队列配置错误(对于实现ShouldQueue的监听器)
+
+解决方案:
+- 检查TaskServiceProvider中的监听器注册
+- 检查监听器类名和命名空间是否正确
+- 检查队列配置是否正确
+
+### 8.3 监听器执行但没有预期效果
+
+可能的原因:
+- 监听器逻辑错误
+- 依赖服务异常
+
+解决方案:
+- 检查监听器逻辑
+- 检查依赖服务是否正常
+- 添加更详细的日志,便于排查问题
+
+## 9. 参考资料
+
+- [Laravel 事件系统文档](https://laravel.com/docs/events)
+- [Laravel 队列文档](https://laravel.com/docs/queues)
+- [任务模块设计概述](设计概述.md)
+- [任务模块开发指南](开发指南.md)
+
+## 10. 更新历史
+
+| 日期 | 版本 | 更新内容 |
+|------|------|---------|
+| 2023-06-10 | 1.0 | 初始版本 |
+| 2023-06-15 | 1.1 | 添加扩展事件系统章节 |
+| 2023-06-20 | 1.2 | 添加常见问题与解决方案 |

+ 332 - 0
app/Module/Task/Docs/任务被动重置机制规划.md

@@ -0,0 +1,332 @@
+# 任务被动重置机制规划
+
+## 1. 概述
+
+当前任务系统采用主动重置方案,即在固定时间点(如每日凌晨0点)通过计划任务批量重置所有符合条件的任务。这种方式虽然实现简单,但存在以下问题:
+
+1. **资源浪费**:需要一次性处理大量数据,造成数据库和服务器负载峰值
+2. **时效性问题**:用户可能处于不同时区,固定时间点的重置不够灵活
+3. **扩展性限制**:随着用户量增长,批量重置的性能瓶颈会越来越明显
+4. **不必要的处理**:许多被重置的任务可能很长时间都不会被用户查看或使用
+
+为解决这些问题,本文档提出采用被动重置方案,即在任务需要更新或被使用时才进行重置。这种方式可以显著减少系统资源消耗,提高系统响应速度,并提供更好的用户体验。
+
+## 2. 被动重置机制设计
+
+### 2.1 核心思想
+
+被动重置的核心思想是"按需重置",只有当用户实际需要访问或使用任务时,才检查并执行重置操作。具体来说:
+
+1. **不再使用定时任务批量重置**:移除现有的每日/每周/每月重置计划任务
+2. **添加重置时间标记**:为每个任务类型记录下一次应该重置的时间
+3. **访问时检查重置**:当用户查询任务或与任务交互时,检查是否需要重置
+4. **延迟写入**:重置操作可以异步执行,不阻塞用户请求
+
+### 2.2 重置触发点
+
+在以下场景中触发重置检查:
+
+1. **任务列表查询**:用户查看任务列表时
+2. **任务详情查询**:用户查看特定任务详情时
+3. **任务接取操作**:用户接取任务时
+4. **任务进度更新**:任务进度更新时
+5. **任务奖励领取**:用户领取任务奖励时
+6. **后台管理操作**:管理员在后台操作任务时
+
+### 2.3 重置判断逻辑
+
+当触发重置检查时,系统需要判断任务是否需要重置:
+
+1. **获取任务重置类型**:daily、weekly、monthly或none
+2. **计算下次重置时间**:基于上次重置时间和重置类型
+3. **比较当前时间**:如果当前时间已超过下次重置时间,则需要重置
+4. **检查任务状态**:只有已完成或已领取奖励的任务才需要重置
+
+### 2.4 重置执行方式
+
+为了不影响用户体验,重置操作应该尽可能高效:
+
+1. **单任务重置**:只重置当前用户正在访问的任务,而不是批量重置
+2. **延迟写入**:可以将重置操作放入队列异步执行
+3. **缓存标记**:使用缓存记录已重置的任务,避免重复检查
+4. **分批处理**:对于需要批量处理的场景,采用分批处理策略
+
+## 3. 数据结构调整
+
+### 3.1 任务表(task_tasks)
+
+添加以下字段:
+
+| 字段名 | 类型 | 描述 |
+|-------|------|------|
+| reset_interval | int | 重置间隔(秒),根据重置类型自动计算 |
+| reset_time_field | varchar | 重置时间字段,如"daily_reset_time",用于存储具体重置时间点 |
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_tasks` 
+ADD COLUMN `reset_interval` int(11) NOT NULL DEFAULT 0 COMMENT '重置间隔(秒),根据重置类型自动计算',
+ADD COLUMN `reset_time_field` varchar(50) DEFAULT NULL COMMENT '重置时间字段,如"daily_reset_time",用于存储具体重置时间点';
+```
+
+### 3.2 用户任务表(task_user_tasks)
+
+添加以下字段:
+
+| 字段名 | 类型 | 描述 |
+|-------|------|------|
+| next_reset_time | timestamp | 下次重置时间,用于快速判断是否需要重置 |
+| last_reset_time | timestamp | 上次重置时间,用于计算下次重置时间 |
+| reset_count | int | 重置次数,用于统计和分析 |
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_user_tasks` 
+ADD COLUMN `next_reset_time` timestamp NULL DEFAULT NULL COMMENT '下次重置时间,用于快速判断是否需要重置',
+ADD COLUMN `last_reset_time` timestamp NULL DEFAULT NULL COMMENT '上次重置时间,用于计算下次重置时间',
+ADD COLUMN `reset_count` int(11) NOT NULL DEFAULT 0 COMMENT '重置次数,用于统计和分析';
+```
+
+### 3.3 重置日志表(task_reset_logs)
+
+调整以下字段:
+
+| 字段名 | 类型 | 描述 |
+|-------|------|------|
+| reset_type | varchar | 重置类型(daily, weekly, monthly, manual, auto) |
+| trigger_type | varchar | 触发类型(view, accept, update, reward, admin) |
+| affected_tasks | json | 改为只包含单个任务ID,不再是数组 |
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_reset_logs` 
+ADD COLUMN `trigger_type` varchar(20) DEFAULT NULL COMMENT '触发类型(view, accept, update, reward, admin)' AFTER `reset_type`;
+```
+
+### 3.4 索引优化
+
+为了提高查询性能,添加以下索引:
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_user_tasks` ADD INDEX `idx_next_reset_time` (`next_reset_time`);
+ALTER TABLE `task_user_tasks` ADD INDEX `idx_user_next_reset` (`user_id`, `next_reset_time`);
+```
+
+## 4. 实现方案
+
+### 4.1 重置检查服务
+
+创建一个专门的服务类处理重置检查逻辑:
+
+**伪代码:**
+```
+类:TaskResetCheckService
+
+方法:checkAndResetIfNeeded(用户ID, 任务ID)
+1. 获取用户任务记录
+2. 如果记录不存在,返回false
+3. 获取任务的重置类型
+4. 如果重置类型为none,返回false
+5. 获取下次重置时间
+6. 如果下次重置时间为空,计算并设置下次重置时间
+7. 如果当前时间小于下次重置时间,返回false
+8. 如果任务状态不是已完成或已领取奖励,返回false
+9. 执行重置操作(可以是同步或异步)
+10. 返回true
+
+方法:calculateNextResetTime(重置类型, 上次重置时间)
+1. 如果上次重置时间为空,使用当前时间
+2. 根据重置类型计算下次重置时间:
+   - daily:上次重置时间 + 1天
+   - weekly:上次重置时间 + 7天
+   - monthly:上次重置时间 + 1个月
+3. 返回下次重置时间
+
+方法:resetTask(用户任务)
+1. 开始事务
+2. 重置任务状态为进行中
+3. 重置任务进度为0
+4. 清除完成时间和奖励领取时间
+5. 更新上次重置时间为当前时间
+6. 计算并更新下次重置时间
+7. 增加重置计数
+8. 重置任务的详细进度
+9. 记录重置日志
+10. 提交事务
+11. 触发任务重置事件(可选)
+```
+
+### 4.2 任务查询中间件
+
+在任务查询接口中添加重置检查逻辑:
+
+**伪代码:**
+```
+中间件:TaskResetCheckMiddleware
+
+方法:handle(请求, 下一步)
+1. 获取请求中的用户ID
+2. 获取请求中的任务ID列表
+3. 对每个任务ID调用重置检查服务
+4. 继续处理请求
+```
+
+### 4.3 任务列表优化
+
+为了提高任务列表查询性能,可以采用以下策略:
+
+**伪代码:**
+```
+方法:getUserTasks(用户ID, 任务类型)
+1. 查询用户任务列表
+2. 使用延迟加载(Lazy Loading)获取任务详情
+3. 在返回结果前,对需要重置的任务进行标记
+4. 异步触发重置操作
+5. 返回处理后的任务列表
+```
+
+### 4.4 缓存策略
+
+使用缓存减少数据库访问:
+
+**伪代码:**
+```
+方法:getTaskResetStatus(用户ID, 任务ID)
+1. 生成缓存键:user_{用户ID}_task_{任务ID}_reset_status
+2. 尝试从缓存获取重置状态
+3. 如果缓存存在,返回缓存值
+4. 从数据库查询重置状态
+5. 将结果存入缓存,设置适当的过期时间
+6. 返回查询结果
+```
+
+### 4.5 队列处理
+
+使用队列异步处理重置操作:
+
+**伪代码:**
+```
+任务:ResetUserTaskJob
+
+方法:handle()
+1. 获取用户ID和任务ID
+2. 调用重置服务执行实际重置操作
+3. 记录重置完成日志
+```
+
+## 5. 迁移策略
+
+从主动重置迁移到被动重置需要谨慎规划:
+
+### 5.1 数据迁移
+
+1. **添加新字段**:向相关表添加新字段(已完成)
+2. **初始化数据**:为现有记录计算并设置next_reset_time
+3. **数据验证**:确保所有记录都有正确的重置时间
+
+### 5.2 功能迁移
+
+1. **双系统并行**:在一段时间内保留主动重置和被动重置双系统
+2. **逐步切换**:先对部分用户或任务类型启用被动重置
+3. **监控对比**:对比两种方式的性能和资源消耗
+4. **完全切换**:确认被动重置稳定后,移除主动重置机制
+
+### 5.3 监控与回滚
+
+1. **性能监控**:监控系统资源使用情况和响应时间
+2. **错误监控**:监控重置过程中的错误和异常
+3. **回滚机制**:准备回滚到主动重置的方案
+4. **用户反馈**:收集用户对任务重置的反馈
+
+## 6. 性能优化
+
+### 6.1 数据库优化
+
+1. **索引优化**:为next_reset_time字段添加索引(已完成)
+2. **查询优化**:优化重置检查的SQL查询
+3. **分表策略**:考虑按用户ID对task_user_tasks表进行分表
+
+### 6.2 缓存优化
+
+1. **多级缓存**:使用本地缓存和分布式缓存
+2. **缓存预热**:预先缓存热门任务的重置状态
+3. **缓存失效策略**:合理设置缓存过期时间
+
+### 6.3 并发控制
+
+1. **乐观锁**:使用版本号控制并发更新
+2. **分布式锁**:使用Redis实现分布式锁
+3. **批量处理**:合并多个重置操作一起处理
+
+## 7. 预期效果
+
+### 7.1 资源消耗
+
+| 指标 | 主动重置 | 被动重置 | 改进 |
+|------|---------|---------|------|
+| CPU使用率峰值 | 高 | 低 | 显著降低CPU峰值使用率 |
+| 内存使用率 | 高 | 中 | 降低内存使用率 |
+| 数据库连接数 | 高 | 低 | 显著降低数据库连接压力 |
+| 数据库I/O | 高 | 低 | 显著降低数据库I/O压力 |
+| 网络流量 | 高 | 低 | 降低网络流量 |
+
+### 7.2 用户体验
+
+| 指标 | 主动重置 | 被动重置 | 改进 |
+|------|---------|---------|------|
+| 响应时间 | 慢(高峰期) | 快 | 提高系统响应速度 |
+| 任务刷新及时性 | 固定时间点 | 按需刷新 | 提高任务刷新灵活性 |
+| 系统稳定性 | 波动大 | 波动小 | 提高系统稳定性 |
+
+### 7.3 运维成本
+
+| 指标 | 主动重置 | 被动重置 | 改进 |
+|------|---------|---------|------|
+| 服务器数量 | 多 | 少 | 降低服务器成本 |
+| 数据库规模 | 大 | 小 | 降低数据库成本 |
+| 监控复杂度 | 高 | 中 | 简化监控工作 |
+| 故障处理 | 复杂 | 简单 | 简化故障处理 |
+
+## 8. 风险与挑战
+
+### 8.1 潜在风险
+
+1. **首次访问延迟**:用户首次访问需要重置的任务可能会有轻微延迟
+2. **数据不一致**:如果重置过程中断,可能导致数据不一致
+3. **缓存失效**:缓存策略不当可能导致重复重置
+4. **数据库负载**:高并发场景下仍可能出现数据库负载问题
+
+### 8.2 应对策略
+
+1. **预加载机制**:在用户登录时预检查并重置即将访问的任务
+2. **事务保证**:使用数据库事务确保重置操作的原子性
+3. **缓存策略优化**:合理设置缓存过期时间和更新策略
+4. **限流机制**:实现请求限流,防止瞬时高并发
+
+## 9. 后续规划
+
+### 9.1 功能扩展
+
+1. **个性化重置时间**:允许用户自定义任务重置时间
+2. **智能重置预测**:基于用户行为预测任务重置需求
+3. **重置通知机制**:任务重置后主动通知用户
+
+### 9.2 监控与分析
+
+1. **重置行为分析**:分析用户任务重置模式
+2. **性能监控面板**:开发专门的监控面板跟踪重置性能
+3. **A/B测试**:对不同重置策略进行A/B测试
+
+## 10. 总结
+
+被动重置机制通过"按需重置"的方式,显著降低了系统资源消耗,提高了系统响应速度和稳定性。虽然实现相对复杂,但长期来看,这种方式更加适合大规模用户场景,能够提供更好的用户体验和更低的运维成本。
+
+通过合理的迁移策略和风险控制,可以平稳地从主动重置切换到被动重置,实现系统性能和用户体验的双重提升。
+
+## 11. 更新历史
+
+| 日期 | 版本 | 更新内容 |
+|------|------|---------|
+| 2023-06-18 | 1.0 | 初始版本 |
+| 2023-06-19 | 1.1 | 添加已执行的SQL语句 |

+ 332 - 0
app/Module/Task/Docs/任务被动重置机制规划_updated.md

@@ -0,0 +1,332 @@
+# 任务被动重置机制规划
+
+## 1. 概述
+
+当前任务系统采用主动重置方案,即在固定时间点(如每日凌晨0点)通过计划任务批量重置所有符合条件的任务。这种方式虽然实现简单,但存在以下问题:
+
+1. **资源浪费**:需要一次性处理大量数据,造成数据库和服务器负载峰值
+2. **时效性问题**:用户可能处于不同时区,固定时间点的重置不够灵活
+3. **扩展性限制**:随着用户量增长,批量重置的性能瓶颈会越来越明显
+4. **不必要的处理**:许多被重置的任务可能很长时间都不会被用户查看或使用
+
+为解决这些问题,本文档提出采用被动重置方案,即在任务需要更新或被使用时才进行重置。这种方式可以显著减少系统资源消耗,提高系统响应速度,并提供更好的用户体验。
+
+## 2. 被动重置机制设计
+
+### 2.1 核心思想
+
+被动重置的核心思想是"按需重置",只有当用户实际需要访问或使用任务时,才检查并执行重置操作。具体来说:
+
+1. **不再使用定时任务批量重置**:移除现有的每日/每周/每月重置计划任务
+2. **添加重置时间标记**:为每个任务类型记录下一次应该重置的时间
+3. **访问时检查重置**:当用户查询任务或与任务交互时,检查是否需要重置
+4. **延迟写入**:重置操作可以异步执行,不阻塞用户请求
+
+### 2.2 重置触发点
+
+在以下场景中触发重置检查:
+
+1. **任务列表查询**:用户查看任务列表时
+2. **任务详情查询**:用户查看特定任务详情时
+3. **任务接取操作**:用户接取任务时
+4. **任务进度更新**:任务进度更新时
+5. **任务奖励领取**:用户领取任务奖励时
+6. **后台管理操作**:管理员在后台操作任务时
+
+### 2.3 重置判断逻辑
+
+当触发重置检查时,系统需要判断任务是否需要重置:
+
+1. **获取任务重置类型**:daily、weekly、monthly或none
+2. **计算下次重置时间**:基于上次重置时间和重置类型
+3. **比较当前时间**:如果当前时间已超过下次重置时间,则需要重置
+4. **检查任务状态**:只有已完成或已领取奖励的任务才需要重置
+
+### 2.4 重置执行方式
+
+为了不影响用户体验,重置操作应该尽可能高效:
+
+1. **单任务重置**:只重置当前用户正在访问的任务,而不是批量重置
+2. **延迟写入**:可以将重置操作放入队列异步执行
+3. **缓存标记**:使用缓存记录已重置的任务,避免重复检查
+4. **分批处理**:对于需要批量处理的场景,采用分批处理策略
+
+## 3. 数据结构调整
+
+### 3.1 任务表(task_tasks)
+
+添加以下字段:
+
+| 字段名 | 类型 | 描述 |
+|-------|------|------|
+| reset_interval | int | 重置间隔(秒),根据重置类型自动计算 |
+| reset_time_field | varchar | 重置时间字段,如"daily_reset_time",用于存储具体重置时间点 |
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_tasks` 
+ADD COLUMN `reset_interval` int(11) NOT NULL DEFAULT 0 COMMENT '重置间隔(秒),根据重置类型自动计算',
+ADD COLUMN `reset_time_field` varchar(50) DEFAULT NULL COMMENT '重置时间字段,如"daily_reset_time",用于存储具体重置时间点';
+```
+
+### 3.2 用户任务表(task_user_tasks)
+
+添加以下字段:
+
+| 字段名 | 类型 | 描述 |
+|-------|------|------|
+| next_reset_time | timestamp | 下次重置时间,用于快速判断是否需要重置 |
+| last_reset_time | timestamp | 上次重置时间,用于计算下次重置时间 |
+| reset_count | int | 重置次数,用于统计和分析 |
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_user_tasks` 
+ADD COLUMN `next_reset_time` timestamp NULL DEFAULT NULL COMMENT '下次重置时间,用于快速判断是否需要重置',
+ADD COLUMN `last_reset_time` timestamp NULL DEFAULT NULL COMMENT '上次重置时间,用于计算下次重置时间',
+ADD COLUMN `reset_count` int(11) NOT NULL DEFAULT 0 COMMENT '重置次数,用于统计和分析';
+```
+
+### 3.3 重置日志表(task_reset_logs)
+
+调整以下字段:
+
+| 字段名 | 类型 | 描述 |
+|-------|------|------|
+| reset_type | varchar | 重置类型(daily, weekly, monthly, manual, auto) |
+| trigger_type | varchar | 触发类型(view, accept, update, reward, admin) |
+| affected_tasks | json | 改为只包含单个任务ID,不再是数组 |
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_reset_logs` 
+ADD COLUMN `trigger_type` varchar(20) DEFAULT NULL COMMENT '触发类型(view, accept, update, reward, admin)' AFTER `reset_type`;
+```
+
+### 3.4 索引优化
+
+为了提高查询性能,添加以下索引:
+
+**已执行SQL:**
+```sql
+ALTER TABLE `task_user_tasks` ADD INDEX `idx_next_reset_time` (`next_reset_time`);
+ALTER TABLE `task_user_tasks` ADD INDEX `idx_user_next_reset` (`user_id`, `next_reset_time`);
+```
+
+## 4. 实现方案
+
+### 4.1 重置检查服务
+
+创建一个专门的服务类处理重置检查逻辑:
+
+**伪代码:**
+```
+类:TaskResetCheckService
+
+方法:checkAndResetIfNeeded(用户ID, 任务ID)
+1. 获取用户任务记录
+2. 如果记录不存在,返回false
+3. 获取任务的重置类型
+4. 如果重置类型为none,返回false
+5. 获取下次重置时间
+6. 如果下次重置时间为空,计算并设置下次重置时间
+7. 如果当前时间小于下次重置时间,返回false
+8. 如果任务状态不是已完成或已领取奖励,返回false
+9. 执行重置操作(可以是同步或异步)
+10. 返回true
+
+方法:calculateNextResetTime(重置类型, 上次重置时间)
+1. 如果上次重置时间为空,使用当前时间
+2. 根据重置类型计算下次重置时间:
+   - daily:上次重置时间 + 1天
+   - weekly:上次重置时间 + 7天
+   - monthly:上次重置时间 + 1个月
+3. 返回下次重置时间
+
+方法:resetTask(用户任务)
+1. 开始事务
+2. 重置任务状态为进行中
+3. 重置任务进度为0
+4. 清除完成时间和奖励领取时间
+5. 更新上次重置时间为当前时间
+6. 计算并更新下次重置时间
+7. 增加重置计数
+8. 重置任务的详细进度
+9. 记录重置日志
+10. 提交事务
+11. 触发任务重置事件(可选)
+```
+
+### 4.2 任务查询中间件
+
+在任务查询接口中添加重置检查逻辑:
+
+**伪代码:**
+```
+中间件:TaskResetCheckMiddleware
+
+方法:handle(请求, 下一步)
+1. 获取请求中的用户ID
+2. 获取请求中的任务ID列表
+3. 对每个任务ID调用重置检查服务
+4. 继续处理请求
+```
+
+### 4.3 任务列表优化
+
+为了提高任务列表查询性能,可以采用以下策略:
+
+**伪代码:**
+```
+方法:getUserTasks(用户ID, 任务类型)
+1. 查询用户任务列表
+2. 使用延迟加载(Lazy Loading)获取任务详情
+3. 在返回结果前,对需要重置的任务进行标记
+4. 异步触发重置操作
+5. 返回处理后的任务列表
+```
+
+### 4.4 缓存策略
+
+使用缓存减少数据库访问:
+
+**伪代码:**
+```
+方法:getTaskResetStatus(用户ID, 任务ID)
+1. 生成缓存键:user_{用户ID}_task_{任务ID}_reset_status
+2. 尝试从缓存获取重置状态
+3. 如果缓存存在,返回缓存值
+4. 从数据库查询重置状态
+5. 将结果存入缓存,设置适当的过期时间
+6. 返回查询结果
+```
+
+### 4.5 队列处理
+
+使用队列异步处理重置操作:
+
+**伪代码:**
+```
+任务:ResetUserTaskJob
+
+方法:handle()
+1. 获取用户ID和任务ID
+2. 调用重置服务执行实际重置操作
+3. 记录重置完成日志
+```
+
+## 5. 迁移策略
+
+从主动重置迁移到被动重置需要谨慎规划:
+
+### 5.1 数据迁移
+
+1. **添加新字段**:向相关表添加新字段(已完成)
+2. **初始化数据**:为现有记录计算并设置next_reset_time
+3. **数据验证**:确保所有记录都有正确的重置时间
+
+### 5.2 功能迁移
+
+1. **双系统并行**:在一段时间内保留主动重置和被动重置双系统
+2. **逐步切换**:先对部分用户或任务类型启用被动重置
+3. **监控对比**:对比两种方式的性能和资源消耗
+4. **完全切换**:确认被动重置稳定后,移除主动重置机制
+
+### 5.3 监控与回滚
+
+1. **性能监控**:监控系统资源使用情况和响应时间
+2. **错误监控**:监控重置过程中的错误和异常
+3. **回滚机制**:准备回滚到主动重置的方案
+4. **用户反馈**:收集用户对任务重置的反馈
+
+## 6. 性能优化
+
+### 6.1 数据库优化
+
+1. **索引优化**:为next_reset_time字段添加索引(已完成)
+2. **查询优化**:优化重置检查的SQL查询
+3. **分表策略**:考虑按用户ID对task_user_tasks表进行分表
+
+### 6.2 缓存优化
+
+1. **多级缓存**:使用本地缓存和分布式缓存
+2. **缓存预热**:预先缓存热门任务的重置状态
+3. **缓存失效策略**:合理设置缓存过期时间
+
+### 6.3 并发控制
+
+1. **乐观锁**:使用版本号控制并发更新
+2. **分布式锁**:使用Redis实现分布式锁
+3. **批量处理**:合并多个重置操作一起处理
+
+## 7. 预期效果
+
+### 7.1 资源消耗
+
+| 指标 | 主动重置 | 被动重置 | 改进 |
+|------|---------|---------|------|
+| CPU使用率峰值 | 高 | 低 | 显著降低CPU峰值使用率 |
+| 内存使用率 | 高 | 中 | 降低内存使用率 |
+| 数据库连接数 | 高 | 低 | 显著降低数据库连接压力 |
+| 数据库I/O | 高 | 低 | 显著降低数据库I/O压力 |
+| 网络流量 | 高 | 低 | 降低网络流量 |
+
+### 7.2 用户体验
+
+| 指标 | 主动重置 | 被动重置 | 改进 |
+|------|---------|---------|------|
+| 响应时间 | 慢(高峰期) | 快 | 提高系统响应速度 |
+| 任务刷新及时性 | 固定时间点 | 按需刷新 | 提高任务刷新灵活性 |
+| 系统稳定性 | 波动大 | 波动小 | 提高系统稳定性 |
+
+### 7.3 运维成本
+
+| 指标 | 主动重置 | 被动重置 | 改进 |
+|------|---------|---------|------|
+| 服务器数量 | 多 | 少 | 降低服务器成本 |
+| 数据库规模 | 大 | 小 | 降低数据库成本 |
+| 监控复杂度 | 高 | 中 | 简化监控工作 |
+| 故障处理 | 复杂 | 简单 | 简化故障处理 |
+
+## 8. 风险与挑战
+
+### 8.1 潜在风险
+
+1. **首次访问延迟**:用户首次访问需要重置的任务可能会有轻微延迟
+2. **数据不一致**:如果重置过程中断,可能导致数据不一致
+3. **缓存失效**:缓存策略不当可能导致重复重置
+4. **数据库负载**:高并发场景下仍可能出现数据库负载问题
+
+### 8.2 应对策略
+
+1. **预加载机制**:在用户登录时预检查并重置即将访问的任务
+2. **事务保证**:使用数据库事务确保重置操作的原子性
+3. **缓存策略优化**:合理设置缓存过期时间和更新策略
+4. **限流机制**:实现请求限流,防止瞬时高并发
+
+## 9. 后续规划
+
+### 9.1 功能扩展
+
+1. **个性化重置时间**:允许用户自定义任务重置时间
+2. **智能重置预测**:基于用户行为预测任务重置需求
+3. **重置通知机制**:任务重置后主动通知用户
+
+### 9.2 监控与分析
+
+1. **重置行为分析**:分析用户任务重置模式
+2. **性能监控面板**:开发专门的监控面板跟踪重置性能
+3. **A/B测试**:对不同重置策略进行A/B测试
+
+## 10. 总结
+
+被动重置机制通过"按需重置"的方式,显著降低了系统资源消耗,提高了系统响应速度和稳定性。虽然实现相对复杂,但长期来看,这种方式更加适合大规模用户场景,能够提供更好的用户体验和更低的运维成本。
+
+通过合理的迁移策略和风险控制,可以平稳地从主动重置切换到被动重置,实现系统性能和用户体验的双重提升。
+
+## 11. 更新历史
+
+| 日期 | 版本 | 更新内容 |
+|------|------|---------|
+| 2023-06-18 | 1.0 | 初始版本 |
+| 2023-06-19 | 1.1 | 添加已执行的SQL语句 |

+ 0 - 321
app/Module/Task/Docs/任务配置表.md

@@ -1,321 +0,0 @@
-# 任务配置表设计
-
-## 1. 概述
-
-本文档描述了任务模块的配置表设计,包括配置表的结构、字段说明和示例。任务配置表用于服务端和客户端之间的数据交换,确保双方对任务的理解一致。
-
-任务配置表采用单一配置文件设计,包含以下主要内容:
-
-1. **任务基础信息**:定义任务的基本属性
-2. **完成条件**:定义任务的完成条件
-3. **奖励内容**:定义任务的奖励内容
-
-## 2. 配置表结构
-
-### 2.1 任务配置表(tasks.json)
-
-任务配置表采用单一JSON文件设计,包含任务的基本信息、完成条件和奖励内容。
-
-#### 2.1.1 任务基础信息字段
-
-| 字段名 | 类型 | 必填 | 说明 |
-|-------|------|------|------|
-| id | int | 是 | 任务ID,唯一标识 |
-| name | string | 是 | 任务名称 |
-| description | string | 是 | 任务描述 |
-| category_id | int | 是 | 任务分类ID(服务端使用,客户端仅作参考) |
-| type | string | 是 | 任务类型(daily, weekly, achievement, event, tutorial, team) |
-| level_required | int | 是 | 所需等级 |
-| time_limit | int | 否 | 时间限制(秒,0表示无限制) |
-| max_completions | int | 是 | 最大完成次数 |
-| reset_type | string | 是 | 重置类型(none, daily, weekly, monthly) |
-| is_active | bool | 是 | 是否激活 |
-| sort_order | int | 是 | 排序权重(数值越大越靠前) |
-| start_time | string | 否 | 开始时间(格式:YYYY-MM-DD HH:MM:SS,空字符串表示立即开始) |
-| end_time | string | 否 | 结束时间(格式:YYYY-MM-DD HH:MM:SS,空字符串表示永不结束) |
-| display_params | object | 是 | 显示参数,详见下方说明 |
-| conditions | array | 是 | 任务完成条件数组 |
-| rewards | array | 是 | 任务奖励数组 |
-
-#### 2.1.2 display_params字段说明
-
-| 字段名 | 类型 | 必填 | 说明 |
-|-------|------|------|------|
-| icon | string | 是 | 任务图标路径 |
-| background | string | 否 | 任务背景图路径 |
-| color_theme | string | 否 | 颜色主题(blue, green, red, yellow等) |
-| priority | int | 否 | 显示优先级 |
-| ui_group | string | 否 | UI分组(main, farm, pet等) |
-| show_progress | bool | 是 | 是否显示进度 |
-| progress_style | string | 否 | 进度条样式(percentage, bar, step等) |
-| show_timer | bool | 否 | 是否显示计时器 |
-| timer_style | string | 否 | 计时器样式(countdown, clock等) |
-| animation | string | 否 | 动画效果(pulse, grow, fade等) |
-| jump_target | string | 否 | 跳转目标(点击任务后跳转的场景) |
-| tags | array | 否 | 标签列表 |
-| client_custom | object | 否 | 客户端自定义参数 |
-
-#### 2.1.3 conditions字段说明
-
-每个条件对象包含以下字段:
-
-| 字段名 | 类型 | 必填 | 说明 |
-|-------|------|------|------|
-| id | int | 是 | 条件ID,唯一标识 |
-| condition_type | string | 是 | 条件类型(login, plant, harvest等) |
-| target_value | int | 是 | 目标值 |
-| operator | string | 是 | 运算符(=, >, >=, <, <=) |
-| params | object | 否 | 条件参数 |
-| is_required | bool | 是 | 是否必须满足 |
-| sort_order | int | 是 | 排序权重 |
-| client_display | object | 是 | 客户端显示参数 |
-
-client_display字段说明:
-
-| 字段名 | 类型 | 必填 | 说明 |
-|-------|------|------|------|
-| text | string | 是 | 条件文本描述,可包含{target_value}等占位符 |
-| icon | string | 否 | 条件图标路径 |
-
-#### 2.1.4 rewards字段说明
-
-每个奖励对象包含以下字段:
-
-| 字段名 | 类型 | 必填 | 说明 |
-|-------|------|------|------|
-| id | int | 是 | 奖励ID,唯一标识 |
-| reward_type | string | 是 | 奖励类型(item, currency, experience等) |
-| reward_param1 | string | 是 | 奖励参数1(如物品类型、货币类型等) |
-| reward_param2 | string | 是 | 奖励参数2(如物品ID、货币ID等) |
-| quantity | int | 是 | 奖励数量 |
-
-#### 2.1.5 示例
-
-```json
-[
-  {
-    "id": 1001,
-    "name": "每日登录",
-    "description": "完成每日登录任务",
-    "category_id": 1,
-    "type": "daily",
-    "level_required": 1,
-    "time_limit": 86400,
-    "max_completions": 1,
-    "reset_type": "daily",
-    "is_active": true,
-    "sort_order": 100,
-    "start_time": "",
-    "end_time": "",
-    "display_params": {
-      "icon": "task_daily_login.png",
-      "background": "task_bg_blue.jpg",
-      "color_theme": "blue",
-      "priority": 100,
-      "ui_group": "main",
-      "show_progress": true,
-      "progress_style": "percentage",
-      "show_timer": true,
-      "timer_style": "countdown",
-      "animation": "pulse",
-      "jump_target": "",
-      "tags": ["new", "daily"],
-      "client_custom": {
-        "show_in_dashboard": true,
-        "notification_enabled": true
-      }
-    },
-    "conditions": [
-      {
-        "id": 1,
-        "condition_type": "login",
-        "target_value": 1,
-        "operator": "=",
-        "params": {},
-        "is_required": true,
-        "sort_order": 1,
-        "client_display": {
-          "text": "登录游戏",
-          "icon": "login_icon.png"
-        }
-      }
-    ],
-    "rewards": [
-      {
-        "id": 1,
-        "reward_type": "currency",
-        "reward_param1": "gold",
-        "reward_param2": "1",
-        "quantity": 100
-      }
-    ]
-  },
-  {
-    "id": 1002,
-    "name": "种植5次作物",
-    "description": "在农场中种植5次任意作物",
-    "category_id": 1,
-    "type": "daily",
-    "level_required": 2,
-    "time_limit": 86400,
-    "max_completions": 3,
-    "reset_type": "daily",
-    "is_active": true,
-    "sort_order": 200,
-    "start_time": "",
-    "end_time": "",
-    "display_params": {
-      "icon": "task_plant.png",
-      "background": "task_bg_green.jpg",
-      "color_theme": "green",
-      "priority": 200,
-      "ui_group": "farm",
-      "show_progress": true,
-      "progress_style": "bar",
-      "show_timer": true,
-      "timer_style": "countdown",
-      "animation": "grow",
-      "jump_target": "farm",
-      "tags": ["farm", "daily"],
-      "client_custom": {
-        "show_in_dashboard": true,
-        "notification_enabled": true
-      }
-    },
-    "conditions": [
-      {
-        "id": 2,
-        "condition_type": "plant",
-        "target_value": 5,
-        "operator": ">=",
-        "params": {},
-        "is_required": true,
-        "sort_order": 1,
-        "client_display": {
-          "text": "种植{target_value}次作物",
-          "icon": "plant_icon.png"
-        }
-      }
-    ],
-    "rewards": [
-      {
-        "id": 2,
-        "reward_type": "item",
-        "reward_param1": "fertilizer",
-        "reward_param2": "premium",
-        "quantity": 2
-      },
-      {
-        "id": 3,
-        "reward_type": "experience",
-        "reward_param1": "player",
-        "reward_param2": "level",
-        "quantity": 50
-      }
-    ]
-  }
-]
-```
-
-## 3. 配置表生成与更新
-
-任务配置表的生成与更新可通过以下方式实现:
-
-1. **后台管理导出**:通过后台管理界面导出当前的任务配置
-2. **数据库导出工具**:使用工具从数据库中导出任务配置
-3. **手动维护**:直接编辑JSON配置文件
-
-### 3.1 配置生成思路
-
-配置生成工具的基本思路如下:
-
-```
-1. 从数据库中获取所有激活的任务
-2. 对每个任务,获取其相关的条件和奖励
-3. 将任务、条件和奖励数据组装成统一的JSON结构
-4. 将生成的JSON数据写入配置文件
-5. 更新配置版本信息
-```
-
-### 3.2 版本控制
-
-为确保客户端使用最新的配置,可以实现版本控制机制:
-
-```
-{
-  "task_config": {
-    "version": "1.0.5",
-    "last_updated": "2023-06-01 10:30:00",
-    "files": ["tasks.json"]
-  }
-}
-```
-
-客户端可以定期检查配置版本,如果发现新版本,则下载更新。
-
-## 4. 客户端使用配置表
-
-客户端可以在启动时或需要时从服务器下载最新的配置表,并缓存到本地。这样可以确保客户端和服务端使用相同的任务定义。
-
-客户端可以使用配置表来:
-
-1. **显示任务列表**:根据配置表显示可用的任务
-2. **呈现任务详情**:显示任务的描述、条件和奖励
-3. **跟踪任务进度**:根据配置的条件显示当前进度
-4. **实现客户端预校验**:在提交到服务器前进行初步校验
-
-## 5. 配置表使用示例
-
-### 5.1 显示任务列表
-
-```
-1. 加载任务配置文件
-2. 根据任务类型和激活状态过滤任务
-3. 按排序权重对任务进行排序
-4. 渲染任务列表到界面
-```
-
-
-### 5.2 显示任务详情
-
-```
-1. 根据任务ID从配置中查找对应任务
-2. 获取任务的条件和奖励信息
-3. 对条件和奖励进行排序
-4. 渲染任务标题、条件和奖励信息
-```
-
-
-### 5.3 更新任务进度
-
-```
-1. 根据任务ID从配置中查找对应任务
-2. 获取任务的条件信息
-3. 遍历所有必要条件,计算已完成的条件数量
-   - 比较当前进度值与目标值
-   - 根据运算符判断条件是否完成
-4. 计算总体完成百分比
-5. 更新任务进度显示
-```
-
-
-## 6. 总结
-
-任务配置表是任务模块的重要组成部分,它定义了任务的基本信息、条件和奖励,确保服务端和客户端对任务的理解一致。通过合理设计和使用配置表,可以实现任务系统的灵活配置和高效管理。
-
-采用单一配置表的设计有以下优势:
-
-1. **简化管理**:只需维护一个配置文件,减少了管理复杂性
-2. **减少请求数**:客户端只需下载一个文件,减少了网络请求
-3. **数据一致性**:所有任务相关数据在一个文件中,确保了数据的一致性
-4. **客户端效率**:无需进行多表关联查询,提高了客户端处理效率
-
-配置表的设计考虑了以下几个方面:
-
-1. **完整性**:包含任务所需的所有信息
-2. **灵活性**:支持多种任务类型和条件组合
-3. **可扩展性**:可以方便地添加新的任务、条件和奖励
-4. **易用性**:结构清晰,易于理解和使用
-5. **性能**:合理的数据结构,便于客户端高效处理
-
-通过这个配置表,开发人员可以轻松地定义和管理任务,而无需修改代码,提高了系统的可维护性和扩展性。

+ 345 - 0
app/Module/Task/Docs/任务重置系统_new.md

@@ -0,0 +1,345 @@
+# 任务重置系统
+
+## 1. 概述
+
+任务重置系统是任务模块的核心功能之一,负责根据预定义的规则和时间点重置特定类型的任务,使玩家可以重新完成这些任务并获取奖励。本文档详细描述了任务重置系统的设计、实现和使用方法。
+
+## 2. 重置类型
+
+任务模块支持以下几种重置类型:
+
+### 2.1 每日重置(daily)
+
+每日重置的任务会在每天的特定时间点(通常是凌晨0点)自动重置。
+
+**特点:**
+- 重置频率:每24小时一次
+- 重置时间:通常为北京时间凌晨0点(可配置)
+- 适用场景:日常任务、签到任务等
+
+### 2.2 每周重置(weekly)
+
+每周重置的任务会在每周的特定时间点(通常是周一凌晨0点)自动重置。
+
+**特点:**
+- 重置频率:每7天一次
+- 重置时间:通常为北京时间周一凌晨0点(可配置)
+- 适用场景:周常任务、周限制任务等
+
+### 2.3 每月重置(monthly)
+
+每月重置的任务会在每月的特定时间点(通常是1日凌晨0点)自动重置。
+
+**特点:**
+- 重置频率:每月一次
+- 重置时间:通常为北京时间每月1日凌晨0点(可配置)
+- 适用场景:月度任务、月限制任务等
+
+### 2.4 不重置(none)
+
+不重置的任务只能完成一次,永远不会重置。
+
+**特点:**
+- 重置频率:永不重置
+- 适用场景:成就任务、一次性任务、主线任务等
+
+## 3. 重置机制
+
+### 3.1 重置内容
+
+当任务重置时,以下内容会被重置:
+
+1. **任务状态**:将已完成或已领取奖励的任务状态重置为未接取或进行中
+2. **任务进度**:将任务的完成进度重置为0或初始值
+3. **完成时间**:清除任务的完成时间
+4. **奖励领取状态**:清除任务的奖励领取状态
+
+### 3.2 重置条件
+
+任务重置需要满足以下条件:
+
+1. **任务类型匹配**:任务的重置类型必须与当前执行的重置类型匹配
+2. **任务状态符合**:只有已完成或已领取奖励的任务才会被重置
+3. **时间条件满足**:当前时间必须达到或超过任务的下一次重置时间
+
+### 3.3 重置流程
+
+任务重置的基本流程如下:
+
+1. **确定重置类型**:根据当前执行的命令确定重置类型(daily、weekly、monthly)
+2. **查找符合条件的任务**:查找数据库中符合重置条件的任务
+3. **记录重置前状态**:记录任务重置前的状态,用于日志和回滚
+4. **执行重置操作**:更新任务状态、进度、完成时间和奖励领取状态
+5. **记录重置日志**:在task_reset_logs表中记录重置操作的详细信息
+6. **触发重置事件**:触发TaskResetEvent事件,通知其他模块任务已重置
+
+## 4. 实现方式
+
+### 4.1 数据库表
+
+任务重置系统主要涉及以下数据库表:
+
+1. **task_tasks**:存储任务的基本信息,包括重置类型(reset_type)
+2. **task_user_tasks**:存储用户任务的状态和进度
+3. **task_user_progress**:存储用户任务的详细进度
+4. **task_reset_logs**:记录任务重置的历史记录
+
+### 4.2 命令行工具
+
+任务重置系统通过以下命令行工具实现自动重置:
+
+#### 4.2.1 每日重置命令
+
+**伪代码:**
+```
+命令:task:reset-daily
+
+功能:重置每日任务
+
+执行流程:
+1. 输出开始重置每日任务的提示信息
+2. 调用任务重置服务的resetTasks方法,传入'daily'参数
+3. 输出重置完成的提示信息,包括受影响的任务数量
+4. 返回执行结果
+```
+
+#### 4.2.2 每周重置命令
+
+**伪代码:**
+```
+命令:task:reset-weekly
+
+功能:重置每周任务
+
+执行流程:
+1. 输出开始重置每周任务的提示信息
+2. 调用任务重置服务的resetTasks方法,传入'weekly'参数
+3. 输出重置完成的提示信息,包括受影响的任务数量
+4. 返回执行结果
+```
+
+#### 4.2.3 每月重置命令
+
+**伪代码:**
+```
+命令:task:reset-monthly
+
+功能:重置每月任务
+
+执行流程:
+1. 输出开始重置每月任务的提示信息
+2. 调用任务重置服务的resetTasks方法,传入'monthly'参数
+3. 输出重置完成的提示信息,包括受影响的任务数量
+4. 返回执行结果
+```
+
+### 4.3 服务类
+
+任务重置系统的核心逻辑在TaskResetService服务类中实现:
+
+**伪代码:**
+```
+方法:resetTasks(重置类型)
+
+参数:
+- 重置类型:daily, weekly, monthly
+
+执行流程:
+1. 开始数据库事务
+2. 尝试执行以下操作:
+   a. 查找符合条件的任务(重置类型匹配且处于激活状态)
+   b. 获取任务ID列表
+   c. 如果存在符合条件的任务:
+      i. 查找用户任务(任务ID匹配且状态为已完成或已领取奖励)
+      ii. 计算受影响的任务数量
+      iii. 遍历用户任务,执行以下操作:
+          - 重置任务状态为进行中
+          - 重置任务进度为0
+          - 清除完成时间和奖励领取时间
+          - 保存更新后的用户任务
+          - 重置任务的详细进度
+      iv. 创建重置日志记录
+      v. 触发任务重置事件
+   d. 提交事务
+   e. 返回重置结果(成功标志、重置类型、受影响的任务数量、受影响的任务ID列表)
+3. 如果发生异常:
+   a. 回滚事务
+   b. 记录错误日志
+   c. 返回失败结果
+
+方法:checkResetNeeded()
+
+功能:检查是否需要重置任务
+
+执行流程:
+1. 初始化需要重置的任务类型列表
+2. 获取当前时间
+3. 检查每日重置:
+   a. 获取最后一次每日重置记录
+   b. 如果不存在记录或距离上次重置已过去1天以上,将'daily'添加到需要重置的类型列表
+4. 检查每周重置:
+   a. 获取最后一次每周重置记录
+   b. 如果不存在记录或距离上次重置已过去1周以上,将'weekly'添加到需要重置的类型列表
+5. 检查每月重置:
+   a. 获取最后一次每月重置记录
+   b. 如果不存在记录或距离上次重置已过去1个月以上,将'monthly'添加到需要重置的类型列表
+6. 返回需要重置的任务类型列表
+```
+
+### 4.4 事件类
+
+任务重置系统定义了TaskResetEvent事件,用于通知其他模块任务已重置:
+
+**伪代码:**
+```
+事件:TaskResetEvent
+
+属性:
+- 重置类型:daily, weekly, monthly
+- 重置时间:重置操作执行的时间
+- 受影响的任务ID列表:被重置的任务ID数组
+
+构造函数:
+1. 接收重置类型、重置时间和受影响的任务ID列表
+2. 初始化事件属性
+```
+
+## 5. 定时任务配置
+
+任务重置系统通过Laravel的调度器(Scheduler)实现定时重置:
+
+**伪代码:**
+```
+定时任务配置:
+
+1. 每日重置任务:
+   - 命令:task:reset-daily
+   - 执行时间:每天凌晨00:00
+
+2. 每周重置任务:
+   - 命令:task:reset-weekly
+   - 执行时间:每周一凌晨00:00
+
+3. 每月重置任务:
+   - 命令:task:reset-monthly
+   - 执行时间:每月1日凌晨00:00
+```
+
+## 6. 时区处理
+
+任务重置系统需要考虑时区问题,确保在正确的时间点重置任务。系统默认使用北京时间(UTC+8)作为重置时间的基准。
+
+**伪代码:**
+```
+时区设置:
+
+1. 在应用服务提供者中设置默认时区:
+   - 设置默认时区为Asia/Shanghai(北京时间)
+
+2. 在重置逻辑中使用统一的时间获取方式:
+   - 使用now()函数获取当前时间,确保时区一致
+```
+
+## 7. 重置日志
+
+任务重置系统会在task_reset_logs表中记录每次重置的详细信息,包括重置类型、重置时间、受影响的任务ID列表和受影响的任务数量。
+
+**日志字段说明:**
+
+| 字段 | 类型 | 描述 |
+|------|------|------|
+| id | int | 主键 |
+| reset_type | varchar | 重置类型(daily, weekly, monthly) |
+| reset_time | timestamp | 重置时间 |
+| affected_tasks | json | 受影响的任务ID列表(JSON格式) |
+| affected_count | int | 受影响的任务数量 |
+| created_at | timestamp | 创建时间 |
+
+## 8. 手动重置
+
+除了自动重置外,系统还支持手动重置任务,可以通过命令行工具或后台管理界面触发:
+
+### 8.1 命令行手动重置
+
+**伪代码:**
+```
+手动重置命令:
+
+1. 重置每日任务:
+   命令:php artisan task:reset-daily
+
+2. 重置每周任务:
+   命令:php artisan task:reset-weekly
+
+3. 重置每月任务:
+   命令:php artisan task:reset-monthly
+```
+
+### 8.2 后台管理界面手动重置
+
+在后台管理界面中,管理员可以通过以下步骤手动重置任务:
+
+1. 进入任务管理页面
+2. 选择"任务重置"选项卡
+3. 选择要重置的任务类型(每日、每周、每月)
+4. 点击"执行重置"按钮
+5. 确认重置操作
+6. 系统执行重置并显示结果
+
+## 9. 常见问题与解决方案
+
+### 9.1 重置时间不准确
+
+可能的原因:
+- 服务器时区设置不正确
+- 定时任务未按时执行
+
+解决方案:
+- 检查服务器时区设置
+- 检查cron任务配置
+- 使用监控工具监控定时任务执行情况
+
+### 9.2 部分任务未重置
+
+可能的原因:
+- 任务的重置类型设置不正确
+- 任务状态不符合重置条件
+
+解决方案:
+- 检查任务的重置类型设置
+- 检查任务的状态
+- 查看重置日志,确认重置操作是否成功执行
+
+### 9.3 重置后数据不一致
+
+可能的原因:
+- 重置过程中发生异常
+- 数据库事务未正确提交或回滚
+
+解决方案:
+- 检查错误日志
+- 确保重置操作在事务中执行
+- 实现数据一致性检查机制
+
+## 10. 最佳实践
+
+1. **使用事务**:在重置操作中使用数据库事务,确保数据一致性
+2. **记录详细日志**:记录每次重置的详细信息,便于问题排查
+3. **设置监控**:监控重置任务的执行情况,及时发现并解决问题
+4. **定期备份**:定期备份任务数据,防止重置操作导致数据丢失
+5. **渐进式重置**:对于大量任务,采用分批重置的方式,避免系统负载过高
+6. **用户通知**:在任务重置后通知用户,提醒他们可以重新完成任务
+
+## 11. 参考资料
+
+- [Laravel 调度器文档](https://laravel.com/docs/scheduling)
+- [Laravel 事件系统文档](https://laravel.com/docs/events)
+- [任务模块数据库设计](数据库设计.md)
+- [任务模块事件系统](事件系统.md)
+
+## 12. 更新历史
+
+| 日期 | 版本 | 更新内容 |
+|------|------|---------|
+| 2023-06-15 | 1.0 | 初始版本 |
+| 2023-06-17 | 1.1 | 移除具体代码实现,改用伪代码描述 |

+ 319 - 0
app/Module/Task/Docs/开发指南.md

@@ -0,0 +1,319 @@
+# 任务模块开发指南
+
+## 1. 概述
+
+本文档是任务模块的开发指南,旨在帮助开发人员快速了解和使用任务模块。任务模块是游戏系统中的核心功能,用于管理各类任务的定义、完成条件、奖励发放和进度跟踪。
+
+## 2. 模块结构
+
+任务模块采用标准的Laravel模块化结构,主要包含以下目录:
+
+```
+app/Module/Task/
+├── AdminControllers/    # 后台管理控制器
+├── Commands/           # 命令行工具
+├── Docs/              # 文档
+├── Dtos/              # 数据传输对象
+├── Enums/             # 枚举类
+├── Events/            # 事件类
+├── Listeners/         # 事件监听器
+├── Models/            # 数据模型
+├── Providers/         # 服务提供者
+├── Repositorys/       # 数据仓库
+└── Services/          # 服务类
+```
+
+## 3. 快速入门
+
+### 3.1 安装与配置
+
+任务模块已经集成到主项目中,无需额外安装。确保在`config/app.php`中注册了任务模块的服务提供者:
+
+```php
+'providers' => [
+    // ...
+    \App\Module\Task\Providers\TaskServiceProvider::class,
+],
+```
+
+### 3.2 基本使用流程
+
+#### 3.2.1 创建任务
+
+通过后台管理界面或使用TaskService创建任务:
+
+```php
+use App\Module\Task\Services\TaskService;
+
+// 注入TaskService
+public function __construct(TaskService $taskService)
+{
+    $this->taskService = $taskService;
+}
+
+// 创建任务
+public function createTask()
+{
+    $taskData = [
+        'category_id' => 1,
+        'name' => '每日登录',
+        'description' => '每天登录游戏',
+        'type' => 'daily',
+        'level_required' => 1,
+        'reset_type' => 'daily',
+        'is_active' => true,
+    ];
+    
+    $task = $this->taskService->createTask($taskData);
+    
+    // 添加任务条件
+    $conditionData = [
+        'condition_id' => 1, // 登录条件ID
+        'target_value' => 1, // 需要登录1次
+        'condition_type' => 'progress',
+    ];
+    $this->taskService->addTaskCondition($task->id, $conditionData);
+    
+    // 添加任务奖励
+    $rewardData = [
+        'reward_type' => 'currency',
+        'reward_param1' => 'gold',
+        'reward_param2' => '1',
+        'quantity' => 100,
+    ];
+    $this->taskService->addTaskReward($task->id, $rewardData);
+    
+    return $task;
+}
+```
+
+#### 3.2.2 更新任务进度
+
+当用户执行相关操作时,更新任务进度:
+
+```php
+use App\Module\Task\Services\TaskProgressService;
+
+// 注入TaskProgressService
+public function __construct(TaskProgressService $progressService)
+{
+    $this->progressService = $progressService;
+}
+
+// 更新任务进度
+public function updateProgress($userId, $conditionCode, $value = 1, $params = [])
+{
+    $result = $this->progressService->updateProgress($userId, $conditionCode, $value, $params);
+    
+    return $result;
+}
+```
+
+#### 3.2.3 完成任务
+
+当用户完成任务时,标记任务为已完成:
+
+```php
+use App\Module\Task\Services\TaskService;
+
+// 注入TaskService
+public function __construct(TaskService $taskService)
+{
+    $this->taskService = $taskService;
+}
+
+// 完成任务
+public function completeTask($userId, $taskId)
+{
+    $result = $this->taskService->completeTask($userId, $taskId);
+    
+    return $result;
+}
+```
+
+#### 3.2.4 领取任务奖励
+
+当用户领取任务奖励时:
+
+```php
+use App\Module\Task\Services\TaskRewardService;
+
+// 注入TaskRewardService
+public function __construct(TaskRewardService $rewardService)
+{
+    $this->rewardService = $rewardService;
+}
+
+// 领取任务奖励
+public function claimReward($userId, $taskId)
+{
+    $result = $this->rewardService->claimReward($userId, $taskId);
+    
+    return $result;
+}
+```
+
+## 4. 核心组件
+
+### 4.1 数据模型
+
+任务模块包含以下主要数据模型:
+
+- **TaskCategory** - 任务分类模型
+- **Task** - 任务模型
+- **TaskReward** - 任务奖励模型
+- **TaskCost** - 任务接取消耗模型
+- **TaskCondition** - 任务条件模型
+- **TaskAchievementCondition** - 任务达成条件模型
+- **TaskUserTask** - 用户任务关联模型
+- **TaskUserProgress** - 用户任务进度模型
+- **TaskCompletionLog** - 任务完成日志模型
+- **TaskRewardLog** - 任务奖励发放日志模型
+- **TaskCostLog** - 任务消耗日志模型
+- **TaskResetLog** - 任务重置日志模型
+
+### 4.2 服务类
+
+任务模块提供以下主要服务类:
+
+- **TaskService** - 任务管理服务,提供任务的创建、更新、删除等功能
+- **TaskConditionService** - 任务条件服务,提供条件验证和处理功能
+- **TaskProgressService** - 任务进度服务,提供进度更新和检查功能
+- **TaskRewardService** - 任务奖励服务,提供奖励发放功能
+
+### 4.3 事件与监听器
+
+任务模块定义了以下事件和监听器:
+
+- **TaskCompletedEvent** - 任务完成事件
+- **TaskRewardClaimedEvent** - 任务奖励领取事件
+- **TaskCompletedListener** - 任务完成事件监听器
+- **TaskRewardClaimedListener** - 任务奖励领取事件监听器
+
+## 5. 扩展任务模块
+
+### 5.1 添加新的任务条件
+
+要添加新的任务条件,需要以下步骤:
+
+1. 在`task_conditions`表中添加新的条件记录
+2. 实现条件处理逻辑,可以通过扩展TaskConditionService或创建专门的处理器类
+
+```php
+// 添加新的任务条件
+$conditionData = [
+    'code' => 'plant_crop',
+    'name' => '种植作物',
+    'description' => '种植指定数量的作物',
+    'param_schema' => json_encode([
+        'crop_id' => ['type' => 'integer', 'required' => false, 'description' => '作物ID,不指定则为任意作物'],
+    ]),
+    'is_active' => true,
+];
+
+$condition = TaskCondition::create($conditionData);
+```
+
+### 5.2 添加新的任务奖励类型
+
+要添加新的任务奖励类型,需要扩展TaskRewardService:
+
+```php
+// 在TaskRewardService中添加新的奖励处理方法
+protected function handleNewRewardType($userId, $reward)
+{
+    // 处理新的奖励类型
+    // ...
+    
+    return true;
+}
+
+// 在getRewardHandler方法中添加新的奖励类型处理
+protected function getRewardHandler($rewardType)
+{
+    switch ($rewardType) {
+        // ...
+        case 'new_reward_type':
+            return [$this, 'handleNewRewardType'];
+        // ...
+    }
+}
+```
+
+## 6. 命令行工具
+
+任务模块提供以下命令行工具:
+
+- **ResetDailyTasksCommand** - 重置每日任务
+- **ResetWeeklyTasksCommand** - 重置每周任务
+- **ResetMonthlyTasksCommand** - 重置每月任务
+- **CheckTaskProgressCommand** - 检查任务进度
+- **CleanExpiredTasksCommand** - 清理过期任务
+
+使用示例:
+
+```bash
+# 重置每日任务
+php artisan task:reset-daily
+
+# 重置每周任务
+php artisan task:reset-weekly
+
+# 重置每月任务
+php artisan task:reset-monthly
+
+# 检查任务进度
+php artisan task:check-progress
+
+# 清理过期任务
+php artisan task:clean-expired
+```
+
+## 7. 常见问题与解决方案
+
+### 7.1 任务进度不更新
+
+可能的原因:
+- 条件代码不匹配
+- 条件参数不正确
+- 用户未接取任务
+
+解决方案:
+- 检查条件代码是否正确
+- 检查条件参数是否符合要求
+- 确保用户已接取任务
+
+### 7.2 任务奖励发放失败
+
+可能的原因:
+- 奖励类型不支持
+- 奖励参数错误
+- 物品或货币服务异常
+
+解决方案:
+- 检查奖励类型是否正确
+- 检查奖励参数是否符合要求
+- 检查相关服务是否正常
+
+## 8. 最佳实践
+
+1. **使用事件驱动**:尽量使用事件驱动的方式更新任务进度,避免直接调用服务方法
+2. **批量处理**:对于高频操作,使用批量处理方式更新任务进度
+3. **缓存利用**:合理利用缓存减少数据库查询
+4. **事务处理**:在奖励发放等关键操作中使用事务确保数据一致性
+5. **日志记录**:记录关键操作日志,便于问题排查
+
+## 9. 参考资料
+
+- [数据库设计文档](数据库设计.md)
+- [Proto设计文档](Proto设计.md)
+- [设计概述文档](设计概述.md)
+- [Laravel 官方文档](https://laravel.com/docs)
+
+## 10. 更新历史
+
+| 日期 | 版本 | 更新内容 |
+|------|------|---------|
+| 2023-06-10 | 1.0 | 初始版本 |
+| 2023-06-15 | 1.1 | 添加命令行工具说明 |
+| 2023-06-20 | 1.2 | 添加常见问题与解决方案 |

+ 9 - 1
app/Module/Task/Docs/数据库设计.md

@@ -63,6 +63,8 @@
 | time_limit | int | 是 | NULL | 时间限制(秒,NULL表示无限制) |
 | max_completions | int | 否 | 1 | 最大完成次数(用于限制任务可完成的次数) |
 | reset_type | varchar(20) | 否 | 'none' | 重置类型(none, daily, weekly, monthly) |
+| reset_interval | int | 否 | 0 | 重置间隔(秒),根据重置类型自动计算 |
+| reset_time_field | varchar(50) | 是 | NULL | 重置时间字段,如"daily_reset_time",用于存储具体重置时间点 |
 | display_params | json | 是 | NULL | 显示参数(JSON格式,存储与任务显示相关的参数) |
 | sort_order | int | 否 | 0 | 排序权重(数值越大越靠前) |
 | is_active | tinyint | 否 | 1 | 是否激活(0:否, 1:是) |
@@ -187,12 +189,17 @@
 | completed_at | timestamp | 是 | NULL | 完成时间 |
 | rewarded_at | timestamp | 是 | NULL | 奖励发放时间 |
 | expire_at | timestamp | 是 | NULL | 过期时间 |
+| next_reset_time | timestamp | 是 | NULL | 下次重置时间,用于快速判断是否需要重置 |
+| last_reset_time | timestamp | 是 | NULL | 上次重置时间,用于计算下次重置时间 |
+| reset_count | int | 否 | 0 | 重置次数,用于统计和分析 |
 | created_at | timestamp | 是 | NULL | 创建时间 |
 | updated_at | timestamp | 是 | NULL | 更新时间 |
 
 **索引:**
 - PRIMARY KEY (`id`)
 - UNIQUE KEY `idx_user_task` (`user_id`, `task_id`)
+- KEY `idx_next_reset_time` (`next_reset_time`)
+- KEY `idx_user_next_reset` (`user_id`, `next_reset_time`)
 - KEY `idx_user_status` (`user_id`, `status`)
 - KEY `idx_task` (`task_id`)
 - KEY `idx_expire` (`expire_at`)
@@ -296,7 +303,8 @@
 | 字段名 | 类型 | 允许空 | 默认值 | 说明 |
 |-------|------|-------|-------|------|
 | id | int | 否 | 自增 | 主键 |
-| reset_type | varchar(20) | 否 | - | 重置类型(daily, weekly, monthly) |
+| reset_type | varchar(20) | 否 | - | 重置类型(daily, weekly, monthly, manual, auto) |
+| trigger_type | varchar(20) | 是 | NULL | 触发类型(view, accept, update, reward, admin) |
 | reset_time | timestamp | 否 | - | 重置时间 |
 | affected_tasks | json | 是 | NULL | 受影响的任务ID列表(JSON格式) |
 | affected_count | int | 否 | 0 | 受影响的任务数量 |

+ 0 - 176
app/Module/Task/Docs/设计概述.md

@@ -1,176 +0,0 @@
-# 任务模块设计概述
-
-## 1. 模块简介
-
-任务模块是开心农场系统的核心功能模块之一,负责管理游戏中的各类任务,包括日常任务、成就任务、活动任务等。该模块提供任务的创建、分配、进度跟踪、完成验证和奖励发放等功能,通过任务系统引导玩家体验游戏内容,提高用户活跃度和留存率。
-
-## 2. 核心功能
-
-### 2.1 任务管理
-- 支持多种任务类型:日常任务、周常任务、成就任务、活动任务、新手引导任务、团队任务
-- 任务分类管理:按照不同维度对任务进行分类
-- 任务前置条件:支持设置任务的前置依赖关系
-- 任务时间限制:支持设置任务的有效期和过期机制
-
-### 2.2 任务进度跟踪
-- 自动跟踪玩家的任务进度
-- 支持多种任务目标类型:种植、收获、升级、登录、邀请等
-- 实时更新任务完成状态
-- 任务进度持久化存储
-
-### 2.3 任务奖励系统
-- 支持多种奖励类型:物品、经验、特殊权益等
-- 奖励自动发放机制
-- 奖励领取记录
-- 与物品系统的无缝集成
-
-### 2.4 任务重置机制
-- 支持不同周期的任务重置:每日、每周、每月
-- 重置时保留或清除任务进度
-- 重置时间点可配置
-
-### 2.5 任务通知
-- 新任务可接取通知
-- 任务完成通知
-- 任务即将过期提醒
-
-## 3. 架构设计
-
-### 3.1 模块结构
-
-任务模块采用分层架构设计,遵循"服务是对外的,Logic是内部的"原则:
-
-```
-app/Module/Task/
-├── AdminControllers/        # 后台管理控制器
-│   ├── Helper/              # 控制器辅助类
-│   ├── Actions/             # 控制器动作类
-│   └── LazyRenderable/      # 懒加载渲染类
-├── Commands/                # 命令行工具
-├── Controllers/             # 前端API控制器
-├── Databases/               # 数据库相关文件
-│   └── GenerateSql/         # 数据库创建脚本
-├── Dtos/                    # 数据传输对象
-├── Enums/                   # 枚举类型定义
-├── Events/                  # 事件类
-├── Exceptions/              # 异常类
-├── Listeners/               # 事件监听器
-├── Logics/                  # 业务逻辑类
-├── Models/                  # 数据模型
-├── Providers/               # 服务提供者
-├── Repositorys/             # 数据仓库
-├── Services/                # 服务类
-└── Docs/                    # 模块文档
-```
-
-### 3.2 核心组件
-
-- **Models层**:数据模型,定义数据结构和关系
-- **Logics层**:业务逻辑,处理具体的业务规则
-- **Services层**:服务接口,对外提供功能,调用Logics层处理业务
-- **Controllers层**:控制器,处理HTTP请求,调用Services层
-- **Repositories层**:数据访问层,封装数据库操作
-- **Events/Listeners**:事件和监听器,实现模块间的松耦合通信
-
-## 4. 数据流程
-
-### 4.1 任务接取流程
-1. 用户请求可用任务列表
-2. 系统根据用户等级、完成情况等筛选可接取任务
-3. 用户选择并接取任务
-4. 系统创建用户任务记录,初始化进度
-5. 返回接取结果
-
-### 4.2 任务进度更新流程
-1. 用户执行游戏操作(如种植作物)
-2. 系统捕获相关事件
-3. 任务模块根据事件类型更新相关任务进度
-4. 检查任务是否完成
-5. 如果任务完成,更新任务状态
-
-### 4.3 任务奖励领取流程
-1. 用户请求领取已完成任务的奖励
-2. 系统验证任务完成状态
-3. 系统发放任务奖励(调用物品模块)
-4. 更新任务状态为已领取
-5. 记录奖励领取日志
-6. 触发任务完成事件(用于团队收益计算等)
-
-## 5. 与其他模块的交互
-
-### 5.1 与用户模块的交互
-- 获取用户基本信息
-- 验证用户权限和等级
-
-### 5.2 与物品模块的交互
-- 调用物品模块接口发放任务奖励
-- 验证用户物品使用情况(针对使用物品类任务)
-
-### 5.3 与农场模块的交互
-- 监听种植、收获等事件
-- 更新相关任务进度
-
-### 5.4 与团队模块的交互
-- 任务完成后计算团队收益
-- 支持团队协作任务
-
-### 5.5 与通知模块的交互
-- 发送任务相关通知
-
-## 6. 扩展性设计
-
-### 6.1 任务类型扩展
-- 通过枚举类型定义任务类型,便于扩展
-- 支持自定义任务目标类型
-- 支持自定义任务完成条件
-
-### 6.2 任务奖励扩展
-- 支持多种奖励类型
-- 支持自定义奖励发放逻辑
-
-### 6.3 任务触发机制扩展
-- 基于事件的任务进度更新机制
-- 支持自定义事件监听器
-
-## 7. 性能优化
-
-### 7.1 数据库优化
-- 合理设计索引
-- 分表策略(按用户ID分片)
-- 定期清理过期任务数据
-
-### 7.2 缓存策略
-- 缓存用户当前任务列表
-- 缓存任务配置信息
-- 使用Redis存储热点任务数据
-
-### 7.3 异步处理
-- 任务奖励发放异步处理
-- 大规模任务重置使用队列处理
-
-## 8. 安全性考虑
-
-### 8.1 防作弊机制
-- 任务进度服务端验证
-- 敏感操作日志记录
-- 异常任务完成监控
-
-### 8.2 数据一致性
-- 使用事务确保任务状态和奖励发放的原子性
-- 奖励发放失败重试机制
-
-## 9. 未来规划
-
-### 9.1 功能扩展
-- 支持任务链和任务树
-- 支持条件分支任务
-- 支持多人协作任务
-
-### 9.2 性能提升
-- 引入分布式任务处理
-- 优化大规模任务数据存储
-
-### 9.3 用户体验优化
-- 任务推荐系统
-- 个性化任务生成
-- 任务完成动画和特效

+ 265 - 0
app/Module/Task/Docs/设计概述_new.md

@@ -0,0 +1,265 @@
+# 任务模块设计概述
+
+## 1. 模块简介
+
+任务模块是开心农场系统的核心功能模块之一,负责管理游戏中的各类任务,包括日常任务、成就任务、活动任务等。该模块提供任务的创建、分配、进度跟踪、完成验证和奖励发放等功能,通过任务系统引导玩家体验游戏内容,提高用户活跃度和留存率。
+
+## 2. 核心功能
+
+### 2.1 任务管理
+- 支持多种任务类型:日常任务、周常任务、成就任务、活动任务、新手引导任务、团队任务
+- 任务分类管理:按照不同维度对任务进行分类
+- 任务前置条件:支持设置任务的前置依赖关系
+- 任务时间限制:支持设置任务的有效期和过期机制
+
+### 2.2 任务进度跟踪
+- 自动跟踪玩家的任务进度
+- 支持多种任务目标类型:种植、收获、升级、登录、邀请等
+- 实时更新任务完成状态
+- 任务进度持久化存储
+
+### 2.3 任务奖励系统
+- 支持多种奖励类型:物品、经验、特殊权益等
+- 奖励自动发放机制
+- 奖励领取记录
+- 与物品系统的无缝集成
+
+### 2.4 任务重置机制
+- 支持不同周期的任务重置:每日、每周、每月
+- 重置时保留或清除任务进度
+- 重置时间点可配置
+
+### 2.5 任务通知
+- 新任务可接取通知
+- 任务完成通知
+- 任务即将过期提醒
+
+## 3. 任务机制
+
+### 3.1 任务类型与分类
+
+任务模块支持多种任务类型,每种类型有不同的特性和处理机制:
+
+1. **日常任务(Daily)**
+   - 每天重置,通常在凌晨0点
+   - 用于鼓励玩家每天登录游戏
+   - 典型例子:每日登录、每日种植3次、每日收获10次
+
+2. **周常任务(Weekly)**
+   - 每周重置,通常在周一凌晨0点
+   - 难度和奖励通常高于日常任务
+   - 典型例子:周内种植50次、周内完成5次交易
+
+3. **成就任务(Achievement)**
+   - 永不重置,只能完成一次
+   - 通常有多个等级或阶段
+   - 典型例子:种植1000次、收获稀有价值的作物、达到特定等级
+
+4. **活动任务(Event)**
+   - 与游戏活动绑定,有明确的开始和结束时间
+   - 通常有特殊的奖励和玩法
+   - 典型例子:节日活动任务、限时活动任务
+
+5. **新手引导任务(Tutorial)**
+   - 用于指导新玩家学习游戏机制
+   - 通常有固定的顺序和前置依赖
+   - 典型例子:完成游戏注册、完成第一次种植
+
+6. **团队任务(Team)**
+   - 需要多个玩家合作完成
+   - 通常有团队进度和个人贡献度
+   - 典型例子:团队种植总量、团队收获总量
+
+### 3.2 任务条件与进度
+
+任务模块采用多条件进度跟踪机制,支持复杂的任务完成逻辑:
+
+1. **多条件任务**
+   - 一个任务可以有多个完成条件
+   - 条件类型分为前置条件(prerequisite)和进度条件(progress)
+   - 可以设置条件是否必要(is_required)
+
+2. **条件参数化**
+   - 每个条件可以设置特定参数,如特定作物ID、特定物品ID等
+   - 参数以JSON格式存储,支持复杂的条件配置
+
+3. **进度计算机制**
+   - 支持多种运算符:=、>=、<=等
+   - 每个条件有独立的目标值和当前值
+   - 总进度基于必要条件的完成比例计算
+
+4. **条件依赖关系**
+   - 支持条件之间的依赖关系
+   - 可以设置条件的完成顺序
+
+### 3.3 任务重置机制
+
+任务模块提供灵活的重置机制,支持不同类型任务的周期性重置:
+
+1. **重置类型**
+   - 每日重置(daily):每天凌晨0点重置
+   - 每周重置(weekly):每周一凌晨0点重置
+   - 每月重置(monthly):每月1日凌晨0点重置
+   - 不重置(none):永不重置,只能完成一次
+
+2. **重置内容**
+   - 任务状态重置:将已完成或已领取奖励的任务重置为未接取或进行中
+   - 任务进度重置:将任务的完成进度重置为0或初始值
+   - 可以选择性重置特定条件的进度
+
+3. **重置时间控制**
+   - 支持自定义重置时间点
+   - 考虑时区因素,默认使用北京时间(UTC+8)
+   - 支持手动触发重置
+
+4. **重置日志**
+   - 记录每次重置的详细信息
+   - 包括重置类型、重置时间、受影响的任务等
+
+### 3.4 任务奖励机制
+
+任务模块提供丰富的奖励机制,支持多种奖励类型和发放方式:
+
+1. **奖励类型**
+   - 物品奖励(item):如种子、工具、道具等
+   - 货币奖励(currency):如金币、钻石、点券等
+   - 经验奖励(experience):玩家经验值、实验室经验等
+   - 特殊权益(feature_unlock):解锁特殊功能、增加背包格子等
+
+2. **奖励参数化**
+   - 每个奖励有两个参数:reward_param1和reward_param2
+   - 参数含义根据奖励类型不同,如物品类型和ID、货币类型和ID等
+   - 支持额外数据(extra_data)存储复杂奖励信息
+
+3. **奖励发放机制**
+   - 手动领取:用户主动领取奖励
+   - 自动发放:任务完成后自动发放奖励
+   - 批量领取:支持一键领取多个任务奖励
+
+4. **奖励发放日志**
+   - 记录每次奖励发放的详细信息
+   - 包括用户ID、任务ID、奖励内容、发放时间等
+
+### 3.5 任务接取消耗
+
+任务模块支持任务接取消耗机制,允许设置接取任务所需的资源消耗:
+
+1. **消耗类型**
+   - 货币消耗(currency):如金币、钻石等
+   - 物品消耗(item):如任务券、特殊道具等
+   - 能量消耗(energy):如体力、精力等
+
+2. **消耗参数化**
+   - 每个消耗有两个参数:cost_param1和cost_param2
+   - 参数含义根据消耗类型不同,如货币类型和ID、物品类型和ID等
+
+3. **消耗验证机制**
+   - 接取任务前验证用户资源是否足够
+   - 支持多种消耗组合
+
+4. **消耗日志**
+   - 记录每次消耗的详细信息
+   - 包括用户ID、任务ID、消耗类型、消耗数量等
+
+## 4. 数据流程
+
+### 4.1 任务接取流程
+1. 用户请求可用任务列表
+2. 系统根据用户等级、完成情况等筛选可接取任务
+3. 用户选择并接取任务
+4. 系统创建用户任务记录,初始化进度
+5. 返回接取结果
+
+### 4.2 任务进度更新流程
+1. 用户执行游戏操作(如种植作物)
+2. 系统捕获相关事件
+3. 任务模块根据事件类型更新相关任务进度
+4. 检查任务是否完成
+5. 如果任务完成,更新任务状态
+
+### 4.3 任务奖励领取流程
+1. 用户请求领取已完成任务的奖励
+2. 系统验证任务完成状态
+3. 系统发放任务奖励(调用物品模块)
+4. 更新任务状态为已领取
+5. 记录奖励领取日志
+6. 触发任务完成事件(用于团队收益计算等)
+
+## 5. 与其他模块的交互
+
+### 5.1 与用户模块的交互
+- 获取用户基本信息
+- 验证用户权限和等级
+
+### 5.2 与物品模块的交互
+- 调用物品模块接口发放任务奖励
+- 验证用户物品使用情况(针对使用物品类任务)
+
+### 5.3 与农场模块的交互
+- 监听种植、收获等事件
+- 更新相关任务进度
+
+### 5.4 与团队模块的交互
+- 任务完成后计算团队收益
+- 支持团队协作任务
+
+### 5.5 与通知模块的交互
+- 发送任务相关通知
+
+## 6. 扩展性设计
+
+### 6.1 任务类型扩展
+- 通过枚举类型定义任务类型,便于扩展
+- 支持自定义任务目标类型
+- 支持自定义任务完成条件
+
+### 6.2 任务奖励扩展
+- 支持多种奖励类型
+- 支持自定义奖励发放逻辑
+
+### 6.3 任务触发机制扩展
+- 基于事件的任务进度更新机制
+- 支持自定义事件监听器
+
+## 7. 性能优化
+
+### 7.1 数据库优化
+- 合理设计索引
+- 分表策略(按用户ID分片)
+- 定期清理过期任务数据
+
+### 7.2 缓存策略
+- 缓存用户当前任务列表
+- 缓存任务配置信息
+- 使用Redis存储热点任务数据
+
+### 7.3 异步处理
+- 任务奖励发放异步处理
+- 大规模任务重置使用队列处理
+
+## 8. 安全性考虑
+
+### 8.1 防作弊机制
+- 任务进度服务端验证
+- 敏感操作日志记录
+- 异常任务完成监控
+
+### 8.2 数据一致性
+- 使用事务确保任务状态和奖励发放的原子性
+- 奖励发放失败重试机制
+
+## 9. 未来规划
+
+### 9.1 功能扩展
+- 支持任务链和任务树
+- 支持条件分支任务
+- 支持多人协作任务
+
+### 9.2 性能提升
+- 引入分布式任务处理
+- 优化大规模任务数据存储
+
+### 9.3 用户体验优化
+- 任务推荐系统
+- 个性化任务生成
+- 任务完成动画和特效

+ 806 - 0
app/Module/Task/Docs/配置表设计.md

@@ -0,0 +1,806 @@
+# 任务模块配置表设计
+
+## 1. 概述
+
+任务模块的配置表是为客户端提供的JSON格式配置文件,用于定义任务的基本信息、完成条件、奖励内容等。本文档详细介绍了任务模块配置表的设计,包括配置表结构、字段说明、生成方式以及使用方法。
+
+## 2. 配置表结构
+
+任务模块的配置表主要包括以下几个部分:
+
+1. **任务基础配置表** - 定义任务的基本信息
+2. **任务条件配置表** - 定义任务的完成条件
+3. **任务奖励配置表** - 定义任务的奖励内容
+4. **任务消耗配置表** - 定义任务的接取消耗
+
+### 2.1 任务基础配置表
+
+任务基础配置表定义了任务的基本信息,包括任务ID、名称、描述、类型、等级要求等。
+
+**文件名**:`task_config.json`
+
+**结构示例**:
+
+```json
+{
+  "tasks": [
+    {
+      "id": 1001,
+      "name": "每日登录",
+      "description": "每天登录游戏",
+      "type": "daily",
+      "category_id": 1,
+      "level_required": 1,
+      "max_completions": 1,
+      "reset_type": "daily",
+      "sort_order": 100,
+      "display_params": {
+        "icon": "login_icon.png",
+        "background": "daily_task_bg.png",
+        "color": "#FF5733"
+      },
+      "conditions": [1001],
+      "rewards": [1001, 1002],
+      "costs": []
+    },
+    {
+      "id": 1002,
+      "name": "种植10次作物",
+      "description": "种植10次任意作物",
+      "type": "daily",
+      "category_id": 2,
+      "level_required": 2,
+      "max_completions": 1,
+      "reset_type": "daily",
+      "sort_order": 90,
+      "display_params": {
+        "icon": "plant_icon.png",
+        "background": "daily_task_bg.png",
+        "color": "#33FF57"
+      },
+      "conditions": [1002],
+      "rewards": [1003, 1004],
+      "costs": []
+    }
+  ],
+  "categories": [
+    {
+      "id": 1,
+      "name": "每日任务",
+      "code": "daily",
+      "description": "每天可完成的任务",
+      "sort_order": 100
+    },
+    {
+      "id": 2,
+      "name": "成就任务",
+      "code": "achievement",
+      "description": "一次性完成的成就任务",
+      "sort_order": 90
+    }
+  ]
+}
+```
+
+**字段说明**:
+
+| 字段 | 类型 | 必填 | 描述 |
+|------|------|------|------|
+| id | int | 是 | 任务ID |
+| name | string | 是 | 任务名称 |
+| description | string | 是 | 任务描述 |
+| type | string | 是 | 任务类型(daily, weekly, achievement, event, tutorial, team) |
+| category_id | int | 是 | 任务分类ID |
+| level_required | int | 是 | 所需等级 |
+| max_completions | int | 是 | 最大完成次数 |
+| reset_type | string | 是 | 重置类型(none, daily, weekly, monthly) |
+| sort_order | int | 是 | 排序权重(数值越大越靠前) |
+| display_params | object | 否 | 显示参数,如图标、背景、颜色等 |
+| conditions | array | 是 | 任务条件ID列表 |
+| rewards | array | 是 | 任务奖励ID列表 |
+| costs | array | 是 | 任务接取消耗ID列表 |
+
+### 2.2 任务条件配置表
+
+任务条件配置表定义了任务的完成条件,包括条件ID、条件类型、目标值等。
+
+**文件名**:`task_condition_config.json`
+
+**结构示例**:
+
+```json
+{
+  "conditions": [
+    {
+      "id": 1001,
+      "task_id": 1001,
+      "condition_code": "login",
+      "condition_type": "progress",
+      "target_value": 1,
+      "params": {},
+      "operator": "=",
+      "sort_order": 1,
+      "is_required": true
+    },
+    {
+      "id": 1002,
+      "task_id": 1002,
+      "condition_code": "plant_crop",
+      "condition_type": "progress",
+      "target_value": 10,
+      "params": {
+        "crop_id": 0
+      },
+      "operator": ">=",
+      "sort_order": 1,
+      "is_required": true
+    }
+  ],
+  "condition_types": [
+    {
+      "code": "login",
+      "name": "登录游戏",
+      "description": "登录游戏",
+      "param_schema": {}
+    },
+    {
+      "code": "plant_crop",
+      "name": "种植作物",
+      "description": "种植作物",
+      "param_schema": {
+        "crop_id": {
+          "type": "integer",
+          "required": false,
+          "description": "作物ID,0表示任意作物"
+        }
+      }
+    }
+  ]
+}
+```
+
+**字段说明**:
+
+| 字段 | 类型 | 必填 | 描述 |
+|------|------|------|------|
+| id | int | 是 | 条件ID |
+| task_id | int | 是 | 任务ID |
+| condition_code | string | 是 | 条件代码 |
+| condition_type | string | 是 | 条件类型(prerequisite=前置条件,progress=进度条件) |
+| target_value | int | 是 | 目标值 |
+| params | object | 否 | 条件参数 |
+| operator | string | 是 | 运算符(=, >=, <=) |
+| sort_order | int | 是 | 排序顺序 |
+| is_required | bool | 是 | 是否必须满足此条件 |
+
+### 2.3 任务奖励配置表
+
+任务奖励配置表定义了任务的奖励内容,包括奖励ID、奖励类型、奖励数量等。
+
+**文件名**:`task_reward_config.json`
+
+**结构示例**:
+
+```json
+{
+  "rewards": [
+    {
+      "id": 1001,
+      "task_id": 1001,
+      "reward_type": "currency",
+      "reward_param1": "gold",
+      "reward_param2": "1",
+      "quantity": 100,
+      "extra_data": {},
+      "sort_order": 1
+    },
+    {
+      "id": 1002,
+      "task_id": 1001,
+      "reward_type": "item",
+      "reward_param1": "seed",
+      "reward_param2": "1001",
+      "quantity": 5,
+      "extra_data": {},
+      "sort_order": 2
+    },
+    {
+      "id": 1003,
+      "task_id": 1002,
+      "reward_type": "currency",
+      "reward_param1": "gold",
+      "reward_param2": "1",
+      "quantity": 200,
+      "extra_data": {},
+      "sort_order": 1
+    },
+    {
+      "id": 1004,
+      "task_id": 1002,
+      "reward_type": "experience",
+      "reward_param1": "player",
+      "reward_param2": "1",
+      "quantity": 50,
+      "extra_data": {},
+      "sort_order": 2
+    }
+  ]
+}
+```
+
+**字段说明**:
+
+| 字段 | 类型 | 必填 | 描述 |
+|------|------|------|------|
+| id | int | 是 | 奖励ID |
+| task_id | int | 是 | 任务ID |
+| reward_type | string | 是 | 奖励类型(item, currency, experience, feature_unlock等) |
+| reward_param1 | string | 是 | 奖励参数1(如物品类型、货币类型等) |
+| reward_param2 | string | 是 | 奖励参数2(如物品ID、货币ID等) |
+| quantity | int | 是 | 奖励数量 |
+| extra_data | object | 否 | 额外数据 |
+| sort_order | int | 是 | 排序权重 |
+
+### 2.4 任务消耗配置表
+
+任务消耗配置表定义了任务的接取消耗,包括消耗ID、消耗类型、消耗数量等。
+
+**文件名**:`task_cost_config.json`
+
+**结构示例**:
+
+```json
+{
+  "costs": [
+    {
+      "id": 1001,
+      "task_id": 1003,
+      "cost_type": "currency",
+      "cost_param1": "gold",
+      "cost_param2": "1",
+      "quantity": 50,
+      "extra_data": {},
+      "sort_order": 1
+    },
+    {
+      "id": 1002,
+      "task_id": 1003,
+      "cost_type": "item",
+      "cost_param1": "ticket",
+      "cost_param2": "1001",
+      "quantity": 1,
+      "extra_data": {},
+      "sort_order": 2
+    }
+  ]
+}
+```
+
+**字段说明**:
+
+| 字段 | 类型 | 必填 | 描述 |
+|------|------|------|------|
+| id | int | 是 | 消耗ID |
+| task_id | int | 是 | 任务ID |
+| cost_type | string | 是 | 消耗类型(currency, item, energy, ticket等) |
+| cost_param1 | string | 是 | 消耗参数1(如货币类型、物品类型等) |
+| cost_param2 | string | 是 | 消耗参数2(如货币ID、物品ID等) |
+| quantity | int | 是 | 消耗数量 |
+| extra_data | object | 否 | 额外数据 |
+| sort_order | int | 是 | 排序权重 |
+
+## 3. 配置表生成方式
+
+任务模块的配置表可以通过以下几种方式生成:
+
+### 3.1 数据库导出
+
+通过数据库查询导出配置表数据:
+
+```php
+use App\Module\Task\Models\Task;
+use App\Module\Task\Models\TaskCategory;
+use App\Module\Task\Models\TaskAchievementCondition;
+use App\Module\Task\Models\TaskCondition;
+use App\Module\Task\Models\TaskReward;
+use App\Module\Task\Models\TaskCost;
+
+// 导出任务基础配置表
+public function exportTaskConfig()
+{
+    $tasks = Task::with(['achievementConditions', 'rewards', 'costs'])->get();
+    $categories = TaskCategory::all();
+    
+    $taskConfig = [
+        'tasks' => [],
+        'categories' => []
+    ];
+    
+    foreach ($tasks as $task) {
+        $taskConfig['tasks'][] = [
+            'id' => $task->id,
+            'name' => $task->name,
+            'description' => $task->description,
+            'type' => $task->type,
+            'category_id' => $task->category_id,
+            'level_required' => $task->level_required,
+            'max_completions' => $task->max_completions,
+            'reset_type' => $task->reset_type,
+            'sort_order' => $task->sort_order,
+            'display_params' => $task->display_params,
+            'conditions' => $task->achievementConditions->pluck('id')->toArray(),
+            'rewards' => $task->rewards->pluck('id')->toArray(),
+            'costs' => $task->costs->pluck('id')->toArray()
+        ];
+    }
+    
+    foreach ($categories as $category) {
+        $taskConfig['categories'][] = [
+            'id' => $category->id,
+            'name' => $category->name,
+            'code' => $category->code,
+            'description' => $category->description,
+            'sort_order' => $category->sort_order
+        ];
+    }
+    
+    return json_encode($taskConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+}
+
+// 导出任务条件配置表
+public function exportTaskConditionConfig()
+{
+    $conditions = TaskAchievementCondition::with('condition')->get();
+    $conditionTypes = TaskCondition::all();
+    
+    $conditionConfig = [
+        'conditions' => [],
+        'condition_types' => []
+    ];
+    
+    foreach ($conditions as $condition) {
+        $conditionConfig['conditions'][] = [
+            'id' => $condition->id,
+            'task_id' => $condition->task_id,
+            'condition_code' => $condition->condition->code,
+            'condition_type' => $condition->condition_type,
+            'target_value' => $condition->target_value,
+            'params' => $condition->params,
+            'operator' => $condition->operator,
+            'sort_order' => $condition->sort_order,
+            'is_required' => $condition->is_required
+        ];
+    }
+    
+    foreach ($conditionTypes as $type) {
+        $conditionConfig['condition_types'][] = [
+            'code' => $type->code,
+            'name' => $type->name,
+            'description' => $type->description,
+            'param_schema' => $type->param_schema
+        ];
+    }
+    
+    return json_encode($conditionConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+}
+
+// 导出任务奖励配置表
+public function exportTaskRewardConfig()
+{
+    $rewards = TaskReward::all();
+    
+    $rewardConfig = [
+        'rewards' => []
+    ];
+    
+    foreach ($rewards as $reward) {
+        $rewardConfig['rewards'][] = [
+            'id' => $reward->id,
+            'task_id' => $reward->task_id,
+            'reward_type' => $reward->reward_type,
+            'reward_param1' => $reward->reward_param1,
+            'reward_param2' => $reward->reward_param2,
+            'quantity' => $reward->quantity,
+            'extra_data' => $reward->extra_data,
+            'sort_order' => $reward->sort_order
+        ];
+    }
+    
+    return json_encode($rewardConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+}
+
+// 导出任务消耗配置表
+public function exportTaskCostConfig()
+{
+    $costs = TaskCost::all();
+    
+    $costConfig = [
+        'costs' => []
+    ];
+    
+    foreach ($costs as $cost) {
+        $costConfig['costs'][] = [
+            'id' => $cost->id,
+            'task_id' => $cost->task_id,
+            'cost_type' => $cost->cost_type,
+            'cost_param1' => $cost->cost_param1,
+            'cost_param2' => $cost->cost_param2,
+            'quantity' => $cost->quantity,
+            'extra_data' => $cost->extra_data,
+            'sort_order' => $cost->sort_order
+        ];
+    }
+    
+    return json_encode($costConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
+}
+```
+
+### 3.2 命令行工具
+
+通过命令行工具生成配置表:
+
+```php
+namespace App\Module\Task\Commands;
+
+use Illuminate\Console\Command;
+use App\Module\Task\Services\TaskConfigService;
+
+class GenerateTaskConfigCommand extends Command
+{
+    /**
+     * 命令名称
+     *
+     * @var string
+     */
+    protected $signature = 'task:generate-config {--output=public/configs}';
+
+    /**
+     * 命令描述
+     *
+     * @var string
+     */
+    protected $description = '生成任务模块配置表';
+
+    /**
+     * 任务配置服务
+     *
+     * @var TaskConfigService
+     */
+    protected $configService;
+
+    /**
+     * 创建命令实例
+     *
+     * @param TaskConfigService $configService
+     * @return void
+     */
+    public function __construct(TaskConfigService $configService)
+    {
+        parent::__construct();
+        $this->configService = $configService;
+    }
+
+    /**
+     * 执行命令
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $outputPath = $this->option('output');
+        
+        // 确保输出目录存在
+        if (!is_dir($outputPath)) {
+            mkdir($outputPath, 0755, true);
+        }
+        
+        // 生成任务基础配置表
+        $taskConfig = $this->configService->exportTaskConfig();
+        file_put_contents("$outputPath/task_config.json", $taskConfig);
+        $this->info("任务基础配置表已生成:$outputPath/task_config.json");
+        
+        // 生成任务条件配置表
+        $conditionConfig = $this->configService->exportTaskConditionConfig();
+        file_put_contents("$outputPath/task_condition_config.json", $conditionConfig);
+        $this->info("任务条件配置表已生成:$outputPath/task_condition_config.json");
+        
+        // 生成任务奖励配置表
+        $rewardConfig = $this->configService->exportTaskRewardConfig();
+        file_put_contents("$outputPath/task_reward_config.json", $rewardConfig);
+        $this->info("任务奖励配置表已生成:$outputPath/task_reward_config.json");
+        
+        // 生成任务消耗配置表
+        $costConfig = $this->configService->exportTaskCostConfig();
+        file_put_contents("$outputPath/task_cost_config.json", $costConfig);
+        $this->info("任务消耗配置表已生成:$outputPath/task_cost_config.json");
+        
+        return 0;
+    }
+}
+```
+
+## 4. 配置表使用方法
+
+### 4.1 客户端使用
+
+客户端可以通过HTTP请求获取配置表,然后解析JSON数据:
+
+```javascript
+// 获取任务基础配置表
+fetch('/configs/task_config.json')
+  .then(response => response.json())
+  .then(data => {
+    // 处理任务基础配置数据
+    console.log(data.tasks);
+    console.log(data.categories);
+  });
+
+// 获取任务条件配置表
+fetch('/configs/task_condition_config.json')
+  .then(response => response.json())
+  .then(data => {
+    // 处理任务条件配置数据
+    console.log(data.conditions);
+    console.log(data.condition_types);
+  });
+
+// 获取任务奖励配置表
+fetch('/configs/task_reward_config.json')
+  .then(response => response.json())
+  .then(data => {
+    // 处理任务奖励配置数据
+    console.log(data.rewards);
+  });
+
+// 获取任务消耗配置表
+fetch('/configs/task_cost_config.json')
+  .then(response => response.json())
+  .then(data => {
+    // 处理任务消耗配置数据
+    console.log(data.costs);
+  });
+```
+
+### 4.2 服务端使用
+
+服务端可以通过配置服务读取配置表:
+
+```php
+namespace App\Module\Task\Services;
+
+use Illuminate\Support\Facades\File;
+
+class TaskConfigService
+{
+    /**
+     * 配置文件路径
+     *
+     * @var string
+     */
+    protected $configPath = 'public/configs';
+    
+    /**
+     * 获取任务基础配置
+     *
+     * @return array
+     */
+    public function getTaskConfig()
+    {
+        $configFile = "{$this->configPath}/task_config.json";
+        
+        if (File::exists($configFile)) {
+            return json_decode(File::get($configFile), true);
+        }
+        
+        return [
+            'tasks' => [],
+            'categories' => []
+        ];
+    }
+    
+    /**
+     * 获取任务条件配置
+     *
+     * @return array
+     */
+    public function getTaskConditionConfig()
+    {
+        $configFile = "{$this->configPath}/task_condition_config.json";
+        
+        if (File::exists($configFile)) {
+            return json_decode(File::get($configFile), true);
+        }
+        
+        return [
+            'conditions' => [],
+            'condition_types' => []
+        ];
+    }
+    
+    /**
+     * 获取任务奖励配置
+     *
+     * @return array
+     */
+    public function getTaskRewardConfig()
+    {
+        $configFile = "{$this->configPath}/task_reward_config.json";
+        
+        if (File::exists($configFile)) {
+            return json_decode(File::get($configFile), true);
+        }
+        
+        return [
+            'rewards' => []
+        ];
+    }
+    
+    /**
+     * 获取任务消耗配置
+     *
+     * @return array
+     */
+    public function getTaskCostConfig()
+    {
+        $configFile = "{$this->configPath}/task_cost_config.json";
+        
+        if (File::exists($configFile)) {
+            return json_decode(File::get($configFile), true);
+        }
+        
+        return [
+            'costs' => []
+        ];
+    }
+}
+```
+
+## 5. 配置表更新机制
+
+### 5.1 定时更新
+
+通过定时任务定期更新配置表:
+
+```php
+// 在App\Console\Kernel.php中注册定时任务
+protected function schedule(Schedule $schedule)
+{
+    // 每天凌晨2点更新任务配置表
+    $schedule->command('task:generate-config')->dailyAt('02:00');
+}
+```
+
+### 5.2 手动更新
+
+通过后台管理界面手动更新配置表:
+
+```php
+// 在后台控制器中添加更新配置表的方法
+public function generateConfig()
+{
+    Artisan::call('task:generate-config');
+    
+    return redirect()->back()->with('success', '任务配置表已更新');
+}
+```
+
+## 6. 配置表版本控制
+
+为了确保客户端使用最新的配置表,可以实现版本控制机制:
+
+### 6.1 版本号文件
+
+创建一个版本号文件,记录配置表的版本信息:
+
+```json
+{
+  "version": "1.0.0",
+  "update_time": "2023-06-10 12:00:00",
+  "files": [
+    {
+      "name": "task_config.json",
+      "version": "1.0.0",
+      "md5": "a1b2c3d4e5f6g7h8i9j0"
+    },
+    {
+      "name": "task_condition_config.json",
+      "version": "1.0.0",
+      "md5": "b2c3d4e5f6g7h8i9j0k1"
+    },
+    {
+      "name": "task_reward_config.json",
+      "version": "1.0.0",
+      "md5": "c3d4e5f6g7h8i9j0k1l2"
+    },
+    {
+      "name": "task_cost_config.json",
+      "version": "1.0.0",
+      "md5": "d4e5f6g7h8i9j0k1l2m3"
+    }
+  ]
+}
+```
+
+### 6.2 版本检查接口
+
+提供一个版本检查接口,让客户端检查配置表是否需要更新:
+
+```php
+// 在API控制器中添加版本检查方法
+public function checkConfigVersion()
+{
+    $versionFile = public_path('configs/version.json');
+    
+    if (File::exists($versionFile)) {
+        $version = json_decode(File::get($versionFile), true);
+        
+        return response()->json([
+            'success' => true,
+            'data' => $version
+        ]);
+    }
+    
+    return response()->json([
+        'success' => false,
+        'message' => '版本文件不存在'
+    ]);
+}
+```
+
+## 7. 最佳实践
+
+1. **保持配置表简洁**:只包含客户端需要的数据,避免包含敏感信息
+2. **使用CDN加速**:将配置表部署到CDN,提高访问速度
+3. **增量更新**:实现增量更新机制,减少数据传输量
+4. **压缩配置表**:使用gzip等压缩算法减小配置表大小
+5. **缓存配置表**:客户端缓存配置表,减少网络请求
+6. **版本控制**:实现版本控制机制,确保客户端使用最新的配置表
+7. **备份配置表**:定期备份配置表,防止数据丢失
+
+## 8. 常见问题与解决方案
+
+### 8.1 配置表过大
+
+可能的原因:
+- 包含了过多不必要的数据
+- 数据结构不合理
+
+解决方案:
+- 优化数据结构,减少冗余数据
+- 拆分配置表,按需加载
+- 使用压缩算法减小配置表大小
+
+### 8.2 配置表更新不及时
+
+可能的原因:
+- 定时任务未执行
+- 客户端缓存未更新
+
+解决方案:
+- 检查定时任务配置
+- 实现版本控制机制,强制客户端更新缓存
+
+### 8.3 配置表数据不一致
+
+可能的原因:
+- 多个服务器之间的配置表不同步
+- 生成配置表时数据库状态不一致
+
+解决方案:
+- 使用中央存储服务存储配置表
+- 在事务中生成配置表,确保数据一致性
+
+## 9. 参考资料
+
+- [JSON Schema 官方文档](https://json-schema.org/)
+- [Laravel 文件系统文档](https://laravel.com/docs/filesystem)
+- [任务模块数据库设计](数据库设计.md)
+- [任务模块开发指南](开发指南.md)
+
+## 10. 更新历史
+
+| 日期 | 版本 | 更新内容 |
+|------|------|---------|
+| 2023-06-10 | 1.0 | 初始版本 |
+| 2023-06-15 | 1.1 | 添加版本控制机制 |
+| 2023-06-20 | 1.2 | 添加常见问题与解决方案 |

+ 84 - 0
app/Module/Task/Listeners/TaskCompletedListener.php

@@ -0,0 +1,84 @@
+<?php
+
+namespace App\Module\Task\Listeners;
+
+use App\Module\Task\Events\TaskCompletedEvent;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+/**
+ * 任务完成事件监听器
+ *
+ * 监听任务完成事件,执行相关操作
+ */
+class TaskCompletedListener extends BaseTaskEventListener implements ShouldQueue
+{
+    /**
+     * 创建监听器实例
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * 处理任务完成事件
+     *
+     * @param TaskCompletedEvent $event
+     * @return void
+     */
+    public function handle($event): void
+    {
+        // 记录日志
+        $this->logEvent("用户 {$event->userId} 完成了任务 {$event->taskName}", [
+            'user_id' => $event->userId,
+            'task_id' => $event->taskId,
+            'task_type' => $event->taskType,
+            'completed_at' => $event->completedAt,
+            'rewards' => $event->rewards
+        ]);
+
+        // 更新用户统计数据
+        // 这里可以调用用户服务来更新任务完成统计
+        // $this->updateUserTaskStats($event->userId, $event->taskType);
+
+        // 发送任务完成通知
+        $this->sendTaskCompletionNotification($event);
+
+        // 检查成就解锁
+        $this->checkAchievementUnlock($event);
+    }
+
+    /**
+     * 发送任务完成通知
+     *
+     * @param TaskCompletedEvent $event
+     * @return void
+     */
+    private function sendTaskCompletionNotification(TaskCompletedEvent $event): void
+    {
+        // 这里可以调用通知服务发送通知
+        //todo  例如:发送系统消息、推送通知等
+        $this->logEvent("发送任务完成通知", [
+            'user_id' => $event->userId,
+            'task_name' => $event->taskName
+        ]);
+    }
+
+    /**
+     * 检查成就解锁
+     *
+     * @param TaskCompletedEvent $event
+     * @return void
+     */
+    private function checkAchievementUnlock(TaskCompletedEvent $event): void
+    {
+        // 这里可以检查是否有成就可以解锁
+        //todo 例如:完成特定数量的任务、完成特定类型的任务等
+        $this->logEvent("检查成就解锁", [
+            'user_id' => $event->userId,
+            'task_type' => $event->taskType
+        ]);
+    }
+}

+ 108 - 0
app/Module/Task/Listeners/TaskRewardClaimedListener.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace App\Module\Task\Listeners;
+
+use App\Module\Task\Events\TaskRewardClaimedEvent;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+/**
+ * 任务奖励领取事件监听器
+ * 
+ * 监听任务奖励领取事件,执行相关操作
+ */
+class TaskRewardClaimedListener extends BaseTaskEventListener implements ShouldQueue
+{
+    /**
+     * 创建监听器实例
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * 处理任务奖励领取事件
+     *
+     * @param TaskRewardClaimedEvent $event
+     * @return void
+     */
+    public function handle($event): void
+    {
+        // 记录日志
+        $this->logEvent("用户 {$event->userId} 领取了任务 {$event->taskName} 的奖励", [
+            'user_id' => $event->userId,
+            'task_id' => $event->taskId,
+            'rewards' => $event->rewards,
+            'claimed_at' => $event->claimedAt,
+            'is_success' => $event->isSuccess
+        ]);
+        
+        // 如果奖励发放成功
+        if ($event->isSuccess) {
+            // 更新用户统计数据
+            // 这里可以调用用户服务来更新奖励领取统计
+            // $this->updateUserRewardStats($event->userId, $event->rewards);
+            
+            // 发送奖励领取通知
+            $this->sendRewardClaimedNotification($event);
+            
+            // 检查特殊奖励触发
+            $this->checkSpecialRewardTrigger($event);
+        } else {
+            // 处理奖励发放失败的情况
+            $this->handleRewardFailure($event);
+        }
+    }
+    
+    /**
+     * 发送奖励领取通知
+     *
+     * @param TaskRewardClaimedEvent $event
+     * @return void
+     */
+    private function sendRewardClaimedNotification(TaskRewardClaimedEvent $event): void
+    {
+        // 这里可以调用通知服务发送通知
+        // 例如:发送系统消息、推送通知等
+        $this->logEvent("发送奖励领取通知", [
+            'user_id' => $event->userId,
+            'task_name' => $event->taskName,
+            'rewards' => $event->rewards
+        ]);
+    }
+    
+    /**
+     * 检查特殊奖励触发
+     *
+     * @param TaskRewardClaimedEvent $event
+     * @return void
+     */
+    private function checkSpecialRewardTrigger(TaskRewardClaimedEvent $event): void
+    {
+        // 这里可以检查是否有特殊奖励可以触发
+        // 例如:累计领取特定数量的奖励、领取特定类型的奖励等
+        $this->logEvent("检查特殊奖励触发", [
+            'user_id' => $event->userId,
+            'rewards' => $event->rewards
+        ]);
+    }
+    
+    /**
+     * 处理奖励发放失败的情况
+     *
+     * @param TaskRewardClaimedEvent $event
+     * @return void
+     */
+    private function handleRewardFailure(TaskRewardClaimedEvent $event): void
+    {
+        // 这里可以处理奖励发放失败的情况
+        // 例如:记录错误日志、发送警报等
+        $this->logEvent("奖励发放失败", [
+            'user_id' => $event->userId,
+            'task_id' => $event->taskId,
+            'rewards' => $event->rewards
+        ]);
+    }
+}

+ 19 - 9
app/Module/Task/Providers/TaskServiceProvider.php

@@ -13,6 +13,20 @@ use App\Module\Task\Listeners\TaskRewardClaimedListener;
  */
 class TaskServiceProvider extends ServiceProvider
 {
+    /**
+     * 应用程序的事件监听器映射
+     *
+     * @var array
+     */
+    protected $listen = [
+        TaskCompletedEvent::class => [
+            TaskCompletedListener::class,
+        ],
+        TaskRewardClaimedEvent::class => [
+            TaskRewardClaimedListener::class,
+        ],
+    ];
+
     /**
      * 注册服务
      *
@@ -31,14 +45,10 @@ class TaskServiceProvider extends ServiceProvider
     public function boot(): void
     {
         // 注册事件监听器
-        $this->app['events']->listen(
-            TaskCompletedEvent::class,
-            TaskCompletedListener::class
-        );
-        
-        $this->app['events']->listen(
-            TaskRewardClaimedEvent::class,
-            TaskRewardClaimedListener::class
-        );
+        foreach ($this->listen as $event => $listeners) {
+            foreach ($listeners as $listener) {
+                $this->app['events']->listen($event, $listener);
+            }
+        }
     }
 }

+ 3 - 0
config/app.php

@@ -196,6 +196,9 @@ return [
 
         // AppGame 模块
         \App\Module\AppGame\Providers\AppGameServiceProvider::class,
+
+        // Task 模块
+        \App\Module\Task\Providers\TaskServiceProvider::class,
     ],
 
     /*

+ 5 - 0
noai.md

@@ -61,3 +61,8 @@ AppGame模块,增加登陆成功事件
 
 创建AiWork文件夹,使用`年月/日-时分秒-工作主题.md`的格式储存工作的内容,每次工作后被用户确认,才可以记录
 `
+
+任务采用主动重置的方案 浪费资源。
+改为被动重置,在任务需要更新或被使用的时候进行重置
+在更新进度时,根据 task_user_progress 的 last_update_time 可得知 本次进度增加是否需要重置 ;
+在任务获取是,根据 task_user_tasks