package cn.iocoder.yudao.module.system.dal.mysql.robot;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteExceptionTaskDetailDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteExceptionTaskListDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteTaskDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteTaskQueryDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotDoingTaskDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.statistics.dto.RobotTaskManualInterventionDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * 机器人任务明细 Mapper
 *
 * @author 陈宾顺
 */
@Mapper
public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {

    default PageResult<RobotTaskDetailDO> selectPage(RobotTaskDetailPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<RobotTaskDetailDO>()
                .eqIfPresent(RobotTaskDetailDO::getRobotTaskId, reqVO.getRobotTaskId())
                .eqIfPresent(RobotTaskDetailDO::getTaskType, reqVO.getTaskType())
                .eqIfPresent(RobotTaskDetailDO::getReleaseType, reqVO.getReleaseType())
                .eqIfPresent(RobotTaskDetailDO::getTakeType, reqVO.getTakeType())
                .eqIfPresent(RobotTaskDetailDO::getReleaseId, reqVO.getReleaseId())
                .eqIfPresent(RobotTaskDetailDO::getTakeId, reqVO.getTakeId())
                .eqIfPresent(RobotTaskDetailDO::getFromLocationId, reqVO.getFromLocationId())
                .eqIfPresent(RobotTaskDetailDO::getFromLocationNo, reqVO.getFromLocationNo())
                .eqIfPresent(RobotTaskDetailDO::getToLocationId, reqVO.getToLocationId())
                .eqIfPresent(RobotTaskDetailDO::getToLocationNo, reqVO.getToLocationNo())
                .eqIfPresent(RobotTaskDetailDO::getRobotNo, reqVO.getRobotNo())
                .eqIfPresent(RobotTaskDetailDO::getTaskStatus, reqVO.getTaskStatus())
                .eqIfPresent(RobotTaskDetailDO::getTaskStage, reqVO.getTaskStage())
                .betweenIfPresent(RobotTaskDetailDO::getStartTime, reqVO.getStartTime())
                .betweenIfPresent(RobotTaskDetailDO::getEndTime, reqVO.getEndTime())
                .betweenIfPresent(RobotTaskDetailDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(RobotTaskDetailDO::getId));
    }

    /**
     * 查询未完成的库位任务
     * @param stockLocationIds
     * @return
     */
    List<RobotTaskDetailDO> queryDoingTaskByIds(@Param("locationIds")  Set<Long> locationIds);

    /**
     * 查询未执行的明细任务---不拼接
     * @return
     */
    List<RobotTaskDetailDO> getSingleUnDoTask(@Param("taskIds")  List<Long> taskIds);

    /**
     * 查询未执行的明细任务---拼接
     * @param singleTaskIds
     * @return
     */
    List<RobotTaskDetailDO> getMontageUnDoTask(@Param("montageTaskIds") List<Long> montageTaskIds);

    /**
     * 查询未执行的明细任务 -- 拼接和不拼接
     * @param montageTaskIds
     * @param singleTaskIds
     * @return
     */
    List<RobotTaskDetailDO> getUnDoTaskDetail(@Param("montageTaskIds") List<Long> montageTaskIds,
                                              @Param("singleTaskIds") List<Long> singleTaskIds);


    List<RobotTaskDetailDO> queryByTaskId(@Param("robotTaskId") Long robotTaskId);

    /**
     * 更新
     * @param detailDO
     */
    void updateRobotDetailById(RobotTaskDetailDO detailDO);


    /**
     * 获取未进行的充电任务
     * @return
     */
    List<RobotTaskDetailDO> getChargeTaskDetail();

    /**
     * 取货中的map_item_id
     * @return
     */
    List<Long> selectTakeMapItemIds();

    /**
     * 放货中的map_item_id
     * @return
     */
    List<Long> selectReleaseMapItemIds();

    /**
     * 查询需要创建循环任务且已经完成的订单
     * @return
     */
    List<RobotTaskDetailDO> selectAutoCreateCycleTask();

    /**
     * 机器人最后做的任务
     * @return
     */
    List<RobotTaskDetailDO> getLastTaskGroupByRobotNo();

    /**
     * 设置状态为完成
     * @param ids
     */
    void updateDoneByIds(@Param("ids") List<Long> ids);

    /**
     * 查询此库位处理中的任务
     * @param ids
     * @return
     */
    List<RobotTaskDetailDO> getDoingTaskDetailByLocationIds(@Param("ids") List<Long> ids);

    /**
     * 查询任务明细对应的任务编号
     * @param taskDetailId
     * @return
     */
    String getTaskNoByDetailId(@Param("taskDetailId") Long taskDetailId);

    /**
     * 查询以下点位是否存在处理中的任务
     * @param itemIds
     * @return
     */
    List<Long> getDoIngTaskItemIdsByItemIds(@Param("itemIds") List<Long> itemIds);

    /**
     * 获取机器人正在做的任务
     * @return
     */
    List<RobotDoingTaskDTO> getRobotDoingTaskNo(@Param("robotNo") String robotNo);


    /**
     * 远遥查询异常任务列表
     * @param mpPage
     * @param pageReqVO
     * @return
     */
    IPage<RemoteExceptionTaskDetailDTO> getExceptionTaskDetail(@Param("mpPage") IPage mpPage,
                                                               @Param("pageReqVO") RemoteTaskQueryDTO pageReqVO);

    /**
     * 统计任务人工完成/自动完成
     * @param type
     * @return
     */
    RobotTaskManualInterventionDTO getRobotTaskAutomaticArtificial(@Param("type") String type);

    /**
     * 清除所有数据
     */
    void truncate();

    List<RobotTaskDetailDO> selectAutoCreateCycleTaskForever();

    void setTaskUnDo(@Param("ids") List<Long> ids);
}