package com.hzs.sale.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
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.DeliverUnhandledVO;
import com.hzs.sale.deliver.vo.DeliverExcludeProductVO;
import com.hzs.sale.order.param.OrderItemsParam;
import com.hzs.sale.order.param.WaresOrderParam;
import com.hzs.sale.order.vo.WaresOrderVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
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查询订单商品列表
     **/
    List<WaresOrderVo> waresListByOrderId(List<Long> orderIdList);

    /**
     * 根据订单ID查询明细商品列表（不带删除标记）
     *
     * @param orderId 订单ID
     * @return
     */
    List<WaresOrderVo> queryWaresListByOrderId(Long orderId);

    /**
     * 根据订单明细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(@Param("orderIdList") List<Long> orderIdList);

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

    /**
     * 批量插入订单明细数据
     *
     * @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);

    /**
     * 抵扣订单明细插入
     *
     * @param pkOrderOld 旧订单ID
     * @param pkOrderNew 新订单ID
     * @param userId     会员ID
     * @param nowDate    当前时间
     * @return
     */
    int copyDeductionItems(Long pkOrderOld, Long pkOrderNew, Long userId, Date nowDate);

    /**
     * 根据订单编号查询订单项
     *
     * @param orderCode
     * @return
     */
    List<OrderItemsParam> selectByWaresCodeList(String orderCode);

    /**
     * 查询新零售购买指定商品数量（新）
     *
     * @param pkMember      会员ID
     * @param waresCodeList 商品编号列表
     * @param payTime       支付时间
     * @param orderTypeList 订单类型列表
     * @param systemType    系统类型（可为null）
     * @return
     */
    BigDecimal getRetailWaresQuantityNew(Long pkMember, List<String> waresCodeList, Date payTime, List<Integer> orderTypeList, Integer systemType);

    /**
     * 订单发货数量
     *
     * @param orderCodeList 订单编号列表
     * @param pkCountry     所属国家
     * @return
     */
    int countOrderDeliver(List<String> orderCodeList, Integer pkCountry);

}
