a
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
# 项目数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [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)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
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)
|
||||
Reference in New Issue
Block a user