itemLogic = new ItemLogic(); } /** * 获取用户物品列表 * * @param int $userId 用户ID * @param array $filters 过滤条件 * @param bool $includeExpired 是否包含已过期物品 * @return Collection|ItemUser[] */ public function getUserItems(int $userId, array $filters = [], bool $includeExpired = false): Collection { $query = ItemUser::where('user_id', $userId) ->with(['item', 'instance']); // 应用过滤条件 if (isset($filters['item_id'])) { $query->where('item_id', $filters['item_id']); } if (isset($filters['category_id'])) { $query->whereHas('item', function ($q) use ($filters) { $q->where('category_id', $filters['category_id']); }); } if (isset($filters['type'])) { $query->whereHas('item', function ($q) use ($filters) { $q->where('type', $filters['type']); }); } // 排除过期物品 if (!$includeExpired) { $now = now(); $query->where(function ($q) use ($now) { $q->whereNull('expire_at') ->orWhere('expire_at', '>', $now); })->whereHas('item', function ($q) use ($now) { $q->where(function ($subQ) use ($now) { $subQ->whereNull('global_expire_at') ->orWhere('global_expire_at', '>', $now); }); }); } return $query->get(); } /** * 添加物品到用户背包 * * @param int $userId 用户ID * @param int $itemId 物品ID * @param int $quantity 数量 * @param array $options 选项 * @return array 添加结果 * @throws Exception */ public function addItem(int $userId, int $itemId, int $quantity, array $options = []): array { // 获取物品信息 $item = Item::findOrFail($itemId); // 检查物品是否已过期(全局过期) if ($this->itemLogic->isExpired($item)) { throw new Exception("物品 {$itemId} 已全局过期"); } // 处理单独属性物品 if ($item->is_unique) { return $this->itemLogic->addUniqueItem($userId, $itemId, $options); } // 处理统一属性物品 return $this->itemLogic->addNormalItem($userId, $itemId, $quantity, $options); } /** * 消耗用户物品 * * @param int $userId 用户ID * @param int $itemId 物品ID * @param int|null $instanceId 物品实例ID(单独属性物品) * @param int $quantity 数量 * @param array $options 选项 * @return array 消耗结果 * @throws Exception */ public function consumeItem(int $userId, int $itemId, ?int $instanceId, int $quantity, array $options = []): array { // 获取物品信息 $item = Item::findOrFail($itemId); if ($instanceId) { // 消耗单独属性物品 return $this->itemLogic->consumeUniqueItem($userId, $itemId, $instanceId, $options); } else { // 消耗统一属性物品 return $this->itemLogic->consumeNormalItem($userId, $itemId, $quantity, $options); } } }