
package com.tmerclub.cloud.order.mapper;

import com.tmerclub.cloud.api.order.vo.OrderRefundSimpleVO;
import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO;
import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundBO;
import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundItemBO;
import com.tmerclub.cloud.order.model.OrderRefund;
import com.tmerclub.cloud.order.vo.OrderRefundVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 订单退款记录信息
 *
 * @author tmerclub
 * @date 2020-12-05 14:13:50
 */
public interface OrderRefundMapper {

    /**
     * 根据订单退款记录信息id获取订单退款记录信息
     *
     * @param refundId 订单退款记录信息id
     * @return 订单退款记录信息
     */
    OrderRefundVO getByRefundId(@Param("refundId") Long refundId);

    /**
     * 保存订单退款记录信息
     *
     * @param orderRefund 订单退款记录信息
     */
    void save(@Param("orderRefund") OrderRefund orderRefund);

    /**
     * 更新订单退款记录信息
     *
     * @param orderRefund 订单退款记录信息
     */
    void update(@Param("orderRefund") OrderRefund orderRefund);

    /**
     * 根据订单退款记录信息id删除订单退款记录信息
     *
     * @param refundId
     */
    void deleteById(@Param("refundId") Long refundId);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     *
     * @param orderId
     * @return
     */
    List<OrderRefund> getProcessOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据订单id，获取退款成功的退款
     *
     * @param orderId
     * @return
     */
    List<OrderRefund> listSuccessOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     *
     * @param orderIds
     * @return
     */
    List<OrderRefundVO> getProcessOrderRefundByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     *
     * @param orderId        订单id
     * @param returnMoneySts 退款状态
     * @return 成功的退款订单
     */
    List<com.tmerclub.cloud.api.order.vo.OrderRefundVO> getOrderRefundByOrderIdAndRefundStatus(@Param("orderId") Long orderId, @Param("returnMoneySts") Integer returnMoneySts);

    /**
     * 获取订单正在进行退款的退款数量
     *
     * @param returnMoneySts
     * @param returnMoneySts2
     * @param orderId
     * @return
     */
    Integer countByReturnMoneyStsAndOrderId(@Param("returnMoneySts") Integer returnMoneySts, @Param("returnMoneySts2") Integer returnMoneySts2, @Param("orderId") Long orderId);

    /**
     * 正在进行退款的退款订单数量
     *
     * @param orderId 订单号
     * @return 正在进行退款的退款订单数量
     */
    Integer countReturnProcessingItemByOrderId(@Param("orderId") Long orderId);


    /**
     * 查询退款成功的订单商品数量
     *
     * @param orderId
     * @return
     */
    Integer countRefundSuccessRefundCountByOrderId(@Param("orderId") Long orderId);


    /**
     * 同意退货
     * <p>
     * 注意：如果你无法理解下面这句话的话，请不要随意更改里面sql的where语句
     * 众所周知，如果不是申请的话，下一步不可能是同意退货，
     * 但是在执行下面代码之前，退款的状态是可能发生改变的，
     * 也就是下面这条sql执行之前进行了退款状态的改变（比如同意退款），那会造成不可预知的后果，
     * 所以更新订单状态的时候也要在条件当中加上退款状态，确定这条sql是原子性的
     *
     * @param sellerMsg
     * @param refundId
     * @return
     */
    int agreeReturns(@Param("sellerMsg") String sellerMsg, @Param("refundId") Long refundId);

    /**
     * 拒绝退款
     * <p>
     * 注意：如果你无法理解下面这句话的话，请不要随意更改里面的sql的where语句
     * 众所周知，如果不是申请的话，下一步不可能是拒绝，
     * 但是在执行下面代码之前，退款的状态是可能发生改变的，
     * 也就是下面这条sql执行之前进行了退款状态的改变（比如同意退款），那会造成不可预知的后果，
     * 所以更新订单状态的时候也要在条件当中加上退款状态，确定这条sql是原子性的
     *
     * @param sellerMsg
     * @param rejectMessage
     * @param refundId
     * @param returnMoneySts
     * @param receiver
     * @param supplierHandleStatus
     * @param imgUrls
     * @return
     */
    int disagreeRefund(@Param("sellerMsg") String sellerMsg, @Param("rejectMessage") String rejectMessage, @Param("refundId") Long refundId,
                       @Param("returnMoneySts") Integer returnMoneySts, @Param("receiver") Boolean receiver, @Param("supplierHandleStatus") Integer supplierHandleStatus, @Param("imgUrls") String imgUrls);

    /**
     * 拒绝退款介入申请
     *
     * @param platformMessage
     * @param refundId
     * @param applyInterventionStatus
     * @return
     */
    int disagreeIntervention(@Param("platformMessage") String platformMessage, @Param("refundId") Long refundId,
                       @Param("applyInterventionStatus") Integer applyInterventionStatus);

    /**
     * 同意退款
     *
     * @param sellerMsg
     * @param refundId
     * @param returnMoneySts
     * @param receiver
     * @param applyType
     * @param refundAmount
     * @param purchaseRefundAmount
     * @param applyInterventionStatus
     * @return
     */
    int agreeRefund(@Param("sellerMsg") String sellerMsg, @Param("refundId") Long refundId, @Param("returnMoneySts") Integer returnMoneySts,
                    @Param("receiver") Boolean receiver, @Param("applyType") Integer applyType, @Param("refundAmount") Long refundAmount, @Param("purchaseRefundAmount") Long purchaseRefundAmount);

    /**
     * 平台同意退款
     *
     * @param orderRefundVO 退款信息
     * @return
     */
    int platformAgreeRefund(@Param("orderRefundVO") OrderRefundVO orderRefundVO);

    /**
     * 获取退款状态
     *
     * @param refundId
     * @return
     */
    Integer getRefundStatus(@Param("refundId") Long refundId);

    /**
     * 通过订单id获取正在处理中和处理成功的退款订单
     *
     * @param orderId 订单id
     * @return 正在处理中的退款订单
     */
    List<OrderRefundVO> getProcessingOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 通过订单id获取正在处理中的退款订单
     *
     * @param orderId 订单id
     * @return 正在处理中的退款订单
     */
    List<OrderRefundVO> getProcessingRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 通过订单id获取正在处理中和退款平台介入拒绝的退款订单
     *
     * @param orderId 订单id
     * @return 正在处理中和退款平台介入拒绝的退款订单
     */
    List<OrderRefundVO> listOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据退款单号列表获取订单号列表
     *
     * @param refundIds
     * @return
     */
    List<OrderRefundSimpleVO> listOrderIdsByRefundIds(@Param("refundIds") List<Long> refundIds);

    /**
     * 移交供应商处理，改变下状态即可
     *
     * @param oldSupplierHandleStatus 供应商处理状态(旧)
     * @param supplierHandleStatus    移交供应商处理状态
     * @param refundId                退款id
     * @param returnMoneySts          退款状态
     * @return 结果
     */
    int transferRefundOrderToSupplier(@Param("oldSupplierHandleStatus") Integer oldSupplierHandleStatus, @Param("supplierHandleStatus") Integer supplierHandleStatus,
                                      @Param("refundId") Long refundId, @Param("returnMoneySts") Integer returnMoneySts);

    /**
     * 获取退款成功总数
     *
     * @param orderId
     * @return
     */
    int countSuccessItemNum(Long orderId);

    /**
     * 获取订单的移交供应商处理的状态
     *
     * @param orderId 订单id
     * @return 移交供应商处理的状态
     */
    int getSupplierHandleStatusByOrderId(@Param("orderId") Long orderId);

    /**
     * 获取mongodb和es的退款订单信息
     *
     * @param refundId
     * @return
     */
    MongoOrderRefundBO mongoAndEsOrderRefundInfo(@Param("refundId") Long refundId);

    /**
     * 获取订单有关信息
     *
     * @param orderId
     * @return
     */
    MongoOrderRefundBO mongoEsOrder(@Param("orderId") Long orderId);

    /**
     * 取mongodb和es的退款订单项信息
     * @param orderId
     * @param orderItemId
     * @param giveawayList
     * @return
     */
    List<MongoOrderRefundItemBO> mongoAndEsOrderRefundItems(@Param("orderId") Long orderId, @Param("orderItemId") Long orderItemId, @Param("giveawayList") List<Long> giveawayList);

    /**
     * 根据信息列表
     * @param orderRefundSearchDTO
     * @return
     */
    List<OrderRefundVO> listUserOrderRefund(@Param("orderRefundSearchDTO") OrderRefundSearchDTO orderRefundSearchDTO);

    /**
     * 根据订单单号列表获取退款订单列表
     *
     * @param orderIds
     * @return
     */
    List<Long> listOrderRefundByOrderIds(@Param("orderIds") List<Long> orderIds);
}
