package cn.iocoder.yudao.module.system.service.saporg;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgSimpleReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.saporg.SapOrgDO;
import org.springframework.lang.Nullable;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * SAP中的组织主数据(工厂 成本中心) Service 接口
 *
 * @author ruiqi
 */
public interface SapOrgService {

    /**
     * 创建SAP中的组织主数据(工厂 成本中心)
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSapOrg(@Valid SapOrgSaveReqVO createReqVO);

    /**
     * 更新SAP中的组织主数据(工厂 成本中心)
     *
     * @param updateReqVO 更新信息
     */
    void updateSapOrg(@Valid SapOrgSaveReqVO updateReqVO);

    /**
     * 删除SAP中的组织主数据(工厂 成本中心)
     *
     * @param id 编号
     */
    void deleteSapOrg(Long id);

    /**
     * 获得SAP中的组织主数据(工厂 成本中心)
     *
     * @param id 编号
     * @return SAP中的组织主数据(工厂 成本中心)
     */
    SapOrgDO getSapOrg(Long id);

    /**
     * 获得SAP中的组织主数据(工厂 成本中心)分页
     *
     * @param pageReqVO 分页查询
     * @return SAP中的组织主数据(工厂 成本中心)分页
     */
    PageResult<SapOrgDO> getSapOrgPage(SapOrgPageReqVO pageReqVO);

    /**
     * 获得符合条件的 SAP工厂/成本中心/库存地点 列表
     *
     * @param ids （SAP工厂/成本中心/库存地点）id 编号数组。如果为空，不进行筛选
     * @param type 类型(1工厂 2成本中心 3库存地点)
     * @param statuses 状态数组。如果为空，不进行筛选
     * @return 部门列表
     */
    List<SapOrgDO> getSapOrgList(@Nullable Collection<Long> ids,
                             @Nullable Integer type,
                             @Nullable Collection<Integer> statuses);

    /**
     * 根据已经选择的SAP工厂 查询下属的成本中心/库存地点全列表
     *
     * @param reqVO （SAP工厂）id 编号数组。如果为空，不进行筛选
     * @return 部门列表
     */
    List<SapOrgDO> getSelectedList(@Nullable SapOrgSimpleReqVO reqVO);

    /**
     * 获得指定编号的SAP组织 Map
     *
     * @param ids SAP组织编号数组
     * @return SAP组织 Map
     */
    default Map<Long, SapOrgDO> getSapOrgMap(Collection<Long> ids) {
        List<SapOrgDO> list = getSapOrgList(ids);
        return CollectionUtils.convertMap(list, SapOrgDO::getId);
    }

    /**
     * 获得SAP组织信息数组
     *
     * @param ids SAP组织编号数组
     * @return SAP组织信息数组
     */
    List<SapOrgDO> getSapOrgList(Collection<Long> ids);

    /**
     * 根据部门过滤 SAP工厂/成本中心/库存地点全列表
     *
     * @param deptId 部门id
     * @param type 类型(1工厂 2成本中心 3库存地点)
     * @param statuses 状态数组。如果为空，不进行筛选
     * @return 部门列表
     */
    List<SapOrgDO> filteredSapOrgList(Long deptId, Integer type, Set<Integer> statuses);
}