|
|
@@ -0,0 +1,418 @@
|
|
|
+# 任务模块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; // 消耗时间
|
|
|
+}
|
|
|
+```
|
|
|
+
|