a
This commit is contained in:
@@ -0,0 +1,234 @@
|
||||
# 测区管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp)
|
||||
- [TestingZone.h](file://h/TestingZone.h)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp)
|
||||
- [opcreatetzdlg.h](file://h/opcreatetzdlg.h)
|
||||
- [appdatatzlistview.cpp](file://cpp/Views/appdatatzlistview.cpp)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目与测区层级关系](#项目与测区层级关系)
|
||||
2. [CProManager::ShowTzList方法分析](#cpromanagershowtzlist方法分析)
|
||||
3. [测区类型(TZtype)枚举值及业务含义](#测区类型tztype枚举值及业务含义)
|
||||
4. [测区配置数据持久化机制](#测区配置数据持久化机制)
|
||||
5. [测区创建完整性校验流程](#测区创建完整性校验流程)
|
||||
6. [测区数据模型字段说明](#测区数据模型字段说明)
|
||||
|
||||
## 项目与测区层级关系
|
||||
|
||||
在GeomativeStudio系统中,项目与测区之间存在明确的父子层级关系。每个项目可以包含多个测区,但每个测区只能属于一个项目。这种关系通过数据库中的外键约束实现,其中测区表(tz)中的PRID字段引用项目表(project)的ID字段。
|
||||
|
||||
项目作为数据管理的基本单元,包含了测区的集合。当用户选择一个项目时,系统会根据该项目的句柄查询其下属的所有测区,并在UI界面上展示这些测区列表。这种层级结构确保了数据组织的逻辑性和一致性,同时也便于数据的同步和管理。
|
||||
|
||||
项目与测区的关系还体现在设备端的数据同步过程中。当项目被同步到设备时,其包含的测区也会被同步。系统通过dev_syn_td表来跟踪项目和测区在设备上的同步状态,其中PRCN字段对应项目的CN码,TzCN字段对应测区的CN码。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L33-L37)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L18-L44)
|
||||
|
||||
## CProManager::ShowTzList方法分析
|
||||
|
||||
CProManager::ShowTzList方法负责根据项目句柄查询数据库并填充测区列表控件。该方法首先通过项目句柄获取对应的项目ID,然后执行SQL查询语句从数据库中获取该项目下的所有测区信息。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetProjectID["从项目句柄获取项目ID"]
|
||||
GetProjectID --> CheckItemCount{"列表项数不为0?"}
|
||||
CheckItemCount --> |是| DeleteAllItems["删除所有列表项"]
|
||||
CheckItemCount --> |否| BuildSQLQuery
|
||||
DeleteAllItems --> BuildSQLQuery
|
||||
BuildSQLQuery --> ExecuteQuery["执行SQL查询"]
|
||||
ExecuteQuery --> CheckEOF{"记录集未结束?"}
|
||||
CheckEOF --> |是| InsertListItem["插入列表项"]
|
||||
InsertListItem --> SetItemText["设置列表项文本"]
|
||||
SetItemText --> GenerateHandle["生成测区句柄"]
|
||||
GenerateHandle --> SetItemData["设置列表项数据"]
|
||||
SetItemData --> MoveNext["移动到下一条记录"]
|
||||
MoveNext --> CheckEOF
|
||||
CheckEOF --> |否| CloseRecordset["关闭记录集"]
|
||||
CloseRecordset --> ReturnTrue["返回true"]
|
||||
ReturnTrue --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92)
|
||||
|
||||
## 测区类型(TZtype)枚举值及业务含义
|
||||
|
||||
测区类型(TZtype)是一个重要的枚举值,用于标识测区的业务类型。根据代码分析,TZtype的取值及其业务含义如下:
|
||||
|
||||
- **TZtype=0或1**: 表示"1D VES | 2D ERI"类型,即一维垂直电测深或二维电阻率成像。这两种类型在系统中被视为同一类别进行处理。
|
||||
- **TZtype=2**: 表示"3D ERT"类型,即三维电阻率层析成像,适用于需要三维空间数据采集的场景。
|
||||
- **TZtype=3**: 表示"DefaultTestZone"类型,即默认测区。这是一个特殊的测区类型,每个项目创建时都会自动创建一个默认测区。
|
||||
|
||||
默认测区(type=3)具有特殊处理逻辑。在创建项目时,系统会自动调用InsertDefaultTzToProject方法为新项目创建一个默认测区。这个默认测区的名称固定为"DefaultTestZone",描述和位置均为"None"。在设备同步过程中,系统会对TZtype=3进行强制检查,如果发现类型不匹配会抛出错误。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTestingZone {
|
||||
+ShowDetailInfo(CListCtrl&)
|
||||
+CTestingZone(DWORD, _ConnectionPtr&)
|
||||
+~CTestingZone()
|
||||
-m_dwID DWORD
|
||||
-m_pConnection _ConnectionPtr
|
||||
-m_szTZname CString
|
||||
-m_szCDate CString
|
||||
-m_szDesc CString
|
||||
-m_szLocation CString
|
||||
-m_szCN CString
|
||||
-m_szTZtype CString
|
||||
}
|
||||
CTestingZone --> "1" CListCtrl : "填充"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L62-L73)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341)
|
||||
|
||||
**Section sources**
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L62-L73)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341)
|
||||
|
||||
## 测区配置数据持久化机制
|
||||
|
||||
测区配置数据在设备端通过testzone.xml文件进行持久化存储。该文件的生成遵循特定的规则,并具有明确的元素结构。
|
||||
|
||||
testzone.xml文件的生成规则如下:当测区数据需要同步到设备时,系统会在本地CACHE目录下创建相应的项目和测区目录结构,然后生成testzone.xml文件。文件路径遵循"\\CACHE\\projects\\{项目CN}\\{测区CN}\\"的层级关系,与项目XML文件保持一致的目录结构。
|
||||
|
||||
testzone.xml文件的元素结构包括以下关键字段:
|
||||
- **type**: 测区类型,对应数据库中的TZtype字段
|
||||
- **cn**: 测区唯一标识码,对应数据库中的CN字段
|
||||
- **location**: 测区位置信息
|
||||
- **desc**: 测区描述信息
|
||||
- **create_date**: 创建日期
|
||||
- **testzone_name**: 测区名称
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> CreateDirectory["创建本地目录"]
|
||||
CreateDirectory --> CreateXML["创建XML文档"]
|
||||
CreateXML --> AddRoot["添加根元素testzone"]
|
||||
AddRoot --> AddType["添加type元素"]
|
||||
AddType --> AddLocation["添加location元素"]
|
||||
AddLocation --> AddDesc["添加desc元素"]
|
||||
AddDesc --> AddCreateDate["添加create_date元素"]
|
||||
AddCreateDate --> AddCreateTime["添加create_time元素"]
|
||||
AddCreateTime --> AddTestDate["添加test_date元素"]
|
||||
AddTestDate --> AddTestTime["添加test_time元素"]
|
||||
AddTestTime --> AddCN["添加cn元素"]
|
||||
AddCN --> AddName["添加testzone_name元素"]
|
||||
AddName --> Add3DScript["添加testzone_3D_script元素"]
|
||||
Add3DScript --> AddVess["添加vess元素"]
|
||||
AddVess --> AddEris["添加eris元素"]
|
||||
AddEris --> AddErts["添加erts元素"]
|
||||
AddErts --> AddWels["添加wels元素"]
|
||||
AddWels --> SaveFile["保存文件"]
|
||||
SaveFile --> SendToDevice["发送到设备"]
|
||||
SendToDevice --> UpdateDB["更新数据库同步状态"]
|
||||
UpdateDB --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L586-L605)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L838-L856)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L586-L605)
|
||||
|
||||
## 测区创建完整性校验流程
|
||||
|
||||
测区创建时的完整性校验流程包括多个步骤,确保数据的完整性和一致性。当用户通过UI界面创建新测区时,系统会执行以下校验流程:
|
||||
|
||||
首先,系统会检查测区名称是否为空。如果名称为空,会弹出错误提示"测区名称不能为空",并阻止创建操作。这是最基本的完整性校验,确保每个测区都有一个有效的名称标识。
|
||||
|
||||
对于TZtype=3的默认测区,系统有特殊的强制检查机制。在CreateDefaultTzInDev方法中,系统会检查从数据库读取的测区类型是否为3。如果不是,会立即返回错误并显示相应的错误信息。这种强制检查确保了默认测区的特殊性不会被破坏。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "用户界面"
|
||||
participant ProManager as "CProManager"
|
||||
participant Database as "数据库"
|
||||
UI->>ProManager : 调用CreateTzInDB
|
||||
ProManager->>UI : 显示创建对话框
|
||||
UI->>ProManager : 输入测区信息并确认
|
||||
ProManager->>ProManager : 验证测区名称是否为空
|
||||
alt 名称为空
|
||||
ProManager->>UI : 显示错误提示
|
||||
ProManager-->>UI : 返回失败
|
||||
else 名称有效
|
||||
ProManager->>Database : 查询同名测区是否存在
|
||||
Database-->>ProManager : 返回查询结果
|
||||
alt 测区已存在
|
||||
ProManager->>UI : 显示"测区已存在"提示
|
||||
ProManager-->>UI : 返回重复错误
|
||||
else 测区不存在
|
||||
ProManager->>Database : 插入新测区记录
|
||||
Database-->>ProManager : 返回插入结果
|
||||
ProManager->>Database : 查询新测区ID
|
||||
Database-->>ProManager : 返回测区ID
|
||||
ProManager-->>UI : 返回成功
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L67)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L956-L1009)
|
||||
|
||||
**Section sources**
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L67)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L956-L1009)
|
||||
|
||||
## 测区数据模型字段说明
|
||||
|
||||
测区数据模型包含多个关键属性字段,这些字段在UI界面中有相应的展示方式。主要字段包括:
|
||||
|
||||
- **ID**: 测区的唯一标识符,数据库主键,用于内部引用和关联
|
||||
- **名称(TZname)**: 测区的名称,在测区列表中作为第一列显示
|
||||
- **描述(TZdesc)**: 测区的详细描述信息,在列表中作为描述列显示
|
||||
- **创建日期(Cdate)**: 测区的创建日期,格式化为"YYYY-MM-DD"显示
|
||||
- **位置(location)**: 测区的地理位置信息
|
||||
- **类型(TZtype)**: 测区的业务类型,决定测区的功能和处理方式
|
||||
- **CN码**: 测区的唯一编码,用于设备同步和数据交换
|
||||
|
||||
在UI界面中,这些字段通过CListCtrl控件进行展示。测区列表视图(appdatatzlistview.cpp)定义了列表的列结构,包括测区名称、类型、创建日期和描述等列。每个列表项的数据通过SetItemData方法存储测区句柄,便于后续操作时快速定位对应的测区对象。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PROJECT ||--o{ TESTING_ZONE : "包含"
|
||||
PROJECT {
|
||||
int ID PK
|
||||
string CN UK
|
||||
string PRname
|
||||
datetime PRdate
|
||||
string PRdesc
|
||||
string location
|
||||
}
|
||||
TESTING_ZONE {
|
||||
int ID PK
|
||||
int PRID FK
|
||||
string CN UK
|
||||
string TZname
|
||||
int TZtype
|
||||
datetime Cdate
|
||||
string TZdesc
|
||||
string location
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingZone.h](file://h/TestingZone.h#L24-L29)
|
||||
- [appdatatzlistview.cpp](file://cpp/Views/appdatatzlistview.cpp#L86-L100)
|
||||
- [database_modify.xml](file://database_modify.xml#L13-L18)
|
||||
|
||||
**Section sources**
|
||||
- [TestingZone.h](file://h/TestingZone.h#L24-L29)
|
||||
- [appdatatzlistview.cpp](file://cpp/Views/appdatatzlistview.cpp#L86-L100)
|
||||
Reference in New Issue
Block a user