package com.njcn.device.line.mapper;


import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.dto.SimpleDTO;
import com.njcn.device.biz.pojo.dto.LineDTO;
import com.njcn.device.biz.pojo.dto.LineDevGetDTO;
import com.njcn.device.biz.pojo.dto.PollutionLineDTO;
import com.njcn.device.pq.pojo.advanced.UpDevVO;
import com.njcn.device.pq.pojo.bo.BaseLineInfo;
import com.njcn.device.pq.pojo.bo.DeviceType;
import com.njcn.device.pq.pojo.bo.excel.TerminalBaseExcel;
import com.njcn.device.pq.pojo.dto.*;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.param.LineBaseQueryParam;
import com.njcn.device.pq.pojo.param.TerminalMainQueryParam;
import com.njcn.device.pq.pojo.po.Device;
import com.njcn.device.pq.pojo.po.Line;
import com.njcn.device.pq.pojo.po.LineDetail;
import com.njcn.device.pq.pojo.po.Voltage;
import com.njcn.device.pq.pojo.vo.*;
import com.njcn.web.pojo.vo.LineDataVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

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

/**
 * <p>
 * Mapper 接口
 * </p>
 *
 * @author cdf
 * @since 2022-01-04
 */
public interface LineMapper extends BaseMapper<Line> {

    /**
     * 查询变电站下面的装置
     *
     * @author cdf
     * @date 2022/1/5
     */
    List<Device> getDeviceBySubId(@Param("subId") String subId, @Param("list") List<String> ipList);

    /**
     * 查询变电站下面的装置
     *
     * @author cdf
     * @date 2022/1/5
     */
    List<Device> getDeviceBySubIdForUpdate(@Param("subId") String subId, @Param("ipList") List<String> ipList, @Param("devList") List<String> devList);

    /**
     * 查询装置下的监测点完整信息
     *
     * @author cdf
     * @date 2022/1/6
     */
    List<LineDetail> getLineDetailByDeviceId(@Param("devId") String devId);

    /**
     * 查询装置下的母线信息
     *
     * @param devId 设备id
     * @date 2022/7/1
     */
    List<Voltage> getVoltageByDevId(@Param("devId") String devId);


    /**
     * 通过监测点id获取母线详情
     *
     * @author cdf
     * @date 2022/1/6
     */
    Voltage getVoltageByLineId(@Param("lineId") String lineId);


    /**
     * 返回所有树节点（全部pq_line表数据）
     *
     * @author cdf
     * @date 2022/1/13
     */
    List<TerminalTree> getAllList();

    /**
     * 获取区域
     *
     * @return TerminalTree 终端树数据
     * @author cdf
     * @date 2022/2/14
     */
    List<TerminalTree> getProvinceList(@Param("pids") List<String> pids, @Param("type") Integer type);


    List<MonitorInfoDTO> getLineListByIds(@Param("ids") List<String> ids);

    /**
     * 返回未绑定的监测点
     */
    List<TerminalTree> getUnBindList();

    /**
     * 返回省份的上级
     */
    List<String> selectProject(@Param("areaId") String areaId);

    /**
     * @param areaId
     * @return 返回省份名称
     */
    String getProviceName(@Param("areaId") String areaId);


    /**
     * 根据终端id,获取所有对应终端
     *
     * @param devIds     终端id
     * @param deviceType 终端条件筛选
     * @return 终端数据
     */
    List<Line> getDeviceById(@Param("devIds") List<String> devIds, @Param("deviceType") DeviceType deviceType);


    /**
     * 获取离线装置
     *
     * @author cdf
     * @date 2023/4/3
     */
    List<TerminalBaseVO> getDeviceByIdOnOrOff(@Param("devIds") List<String> devIds, @Param("deviceType") DeviceType deviceType, @Param("comFlag") Integer comFlag);


    List<LineDataVO> getLineDetail(@Param("ids") List<String> ids);

    /**
     * 根据监测点id，获取所有监测点
     *
     * @param ids             监测点id
     * @param deviceInfoParam 监测点查询条件
     * @return 监测点数据
     */
    List<Line> getLineByCondition(@Param("ids") List<String> ids, @Param("deviceInfoParam") DeviceInfoParam deviceInfoParam);

    List<Line> getLineByConditionBySearchValue(@Param("ids") List<String> ids, @Param("deviceInfoParam") DeviceInfoParam deviceInfoParam);

    /**
     * 查询终端信息
     *
     * @param devIds       终端索引
     * @param deviceType   终端筛选条件
     * @param manufacturer 终端厂家
     */
    List<Line> getDeviceByCondition(@Param("devIds") List<String> devIds, @Param("deviceType") DeviceType deviceType, @Param("deviceInfoParam") DeviceInfoParam manufacturer);

    /**
     * 查询母线信息
     *
     * @param voltageIds 母线索引
     * @param scale      电压等级
     */
    List<Line> getVoltageByCondition(@Param("voltageIds") List<String> voltageIds, @Param("scale") List<SimpleDTO> scale);

    /**
     * 查询母线id
     *
     * @param voltageIds 母线索引集合
     * @param scale      电压等级
     */
    List<String> getVoltageIdByScale(@Param("voltageIds") List<String> voltageIds, @Param("scale") String scale);

    /**
     * 查询变电站id
     *
     * @param subIds 变电站索引集合
     * @param scale      电压等级
     */
    List<String> getSubIdByScale(@Param("subIds") List<String> subIds, @Param("scale") String scale);

    /**
     * 查询监测点id
     *
     * @param lineIds  监测点索引集合
     * @param loadType 干扰源类型
     */
    List<String> getLineIdByLoadType(@Param("lineIds") List<String> lineIds, @Param("loadType") String loadType);


    /**
     * 查询终端id
     *
     * @param deviceIds    终端索引集合
     * @param manufacturer 制造厂家
     */
    List<String> getDeviceIdByManufacturer(@Param("deviceIds") List<String> deviceIds, @Param("manufacturer") String manufacturer);


    /**
     * 根据监测点集合查询基础信息
     *
     * @param lineIndex 监测点结合
     * @return 基础信息
     */
    List<BaseLineInfo> getBaseLineInfo(@Param("list") List<String> lineIndex);


    /**
     * 获取监测点区域详细信息(原基础上添加监测点区域经纬度信息)
     *
     * @param lineIndex 监测点结合
     * @date 2022/6/29
     */
    List<AreaLineInfoVO> getBaseLineAreaInfo(@Param("list") List<String> lineIndex, @Param("searchValue") String searchValue, @Param("comFlag") Integer comFlag);

    List<LineInfoMonitorIdVO> getBaseLineInfoMonitorIdInfo(@Param("list") List<String> lineIndex);

    /**
     * 返回监测点信息及通讯状态
     *
     * @param lineIndex 监测点集合
     * @return 结果
     */
    List<LineDeviceStateVO> getLineDeviceStateVO(@Param("list") List<String> lineIndex);


    /**
     * 获取变电站信息
     *
     * @param id 变电站id
     * @return 结果
     */
    PollutionSubstationDTO getSubstationInfo(@Param("id") String id);

    /**
     * 获取监测点信息
     *
     * @param list 监测点集合
     * @return 结果
     */
    List<PollutionLineDTO> getLineInfo(@Param("list") List<String> list);

    /**
     * 获取监测点信息
     *
     * @param id 监测点id
     * @return 结果
     */
    LineDetailVO getLineSubGdDetail(@Param("id") String id);

    /**
     * 获取告警变电站信息
     *
     * @param list 变电站集合
     * @return 结果
     */
    List<WarningSubstationDTO> getWarningSub(@Param("list") List<String> list);

    /**
     * 获取监测点信息
     *
     * @param list 变电站集合
     * @return 结果
     */
    List<OverLimitLineDTO> getOverLimitLineInfo(@Param("list") List<String> list);

    /**
     * 获取监测点状态信息
     *
     * @param list 变电站集合
     * @return 结果
     */
    LineStateVO getLineStatisticsDetail(@Param("list") List<String> list);

    /**
     * 获取监测点信息
     *
     * @param list 变电站集合
     * @return 结果
     */
    List<LineStatisticsTableVO> getLineInfoByTableList(@Param("list") List<String> list);

    /**
     * 获取监测点信息
     *
     * @param list 变电站集合
     * @return 结果
     */
    List<LineFlowMealDetailVO> getFlowLineInfoByTableList(@Param("list") List<String> list);

    /**
     * 获取监测点信息
     *
     * @param list 变电站集合
     * @return 结果
     */
    List<LineStatisticsTableVO> getLineStatisticsTableData(@Param("list") List<String> list);

    /**
     * 监测点运行统计
     *
     * @param list      监测点集合
     * @param startTime 起始时间
     * @param endTime   结束时间
     * @return 结果
     */
    List<LineFlowMealDetailVO> getLineRunStatistics(@Param("list") List<String> list, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 监测点运行统计
     *
     * @param list      监测点集合
     * @param startTime 起始时间
     * @param endTime   结束时间
     * @return 结果
     */
    List<LineFlowMealDetailVO> getFlowLineRunStatistics(@Param("list") List<String> list, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 获取生成limitRate表的监测点集合
     *
     * @return 监测点id集合
     */
    List<String> getLineList();


    /**
     * 导出终端台账信息
     *
     * @author cdf
     * @date 2022/5/17
     */
    List<TerminalBaseExcel> getTerminalBaseExcel();

    /**
     * 根据监测点id获取终端id
     *
     * @param lineId 监测点id
     * @return 结果
     */
    String getDevIndex(@Param("lineId") String lineId);

    /**
     * 获取变电站下母线
     *
     * @param subId 变电站id
     * @return 结果
     * @author cdf
     * @date 2022/7/4
     */
    List<Line> getVoltageListBySubId(@Param("subId") String subId, @Param("voltageName") List<String> voltageName);

    /**
     * 获取生成在线率的装置Id
     *
     * @return 装置Id
     */
    List<String> getDeviceList();

    /**
     * 获取当前状态在线的监测点数量
     *
     * @return Integer 在线监测点数量
     */
    Integer getOnLineCount(@Param("lineIds") List<String> lineIds);

    /**
     * 获取当前状态在线和离线的监测点
     *
     * @return 在线或离线监测点ids
     */
    List<String> getOnOrUnLine(@Param("list") List<String> lineIds, @Param("comFlag") Integer comFlag);

    /**
     * @Description: 获取变电站id和监测点id用
     * @Param: [devDataType]
     * @return: java.util.List<com.njcn.device.pq.pojo.po.Line>
     * @Author: clam
     * @Date: 2022/10/20
     */
    @Select("SELECT\n" +
            "\tpq_line.Id,\n" +
            "\tSUBSTRING_INDEX(\n" +
            "\t\tSUBSTRING_INDEX(pq_line.Pids, ',', 4),\n" +
            "\t\t',' ,- 1\n" +
            "\t) AS Pids\n" +
            "FROM\n" +
            "\tpq_line,\n" +
            "\tpq_device\n" +
            "WHERE\n" +
            "\tpq_line.Level = 6\n" +
            "AND SUBSTRING_INDEX(\n" +
            "\tSUBSTRING_INDEX(pq_line.Pids, ',', 5),\n" +
            "\t',' ,- 1\n" +
            ") = pq_device.Id\n" +
            "AND (\n" +
            "\tpq_device.Dev_Data_Type = 2\n" +
            "\tOR pq_device.Dev_Data_Type = #{devDataType}\n" +
            ") ")
    List<Line> getLineBySubstationRelation(@Param("devDataType") Integer devDataType);


    @Select({"<script>",
            "SELECT\n" +
                    "\tcount(1)\n",
            "FROM\n",
            "\t(\n",
            "\t\tSELECT\n",
            "\t\t\ta.pid\n",
            "\t\tFROM\n",
            "\t\t\tpq_line a\n",
            "\t\tINNER JOIN pq_device b ON a.id = b.id\n",
            "where b.com_flag = 1 and a.Pid in",
            "<foreach item='item' index='index' collection='items' open='(' separator=',' close=')'>",
            "#{item}",
            "</foreach>",
            "\t\tGROUP BY\n",
            "\t\t\ta.pid\n",
            "\t) TEMPTABLE\n",
            "</script>"
    })
    Integer queryOnlineSubstaion(@Param("items") List<String> deviceIds);

    LineStateVO getDeviceStatus(List<String> deviceIndexes);

    List<LineFlowMealDetailVO> getDeviceRunStatistics(@Param("list") List<String> list, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    Page<LineFlowMealDetailVO> getNewDeviceRunStatistics(Page<LineFlowMealDetailVO> page, @Param("devs") List<String> list, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    Page<LineFlowMealDetailVO> getNewDeviceFlowStatistics(Page<LineFlowMealDetailVO> page, @Param("devs") List<String> list, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);


    /**
     * 通过电站id获取监测点信息
     *
     * @author cdf
     * @date 2023/5/10
     */
    List<LineDevGetDTO> getLineBySubStation(@Param("subId") String subId);


    /**
     * 根据监测点集合获取监测详细信息
     * @author cdf
     * @date 2023/9/20
     */
    List<LineDevGetDTO> getMonitorListDetail(@Param("monitorIds") List<String> monitorIds);


    List<LineDetailDataVO> getLineDetailDataVO(@Param("monitorIds") List<String> monitorIds);

    /**
     * 根据条件进行监测筛选出监测点id
     *
     * @author wr
     * @date 2023/5/25
     */
    List<String> getLineByIDs(@Param("searchValue") String searchValue);

    /**
     * 通过电站id集合，和电压等级
     *
     * @author cdf
     * @date 2023/5/10
     */
    List<Line> getSubStations(@Param("subId") List<String> subId, @Param("scale") List<String> scale);


    /**
     * 根据变电站获取母线信息(变电站策略专用)
     *
     * @param subId
     * @param type  （0是除了本变电站所有变电站母线信息 1是获取本变电站所有母线信息 2是根据母线获取信息）
     * @return
     */
    List<TerminalTree> getvoltage(@Param("id") String subId, @Param("type") Integer type);


    /**
     * 根据监测点id获取终端信息
     *
     * @param lineId 监测点id
     * @return 结果
     */
    UpDevVO getDevInfo(@Param("lineId") String lineId);


    /**
     * 根据终端id或者或者监测id，查询前置表ip信息
     *
     * @param devID 终端id
     * @param type  终端=1 监测点=0
     * @return 结果
     */
    String getNodeIp(@Param("devID") String devID, @Param("type") Integer type);

    /**
     * 根据监测点集合获取终端数量
     *
     * @param lineId 监测点id
     * @return 结果
     */
    Integer getDevIndexs(@Param("lineIds") Set<String> lineId);


    /**
     * 根据终端id集合查询终端版本信息
     * @param devIds
     * @return
     */
    List<DeviceIpRVO> getDevicesIp(@Param("devIds") List<String> devIds);

    /**
     * @Description: 监测点半月报功能
     * @param
     * @return: java.util.List<com.njcn.device.pq.pojo.vo.DeviceIpRVO>
     * @Author: wr
     * @Date: 2023/8/29 12:50
     */
    Page<HalfReportVO> selectHalfReport(Page page,@Param("param") TerminalMainQueryParam param,@Param("deptIdList") List<String> deptIdList);

    /**
     * @Description: 根据监测点id获取监测点信息
     * @param id
     * @return: com.njcn.device.biz.pojo.dto.LineDTO
     * @Author: wr
     * @Date: 2023/9/22 10:20
     */
    LineDTO selectLineDetail(@Param("id") String id);

    /**
     * @Description: 根据监测点id批量获取监测点信息
     */
    List<LineDTO> selectLineDetailBatch(@Param("ids") List<String> ids);


    Map<String,String> getCustomDetailByLineId(@Param("lineId")String lineId);


    /**
      * @Description: 获取监测点集合信息
      * @Author: wr
      * @Date: 2023/11/3 14:37
      */
    List<LineDetailVO.Detail> selectByIds(@Param("ids") List<String> ids);


    List<String> getDeviceIdByPowerFlag(@Param("lineIds")List<String> lineIds, @Param("powerFlag")Integer manufacturer);

    List<String> getDeviceIdByJbPowerFlag(@Param("lineIds")List<String> lineIds, @Param("powerFlag")Integer manufacturer);

    DeviceVO getDeviceDetailData(@Param("id")String id);

    List<LineDetailVO.Detail> getDeptDeviceDetailData(@Param("ids")List<String> ids,
                                           @Param("searchValue")String searchValue,
                                           @Param("type")Integer type);

    LineDetailVO getLineInfoVO(@Param("id")String id);

    List<LineDetailVO.noDataLineInfo> getNoDataLine(@Param("time")String time);

    List<ReportLineInfoVo> getReportLineInfo(@Param("ids")List<String> ids);

    List<Line> getSubByCondition(@Param("subIds") List<String> subIds, @Param("scale") List<SimpleDTO> scale);

    List<LineDetail> selectByName(@Param("param") LineBaseQueryParam param);

    List<MonitorInfo> getLineByDeviceId(@Param("id") String id);

    List<TerminalTree> getLineAndLineDetail();


    List<DevDetailVO> getLineDeviceByDevIds(@Param("powerFlag") Integer powerFlag,
                                            @Param("lineIds") List<String> lineIds,
                                            @Param("devIds") List<String> devIds);

    /**
     * 根据Pid获取所有子节点
     */
    List<String> getSubIdByPid(@Param("pid") String pid);


    /**
     * 根据监测点id获取终端id
     *
     * @param ids 监测点集合
     * @return 结果
     */
    List<String> getDevIdsLine(@Param("ids") List<String> ids);
}
