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

import javax.validation.*;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
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.RobotTaskDetailSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.statistics.dto.RobotTaskManualInterventionDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;

import java.util.List;

/**
 * 机器人任务明细 Service 接口
 *
 * @author 陈宾顺
 */
public interface RobotTaskDetailService {

    /**
     * 创建机器人任务明细
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTaskDetail(@Valid RobotTaskDetailSaveReqVO createReqVO);

    /**
     * 更新机器人任务明细
     *
     * @param updateReqVO 更新信息
     */
    void updateTaskDetail(@Valid RobotTaskDetailSaveReqVO updateReqVO);

    /**
     * 删除机器人任务明细
     *
     * @param id 编号
     */
    void deleteTaskDetail(Long id);

    /**
     * 获得机器人任务明细
     *
     * @param id 编号
     * @return 机器人任务明细
     */
    RobotTaskDetailDO getTaskDetail(Long id);

    /**
     * 获得机器人任务明细分页
     *
     * @param pageReqVO 分页查询
     * @return 机器人任务明细分页
     */
    PageResult<RobotTaskDetailDO> getTaskDetailPage(RobotTaskDetailPageReqVO pageReqVO);

    /**
     * 批量插入
     * @param taskDetailList
     */
    void insertRobotDetailList(List<RobotTaskDetailAddVO> taskDetailList);

    /**
     * 关闭任务
     * @param taskDetailId
     */
    RobotTaskDetailDO closeTaskDetail(Long taskDetailId);

    /**
     *
     * @param id
     * @return
     */
    void manuallyCompleted(Long id,String str, Integer type);

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

    /**
     * 获取任务编号
     * @param orderId
     * @return
     */
    String getTaskNoByDetailId(Long orderId);

    /**
     *
     * @param pointList
     * @return
     */
    List<Long> getDoIngTaskItemIdsByItemIds(List<Long> pointList);

    /**
     * 设置任务出现异常
     * @param orderId
     */
    void setTaskDetailError(Long orderId);

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


    /**
     * 远遥查询异常的车辆
     * @param remoteTaskQuery
     * @return
     */
    PageResult<RemoteExceptionTaskDetailDTO> getExceptionTaskDetail(RemoteTaskQueryDTO remoteTaskQuery);

    /**
     * 远遥点击取货完成
     * @param id
     */
    void remoteTaskTakeDone(Long id);

    /**
     * 统计任务人工完成/自动完成
     * @param type  type  1:周, 2:月,  3:季度
     * @return
     */
    RobotTaskManualInterventionDTO robotTaskAutomaticArtificial(String type);
}