package com.hzs.sale.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import com.hzs.common.domain.sale.ext.SaOrderItemsExt;
import com.hzs.common.domain.sale.order.SaOrder;
import com.hzs.common.domain.sale.order.SaOrderItems;
import com.hzs.sale.deliver.param.DeliverExcludeProductParam;
import com.hzs.sale.deliver.param.DeliverMergeParam;
import com.hzs.sale.deliver.param.DeliverUnhandledParam;
import com.hzs.sale.deliver.vo.DeliverExcludeProductVO;
import com.hzs.sale.deliver.vo.DeliverUnhandledVO;
import com.hzs.sale.order.param.OrderItemsParam;
import com.hzs.sale.order.param.WaresOrderParam;
import com.hzs.sale.order.vo.WaresOrderVo;

import java.util.Date;
import java.util.List;

/**
 * 销售订单-明细表 服务类
 */
public interface ISaOrderItemsService extends IService<SaOrderItems> {

    /**
     * 未合并发货单列表
     *
     * @param param     未合单列表查询入参
     * @param pkCountry 国家ID
     * @return
     */
    List<DeliverUnhandledVO> queryDeliverUnhandledList(DeliverUnhandledParam param, Integer pkCountry);

    /**
     * 查询发货单排除产品（根据订单明细ID）
     *
     * @param idList    订单明细ID列表
     * @param pkCountry 国家ID
     * @return
     */
    List<DeliverExcludeProductVO> queryExcludeProductByIdList(List<Long> idList, Integer pkCountry);

    /**
     * 查询发货单排除产品（根据列表查询条件）
     *
     * @param param     未合单列表查询入参
     * @param pkCountry 国家ID
     * @return
     */
    List<DeliverExcludeProductVO> queryExcludeProductByQueryParam(DeliverExcludeProductParam param, Integer pkCountry);

    /**
     * 合单全部数据（根据查询条件）
     *
     * @param param     合单查询参数
     * @param pkCountry 国家ID
     * @return
     */
    List<SaOrderItemsExt> queryMergeByQueryParam(DeliverMergeParam param, Integer pkCountry);

    /**
     * 合单数据（根据订单条件）
     *
     * @param idList    订单明细ID列表
     * @param param     合单查询参数
     * @param pkCountry 国家ID
     * @return
     */
    List<SaOrderItemsExt> queryMergeByIdList(List<Long> idList, DeliverMergeParam param, Integer pkCountry);

    /**
     * 更新订单明细表，将订单明细更改为删除
     *
     * @param saOrder
     */
    Boolean updateOrderItems(SaOrder saOrder);

    void updateOrderItemsByMemberList(List<Long> memberList, Long pkApprove, Date currentDateTime);

    /**
     * 根据主键列表更新订单明细，删除部分退的订单
     *
     * @param pkOrderItemsId 订单明细
     * @param pkApprove      审核人
     * @param currentDate    更新时间
     */
    Boolean updateOrderItemsById(List<Long> pkOrderItemsId, Long pkApprove, Date currentDate);

    /**
     * 根据订单ID查询订单明细列表
     *
     * @param orderIdList 订单ID列表
     * @return
     */
    List<SaOrderItemsExt> queryListByOrderId(List<Long> orderIdList);

    /**
     * 根据订单明细ID查询订单明细列表
     *
     * @param itemIdList 订单明细ID列表
     * @return
     */
    List<SaOrderItemsExt> queryListByItemId(List<Long> itemIdList, List<Integer> statusList, Integer pkCountry);

    /**
     * 查询商品订单
     *
     * @param waresOrderParam
     * @return
     */
    List<WaresOrderVo> selectByInvestmentList(WaresOrderParam waresOrderParam);

    /**
     * 定时关闭订单
     */
    void closeOrder(Integer pkCountry, String data, Integer orderType);

    /**
     * 根据订单主键查询信息
     *
     * @param pkOrder
     * @return
     */
    List<SaOrderItemsExt> selectByList(Long pkOrder);

    /**
     * 根据订单ID查询商品
     **/
    List<OrderItemsParam> getOrderItemsParams(List<Long> orderIdList);

    /**
     * 批量插入订单明细数据
     *
     * @param orderItemsList 订单明细数据
     * @return
     */
    int insertBach(List<SaOrderItems> orderItemsList);

    /**
     * 校验订单商品是否下架
     *
     * @param orderCode 订单编号
     * @return
     */
    int checkOrderItemsPutOn(String orderCode);

    /**
     * 更新订单明细从已合单更新为已付款
     *
     * @param pkOrderList 订单ID列表
     * @param pkCountry   国家ID
     * @param userId      用户ID
     * @return
     */
    int updateToPayByPkOrder(List<Long> pkOrderList, Integer pkCountry, Long userId);

    /**
     * 订单明细退货
     *
     * @param orderItemsIdList 订单明细ID列表
     * @param userId           操作人ID
     * @param pkCountry        所属国家（可为空）
     * @return
     */
    boolean orderItemsReturn(List<Long> orderItemsIdList, Long userId, Integer pkCountry);

    /*
     *  根据订单对订单进行发货，公司发到店铺
     **/
    Boolean sendDeliverBySaOrder(List<SaOrderExt> saOrderExtList, Long pkMember);

    /**
     * 查询待支付订单数据
     *
     * @param orderCode 订单编号
     * @return
     */
    List<OrderItemsParam> listPayOrderData(String orderCode);

}
