ItemRecipe.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace App\Module\GameItems\Models;
  3. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  4. use Illuminate\Database\Eloquent\Relations\HasMany;
  5. use UCore\ModelCore;
  6. /**
  7. * 物品合成配方
  8. *
  9. * field start
  10. * @property int $id 配方ID,主键
  11. * @property string $name 配方名称
  12. * @property string $code 配方编码(唯一)
  13. * @property string $description 配方描述
  14. * @property int $consume_group_id 消耗组ID
  15. * @property int $reward_group_id 奖励组ID
  16. * @property int $condition_group_id 条件组ID
  17. * @property int $category_id 配方分类ID
  18. * @property int $sort_order 排序权重
  19. * @property bool $is_active 是否激活(0:否, 1:是)
  20. * @property \Carbon\Carbon $created_at 创建时间
  21. * @property \Carbon\Carbon $updated_at 更新时间
  22. * field end
  23. */
  24. class ItemRecipe extends ModelCore
  25. {
  26. /**
  27. * 与模型关联的表名
  28. *
  29. * @var string
  30. */
  31. protected $table = 'item_recipes';
  32. // attrlist start
  33. protected $fillable = [
  34. 'id',
  35. 'name',
  36. 'code',
  37. 'description',
  38. 'consume_group_id',
  39. 'reward_group_id',
  40. 'condition_group_id',
  41. 'category_id',
  42. 'sort_order',
  43. 'is_active',
  44. ];
  45. // attrlist end
  46. /**
  47. * 应该被转换为原生类型的属性
  48. *
  49. * @var array
  50. */
  51. protected $casts = [
  52. 'consume_group_id' => 'integer',
  53. 'reward_group_id' => 'integer',
  54. 'condition_group_id' => 'integer',
  55. 'category_id' => 'integer',
  56. 'sort_order' => 'integer',
  57. 'is_active' => 'boolean',
  58. ];
  59. /**
  60. * 获取消耗组
  61. *
  62. * @return BelongsTo
  63. */
  64. public function consumeGroup(): BelongsTo
  65. {
  66. return $this->belongsTo(\App\Module\Game\Models\GameConsumeGroup::class, 'consume_group_id');
  67. }
  68. /**
  69. * 获取奖励组
  70. *
  71. * @return BelongsTo
  72. */
  73. public function rewardGroup(): BelongsTo
  74. {
  75. return $this->belongsTo(\App\Module\Game\Models\GameRewardGroup::class, 'reward_group_id');
  76. }
  77. /**
  78. * 获取条件组
  79. *
  80. * @return BelongsTo
  81. */
  82. public function conditionGroup(): BelongsTo
  83. {
  84. return $this->belongsTo(\App\Module\Game\Models\GameConditionGroup::class, 'condition_group_id');
  85. }
  86. /**
  87. * 获取用户配方解锁状态
  88. *
  89. * @return HasMany
  90. */
  91. public function userRecipes(): HasMany
  92. {
  93. return $this->hasMany(ItemUserRecipe::class, 'recipe_id');
  94. }
  95. /**
  96. * 获取合成记录
  97. *
  98. * @return HasMany
  99. */
  100. public function craftLogs(): HasMany
  101. {
  102. return $this->hasMany(ItemCraftLog::class, 'recipe_id');
  103. }
  104. /**
  105. * 检查用户是否已解锁该配方
  106. *
  107. * @param int $userId 用户ID
  108. * @return bool
  109. */
  110. public function isUnlockedByUser(int $userId): bool
  111. {
  112. $userRecipe = $this->userRecipes()
  113. ->where('user_id', $userId)
  114. ->first();
  115. return $userRecipe && $userRecipe->is_unlocked;
  116. }
  117. /**
  118. * 检查用户是否可以合成该配方
  119. *
  120. * @param int $userId 用户ID
  121. * @return array 检查结果,包含是否可合成和原因
  122. */
  123. public function canCraftByUser(int $userId): array
  124. {
  125. // 检查配方是否激活
  126. if (!$this->is_active) {
  127. return [
  128. 'can_craft' => false,
  129. 'reason' => '配方未激活',
  130. ];
  131. }
  132. // 检查条件组(如果设置了条件组)
  133. if ($this->condition_group_id && $this->conditionGroup) {
  134. $conditionService = app(\App\Module\Game\Services\ConditionService::class);
  135. $conditionResult = $conditionService->checkCondition($userId, $this->condition_group_id);
  136. if (!$conditionResult['success']) {
  137. return [
  138. 'can_craft' => false,
  139. 'reason' => '条件不满足: ' . $conditionResult['message'],
  140. ];
  141. }
  142. }
  143. // 检查消耗组是否满足
  144. if ($this->consume_group_id && $this->consumeGroup) {
  145. $consumeService = app(\App\Module\Game\Services\ConsumeService::class);
  146. $consumeResult = $consumeService->checkConsume($userId, $this->consume_group_id);
  147. if (!$consumeResult['success']) {
  148. return [
  149. 'can_craft' => false,
  150. 'reason' => '材料不足: ' . $consumeResult['message'],
  151. ];
  152. }
  153. }
  154. return [
  155. 'can_craft' => true,
  156. ];
  157. }
  158. }