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

import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.dto.OrderBackInfoDto;
import cn.iocoder.yudao.module.order.vo.orderLabel.*;
import cn.iocoder.yudao.module.order.dal.dataobject.orderLabel.OrderLabelDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

/**
 * 订单箱号标签 Service 接口
 *
 * @author 系统管理员
 */
public interface OrderLabelService extends IService<OrderLabelDO> {

    /**
     * 创建订单箱号标签
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createLabel(@Valid OrderLabelCreateReqVO createReqVO);

    /**
     * @param saveOrUpdateOrderLabelDto
     */
    void saveOrUpdateLabel(SaveOrUpdateOrderLabelDto saveOrUpdateOrderLabelDto);

    /**
     * 更新订单箱号标签
     * @param updateReqVO 更新信息
     */
    void updateLabel(@Valid OrderLabelUpdateReqVO updateReqVO);

    /**
     * 删除订单箱号标签
     * @param id 编号
     */
    void deleteLabel(Long id);

    void deleteLabelByOrderId(Long orderId);

    /**
     * 获得订单箱号标签
     * @param id 编号
     * @return 订单箱号标签
     */
    OrderLabelDO getLabel(Long id);

    /**
     * 获得订单箱号标签列表
     * @param ids 编号
     * @return 订单箱号标签列表
     */
    List<OrderLabelDO> getLabelList(Collection<Long> ids);

    /**
     * 获得订单箱号标签列表
     *
     * @param orderId 编号
     * @return 订单箱号标签列表
     */
    List<OrderLabelBackVO> getLabelListByOrder(Long orderId);

    /**
     * 获取订单准备入仓的标签。 拆单时使用。 order-1,从1-数量    order-2: 从order-1数据量加1 - order-2的数量
     * @param orderId 订单id
     * @param isSplit 是否拆单插入标签调用
     * @return
     */
    OrderLabelDto getLabelWaitInByOrder(Long orderId);

    /**
     * 获得订单箱号标签分页
     * @param page 分页查询
     * @param query 查询
     * @return 订单箱号标签分页
     */
    PageResult<OrderLabelDO> getLabelPage(OrderLabelQueryVO query, PageVO page);

    /**
     * 获得订单箱号标签列表, 用于 Excel 导出
     * @param query 查询
     * @return 订单箱号标签列表
     */
    List<OrderLabelDO> getLabelList(OrderLabelQueryVO query);

    void updateSplitOrderLabel(Long parentOrderId, List<OrderDO> childrenOrders);

    void getLabelList(List<Integer> labelList, Integer start2, Integer end2);
    void updateRevokeSplitOrderLabel(OrderDO orderDO, List<OrderBackInfoDto> childrenOrderList);

}
