ItemConsume.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Module\Game\Logics\ConsumeProcessors;
  3. use App\Module\Game\Models\GameConsumeItem;
  4. use App\Module\GameItems\Services\ItemService;
  5. use UCore\Dto\Res;
  6. class ItemConsume
  7. {
  8. /**
  9. * 检查物品消耗
  10. *
  11. * @param int $userId 用户ID
  12. * @param GameConsumeItem $consumeItem 消耗项
  13. * @param float $multiplier 倍数,用于验证几倍消耗,默认为1
  14. * @return Res 检查结果
  15. */
  16. public static function checkItemConsume(int $userId, GameConsumeItem $consumeItem, float $multiplier = 1.0): Res
  17. {
  18. $itemId = $consumeItem->target_id;
  19. $quantity = ceil($consumeItem->quantity * $multiplier); // 使用倍数计算所需数量,向上取整
  20. // 获取用户物品
  21. $userItems = ItemService::getUserItems($userId, [ 'item_id' => $itemId ]);
  22. // 计算用户拥有的物品总数
  23. $totalQuantity = 0;
  24. foreach ($userItems as $userItem) {
  25. $totalQuantity += $userItem->quantity;
  26. }
  27. // 检查数量是否足够
  28. if ($totalQuantity < $quantity) {
  29. return Res::error("物品 $itemId 数量不足,需要 {$quantity},实际 {$totalQuantity}", [
  30. 'item_id' => $itemId,
  31. 'required' => $quantity,
  32. 'actual' => $totalQuantity
  33. ]);
  34. }
  35. return Res::success('物品数量足够', [
  36. 'item_id' => $itemId,
  37. 'required' => $quantity,
  38. 'actual' => $totalQuantity
  39. ]);
  40. }
  41. /**
  42. * 物品消耗执行
  43. *
  44. * @param int $userId
  45. * @param GameConsumeItem $consumeItem
  46. * @param string $source
  47. * @param int $sourceId
  48. * @param $multiplier
  49. * @return Res
  50. * @throws \Exception
  51. */
  52. public static function process(int $userId, GameConsumeItem $consumeItem, string $source, int $sourceId,$multiplier): Res
  53. {
  54. $itemId = $consumeItem->target_id;
  55. $quantity = ceil($consumeItem->quantity * $multiplier); // 使用倍数计算实际消耗数量,向上取整
  56. // 消耗物品
  57. $result = ItemService::consumeItem($userId, $itemId, null, $quantity, [
  58. 'source_type' => $source,
  59. 'source_id' => $sourceId,
  60. 'details' => [
  61. 'consume_item_id' => $consumeItem->id,
  62. 'consume_group_id' => $consumeItem->group_id,
  63. 'multiplier' => $multiplier // 记录倍数信息
  64. ]
  65. ]);
  66. if (!$result['success']) {
  67. return Res::error($result['message'] ?? '物品消耗失败', [
  68. 'item_id' => $itemId,
  69. 'quantity' => $quantity
  70. ]);
  71. }
  72. return Res::success('物品消耗成功', [
  73. 'item_id' => $itemId,
  74. 'quantity' => $quantity
  75. ]);
  76. }
  77. }