package com.xinelu.manage.mapper.goodsOrder;

import com.xinelu.manage.domain.goodsOrder.GoodsOrder;
import com.xinelu.manage.dto.goodsorder.GoodsOrderDTO;
import com.xinelu.manage.vo.RefundOrderInfoVO;
import com.xinelu.manage.vo.goods.GoodsOrderAndDetailsInfo;
import com.xinelu.manage.vo.goodsorder.*;
import com.xinelu.manage.vo.orderDetails.GoodsOrderAndDetails;
import org.apache.ibatis.annotations.Param;

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

/**
 * 商品订单Mapper接口
 *
 * @author xinyilu
 * @date 2022-10-18
 */
public interface GoodsOrderMapper {
    /**
     * 查询商品订单
     *
     * @param id 商品订单主键
     * @return 商品订单
     */
    GoodsOrder selectGoodsOrderById(Long id);

    /**
     * 查询商品订单列表
     *
     * @param goodsOrder 商品订单
     * @return 商品订单集合
     */
    List<GoodsInfoOrderVO> selectGoodsOrderList(GoodsInfoOrderVO goodsOrder);

    /**
     * 新增商品订单
     *
     * @param goodsOrder 商品订单
     * @return 结果
     */
    int insertGoodsOrder(GoodsOrder goodsOrder);

    /**
     * 修改商品订单
     *
     * @param goodsOrder 商品订单
     * @return 结果
     */
    int updateGoodsOrder(GoodsOrder goodsOrder);

    /**
     * 删除商品订单
     *
     * @param id 商品订单主键
     * @return 结果
     */
    int deleteGoodsOrderById(Long id);

    /**
     * 批量删除商品订单
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deleteGoodsOrderByIds(Long[] ids);

    /**
     * 查询商品订单详情
     *
     * @param orderNo 商品订单编号
     * @return com.xinyilu.base.vo.goodsorder.GoodsOrderVO
     **/
    GoodsOrderVO getGoodsOrderByOrder(String orderNo);

    /**
     * 通过order查询订单明细
     *
     * @param orderNo 产品订单编号
     * @return GoodsOrderDetailsVO
     */
    GoodsOrderDetailsVO selectGoodsOrderDetailsByOrderNo(String orderNo);

    /**
     * 查询商品订单列表
     *
     * @param orderNo 商品订单编号
     * @return 商品订单集合
     */
    GoodsOrder getGoodsOrderByOrderNo(String orderNo);

    /**
     * 修改商品订单状态
     *
     * @param orderStatus 订单状态
     * @param orderNo     订单编号
     * @return 数量
     */
    int updateGoodsOrderStatus(@Param("orderStatus") String orderStatus, @Param("orderNo") String orderNo);

    /**
     * 查询2小时未支付的商品订单信息
     *
     * @param localDateTime 时间
     * @return 订单集合
     */
    List<GoodsOrderAndDetailsInfo> getWaitPayGoodsOrderList(@Param("time") LocalDateTime localDateTime);

    /**
     * 批量更新商品订单状态
     *
     * @param orderNoList 订单列表信息
     * @param orderStatus 订单状态
     * @return 更新数量
     */
    int updateBatchGoodsOrderStatus(@Param("orderNoList") List<String> orderNoList, @Param("orderStatus") String orderStatus);

    /**
     * 查询未支付的订单信息
     *
     * @param orderStatus 订单状态
     * @return 订单集合
     */
    List<GoodsOrder> getWaitPayStatusGoodsOrderList(@Param("orderStatus") String orderStatus);

    /**
     * 根据订单编号查询对应得订单信息
     *
     * @param orderNo 订单编号
     * @return 订单集合
     */
    GoodsOrderAndDetailsInfo getGoodsAndDetailsOrderInfo(String orderNo);

    /**
     * 查询待退款的商品订单信息
     *
     * @param orderStatus         订单状态
     * @param refundStatus        退款状态
     * @param confirmRefundStatus 确认退款状态
     * @return 待退款的订单信息
     */
    List<RefundOrderInfoVO> getRefundGoodsOrderInfo(@Param("orderStatus") String orderStatus,
                                                    @Param("refundStatus") String refundStatus,
                                                    @Param("confirmRefundStatus") String confirmRefundStatus);

    /**
     * 根据订单id查询商品退款原因
     *
     * @param goodsOrderId 订单id
     * @return com.xinyilu.base.vo.goodsorder.GoodsOrderRefundVO
     **/
    GoodsOrderRefundVO getGoodsOrderRefund(Long goodsOrderId);

    /**
     * 根据订单编号修改商品订单的确认退款状态
     *
     * @param confirmRefundStatus 确认退款状态
     * @param orderNo             订单编号
     * @return 数量
     */
    int updateGoodsConfirmRefundStatus(@Param("orderNo") String orderNo, @Param("confirmRefundStatus") String confirmRefundStatus);

    /**
     * 查询待支付的商品订单数量
     *
     * @param orderNoList 订单编号集合
     * @return 订单集合
     */
    List<GoodsOrderAndDetailsInfo> getWaitPayGoodsOrderCountList(@Param("orderNoList") List<String> orderNoList);

    /**
     * 根据订单编号查询对应得订单信息
     *
     * @param orderNo 订单编号
     * @return com.xinyilu.base.vo.goodsorder.GoodsOrderVO
     **/
    GoodsInfoRedemptionVO getGoodOrder(String orderNo);

    /**
     * 根据订单编号修改商品订单的确认退款状态和订单状态
     *
     * @param confirmRefundStatus 确认退款状态
     * @param orderNo             订单编号
     * @param orderStatus         订单状态
     * @return 数量
     */
    int updateConfirmRefundStatusAndOrderStatus(@Param("orderNo") String orderNo,
                                                @Param("confirmRefundStatus") String confirmRefundStatus,
                                                @Param("orderStatus") String orderStatus);

    /**
     * 查询时间段的商品订单
     *
     * @param beforeTime  之前10分钟
     * @param time        现在时间
     * @param orderStatus 订单状态
     * @param orderType   订单类型
     * @return List<GoodsOrder>
     */
    List<GoodsOrderAndDetails> selectGoodsOrderByTime(@Param("beforeTime") LocalDateTime beforeTime, @Param("time") LocalDateTime time,
                                                      @Param("orderStatus") String orderStatus, @Param("orderType") String orderType);

	/**
	 * 医生APP专家咨询工单列表查询
	 * @param goodsOrderDTO
	 * @return
	 */
	List<AppGoodsOrderVO> getConsultationOrders(GoodsOrderDTO goodsOrderDTO);
}
