12 KiB
Project数据模型
**本文档中引用的文件** - [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)目录
引言
Project类是GeomativeStudio系统中的核心数据模型,作为项目容器管理着测区、任务配置、脚本集合和测量数据记录等关键信息。该类通过与ProManager模块协作,实现了项目生命周期的完整管理,包括创建、加载、保存和关闭操作。Project类从数据库加载元数据,并通过XML缓存文件实现项目持久化,确保数据在不同会话间的连续性。作为系统中项目管理的中心实体,Project类在多项目环境中通过单例模式提供统一访问接口,协调与Device、Script、TdRecord等其他模型的交互关系。
项目结构
GeomativeStudio项目采用分层架构设计,将核心数据模型、管理器、操作员和视图组件分离。Project类位于ProblemZone目录中,作为CDataMngStruct的派生类实现项目数据管理功能。系统通过ProManager类统一管理项目生命周期,而项目相关的持久化操作通过XML文件在CACHE目录中实现。项目结构清晰地划分了数据访问、业务逻辑和用户界面层,确保了系统的可维护性和扩展性。
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类作为系统核心数据模型,负责管理项目元数据和聚合相关实体。该类从数据库加载项目信息,包括名称、创建时间、坐标系统等属性,并通过成员函数实现与ProManager的协作。Project实例通过句柄机制在内存中管理,确保多项目环境下的高效访问。类的设计体现了数据封装原则,将数据库访问细节与业务逻辑分离,提供了清晰的接口供上层组件调用。
本节来源
架构概述
Project类在GeomativeStudio系统架构中扮演着中心角色,作为项目容器协调多个子系统的交互。系统采用管理器模式,通过ProManager统一管理Project实例的生命周期。Project类与TestingZone、Script、TdRecord等模型形成聚合关系,构建了完整的项目数据结构。持久化机制通过XML文件实现,确保项目数据在设备间的同步和本地缓存。整个架构设计支持多项目并发操作,通过句柄处理器和状态处理器确保线程安全和数据一致性。
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类分析
Project类作为系统核心数据模型,实现了项目元数据的存储和管理功能。该类从数据库加载项目信息,包括项目编号(CN)、项目名称(PRname)、描述(PRdesc)、位置(location)、创建日期(PRdate)、持续时间(duration)、投影系统(PS)、坐标系统(CS)、项目经理(PM)、质量保证(QAS)和标准(standard)等属性。通过继承CDataMngStruct基类,Project类获得了统一的数据管理接口。
类图
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类的生命周期由ProManager模块管理,通过一系列协作方法实现完整的项目操作流程:
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协作关系
ProManager作为项目管理器,与Project类形成紧密的协作关系。通过GetDMS方法,ProManager根据句柄获取相应的数据管理结构实例,实现了Project对象的单例访问模式。这种设计确保了在多项目环境中,每个项目实例在内存中只存在一个副本,提高了系统性能和数据一致性。
单例访问模式
flowchart TD
Start([获取DMS实例]) --> CheckCache["检查缓存中是否存在"]
CheckCache --> |存在| ReturnInstance["返回缓存实例"]
CheckCache --> |不存在| CreateInstance["创建新实例"]
CreateInstance --> LoadFromDB["从数据库加载数据"]
LoadFromDB --> AddToCache["添加到缓存链表"]
AddToCache --> ReturnInstance
ReturnInstance --> End([返回DMS实例])
图源
本节来源
依赖关系分析
Project类与系统中多个组件存在依赖关系,形成了复杂的交互网络。通过分析这些依赖关系,可以更好地理解系统的整体架构和数据流。
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
图源
本节来源
性能考虑
Project类的设计考虑了性能优化,通过缓存机制减少数据库访问频率。ProManager维护的m_dmsLinkList链表缓存了已创建的Project实例,避免了重复创建和数据加载。在多项目环境下,这种缓存策略显著提高了系统响应速度。同时,XML缓存文件的使用减少了设备同步时的数据传输量,优化了I/O性能。线程安全通过句柄处理器和状态处理器实现,确保在并发访问时的数据一致性。
故障排除指南
在使用Project类时可能遇到的常见问题及解决方案:
- 项目创建失败:检查项目名称是否已存在,确保数据库连接正常
- 数据加载异常:验证数据库表结构是否匹配,检查XML缓存文件完整性
- 设备同步问题:确认设备连接状态,检查文件传输权限
- 内存泄漏:确保通过ProManager正确管理Project实例生命周期
- 线程安全问题:使用ProManager提供的同步机制,避免直接操作Project实例
本节来源
结论
Project类作为GeomativeStudio系统的核心数据模型,成功实现了项目容器的功能,有效管理了项目元数据和相关实体。通过与ProManager模块的协作,该类提供了完整的项目生命周期管理功能,包括创建、加载、保存和关闭操作。基于XML的持久化机制确保了数据的可靠存储和设备同步。类的设计体现了良好的面向对象原则,通过继承、聚合和单例模式构建了清晰的架构。未来可进一步优化缓存策略和线程安全机制,以支持更大规模的项目管理和更高的并发性能。