package com.njcn.device.common.service;

import com.njcn.common.pojo.dto.SimpleDTO;
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.PreCommandDTO;
import com.njcn.device.pq.pojo.dto.PushResultDTO;
import com.njcn.device.pq.pojo.param.*;
import com.njcn.device.pq.pojo.po.Line;
import com.njcn.device.pq.pojo.vo.LineWiringDiagramVO;
import com.njcn.device.pq.pojo.vo.TerminalBaseVO;
import com.njcn.device.pq.pojo.vo.TerminalVO;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * pqs
 *
 * @author cdf
 * @date 2022/1/4
 */
public interface TerminalBaseService {

    /**
     * 新增终端
     *
     * @author cdf
     * @date 2021/7/6
     */
    boolean addTerminal(AddTerminalParam addTerminalParam);

    /**
     * 终端修改操作
     *
     * @author cdf
     * @date 2021/7/20
     */
    Boolean updateTerminal(UpdateTerminalParam updateTerminalParam);

    /**
     * 终端查询操作
     * @param id 设备id
     * @author cdf
     * @date 2021/7/19
     */
    TerminalVO queryTerminal(String id,Integer level);

    /**
     * 终端查询操作
     * @param devName 设备名称
     * @author cdf
     * @date 2021/7/19
     */
    Line queryTerminalByName(String devName);

    /**
     * 终端删除操作
     * @param id 设备id
     * @author cdf
     * @date 2021/7/21
     */
    Boolean delTerminal(String id);

    /**
     * 根据变电站id，获取所有变电站
     *
     * @param substationIds 监测点id
     * @return 变电站信息
     */
    List<Line> getSubstationByIds(List<String> substationIds,List<String> scale);

    /**
     * 根据监测点id，获取所有监测点
     *
     * @param lineIds 监测点id
     * @return 监测点数据
     */
    List<Line> getLineById(List<String> lineIds);

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

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

    /**
     * 根据终端id,获取所有对应终端
     *
     * @param devIds     终端id
     * @param deviceType 终端条件筛选
     * @param comFlag 是否中断标志
     * @return 终端数据
     */
    List<TerminalBaseVO> getDeviceByIdOnOrOff(List<String> devIds, DeviceType deviceType, Integer comFlag);




    /**
     * 功能描述: 根据id查询变电站信息
     *
     * @param list
     * @return java.util.List<com.njcn.device.pq.pojo.po.Line>
     * @author xy
     * @date 2022/2/21 18:47
     */
    List<Line> getSubstationById(List<String> list);


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

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

    /**
     * 查询变电站信息
     *
     * @param subIds    变电站索引
     * @param scale     电压等级
     */
    List<Line> getSubByCondition(List<String> subIds, List<SimpleDTO> scale);

    /**
     * 根据指定电压等级查询母线id
     *
     * @param voltageIds 母线id
     * @param scale      电压等级
     */
    List<String> getVoltageIdByScale(List<String> voltageIds, String scale);

    /**
    * 根据指定电压等级查询母线id
    * @param subIds
    * @param scale
    * @return: java.util.List<java.lang.String>
    * @Author: wr
    * @Date: 2024/10/12 15:58
    */
    List<String> getSubIdByScale(List<String> subIds, String scale);

    /**
     * 根据干扰源获取对应的监测点id
     *
     * @param lineIds  监测点id
     * @param loadType 干扰源类型
     */
    List<String> getLineIdByLoadType(List<String> lineIds, String loadType);

    /**
     * 根据终端厂家获取对应的终端id
     *
     * @param deviceIds    终端id
     * @param manufacturer 终端厂家
     */
    List<String> getDeviceIdByManufacturer(List<String> deviceIds, String manufacturer);
    /**
     * 根据监测点性质获取监测信息
     *
     * @param lineIds    监测点id
     * @param manufacturer 监测点性质
     */
    List<String> getDeviceIdByPowerFlag(List<String> lineIds, Integer manufacturer);

    List<String> getDeviceIdByJbPowerFlag(List<String> lineIds, Integer powerFlag);


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

    /**
     * 将原始数据导入新库
     * @param file 原始数据信息
     */
    String importOracleTerminalData(MultipartFile file, HttpServletResponse response);

    /**
     * 导出台账
     * @author cdf
     * @date 2022/5/17
     */
    List<TerminalBaseExcel> exportTerminalBase();

    /**
     * 导出台账模板
     * @author cdf
     * @date 2022/5/17
     */
    void downTerminalTemplate(HttpServletResponse response);

    /**
     * 导出台账生成的excel(离线装置)
     * @author zbj
     * @date 2023/4/26
     */
    void downTerminalAutonomeTemplate(HttpServletResponse response);

    /**
     * 将台账数据导入终端相关表
     * @param file 原始数据信息
     */
    void importTerminalBase(MultipartFile file, HttpServletResponse response);


    Integer updatePqOverLimit();

    /**
     * 监测点主接线图上传
     * @author cdf
     * @date 2023/6/15
     */
    Boolean wiringDiagramUpload(MultipartFile[] files,String lineId);


    /**
     * 监测点主接线图展示
     * @author cdf
     * @date 2023/6/15
     */
    List<LineWiringDiagramVO> wiringDiagramShow(String lineId);

    /**
     * 监测点主接线图展示
     * @author cdf
     * @date 2023/6/15
     */
    boolean wiringDiagramChange(MultipartFile file,String lineId,String wiringDiagramName);

    /**
     * 监测点主接线图删除
     * @author cdf
     * @date 2023/6/15
     */
    boolean wiringDiagramDel(String lineId,String wiringDiagramName);
    /** 
    * @Description: 临时表数据同步到台账表
    * @Param:  
    * @return: void 
    * @Author: clam
    * @Date: 2024/5/29 
    */
    String terminalSync(SyncTerminalParam syncTerminalParam);

    /**
     * 监测点和装置同步成运行状态
     * @param lineId
     * @return
     */
    Boolean terminalSyncRunFly(String lineId);

    /**
     * 监测数据删除
     * @param lineId
     * @return
     */
    Boolean terminalSyncDeleteFly(String lineId);

    //通知前置重启设备
//    void askRestartProcess(Integer processNo,String processType,String deviceRebootType);

//    void askRestartDevice(List<String> devId, String deviceRebootType,Integer processNo);

    List<PreCommandDTO> ledgerChangePush();

    PushResultDTO getPushResult(String guid);


    void askRestartProcess( RestartParam restartParam);
}
