package com.qmth.sop.business.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qmth.sop.business.bean.dto.FormWidgetDto;
import com.qmth.sop.business.bean.dto.OrgUserNameDto;
import com.qmth.sop.business.bean.dto.UserDto;
import com.qmth.sop.business.bean.dto.VerifyCodeCheckDto;
import com.qmth.sop.business.bean.result.SysUserBriefResult;
import com.qmth.sop.business.bean.result.SysUserResult;
import com.qmth.sop.business.bean.result.UserRoleNameResult;
import com.qmth.sop.business.bean.result.WorkTaskResult;
import com.qmth.sop.business.entity.SysUser;
import com.qmth.sop.common.enums.RoleTypeEnum;
import org.apache.ibatis.annotations.Param;

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

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @author wangliang
 * @since 2023-07-17
 */
public interface SysUserMapper extends BaseMapper<SysUser> {

    /**
     * 根据deploymentId查找processDefinitionId
     *
     * @param deploymentId
     * @return
     */
    String findProcessDefinitionIdByDeploymentId(@Param("deploymentId") String deploymentId);

    /**
     * 获取工作台待办
     *
     * @param iPage
     * @param userId
     * @param type
     * @param serviceId
     * @param customName
     * @param flowTaskTypeEnum
     * @param crmNo
     * @return
     */
    IPage<WorkTaskResult> getFlowTaskList(IPage<Map> iPage, @Param("userId") Long userId, @Param("type") String type, @Param("serviceId") Long serviceId, @Param("customName") String customName, @Param("flowTaskTypeEnum") String flowTaskTypeEnum, @Param("crmNo") String crmNo);

    /**
     * 获取工作台待办
     *
     * @param userId
     * @param type
     * @param serviceId
     * @param customName
     * @param flowTaskTypeEnum
     * @param crmNo
     * @return
     */
    int getFlowTaskListCount(@Param("userId") Long userId, @Param("type") String type, @Param("serviceId") Long serviceId, @Param("customName") String customName, @Param("flowTaskTypeEnum") String flowTaskTypeEnum, @Param("crmNo") String crmNo);

    /**
     * 根据机构id查询用户
     *
     * @param orgId
     * @return
     */
    List<SysUserResult> findSysUserResultList(@Param("orgId") Long orgId);

    /**
     * 根据用户（id和手机号）查询验证码发送几率
     *
     * @param userId       用户id
     * @param mobileNumber 用户手机号
     * @return 更新条数
     */
    int updateVerifyCodeExpiredTime(@Param("userId") Long userId, @Param("mobileNumber") String mobileNumber);

    /**
     * 根据用户（id和手机号）查询验证码发送几率
     *
     * @param userId       用户id
     * @param mobileNumber 用户手机号
     * @return 验证码记录结果
     */
    List<VerifyCodeCheckDto> findVerifyCodeByUser(@Param("userId") Long userId, @Param("mobileNumber") String mobileNumber);

    /**
     * 查询用户
     *
     * @param iPage
     * @param userInfo
     * @param orgId
     * @param roleId
     * @param enable
     * @return
     */
    IPage<UserDto> query(IPage<Map> iPage, @Param("userInfo") String userInfo, @Param("orgId") Long orgId, @Param("roleId") Long roleId, @Param("enable") Boolean enable);

    /**
     * 根据用户来源查找用户并返回动态表单数据
     *
     * @param userSourceEnum
     * @param roleIdList
     * @return
     */
    List<FormWidgetDto> queryUser(@Param("userSourceEnum") String userSourceEnum, @Param("roleIdList") List<Long> roleIdList);

    /**
     * 查找用户角色名
     *
     * @param userIds
     * @return
     */
    List<UserRoleNameResult> selectRoleNames(@Param("userIds") List<Long> userIds);

    /**
     * 根据角色类型查询用户
     *
     * @param roleType 角色类型
     * @return 类型
     */
    List<SysUserBriefResult> findByRoleType(@Param("roleType") RoleTypeEnum roleType);

    /**
     * 根据用户id查找用户名(机构)
     *
     * @param userIds
     * @return
     */
    List<OrgUserNameDto> findOrgUserName(@Param("userIds") List<Long> userIds);
}
