#include "SPAServer.h" #include "spdlog/spdlog.h" #include "CurlHttp.h" #include #include "CurlFtp.h" #include "ThreadPool/ThreadPool.h" #include SPAServer::SPAServer() { m_logger = spdlog::get("SPAServer"); if(m_logger == nullptr) { SPDLOG_ERROR("APAServer logger is nullptr"); return; } m_threadRunning = true; /* 初始化WebAPI */ m_toEQMDataBase.initWebApi("http://192.1.3.133:31000/v6/", "", "4c2f9fc91c22dd98331e47af2e2964f4"); } SPAServer::~SPAServer() { } /* 启动服务 */ void SPAServer::startServer() { /* 添加获取基础信息的线程 */ CPPTP.add_task(&SPAServer::fromSuperBrainThread, this); } /** * @brief 从基础平台获取算法信息和设备信息的线程函数 * */ void SPAServer::fromSuperBrainThread() { SPDLOG_LOGGER_INFO(m_logger, "开启 fromSuperBrainThread 线程"); /* 创建变量 */ std::vector vecAlgInfo; std::vector vecDevInfo; std::vector vecAlgUpdate; std::vector vecAlgDelete; /* 从EQM数据库中读取到数据信息到内存中,后续对比需要 */ m_toEQMDataBase.getAlgorithmInfo(m_vecEqmAlgInfo); /* 获取一次token,后续失效了再获取 */ m_fromSuperBrain.getToken(); while (m_threadRunning) { SPDLOG_LOGGER_INFO(m_logger, "刷新算法和设备信息"); m_fromSuperBrain.getTaskTypeList(vecAlgInfo); m_fromSuperBrain.getDeviceList(vecDevInfo); /* 对比数据库表格信息,这里只有插入和删除,没有更新 */ compareAlgorithmInfo(vecAlgInfo, vecAlgUpdate, vecAlgDelete); /* 更新数据库,先删除,再写入刷新 */ if(vecAlgDelete.size() > 0) { SPDLOG_LOGGER_DEBUG(m_logger, "删除算法信息"); m_toEQMDataBase.deleteAlgorithmInfo(vecAlgDelete); } /* 更新一次表格数据缓存 */ m_toEQMDataBase.getAlgorithmInfo(m_vecEqmAlgInfo); if(vecAlgUpdate.size() > 0) { SPDLOG_LOGGER_DEBUG(m_logger, "写入算法信息"); m_toEQMDataBase.writeAlgorithmInfo(vecAlgUpdate, m_vecEqmAlgInfo); } /* 再读取数据库,刷新本地存储 */ if(vecAlgUpdate.size() > 0 || vecAlgDelete.size() > 0) { m_toEQMDataBase.getAlgorithmInfo(m_vecEqmAlgInfo); } vecAlgInfo.clear(); vecDevInfo.clear(); vecAlgUpdate.clear(); vecAlgDelete.clear(); std::this_thread::sleep_for(std::chrono::seconds(10)); } } /* 对比现有的数据和新获取到的数据,取出要删除和添加的数据 */ void SPAServer::compareAlgorithmInfo(const std::vector& vecNewInfo, std::vector& vecAlgUpdate, std::vector& vecAlgDelete) { /* 取出要添加的,如果本地缓存是0,那么全部都要添加 */ if(m_vecEqmAlgInfo.size() > 0) { for(const auto& it : vecNewInfo) { bool isExist = false; for(const auto& it0 : m_vecEqmAlgInfo) { /* 如果存在就退出循环 */ if(it.ActionID == it0.ActionID) { isExist = true; break; } } if(!isExist) { vecAlgUpdate.push_back(it); } } }else { vecAlgUpdate = vecNewInfo; } /* 取出要删除的,如果新的数据是0,那么全部都要删除 */ if(vecNewInfo.size() > 0) { bool isExist = false; for(const auto& it : m_vecEqmAlgInfo) { isExist = false; for(const auto& it0 : vecNewInfo) { if(it.ActionID == it0.ActionID) { isExist = true; break; } } if(!isExist) { vecAlgDelete.push_back(it); } } }else { vecAlgDelete = m_vecEqmAlgInfo; } }