package com.hotent.uc.dao;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.hotent.uc.model.Org;
import com.hotent.uc.model.User;
import com.hotent.uc.vo.OrgTreeVo;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 
 * <pre> 
 * 描述：组织架构 DAO接口
 * 构建组：eip平台-bpmx-platform
 * 作者:ray
 * 邮箱:zhangyg@jee-soft.cn
 * 日期:2016-06-28 15:13:03
 * 版权：广州宏天软件有限公司
 * </pre>
 */
public interface OrgDao extends BaseMapper<Org>{
	

	/**
	 *删除所有已逻辑删除的实体（物理删除）
	 * @param entityId 实体对象ID
	 */
	Integer removePhysical();
	
 
	/**
	 * 根据Code取定义对象。
	 * @param code
	 * @return
	 */
	Org getByCode(@Param("code") String code);
	
	/**
	 * 通过用户ID获取组织ID、是否主组织Map
	 * @param userId
	 * @return
	 */
	List<Map<String, Object>> getOrgIdMapByUserId(@Param("userId") String userId);
	
	/**
	 * 通过父组织ID集合查询所有子组织ID
	 * @param parentIds
	 * @return
	 */
	List<String> getSubOrgByIds(@Param("parentIds")Set<String> parentIds);

	/**
	 * 根据用户ID获取组织列表
	 * @param userId
	 * @return
	 */
	List<Org> getOrgListByUserId(@Param("userId") String userId);
	
	/**
	 * 获取用户主组织
	 * @param userId
	 * @param demId
	 * @return
	 */
	List<Org> getMainOrgListByUser(@Param("userId") String userId,@Param("demId") String demId);

	/**
	 * 根据父组织id获取其下子组织（包含父组织）
	 * @param parentId
	 * @return
	 */
	List<Org> getByParentId(@Param("pid") String pid);

	/**
	 * 根据组织名称获取组织列表
	 * @param orgName
	 * @return
	 */
	List<Org> getByOrgName(@Param("orgName") String orgName);

	/**
	 * 根据路径名获取组织
	 * @param orgName
	 * @return
	 */
	List<Org> getByPathName(@Param("pathName") String pathName);

	/**
	 * 根据父级id以及维度id获取组织
	 * @param orgName
	 * @return
	 */
	List<Org> getByParentAndDem(@Param(Constants.WRAPPER)Wrapper<Org> wrapper);

	/**
	 * 根据父级id以及维度id获取组织
	 * @param orgName
	 * @return
	 */
	List<Org> getByParentAndDemTemp(@Param(Constants.WRAPPER)Wrapper<Org> wrapper);

	/**
	 * 根据子级查询父级
	 * @param demId
	 * @param sonId
	 * @return
	 */
	Org getByDemIdAndSonId(@Param("demId") String demId,@Param("sonId") String sonId);

	/**
     * 根据维度ID获取组织列表
     *
     * @param demId
     * @param dataScope
     * @param provinceCode
     * @param cityCode
     * @param countyCode
     * @return
     */
	List<Org> getOrgListByDemId(@Param("demId") String demId, @Param("dataScope")Integer dataScope, @Param("provinceCode") String provinceCode, @Param("cityCode") String cityCode,@Param("countyCode") String countyCode);
	
	/**
	 * 获取用户所属（主）组织
	 * @param map
	 * @return
	 */
	List<Org> getUserOrg(Map<String,Object> map);
	
	/**
	 * 关联维度获取组织
	 * @param queryFilter
	 * @return
	 */
	List<Org> getOrgInnerDem(Map<String,Object> params);
	
	/**
	 * 通过账号获取所属组织
	 * @param account
	 * @return
	 */
	List<Org> getOrgsByAccount(String account);
	
	/**
	 * 通过账号获取所属组织，
	 * @param account
	 * @return
	 */
	List<Org> justGetOrgsByAccount(String account);
	/**
	 * 通过用户组获取所属部门，
	 * @param userIds
	 * @return
	 */
	List<Map<String,String>> getPathNames(@Param("userIds")List<String> userIds);
	
	/**
	 * 根据父组织路径，获取所有子组织id（包含自己）
	 * @param pathMap
	 * @return
	 */
	List<String> getChildrenIds(@Param("pathMap") Map<String, String> pathMap);
	
	/**
	 * 根据用户id 查询主组织
	 * @param userId
	 * @return
	 */
	List<Org> getOrgMaster(@Param("account")String account);

	/**
	 * 根据角色Id集合获取角色列表
	 */
	List<Org> getByIds(@Param("ids") Collection<String> ids);

	List<Map<String, Object>> getOrgByIdsAndCurOrgId(@Param("ids") Collection<String> ids, @Param("orgPath")String orgPath);

	Org get(Serializable id);

	/**
	 * 根据code查询记录数
	 * @param code
	 * @return
	 */
	Integer getCountByCode(@Param("code") String code);

	/**
	 * 根据组织id获取组织列表数据
	 */
	List<Org> getOrgListByIds(@Param("list")List<String> list, @Param("demId") String demId);

	/**
	 * 通过判断同级组织是否 包含 相同名称
	 * @param orgId 组织id
	 * @param parentId 父组织id
	 * @param newName 组织新名称
	 * @param orgType 组织类型
	 */
	boolean queryExistsNameBySameLevel(@Param("orgId")String orgId, @Param("parentId")String parentId, @Param("newName")String newName, @Param("orgType")String orgType) throws Exception;

	/**
	 * 根据编码列表获取组织数据
	 * @param list
	 * @return
	 */
	List<Org> getOrgListByCodes(@Param("list")List<String> list);
	
	/**
	 * 根据路径名获取组织
	 * @param list
	 * @return
	 */
	List<Org> getPathNameList(@Param("list") List<String> list);
	
	/**
	 * 批量插入
	 * @param list
	 * @return
	 */
	boolean insertBatch(@Param("list")List<Org> list);

	/**
	 * 通过组织ID集合获取用户
	 * @param orgIds 组织ID集合
	 * @param isMain 是否主组织
	 * @return 用户列表
	 * */
    List<User> getUsersByOrgIds(@Param("orgIds")Collection<String> orgIds, @Param("isMain")boolean isMain);
    /**
     * @description  自定义查询org
     * @author  yangzibin
     * @date    2024/1/2 18:08
     * @param	wrapper
     * @return  java.util.List<com.hotent.uc.model.Org>
     */
	List<Org> selectOrgByWrapper(@Param(Constants.WRAPPER) QueryWrapper<Org> wrapper);

	/**
	 * 获得树形组织(扩展组织id)
	 * @param orgPath
	 * @param queryWrapper
	 */
	List<OrgTreeVo> getTreeAllOrgByExtOrgId(@Param("orgPath") String orgPath, @Param(Constants.WRAPPER) QueryWrapper<OrgTreeVo> queryWrapper);

	/**
	 * 获得树形已选中组织(扩展组织id)
	 * @param orgPath
	 * @param queryWrapper
	 */
	List<Map<String, Object>> getTreeCheckOrgByExtOrgId(@Param("tenantId") String tenantId,@Param("orgPath") String orgPath, @Param("appType") String appType, @Param("appId") String appId,
														@Param(Constants.WRAPPER) QueryWrapper<Org> queryWrapper);
}

