TaskConditionGroupService.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace App\Module\Task\Services;
  3. use App\Module\Game\Services\ConditionGroupService;
  4. use App\Module\Game\Services\ConditionService;
  5. use App\Module\Task\Models\Task;
  6. use App\Module\Task\Models\TaskAchievementCondition;
  7. /**
  8. * 任务条件组服务
  9. *
  10. * 处理任务的条件组逻辑,包括前置条件组和达成条件组
  11. */
  12. class TaskConditionGroupService
  13. {
  14. /**
  15. * 获取任务的前置条件列表
  16. *
  17. * @param Task $task 任务模型
  18. * @return array 前置条件列表
  19. */
  20. public static function getPrerequisiteConditions(Task $task): array
  21. {
  22. if ($task->prerequisite_condition_group_id) {
  23. return ConditionGroupService::getConditionItems($task->prerequisite_condition_group_id);
  24. }
  25. return []; // 没有前置条件
  26. }
  27. /**
  28. * 获取任务的达成条件列表
  29. *
  30. * @param Task $task 任务模型
  31. * @return array 达成条件列表
  32. */
  33. public static function getAchievementConditions(Task $task): array
  34. {
  35. // 优先使用条件组
  36. if ($task->achievement_condition_group_id) {
  37. return ConditionGroupService::getConditionItems($task->achievement_condition_group_id);
  38. }
  39. // 回退到旧版条件
  40. return self::getLegacyAchievementConditions($task);
  41. }
  42. /**
  43. * 检查用户是否满足任务前置条件
  44. *
  45. * @param int $userId 用户ID
  46. * @param Task $task 任务模型
  47. * @return bool 是否满足前置条件
  48. */
  49. public static function checkPrerequisiteConditions(int $userId, Task $task): bool
  50. {
  51. if ($task->prerequisite_condition_group_id) {
  52. $result = ConditionService::checkCondition($userId, $task->prerequisite_condition_group_id);
  53. return $result['success'] ?? false;
  54. }
  55. return true; // 没有前置条件
  56. }
  57. /**
  58. * 检查用户是否满足任务达成条件
  59. *
  60. * @param int $userId 用户ID
  61. * @param Task $task 任务模型
  62. * @return bool 是否满足达成条件
  63. */
  64. public static function checkAchievementConditions(int $userId, Task $task): bool
  65. {
  66. if ($task->achievement_condition_group_id) {
  67. $result = ConditionService::checkCondition($userId, $task->achievement_condition_group_id);
  68. return $result['success'] ?? false;
  69. }
  70. // 回退到旧版条件检查
  71. $conditions = self::getLegacyAchievementConditions($task);
  72. if (empty($conditions)) {
  73. return true; // 没有达成条件
  74. }
  75. // TODO: 实现旧版条件检查逻辑
  76. return true;
  77. }
  78. /**
  79. * 获取任务达成条件的进度
  80. *
  81. * @param int $userId 用户ID
  82. * @param Task $task 任务模型
  83. * @return array 条件进度信息
  84. */
  85. public static function getAchievementProgress(int $userId, Task $task): array
  86. {
  87. if ($task->achievement_condition_group_id) {
  88. // TODO: 实现条件组进度获取逻辑
  89. return [];
  90. }
  91. // 回退到旧版条件进度
  92. $conditions = self::getLegacyAchievementConditions($task);
  93. if (empty($conditions)) {
  94. return [];
  95. }
  96. // TODO: 实现旧版条件进度获取逻辑
  97. return [];
  98. }
  99. /**
  100. * 获取旧版任务达成条件
  101. *
  102. * @param Task $task 任务模型
  103. * @return array 达成条件列表
  104. */
  105. private static function getLegacyAchievementConditions(Task $task): array
  106. {
  107. $taskConditions = TaskAchievementCondition::where('task_id', $task->id)->get();
  108. $conditions = [];
  109. foreach ($taskConditions as $condition) {
  110. $conditions[] = [
  111. 'condition_type' => $condition->condition_type,
  112. 'condition_param' => $condition->condition_param,
  113. 'target_value' => $condition->target_value,
  114. 'is_required' => $condition->is_required,
  115. 'sort_order' => $condition->sort_order,
  116. ];
  117. }
  118. return $conditions;
  119. }
  120. /**
  121. * 检查任务是否使用前置条件组
  122. *
  123. * @param Task $task 任务模型
  124. * @return bool 是否使用前置条件组
  125. */
  126. public static function isUsingPrerequisiteConditionGroup(Task $task): bool
  127. {
  128. return !empty($task->prerequisite_condition_group_id);
  129. }
  130. /**
  131. * 检查任务是否使用达成条件组
  132. *
  133. * @param Task $task 任务模型
  134. * @return bool 是否使用达成条件组
  135. */
  136. public static function isUsingAchievementConditionGroup(Task $task): bool
  137. {
  138. return !empty($task->achievement_condition_group_id);
  139. }
  140. /**
  141. * 获取任务前置条件的显示信息
  142. *
  143. * @param Task $task 任务模型
  144. * @return array 前置条件显示信息
  145. */
  146. public static function getPrerequisiteConditionsDisplay(Task $task): array
  147. {
  148. $conditions = self::getPrerequisiteConditions($task);
  149. $display = [];
  150. foreach ($conditions as $condition) {
  151. $display[] = [
  152. 'type' => $condition['condition_type'],
  153. 'param' => $condition['condition_param'],
  154. 'target' => $condition['target_value'],
  155. 'display_name' => self::getConditionDisplayName($condition),
  156. ];
  157. }
  158. return $display;
  159. }
  160. /**
  161. * 获取任务达成条件的显示信息
  162. *
  163. * @param Task $task 任务模型
  164. * @return array 达成条件显示信息
  165. */
  166. public static function getAchievementConditionsDisplay(Task $task): array
  167. {
  168. $conditions = self::getAchievementConditions($task);
  169. $display = [];
  170. foreach ($conditions as $condition) {
  171. $display[] = [
  172. 'type' => $condition['condition_type'],
  173. 'param' => $condition['condition_param'],
  174. 'target' => $condition['target_value'],
  175. 'display_name' => self::getConditionDisplayName($condition),
  176. ];
  177. }
  178. return $display;
  179. }
  180. /**
  181. * 获取条件的显示名称
  182. *
  183. * @param array $condition 条件数据
  184. * @return string 显示名称
  185. */
  186. private static function getConditionDisplayName(array $condition): string
  187. {
  188. // 这里可以根据条件类型返回不同的显示名称
  189. // 具体实现需要根据游戏的条件类型来定义
  190. return "条件类型{$condition['condition_type']} 目标值{$condition['target_value']}";
  191. }
  192. }