package cn.iocoder.yudao.module.pms.service.iotmaterialgroup;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialgroup.vo.IotMaterialGroupListReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialgroup.vo.IotMaterialGroupPageReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialgroup.vo.IotMaterialGroupSaveReqVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.IotProductClassifyDO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterialgroup.IotMaterialGroupDO;

import javax.validation.Valid;
import java.util.*;

/**
 * PMS 功能优化 物料组 Service 接口
 *
 * @author 芋道源码
 */
public interface IotMaterialGroupService {

    /**
     * 创建PMS 功能优化 物料组
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createIotMaterialGroup(@Valid IotMaterialGroupSaveReqVO createReqVO);

    /**
     * 更新PMS 功能优化 物料组
     *
     * @param updateReqVO 更新信息
     */
    void updateIotMaterialGroup(@Valid IotMaterialGroupSaveReqVO updateReqVO);

    /**
     * 删除PMS 功能优化 物料组
     *
     * @param id 编号
     */
    void deleteIotMaterialGroup(Long id);

    /**
     * 获得PMS 功能优化 物料组
     *
     * @param id 编号
     * @return PMS 功能优化 物料组
     */
    IotMaterialGroupDO getIotMaterialGroup(Long id);

    /**
     * 获得PMS 功能优化 物料组分页
     *
     * @param pageReqVO 分页查询
     * @return PMS 功能优化 物料组分页
     */
    PageResult<IotMaterialGroupDO> getIotMaterialGroupPage(IotMaterialGroupPageReqVO pageReqVO);

    /**
     * 筛选物料组列表
     *
     * @param reqVO 筛选条件请求 VO
     * @return 物料组列表
     */
    List<IotMaterialGroupDO> getMaterialGroupList(IotMaterialGroupListReqVO reqVO);


    /**
     * 获取物料组信息数组
     *
     * @param ids 筛选条件请求 VO
     * @return 物料组列表
     */
    List<IotMaterialGroupDO> getMaterialGroupList(Collection<Long> ids);

    /**
     * 获得指定编号的物料组 Map
     *
     * @param ids 物料组编号数组
     * @return 物料组 Map
     */
    default Map<Long, IotMaterialGroupDO> getMaterialGroupMap(List<Long> ids){
        List<IotMaterialGroupDO> list = getMaterialGroupList(ids);
        return CollectionUtils.convertMap(list, IotMaterialGroupDO::getId);
    };

    /**
     * 获得指定物料组分类的所有子物料组分类
     *
     * @param id 物料组分类编号
     * @return 子物料组分类列表
     */
    default Set<Long> getChildMaterialGroupList(Long id) {
        List<IotMaterialGroupDO> materialGroups = getChildMaterialGroups(Collections.singleton(id));
        return CollectionUtils.convertSet(materialGroups, IotMaterialGroupDO::getId);
    }

    /**
     * 获得指定物料组分类的所有子物料组分类
     *
     * @param ids 物料组分类编号数组
     * @return 子物料组分类列表
     */
    List<IotMaterialGroupDO> getChildMaterialGroups(Collection<Long> ids);
}