package com.yuchen.saas.park.service.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuchen.saas.park.api.entity.park.PmgBatDeviceData;
import com.yuchen.saas.park.api.vo.park.GetEnvironmentInfo;
import com.yuchen.saas.park.api.vo.park.alarm.AlarmListVO;
import com.yuchen.saas.park.api.vo.park.energy.*;

import java.util.List;
import java.util.Map;

/**
 * @author 吕海泉
 * @create 2020/12/7 15:08
 */

public interface DeviceDataMapper extends BaseMapper<PmgBatDeviceData> {

    /**
     * 根据设备类型获取设备最新用量
     * @param identity 设备类型
     * @return
     */
    String getTotal(String identity);

    /**
     * 根据园区ID和设备类型获取最新用量
     * @param identity 设备类型
     * @param parkId 园区ID
     * @return
     */
    String getTotalByParkId(String identity, String parkId);

    /**
     * 根据设备类型获取上个月最后用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @return
     */
    String getLastMonth(String identity, String productName);

    /**
     * 根据设备类型获取上个月之前的最后用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @return
     */
    String getBeforeLastMonth(String identity, String productName);

    /**
     * 根据设备类型获取本月的最后用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @return
     */
    String getCurrentMonth(String identity, String productName);

    /**
     * 根据设备类型获取本月之前的最后用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @return
     */
    String getBeforeCurrentMonth(String identity, String productName);

    /**
     * 根据设备类型获取今日最高用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @return
     */
    String getToday(String identity, String productName);

    /**
     * 根据设备类型获取今日前的最高用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @return
     */
    String getBeforeToday(String identity, String productName);

    /**
     * 根据设备类型和前几天获取前几天的最高用量
     * @param identity 设备类型
     * @param productName 设备编码
     * @param days 几天
     * @return
     */
    String getYesterday(String identity, String productName, Integer days);

    /**
     * 根据设备类型获取耗水量排行前五的设备
     * @param identity 设备类型
     * @return
     */
    List<TopCompanyWaterVo> getTopCompanyWater(String identity);

    /**
     * 根据设备类型获取耗电量排行前五的设备
     * @param identity 设备类型
     * @return
     */
    List<TopCompanyAmmeterVo> getTopCompanyAmmeter(String identity);



    List<SevenAmmeterEnergyVo> getSevenDayAmmeter(String identity);
    List<SevenWaterVo> getSevenDayWater(String identity);

    /**
     * 根据类型获取所有的设备编号
     * @param identity 类型
     * @return
     */
    List<String> getProductName(String identity);

    /**
     * 根据园区ID和类型获取所有的设备编号
     * @param identity 类型
     * @param parkId 园区ID
     * @return
     */
    List<String> getProductNameByParkId(String identity, String parkId);

    /**
     * 根据类型获取所有的公司ID
     * @param identity 类型
     * @return
     */
    List<String> getCompanyId(String identity);

    /**
     * 根据园区ID、类型获取所有的公司ID
     * @param identity 类型
     * @param parkId 园区ID
     * @return
     */
    List<String> getCompanyIdByParkId(String identity, String parkId);

    /**
     * 根据类型和公司获取最大用量
     * @param identity 类型
     * @param companyId 公司ID
     * @return
     */
	TopCompanyVo getMaxValueByCID(String identity, String companyId);

    /**
     * 根据产品key和设备名称获取该设备的累计用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getTotalByKey(String identity, String productKey, String deviceName);

    /**
     * 根据产品key和设备名称获取该设备本月用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getThisMonthByKey(String identity, String productKey, String deviceName);

    /**
     * 根据设备类型获取本月之前的最后用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getBeforeCurrentMonthByKey(String identity, String productKey, String deviceName);

    /**
     * 根据产品key和设备名称获取该设备上月用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getLastMonthByKey(String identity, String productKey, String deviceName);

    /**
     * 根据设备类型获取上月之前的最后用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getBeforeLastMonthByKey(String identity, String productKey, String deviceName);

    /**
     * 根据产品key和设备名称获取该设备今日用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getTodayByKey(String identity, String productKey, String deviceName);

    /**
     * 根据设备类型获取今日之前的最后用量
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getBeforeTodayByKey(String identity, String productKey, String deviceName);

    /**
     * 根据设备类型获取一个小时前的数据
     * @param identity 类型
     * @param productKey 产品key
     * @param deviceName 设备编码
     * @return
     */
    String getRainfallHour(String identity, String productKey, String deviceName);


    /***************************** 3D/bi start *************************************/

    /**
     * 根据设备类型获取设备最新的一条数据
     * @param parkId
     * @param identity
     * @return
     */
    String getNewestWind(String parkId,String identity);

    /**
     * 获取土壤平均 PH值
     * @param parkId
     * @param identity
     * @return
     */
    Double getPhAvg(String parkId,String identity);

    /**
     * 获取今日24降雨量比例
     * @param parkId
     * @param identity
     * @return
     */
    List<Map<String,Object>> getHourRain(String parkId,String identity);

    /**
     * 获取今日指定小时最新值(最后一条数据)
     * @param parkId
     * @param identity
     * @param hour
     * @return
     */
    Map<String,Object> getHourNew(String parkId,String identity,Integer hour);

    /**
     * 根据ProductKey获取今日指定小时最新值(最后一条数据)
     * @param parkId
     * @param identity
     * @param hour
     * @param productKey
     * @return
     */
    Map<String,Object> getByProductKeyHourNew(String parkId,String productKey,String identity,Integer hour);


    /**
     * 根据园区id和identity获取设备最后一条数据
     * @param parkId
     * @param identity
     * @return
     */
    Map<String,Object> getNewDevice(String parkId,String identity);

    /**
     * 根据园区id和identity获取设备最后一条数据
     * @param parkId
     * @param identity
     * @return
     */
    Map<String,Object> getByProductKeyNewDevice(String parkId,String productKey,String identity);

    /**
     * 根据identity获取当月指定天平均值
     * @param parkId
     * @param identity
     * @param thisDay
     * @return
     */
    Double getByIdentityAvg(String parkId,String identity,Integer thisDay);

    /**
     * @Author 颜艺波 根据productKey获取对应场景的所有的设备
     * @param productKey  设备类型
     * @param parkId  园区Id
     * @param buildingId  楼栋Id
     * @param floorId  楼层Id
     * @return 对应场景的所有的设备
     */
    List<String> getProductNameBySceneId(String productKey, Long parkId, Long buildingId, Long floorId);

    /**
     * 获取设备今日最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 今日最高用量
     */
    String getTodayByProductName(String productKey, String productName, String identity);

    /**
     * 获取设备今日前的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 今日前的最高用量
     */
    String getBeforeTodayByProductName(String productKey, String productName, String identity);

    /**
     * 获取设备上月之前的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 上月之前的最高用量
     */
    String getBeforeLastMonthByProductName(String productKey, String productName, String identity);

    /**
     * 获取设备上月的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 上月的最高用量
     */
    String getLastMonthByProductName(String productKey, String productName, String identity);

    /**
     * 根据设备获取本月的最后用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 本月的最后用量
     */
    String getCurrentMonthByProductName(String productKey, String productName, String identity);

    /**
     * 获取设备上月每一天的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 设备上月每一天的最高用量
     */
    List<GetEnvironmentInfo> getMaxEachDayLastMonth(String productKey, String productName, String identity);

    /**
     * 获取设备今天每个时间点的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 今天每个时间点的最高用量
     */
    List<GetEnvironmentInfo> getMaxEachHourToday(String productKey, String productName, String identity);

    /**
     * 获取设备本月每天的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @return 设备本月每天的最高用量
     */
    List<GetEnvironmentInfo> getMaxEachDayThisMonth(String productKey, String productName, String identity);

    /**
     * 根据指定日期获取这一天的每小时最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @param thisDay 指定日期获取这一天的每小时最高用量
     * @return 这一天的每小时最高用量
     */
    List<GetEnvironmentInfo> getEachHourThisDay(String productKey, String productName, String identity, String thisDay);

    /**
     * 获取指定日期前的最高用量
     * @param productKey 设备类型
     * @param productName 设备名称
     * @param identity 标识
     * @param thisDay 获取指定日期前的最高用量
     * @return 指定日期前的最高用量
     */
    String getMaxBeforeThisDay(String productKey, String productName, String identity, String thisDay);

    /**
     * 根据时间戳获取该时间戳之前的最大用量
     * @param productKey
     * @param productName
     * @param identity
     * @param timestamp 时间戳(秒)
     * @return
     */
    String getMaxByTimestamp(String productKey, String productName, String identity, long timestamp);

    /**
     * 获取某个时间戳段内每个小时的最高用量
     * @param productKey
     * @param productName
     * @param identity
     * @param beginTimestamp 开始时间戳(秒)
     * @param endTimestamp 开始时间戳(秒)
     * @return
     */
    List<GetEnvironmentInfo> getMaxEachHourBetweenTimestamp(String productKey, String productName, String identity, long beginTimestamp
            , long endTimestamp);

    /**
     * 获取某个时间戳段内每一天的最高用量
     * @param productKey
     * @param productName
     * @param identity
     * @param beginTimestamp 开始时间戳(秒)
     * @param endTimestamp 开始时间戳(秒)
     * @return
     */
    List<GetEnvironmentInfo> getMaxEachDayBetweenTimestamp(String productKey, String productName, String identity, long beginTimestamp
            , long endTimestamp);

    /**
     * 根据类型、状态获取对应场景设备的总数
     * @param categoryCode 类型码
     * @param status 设备状态 0-在线，1-离线
     * @param parkId 园区Id
     * @param buildingId 楼栋Id
     * @param floorId 楼层Id
     * @param roomId 房间Id
     * @return 对应场景设备的总数
     */
    Integer getTotalDeviceByCategory(String categoryCode, Integer status, Long parkId, Long buildingId, Long floorId,
                                     Long roomId);

    /**
     * 根据设备类型获取设备列表
     * @param categoryCode 设备类型
     * @return 设备列表
     */
    List<DeviceListVO> getDeviceListByCategory(String categoryCode, Long parkId, Long buildingId, Long floorId,
                                               Long roomId);

    /**
     * 根据设备类型获取对应场景的设备总数
     * @param categoryCode 类型码
     * @param parkId 园区Id
     * @param buildingId 楼栋Id
     * @param floorId 楼层Id
     * @param roomId 房间Id
     * @return 设备总数
     */
    Integer getDeviceDistribution(String categoryCode, Long parkId, Long buildingId,
                                                     Long floorId, Long roomId);

    /**
     * 根据设备类型获取对应场景的告警列表
     * @param categoryCode 类型码
     * @param parkId 园区Id
     * @param buildingId 楼栋Id
     * @param floorId 楼层Id
     * @param roomId 房间Id
     * @return 告警列表
     */
    List<AlarmListVO> getAlarmList(String categoryCode, Long parkId, Long buildingId,
                                   Long floorId, Long roomId);
}
