LAPTOP-SNT8I5JK\Boounion
2025-10-13 047c7cbd047e11fba8d7872e69a11a13e463aec4
SourceCode/Bond/Servo/CGlass.cpp
@@ -1,5 +1,6 @@
#include "stdafx.h"
#include "CGlass.h"
#include "Log.h"
namespace SERVO {
@@ -305,7 +306,7 @@
         return "Queued";
         break;
      case SERVO::GlsState::Completed:
         return "Queued";
         return "Completed";
         break;
      case SERVO::GlsState::Aborted:
         return "Aborted";
@@ -430,4 +431,147 @@
      return strOut;
   }
   // ========== SV数据管理接口实现 ==========
   void CGlass::addSVData(int machineId, const std::string& dataType, const SVDataItem& dataItem) {
      m_svDatas[machineId][dataType].push_back(dataItem);
   }
   void CGlass::addSVData(int machineId, const std::string& dataType, double value) {
      auto now = std::chrono::system_clock::now();
      m_svDatas[machineId][dataType].emplace_back(now, value);
   }
   void CGlass::addSVData(int machineId, const std::string& dataType, int64_t timestamp, double value) {
      // 将int64_t时间戳转换为system_clock::time_point
      std::chrono::system_clock::time_point timePoint{
         std::chrono::milliseconds(timestamp)  // 假设timestamp是毫秒
         // 如果是秒,使用:std::chrono::seconds(timestamp)
      };
      m_svDatas[machineId][dataType].emplace_back(timePoint, value);
   }
   void CGlass::addSVData(int machineId, const std::string& dataType, const std::vector<SVDataItem>& dataItems) {
      auto& dataList = m_svDatas[machineId][dataType];
      dataList.insert(dataList.end(), dataItems.begin(), dataItems.end());
   }
   std::vector<SVDataItem> CGlass::getSVData(int machineId, const std::string& dataType) const {
      auto machineIt = m_svDatas.find(machineId);
      if (machineIt != m_svDatas.end()) {
         auto dataIt = machineIt->second.find(dataType);
         if (dataIt != machineIt->second.end()) {
            return dataIt->second;
         }
      }
      return std::vector<SVDataItem>();
   }
   std::vector<std::string> CGlass::getSVDataTypes(int machineId) const {
      std::vector<std::string> types;
      auto machineIt = m_svDatas.find(machineId);
      if (machineIt != m_svDatas.end()) {
         for (const auto& pair : machineIt->second) {
            types.push_back(pair.first);
         }
      }
      return types;
   }
   std::unordered_map<std::string, std::vector<SVDataItem>> CGlass::getMachineSVData(int machineId) const {
      auto it = m_svDatas.find(machineId);
      if (it != m_svDatas.end()) {
         return it->second;
      }
      return std::unordered_map<std::string, std::vector<SVDataItem>>();
   }
   const std::unordered_map<int, std::unordered_map<std::string, std::vector<SVDataItem>>>& CGlass::getAllSVData() const {
      return m_svDatas;
   }
   bool CGlass::hasSVData(int machineId, const std::string& dataType) const {
      auto machineIt = m_svDatas.find(machineId);
      if (machineIt != m_svDatas.end()) {
         return machineIt->second.find(dataType) != machineIt->second.end();
      }
      return false;
   }
   bool CGlass::hasMachineSVData(int machineId) const {
      return m_svDatas.find(machineId) != m_svDatas.end();
   }
   std::vector<int> CGlass::getMachineIdsWithSVData() const {
      std::vector<int> machineIds;
      for (const auto& pair : m_svDatas) {
         machineIds.push_back(pair.first);
      }
      return machineIds;
   }
   void CGlass::clearSVData(int machineId, const std::string& dataType) {
      auto machineIt = m_svDatas.find(machineId);
      if (machineIt != m_svDatas.end()) {
         machineIt->second.erase(dataType);
         // 如果该机器没有其他数据了,也清除机器条目
         if (machineIt->second.empty()) {
            m_svDatas.erase(machineIt);
         }
      }
   }
   void CGlass::clearMachineSVData(int machineId) {
      m_svDatas.erase(machineId);
   }
   void CGlass::clearAllSVData() {
      m_svDatas.clear();
   }
   size_t CGlass::getSVDataCount(int machineId, const std::string& dataType) const {
      auto machineIt = m_svDatas.find(machineId);
      if (machineIt != m_svDatas.end()) {
         auto dataIt = machineIt->second.find(dataType);
         if (dataIt != machineIt->second.end()) {
            return dataIt->second.size();
         }
      }
      return 0;
   }
   size_t CGlass::getMachineSVDataCount(int machineId) const {
      size_t total = 0;
      auto machineIt = m_svDatas.find(machineId);
      if (machineIt != m_svDatas.end()) {
         for (const auto& pair : machineIt->second) {
            total += pair.second.size();
         }
      }
      return total;
   }
   size_t CGlass::getTotalSVDataCount() const {
      size_t total = 0;
      for (const auto& machinePair : m_svDatas) {
         for (const auto& dataPair : machinePair.second) {
            total += dataPair.second.size();
         }
      }
      return total;
   }
   std::vector<std::pair<int, SVDataItem>> CGlass::findSVDataByType(const std::string& dataType) const {
      std::vector<std::pair<int, SVDataItem>> result;
      for (const auto& machinePair : m_svDatas) {
         auto dataIt = machinePair.second.find(dataType);
         if (dataIt != machinePair.second.end()) {
            for (const auto& item : dataIt->second) {
               result.emplace_back(machinePair.first, item);
            }
         }
      }
      return result;
   }
}