7.6 KiB
7.6 KiB
项目数据模型
**本文档引用的文件** - [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)目录
项目表结构
项目表(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
项目与测区关系
项目与测区之间存在一对多的关联关系。一个项目可以包含多个测区,但每个测区只能属于一个项目。这种关系通过外键 PRID 在 tz 表中实现。
在数据访问层,CProManager::ShowTzList 方法通过 PRID 字段查询指定项目下的所有测区,并在UI中展示。CProManager::GetDMS 方法根据句柄类型动态创建 CProject 或 CTestingZone 对象,实现项目与测区的统一管理。
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
默认工程与默认测区实现机制
系统在创建新项目时会自动创建一个默认测区。该机制通过 CProManager::CreateProjectInDB 方法调用 InsertDefaultTzToProject 实现。
默认测区的特征如下:
TZtype值为 3,表示默认测区- 名称为 "DefaultTestZone"
- 描述和位置均为 "None"
- 创建日期为 "1970-01-01"
在创建项目后,系统首先删除该工程下已存在的默认测区(防止重复),然后插入新的默认测区记录。此过程确保每个项目下仅存在一个默认测区。
flowchart TD
Start([创建项目]) --> CreateProject["执行CreateProjectInDB"]
CreateProject --> CheckExist["检查项目名称是否已存在"]
CheckExist --> |已存在| ShowError["显示错误信息"]
CheckExist --> |不存在| InsertProject["插入项目记录"]
InsertProject --> GetProjectID["获取项目ID"]
GetProjectID --> DeleteDefault["删除现有默认测区"]
DeleteDefault --> InsertDefault["插入默认测区"]
InsertDefault --> End([完成])
Diagram sources
数据库字段演进历史
根据《数据库字段修改记录.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
关键字段业务含义
项目名称 (PRname)
- 业务含义:项目的可读名称,用于用户识别
- 约束:必须唯一,不能为空
- 验证规则:创建时检查是否已存在同名项目
创建时间 (PRdate)
- 业务含义:项目创建的日期
- 格式:YYYY-MM-DD
- 默认值:系统当前日期
坐标系统 (CS)
- 业务含义:项目使用的坐标参考系统
- 示例值:WGS84、CGCS2000
- 用途:确保测量数据的空间参考一致性
项目编码 (CN)
- 业务含义:项目的唯一标识编码
- 生成方式:使用 GUID 生成器创建
- 特点:全局唯一,用于跨系统数据同步
测区类型 (TZtype)
- 业务含义:测区的分类标识
- 关键值:
- 3:默认测区
- 其他值:具体测区类型
- 验证:创建默认测区时严格校验类型值
Section sources
数据验证规则与访问模式
数据验证规则
- 项目名称唯一性验证:在
CreateProjectInDB中通过查询project表检查名称冲突 - 默认测区类型验证:在
CreateDefaultTzInDev中校验TZtype必须为 3 - 必填字段验证:
PRname、PRdate等字段在数据库层面设置为非空 - 日期格式验证:使用
Format(PRdate,'YYYY-MM-DD')确保日期格式统一
访问模式
系统采用句柄(Handle)机制管理项目和测区对象:
- 使用
m_handleProcessor.GenerateHandle生成唯一句柄 - 通过
GetDMS方法根据句柄获取对应的CProject或CTestingZone对象 - 对象缓存在
m_dmsLinkList链表中,提高访问效率
数据访问遵循以下模式:
- 通过句柄获取对象
- 执行业务逻辑
- 操作结果持久化到数据库
- 更新缓存状态
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