package com.xinelu.manage.mapper.trainingorder;

import com.xinelu.manage.domain.trainingorder.TrainingOrder;
import com.xinelu.manage.dto.trainingitem.NurseAppletPersonTrainingItemDTO;
import com.xinelu.manage.vo.TrainingRefundOrderVO;
import com.xinelu.manage.vo.trainingorder.NurseAppletPersonTrainingOrderItemVO;
import com.xinelu.manage.vo.trainingorder.TrainingOrderVO;
import com.xinelu.manage.vo.trainingorderdetails.NurseAppletPersonTrainingOrderDetailsVO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 学习培训订单Mapper接口
 *
 * @author xinyilu
 * @date 2023-04-20
 */
public interface TrainingOrderMapper {
    /**
     * 查询学习培训订单
     *
     * @param id 学习培训订单主键
     * @return 学习培训订单
     */
    TrainingOrder selectTrainingOrderById(Long id);

    /**
     * 查询学习培训订单列表
     *
     * @param trainingOrder 学习培训订单
     * @return 学习培训订单集合
     */
    List<TrainingOrder> selectTrainingOrderList(TrainingOrder trainingOrder);

    /**
     * 新增学习培训订单
     *
     * @param trainingOrder 学习培训订单
     * @return 结果
     */
    int insertTrainingOrder(TrainingOrder trainingOrder);

    /**
     * 修改学习培训订单
     *
     * @param trainingOrder 学习培训订单
     * @return 结果
     */
    int updateTrainingOrder(TrainingOrder trainingOrder);

    /**
     * 删除学习培训订单
     *
     * @param id 学习培训订单主键
     * @return 结果
     */
    int deleteTrainingOrderById(Long id);

    /**
     * 批量删除学习培训订单
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deleteTrainingOrderByIds(Long[] ids);

    /**
     * 查询已购买的学习培训集合
     *
     * @param trainingOrder 已购买的学习培训
     * @return java.util.List<com.xinyilu.base.vo.trainingitem.NurseAppletPersonTrainingItemVO>
     **/
    List<NurseAppletPersonTrainingOrderDetailsVO> selectTrainingOrderVideoList(NurseAppletPersonTrainingItemDTO trainingOrder);

    /**
     * 查询已购买的学习培训详情
     *
     * @param trainingOrder 已购买的学习培训
     * @return java.util.List<com.xinyilu.base.vo.trainingitem.NurseAppletPersonTrainingItemVO>
     **/
    NurseAppletPersonTrainingOrderItemVO selectTrainingOrderVideoDetailsList(NurseAppletPersonTrainingItemDTO trainingOrder);

    /**
     * 查询学习培训订单列表
     *
     * @param trainingOrder 学习培训订单
     * @return 学习培训订单集合
     */
    List<TrainingOrderVO> selectTrainingOrderVOList(TrainingOrderVO trainingOrder);

    /**
     * 查询学习培训订单
     *
     * @param id 学习培训订单主键
     * @return 学习培训订单
     */
    TrainingOrderVO selectTrainingOrderVoById(Long id);

    /**
     * 根据订单编号查询学习培训订单信息
     *
     * @param trainingOrderNo 订单编号
     * @return 学习培训订单信息
     */
    TrainingOrder getTrainingOrderInfoByOrderNo(String trainingOrderNo);

    /**
     * 修改学习培训订单状态
     *
     * @param trainingOrderStatus 订单状态
     * @param trainingOrderNo     订单编号
     * @return 数量
     */
    int updateTrainingOrderStatus(@Param("trainingOrderStatus") String trainingOrderStatus, @Param("trainingOrderNo") String trainingOrderNo);

    /**
     * 根据订单状态查未支付的学习订单集合
     *
     * @param trainingOrderStatus 订单状态
     * @param trainingOrderList   订单集合
     * @return 未支付的订单信息集合
     */
    List<TrainingOrder> getWaitPayTrainingOrderList(@Param("trainingOrderStatus") String trainingOrderStatus, @Param("trainingOrderList") List<String> trainingOrderList);

    /**
     * 查询超过两小时未支付的学习培训订单信息
     *
     * @param time                超时时间
     * @param trainingOrderStatus 订单状态
     * @return 学习培训订单信息集合
     */
    List<TrainingOrder> getWaitPayTrainingOrderListByTime(@Param("time") LocalDateTime time, @Param("trainingOrderStatus") String trainingOrderStatus);

    /**
     * 批量更新学习培训订单状态
     *
     * @param orderNoList         学习培训订单列表信息
     * @param trainingOrderStatus 订单状态
     * @return 更新数量
     */
    int updateBatchTrainingOrderStatus(@Param("orderNoList") List<String> orderNoList, @Param("trainingOrderStatus") String trainingOrderStatus);

    /**
     * 查询已退款成功，但是本地系统未修改退款状态的学习培训订单
     *
     * @param trainingOrderStatus 学习培训订单状态
     * @param refundStatus        退款状态
     * @return 学习培训订单集合
     */
    List<TrainingRefundOrderVO> getTrainingRefundOrderList(@Param("trainingOrderStatus") String trainingOrderStatus, @Param("refundStatus") String refundStatus);

    /**
     * 退款信息查询
     *
     * @param id               学习培训订单主键
     * @param trainingItemType 学习培训订单类型
     * @return 结果
     */
    TrainingOrderVO selectRefundInformation(@Param("id") Long id, @Param("trainingItemType") String trainingItemType);
}
