'boolean', 'frozen_log_id' => 'integer', ]; /** * 获取关联的用户 * * @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(\App\Module\User\Models\User::class, 'user_id'); } /** * 获取关联的物品 * * @return BelongsTo */ public function item(): BelongsTo { return $this->belongsTo(Item::class, 'item_id'); } /** * 获取关联的物品实例(如果有) * * @return BelongsTo */ public function instance(): BelongsTo { return $this->belongsTo(ItemInstance::class, 'instance_id'); } /** * 获取关联的冻结日志 * * @return BelongsTo */ public function freezeLog(): BelongsTo { return $this->belongsTo(ItemFreezeLog::class, 'frozen_log_id'); } /** * 检查是否为单独属性物品 * * @return bool */ public function isUniqueItem(): bool { return !empty($this->instance_id); } /** * 检查是否为冻结状态 * * @return bool */ public function isFrozen(): bool { return $this->is_frozen; } /** * 检查是否可用(未冻结) * * @return bool */ public function isAvailable(): bool { return !$this->is_frozen; } /** * 获取用户指定物品的可用数量(排除冻结的堆叠) * * @param int $userId 用户ID * @param int $itemId 物品ID * @param int|null $instanceId 实例ID * @return int 可用数量 */ public static function getAvailableQuantity(int $userId, int $itemId, ?int $instanceId = null): int { $query = static::where('user_id', $userId) ->where('item_id', $itemId) ->where('is_frozen', false); if ($instanceId) { $query->where('instance_id', $instanceId); } else { $query->whereNull('instance_id'); } return $query->sum('quantity'); } /** * 获取用户指定物品的冻结数量 * * @param int $userId 用户ID * @param int $itemId 物品ID * @param int|null $instanceId 实例ID * @return int 冻结数量 */ public static function getFrozenQuantity(int $userId, int $itemId, ?int $instanceId = null): int { $query = static::where('user_id', $userId) ->where('item_id', $itemId) ->where('is_frozen', true); if ($instanceId) { $query->where('instance_id', $instanceId); } else { $query->whereNull('instance_id'); } return $query->sum('quantity'); } /** * 获取用户指定物品的总数量(包括冻结的) * * @param int $userId 用户ID * @param int $itemId 物品ID * @param int|null $instanceId 实例ID * @return int 总数量 */ public static function getTotalQuantity(int $userId, int $itemId, ?int $instanceId = null): int { $query = static::where('user_id', $userId) ->where('item_id', $itemId); if ($instanceId) { $query->where('instance_id', $instanceId); } else { $query->whereNull('instance_id'); } return $query->sum('quantity'); } }