| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- <?php
- namespace App\Module\Game\Logics\ConsumeProcessors;
- use App\Module\Game\Models\GameConsumeItem;
- use App\Module\GameItems\Services\ItemService;
- use UCore\Dto\Res;
- class ItemConsume
- {
- /**
- * 检查物品消耗
- *
- * @param int $userId 用户ID
- * @param GameConsumeItem $consumeItem 消耗项
- * @param float $multiplier 倍数,用于验证几倍消耗,默认为1
- * @return Res 检查结果
- */
- public static function checkItemConsume(int $userId, GameConsumeItem $consumeItem, float $multiplier = 1.0): Res
- {
- $itemId = $consumeItem->target_id;
- $quantity = ceil($consumeItem->quantity * $multiplier); // 使用倍数计算所需数量,向上取整
- // 获取用户物品
- $userItems = ItemService::getUserItems($userId, [ 'item_id' => $itemId ]);
- // 计算用户拥有的物品总数
- $totalQuantity = 0;
- foreach ($userItems as $userItem) {
- $totalQuantity += $userItem->quantity;
- }
- // 检查数量是否足够
- if ($totalQuantity < $quantity) {
- return Res::error("物品 $itemId 数量不足,需要 {$quantity},实际 {$totalQuantity}", [
- 'item_id' => $itemId,
- 'required' => $quantity,
- 'actual' => $totalQuantity
- ]);
- }
- return Res::success('物品数量足够', [
- 'item_id' => $itemId,
- 'required' => $quantity,
- 'actual' => $totalQuantity
- ]);
- }
- /**
- * 物品消耗执行
- *
- * @param int $userId
- * @param GameConsumeItem $consumeItem
- * @param string $source
- * @param int $sourceId
- * @param $multiplier
- * @return Res
- * @throws \Exception
- */
- public static function process(int $userId, GameConsumeItem $consumeItem, string $source, int $sourceId,$multiplier): Res
- {
- $itemId = $consumeItem->target_id;
- $quantity = ceil($consumeItem->quantity * $multiplier); // 使用倍数计算实际消耗数量,向上取整
- // 消耗物品
- $result = ItemService::consumeItem($userId, $itemId, null, $quantity, [
- 'source_type' => $source,
- 'source_id' => $sourceId,
- 'details' => [
- 'consume_item_id' => $consumeItem->id,
- 'consume_group_id' => $consumeItem->group_id,
- 'multiplier' => $multiplier // 记录倍数信息
- ]
- ]);
- if (!$result['success']) {
- return Res::error($result['message'] ?? '物品消耗失败', [
- 'item_id' => $itemId,
- 'quantity' => $quantity
- ]);
- }
- return Res::success('物品消耗成功', [
- 'item_id' => $itemId,
- 'quantity' => $quantity
- ]);
- }
- }
|