package cn.com.ctop.common.module.mapper;

import cn.com.ctop.common.module.model.SysUserSysDepartModel;
import cn.com.ctop.common.module.vo.SysUserDepVo;
import cn.com.ctop.common.module.vo.SysUserVo;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.common.system.entity.SysUser;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @Author scott
 * @since 2018-12-20
 */
public interface SysUserMapper extends BaseMapper<SysUser> {
    List<SysUser> selectAllUser();

    List<SysUser> selectAllDesigner();

    /**
     * 通过用户账号查询用户信息
     *
     * @param username
     * @return
     */
    SysUser getUserByName(@Param("username") String username);

    SysUser getUserByRealName(@Param("realname") String realname);

    /**
     * 根据部门Id查询用户信息
     *
     * @param page
     * @param departId
     * @return
     */
    IPage<SysUser> getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username);

    /**
     * 根据用户Ids,查询用户所属部门名称信息
     *
     * @param userIds
     * @return
     */
    List<SysUserDepVo> getDepNamesByUserIds(@Param("userIds") List<String> userIds);

    /**
     * 根据部门Ids,查询部门下用户信息
     *
     * @param page
     * @param departIds
     * @return
     */
    IPage<SysUser> getUserByDepIds(Page page, @Param("departIds") List<String> departIds, @Param("username") String username);

    /**
     * 根据角色Id查询用户信息
     *
     * @param page
     * @param
     * @return
     */
    IPage<SysUser> getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username);

    /**
     * 根据用户名设置部门ID
     *
     * @param username
     * @param orgCode
     */
    void updateUserDepart(@Param("username") String username, @Param("orgCode") String orgCode);

    /**
     * 根据手机号查询用户信息
     *
     * @param phone
     * @return
     */
    SysUser getUserByPhone(@Param("phone") String phone);


    /**
     * 根据邮箱查询用户信息
     *
     * @param email
     * @return
     */
    SysUser getUserByEmail(@Param("email") String email);

    /**
     * 根据 orgCode 查询用户，包括子部门下的用户
     *
     * @param page       分页对象, xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @param orgCode
     * @param userParams 用户查询条件，可为空
     * @return
     */
    List<SysUserSysDepartModel> getUserByOrgCode(IPage page, @Param("orgCode") String orgCode, @Param("userParams") SysUser userParams);


    /**
     * 查询 getUserByOrgCode 的Total
     *
     * @param orgCode
     * @param userParams 用户查询条件，可为空
     * @return
     */
    Integer getUserByOrgCodeTotal(@Param("orgCode") String orgCode, @Param("userParams") SysUser userParams);

    /**
     * @Author scott
     * @Date 2019/12/13 16:10
     * @Description: 批量删除角色与用户关系
     */
    void deleteBathRoleUserRelation(@Param("roleIdArray") String[] roleIdArray);

    /**
     * @Author scott
     * @Date 2019/12/13 16:10
     * @Description: 批量删除角色与权限关系
     */
    void deleteBathRolePermissionRelation(@Param("roleIdArray") String[] roleIdArray);

    /**
     * 查询被逻辑删除的用户
     */
    List<SysUser> selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);

    /**
     * 还原被逻辑删除的用户
     */
    int revertLogicDeleted(@Param("userIds") String userIds, @Param("entity") SysUser entity);

    /**
     * 彻底删除被逻辑删除的用户
     */
    int deleteLogicDeleted(@Param("userIds") String userIds);

    /**
     * 更新空字符串为null【此写法有sql注入风险，禁止随便用】
     */
    int updateNullByEmptyString(@Param("fieldName") String fieldName);


    /**
     * 根据部门Ids,查询部门下用户信息
     *
     * @param departIds
     * @return
     */
    List<SysUser> queryByDepIds(@Param("departIds") List<String> departIds, @Param("username") String username);

    Map<String, Object> queryRoleCode(@Param("userId") String userId);

    List<SysUserVo> getAllUser(@Param("userName") String userName, @Param("status") String status);

    List<SysUserVo> getUserListByCompany(@Param("companyId") String companyId, @Param("userName") String userName);

    List<SysUserVo> getAllSale();

    List<SysUserVo> getAllSalesByCompanyId(@Param("companyId") String companyId);

    JSONObject selectUserByAccount(@Param("accountId") Long accountId);

    SysUser getDesignerTeamLeaderBy(@Param("orgCode") String orgCode);

    List<SysUser> queryPageList(SysUser user);

    List<JSONObject> getUserMapByMap(@Param("ids") Map<String, String> userIdMap);

    /**
     * @param userId               用户id
     * @param designTeamLeaderName 设计组长姓名
     * @return
     */
    Integer updUserDesignLeaderById(@Param("userId") String userId, @Param("designTeamLeaderName") String designTeamLeaderName);

    List<String> getUserIdsByLeaderId(@Param("leaderId") String leaderId);

    JSONObject getDepart(@Param("companyId") String companyId);


    List<JSONObject> getQuarterlyChangeRoleOperators(@Param("roleCode") List<String> roleCode, @Param("userId") String userId, @Param("startDate") String startDate, @Param("endDate") String endDate);

    List<JSONObject> getQuarterlyOnJobOperators(@Param("roleCode") List<String> roleCode, @Param("userId") String userId, @Param("status") int status, @Param("changeRoleUserIds") List<JSONObject> changeRoleUserIds);

    List<JSONObject> getQuarterlyOffJobOperators(@Param("roleCode") List<String> roleCode, @Param("userId") String userId, @Param("status") int status, @Param("startDate") String startDate, @Param("endDate") String endDate);

}
