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

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConfigDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
import com.baomidou.mybatisplus.extension.service.IService;

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

/**
 * 仓库点位地图子表 Service 接口
 *
 * @author 芋道源码
 */
public interface PositionMapItemService extends IService<PositionMapItemDO> {

    /**
     * 创建仓库点位地图子表
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPositionMapItem(@Valid PositionMapItemSaveReqVO createReqVO);

    /**
     * 更新仓库点位地图子表
     *
     * @param updateReqVO 更新信息
     */
    void updatePositionMapItem(@Valid PositionMapItemSaveReqVO updateReqVO);

    /**
     * 删除仓库点位地图子表
     *
     * @param id 编号
     */
    void deletePositionMapItem(Long id);

    /**
     * 获得仓库点位地图子表
     *
     * @param id 编号
     * @return 仓库点位地图子表
     */
    PositionMapItemDO getPositionMapItem(Long id);

    /**
     * 获得仓库点位地图子表分页
     *
     * @param pageReqVO 分页查询
     * @return 仓库点位地图子表分页
     */
    PageResult<PositionMapItemDO> getPositionMapItemPage(PositionMapItemPageReqVO pageReqVO);

    /**
     * 获取到对应地图的所有点位信息
     *
     * @param positionMapId
     * @return
     */
    List<PositionMapItemDO> getByMapId(Long positionMapId);

    /**
     * 批量新增编辑操作删除操作
     *
     * @param list
     */
    void batchSaveOrEditOrDel(Long positionMapId, List<List<PositionMapItemDO>> list);

    /**
     * 根据条件搜索地图点位信息
     *
     * @param positionMapConditionDTO
     * @return
     */
    List<PositionMapItemDO> getByCondition(PositionMapConditionDTO positionMapConditionDTO);

    /**
     * 清空areaId
     *
     * @param mapId
     * @param areaId
     */
    void emptyAreaId(Long mapId, Long areaId);

    /**
     * 清空laneId
     *
     * @param mapId
     * @param laneId
     */
    void emptyLaneId(Long mapId, Long laneId);

    /**
     * 通过mac地址获取AGV点位信息
     *
     * @param macAddress
     * @return
     */
    Object getAGVPointInformation(String macAddress);

    void setMapItemIdle(Long id);

    /**
     * 查询地图对应的类型数据
     * @param id 地图id
     * @param type 类型
     * @return
     */
    List<PositionMapItemDO> getPositionMapItemByMapAndType(Long id, Integer type);

    /**
     * 批量查询
     * @param ids
     * @return
     */
    List<PositionMapItemDO> getPositionMapItemByIds(List<Long> ids);

    /**
     * 获取随机数id
     * @return
     */
    Long getUUid();

    /**
     * 根据排序查询 区域变更点
     * @param sortNum
     * @return
     */
    List<PositionMapItemSaveReqVO> getItemBySortNum(Long sortNum);

    /**
     * 根据ID获取排序的MAP
     * @param itemIds
     * @return
     */
    Map<Long, Long> getSortNumMapByIds(List<Long> itemIds);

    /**
     * 删除这个地图的点
     * @param mapId
     */
    void deleteByMapId(Long mapId);

    /**
     * 校验此地图的交换点，有没有被其他地图绑定
     * @param mapId
     */
    void checkHaveBindChangePoint(Long mapId);

    PositionMapConfigDTO getCheckDistance();

    /**
     * 设置点位使用中
     * @param releaseId
     * @param robotNo
     */
    void setMapItemUse(Long releaseId, String robotNo);
}
