package com.hzs.sale.deliver.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.sale.deliver.SaDeliver;
import com.hzs.common.domain.sale.ext.SaOrderItemsExt;
import com.hzs.sale.deliver.param.DeliverConfirmParam;
import com.hzs.sale.deliver.param.DeliverHandledParam;
import com.hzs.sale.deliver.param.DeliverMergeParam;
import com.hzs.sale.deliver.param.DeliverParam;
import com.hzs.sale.deliver.vo.DeliverHandledVO;
import com.hzs.sale.deliver.vo.DeliverPrintVO;
import com.hzs.sale.deliver.vo.DeliverVO;
import com.hzs.system.sys.dto.LoginUser;

import java.util.List;

/**
 * 销售订单-发货单 服务类
 */
public interface ISaDeliverService extends IService<SaDeliver> {

    /**
     * 生成发货单
     *
     * @param param     合单参数
     * @param dataList  合单数据
     * @param pkCountry 国家ID
     * @param userId    用户ID
     * @return
     */
    boolean mergeDeliver(DeliverMergeParam param, List<SaOrderItemsExt> dataList, Integer pkCountry, Long userId);

    /**
     * 已合并发货单列表
     *
     * @param param     查询参数
     * @param pkCountry 国家ID
     * @return
     */
    List<DeliverHandledVO> queryDeliverHandledList(DeliverHandledParam param, Integer pkCountry);

    /**
     * 发货单打印
     *
     * @param idList    发货单ID列表
     * @param pkCountry 国家ID
     * @param userId    用户ID
     * @return
     */
    List<DeliverPrintVO> deliverPrint(List<Long> idList, Integer pkCountry, Long userId);

    /**
     * 根据订单明细查询发货单
     *
     * @param deliverItemsId 发货明细ID
     * @param pkCountry      国家ID
     * @return
     */
    SaDeliver queryDeliverByItems(Long deliverItemsId, Integer pkCountry);

    /**
     * 删除发货单明细
     *
     * @param saDeliver      发货单
     * @param deliverItemsId 发货单明细ID
     * @param pkCountry      国家ID
     * @param userId         当前用户ID
     * @return
     */
    void deleteDeliverItems(SaDeliver saDeliver, Long deliverItemsId, Integer pkCountry, Long userId);

    /**
     * 删除发货单
     *
     * @param deliverList   发货单列表
     * @param deliverIdList 发货单ID列表
     * @param pkCountry     国家ID
     * @param userId        当前用户ID
     * @return
     */
    void deleteDeliver(List<SaDeliver> deliverList, List<Long> deliverIdList, Integer pkCountry, Long userId);

    /**
     * 立即发货列表
     *
     * @param param     立即发货查询条件
     * @param pkCountry 国家ID
     * @return
     */
    List<DeliverVO> deliverList(DeliverParam param, Integer pkCountry);

    /**
     * 单个发货
     *
     * @param param 发货参数
     * @return
     */
    boolean simpleDeliver(DeliverConfirmParam param, Long userId, Integer pkCountry);

    /**
     * 批量发货
     *
     * @param deliverList   发货单列表
     * @param deliverIdList 发货单ID列表
     * @param userId        当前用户ID
     * @param pkCountry     国家ID
     * @param loginUser     当前用户
     * @return
     */
    boolean batchDeliver(List<SaDeliver> deliverList, List<Long> deliverIdList, Long userId, Integer pkCountry, LoginUser loginUser);

    /**
     * 批量发货
     *
     * @param deliverList   发货单列表
     * @param deliverIdList 发货单ID列表
     * @param userId        当前用户ID
     * @param pkCountry     国家ID
     * @param loginUser     当前用户
     * @return
     */
    boolean batchDeliverNew(List<SaDeliver> deliverList, List<Long> deliverIdList, Long userId, Integer pkCountry, LoginUser loginUser);

    /**
     * 查询订单发货信息
     *
     * @param pkOrder
     * @return
     */
    List<SaDeliver> queryDeliverByOrder(Long pkOrder);

    /**
     * 根据发货单明细数量删除发货单
     *
     * @param pkDeliver 发货单ID
     * @param userId    用户ID
     * @param pkCountry 国家ID
     * @return
     */
    int deleteDeliverByItemsCount(Long pkDeliver, Long userId, Integer pkCountry);

}
