package com.shkj.wms.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.shkj.common.core.domain.Result;
import com.shkj.wms.bo.*;
import com.shkj.wms.domain.BaseLocation;
import com.shkj.wms.domain.BusinOutInPlan;
import com.shkj.wms.vo.BusinDataTaskVo;
import com.shkj.wms.vo.BusinOutInPlanVo;
import com.shkj.wms.vo.BusinTaskManageVo;
import com.shkj.wms.vo.PlanOrderLocationVo;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

/**
 * 出入库计划Service接口
 *
 * @author lch
 * @date 2023-06-02
 */
public interface IBusinOutInPlanService extends IService<BusinOutInPlan> {

    /**
     * 查询列表
     *
     * @param bo
     * @return
     */
    List<BusinOutInPlanVo> queryList(BusinOutInPlanQueryBo bo);


    /**
     * 加入入库计划
     *
     * @param bo 薄
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> addInPlan(BusinInPlanAddBo bo);

    Result<Boolean> addInPlanByEmpty(List<BusinInPlanEmptyAddBo> bos);




    /**
     * 创建入库计划单
     *
     * @param bo
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> addInPlanTime(BusinInPlanTimeBo bo);

    /**
     * 确认了
     *
     * @param bos 薄
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> confirmOut(List<BusinOutPlanConfirmBo> bos);

    /**
     * 下发出库任务
     *
     * @param bo 薄
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> addOutPlan(BusinOutPlanAddBo bo);

    /**
     * 生成出库计划
     *
     * @param bo zjx
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> addOutPlanTime(BusinOutPlanAddBo bo);

    /**
     * 检查运行任务
     *
     * @param orderNo 订单
     * @return {@link Result}
     */
    Result checkIsRunTask(Long orderNo);

    /**
     * 取消
     *
     * @param id id
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> cancel(Long id);

    Result<Boolean> outCancel(Long id) ;

    /**
     * 通过托盘编码查询订单号
     *
     * @param containerCode 托盘代码
     * @param planType
     * @return {@code Result<String>}
     */
    Result<PlanOrderLocationVo> getOrderNoByContainerCode(String containerCode, String planType);

    /**
     * 实际添加库存
     *
     * @param bo 薄
     * @return {@code Result<Boolean>}
     */
    Result<Boolean> wcsActualAddStock(WcsAddStockCallbackBo bo);

    /**
     * 根据订单编号，获取入库或出库的库位信息
     *
     * @param orderNo 订单没有
     * @return {@link Result}<{@link BaseLocation}>
     */
    Result<BaseLocation> wcsGetLocationByOrderNo(String orderNo);

    /**
     * 更新入库计划由0变为1（等待变化执行中）
     *
     * @param orderNo    订单没有
     * @param planStatus
     * @return {@link Result}<{@link Boolean}>
     */
    Result<Boolean> updPlanStatus(Long orderNo, String planStatus);

    /**
     * 重新下发出库任务
     *
     * @param orderNo 订单没有
     * @return {@link Result}<{@link Boolean}>
     */
    Result<Boolean> repeatOutStock(Long orderNo) throws InterruptedException;

    /**
     * 状态更新计划
     *
     * @param orderNo 订单没有
     */
    void updatePlanStatusByAgain(String orderNo);

    /**
     * 根据订单编号，查询下计划类型
     *
     * @param orderNo 订单
     * @return {@code Result<BusinOutInPlan>}
     */
    Result<BusinOutInPlan> wcsGetPlanByOrderNo(String orderNo);

    /**
     * 根据任务编号更新异常信息
     *
     * @param bo 薄
     * @return {@link Result}<{@link Boolean}>
     */
    Result<Boolean> updErrMsg(UpdPlanErrorBo bo);

    /**
     * 呼叫空托盘
     *
     * @return {@link Result}<{@link Boolean}>
     */
    Result<Boolean> callEmptyContainer();

    /**
     * 根据模具类型及数量呼叫空托盘
     * @param bo
     * @return
     */
    Result<Boolean> callEmptyContainerByQty(BaseContainerCallBo bo);

    /**
     * 查询没有完成位置id
     *
     * @param locationId 位置标识
     * @return {@link List}<{@link BusinOutInPlan}>
     */
    List<BusinOutInPlan> queryNoFinishByLocationId(Long locationId);

    /**
     * 查询没有完成的计划
     * @param containerId
     * @return
     */
    List<BusinOutInPlan> queryNoFinishByContainerId(Long containerId);

    /**
     * 根据任务编号重新分配高货位
     *
     * @param bo 薄
     * @return {@link Result}<{@link Boolean}>
     */
    Result<Boolean> repeatFindHighLocation(UpdPlanLocationBo bo);

    /**
     * 可视化大屏任务管理
     * @return
     */

    List<BusinTaskManageVo> getTaskManagement();

    /**
     * 获取任务信息
     * @param bo
     * @return
     */
    List<BusinDataTaskVo> getTaskInfo(@RequestBody BusinTaskQueryBo bo);


    /**
     * 通过托盘编码及状态查询任务管理
     *
     * @param orderNo 订单编号
     * @param planStatus 订单状态
     * @return {@code Result<String>}
     */
    BusinOutInPlan getOrderNoByOrderNo(String orderNo, String planStatus);

    Boolean updateSysStockByPlanOrderNo(String orderNo);


}
