package com.hzs.sale.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
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.util.Date;
import java.util.List;

/**
 * 销售订单-明细表 Mapper 接口
 */
public interface SaOrderItemsMapper extends BaseMapper<SaOrderItems> {

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

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

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

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

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

    /**
     * 批量更新状态
     *
     * @param idList      订单明细ID列表
     * @param orderStatus 状态（EOrderStatus）
     * @param pkCountry   国家ID
     * @param userId      用户ID
     * @return
     */
    int updateStatusBatch(@Param("idList") List<Long> idList,
                          @Param("orderStatus") Integer orderStatus,
                          @Param("pkCountry") Integer pkCountry,
                          @Param("userId") Long userId);

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

    /**
     * 根据发货单更新状态
     *
     * @param deliverIdList 发货单ID列表
     * @param orderStatus   状态（EOrderStatus）
     * @param pkCountry     国家ID
     * @param userId        用户ID
     * @return
     */
    int updateStatusByDeliverList(@Param("deliverIdList") List<Long> deliverIdList,
                                  @Param("orderStatus") Integer orderStatus,
                                  @Param("pkCountry") Integer pkCountry,
                                  @Param("userId") Long userId);

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

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

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

    /**
     * 根据订单ID查询订单明细列表（前台使用，尽量只查能用到的）
     *
     * @param orderIdList 订单ID列表
     * @return
     */
    List<SaOrderItemsExt> queryListByOrderId(@Param("orderIdList") List<Long> orderIdList);

    /**
     * 根据订单明细ID查询订单明细列表
     *
     * @param itemIdList 订单明细ID列表
     * @param statusList 订单状态列表 -- 非必传
     * @param pkCountry  所属国家 -- 非必传
     * @return
     */
    List<SaOrderItemsExt> queryListByItemId(@Param("itemIdList") List<Long> itemIdList,
                                            @Param("statusList") List<Integer> statusList,
                                            @Param("pkCountry") Integer pkCountry);

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

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

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

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

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

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

    Integer sendDeliverBySaOrder(@Param("saOrderItemsExtList") List<?> saOrderItemsExtList, @Param("pkMember") Long pkMember);

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

}
