package com.wms_main.service.controller;

import com.wms_main.model.bo.wcs.WcsStackerTask;
import com.wms_main.model.dto.request.ewm.EwmOutTaskRequest;
import com.wms_main.model.dto.request.ewm.SendEwmGetStockInformationRequest;
import com.wms_main.model.dto.request.ewm.SendEwmVehicleForInRequest;
import com.wms_main.model.dto.request.ewm.SendWarehouseInCompletedRequest;
import com.wms_main.model.dto.request.wcs.WcsBoxArriveRequest;
import com.wms_main.model.dto.request.wcs.WcsTaskResultRequest;
import com.wms_main.model.dto.request.wcs.WcsVehicleInRequest;
import com.wms_main.model.dto.request.wms.*;
import com.wms_main.model.dto.response.ewm.EwmApiBackResponse;
import com.wms_main.model.dto.response.ewm.EwmApiLocalResponse;
import com.wms_main.model.dto.response.wcs.BaseWcsApiResponse;
import com.wms_main.model.dto.response.wcs.WcsApiResponse;
import com.wms_main.model.dto.response.wms.BaseWmsApiResponse;
import com.wms_main.model.dto.response.wms.WmsApiResponse;
import com.wms_main.model.po.TAppStockCompare;
import com.wms_main.model.vo.wms.InventoryConfirmVo;
import com.wms_main.model.vo.wms.TaskConfirmVo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 任务控制类 服务接口
 */
public interface ITaskControllerService {
    /**
     * 入库请求
     * @param stockInRequest 请求信息
     * @return 处理结果
     */
    BaseWmsApiResponse requireStockIn(StockInRequest stockInRequest);

    /**
     * 出库请求
     * @param stockOutRequest 请求信息
     * @return 处理结果
     */
    BaseWmsApiResponse requireStockOut(StockOutRequest stockOutRequest);

    /**
     * 入库用出库请求
     * @param voiRequest 请求信息
     * @return 处理结果
     */
    BaseWmsApiResponse requireVehiclesForIn(VehicleOutForInRequest voiRequest);

    /**
     * 接收wcs反馈任务状态
     * @param wcsTaskResultRequest 请求信息
     * @return 处理结果
     */
    BaseWcsApiResponse sendTaskResult(WcsTaskResultRequest wcsTaskResultRequest);


    EwmApiLocalResponse ewmInformationBack(WcsVehicleInRequest wcsVehicleInRequest);

    /**
     * wcs请求载具入库
     * @param wcsVehicleInRequest 载具请求
     * @return 处理结果
     */
    WcsApiResponse<WcsStackerTask> wcsRequestVehicleIn(WcsVehicleInRequest wcsVehicleInRequest);



    /**
     * Wcs上报载具到达站台
     * @param boxArriveRequest 请求信息
     * @return 处理结果
     */
    BaseWcsApiResponse boxArrive(WcsBoxArriveRequest boxArriveRequest);

    /**
     * 取消拣选任务
     * @param pickTaskRequest 请求信息
     * @return 处理结果
     */
    BaseWmsApiResponse cancelPickTasks(PickTaskRequest pickTaskRequest);

    /**
     * 获得当前站台任务
     * @param wmsRequest 请求信息
     * @return 处理结果
     */
    WmsApiResponse<List<TaskConfirmVo>> getCurrentTask(BaseWmsRequest wmsRequest);

    /**
     * 确认任务
     * @param confirmTaskRequest 请求信息
     * @return 处理结果
     */
    BaseWmsApiResponse confirmCurrentTask(ConfirmTaskRequest confirmTaskRequest);

    /**
     * 下发盘点请求
     * @param inventoryRequest 盘点请求
     * @return 请求结果
     */
    BaseWmsApiResponse requestInventory(InventoryRequest inventoryRequest);

    /**
     * 查询盘点任务确认信息
     * @param inventoryConfirmRequest 请求
     * @return 请求结果
     */
    WmsApiResponse<InventoryConfirmVo> getInventoryConfirm(InventoryConfirmRequest inventoryConfirmRequest);

    /**
     * 确认盘点信息
     * @param inventoryConfirmRequest 确认请求
     * @return 处理结果
     */
    BaseWmsApiResponse confirmInventory(InventoryConfirmRequest inventoryConfirmRequest);

    /**
     * 获取对应工单的缺料数量
     * 最小值为0，最大值为库存数量
     * @param goodsId 料号
     * @param workOrder 工单号
     * @return 缺料数量
     */
    int getLackQty(String goodsId, String workOrder);


    /**
     * EWM请求出库任务
     * @param ewmOutTaskRequest 请求信息
     * @return 处理结果
     */
    EwmApiBackResponse ewmRequestOutTask(EwmOutTaskRequest ewmOutTaskRequest);


    /**
     * EWM获取库存信息
     * @param request 获取库存信息请求
     * @return 处理结果
     */
    BaseWmsApiResponse getEwmStock(SendEwmGetStockInformationRequest request);

    /**
     * 获取库存比较数据
     * @return 处理结果
     */
    WmsApiResponse<List<TAppStockCompare>> getCompareData();


    /**
     * EWM取消入库任务
     * @param request 取消入库任务请求
     * @return 处理结果
     */
    EwmApiBackResponse cancelOrderInTasks(SendWarehouseInCompletedRequest request);

}
