package com.rj.mapper.sys;

import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rj.entity.sys.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * <p>
 * 说明：
 * - 登录认证/根据 token 查询用户时，需要跨租户查询用户信息，因此这些方法通过
 *   {@link InterceptorIgnore} 显式跳过多租户拦截器，不在 SQL 中追加 tenant_id 条件。
 * - 其他通过 MyBatis-Plus 内置 CRUD 产生的 SQL 仍然会自动带上 tenant_id 条件。
 * </p>
 *
 * @author  
 * @since 2025-08-07
 */
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据用户名查询用户（登录用），不走多租户拦截器。
     */
    @InterceptorIgnore(tenantLine = "true")
    @Select("SELECT * FROM user WHERE user_name = #{userName} LIMIT 1")
    User selectByUserNameIgnoreTenant(@Param("userName") String userName);

    @InterceptorIgnore(tenantLine = "true")
    @Select("SELECT * FROM user WHERE phone = #{phone} LIMIT 1")
    User selectByPhoneIgnoreTenant(@Param("phone") String phone);


    /**
     * 根据 token 查询用户（token 验证、获取当前用户信息），不走多租户拦截器。
     */
    @InterceptorIgnore(tenantLine = "true")
    @Select("SELECT * FROM user WHERE token = #{token} LIMIT 1")
    User selectByTokenIgnoreTenant(@Param("token") String token);

    /**
     * 根据用户ID更新用户信息（登录时更新token用），不走多租户拦截器。
     * 此方法用于登录场景，需要跨租户更新用户token，因此不添加 tenant_id 条件。
     */
    @InterceptorIgnore(tenantLine = "true")
    @Update("UPDATE user SET token = #{user.token} WHERE user_id = #{user.userId}")
    int updateByIdIgnoreTenant(@Param("user") User user);
}

