LAPTOP-SNT8I5JK\Boounion
2025-02-14 2fc5bbfe88adefb0d2f8ba55d800fe074264a539
SourceCode/Bond/Servo/SECSRuntimeManager.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
#ifndef SECS_RUNTIME_MANAGER_H
#define SECS_RUNTIME_MANAGER_H
#include <string>
#include <vector>
#include <mutex>
#include "Database.h"
class SECSRuntimeManager {
public:
    /**
     * èŽ·å–å•ä¾‹å®žä¾‹
     * @return SECSRuntimeManager实例的引用
     */
    static SECSRuntimeManager& getInstance();
    /**
     * è®¾ç½®æ•°æ®åº“连接
     * @param db æ•°æ®åº“连接的指针
     */
    void setDatabase(BL::Database* db);
   /**
    * åˆå§‹åŒ–SECS运行设置管理库
    * @return æˆåŠŸè¿”å›žtrue,失败返回false
    */
    bool initRuntimeSetting();
   /**
   * é”€æ¯SECS运行设置管理库
   */
    void termRuntimeSetting();
   /**
    * åˆå§‹åŒ–SystemSV表
    */
    void initSystemSVTable();
    /**
     * æ·»åŠ  SystemSV æ•°æ®
     * @param nID: éœ€è¦æ·»åŠ çš„ SystemSV çš„ ID,必须是唯一的。
     * @param sName: éœ€è¦æ·»åŠ çš„ SystemSV çš„名称,必须是唯一的。
     * @param sDataType: æ•°æ®ç±»åž‹ï¼Œè¡¨ç¤ºè¯¥ç³»ç»Ÿå€¼çš„类型,例如 "ASCII"、"UINT_1" ç­‰ã€‚
     * @param nLength: ç³»ç»Ÿå€¼çš„æ•°æ®é•¿åº¦ï¼Œé€šå¸¸ä¸ºä¸€ä¸ªæ­£æ•´æ•°ï¼Œç”¨äºŽè¡¨ç¤ºè¯¥æ•°æ®çš„长度。
     * @param sUnit: ç³»ç»Ÿå€¼çš„单位。如果为空或者为 "NULL",则插入数据库中的 NULL å€¼ã€‚
     * @param sRemark: å¤‡æ³¨ä¿¡æ¯ï¼Œæè¿°è¯¥ç³»ç»Ÿå€¼çš„其他信息,可用于说明该字段的用途或特性。
     * @param nSystemID: è¯¥æ•°æ®æ‰€å±žçš„系统 ID,用于与其他表进行关联。
     * @return 1: æ•°æ®åº“未连接。
     * @return 2: ID é‡å¤ï¼Œæ— æ³•插入数据。
     * @return 3: Name é‡å¤ï¼Œæ— æ³•插入数据。
    * @return 4: æ’入数据失败。
     * @return 0: æ’入成功,数据已添加到 SystemSV è¡¨ä¸­ã€‚
     *
     * æ­¤å‡½æ•°ç”¨äºŽå°†ä¸€æ¡æ–°çš„æ•°æ®æ’入到 SystemSV è¡¨ä¸­ã€‚它首先会检查传入的 `ID` å’Œ `Name` æ˜¯å¦å·²å­˜åœ¨äºŽè¡¨ä¸­ï¼Œ
     * å¦‚果存在则返回相应的错误代码。如果 `Unit` å‚数为 "NULL" æˆ–者为空,函数会将其转换为数据库中的 NULL å€¼ã€‚
     * ç„¶åŽï¼Œæž„造一个 SQL æ’入语句并执行插入操作。如果插入失败,则抛出异常。
     * å¦‚果一切顺利,返回 0 è¡¨ç¤ºæ•°æ®æˆåŠŸæ’å…¥ã€‚
     */
    int addSystemSV(int nID, const std::string& sName, const std::string& sDataType, int nLength, const std::string& sUnit, const std::string& sRemark, int nSystemID);
    /**
     * æ›´æ–°æŒ‡å®š ID çš„ SystemSV æ•°æ®
     * @param nID: éœ€è¦æ›´æ–°çš„ SystemSV çš„当前 ID。
     * @param sNewID: è¦æ›´æ–°ä¸ºçš„æ–° ID。
     * @return 1: æ•°æ®åº“未连接。
     * @return 2: æœªæ‰¾åˆ°æŒ‡å®šçš„ ID。
     * @return 3: æ–°çš„ ID å·²ç»å­˜åœ¨ï¼Œæ— æ³•更新。
     * @return 4: æ›´æ–°æ“ä½œå¤±è´¥ã€‚
     * @return 0: æ›´æ–°æˆåŠŸã€‚
     *
     * æ­¤å‡½æ•°ç”¨äºŽæ›´æ–° `SystemSV` è¡¨ä¸­æŒ‡å®š `nID` çš„记录,将其 `ID` å­—段更新为 `sNewID`。
     * åœ¨æ‰§è¡Œæ›´æ–°å‰ï¼Œå‡½æ•°ä¼šæ£€æŸ¥ï¼š
     * 1. å½“前的 `nID` æ˜¯å¦å­˜åœ¨äºŽè¡¨ä¸­ã€‚
     * 2. æ–°çš„ `sNewID` æ˜¯å¦å·²ç»å­˜åœ¨äºŽè¡¨ä¸­ï¼Œå¦‚果存在,则无法进行更新。
     *
     * å¦‚æžœ `nID` ä¸å­˜åœ¨ï¼Œåˆ™è¿”回错误代码 2。如果 `sNewID` å·²ç»å­˜åœ¨ï¼Œåˆ™è¿”回错误代码 3。
     * å¦‚果数据库更新失败,则返回错误代码 4。成功时,返回 0 è¡¨ç¤ºæ“ä½œæˆåŠŸã€‚
     */
    int updateIDSystemSV(int nID, int sNewID);
   /**
     * æ›´æ–°æ‰€æœ‰ SystemSV æ•°æ®
     * @param nID: éœ€è¦æ›´æ–°çš„ SystemSV çš„当前 ID。
     * @param sNewID: è¦æ›´æ–°ä¸ºçš„æ–° ID,如果为空或为 -1,则不更新 ID。
     * @param sName: æ–°çš„名称,如果为空,则不更新。
     * @param sDataType: æ–°çš„æ•°æ®ç±»åž‹ï¼Œå¦‚果为空,则不更新。
     * @param nLength: æ–°çš„æ•°æ®é•¿åº¦ï¼Œå¦‚果为负值或零,则不更新。
     * @param sUnit: æ–°çš„单位,如果为空或 "NULL",则不更新。
     * @param sRemark: æ–°çš„备注,如果为空,则不更新。
     * @param nSystemID: æ–°çš„系统 ID,如果为负值,则不更新。
     * @return 1: æ•°æ®åº“未连接。
     * @return 2: æ²¡æœ‰æ‰¾åˆ°è¯¥ ID å¯¹åº”的记录。
     * @return 3: æ–°çš„ ID å·²ç»å­˜åœ¨ï¼Œæ— æ³•更新。
    * @return 4: æ›´æ–°æ“ä½œå¤±è´¥ã€‚
     * @return 0: æ›´æ–°æˆåŠŸã€‚
     *
     * æ­¤å‡½æ•°ç”¨äºŽæ›´æ–°æŒ‡å®š `ID` çš„ `SystemSV` æ•°æ®ã€‚如果某个字段为空,则跳过该字段的更新。
     * å¦‚果给定的 `ID` ä¸å­˜åœ¨ï¼Œåˆ™è¿”回错误代码 2。如果新的 `ID` å·²ç»å­˜åœ¨ï¼Œåˆ™è¿”回错误代码 3。
     *
     * å¦‚果字段为空,跳过该字段的更新。
    */
    int updateAllSystemSV(int nID, int sNewID, const std::string& sName, const std::string& sDataType, int nLength, const std::string& sUnit, const std::string& sRemark, int nSystemID);
    /**
     * åˆ é™¤æŒ‡å®š ID çš„ SystemSV æ•°æ®
     * @param nID: éœ€è¦åˆ é™¤çš„ SystemSV çš„ ID。
     * @return 1: æ•°æ®åº“未连接。
     * @return 2: æœªæ‰¾åˆ°æŒ‡å®šçš„ ID å¯¹åº”的记录。
    * @return 3: åˆ é™¤æ“ä½œå¤±è´¥ã€‚
     * @return 0: åˆ é™¤æˆåŠŸã€‚
     *
     * æ­¤å‡½æ•°ç”¨äºŽåˆ é™¤ `SystemSV` è¡¨ä¸­æŒ‡å®š `nID` çš„记录。如果给定的 `nID` ä¸å­˜åœ¨ï¼Œåˆ™è¿”回错误代码 2。
     * åˆ é™¤æ“ä½œæˆåŠŸåŽï¼Œè¿”å›ž 0 è¡¨ç¤ºåˆ é™¤æˆåŠŸã€‚
     */
    int deleteSystemSVByID(int nID);
   /**
    * åˆ é™¤æ‰€æœ‰ SystemSV æ•°æ®
    * @return 1: æ•°æ®åº“未连接。
    * @return 2: åˆ é™¤æ“ä½œå¤±è´¥ã€‚
    * @return 0: åˆ é™¤æˆåŠŸã€‚
    *
    * æ­¤å‡½æ•°ç”¨äºŽåˆ é™¤ `SystemSV` è¡¨ä¸­çš„æ‰€æœ‰è®°å½•。如果数据库未连接,则返回错误代码 1。
    * å¦‚果删除操作失败,则返回错误代码 2。删除成功后,返回 0 è¡¨ç¤ºåˆ é™¤æˆåŠŸã€‚
    */
    int deleteAllSystemSV();
   /**
    * åˆå§‹åŒ–Eqp表
    */
    void initEqpSVTable();
   /**
    * æ·»åŠ  EqpSV æ•°æ®
    * @param nID: éœ€è¦æ·»åŠ çš„ EqpSV çš„ ID,必须是唯一的。
    * @param sName: éœ€è¦æ·»åŠ çš„ EqpSV çš„名称,必须是唯一的。
    * @param sDataType: æ•°æ®ç±»åž‹ï¼Œè¡¨ç¤ºè¯¥è®¾å¤‡å€¼çš„类型,例如 "ASCII"、"UINT_1" ç­‰ã€‚
    * @param nLength: è®¾å¤‡å€¼çš„æ•°æ®é•¿åº¦ï¼Œé€šå¸¸ä¸ºä¸€ä¸ªæ­£æ•´æ•°ï¼Œç”¨äºŽè¡¨ç¤ºè¯¥æ•°æ®çš„长度。
    * @param sUnit: è®¾å¤‡å€¼çš„单位。如果为空或者为 "NULL",则插入数据库中的 NULL å€¼ã€‚
    * @param sRemark: å¤‡æ³¨ä¿¡æ¯ï¼Œæè¿°è¯¥è®¾å¤‡å€¼çš„其他信息,可用于说明该字段的用途或特性。
    * @param nSeqNo: è¯¥æ•°æ®çš„序号,用于排序。
    * @return 1: æ•°æ®åº“未连接。
    * @return 2: ID é‡å¤ï¼Œæ— æ³•插入数据。
    * @return 3: Name é‡å¤ï¼Œæ— æ³•插入数据。
     * @return 4: æ’入数据失败。
    * @return 0: æ’入成功,数据已添加到 EqpSV è¡¨ä¸­ã€‚
    *
    * æ­¤å‡½æ•°ç”¨äºŽå°†ä¸€æ¡æ–°çš„æ•°æ®æ’入到 EqpSV è¡¨ä¸­ã€‚它首先会检查传入的 `ID` å’Œ `Name` æ˜¯å¦å·²å­˜åœ¨äºŽè¡¨ä¸­ï¼Œ
    * å¦‚果存在则返回相应的错误代码。如果 `Unit` å‚数为 "NULL" æˆ–者为空,函数会将其转换为数据库中的 NULL å€¼ã€‚
    * ç„¶åŽï¼Œæž„造一个 SQL æ’入语句并执行插入操作。如果插入失败,则抛出异常。
    * å¦‚果一切顺利,返回 0 è¡¨ç¤ºæ•°æ®æˆåŠŸæ’å…¥ã€‚
    */
    int addEqpSV(int nID, const std::string& sName, const std::string& sDataType, int nLength, const std::string& sUnit, const std::string& sRemark, int nSeqNo);
   /**
   * åˆå§‹åŒ–SystemDV表
    */
    void initSystemDVTable();
   /**
   * åˆå§‹åŒ–EqpDV表
    */
    void initEqpDVTable();
   /**
   * åˆå§‹åŒ–SystemEC表
    */
    void initSystemECTable();
    /**
    * åˆå§‹åŒ–EqpEC表
    */
    void initEqpECTable();
    /**
    * åˆå§‹åŒ–SystemEvent表
    */
    void initSystemEventTable();
    /**
    * åˆå§‹åŒ–EqpEvent表
    */
    void initEqpEventTable();
    /**
    * åˆå§‹åŒ–EventLink表
    */
    void initEventLinkTable();
   /**
    * åˆå§‹åŒ–PPID表
    */
    void initPPIDTable();
   /**
   * åˆå§‹åŒ–RPTID表
    */
    void initRPTIDTable();
private:
    SECSRuntimeManager();
    ~SECSRuntimeManager();
    // ç¦æ­¢æ‹·è´å’Œèµ‹å€¼
    SECSRuntimeManager(const SECSRuntimeManager&) = delete;
    SECSRuntimeManager& operator=(const SECSRuntimeManager&) = delete;
   // ä»Žæ•°æ®åº“中获取整数
    int getIntFromDB(const std::string& query);
   // åˆ¤æ–­VID是否重复
    bool isIDDuplicate(int nID);
   // åˆ¤æ–­åç§°æ˜¯å¦é‡å¤
    bool isNameDuplicate(const std::string& sName);
    BL::Database* m_pDB;
    static std::mutex m_mutex;
};
#endif // SECS_RUNTIME_MANAGER_H