/*
 *  Copyright 2019-2020 Zheng Jie
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.youchain.businessdata.service;

import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock;
import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.service.dto.TaskDto;
import com.youchain.businessdata.service.dto.TaskQueryCriteria;
import org.springframework.data.domain.Pageable;

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

/**
 * @author houjianlan
 * @website https://eladmin.vip
 * @description 服务接口
 * @date 2023-08-16
 **/
public interface TaskService {

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

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

    /**
     * 根据ID查询
     *
     * @param id ID
     * @return TaskDto
     */
    Task findById(Long id);

    /**
     * 创建
     *
     * @param resources /
     * @return TaskDto
     */
    TaskDto create(Task resources);

    /**
     * 编辑
     *
     * @param resources /
     */
    void update(Task resources);

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

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

    /**
     * 创建Task任务
     *
     * @param item       物料
     * @param quantity   物料数量
     * @param itemKey    物料key
     * @param asnDetail  ASN明细
     * @param taskType   任务类型
     * @param pickDetail 拣货明细
     * @param invId      库存序号
     * @param stock      容器
     * @param srcPoint   起点
     * @param dstPoint   终点
     * @param agvTask    AGV任务
     */
    Task createTask(Item item, Double quantity, ItemKey itemKey, AsnDetail asnDetail, String taskType, PickDetail pickDetail, Long invId, Stock stock, Point srcPoint, Point dstPoint, AgvTask agvTask);


    /**
     * 根据agv任务ID查询Task任务列表
     *
     * @param agvTaskId agvId
     */
    List<Task> findTaskByAgvTask(Long agvTaskId);

    /**
     * 根据叫料agv任务ID查询Task任务列表
     *
     * @param callAgvTaskId agvId
     */
    List<Task> findTaskByCallAgvTask(Long callAgvTaskId);

    /**
     * 根据出库单查询未完成的Task集合
     */
    List<Task> findByPickNotAllTask();

    /**
     * 根据出库单查询已完成的Task集合
     *
     * @param pickId 出库单Id
     */
    List<Task> findByPickAllTask(Long pickId);


    /**
     * 根据出库单明细查询未完成的Task集合
     *
     * @param pickDetailId 明细ID
     */
    List<Task> findByPickDetailNotAllTask(Long pickDetailId);

    /**
     * 根据出库单明细查询已完成的Task集合
     *
     * @param pickDetailId 明细ID
     */
    List<Task> findByPickDetailAllTask(Long pickDetailId);

    /**
     * 查询任务集合
     *
     * @param taskType     任务类型
     * @param taskStatus   任务状态
     * @param srcStockCode 原容器号
     */
    List<Task> findTaskByContains(String taskType, String taskStatus, String srcStockCode);


    /**
     * 定时任务轮询出库单分配
     *
     * @param pick 出库单
     */
    void allocatePick(Pick pick);

    /**
     * 定时任务轮询出库单备料
     */
    void materialPick();

    /**
     * 定时任务轮询叫料反空车至备料缓存区
     */
    void callEmptyStock(Point point);

    /**
     * 定时任务轮询出库单叫料
     *
     * @param pick 出库单
     */
    void callJlTask(Pick pick);


    /**
     * 分配任务
     *
     * @param pickDetailId 出库明细ID
     * @param quantity     数量
     */
    String allocate(long pickDetailId, double quantity);

    /**
     * 取消分配
     *
     * @param pickDetailId 出库明细ID
     * @param quantity     数量
     */
    void cancelAllocate(long pickDetailId, double quantity);

    /**
     * 拣货
     *
     * @param taskId 任务ID
     */
    void pickConfirm(Long taskId, double pickedQuantity);

    /**
     * 退货
     *
     * @param taskId 任务ID
     */
    void pickBarBack(long taskId, double pickedQuantity) throws Exception;


    /**
     * 重新分配任务
     *
     * @param task        任务
     * @param orderNumber 箱号
     */
    Task reassignTask(Task task, String orderNumber);

    /**
     * 移库
     *
     * @param task     任务
     * @param dstStock 容器
     * @param moveQty  移位数量
     */
    void moveInventory(Task task, Stock dstStock, double moveQty);

    /**
     * 查询容器是否有出库任务
     *
     * @param stockCode 容器
     * @param pickCode  出库单号
     */
    int existsByStock(String pickCode, String stockCode);
}
