# 项目数据模型 **本文档引用的文件** - [Project.h](file://h/Project.h) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [ProManager.h](file://h/ProManager.h) - [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt) - [database_modify.xml](file://Install/Geomative Studio/database_modify.xml) ## 目录 1. [项目表结构](#项目表结构) 2. [项目与测区关系](#项目与测区关系) 3. [默认工程与默认测区实现机制](#默认工程与默认测区实现机制) 4. [数据库字段演进历史](#数据库字段演进历史) 5. [关键字段业务含义](#关键字段业务含义) 6. [数据验证规则与访问模式](#数据验证规则与访问模式) ## 项目表结构 项目表(project)是系统中用于存储工程基本信息的核心数据表。根据代码分析,该表包含以下字段: | 字段名称 | 数据类型 | 约束 | 默认值 | 说明 | |---------|--------|------|--------|------| | ID | AutoNumber | 主键 | 自增 | 项目唯一标识 | | CN | Text | 唯一 | 无 | 项目编码(GUID) | | PRname | Text | 非空 | 无 | 项目名称 | | PRdesc | Text | 可为空 | 无 | 项目描述 | | location | Text | 可为空 | 无 | 项目位置 | | PRdate | Date/Time | 非空 | 当前日期 | 创建日期 | | duration | Text | 可为空 | 无 | 项目周期 | | PS | Text | 可为空 | 无 | 项目负责人 | | CS | Text | 可为空 | 无 | 客户名称 | | PM | Text | 可为空 | 无 | 项目经理 | | QAS | Text | 可为空 | 无 | 质量保证标准 | | standard | Text | 可为空 | 无 | 技术标准 | **Section sources** - [Project.h](file://h/Project.h#L26-L37) - [Project.cpp](file://cpp/ProblemZone/Project.cpp#L30-L45) ## 项目与测区关系 项目与测区之间存在一对多的关联关系。一个项目可以包含多个测区,但每个测区只能属于一个项目。这种关系通过外键 `PRID` 在 `tz` 表中实现。 在数据访问层,`CProManager::ShowTzList` 方法通过 `PRID` 字段查询指定项目下的所有测区,并在UI中展示。`CProManager::GetDMS` 方法根据句柄类型动态创建 `CProject` 或 `CTestingZone` 对象,实现项目与测区的统一管理。 ```mermaid erDiagram project { AutoNumber ID PK Text CN UK Text PRname Text PRdesc Text location Date/Time PRdate Text duration Text PS Text CS Text PM Text QAS Text standard } tz { AutoNumber ID PK Number PRID FK Text CN Text TZname Number TZtype Date/Time Cdate Text TZdesc Text location } project ||--o{ tz : "包含" ``` **Diagram sources** - [Project.h](file://h/Project.h#L26-L37) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L72-L73) - [ProManager.h](file://h/ProManager.h#L13) ## 默认工程与默认测区实现机制 系统在创建新项目时会自动创建一个默认测区。该机制通过 `CProManager::CreateProjectInDB` 方法调用 `InsertDefaultTzToProject` 实现。 默认测区的特征如下: - `TZtype` 值为 3,表示默认测区 - 名称为 "DefaultTestZone" - 描述和位置均为 "None" - 创建日期为 "1970-01-01" 在创建项目后,系统首先删除该工程下已存在的默认测区(防止重复),然后插入新的默认测区记录。此过程确保每个项目下仅存在一个默认测区。 ```mermaid flowchart TD Start([创建项目]) --> CreateProject["执行CreateProjectInDB"] CreateProject --> CheckExist["检查项目名称是否已存在"] CheckExist --> |已存在| ShowError["显示错误信息"] CheckExist --> |不存在| InsertProject["插入项目记录"] InsertProject --> GetProjectID["获取项目ID"] GetProjectID --> DeleteDefault["删除现有默认测区"] DeleteDefault --> InsertDefault["插入默认测区"] InsertDefault --> End([完成]) ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L340) - [ProManager.h](file://h/ProManager.h#L59) ## 数据库字段演进历史 根据《数据库字段修改记录.txt》文件,项目相关表的演进历史如下: | 日期 | 变更内容 | 说明 | |------|---------|------| | 2015-06-02 | 在 td1dcon、td2dcon、td3dcon 表中增加 bUse 字段 | 用于标记记录是否有效 | | 2015-06-12 | 在 Td 表中增加 rect、rect_loc 字段,修改 Espace、Edistance 类型 | 支持测试任务的矩形区域记录 | | **2017-09-12** | **在 project 和 tz 表中加入默认的工程和默认测区** | **核心变更:实现项目初始化机制** | | 2017-09-18 | 在 device 表中增加 GPS 字段 | 增强设备定位功能 | | 2017-09-25 | 在 td 表中添加 IsAutoGenerate 字段 | 标识任务是否自动生成 | 2017年9月12日的变更是项目数据模型的重要里程碑,它引入了默认工程和默认测区的概念,简化了项目创建流程,确保了新项目具有基本的结构完整性。 **Section sources** - [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt#L19-L21) - [Release/DB/数据库字段修改记录.txt](file://Release/DB/数据库字段修改记录.txt#L19-L21) ## 关键字段业务含义 ### 项目名称 (PRname) - **业务含义**:项目的可读名称,用于用户识别 - **约束**:必须唯一,不能为空 - **验证规则**:创建时检查是否已存在同名项目 ### 创建时间 (PRdate) - **业务含义**:项目创建的日期 - **格式**:YYYY-MM-DD - **默认值**:系统当前日期 ### 坐标系统 (CS) - **业务含义**:项目使用的坐标参考系统 - **示例值**:WGS84、CGCS2000 - **用途**:确保测量数据的空间参考一致性 ### 项目编码 (CN) - **业务含义**:项目的唯一标识编码 - **生成方式**:使用 GUID 生成器创建 - **特点**:全局唯一,用于跨系统数据同步 ### 测区类型 (TZtype) - **业务含义**:测区的分类标识 - **关键值**: - 3:默认测区 - 其他值:具体测区类型 - **验证**:创建默认测区时严格校验类型值 **Section sources** - [Project.h](file://h/Project.h#L27-L37) - [Project.cpp](file://cpp/ProblemZone/Project.cpp#L36-L45) ## 数据验证规则与访问模式 ### 数据验证规则 1. **项目名称唯一性验证**:在 `CreateProjectInDB` 中通过查询 `project` 表检查名称冲突 2. **默认测区类型验证**:在 `CreateDefaultTzInDev` 中校验 `TZtype` 必须为 3 3. **必填字段验证**:`PRname`、`PRdate` 等字段在数据库层面设置为非空 4. **日期格式验证**:使用 `Format(PRdate,'YYYY-MM-DD')` 确保日期格式统一 ### 访问模式 系统采用句柄(Handle)机制管理项目和测区对象: - 使用 `m_handleProcessor.GenerateHandle` 生成唯一句柄 - 通过 `GetDMS` 方法根据句柄获取对应的 `CProject` 或 `CTestingZone` 对象 - 对象缓存在 `m_dmsLinkList` 链表中,提高访问效率 数据访问遵循以下模式: 1. 通过句柄获取对象 2. 执行业务逻辑 3. 操作结果持久化到数据库 4. 更新缓存状态 ```mermaid sequenceDiagram participant UI as 用户界面 participant PM as CProManager participant DB as 数据库 participant Cache as 对象缓存 UI->>PM : 请求显示项目列表 PM->>DB : 查询dptt表获取项目ID DB-->>PM : 返回项目ID列表 loop 每个项目ID PM->>DB : 查询project表获取详细信息 DB-->>PM : 返回项目数据 PM->>Cache : 检查对象是否已缓存 alt 对象存在 Cache-->>PM : 返回缓存对象 else 对象不存在 PM->>PM : 创建CProject对象 PM->>Cache : 添加到缓存 end PM->>UI : 返回项目信息 end ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L248-L247) - [ProManager.h](file://h/ProManager.h#L57)