# 项目生命周期管理 **本文档引用的文件** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [ProManager.h](file://h/ProManager.h) - [opcreateprojectdlg.cpp](file://cpp/Views/opcreateprojectdlg.cpp) - [opcreateprojectdlg.h](file://h/opcreateprojectdlg.h) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [Project.h](file://h/Project.h) - [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp) - [TestingZone.h](file://h/TestingZone.h) - [Device.h](file://h/Device.h) - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) ## 目录 1. [项目创建流程](#项目创建流程) 2. [项目元数据收集与验证](#项目元数据收集与验证) 3. [项目唯一标识符生成机制](#项目唯一标识符生成机制) 4. [数据库记录插入与默认测区创建](#数据库记录插入与默认测区创建) 5. [项目数据同步到GD10设备](#项目数据同步到gd10设备) 6. [XML缓存文件生成](#xml缓存文件生成) 7. [项目删除操作与级联清理](#项目删除操作与级联清理) 8. [项目状态管理与性能优化](#项目状态管理与性能优化) ## 项目创建流程 项目生命周期管理的核心功能始于项目创建流程,该流程通过`CProManager::CreateProjectInDB`方法实现。此方法首先实例化`COpCreateProjectDlg`对话框,用于收集用户输入的项目元数据。当用户点击确定按钮时,系统会验证输入数据的完整性并执行后续操作。 项目创建流程遵循严格的事务处理机制,确保数据的一致性和完整性。整个流程包括元数据收集、冲突检测、数据库插入和设备同步等多个阶段。在数据库操作层面,系统使用ADODB组件与Access数据库进行交互,通过SQL语句执行数据的增删改查操作。 **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317) - [ProManager.h](file://h/ProManager.h#L51-L52) ## 项目元数据收集与验证 项目元数据的收集通过`opCreateProjectDlg`对话框完成,该对话框提供了用户友好的界面来输入项目相关信息。收集的元数据包括项目CN(唯一标识符)、名称、描述、位置、日期、持续时间、工程监督员(PS)、现场管理员(CS)、工程负责人(PM)、品质保证员(QAS)和标准等关键字段。 系统在数据提交前执行严格的验证机制。首先检查工程名称是否为空,如果为空则弹出提示信息要求用户重新输入。同时,系统还会检测工程名称中是否包含特殊字符,若存在特殊字符也会阻止提交并给出相应提示。此外,在将数据写入数据库之前,系统会查询数据库以确保工程名称的唯一性,避免重复创建相同名称的工程。 ```mermaid flowchart TD Start([开始创建项目]) --> ShowDialog["显示opCreateProjectDlg对话框"] ShowDialog --> CollectData["收集项目元数据"] CollectData --> ValidateEmpty["验证必填字段是否为空"] ValidateEmpty --> |为空| ShowError1["显示错误提示"] ValidateEmpty --> |不为空| ValidateSpecial["验证特殊字符"] ValidateSpecial --> |包含特殊字符| ShowError2["显示特殊字符错误"] ValidateSpecial --> |无特殊字符| CheckDuplicate["检查工程名称重复"] CheckDuplicate --> |已存在| ShowError3["显示重复名称错误"] CheckDuplicate --> |不存在| InsertDB["插入数据库记录"] InsertDB --> CreateDefaultTz["创建默认测区"] CreateDefaultTz --> End([项目创建完成]) ShowError1 --> End ShowError2 --> End ShowError3 --> End ``` **Diagram sources** - [opcreateprojectdlg.cpp](file://cpp/Views/opcreateprojectdlg.cpp#L79-L114) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L274-L284) **Section sources** - [opcreateprojectdlg.cpp](file://cpp/Views/opcreateprojectdlg.cpp#L21-L192) - [opcreateprojectdlg.h](file://h/opcreateprojectdlg.h#L15-L68) ## 项目唯一标识符生成机制 项目唯一标识符(CN)的生成机制是确保项目数据完整性和可追溯性的关键环节。系统采用`CGUCodeCreator::GenerateGUIDCode()`方法生成全局唯一标识符作为项目CN。该方法通过复杂的算法生成具有高度唯一性的字符串,有效避免了项目标识符冲突的可能性。 在`COpCreateProjectDlg`对话框初始化时,系统自动调用`OnProGenCn`方法生成默认的CN值并填充到输入框中。用户可以选择接受系统生成的CN,也可以手动输入自定义的CN。然而,即使用户手动输入CN,系统仍然会在数据库插入前检查其唯一性,确保不会出现重复的CN值。 项目CN不仅是数据库中的主键标识,还在后续的设备同步过程中发挥重要作用。它被用作文件路径的组成部分,确保每个项目在设备上的存储位置具有唯一性。这种设计使得系统能够准确地识别和管理多个项目,为数据同步和检索提供了可靠的基础。 **Section sources** - [opcreateprojectdlg.cpp](file://cpp/Views/opcreateprojectdlg.cpp#L117-L122) - [ProManager.h](file://h/ProManager.h#L67) - [opcreateprojectdlg.h](file://h/opcreateprojectdlg.h#L59) ## 数据库记录插入与默认测区创建 在完成元数据验证后,系统执行数据库记录插入操作。`CProManager::CreateProjectInDB`方法构建SQL插入语句,将收集到的项目元数据写入Access数据库的project表中。插入的字段包括CN、PRname、PRdesc、location、PRdate、duration、PS、CS、PM、QAS和standard等。 数据库插入操作完成后,系统会自动为新创建的项目生成一个默认测区。这一过程由`InsertDefaultTzToProject`方法实现,该方法首先删除该工程下可能存在的旧默认测区,然后插入一个新的默认测区记录。默认测区的CN同样通过`CGUCodeCreator::GenerateGUIDCode()`方法生成,确保其唯一性。 默认测区的创建遵循特定的命名规则和类型定义,其名称固定为"DefaultTestZone",类型值为3。这种设计保证了每个项目都至少包含一个测区,为后续的数据采集和管理提供了基础结构。同时,通过事务性操作确保了项目与默认测区之间的数据一致性。 ```mermaid classDiagram class CProManager { +CreateProjectInDB(DWORD& dwID) UINT +InsertDefaultTzToProject(DWORD dwProjectID) UINT -m_pConnection _ConnectionPtr -m_dmsLinkList CLinkList -m_handleProcessor CHandleProcessor -m_stateProcessor CStateProcessor -m_guCodeCreator CGUCodeCreator } class CGUCodeCreator { +GenerateGUIDCode() CString } class COpCreateProjectDlg { +OnOK() void +OnProGenCn() void -m_edCN CString -m_edName CString -m_edPrDesc CString -m_edLocation CString -m_edPrDate CTime -m_edDuration int -m_edPS CString -m_edCS CString -m_edPM CString -m_edQAS CString -m_edStandard CString -m_bCNS bool -m_guCodeCreator CGUCodeCreator } CProManager --> CGUCodeCreator : "使用" CProManager --> COpCreateProjectDlg : "调用" COpCreateProjectDlg --> CGUCodeCreator : "使用" ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L288-L306) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L341) ## 项目数据同步到GD10设备 项目数据从数据库到GD10设备的同步过程是项目生命周期管理的重要环节。`CProManager::CreateProjectInDev`方法负责将项目数据同步到指定的GD10设备。该过程首先从数据库读取项目详细信息,然后检查设备上是否已存在同名项目,以避免重复创建。 同步过程包含多个关键步骤:首先生成项目XML缓存文件,然后通过`CDevice::SendFile`方法将文件传输到设备。在传输前,系统会创建相应的目录结构,路径格式为"/SD/projects/{项目CN}/"。文件传输成功后,系统更新数据库中的同步状态,记录设备与项目之间的关联关系。 如果文件传输失败,系统会执行回滚操作,删除已在设备上创建的项目,并向用户显示错误提示。这种事务性处理机制确保了数据的一致性,防止出现部分同步导致的数据不一致问题。同时,系统还实现了错误重试机制,提高了同步过程的可靠性。 ```mermaid sequenceDiagram participant UI as 用户界面 participant ProMgr as CProManager participant DB as 数据库 participant Device as CDevice participant FileSys as 文件系统 UI->>ProMgr : 调用CreateProjectInDev ProMgr->>DB : 查询项目信息 DB-->>ProMgr : 返回项目数据 ProMgr->>DB : 检查设备同步记录 DB-->>ProMgr : 返回检查结果 ProMgr->>FileSys : 创建CACHE目录 FileSys-->>ProMgr : 确认目录创建 ProMgr->>ProMgr : 生成project.xml ProMgr->>Device : 调用SendFile Device->>Device : 传输文件到GD10 Device-->>ProMgr : 返回传输结果 alt 传输成功 ProMgr->>DB : 更新同步状态 DB-->>ProMgr : 确认更新 ProMgr-->>UI : 返回成功状态 else 传输失败 ProMgr->>Device : 删除设备上的项目 Device-->>ProMgr : 确认删除 ProMgr-->>UI : 返回失败状态 end ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) - [Device.h](file://h/Device.h#L59-L60) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) ## XML缓存文件生成 XML缓存文件的生成是项目数据同步过程中的关键步骤。系统使用`CMarkup`类创建符合特定格式的XML文件,文件名为"project.xml",存储在本地CACHE目录中。XML文件的结构设计遵循预定义的模式,包含项目的所有元数据信息。 XML文件的根元素为"project",其下包含多个子元素,如project_name、cn、description、location、create_date、create_time、test_date、test_time、duration、PS、CS、PM、QA、standard和testzone_count等。这些元素准确反映了项目在数据库中的属性,确保了数据的一致性。 在生成XML文件时,系统会设置适当的编码格式(ansi)和XML声明。文件内容经过格式化处理,包含适当的换行符,提高了可读性。生成的XML文件不仅用于设备同步,还可作为数据备份和交换的中间格式,增强了系统的灵活性和可维护性。 ```mermaid erDiagram PROJECT ||--o{ TESTZONE : "包含" PROJECT { string CN PK string PRname string PRdesc string location date PRdate int duration string PS string CS string PM string QAS string standard } TESTZONE { int ID PK string CN UK string TZname int TZtype date Cdate string TZdesc string location int PRID FK } DEVICE ||--o{ DEV_SYN_TD : "关联" DEVICE { string DESN PK string DevName string ModelNO string MDate string HWV string SWV string MacAddress } DEV_SYN_TD { int ID PK string DESN FK string PrCN FK string PrName string TzCN FK string TzName boolean IsSyned } PROJECT ||--o{ DEV_SYN_TD : "同步到" TESTZONE ||--o{ DEV_SYN_TD : "同步到" ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L402-L425) - [Project.h](file://h/Project.h#L26-L37) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L398-L428) ## 项目删除操作与级联清理 项目删除操作涉及复杂的级联清理策略,以确保数据完整性和系统稳定性。虽然具体的删除方法实现未在提供的代码片段中显示,但从`ProManager.h`头文件中可以推断出系统提供了`DeleteProjectInDB`和`DeleteProjectInDev`等方法用于删除项目。 项目删除过程需要考虑多个关联实体的清理,包括测区、任务数据以及设备上的同步文件。系统可能采用事务性删除机制,确保所有相关数据被一致地清除。在删除数据库记录的同时,还需要清理设备上的对应文件和目录,如"/SD/projects/{项目CN}/"路径下的所有内容。 级联清理策略可能包括:首先删除与项目关联的所有测区数据,然后删除项目本身;在设备端,先删除测区文件,再删除项目目录。这种分层删除方式可以有效避免因外键约束导致的删除失败。同时,系统可能还实现了删除前的确认机制和备份功能,防止误删重要数据。 **Section sources** - [ProManager.h](file://h/ProManager.h#L48-L49) ## 项目状态管理与性能优化 项目状态管理通过`m_dmsLinkList`缓存数据管理结构实现性能优化。`CProManager`类中的`m_dmsLinkList`成员变量是一个链表容器,用于缓存已加载的项目和测区数据管理结构。这种缓存机制避免了频繁的数据库查询,显著提高了数据访问性能。 当需要获取特定项目的管理结构时,系统首先检查`m_dmsLinkList`中是否已存在对应的`CDataMngStruct`对象。如果存在则直接返回缓存对象;如果不存在,则从数据库加载数据并创建新的管理结构对象,然后将其添加到链表中以便后续重用。这种设计模式有效减少了数据库访问次数,提升了系统响应速度。 缓存管理还包括适当的清理机制。在`CProManager`析构函数中,系统会遍历并删除链表中的所有对象,释放占用的内存资源。这种资源管理策略确保了系统的稳定运行,防止内存泄漏。同时,通过句柄处理器(`m_handleProcessor`)管理对象的生命周期,实现了高效的内存使用和对象复用。 ```mermaid flowchart TD A([获取DMS对象]) --> B{"缓存中存在?"} B --> |是| C[返回缓存对象] B --> |否| D[从数据库加载数据] D --> E[创建新的DMS对象] E --> F[添加到m_dmsLinkList] F --> G[返回新对象] C --> H([使用DMS对象]) G --> H H --> I{"操作完成?"} I --> |否| H I --> |是| J[释放资源] J --> K([结束]) style A fill:#4CAF50,stroke:#388E3C style C fill:#2196F3,stroke:#1976D2 style D fill:#FF9800,stroke:#F57C00 style E fill:#FF9800,stroke:#F57C00 style F fill:#FF9800,stroke:#F57C00 style G fill:#2196F3,stroke:#1976D2 style H fill:#607D8B,stroke:#455A64 style J fill:#F44336,stroke:#D32F2F ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L154-L182) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L39-L51) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L154-L182)