package cn.iocoder.yudao.module.order.service.orderCargoControlPick;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderCargoControlPick.OrderCargoControlPickDO;
import cn.iocoder.yudao.module.order.dto.OrderCargoControlReleaseInfoDto;
import cn.iocoder.yudao.module.order.vo.order.OrderQueryVO;
import cn.iocoder.yudao.module.order.vo.order.StatisticsOrderVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControlPick.OrderCargoControlPickApplyVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControlPick.OrderCargoControlPickCreateReqVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControlPick.OrderCargoControlPickQueryVO;
import cn.iocoder.yudao.module.order.vo.orderCargoControlPick.OrderCargoControlPickUpdateReqVO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 订单控货人放货记录 Service 接口
 *
 * @author 郑屹
 */
public interface OrderCargoControlPickService extends IService<OrderCargoControlPickDO> {

    /**
     * 创建订单控货人放货记录
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createOrderCargoControlPick(@Valid OrderCargoControlPickCreateReqVO createReqVO);

    /**
     * 更新订单控货人放货记录
     *
     * @param updateReqVO 更新信息
     */
    void updateOrderCargoControlPick(@Valid OrderCargoControlPickUpdateReqVO updateReqVO);

    /**
     * 删除订单控货人放货记录
     *
     * @param id 编号
     */
    void deleteOrderCargoControlPick(Long id);

    /**
     * 获得订单控货人放货记录
     *
     * @param id 编号
     * @return 订单控货人放货记录
     */
    OrderCargoControlPickDO getOrderCargoControlPick(Long id);

    /**
     * 获得订单控货人放货记录列表
     *
     * @param ids 编号
     * @return 订单控货人放货记录列表
     */
    List<OrderCargoControlPickDO> getOrderCargoControlPickList(Collection<Long> ids);

    /**
     * 获得订单控货人放货记录分页
     *
     * @param page  分页查询
     * @param query 查询
     * @return 订单控货人放货记录分页
     */
    PageResult<OrderCargoControlPickDO> getOrderCargoControlPickPage(OrderCargoControlPickQueryVO query, PageVO page);

    /**
     * 获得订单控货人放货记录列表, 用于 Excel 导出
     *
     * @param query 查询
     * @return 订单控货人放货记录列表
     */
    List<OrderCargoControlPickDO> getOrderCargoControlPickList(OrderCargoControlPickQueryVO query);

    OrderCargoControlReleaseInfoDto getOrderCargoControlReleaseInfo(Long orderId);


    /**
     * 修改放货记录申请管理
     *
     * @param orderCargoControlPickApplyVO 放货记录审批业务申请信息
     */
    void orderCargoControlPickApply(OrderCargoControlPickApplyVO orderCargoControlPickApplyVO);

    /**
     * 修改放货记录申请业务表单详情
     *
     * @param approveId 业务ID
     * @return 修改放货记录申请详情
     */
    OrderCargoControlPickApplyVO approvalOrderCargoControlPick(Long approveId);

    /**
     * 修改放货记录申请业务表单详情
     *
     * @param cargoControlPickId 放货记录ID
     * @return 修改放货记录申请详情
     */
    OrderCargoControlPickApplyVO approvalUpdateCargoControlPickByCargoControlPickId(Long cargoControlPickId);

    /**
     * 取消放货记录申请业务表单详情
     *
     * @param cargoControlPickId 放货记录ID
     * @return 修改放货记录申请详情
     */
    OrderCargoControlPickApplyVO approvalCancelCargoControlPickByCargoControlPickId(Long cargoControlPickId);

    /**
     * 反复核放货记录申请业务表单详情
     *
     * @param orderId 订单ID
     * @return 反复核放货记录申请业务表单详情
     */
    OrderCargoControlPickApplyVO approvalAntiCheckingOrderCargoControlPickByOrderId(Long orderId);

    /**
     * 调货申请业务表单详情
     *
     * @param cargoControlPickId 放货记录ID
     * @return 调货申请业务表单详情
     */
    OrderCargoControlPickApplyVO seasoningCondimentsOrderCargoControlPickByOrderId(Long cargoControlPickId);

    /**
     * @param approveId 表单业务ID
     * @param result    1 处理中  2 通过 3 不通过 4 已取消
     */
    void approvalOrderCargoControlPick(String approveId, Integer result);

    void reviewOrderCargoControlPick(OrderCargoControlPickDO orderCargoControlPickDO);


    void reviewOrderCargoControlPick(List<OrderCargoControlPickDO> orderCargoControlPickDOList);

    void cancelOrderCargoControlPick(OrderCargoControlPickDO orderCargoControlPickDO);

    /**
     * @param allOrderCargoControlPickDOList
     * @param orderId
     * @param type
     */
    void batchAntiCheckingOrderCargoControlPick(List<OrderCargoControlPickDO> allOrderCargoControlPickDOList, Long orderId, Integer type);

    /**
     * 取消审批
     *
     * @param orderApprovalId 审批ID
     * @param reason          审批原因
     */
    void cancelApprovalByOrderApprovalId(Long orderApprovalId, String reason);

    /**
     控货订单详情列表
     */
    PageResult<OrderCargoControlReleaseInfoDto> orderCargoControlDetailList(OrderQueryVO query, PageVO page);

    /**
     * 查询控货订单列表统计
     */
    StatisticsOrderVO statisticsOrderControl(OrderQueryVO query);

    /**
     * 根据放货信息生成客户信息
     */
    void createCustomerByCargoControlPickId(OrderCargoControlPickDO orderCargoControlPick);
}
