package com.hdkj.lt.core.sys.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hdkj.lt.core.sys.model.dto.OrgInfoDto;
import com.hdkj.lt.core.sys.model.dto.StruTreeCacheDTO;
import com.hdkj.lt.core.sys.model.dto.UnitQueryDTO;
import com.hdkj.lt.core.sys.model.po.SysStru;
import com.hdkj.lt.core.sys.model.po.OrganizationBo;

import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Description:
 * @Author: wenhao
 * @Create: 2023/12/07 17:08
 * @Version: 1.0
 */
public interface ISysStruService extends IService<SysStru> {

    /**
     * 将组织机构信息全部放入缓存中
     */
    void putAllToCache();

    /**
     * 根据组织机构ID从缓存中获取组织机构信息，缓存中没有则查询数据库，再更新缓存中的组织机构信息
     *
     * @param struId 组织机构ID
     * @return 组织机构（SYS_STRU表）
     */
    SysStru getCacheById(@Nonnull Long struId);

    /**
     * 根据组织机构ID集合批量从缓存中获取组织机构信息，缓存中没有的部分则查询数据库，再更新缓存中的组织机构信息
     *
     * @param struIds 组织机构ID集合
     * @return 组织机构信息Map（key为组织机构ID，value为组织机构信息）
     */
    Map<Long, SysStru> getCacheMapByIds(Collection<Long> struIds);

    /**
     * 根据组织机构ID集合批量从缓存中获取组织机构信息，缓存中没有的部分则查询数据库，再更新缓存中的组织机构信息
     *
     * @param struIds 组织机构ID集合
     * @return 组织机构信息Set
     */
    Set<SysStru> getCacheSetByIds(Collection<Long> struIds);

    /**
     * 根据各种条件查询组织机构
     *
     * @param queryDTO
     * @return
     */
    List<OrgInfoDto> listByCondition(UnitQueryDTO queryDTO);

    /**
     * 根据机构组织机构详情
     *
     * @param parentId
     * @return
     */
    List<OrganizationBo> findOrganizationsByParentId(Long parentId);

    /**
     * 获取下级班组机构信息
     *
     * @param struId
     * @return
     */
    List<Long> getTeamChildrenStru(Long struId);

    /**
     * 根据最末级组织节点ID获取点击节点的单位ID
     */
    List<SysStru> getNodesByLastNodes(List<Long> unitIds);

    List<OrgInfoDto> getCityByPsrId(String psrId);

    List<OrgInfoDto> getCountyByPsrId(String psrId);

    /**
     * 根据struId查询组织树
     */
    StruTreeCacheDTO getStruTreeByCache(Long struId);

    /**
     * 刷新缓存的组织树
     */
    Map<Long, StruTreeCacheDTO> refreshStruTreeByCache();

    /**
     * 查询数据库中的组织树
     */
    Map<Long, StruTreeCacheDTO> getStruFullTree();
}
