package com.pz.system.service;

import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
import com.pz.common.core.domain.R;
import com.pz.system.domain.TotalOrder;
import com.pz.system.domain.bo.*;
import com.pz.system.domain.vo.AccompanyDemandVo;
import com.pz.system.domain.vo.DataOrderVo;
import com.pz.system.domain.vo.DataViewVo;
import com.pz.system.domain.vo.OrderColumnarVo;
import com.pz.system.domain.vo.OrderLineVo;
import com.pz.system.domain.vo.TotalOrderVo;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.domain.PageQuery;
import org.apache.ibatis.annotations.Param;

import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 总订单Service接口
 *
 * @author ruoyi
 * @date 2023-09-08
 */
public interface ITotalOrderService {

    /**
     * 查询总订单
     */
    TotalOrderVo queryById(Long id);

    /**
     * 查询用户订单详情
     *
     * @param id
     * @return
     */
    TotalOrderVo queryByAppId(Integer id);

    /**
     * 查询总订单列表
     */
    TableDataInfo<TotalOrderVo> queryPageList(TotalOrderBo bo, PageQuery pageQuery);

    /**
     * 查询总订单列表
     */
    List<TotalOrderVo> queryList(TotalOrderBo bo);

    /**
     * 新增总订单
     */
    Boolean insertByBo(TotalOrderBo bo);

    /**
     * 小程序创建订单
     *
     * @param bo
     * @return
     */
    TotalOrderVo createOrder(CreateOrderBo bo);

    /**
     * 修改总订单
     */
    Boolean updateByBo(TotalOrderBo bo);

    /**
     * 用户取消订单
     *
     * @param bo
     * @return
     */
    Boolean cancelOrder(TotalOrderBo bo);
    /**
     * 用户完成订单
     *
     * @param bo
     * @return
     */
    Boolean finishOrder(TotalOrderBo bo);

    /**
     * 统一下单接口
     * @param bo
     * @return
     */
    Object payOrder(TotalOrderBo bo);

    /**
     * 支付回调
     * @param result
     * @return
     */
    boolean orderPayCallBack(WxPayOrderNotifyResult result);

    /**
     * 用户主动退款
     *
     * @param bo
     * @return
     */
    Boolean refundOrder(TotalOrderBo bo);


    boolean orderRefundCallBack(WxPayRefundNotifyResult wxPayRefundNotifyResult);

    /**
     * 校验并批量删除总订单信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 陪诊员端 需求广场
     *
     * @return 待分配陪诊员订单
     */
    TableDataInfo<AccompanyDemandVo> queryUndistributedOrder(Integer cityCode, PageQuery page);

    /**
     * 陪诊员端 评价
     *
     * @return 待分配陪诊员订单
     */
    TableDataInfo<AccompanyDemandVo> queryOrderComment(Integer emId,PageQuery page);

    /**
     * 陪诊员接单
     *
     * @param emId    陪诊员ID
     * @param orderId 主订单ID
     * @return 操作结果
     */
    boolean orderReceiving(Integer emId, Integer orderId);


    /**
     * 查询订单信息
     *
     * @param id 订单ID
     * @return 订单信息
     */
    AccompanyDemandVo queryTotalOrderById(Long id);


    /**
     * 查询物流状态
     * @return
     */
    Object selectLogisticsStatus(TotalOrderBo totalOrderBo);

    /**
     * 订单销售额
     */
    DataOrderVo saleroom(DataViewBo dataViewBo);

    /**
     * 平台收益
     */
    DataOrderVo platformRevenue(DataViewBo dataViewBo);

    DataOrderVo platformRevenueDivide(DataViewBo dataViewBo);

    /**
     * 订单量
     */
    DataOrderVo orderQuantity(DataViewBo dataViewBo);

    /**
     * 数据总览
     * @param bo
     * @return
     */
    List<OrderLineVo> findOrderColumnarVoList(OrderColumnarBo bo);

    Boolean addThirdOrder(CreateOrderThirdBo createOrderThirdBo);
}