This commit is contained in:
coco
2026-07-03 16:05:30 +08:00
commit df489d5640
1101 changed files with 779140 additions and 0 deletions
@@ -0,0 +1,393 @@
# 数据库模式
<cite>
**本文档引用的文件**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [database_modify.xml](file://Install/Geomative Studio/database_modify.xml)
- [Project.h](file://h/Project.h)
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
- [Script.cpp](file://cpp/ProblemZone/Script.cpp)
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp)
- [GeoMative.rc](file://GeoMative.rc)
- [Resource.h](file://Resource.h)
</cite>
## 目录
1. [引言](#引言)
2. [核心实体表结构](#核心实体表结构)
3. [数据库关系与ER图](#数据库关系与er图)
4. [关键字段业务含义与验证规则](#关键字段业务含义与验证规则)
5. [数据库版本演进历史](#数据库版本演进历史)
6. [结论](#结论)
## 引言
本文档旨在全面描述Geomative Studio软件所使用的Access数据库的结构。基于`DB/数据库字段修改记录.txt`文件的详细记录,本文档将深入分析项目、设备、脚本、测量数据等核心实体的表结构,包括字段名称、数据类型、主键/外键约束、索引和默认值。文档将解释各表之间的关系(如一对多、多对多等)并提供实体关系图(ER图)进行可视化表示。此外,文档还将包含数据库版本的演进历史和字段变更记录,并说明不同版本间的兼容性处理策略。
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
## 核心实体表结构
本节详细描述数据库中核心实体的表结构。信息主要来源于`IOManager.cpp`文件中创建数据库表的代码,以及`Project.cpp``Device.cpp`等文件中查询数据的SQL语句。
### 项目 (Project) 表
`project`表存储了工程项目的元数据。
**表结构:**
| 字段名称 | 数据类型 | 是否可为空 | 说明 |
| :--- | :--- | :--- | :--- |
| `ID` | AutoNumber | 否 | 主键,自增ID |
| `CN` | 文本 (40) | 否 | 项目ID |
| `PRname` | 文本 (20) | 否 | 项目名称 |
| `PRdesc` | 文本 (50) | 是 | 备注 |
| `location` | 文本 (50) | 是 | 位置 |
| `PRdate` | 日期/时间 | 是 | 日期 |
| `duration` | 长整型 | 是 | 持续时间(天) |
| `PS` | 文本 (20) | 是 | 项目主管 |
| `CS` | 文本 (20) | 是 | 现场经理 |
| `PM` | 文本 (20) | 是 | 项目经理 |
| `QAS` | 文本 (20) | 是 | QA |
| `standard` | 文本 (20) | 是 | 标准 |
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L227-L237)
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L30)
- [GeoMative.rc](file://GeoMative.rc#L3835-L3850)
### 设备 (Device) 表
`device`表存储了设备的硬件和配置信息。
**表结构:**
| 字段名称 | 数据类型 | 是否可为空 | 说明 |
| :--- | :--- | :--- | :--- |
| `ID` | AutoNumber | 否 | 主键,自增ID |
| `DEname` | 文本 (20) | 否 | 设备名称 |
| `modelNO` | 文本 (20) | 否 | 型号 |
| `SN` | 文本 (20) | 否 | 序列号 |
| `HWV` | 文本 (20) | 否 | 硬件版本 |
| `SWV` | 文本 (20) | 否 | 软件版本 |
| `Mdate` | 日期/时间 | 是 | 生产日期 |
| `Mbatch` | 文本 (20) | 是 | 批次号 |
| `GPS` | 文本 (50) | 是 | GPS信息(2017.9.18新增) |
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L366-L375)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L135)
### 脚本 (Script) 表
`scon`表(在代码中常被称为`script`)存储了测量任务的配置脚本。
**表结构:**
| 字段名称 | 数据类型 | 是否可为空 | 说明 |
| :--- | :--- | :--- | :--- |
| `ID` | AutoNumber | 否 | 主键,自增ID |
| `CN` | 文本 (40) | 否 | 脚本ID |
| `Sname` | 文本 (20) | 否 | 阵列名称 |
| `Eamount` | 整型 | 是 | 电极数量 |
| `CHamount` | 整型 | 是 | 通道数量 |
| `TPamount` | 整型 | 是 | 点数 |
| `definer` | 文本 (20) | 是 | 操作员 |
| `DEdate` | 日期/时间 | 是 | 创建日期 |
| `SCdesc` | 文本 (50) | 是 | 备注 |
| `Rect` | 文本 | 是 | 矩形大小(2015.6.12新增) |
| `RectLoc` | 文本 | 是 | 矩形位置(2015.6.12新增) |
| `PoleDistance` | 文本 | 是 | 电极间距(2015.6.12新增) |
| `PoleStep` | 文本 | 是 | 电极步长(2015.6.12新增) |
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L564-L586)
- [Script.cpp](file://cpp/ProblemZone/Script.cpp#L18)
### 测量数据 (Measurement Data) 表
`td`表是存储测量任务的核心表,它与多种具体测量数据表(如`td1dcon`, `td2dcon`, `td3dcon`)存在一对多关系。
**表结构:**
| 字段名称 | 数据类型 | 是否可为空 | 说明 |
| :--- | :--- | :--- | :--- |
| `ID` | AutoNumber | 否 | 主键,自增ID |
| `TDname` | 文本 (20) | 否 | 任务名称 |
| `Tlocation` | 文本 (50) | 是 | 测区位置 |
| `DESN` | 文本 (20) | 否 | 设备序列号 |
| `SCCN` | 文本 (40) | 否 | 脚本ID |
| `Sname` | 文本 (20) | 否 | 阵列名称 |
| `Stype` | 整型 | 是 | 阵列类型 |
| `Ttype` | 整型 | 是 | 测试方法 |
| `Tmode` | 整型 | 是 | 测试模式 |
| `Eamount` | 整型 | 是 | 电极数量 |
| `TPamount` | 整型 | 是 | 点数 |
| `CHamount` | 整型 | 是 | 通道数量 |
| `N` | 整型 | 是 | 堆叠次数 |
| `TRwave` | 整型 | 是 | 发射波形 |
| `TRfrequency` | 整型 | 是 | 发射频率 |
| `Ifrequency` | 整型 | 是 | 发射频率 |
| `SAfrequency` | 整型 | 是 | 采样频率 |
| `Clayout` | 整型 | 是 | 装置类型 |
| `Espace` | 文本 | 是 | 电极间距(2015.6.12由数字改为文本) |
| `Edistance` | 文本 | 是 | 电极距离(2015.6.12由数字改为文本) |
| `weather` | 整型 | 是 | 天气 |
| `WDIR` | 整型 | 是 | 风向 |
| `temperature` | 整型 | 是 | 温度 |
| `height` | 整型 | 是 | 高度 |
| `humidity` | 整型 | 是 | 湿度 |
| `Cdate` | 日期/时间 | 是 | 创建日期 |
| `Ctime` | 日期/时间 | 是 | 创建时间 |
| `Tdate` | 日期/时间 | 是 | 测试日期 |
| `Ttime` | 日期/时间 | 是 | 测试时间 |
| `Rdirection` | 整型 | 是 | 电阻率方向 |
| `CRtime` | 整型 | 是 | 堆叠时间 |
| `PM` | 文本 (10) | 是 | 项目经理 |
| `OP` | 文本 (10) | 是 | 操作员 |
| `QA` | 文本 (10) | 是 | QA |
| `rect` | 文本 | 是 | 矩形大小(2015.6.12新增) |
| `rect_loc` | 文本 | 是 | 矩形位置(2015.6.12新增) |
| `SkipCable` | 整型 | 是 | 跳过电缆(2017.9.18新增) |
| `IsAutoGenerate` | 整型 | 是 | 是否自动生成(2017.9.25新增) |
| `TZID` | 长整型 | 是 | 测区ID(外键) |
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L369-L397)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L438-L440)
### 测量数据详情表
`td1dcon`, `td2dcon`, `td3dcon`等表存储了具体的测量数据点,与`td`表通过`TCHID``TSN`关联。
**通用字段结构 (以td2dcon为例):**
| 字段名称 | 数据类型 | 是否可为空 | 说明 |
| :--- | :--- | :--- | :--- |
| `ID` | AutoNumber | 否 | 主键,自增ID |
| `TSN` | 整型 | 否 | 任务序列号 |
| `TCHID` | 长整型 | 否 | 通道ID |
| `V` | 单精度浮点型 | 是 | 电压 |
| `I` | 单精度浮点型 | 是 | 电流 |
| `R0` | 单精度浮点型 | 是 | 电阻 |
| `SP` | 单精度浮点型 | 是 | 自电 |
| `bUse` | 是/否 | 是 | 记录是否有效(2015.6.2新增) |
| `Vrawdata` | 备注 | 是 | 原始电压数据 |
| `Irawdata` | 备注 | 是 | 原始电流数据 |
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L410-L435)
- [TdRecord.cpp](file://cpp/ProblemZone/TdRecord.cpp#L55-L57)
## 数据库关系与ER图
根据对代码的分析,数据库中的核心实体存在以下关系:
* **项目 (Project)****测区 (Tz)** 之间存在一对多关系。一个项目可以包含多个测区。
* **测区 (Tz)****测量任务 (Td)** 之间存在一对多关系。一个测区可以包含多个测量任务。
* **设备 (Device)****测量任务 (Td)** 之间存在一对多关系。一台设备可以执行多个测量任务。
* **脚本 (Scon)****测量任务 (Td)** 之间存在一对多关系。一个脚本可以被多个测量任务使用。
* **测量任务 (Td)****测量数据详情 (Td1dcon, Td2dcon, Td3dcon)** 之间存在一对多关系。一个测量任务包含多个数据点。
```mermaid
erDiagram
PROJECT {
AutoNumber ID PK
string CN UK
string PRname
string PRdesc
string location
datetime PRdate
long duration
string PS
string CS
string PM
string QAS
string standard
}
DEVICE {
AutoNumber ID PK
string DEname
string modelNO
string SN UK
string HWV
string SWV
datetime Mdate
string Mbatch
string GPS
}
SCON {
AutoNumber ID PK
string CN UK
string Sname
int Eamount
int CHamount
int TPamount
string definer
datetime DEdate
string SCdesc
string Rect
string RectLoc
string PoleDistance
string PoleStep
}
TZ {
AutoNumber ID PK
string CN
string TZname
string location
datetime Cdate
datetime Ctime
long PROID FK
}
TD {
AutoNumber ID PK
string TDname
string Tlocation
string DESN FK
string SCCN FK
string Sname
int Stype
int Ttype
int Tmode
int Eamount
int TPamount
int CHamount
int N
int TRwave
int TRfrequency
int Ifrequency
int SAfrequency
int Clayout
string Espace
string Edistance
int weather
int WDIR
int temperature
int height
int humidity
datetime Cdate
datetime Ctime
datetime Tdate
datetime Ttime
int Rdirection
int CRtime
string PM
string OP
string QA
string rect
string rect_loc
int SkipCable
int IsAutoGenerate
long TZID FK
}
TD1DCON {
AutoNumber ID PK
int TSN
long TCHID
float V
float I
float R0
float SP
boolean bUse
memo Vrawdata
memo Irawdata
}
TD2DCON {
AutoNumber ID PK
int TSN
long TCHID
float V
float I
float R0
float SP
boolean bUse
memo Vrawdata
memo Irawdata
}
TD3DCON {
AutoNumber ID PK
int TSN
long TCHID
float V
float I
float R0
float SP
boolean bUse
memo Vrawdata
memo Irawdata
}
PROJECT ||--o{ TZ : "包含"
TZ ||--o{ TD : "包含"
DEVICE ||--o{ TD : "执行"
SCON ||--o{ TD : "使用"
TD ||--o{ TD1DCON : "包含"
TD ||--o{ TD2DCON : "包含"
TD ||--o{ TD3DCON : "包含"
```
**Diagram sources **
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
## 关键字段业务含义与验证规则
本节列举核心表中关键字段的业务含义和可能的数据验证规则。
### 项目 (Project) 表
* **`CN` (项目ID):** 项目的唯一标识符。业务规则要求其在系统内必须唯一。
* **`PRname` (项目名称):** 项目的名称,用于用户识别。不能为空。
* **`PRdate` (日期):** 项目创建的日期,用于时间排序和报告生成。
* **`PS`, `CS`, `PM`, `QAS` (人员):** 记录项目相关人员,用于责任追溯。
### 设备 (Device) 表
* **`SN` (序列号):** 设备的唯一硬件标识符。业务规则要求其在系统内必须唯一。
* **`Mdate` (生产日期):** 设备的生产日期,用于设备生命周期管理。
### 脚本 (Scon) 表
* **`CN` (脚本ID):** 脚本的唯一标识符。业务规则要求其在系统内必须唯一。
* **`Eamount` (电极数量):** 定义了测量阵列中使用的电极总数。必须为正整数。
* **`CHamount` (通道数量):** 定义了测量任务中使用的通道数量。必须为正整数。
### 测量任务 (Td) 表
* **`TDname` (任务名称):** 测量任务的名称,用于用户识别。不能为空。
* **`Ttype` (测试方法):** 一个整型代码,通过`cm`表(代码映射表)关联到具体的测试方法名称(如“电阻率”、“激电”等)。
* **`Clayout` (装置类型):** 一个整型代码,通过`cm`表关联到具体的装置名称(如“温纳”、“施伦贝谢”等)。
* **`Espace` / `Edistance` (电极间距/距离):** 存储为文本类型,可能包含单位信息(如"5m"),提供了更大的灵活性。
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
## 数据库版本演进历史
根据`DB/数据库字段修改记录.txt`文件,数据库经历了多次重要的结构变更。以下是按时间顺序整理的版本演进历史:
| 日期 | 变更内容 | 变更类型 | 兼容性说明 |
| :--- | :--- | :--- | :--- |
| 2015年6月2日 | 在`td1dcon`, `td2dcon`, `td3dcon`表中增加`bUse`字段,用于标记记录是否有效。 | 新增字段 | 向后兼容。旧数据的`bUse`字段默认为`True`(有效)。 |
| 2015年6月12日 | 1. 在`Td`表中增加`rect``rect_loc`字段。<br>2. 将`Td`表的`Espace``Edistance`字段从数字类型改为文本类型。<br>3. 在`scon`表中增加`Rect`, `RectLoc`, `PoleDistance`, `PoleStep`字段,并删除旧的`X0\Y0\X1\Y1`字段。 | 新增字段<br>修改字段类型<br>新增/删除字段 | 向后兼容。旧数据的`rect``rect_loc`为空。`Espace``Edistance`的数值被转换为字符串。旧的坐标字段被废弃。 |
| 2016年12月2日 | 1. 在`ac`, `acds`, `td_spc_attr`表中新增10个时窗的信息。<br>2. 在`cm`表中加入发射频率为9(0.03125Hz)。 | 新增字段<br>新增数据 | 向后兼容。新时窗字段在旧数据中为空。 |
| 2017年9月12日 | 在`project`以及`tz`表中加入默认的工程和默认测区。 | 新增数据 | 向后兼容。不影响现有数据。 |
| 2017年9月18日 | 1. 在`device`表中增加`GPS`字段。<br>2. 在`desetting`表中增加`CableType`, `LowPowerAlarm`, `AutoStack`字段。<br>3. 将`gr`表中的`ECODE`属性从文本改成整型。<br>4. 在`td`表中增加`SkipCable`字段。<br>5. 将`td`表中的`DESN`属性从必填改为非必填。 | 新增字段<br>修改字段类型<br>修改字段约束 | 向后兼容。`GPS`等新字段在旧设备记录中为空。`ECODE`的文本值被转换为对应的整型代码。`DESN`字段可为空。 |
| 2017年9月23日 | 新增`task_timer`表。 | 新增表 | 向后兼容。该表用于新功能,不影响旧数据。 |
| 2017年9月25日 | 在`td`表中添加`IsAutoGenerate`字段。 | 新增字段 | 向后兼容。旧任务的该字段为`False`。 |
| 2017年9月26日 | 在`timer_task`表中增加`PLCID`字段。 | 新增字段 | 向后兼容。 |
| 2017年9月28日 | 将`td1d/2d/3ddcon`表中的`V,I,R0,SP`的字段属性都改为非必填字段。 | 修改字段约束 | 向后兼容。允许存储不完整的测量数据。 |
| 2019年7月4日 | `medium`表新增加强梯度装置。 | 新增数据 | 向后兼容。 |
| 2019年7月14日 | 1. `medium`表新增跨孔装置。<br>2. 新增`TTaskInfoCoordinetes`表,用于保存电极坐标信息。 | 新增数据<br>新增表 | 向后兼容。 |
| 2019年12月3日 | 新增`TPictureInfo``TPictureCode`表,用于存放图片和二维码信息。 | 新增表 | 向后兼容。 |
| 2019年12月11日 | 新增`TLoggingTaskInfo``TLoggingTaskContent`表,用于支持测井功能。 | 新增表 | 向后兼容。 |
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
## 结论
本文档基于对Geomative Studio项目代码和数据库变更记录的分析,全面描述了其Access数据库的模式。数据库设计围绕“项目-测区-任务-数据”的核心流程,通过清晰的表结构和关系来管理地质勘探数据。数据库经历了从2015年至今的持续演进,通过新增字段、修改类型和增加新表的方式,不断扩展功能以支持新的测量方法和设备特性。所有变更都遵循了向后兼容的原则,确保了旧版数据在新版软件中的可用性。`cm`表作为核心的代码映射表,为系统提供了良好的可配置性和多语言支持能力。
@@ -0,0 +1,193 @@
# 测量数据模型
<cite>
**本文档引用的文件**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [database_modify.xml](file://Install/Geomative Studio/database_modify.xml)
- [Release\DB\数据库字段修改记录.txt](file://Release/DB/数据库字段修改记录.txt)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
- [TaskDataOper.h](file://h/TaskDataOper.h)
- [CLoggingDataOper.cpp](file://cpp/logging/CLoggingDataOper.cpp)
- [DialUploadLoopTask.h](file://h/DialUploadLoopTask.h)
- [TdRecord.h](file://h/TdRecord.h)
</cite>
## 目录
1. [引言](#引言)
2. [核心数据表结构](#核心数据表结构)
3. [几何信息记录设计](#几何信息记录设计)
4. [字段类型变更原因](#字段类型变更原因)
5. [定时任务管理机制](#定时任务管理机制)
6. [测井与图像数据管理](#测井与图像数据管理)
7. [电极坐标同步机制](#电极坐标同步机制)
8. [结论](#结论)
## 引言
本文件详细描述了Geomative Studio软件的测量数据模型,重点阐述了Td表及其关联表(如gr、ac、cm等)的结构设计。文档涵盖了2015年6月12日引入的测试任务几何信息记录设计、2017年9月23日和26日的定时任务管理功能,以及后续新增的测井和图像数据管理表。通过分析数据库修改记录和相关代码实现,本文档为理解系统的数据存储和管理机制提供了全面的参考。
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [Release/DB/数据库字段修改记录.txt](file://Release/DB/数据库字段修改记录.txt)
## 核心数据表结构
测量数据模型的核心是Td表,它存储了所有测试任务的基本信息。该表与多个关联表共同构成了完整的数据结构体系。gr表用于存储测量数据,cm表存储了代码和标签的映射关系,而tdchannel表则记录了通道信息。这些表通过ID等字段相互关联,形成了一个完整的数据网络。
```mermaid
erDiagram
Td {
int ID PK
string TDname
string DESN
string Sname
int Stype
int Ttype
int Eamount
int TPamount
string Edistance
string rect
string rect_loc
datetime Cdate
datetime Tdate
}
gr {
int ID PK
int TDID FK
string Ecode
datetime Mdate
datetime Mtime
int OMvalue
int StatusCode
}
cm {
int ID PK
string Cname
int Cvalue
string Clabel
int Lang
}
tdchannel {
int ID PK
int TDID FK
int CHnumber
int AR
}
Td ||--o{ gr : "包含"
Td ||--o{ tdchannel : "包含"
cm }|--|| Td : "Stype映射"
cm }|--|| Td : "Ttype映射"
```
**Diagram sources **
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
## 几何信息记录设计
2015年6月12日,系统对Td表进行了重要更新,增加了rect和rect_loc字段来记录测试任务的几何信息。这一设计变更旨在更精确地描述测量任务的空间布局。rect字段以文本类型存储矩形的大小,而rect_loc字段则记录矩形的位置信息。同时,系统删除了原有的X0\Y0\X1\Y1字段,采用了更灵活的文本格式来存储几何信息。
```mermaid
erDiagram
Td {
string rect
string rect_loc
}
SCON {
string Rect
string RectLoc
float PoleDistance
float PoleStep
}
Td }|--|| SCON : "几何参数"
```
**Diagram sources **
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
## 字段类型变更原因
在2015年6月12日的更新中,系统将Td表的Espace和Edistance字段从数字类型改为文本类型。这一变更的主要原因是增加了对多种单位和格式的支持。通过使用文本类型,系统可以存储包含单位标识的值(如"10m"、"5ft"等),提高了数据的灵活性和可读性。此外,文本类型还支持存储复杂的距离描述,如范围值或特殊标记。
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
## 定时任务管理机制
2017年9月23日,系统新增了task_timer表用于管理定时任务。该表与PLCID字段(2017年9月26日添加)共同构成了定时任务管理的核心。task_timer表存储了定时任务的配置信息,包括执行时间、周期等。PLCID字段用于标识与任务关联的PLC设备,实现了任务与特定设备的绑定。这一机制使得系统能够自动化执行测量任务,并与外部设备进行协调。
```mermaid
erDiagram
task_timer {
int ID PK
datetime TaskTime
int Interval
string PLCID
int Status
}
Td {
int ID PK
bool IsAutoGenerate
}
task_timer }|--|| Td : "生成任务"
```
**Diagram sources **
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [DialUploadLoopTask.h](file://h/DialUploadLoopTask.h)
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
## 测井与图像数据管理
系统在2019年12月新增了TPictureInfo和TLoggingTaskInfo等表,用于管理测井和图像数据。TPictureInfo表存储了图片信息,包括岩性图片的路径和描述。TLoggingTaskInfo表则用于存储新建的测井任务信息,供用户选择和执行。这些新增表扩展了系统的功能,使其能够支持更复杂的测井和数据可视化需求。
```mermaid
erDiagram
TPictureInfo {
int ID PK
int LanguageID
string LithologyName
string LithologyPicPath
string LithologyType
}
TLoggingTaskInfo {
int TaskID PK
string TaskName
string Location
byte LogType
float SamplingInterval
float InitDepth
float EndDepth
}
TLoggingTaskContent {
int TaskID PK, FK
int TestID PK
float Depth
string Data
}
TPictureInfo ||--o{ TLoggingTaskContent : "关联"
TLoggingTaskInfo ||--o{ TLoggingTaskContent : "包含"
```
**Diagram sources **
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [CLoggingDataOper.cpp](file://cpp/logging/CLoggingDataOper.cpp)
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [CLoggingDataOper.cpp](file://cpp/logging/CLoggingDataOper.cpp)
## 电极坐标同步机制
2019年7月14日,系统新增了TTaskInfoCoordinetes表,用于管理电极坐标信息。该表的主要作用是将本地的坐标信息下发给GD设备,或者保存云端的坐标数据。通过这一机制,系统实现了电极坐标的同步和共享,确保了测量数据的一致性和准确性。TTaskInfoCoordinetes表与任务ID关联,为每个测量任务提供了精确的电极位置信息。
**Section sources**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
## 结论
Geomative Studio的测量数据模型经过多次迭代和优化,形成了一个功能完整、结构合理的数据管理体系。从最初的Td表到后来的定时任务管理和测井数据管理,系统的数据模型不断扩展以满足新的需求。通过分析这些设计变更,我们可以看到系统在灵活性、可扩展性和实用性方面的持续改进。这些改进不仅提升了系统的功能,也为用户提供了更强大的数据管理能力。
@@ -0,0 +1,222 @@
# 脚本数据模型
<cite>
**本文档中引用的文件**
- [database_modify.xml](file://database_modify.xml)
- [config.ini](file://config.ini)
- [Script.h](file://h/Script.h)
- [Script2D.h](file://h/Script2D.h)
- [Script3D.h](file://h/Script3D.h)
- [ScriptCE.h](file://h/ScriptCE.h)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
</cite>
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 引言
本文档旨在全面阐述Geomative Studio中2D/3D/CE测量脚本的数据模型设计,重点分析`td2dcon``td3dcon``td1dcon`等表的结构设计,以及`bUse`字段在记录有效性管理中的设计意图与实现方式。同时,深入解析SCON表中`Rect``RectLoc``PoleDistance`等字段在跨孔测量中的作用,阐明脚本生成过程中的数据访问模式、约束条件及`SkipCable``IsAutoGenerate`等字段的业务逻辑。
## 项目结构
Geomative Studio项目采用典型的C++/MFC架构,其核心功能围绕地质测量脚本的生成、管理和执行。项目结构清晰地划分为`cpp`(源代码)、`h`(头文件)、`DB`(数据库相关)、`Install`(安装配置)等目录。脚本相关的数据模型和业务逻辑主要集中在`cpp/Managers``cpp/Operator`目录下的`TdManager.cpp``DataOperator.cpp`等文件中,而数据结构定义则位于`h`目录下的`Script*.h`系列头文件。
```mermaid
graph TB
subgraph "核心模块"
Script[脚本管理]
Data[数据操作]
Task[任务执行]
end
subgraph "数据层"
DB[(数据库)]
Config[配置文件]
end
Script --> Data
Data --> DB
Task --> Script
Task --> Data
Config --> Script
Config --> Task
```
**图示来源**
- [database_modify.xml](file://database_modify.xml)
- [config.ini](file://config.ini)
**本节来源**
- [database_modify.xml](file://database_modify.xml#L1-L25)
- [config.ini](file://config.ini#L1-L73)
## 核心组件
本系统的核心组件围绕测量脚本(Script)的生命周期管理展开。`CScript`基类定义了所有脚本的通用属性和接口,而`CScript2D``CScript3D``CScriptCE`等派生类则分别实现了二维、三维和电容耦合(CE)测量脚本的特定功能。`TdManager`类负责将脚本配置转化为具体的测量任务,并管理任务数据的生成与存储。`DataOperator`类则提供了对数据库中测量记录的直接操作能力,如启用/禁用特定记录。
**本节来源**
- [Script.h](file://h/Script.h#L1-L39)
- [Script2D.h](file://h/Script2D.h#L1-L32)
- [Script3D.h](file://h/Script3D.h#L1-L43)
- [ScriptCE.h](file://h/ScriptCE.h#L1-L28)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2981-L3000)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869)
## 架构概述
系统采用分层架构,上层为用户界面,中层为业务逻辑处理(Manager和Operator),底层为数据存储(数据库)。脚本数据模型是连接业务逻辑与数据存储的核心。当用户创建一个测量任务时,系统会根据选择的测量类型(2D/3D/CE)实例化相应的脚本类,生成具体的测量序列,并将这些序列作为记录插入到`td2dcon``td3dcon``td1dcon`等结果表中。`bUse`字段在此过程中起到关键的过滤作用,确保只有有效的测量序列被实际执行。
```mermaid
graph LR
UI[用户界面] --> BL[业务逻辑层]
BL --> DL[数据层]
subgraph 业务逻辑层
SptMng[脚本管理器]
TdMng[任务管理器]
DataOp[数据操作器]
end
subgraph 数据层
DB[(数据库)]
end
SptMng --> TdMng
TdMng --> DataOp
DataOp --> DB
TdMng --> DB
```
**图示来源**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2981-L3000)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869)
## 详细组件分析
### 脚本数据表结构分析
系统为不同类型的测量任务设计了专用的结果表,以存储测量配置和结果。这些表包括`td2dcon`(二维测量)、`td3dcon`(三维测量)和`td1dcon`(一维测量)。这些表的结构高度相似,均包含电极配置(如`C1`, `C2`, `P1`, `P2``a`, `b`, `x`, `y`)、几何因子`K`、测量值`V`, `I`、视电阻率`R0`以及关键的`bUse`字段。
#### bUse字段的设计意图与实现
`bUse`字段(类型为Yes/No)是标记记录有效性的核心机制。其设计意图在于提供一种灵活的“软删除”或“临时禁用”功能,允许用户在不删除原始数据的情况下,排除某些测量序列。例如,当某个电极被确认为故障时,可以批量更新所有涉及该电极的记录的`bUse`字段为`false`,从而在后续的数据处理和成图中忽略这些无效数据。
该字段的实现主要通过`DataOperator`类中的SQL更新语句完成。例如,在`DataOperator.cpp`中,存在多个`update td*con set bUse = false`的语句,用于根据电极编号或测点坐标批量禁用记录。这表明`bUse`字段是数据质量控制流程中的关键一环。
```mermaid
flowchart TD
Start([开始]) --> CheckElectrode["检查电极状态"]
CheckElectrode --> Faulty{"电极故障?"}
Faulty --> |是| UpdateDB["更新数据库: bUse = false"]
Faulty --> |否| KeepActive["保持 bUse = true"]
UpdateDB --> End([结束])
KeepActive --> End
```
**图示来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L3978-L4205)
**本节来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L4779)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L3978-L4205)
### SCON表字段在跨孔测量中的作用
虽然`database_modify.xml`中未直接定义SCON表,但从`TdManager.cpp`的SQL语句中可以推断出其存在及部分字段。`Clayout`(电缆布局)、`SkipCable`(跳过电缆)、`rect`(矩形区域)、`rect_loc`(矩形位置)等字段是配置跨孔测量的关键参数。
- **`rect``rect_loc`**: 这两个字段共同定义了跨孔测量的几何范围。`rect`可能表示矩形的尺寸(如长宽),而`rect_loc`则指定了该矩形在三维空间中的具体位置(如中心坐标或角点坐标)。它们为生成孔间测量的电极组合提供了空间约束。
- **`PoleDistance`**: 虽然在代码中未直接出现,但根据命名惯例,它很可能存储了电极之间的间距,这是计算几何因子`K`的基础。
- **`SkipCable`**: 此字段用于标记在测量过程中需要跳过的电缆。在复杂的多电缆系统中,某些电缆可能因损坏或维护而暂时不可用。`SkipCable`字段允许系统在生成测量序列时自动排除这些电缆上的电极,确保测量计划的可行性。
```mermaid
classDiagram
class SCON {
+int Clayout
+int SkipCable
+float CRTime
+float Edistance
+string rect
+string rect_loc
+int DESN
+datetime STime
+datetime ETime
}
class td2dcon {
+int TCHID
+int TSN
+int C1
+int C2
+int P1
+int P2
+int N
+float K
+float I
+float V
+float R0
+float SP
+bool bUse
}
SCON --> td2dcon : "生成"
```
**图示来源**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2981-L3000)
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L337-L343)
**本节来源**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2891-L3000)
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L181-L343)
## 依赖分析
系统的数据模型依赖于一个关系型数据库(从SQL语句推断,可能为Access或SQLite)。`td*con`系列表通过`TCHID`(通道ID)与`tdchannel`表关联,而`tdchannel`又通过`TDID`(任务ID)与更高层级的任务表关联,形成了清晰的层级依赖关系。此外,`Script*.h`头文件定义了数据结构,被`TdManager.cpp``DataOperator.cpp`等实现文件所依赖,体现了代码层面的依赖。
```mermaid
erDiagram
SCON ||--o{ td2dcon : "生成"
SCON ||--o{ td3dcon : "生成"
SCON ||--o{ td1dcon : "生成"
tdchannel ||--o{ td2dcon : "包含"
tdchannel ||--o{ td3dcon : "包含"
tdchannel ||--o{ td1dcon : "包含"
TASK ||--o{ tdchannel : "包含"
SCON {
int Clayout
int SkipCable
string rect
string rect_loc
}
td2dcon {
int TCHID PK, FK
int TSN PK
int C1
int C2
int P1
int P2
bool bUse
}
tdchannel {
int ID PK
int TDID FK
}
```
**图示来源**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1299-L1496)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869)
**本节来源**
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1299-L5796)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L4779)
## 性能考虑
脚本数据模型的设计对性能有重要影响。`bUse`字段的使用避免了物理删除大量记录,减少了I/O开销。然而,频繁地更新`bUse`字段(如批量禁用)可能会产生大量的数据库写操作。为优化性能,建议在应用层进行批量操作,减少数据库事务的提交次数。此外,`td*con`表上的`TCHID``TSN`字段应建立索引,以加速按通道和序列号的查询。
## 故障排除指南
当遇到测量数据异常时,应首先检查`bUse`字段的状态。如果预期的测量序列未被执行,可能是其`bUse`字段被错误地设置为`false`。可以通过查询`td*con`表中`bUse = false`的记录来定位问题。对于跨孔测量失败的情况,应检查`SCON`表中的`SkipCable``rect`/`rect_loc`配置是否正确,确保测量范围和电缆布局符合现场实际情况。
**本节来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L4779)
- [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2891-L3000)
## 结论
Geomative Studio的脚本数据模型设计精巧,通过`td2dcon``td3dcon``td1dcon`等专用表实现了对不同类型测量任务的有效管理。`bUse`字段作为记录有效性的开关,为数据质量控制提供了极大的灵活性。`SCON`表中的`rect``rect_loc``SkipCable`等字段则是实现复杂跨孔测量配置的关键。理解这些数据结构和字段的业务逻辑,对于正确使用系统、分析测量数据以及进行故障排除至关重要。
@@ -0,0 +1,283 @@
# 设备数据模型
<cite>
**本文档引用的文件**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
- [database_modify.xml](file://database_modify.xml)
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
- [Device.h](file://h/Device.h)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
</cite>
## 目录
1. [引言](#引言)
2. [设备数据模型结构](#设备数据模型结构)
3. [核心组件分析](#核心组件分析)
4. [数据流与业务规则](#数据流与业务规则)
5. [版本演进与兼容性](#版本演进与兼容性)
6. [结论](#结论)
## 引言
本文档旨在深入解析Geomative Studio软件中的设备数据模型,重点阐述device表的结构及其与desetting表的关系。文档将详细说明GPS字段的引入、CableType、LowPowerAlarm、AutoStack等配置字段的用途,解释设备参数配置的数据流和业务规则,包括设备状态监控和固件升级相关的数据存储逻辑。结合数据库变更记录,文档还将阐述设备数据模型的版本演进过程和兼容性处理策略。
## 设备数据模型结构
### 设备表(device)与配置表(desetting)关系
设备数据模型的核心是device表和desetting表。device表存储设备的基本信息,如设备名称、序列号、型号、硬件版本、软件版本等。desetting表则存储设备的配置参数,通过DEID字段与device表建立关联。这种分离设计使得设备基本信息和配置参数可以独立管理,提高了数据模型的灵活性和可维护性。
```mermaid
erDiagram
device {
uuid ID PK
string DEname
string SN UK
string modelNO
string HWV
string SWV
timestamp Mdate
string Mbatch
string GPS
}
desetting {
uuid ID PK
uuid DEID FK
int Ifrequency
int numformat
int Tsys
int Mvoltage
int Msys
int maxRG
int Tzone
int STdelay
int PSmode
int PBtone
int Ttone
int dimmer
int lang
string CableType
int LowPowerAlarm
int AutoStack
}
device ||--o{ desetting : "1对多"
```
**图表来源**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt#L23-L24)
- [Device.h](file://h/Device.h#L88-L103)
### 核心字段说明
- **GPS字段**:于2017年9月18日引入,用于记录设备的地理位置信息,支持野外作业的精确定位和数据关联。
- **CableType**:于2017年9月18日引入,用于标识设备连接的电缆类型,支持不同型号电缆的识别和管理。
- **LowPowerAlarm**:于2017年9月18日引入,用于设置低电量报警阈值,当设备电量低于设定值时触发报警,确保设备在关键作业中不会因电量不足而中断。
- **AutoStack**:于2017年9月18日引入,用于控制设备的自动叠加功能,提高数据采集的效率和一致性。
**章节来源**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt#L23-L24)
## 核心组件分析
### 设备管理类(CDevice
CDevice类是设备数据模型的核心实现,负责设备的全生命周期管理,包括设备信息的获取、参数配置、状态监控和固件升级等。该类通过m_pConnection成员变量与数据库连接,实现数据的持久化存储。
```mermaid
classDiagram
class CDevice {
+DWORD m_dwID
+UINT m_uState
+UINT m_uType
+BYTE m_ucDevType
+CSComPort m_sComPort
+CString m_szDevSN
+CString m_szDevName
+CString m_szModelNO
+CString m_szMDate
+CString m_szHWV
+CString m_szSWV
+CString m_szMBatch
+CString m_szMacAddress
+_ConnectionPtr m_pConnection
+FILE *m_pLogFile
+CDevice(DWORD dwID, _ConnectionPtr& pConnection)
+~CDevice()
+BOOL Reset()
+BOOL DelSynInfo()
+BOOL DelGRInfo()
+BOOL GetSynInfo()
+BOOL GetDevInfo()
+BOOL GetGRInfo()
+int GetPoleCount()
+BOOL Register()
+BOOL Unregister()
+BOOL SendFile(const CString &szHostFilePath, const CString &szLocFilePath, const CString& szLocFileName)
+BOOL ReceiveFile(const CString &szLocFilePath, const CString& szHostFileName,int nRetryCnt = 3)
+bool ShowFLDetailInfo(CListCtrl& devDetailList)
+bool ShowOLDetailInfo(CListCtrl& devDetailList)
+bool ShowGRInfo(CListCtrl& devGRList)
+bool ShowACInfo(CListCtrl& devDetailList)
+BOOL ModifyParameter()
+BOOL ShowCableHeadInfoDlg()
+BOOL IsTheNumofPoleChanged()
+BOOL TestGRForPerPole(int iSN, CStringArray& strResArray)
+BOOL TestGRForAllPole()
+void SetState(UINT uState)
+void SetID(DWORD dwID)
+void PrintLog(CString& strLog)
+int IsExistOtherUserData()
+int CheckGD10Password(CString strGD10Password)
}
```
**图表来源**
- [Device.h](file://h/Device.h#L33-L125)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L42-L71)
### 数据操作类(CDataOperator
CDataOperator类负责设备数据的读写操作,提供了一系列方法来初始化设备视图、显示设备信息、创建和删除项目等。该类通过m_pConnection成员变量与数据库连接,执行SQL查询和更新操作。
```mermaid
classDiagram
class CDataOperator {
+_ConnectionPtr m_pConnection
+CStateProcessor m_stateProcessor
+CHandleProcessor m_handleProcessor
+CDataOperator(_ConnectionPtr& pConnection)
+~CDataOperator()
+bool InitialNavDataView(CNavDataView* pNavDataView)
+void ShowProjectInfo(DWORD dwProHandle, CView *pAppDataView)
+void ShowTzInfo(DWORD dwTzHandle, CView *pAppDataView)
+void ShowRsp3DTdInfo(DWORD dwTdHandle, CView *pAppDataView)
+void ShowRsp2DTdInfo(DWORD dwTdHandle, CView *pAppDataView)
+void ShowRspCETdInfo(DWORD dwTdHandle, CView* pAppDataView)
+void LoadRspCERecordbyPage(DWORD dwTdHandle, CView *pAppDataView, int iSType)
+void LoadRsp2dRecordbyPage(DWORD dwTdHandle, CView *pAppDataView, int iSType)
+void LoadRsp3dRecordbyPage(DWORD dwTdHandle, CView *pAppDataView, int iSType)
+void ShowIps2DpTdInfo(DWORD dwTdHandle, CView *pAppDataView)
+void ShowIps3DpTdInfo(DWORD dwTdHandle, CView *pAppDataView)
+void ShowIpsCEpTdInfo(DWORD dwTdHandle, CView *pAppDataView)
+void LoadIpspCERecordbyPage(DWORD dwTdHandle, CView *pAppDataView, int iSType/* = 1*/)
+void LoadIpsp2dRecordbyPage(DWORD dwTdHandle, CView *pAppDataView, int iSType/* = 2*/)
+void LoadIpsp3dRecordbyPage(DWORD dwTdHandle, CView *pAppDataView, int iSType/* = 3*/)
+UINT CreateProjectInDB(CNavDataView* pNavDataView)
+DWORD GetTdIdFromNavDataView(CNavDataView *pNavDataView)
+void UpdateNavDataViewAfterDel(CNavDataView *pNavDataView)
+UINT DeleteProjectInDB(CNavDataView* pNavDataView)
}
```
**图表来源**
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L69-L846)
### 设备操作类(CDevOperator
CDevOperator类负责设备的在线和离线操作,提供了一系列方法来初始化设备视图、显示设备信息、刷新接地电阻记录等。该类通过m_pConnection成员变量与数据库连接,执行SQL查询和更新操作。
```mermaid
classDiagram
class CDevOperator {
+_ConnectionPtr m_pConnection
+CStateProcessor m_stateProcessor
+CHandleProcessor m_handleProcessor
+HTREEITEM m_hOLRegDevRootItem
+HTREEITEM m_hOLNewDevRootItem
+HTREEITEM m_hFLDevRootItem
+CString m_strLocalFilePath
+CString m_strProCN
+CString m_strTzCN
+CDevOperator(_ConnectionPtr& pConnection)
+~CDevOperator()
+bool InitialNavDevView(CNavDevView* pNavDevView)
+void ShowFLDeviceInfo(DWORD dwDevHandle, CView *pAppFLDevView)
+void ShowOLDeviceInfo(DWORD dwDevHandle, CView *pAppOLDevView)
+void ExpandTree(CTreeCtrl* pTreeCtrl,HTREEITEM hItem)
+UINT DevieUpgrade(CNavDevView *pNavDevView)
+UINT ModifyDeviceParameter(CNavDevView *pNavDevView, CListCtrl &detailList)
+void ShowCableHeadDlg(CNavDevView *pNavDevView)
+UINT RefreshGRRec(CNavDevView *pNavDevView, CListCtrl &grList, int iItemIndex)
+UINT RefreshAllGRRec(CNavDevView *pNavDevView, CListCtrl &grList)
}
```
**图表来源**
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L39-L800)
## 数据流与业务规则
### 设备参数配置数据流
设备参数配置的数据流始于用户在图形界面中修改设备参数,通过CDevOperator类的ModifyDeviceParameter方法触发。该方法调用CDevice类的ModifyParameter方法,生成相应的配置命令并发送到设备。设备返回确认后,CDevice类将新的配置参数写入数据库的desetting表中。
```mermaid
sequenceDiagram
participant User as 用户
participant UI as 图形界面
participant DevOperator as CDevOperator
participant Device as CDevice
participant DB as 数据库
User->>UI : 修改设备参数
UI->>DevOperator : 调用ModifyDeviceParameter
DevOperator->>Device : 调用ModifyParameter
Device->>Device : 生成配置命令
Device->>Device : 发送命令到设备
Device->>Device : 接收设备确认
Device->>DB : 更新desetting表
DB-->>Device : 确认更新
Device-->>DevOperator : 返回结果
DevOperator-->>UI : 返回结果
UI-->>User : 显示结果
```
**图表来源**
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L435-L461)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L71-L72)
### 设备状态监控
设备状态监控通过CDevice类的ShowOLDetailInfo方法实现。该方法从数据库的device表和desetting表中读取设备的当前状态和配置参数,并在图形界面中显示。状态信息包括设备名称、型号、序列号、硬件版本、软件版本、制造日期、批次号以及各种配置参数的当前值。
**章节来源**
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L154-L278)
### 固件升级数据存储
固件升级过程由CDevOperator类的DevieUpgrade方法启动。该方法创建一个升级线程,调用CDevice类的ReceiveFile方法从服务器下载固件文件。升级完成后,新的固件版本信息被写入device表的SWV字段,确保版本信息的准确性和一致性。
**章节来源**
- [DevOperator.cpp](file://cpp/Operator/DevOperator.cpp#L384-L433)
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L682-L726)
## 版本演进与兼容性
### 数据库变更记录
设备数据模型的版本演进记录在`DB/数据库字段修改记录.txt`文件中。关键变更包括:
- **2017年9月18日**:在device表中增加GPS字段,在desetting表中增加CableType、LowPowerAlarm、AutoStack字段。
- **2017年9月25日**:在td表中添加IsAutoGenerate字段。
- **2019年7月4日**medium表新增加强梯度装置。
- **2019年7月14日**medium表新增跨孔装置,新增TTaskInfoCoordinetes表。
这些变更记录为数据模型的维护和升级提供了重要的历史参考。
**章节来源**
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt#L1-L61)
### 兼容性处理策略
系统通过`database_modify.xml`文件和CUpdateDataBase类实现数据库的兼容性处理。CUpdateDataBase类在启动时解析`database_modify.xml`文件,根据当前版本和目标版本的差异,自动执行数据库结构的升级操作。升级操作包括增加表、删除表、修改表结构等,确保不同版本之间的数据兼容性。
```mermaid
flowchart TD
Start([系统启动]) --> CheckVersion["检查当前数据库版本"]
CheckVersion --> VersionMatch{"版本匹配?"}
VersionMatch --> |是| End([系统正常运行])
VersionMatch --> |否| ParseXML["解析database_modify.xml"]
ParseXML --> FindUpdate["查找版本更新记录"]
FindUpdate --> ExecuteUpdate["执行数据库更新"]
ExecuteUpdate --> UpdateTable["更新表结构"]
UpdateTable --> UpdateIndex["更新索引"]
UpdateIndex --> UpdateForeignKey["更新外键约束"]
UpdateForeignKey --> WriteVersion["写入新版本号"]
WriteVersion --> End
```
**图表来源**
- [database_modify.xml](file://database_modify.xml#L1-L25)
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp#L20-L874)
## 结论
Geomative Studio的设备数据模型设计合理,通过device表和desetting表的分离实现了设备信息和配置参数的独立管理。GPS、CableType、LowPowerAlarm、AutoStack等字段的引入,增强了设备的功能性和智能化水平。系统通过CDevice、CDataOperator、CDevOperator等核心类实现了设备的全生命周期管理,确保了数据的一致性和可靠性。数据库变更记录和兼容性处理策略为系统的长期维护和升级提供了有力支持。
@@ -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)