任务重置系统是任务模块的核心功能之一,负责根据预定义的规则和时间点重置特定类型的任务,使玩家可以重新完成这些任务并获取奖励。本文档详细描述了任务重置系统的设计、实现和使用方法。
任务模块支持以下几种重置类型:
每日重置的任务会在每天的特定时间点(通常是凌晨0点)自动重置。
特点:
每周重置的任务会在每周的特定时间点(通常是周一凌晨0点)自动重置。
特点:
每月重置的任务会在每月的特定时间点(通常是1日凌晨0点)自动重置。
特点:
不重置的任务只能完成一次,永远不会重置。
特点:
当任务重置时,以下内容会被重置:
任务重置需要满足以下条件:
任务重置的基本流程如下:
任务重置系统主要涉及以下数据库表:
任务重置系统通过以下命令行工具实现自动重置:
伪代码:
命令:task:reset-daily
功能:重置每日任务
执行流程:
1. 输出开始重置每日任务的提示信息
2. 调用任务重置服务的resetTasks方法,传入'daily'参数
3. 输出重置完成的提示信息,包括受影响的任务数量
4. 返回执行结果
伪代码:
命令:task:reset-weekly
功能:重置每周任务
执行流程:
1. 输出开始重置每周任务的提示信息
2. 调用任务重置服务的resetTasks方法,传入'weekly'参数
3. 输出重置完成的提示信息,包括受影响的任务数量
4. 返回执行结果
伪代码:
命令:task:reset-monthly
功能:重置每月任务
执行流程:
1. 输出开始重置每月任务的提示信息
2. 调用任务重置服务的resetTasks方法,传入'monthly'参数
3. 输出重置完成的提示信息,包括受影响的任务数量
4. 返回执行结果
任务重置系统的核心逻辑在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. 返回需要重置的任务类型列表
任务重置系统定义了TaskResetEvent事件,用于通知其他模块任务已重置:
伪代码:
事件:TaskResetEvent
属性:
- 重置类型:daily, weekly, monthly
- 重置时间:重置操作执行的时间
- 受影响的任务ID列表:被重置的任务ID数组
构造函数:
1. 接收重置类型、重置时间和受影响的任务ID列表
2. 初始化事件属性
任务重置系统通过Laravel的调度器(Scheduler)实现定时重置:
伪代码:
定时任务配置:
1. 每日重置任务:
- 命令:task:reset-daily
- 执行时间:每天凌晨00:00
2. 每周重置任务:
- 命令:task:reset-weekly
- 执行时间:每周一凌晨00:00
3. 每月重置任务:
- 命令:task:reset-monthly
- 执行时间:每月1日凌晨00:00
任务重置系统需要考虑时区问题,确保在正确的时间点重置任务。系统默认使用北京时间(UTC+8)作为重置时间的基准。
伪代码:
时区设置:
1. 在应用服务提供者中设置默认时区:
- 设置默认时区为Asia/Shanghai(北京时间)
2. 在重置逻辑中使用统一的时间获取方式:
- 使用now()函数获取当前时间,确保时区一致
任务重置系统会在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 | 创建时间 |
除了自动重置外,系统还支持手动重置任务,可以通过命令行工具或后台管理界面触发:
伪代码:
手动重置命令:
1. 重置每日任务:
命令:php artisan task:reset-daily
2. 重置每周任务:
命令:php artisan task:reset-weekly
3. 重置每月任务:
命令:php artisan task:reset-monthly
在后台管理界面中,管理员可以通过以下步骤手动重置任务:
可能的原因:
解决方案:
可能的原因:
解决方案:
可能的原因:
解决方案:
| 日期 | 版本 | 更新内容 |
|---|---|---|
| 2023-06-15 | 1.0 | 初始版本 |
| 2023-06-17 | 1.1 | 移除具体代码实现,改用伪代码描述 |