package com.ghy.order.mapper;

import com.ghy.order.domain.OrderMaster;
import com.ghy.order.domain.OrderMasterCount;
import org.apache.ibatis.annotations.Param;

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

/**
 * 主订单的mapper层
 *
 * @author HH 2022/4/24
 */
public interface OrderMasterMapper {

    /**
     * @param orderMaster 主订单属性
     * @return 成功条数
     */
    int insertOrderMaster(OrderMaster orderMaster);

    /**
     * @param orderMaster 主订单属性
     * @return 成功条数
     */
    int updateOrderMaster(OrderMaster orderMaster);

    /**
     * @param orderMaster 主订单入参
     * @return 主订单集合
     */
    List<OrderMaster> selectOrderMasterList(OrderMaster orderMaster);

    /**
     * @param orderMaster 主订单入参
     * @return 满足条件的主单单量
     */
    Long countOrderMasterList(OrderMaster orderMaster);

    /**
     * 查询符合条件的主单总数
     *
     * @param orderMaster 主订单入参
     * @return 满足条件的主单总数
     */
    Long selectOrderMasterCount(OrderMaster orderMaster);

    /**
     * @param orderMasterId 主订单id
     * @return 主订单
     */
    OrderMaster selectById(Long orderMasterId);

    /**
     * 批量删除主订单信息
     *
     * @param orderMasterIds 需要删除的数据ID
     * @return 结果
     */
    int deleteOrderMasterByIds(Long[] orderMasterIds);

    /**
     * @param orderMasterCode 主订单编码
     * @return 主订单信息
     */
    OrderMaster checkOrderMasterCodeUnique(String orderMasterCode);

    /**
     * 用 OrderMaster 查询主订单信息
     *
     * @param orderMasterCode 主订单code
     * @return 主订单信息
     */
    OrderMaster selectByCode(String orderMasterCode);

    /**
     * 修改主订单状态
     *
     * @param orderMasterId 主订单ID
     * @param orderStatus   主订单状态码
     * @return 0失败 1成功
     */
    int updateStatus(@Param("orderMasterId") Long orderMasterId, @Param("orderStatus") int orderStatus);

    /**
     * 查询指定状态的订单
     */
    List<OrderMaster> selectByStatus(List<Integer> status);

    /**
     * 查询出未完成(orderStatus < 5)的主订单
     *
     * @return 主订单
     */
    List<OrderMaster> selectUnfinished();

    List<OrderMaster> selectByIds(@Param("orderMasterId") Collection<Long> orderMasterIds);

    int updatePayStatus(@Param("orderMasterId") Long orderMasterId, @Param("payStatus") Integer payStatus);

    /**
     * 更新主订单超时状态
     *
     * @param id               主订单ID
     * @param timeout          是否超时
     * @param timeoutFineTimes 超时罚款次数
     * @return 1
     */
    int updateTimeout(@Param("id") Long id, @Param("timeout") int timeout, @Param("timeoutFineTimes") Integer timeoutFineTimes);

    /**
     * 移除主订单的师傅ID
     *
     * @param id 主订单ID
     * @return 1
     */
    int removeWorker(Long id);

    OrderMasterCount differentStatusOrderCount(OrderMaster orderMaster);


    // 根据开始/结算时间进行查询有效的订单主数据。
    List<OrderMaster> searchByOrderStartTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    int updateCreateTime(Long id);

    int updateOrderMasterAddressById(OrderMaster orderMaster);

    /**
     * 根据商品主单ID查询服务主单
     *
     * @param goodsOrderMasterId 商品主单ID
     * @return 服务主单
     */
    OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId);
}
