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

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.vo.orderSpecialNeed.*;
import cn.iocoder.yudao.module.order.dal.dataobject.orderSpecialNeed.OrderSpecialNeedDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

/**
 * 特需 Service 接口
 *
 * @author 系统管理员
 */
public interface OrderSpecialNeedService extends IService<OrderSpecialNeedDO> {

    /**
     * 创建特需
     * @param createReqVOList 创建信息
     */
    void createOrderSpecialNeed(@Valid List<OrderSpecialNeedCreateReqVO> createReqVOList);

    /**
     * 不校验异常的创建特需
     * @param createReqVOList 创建信息
     * @param flag 是否校验异常 true 校验  false 不校验
     */
    void createOrderSpecialNeed(List<OrderSpecialNeedCreateReqVO> createReqVOList,boolean flag);

    /**
     * 更新特需
     * @param updateReqVO 更新信息
     */
    void updateOrderSpecialNeed(@Valid OrderSpecialNeedUpdateReqVO updateReqVO);

    /**
     * 删除特需
     * @param id 编号
     */
    void deleteOrderSpecialNeed(Long id);

    /**
     * 获得特需
     * @param id 编号
     * @return 特需
     */
    OrderSpecialNeedDO getOrderSpecialNeed(Long id);

    /**
     * 获得特需列表
     * @param ids 编号
     * @return 特需列表
     */
    List<OrderSpecialNeedDO> getOrderSpecialNeedList(Collection<Long> ids);

    /**
     * 获得特需分页
     * @param page 分页查询
     * @param query 查询
     * @return 特需分页
     */
    PageResult<OrderSpecialNeedDO> getOrderSpecialNeedPage(OrderSpecialNeedQueryVO query, PageVO page);

    /**
     * 获得特需列表, 用于 Excel 导出
     * @param query 查询
     * @return 特需列表
     */
    List<OrderSpecialNeedDO> getOrderSpecialNeedList(OrderSpecialNeedQueryVO query);

    void deleteByOrderId(OrderSpecialNeedQueryVO orderSpecialNeedQueryVO) ;

    List<OrderSpecialNeedDO> getListByOrderId(Long orderId);

    void updateOrderSpecialNeedBatch(List<OrderSpecialNeedUpdateReqVO> updateReqVOList) throws Exception;

    /**
     * 入仓和装柜时特需生成应收
     * @param orderId
     * @param type 1:入仓  2：装柜
     * @return 特需生成应收
     */
    void buildSpecialReceivable(Long orderId,int type);
}
