package com.yfd.platform.modules.patroltask.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.modules.patroltask.domain.TaskDolog;
import com.yfd.platform.modules.patroltask.domain.TaskResult;
import com.yfd.platform.modules.patroltask.domain.TaskTodo;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 巡视任务执行表 服务类
 * </p>
 *
 *
 * @since 2023-04-08
 */
public interface ITaskTodoService extends IService<TaskTodo> {

    /**********************************
     * 用途说明: 查询巡视任务执行情况详情
     * 参数说明 taskTodoId
     * 返回值说明: java.util.Map<java.lang.String,java.lang.Object>
     ***********************************/
    Map<String, Object> getTaskToDo(String taskTodoId);

    /**********************************
     * 用途说明: 分页查询巡视任务执行情况（前台）
     * 参数说明 page
     * 参数说明 startDate
     * 参数说明 endDate
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getTaskImplementation(Page<Map<String, Object>> page, String stationCode,
                                                    String currentDate, String startDate, String endDate, String taskState, String taskName);

    TaskTodo doCurrentTask(String taskTodoId,String optType) throws InterruptedException;

    List<Map<String,Object>> queryTaskResult(String taskTodoId);

    int queryExaminePlan(String deviceid, String planStartTime);

    boolean updateTaskResultStatus(String todotaskid, String taskresultid, String imagefilename, String flag);

    boolean updateTaskResult(TaskResult taskResult);

    boolean pauseLowerTask(String stationcode, String todotaskid, String priority);

    void sendTaskResult(TaskTodo taskTodo, TaskResult taskResult);

    /**********************************
     * 用途说明: 任务开始前，判断是否有任务等级大于等于当前任务的，有就暂停当前任务
     * 参数说明 stationCode
     * 参数说明 taskTodoId
     * 参数说明 priority
     * 返回值说明: boolean
     ***********************************/
    boolean pauseUpperTask(String stationCode, String taskTodoId, String priority);

    boolean resumeLowerTask(String stationcode, String todotaskid, String priority,String custom3) throws InterruptedException;

    boolean recordTaskDoLog(TaskDolog taskDolog);

    /**********************************
     * 用途说明: 查询巡视任务执行情况统计（前台）
     * 参数说明 page
     * 参数说明 startDate
     * 参数说明 endDate
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    List<Map<String, Object>> getTaskToDoStatList(String stationCode, String currentDate, String startDate,
                                                  String endDate, String taskName);

    /**********************************
     * 用途说明: 分页查询巡视报告
     * 参数说明 stationCode 变电站编号
     * 参数说明 type 巡视类型
     * 参数说明 startDate 开始时间
     * 参数说明 endDate 结束时间
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    Page<Map<String, Object>> getTaskReportList(Page<Map<String, Object>> page, String stationCode, String areaId,
                                                String taskName, String type, String startDate, String endDate,
                                                String bayId, String patrolType);

    /**********************************
     * 用途说明: 根据任务执行情况查询任务结果
     * 参数说明 taskTodoId 任务执行情况id
     * 返回值说明: java.util.List<com.yfd.platform.modules.patroltask.domain.TaskResult>
     ***********************************/
    List<Map<String, Object>> getTaskResultById(String taskTodoId,String areaId,String bayId,String mainDeviceId);

    /**********************************
     * 用途说明: 异常点位查询
     * 参数说明 page
     * 参数说明 taskTodoIds
     * 参数说明 taskName
     * 参数说明 deviceName
     * 参数说明 patroldeviceName
     * 参数说明 componentName
     * 参数说明 recognitionType
     * 参数说明 status
     * 参数说明 startDate
     * 参数说明 endDate
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getAbnormalDeviceList(Page<Map<String, Object>> page, String stationCode, String areaId,
                                                    String bayId,
                                                    String taskName,
                                                    String deviceName, String patroldeviceName,
                                                    String componentName, String recognitionType, String status,
                                                    String startDate, String endDate);

    /**********************************
     * 用途说明: 导出异常点位
     * 参数说明 records
     * 参数说明 response
     * 返回值说明: void
     ***********************************/
    void exportAbnormalDevice(List<Map<String, Object>> records, HttpServletResponse response) throws IOException;

    /**********************************
     * 用途说明: 根据任务执行情况ID查询点位查询
     * 参数说明 page
     * 参数说明 taskTodoId
     * 参数说明 valid
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getTaskDeviceList(Page<Map<String, Object>> page, String taskTodoId, String deviceName, String valid);

    /**********************************
     * 用途说明: 查询点位历史曲线
     * 参数说明 deviceId
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getHistoricalCurve(String deviceId);

    /**********************************
     * 用途说明: 根据巡视任务执行情况ID查看详情
     * 参数说明 taskTodoId
     * 返回值说明: java.util.Map<java.lang.String,java.lang.Object>
     ***********************************/
    Map<String, Object> getTaskTodoById(String taskTodoId,String areaId,String bayId,String mainDeviceId);

    /**********************************
     * 用途说明: 查询主设备所关联的点位
     * 参数说明 ids
     * 参数说明 meterType
     * 参数说明 recognitionType
     * 参数说明 startDate
     * 参数说明 endDate
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getDeviceByMainDevice(String mainDeviceId, String meterType, String recognitionType, String startDate, String endDate);

    /**********************************
     * 用途说明: 修正巡视结果
     * 参数说明 taskResult
     * 返回值说明: boolean
     ***********************************/
    boolean updateTaskResultById(TaskResult taskResult);

    /**********************************
     * 用途说明: 数据对比分析列表
     * 参数说明 page
     * 参数说明 deviceId
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    Page<Map<String, Object>> getTaskResultList(Page<Map<String, Object>> page, String deviceId,String startDate, String endDate);

    /**********************************
     * 用途说明: 数据对比分析曲线
     * 参数说明 deviceId
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    Map<String, Object> getAnalysisCurve(String deviceId, String startDate, String endDate);

    /**********************************
     * 用途说明: 导出数据对比分析列表
     * 参数说明 records
     * 参数说明 response
     * 返回值说明: void
     ***********************************/
    void exportTaskResultList(List<Map<String, Object>> records,String exportFields, HttpServletResponse response) throws IOException;

    /**********************************
     * 用途说明: 导出异常点位(导出全部)
     * 参数说明 page
     * 参数说明 taskTodoId
     * 参数说明 valid
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    List<Map<String, Object>> getAbnormalDevice(String stationCode, String taskName,
                                                String deviceName, String patroldeviceName,
                                                String componentName, String recognitionType, String status,
                                                String startDate, String endDate);

    /**********************************
     * 用途说明: 数据对比分析列表(查询符合条件的所有)
     * 参数说明 page
     * 参数说明 deviceId
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    List<Map<String, Object>> getTaskResultAll(String deviceId, String startDate, String endDate);

    /**********************************
     * 用途说明: 获取当前时间最近的数据行
     * 参数说明
     * 返回值说明: long
     ***********************************/
    long getLastTimePosition(String stationCode,String taskName, String startDate, String endDate,String taskState);

    /**********************************
     * 用途说明: 更新摄像机工作状态
     * 参数说明  stationcode 变电站编号,patroldeviceCcode 摄像机编号  working  1=巡视中 0=空闲
     * 返回值说明: long
     ***********************************/
    boolean updatePatrolDeviceState(String stationcode, String patroldeviceCcode, String working);

    /**********************************
     * 用途说明: 根据任务执行情况ID查询点位查询
     * 参数说明 taskTodoId
     * 参数说明 deviceName
     * 参数说明 valid
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getTaskDeviceById(String taskTodoId, String deviceName, String valid);

    /**********************************
     * 用途说明: 查询联动任务列表
     * 参数说明 page
     * 参数说明 stationCode
     * 参数说明 linkageDeviceName
     * 参数说明 taskName
     * 参数说明 linkageType
     * 参数说明 linkageDeviceType
     * 参数说明 startFormat
     * 参数说明 endFormat
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getLinkTaskTodoList(Page<Map<String, Object>> page, String stationCode,
                                                  String linkageDeviceName, String taskName, String linkageType,
                                                  String linkageDeviceType, String startDate, String endDate);

    /**********************************
     * 用途说明: 获取点位数量
     * 参数说明 taskTodoId
     * 返回值说明: long
     ***********************************/
    long getTaskResultCount(String taskTodoId);

    /**********************************
     * 用途说明: 获取异常点位
     * 参数说明 taskTodoId
     * 返回值说明: 任务结果结果集合
     ***********************************/
    List<TaskResult> getAbnormalResult(String taskTodoId);

    /**********************************
     * 用途说明: 巡视设备巡检统计
     * 参数说明 page
     * 参数说明 patrolDeviceCode
     * 参数说明 patrolDeviceName
     * 参数说明 type
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getDeviceInspectionStat(Page<Map<String, Object>> page, String patrolDeviceCode,
                                                      String patrolDeviceName, String type);

    /**********************************
     * 用途说明: 巡视设备巡检统计（上报上级）
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    List<Map<String, Object>> getDeviceInspectionStat();

    /**********************************
     * 用途说明: 巡视任务数据统计
     * 参数说明 page
     * 参数说明 type
     * 参数说明 startDate
     * 参数说明 endDate
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getTaskDataStat(Page<Map<String, Object>> page, String stationCode, String type,
                                              String startDate,
                                              String endDate);

    /**********************************
     * 用途说明: 巡视任务数据统计
     * 参数说明 page
     * 参数说明 type
     * 参数说明 startDate
     * 参数说明 endDate
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getTaskDataStat(String stationCode, String type, String startDate, String endDate);

    /**********************************
     * 用途说明: 根据任务id查询未审核告警和数量
     * 参数说明 taskTodoIds
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getNotCheckAlarmInfo(String taskTodoIds);

    /**********************************
     * 用途说明: 设置实物ID
     * 参数说明 resultId
     * 参数说明 filePath
     * 返回值说明: void
     ***********************************/
    void setMaterialIdByImg(String resultId, String filePath);

    /**********************************
     * 用途说明: 调用温度的sdk识别并给图片加上温度
     * 参数说明 resultId
     * 参数说明 objectId
     * 参数说明 patrolDeviceCode
     * 参数说明 fullfilename
     * 返回值说明: com.alibaba.fastjson.JSONObject
     ***********************************/
    JSONObject callPicAnalyse(String resultId, String objectId, String patrolDeviceCode, String rtspurl, String fullfilename,
                              String region, String csvFilePath) throws IOException;

    /**********************************
     * 用途说明: 调用声音检测程序
     * 参数说明 resultId
     * 参数说明 objectId
     * 参数说明 fullfilename
     * 返回值说明: com.alibaba.fastjson.JSONObject
     ***********************************/
    JSONObject callSoundAnalyse(String resultId, String objectId) throws IOException;

    /**********************************
     * 用途说明: 设置请求分析主机调用失败的任务为巡视失败
     * 参数说明 stationCode
     * 参数说明 resultId
     * 参数说明 deviceSumnum
     * 参数说明 taskTodoId
     * 返回值说明: void
     ***********************************/
    void setTaskResultAndTodo(String stationCode, String resultId, Integer deviceSumnum, String taskTodoId);

    /**********************************
     * 用途说明: 查询联动任务最近十条
     * 参数说明 linkageType 联动类型
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getLinkTaskRecordLast(String stationCode, String linkageType,String taskName);

    /**********************************
     * 用途说明: 查询联动控制巡视任务
     * 参数说明 stationCode
     * 参数说明 todoId
     * 参数说明 linkageType
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getLinkTaskTodo(String stationCode, String todoId, String linkageType);

    /**********************************
     * 用途说明: 按照日、周、月统计巡视任务
     * 参数说明 type
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getTaskDurationStat(String startDate, String endDate, String type);

    /**********************************
     * 用途说明: 按照日、周、月统计巡视任务导出
     * 参数说明 startDate
     * 参数说明 endDate
     * 参数说明 type
     * 参数说明 response
     * 返回值说明: void
     ***********************************/
    void exportTaskDurationStat(String startDate, String endDate, String type, HttpServletResponse response) throws IOException;

    /**********************************
     * 用途说明: 巡视任务数据统计
     * 参数说明 page
     * 参数说明 stationCode
     * 参数说明 type
     * 参数说明 startDate
     * 参数说明 endDate
     * 参数说明 response
     * 返回值说明: void
     ***********************************/
    void exportTaskDataStat(Page<Map<String, Object>> page, String stationCode, String type, String startDate,
                            String endDate, HttpServletResponse response) throws IOException;

    /**********************************
     * 用途说明: 获取历史点位
     * 参数说明 startDate 开始时间
     * 参数说明 endDate 结束时间
     * 参数说明 deviceId 点位id
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getHistoryDevice(Page<Map<String, Object>> page, String startDate, String endDate, String deviceId);

    /**********************************
     * 用途说明: 查询非同源对比分析列表
     * 参数说明 stationCode 变电站编号
     * 参数说明 taskName 任务名称
     * 参数说明 mainDeviceName 主设备名称
     * 参数说明 componentName 部件名称
     * 参数说明 recognitionType 识别类型
     * 参数说明 startFormat 开始时间
     * 参数说明 endFormat 结束时间
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getNonHomologousAnalysis(String stationCode, String taskName, String mainDeviceName, String componentName, String recognitionType, String startFormat, String endFormat);

    /**********************************
     * 用途说明: 查询非同相对比分析列表
     * 参数说明 stationCode 变电站编号
     * 参数说明 taskName 任务名称
     * 参数说明 mainDeviceName 主设备名称
     * 参数说明 componentName 部件名名称
     * 参数说明 recognitionType 识别类型
     * 参数说明 startFormat 开始时间
     * 参数说明 endFormat 结束时间
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    List<Map<String, Object>> getNonCoherentAnalysis(String stationCode, String taskName, String mainDeviceName, String componentName, String recognitionType, String startFormat, String endFormat);

    /**********************************
     * 用途说明: 查询趋势变化点位列表
     * 参数说明 page 分页参数
     * 参数说明 stationCode 变电站名称
     * 参数说明 taskName 任务名称
     * 参数说明 mainDeviceName 主设备名称
     * 参数说明 componentName 部件名称
     * 参数说明 recognitionType 识别类型
     * 参数说明 deviceName 点位名称
     * 参数说明 startFormat 开始时间
     * 参数说明 endFormat 结束时间
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<java.util.Map<java.lang.String,java.lang
     * .Object>>
     ***********************************/
    Page<Map<String, Object>> getTrendChangeDeviceList(Page<Map<String, Object>> page, String stationCode,
                                                       String mainDeviceName, String componentName,
                                                       String recognitionType, String deviceName, String startFormat,
                                                       String endFormat);

    /**********************************
     * 用途说明: 查询趋势变化分析列表
     * 参数说明 deviceId 点位id
     * 参数说明 startFormat 开始时间
     * 参数说明 endFormat 结束时间
     * 返回值说明: java.util.Map<java.lang.String,java.lang.Object>
     ***********************************/
    Map<String, Object> getTrendChangeAnalysisList(String deviceId, String startFormat, String endFormat);

    void executeTask(List<Map<String, Object>> devicelist, TaskTodo quartzJob, String linkageDeviceType) throws InterruptedException;

    ResponseResult getThreadTask(String taskTodoId);

    void sendTaskResultById(String id);

    /**********************************
    * 用途说明: 单点识别
    * 参数说明 id 点位Id
    * 返回值说明: boolean
    ***********************************/
    boolean onceAnalyse(String id) throws Exception;

    void exportMeterDataByTaskTodoId(String taskTodoId, HttpServletResponse response);

    Page<Map<String, Object>> getResultByPatroldevice(Page<Map<String, Object>> page, String patroldeviceId,
                                                      String mainDeviceId, String taskName, String recognitionType,
                                                      String valid, String isReport, String startDate, String endDate);

}
