package com.xhpc.order.service;

import com.xhpc.common.core.domain.R;
import com.xhpc.common.core.web.domain.AjaxResult;
import com.xhpc.common.data.redis.CacheRealtimeData;
import com.xhpc.order.domain.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author yuyang
 * @date 2021/8/7 15:07
 */
public interface IXhpcRealTimeOrderService {


    /**
     * 实时订单接口(PC端)
     * @param phone                       用户账号
     * @param transactionNumber           订单编号
     * @param source                      用户类型  0C端用户 1流量用户
     * @param chargingStationName         电站名称
     * @param terminalName                终端名称
     * @param operatorId                  运营商
     * @param startTime                   订单开始时间
     * @param endTime                     订单结束时间
     * @param status                      状态（-1准备充电 0开始充电 1自动结算，2异常，3平台结算）
     * @param userId                      用户id
     * @param type                        1 平台 2 运营商 3流量方
     * @return
     */
    List<Map<String,Object>> list(String tenantId,Long chargingStationId,Long chargingPileId,Long terminalId,String phone,String transactionNumber,Integer source,String chargingStationName,String terminalName,Long operatorId,String startTime,String endTime,Integer status,Long userId,Integer type,String affiliationOrganization,String plateNum,Integer internetId,String internetSerialNumber);

    /**
     * 实时订单详情接口(PC端)
     * @param realTimeOrderId
     * @return
     */
    Map<String,Object> getMessage(Long realTimeOrderId,Long chargeOrderId);

    /**
     *  实时订单详情数据列表（PC）
     * @param chargingOrderId  充电订单id
     * @return
     */
    List<Map<String,Object>> timeList(Long chargingOrderId);

    /**
     *  实时订单详情数据列表（PC）
     * @param chargingOrderId  充电订单id
     * @return
     */
    List<Map<String,Object>> timeBmsList(Long chargingOrderId);
    /**
     * 实时订单详情数据图表（PC）
     * @param chargingOrderId
     * @return
     */
    AjaxResult timeChartListVoltage(Long chargingOrderId);
    /**
     * 实时订单详情数据图表（PC）
     * @param chargingOrderId
     * @return
     */
    AjaxResult timeChartListCurrent(Long chargingOrderId);
    /**
     * 实时订单详情数据图表（PC）
     * @param chargingOrderId
     * @return
     */
    AjaxResult timeChartListSoc(Long chargingOrderId);

    /**
     * 删除之前的实时订单数据
     */
    void deleteRealTimeOrder(Long chargingOrderId);

    /**
     * 添加实时充电订单
     * @param xhpcRealTimeOrder
     * @return
     */
    int addXhpcRealTimeOrder(XhpcRealTimeOrder xhpcRealTimeOrder);


    /**
     * 添加订单实时SOC
     * @param xhpcChargeOrderSoc
     * @return
     */
    int addSOC(XhpcChargeOrderSoc xhpcChargeOrderSoc);

    /**
     * 添加订单实时电流
     * @param XhpcChargeOrderCurrent
     * @return
     */
    int addCurrent(XhpcChargeOrderCurrent XhpcChargeOrderCurrent);

    /**
     * 添加订单实时电流
     * @param xhpcChargeOrderVoltage
     * @return
     */
    int addVoltage(XhpcChargeOrderVoltage xhpcChargeOrderVoltage);

    /**
     * 审核详情
     * @param realTimeOrderId
     * @return
     */
    Map<String, Object> getExamineMessage(Long realTimeOrderId,Long chargeOrderId);

    AjaxResult getExamineMessageYu(Long realTimeOrderId,Long chargeOrderId);

    /**
     * 审核
     * @param chargingOrderId
     * @return
     */
    AjaxResult getExamine(Long chargingOrderId, BigDecimal powerPrice,BigDecimal servicePrice,BigDecimal chargingDegree,String startTime,String endTime);

    AjaxResult getExamineYu();
    /**
     * 结算订单
     * @param powerPrice
     * @param servicePrice
     * @param money
     * @param surplusPowerPrice
     * @param surplusServicePrice
     * @param xhpcChargeOrder
     * @param userId
     * @param userMessage
     * @param type              0 不发短信  1发短信
     * @param vinNormal         VUN 码
     */
    R addSettlement(BigDecimal powerPrice, BigDecimal servicePrice, BigDecimal money, BigDecimal surplusPowerPrice,
                    BigDecimal surplusServicePrice, XhpcChargeOrder xhpcChargeOrder, Long userId,
                    Map<String, Object> userMessage, Integer type, String vinNormal, XhpcHistoryOrder xhpcHistoryOrder);

    /**
     * 添加redis到数据库
     * @param xhpcHistoryOrder
     * @param xhpcChargeOrder
     * @param orderNo
     * @param type              1.审核  2.自动结算
     */
    void addPileEndOrder(XhpcHistoryOrder xhpcHistoryOrder, XhpcChargeOrder xhpcChargeOrder, String orderNo, Integer type);
    /**
     * 添加实时数据
     *
     * @param cacheRealtimeData
     * @param xhpcChargeOrder
     * @param orderNo           订单号
     * @param type              1.实时数据回调  2.结算回调
     * @return
     */
    Map<String, Object> addOrderTime(CacheRealtimeData cacheRealtimeData, XhpcChargeOrder xhpcChargeOrder,
                      String orderNo, Integer type);

    /**
     * 获取一条实时数据
     */
    XhpcRealTimeOrder getChargingOrderId(Long chargingOrderId,Integer type);

    /**
     * 添加一条金额为0的数据
     */
    void addZeroHistoryOrder(XhpcChargeOrder xhpcChargeOrder);


    /**
     * 添加一条实时订单的BMS,清除一个月半之前的数据
     */
    void addRealTimeOrderBms(String orderNo);

    /**
     * 实时电流定时任务，每天下午2点,清除一个月半之前的数据
     */
    void orderCurrent();
    /**
     * 实时电压定时任务，每天下午3点,清除一个月半之前的数据
     */
    void orderVoltage();

    /**
     * 实时soc定时任务，每天下午2点30,清除一个月半之前的数据
     */
    void orderSoc();

    //实时充电数据定时任务，每天下午3点30,清除一个月半之前的数据
    void realTimeOrder();

    //充电结算订单报文定时任务，每天下午4点,清除一个月半之前的数据
    void orderRedisRecord();

    //充电车辆BMS报文定时任务，每天下午4点30,清除一个月半之前的数据
    void realTimeOrderBms();

    void deleteOrderCacheDate();
}
