package org.nl.acs.task.service;

import com.alibaba.fastjson.JSONObject;
import org.nl.acs.instruction.domain.Instruction;
import org.nl.acs.common.base.PageInfo;
import org.nl.acs.common.base.CommonService;
import org.nl.acs.task.domain.Task;
import org.nl.acs.task.service.dto.TaskDto;
import org.nl.acs.task.service.dto.TaskQueryParam;
import org.springframework.data.domain.Pageable;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* @author jiaolm
* @date 2023-05-09
*/
public interface TaskService extends CommonService<Task>  {

    static final String CACHE_KEY = "task";

    /**
    * 查询数据分页
    * @param query 条件
    * @param pageable 分页参数
    * @return PageInfo<TaskDto>
    */
    PageInfo<TaskDto> queryAll(TaskQueryParam query, Pageable pageable);

    /**
    * 查询所有数据不分页
    * @param query 条件参数
    * @return List<TaskDto>
    */
    List<TaskDto> queryAll(TaskQueryParam query);

    Task getById(String id);
    TaskDto findById(String id);

    /**
     * 插入一条新数据。
     */
    int insert(TaskDto resources);
    int updateById(TaskDto resources);
    int removeById(String id);
    int removeByIds(Set<String> ids);

    /**
    * 导出数据
    * @param all 待导出的数据
    * @param response /
    * @throws IOException /
    */
    // void download(List<TaskDto> all, HttpServletResponse response) throws IOException;

    /**
     * 查询数据分页
     *
     * @param whereJson 条件
     * @param page      分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> queryAll(Map whereJson, Pageable page);

    /**
     * 在缓存中查询所有任务列表
     *
     * @param whereJson 条件
     * @param page      分页参数
     * @return
     */
    Map<String, Object> queryAllByCache(Map whereJson, Pageable page);

    /**
     * 数据同步
     */
    void reload();

    /**
     * 获取数据分页
     *
     * @param whereJson 条件
     * @param page      分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> getAll(Map whereJson, Pageable page);

    /**
     * 查询所有数据不分页
     *
     * @param whereJson 条件参数
     * @return List<TaskDto>
     */
    List<TaskDto> queryAll(String whereJson);


    /**
     * 查询所有数据不分页
     *
     * @param whereJson 条件参数
     * @return List<AcsTaskDto>
     */
    List<TaskDto> queryAll(Map whereJson);

    /**
     * 根据ID查询
     *
     * @param task_id ID
     * @return AcsTask
     */
//    TaskDto findById(String task_id);

    /**
     * 查询所有未完成任务
     *
     * @param whereJson 条件参数
     * @return List<AcsTaskDto>
     */
    List<TaskDto> queryAllUnfinished(Map whereJson);

    /**
     * 根据状态查询
     *
     * @param task_status task_status
     * @return AcsTask
     */
    List<TaskDto> queryByStauts(String task_status);

    /**
     * 根据编码查询
     *
     * @param code code
     * @return AcsTask
     */
    TaskDto findByCode(String code);

    /**
     * 根据设备号查询未执行的任务
     */
    List<TaskDto> queryTaskByDeviceCode(String device_code);

    /**
     * 根据设备号查询未执行的任务
     */
    List<TaskDto> queryTaskByStartDeviceCode(String start_device_code);
    List<TaskDto> queryTaskByBackDeviceCode(String back_start_device_code);

    /**
     * 根据设备号和任务状态查询
     * @param device_code
     * @return
     */
    List<TaskDto> queryTaskByDeviceCodeAndStatus(String device_code);

    /**
     * 根据前工位取货点查找执行中的任务
     * @param head_start_device_code
     * @return
     */
    List<TaskDto> queryTaskByStartAndIntStatus(String head_start_device_code);

    /**
     * 根据后工位取货点查找执行中的任务
     * @param head_next_device_code
     * @return
     */
    List<TaskDto> queryTaskByNextAndIntStatus(String head_next_device_code);


    /**
     * 根据关联编号查询非立刻下发的关联任务
     */
    TaskDto queryTaskByLinkNum(String link_num);

    /**
     * 创建
     *
     * @param dto /
     */
    void create(TaskDto dto) throws Exception;

    /**
     * 常规任务保存
     *
     * @param /
     */
    void ordinaryTaskCreate(JSONObject json) throws Exception;

    /**
     * 特殊任务保存
     *
     * @param /
     */
    void specialTaskCreate(JSONObject json) throws Exception;

    /**
     * 编辑
     *
     * @param dto /
     */
    void update(TaskDto dto);

    /**
     * 多选删除
     *
     * @param ids /
     */
    void deleteAll(String[] ids) throws Exception;

    /**
     * 完成任务
     *
     * @param ids
     */
    void finish(String ids);

    /**
     * 取消任务
     *
     * @param ids
     */
    void cancel(String ids) throws Exception;


    /**
     * 取消任务
     *
     * @param ids
     */
    void cancelNoSendWms(String ids) throws Exception;

    /**
     * 手动创建指令
     *
     * @param ids
     */
    Instruction createInst(String ids) throws Exception;

    Instruction createInst(Instruction inst) throws Exception;


    Instruction createTemporaryInst(TaskDto dto);

    /**
     * 导出数据
     *
     * @param dtos     待导出的数据
     * @param response /
     * @throws IOException /
     */
    void download(List<TaskDto> dtos, HttpServletResponse response) throws IOException;


    /**
     * 根据触摸屏点击保存创建任务
     *
     * @param json
     */
    void createTaskByClick(JSONObject json);


    int checkAllowCreate(String code);

    boolean removeByCodeFromCache(String code);

    TaskDto findByContainer(String container_code);

    TaskDto findByCodeFromCache(String task_code);


    /**
     * 根据目的地设备编号查询当前是否有设备
     *
     * @param device_code
     * @return
     */
    TaskDto findByNextCode(String device_code);

    List<TaskDto> findAllByNextCode(String device_code);

    Integer queryAllTaskMaterialQty(String device_code);

    /**
     * 根据起点设备编号查询当前是否有设备
     *
     * @param device_code
     * @return
     */
    TaskDto findByStartCode(String device_code);


    /**
     * 根据起点设备编号查询当前是否有就绪任务
     *
     * @param device_code
     * @return
     */
    TaskDto findByStartCodeAndReady(String device_code);


    /**
     * 查询内存任务
     *
     * @return
     */
    List<TaskDto> findAllTaskFromCache();

    TaskDto foramte(TaskDto task);

    /**
     * 修改内存中任务
     *
     * @param dto
     */
    void updateByCodeFromCache(TaskDto dto);

    /**
     * 平均分配查询设备
     *
     * @param device_code
     * @param task_nextdevice_code
     * @return
     */
    String queryAssignedByDevice(String device_code, String task_nextdevice_code);

    /**
     * 查询相同任务类型的数量
     *
     * @param taskType
     * @return
     */
    Integer querySameTaskByType(String taskType);

    /**
     * 查询相同起点任务的数量
     *
     * @param code
     * @return
     */
    Integer querySameOriginTask(String code);

    /**
     * 查询相同终点任务的数量
     *
     * @param code
     * @return
     */
    Integer querySameDestinationTask(String code);


    /**
     * 查询相同起终任务的数量
     *
     * @param
     * @return
     */
    Integer querySameDeviceReadyTask(String start_device,String next_device,String status);
}
