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 ]); } }