POINT_TYPE::class ]; /** * 获取用户积分账户 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @return PointModel|null 积分账户模型 */ public static function getAccount(int $userId, int $pointId): ?PointModel { return self::where('user_id', $userId) ->where('point_id', $pointId) ->first(); } /** * 获取用户所有积分账户 * * @param int $userId 用户ID * @return \Illuminate\Database\Eloquent\Collection 积分账户集合 */ public static function userAccount(int $userId) { return self::where('user_id', $userId)->get(); } /** * 创建或获取用户积分账户 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @return PointModel 积分账户模型 */ public static function createOrGet(int $userId, int $pointId): PointModel { $account = self::getAccount($userId, $pointId); if (!$account) { $account = new self(); $account->user_id = $userId; $account->point_id = $pointId; $account->balance = 0; $account->create_time = time(); $account->update_time = time(); $account->save(); } return $account; } /** * 增加积分 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @param int $amount 积分数量(正整数) * @return bool 是否成功 */ public static function inc(int $userId, int $pointId, int $amount): bool { if ($amount <= 0) { return false; } $account = self::createOrGet($userId, $pointId); $account->balance += $amount; $account->update_time = time(); return $account->save(); } /** * 减少积分 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @param int $amount 积分数量(正整数) * @return bool|string 成功返回true,失败返回错误信息 */ public static function dec(int $userId, int $pointId, int $amount) { if ($amount <= 0) { return '积分数量必须大于0'; } $account = self::getAccount($userId, $pointId); if (!$account) { return '积分账户不存在'; } if ($account->balance < $amount) { return '积分余额不足'; } $account->balance -= $amount; $account->update_time = time(); return $account->save(); } /** * 获取用户积分余额 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @return int 积分余额 */ public static function getBalance(int $userId, int $pointId): int { $account = self::getAccount($userId, $pointId); return $account ? $account->balance : 0; } /** * 检查积分余额是否足够 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @param int $amount 需要的积分数量 * @return bool 是否足够 */ public static function checkBalance(int $userId, int $pointId, int $amount): bool { $balance = self::getBalance($userId, $pointId); return $balance >= $amount; } /** * 设置积分余额 * * @param int $userId 用户ID * @param int $pointId 积分类型ID * @param int $balance 新的积分余额 * @return bool 是否成功 */ public static function setBalance(int $userId, int $pointId, int $balance): bool { if ($balance < 0) { return false; } $account = self::createOrGet($userId, $pointId); $account->balance = $balance; $account->update_time = time(); return $account->save(); } /** * 获取积分类型名称 * * @return string 积分类型名称 */ public function getPointTypeName(): string { return $this->point_id->getTypeName(); } }