SourceCode/Bond/Servo/SECSRuntimeManager.cpp
@@ -1401,8 +1401,8 @@
    // 创建 EqpPPID 表
    std::string createTableSQL =
        "CREATE TABLE IF NOT EXISTS EqpPPID ("
        "BitNo INTEGER PRIMARY KEY AUTOINCREMENT, "
        "PPID INTEGER NULL);";
        "RecipeNo INTEGER PRIMARY KEY, "
        "PPID TEXT NULL);";
    if (!m_pDB->executeQuery(createTableSQL)) {
        throw std::runtime_error("Failed to create EqpPPID table.");
    }
@@ -1412,7 +1412,7 @@
    if (nCount == 0) {
        // 插入初始数据(512 行)
        for (int nBitNo = 0; nBitNo < 512; ++nBitNo) {
            std::string insertSQL = "INSERT INTO EqpPPID (BitNo) VALUES (" + std::to_string(nBitNo) + ");";
            std::string insertSQL = "INSERT INTO EqpPPID (RecipeNo) VALUES (" + std::to_string(nBitNo) + ");";
            if (!m_pDB->executeQuery(insertSQL)) {
                throw std::runtime_error("Failed to insert data into EqpPPID table.");
            }
@@ -1420,6 +1420,112 @@
    }
}
std::vector<std::string> SECSRuntimeManager::getAllPPID() {
   std::lock_guard<std::mutex> lock(m_mutex);
   if (m_pDB == nullptr) {
      return {};
   }
   std::string querySQL = "SELECT PPID FROM EqpPPID;";
   auto rows = m_pDB->fetchResults(querySQL);
   std::vector<std::string> vecResult;
   for (const auto& row : rows) {
        vecResult.push_back(row[0]);
   }
   return vecResult;
}
void SECSRuntimeManager::setAllPPID(const std::vector<std::string>& vecPPIDList) {
    std::lock_guard<std::mutex> lock(m_mutex);
    if (m_pDB == nullptr) return;
    // 开启事务
    m_pDB->executeQuery("BEGIN TRANSACTION;");
    for (size_t i = 0; i < vecPPIDList.size(); ++i) {
        std::string safePPID = vecPPIDList[i];
        size_t pos = 0;
        while ((pos = safePPID.find('\'', pos)) != std::string::npos) {
            safePPID.insert(pos, 1, '\'');
            pos += 2;
        }
        std::string sql = "UPDATE EqpPPID SET PPID = '" + safePPID + "' WHERE RecipeNo = " + std::to_string(i) + ";";
        m_pDB->executeQuery(sql);
    }
    // 提交事务
    m_pDB->executeQuery("COMMIT;");
}
bool SECSRuntimeManager::updatePPIDForRecipe(int nRecipeNo, const std::string& strPPID) {
    std::lock_guard<std::mutex> lock(m_mutex);
    if (m_pDB == nullptr) {
        return false;
    }
    // 转义单引号,防止 SQL 注入
    std::string safePPID = strPPID;
    size_t pos = 0;
    while ((pos = safePPID.find('\'', pos)) != std::string::npos) {
        safePPID.insert(pos, 1, '\'');
        pos += 2;
    }
    std::string updateSQL = "UPDATE EqpPPID SET PPID = '" + safePPID + "' WHERE RecipeNo = " + std::to_string(nRecipeNo) + ";";
    return m_pDB->executeQuery(updateSQL);
}
std::string SECSRuntimeManager::getPPIDForRecipe(int nRecipeNo) {
   std::lock_guard<std::mutex> lock(m_mutex);
   if (m_pDB == nullptr) {
      return "";
   }
   std::string querySQL = "SELECT PPID FROM EqpPPID WHERE RecipeNo = " + std::to_string(nRecipeNo) + ";";
   std::vector<std::vector<std::string>> results = m_pDB->fetchResults(querySQL);
   if (!results.empty() && !results[0].empty()) {
      return results[0][0];
   }
   return "";
}
int SECSRuntimeManager::getRecipeForPPID(std::string strPPID) {
   std::lock_guard<std::mutex> lock(m_mutex);
   if (m_pDB == nullptr) {
      return -1;
   }
   std::string querySQL = "SELECT RecipeNo FROM EqpPPID WHERE PPID = '" + strPPID + "';";
   std::vector<std::vector<std::string>> results = m_pDB->fetchResults(querySQL);
   if (!results.empty() && !results[0].empty()) {
      return std::stoi(results[0][0]);
   }
   return -1;
}
bool SECSRuntimeManager::deletePPIDForRecipe(int nRecipeNo) {
   std::lock_guard<std::mutex> lock(m_mutex);
   if (m_pDB == nullptr) {
      return false;
   }
   std::string deleteSQL = "UPDATE EqpPPID SET PPID = NULL WHERE RecipeNo = " + std::to_string(nRecipeNo) + ";";
   return m_pDB->executeQuery(deleteSQL);
}
bool SECSRuntimeManager::deletePPIDForAllRecipes() {
   std::lock_guard<std::mutex> lock(m_mutex);
   if (m_pDB == nullptr) {
      return false;
   }
   std::string deleteSQL = "UPDATE EqpPPID SET PPID = NULL WHERE RecipeNo BETWEEN 0 AND 511;";
   return m_pDB->executeQuery(deleteSQL);
}
// 初始化 RPTID 表
void SECSRuntimeManager::initRPTIDTable() {
    std::lock_guard<std::mutex> lock(m_mutex);