a
This commit is contained in:
@@ -0,0 +1,306 @@
|
||||
# Project数据模型
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Project.h](file://h/Project.h)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
|
||||
- [ProManager.h](file://h/ProManager.h)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [TestingZone.h](file://h/TestingZone.h)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp)
|
||||
- [DataMngStruct.h](file://h/DataMngStruct.h)
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [TdRecord.h](file://h/TdRecord.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
Project类是GeomativeStudio系统中的核心数据模型,作为项目容器管理着测区、任务配置、脚本集合和测量数据记录等关键信息。该类通过与ProManager模块协作,实现了项目生命周期的完整管理,包括创建、加载、保存和关闭操作。Project类从数据库加载元数据,并通过XML缓存文件实现项目持久化,确保数据在不同会话间的连续性。作为系统中项目管理的中心实体,Project类在多项目环境中通过单例模式提供统一访问接口,协调与Device、Script、TdRecord等其他模型的交互关系。
|
||||
|
||||
## 项目结构
|
||||
GeomativeStudio项目采用分层架构设计,将核心数据模型、管理器、操作员和视图组件分离。Project类位于ProblemZone目录中,作为CDataMngStruct的派生类实现项目数据管理功能。系统通过ProManager类统一管理项目生命周期,而项目相关的持久化操作通过XML文件在CACHE目录中实现。项目结构清晰地划分了数据访问、业务逻辑和用户界面层,确保了系统的可维护性和扩展性。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据层"
|
||||
DB[(数据库)]
|
||||
CACHE[(缓存文件)]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
ProManager[ProManager]
|
||||
Project[Project]
|
||||
TestingZone[TestingZone]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
DataMngStruct[CDataMngStruct]
|
||||
end
|
||||
subgraph "用户界面层"
|
||||
Views[视图组件]
|
||||
end
|
||||
DB --> Project
|
||||
CACHE --> Project
|
||||
Project --> ProManager
|
||||
ProManager --> Views
|
||||
DataMngStruct --> Project
|
||||
DataMngStruct --> TestingZone
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [DataMngStruct.h](file://h/DataMngStruct.h#L1-L23)
|
||||
|
||||
**本节来源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
|
||||
## 核心组件
|
||||
Project类作为系统核心数据模型,负责管理项目元数据和聚合相关实体。该类从数据库加载项目信息,包括名称、创建时间、坐标系统等属性,并通过成员函数实现与ProManager的协作。Project实例通过句柄机制在内存中管理,确保多项目环境下的高效访问。类的设计体现了数据封装原则,将数据库访问细节与业务逻辑分离,提供了清晰的接口供上层组件调用。
|
||||
|
||||
**本节来源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L1-L81)
|
||||
|
||||
## 架构概述
|
||||
Project类在GeomativeStudio系统架构中扮演着中心角色,作为项目容器协调多个子系统的交互。系统采用管理器模式,通过ProManager统一管理Project实例的生命周期。Project类与TestingZone、Script、TdRecord等模型形成聚合关系,构建了完整的项目数据结构。持久化机制通过XML文件实现,确保项目数据在设备间的同步和本地缓存。整个架构设计支持多项目并发操作,通过句柄处理器和状态处理器确保线程安全和数据一致性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDataMngStruct {
|
||||
+ShowDetailInfo(CListCtrl& dmsDetailList) bool
|
||||
+CDataMngStruct()
|
||||
+~CDataMngStruct()
|
||||
}
|
||||
class CProject {
|
||||
+ShowDetailInfo(CListCtrl& proDetailList) bool
|
||||
+CProject(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CProject()
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szCN
|
||||
-CString m_szPRname
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szPRdate
|
||||
-CString m_szDuration
|
||||
-CString m_szPS
|
||||
-CString m_szCS
|
||||
-CString m_szPM
|
||||
-CString m_szQAS
|
||||
-CString m_szStandard
|
||||
}
|
||||
class CTestingZone {
|
||||
+ShowDetailInfo(CListCtrl& tzDetailList) bool
|
||||
+CTestingZone(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CTestingZone()
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szTZname
|
||||
-CString m_szCDate
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szCN
|
||||
-CString m_szTZtype
|
||||
}
|
||||
class CScript {
|
||||
+CScript(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CScript()
|
||||
+DWORD m_dwID
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+int m_iEAmount
|
||||
+int m_iSType
|
||||
+int m_iAR
|
||||
+AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo) void
|
||||
+ShowSptConInfo(CListCtrl& sptConList) bool
|
||||
+ShowSptDetailInfo(CListCtrl& sptDetailList) bool
|
||||
+ShowChannelList(CListCtrl& sptChannelList) bool
|
||||
-_ConnectionPtr m_pConnection
|
||||
}
|
||||
class CDevice {
|
||||
+m_szDevSN CString
|
||||
+m_dwID DWORD
|
||||
+SendFile(CString szHostFilePath, CString szFilePath, CString szFileName) BOOL
|
||||
}
|
||||
class CTdRecord {
|
||||
+m_dwTzID DWORD
|
||||
+m_dwSCID DWORD
|
||||
+m_pDevice CDevice*
|
||||
}
|
||||
CDataMngStruct <|-- CProject
|
||||
CDataMngStruct <|-- CTestingZone
|
||||
CProject "1" *-- "0..*" CTestingZone : 包含
|
||||
CProject "1" *-- "0..*" CScript : 包含
|
||||
CProject "1" *-- "0..*" CTdRecord : 包含
|
||||
CTestingZone "1" *-- "0..*" CTdRecord : 包含
|
||||
CTdRecord --> CDevice : 关联
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
- [Device.h](file://h/Device.h#L1-L50)
|
||||
- [TdRecord.h](file://h/TdRecord.h#L1-L45)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Project类分析
|
||||
Project类作为系统核心数据模型,实现了项目元数据的存储和管理功能。该类从数据库加载项目信息,包括项目编号(CN)、项目名称(PRname)、描述(PRdesc)、位置(location)、创建日期(PRdate)、持续时间(duration)、投影系统(PS)、坐标系统(CS)、项目经理(PM)、质量保证(QAS)和标准(standard)等属性。通过继承CDataMngStruct基类,Project类获得了统一的数据管理接口。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CProject {
|
||||
+ShowDetailInfo(CListCtrl& proDetailList) bool
|
||||
+CProject(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CProject()
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szCN
|
||||
-CString m_szPRname
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szPRdate
|
||||
-CString m_szDuration
|
||||
-CString m_szPS
|
||||
-CString m_szCS
|
||||
-CString m_szPM
|
||||
-CString m_szQAS
|
||||
-CString m_szStandard
|
||||
}
|
||||
class CDataMngStruct {
|
||||
+ShowDetailInfo(CListCtrl& dmsDetailList) bool
|
||||
+CDataMngStruct()
|
||||
+~CDataMngStruct()
|
||||
}
|
||||
CDataMngStruct <|-- CProject
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [DataMngStruct.h](file://h/DataMngStruct.h#L1-L23)
|
||||
|
||||
#### 项目生命周期管理
|
||||
Project类的生命周期由ProManager模块管理,通过一系列协作方法实现完整的项目操作流程:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 用户界面
|
||||
participant ProManager as ProManager
|
||||
participant Project as Project
|
||||
participant DB as 数据库
|
||||
participant Cache as 缓存文件
|
||||
UI->>ProManager : 创建项目请求
|
||||
ProManager->>ProManager : 显示创建对话框
|
||||
ProManager->>DB : 检查项目名称是否存在
|
||||
DB-->>ProManager : 返回检查结果
|
||||
alt 项目名称已存在
|
||||
ProManager-->>UI : 显示错误消息
|
||||
else 项目名称可用
|
||||
ProManager->>DB : 插入项目记录
|
||||
DB-->>ProManager : 返回项目ID
|
||||
ProManager->>Project : 创建Project实例
|
||||
Project->>DB : 加载项目数据
|
||||
DB-->>Project : 返回项目信息
|
||||
ProManager->>Cache : 生成project.xml
|
||||
Cache-->>ProManager : 确认文件创建
|
||||
ProManager->>UI : 返回成功状态
|
||||
end
|
||||
UI->>ProManager : 加载项目
|
||||
ProManager->>DB : 查询项目列表
|
||||
DB-->>ProManager : 返回项目数据
|
||||
ProManager->>Project : 获取Project实例
|
||||
Project-->>UI : 显示项目详情
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L19-L50)
|
||||
|
||||
**本节来源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L1-L81)
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
|
||||
|
||||
### ProManager协作关系
|
||||
ProManager作为项目管理器,与Project类形成紧密的协作关系。通过GetDMS方法,ProManager根据句柄获取相应的数据管理结构实例,实现了Project对象的单例访问模式。这种设计确保了在多项目环境中,每个项目实例在内存中只存在一个副本,提高了系统性能和数据一致性。
|
||||
|
||||
#### 单例访问模式
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([获取DMS实例]) --> CheckCache["检查缓存中是否存在"]
|
||||
CheckCache --> |存在| ReturnInstance["返回缓存实例"]
|
||||
CheckCache --> |不存在| CreateInstance["创建新实例"]
|
||||
CreateInstance --> LoadFromDB["从数据库加载数据"]
|
||||
LoadFromDB --> AddToCache["添加到缓存链表"]
|
||||
AddToCache --> ReturnInstance
|
||||
ReturnInstance --> End([返回DMS实例])
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
|
||||
|
||||
**本节来源**
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
|
||||
|
||||
## 依赖关系分析
|
||||
Project类与系统中多个组件存在依赖关系,形成了复杂的交互网络。通过分析这些依赖关系,可以更好地理解系统的整体架构和数据流。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
ProManager --> Project : 创建/管理
|
||||
Project --> TestingZone : 聚合
|
||||
Project --> Script : 聚合
|
||||
Project --> TdRecord : 聚合
|
||||
Project --> DB : 数据持久化
|
||||
Project --> Cache : XML缓存
|
||||
TestingZone --> TdRecord : 聚合
|
||||
TdRecord --> Device : 关联
|
||||
Script --> TdRecord : 配置
|
||||
ProManager --> DB : 数据访问
|
||||
ProManager --> Device : 设备同步
|
||||
style Project fill:#f9f,stroke:#333
|
||||
style ProManager fill:#bbf,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
|
||||
**本节来源**
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
|
||||
## 性能考虑
|
||||
Project类的设计考虑了性能优化,通过缓存机制减少数据库访问频率。ProManager维护的m_dmsLinkList链表缓存了已创建的Project实例,避免了重复创建和数据加载。在多项目环境下,这种缓存策略显著提高了系统响应速度。同时,XML缓存文件的使用减少了设备同步时的数据传输量,优化了I/O性能。线程安全通过句柄处理器和状态处理器实现,确保在并发访问时的数据一致性。
|
||||
|
||||
## 故障排除指南
|
||||
在使用Project类时可能遇到的常见问题及解决方案:
|
||||
|
||||
1. **项目创建失败**:检查项目名称是否已存在,确保数据库连接正常
|
||||
2. **数据加载异常**:验证数据库表结构是否匹配,检查XML缓存文件完整性
|
||||
3. **设备同步问题**:确认设备连接状态,检查文件传输权限
|
||||
4. **内存泄漏**:确保通过ProManager正确管理Project实例生命周期
|
||||
5. **线程安全问题**:使用ProManager提供的同步机制,避免直接操作Project实例
|
||||
|
||||
**本节来源**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L483)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L19-L50)
|
||||
|
||||
## 结论
|
||||
Project类作为GeomativeStudio系统的核心数据模型,成功实现了项目容器的功能,有效管理了项目元数据和相关实体。通过与ProManager模块的协作,该类提供了完整的项目生命周期管理功能,包括创建、加载、保存和关闭操作。基于XML的持久化机制确保了数据的可靠存储和设备同步。类的设计体现了良好的面向对象原则,通过继承、聚合和单例模式构建了清晰的架构。未来可进一步优化缓存策略和线程安全机制,以支持更大规模的项目管理和更高的并发性能。
|
||||
Reference in New Issue
Block a user