
package com.tmerclub.cloud.order.service;

import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO;
import com.tmerclub.cloud.api.order.vo.AccountOrderDetailVO;
import com.tmerclub.cloud.api.order.vo.OrderRefundProdEffectRespVO;
import com.tmerclub.cloud.api.order.vo.OrderRefundSimpleVO;
import com.tmerclub.cloud.api.order.vo.PageShopAccountOrderVO;
import com.tmerclub.cloud.api.vo.EsPageVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.order.bo.RefundNotifyBO;
import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO;
import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO;
import com.tmerclub.cloud.common.response.ServerResponseEntity;
import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO;
import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO;
import com.tmerclub.cloud.order.model.Order;
import com.tmerclub.cloud.order.model.OrderRefund;
import com.tmerclub.cloud.order.model.OrderRefundAddr;
import com.tmerclub.cloud.order.model.OrderSettlement;
import com.tmerclub.cloud.order.vo.OrderRefundVO;

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

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

    /**
     * 分页获取订单退款记录信息列表
     *
     * @param pageDTO            分页参数
     * @param orderRefundPageDTO
     * @return 订单退款记录信息列表分页数据
     */
    EsPageVO<EsOrderRefundVO> page(PageDTO pageDTO, OrderRefundSearchDTO orderRefundPageDTO);

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

    /**
     * 根据订单退款记录信息id获取订单退款记录信息 详情，包括订单项，订单信息等
     *
     * @param refundId 订单退款记录信息id
     * @return 订单退款记录信息
     */
    OrderRefundVO getDetailByRefundId(Long refundId);

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

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

    /**
     * 获取该退款单号是否为最后一个订单项
     *
     * @param refundSn
     * @param shopId
     * @return
     */
    Boolean getIsLastRefund(Long refundSn, Long shopId);

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

    /**
     * 校验订单是否在退款时间内，是否可以进行申请退款
     *
     * @param order 订单信息
     * @return
     */
    boolean checkRefundDate(Order order);

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

    /**
     * 生成退款单
     *
     * @param orderRefund 退款对象
     */
    void applyRefund(OrderRefund orderRefund);

    /**
     * 买家提交物流信息
     *
     * @param orderRefund     退款单对象
     * @param orderRefundAddr 退款物流单对象
     */
    void submitExpress(OrderRefund orderRefund, OrderRefundAddr orderRefundAddr);

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

    /**
     * 订单退款成功处理
     *
     * @param refundNotifyBO
     */
    void refundSuccess(RefundNotifyBO refundNotifyBO);

    /**
     * 用户取消退款
     *
     * @param orderRefundVO
     */
    void cancelRefund(OrderRefundVO orderRefundVO);

    /**
     * 商家拒绝退款
     *
     * @param orderRefundParam
     * @param orderRefundVo
     */
    void disagreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 平台拒绝介入
     *
     * @param orderRefundParam
     * @param orderRefundVo
     */
    void disagreeIntervention(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 商家同意退款
     *
     * @param orderRefundParam
     * @param orderRefundVo
     * @return
     */
    ServerResponseEntity<Void> agreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 移交供应商处理，改变下状态即可
     *
     * @param orderRefundParam
     * @param orderRefundVo
     */
    void transferRefundOrderToSupplier(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo);

    /**
     * 商家同意退货，并返回一个退货地址
     *
     * @param orderRefundParam
     * @param orderRefundVo
     * @param sysType
     */
    void agreeReturns(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo, Integer sysType);

    /**
     * 同意退款
     *
     * @param orderRefundVO
     * @param orderRefundParam
     * @return 是否成功
     */
    int agreeRefund(OrderRefundVO orderRefundVO, OrderRefundDTO orderRefundParam);
    /**
     * 获取退款状态
     *
     * @param refundId
     * @return
     */
    Integer getRefundStatus(Long refundId);

    /**
     * 创建未曾团而退款的团购订单
     *
     * @param refundNotifyBO 退款
     */
    void createGroupUnSuccessRefundInfo(RefundNotifyBO refundNotifyBO);

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

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

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

    /**
     * 根据参数获取商品退款订单数据分析
     *
     * @param spuIds    商品id列表
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 商品退款订单数据
     */
    List<OrderRefundProdEffectRespVO> getProdRefundEffectByDateAndProdIds(List<Long> spuIds, Date startTime, Date endTime);

    /**
     * 根据订单id及退款状态，获取订单退款信息
     *
     * @param orderId        订单id
     * @param returnMoneySts 退款状态
     * @return 订单退款数据列表
     */
    List<com.tmerclub.cloud.api.order.vo.OrderRefundVO> getOrderRefundByOrderIdAndRefundStatus(Long orderId, Integer returnMoneySts);

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

    /**
     * 处理的超时申请的退款订单
     *
     * @param orderRefundDb 超时退款订单
     */
    void cancelWhenTimeOut(OrderRefundVO orderRefundDb);

    /**
     * 退款信息
     *
     * @param refundId 退款编号
     * @return 获取退款信息
     */
    com.tmerclub.cloud.api.order.vo.OrderRefundVO getOrderRefundByRefundId(Long refundId);

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

    /**
     * 获取mongodb和es的退款订单信息
     *
     * @param refundId
     * @return
     */
    EsOrderRefundBO saveMongoAndGetEsOrderRefundInfo(Long refundId);

    /**
     * 用户退款订单列表查询
     *
     * @param pageDTO
     * @param orderRefundSearchDTO
     * @return
     */
    PageVO<OrderRefundVO> userOrderRefundPage(PageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO);

    /**
     * 获取财务对账信息
     *
     * @param startTime
     * @param endTime
     * @param shopName
     * @param shopId
     * @return
     */
    AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId);

    /**
     * 获取店铺财务对账信息
     *
     * @param startTime
     * @param endTime
     * @param shopName
     * @param pageSize
     * @param pageNum
     * @return
     */
    PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum);

    /**
     * 获取店铺财务对账详情
     *
     * @param startTime
     * @param endTime
     * @param shopId
     * @param shopName
     * @param pageSize
     * @param pageNum
     * @return
     */
    PageShopAccountOrderVO listOrderRefundInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum);

    /**
     * 发放退款
     * @param refundId
     */
    void refundRequest(Long refundId);

    /**
     * 供应商退款订单设置数值
     * @param orderRefundVo
     * @param orderSettlement
     */
    void setSupplierOrderRefundInfo(OrderRefundVO orderRefundVo, OrderSettlement orderSettlement);

    /**
     * 申请平台介入
     *
     * @param orderRefundParam
     * @param orderRefundVO
     */
    void applyPlatormIntervertion(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO);

    /**
     * 撤销平台介入
     *
     * @param orderRefundParam
     * @param orderRefundVO
     */
    void cacelPlatormIntervertion(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO);

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