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,358 @@
# 项目管理界面
<cite>
**本文档引用的文件**
- [taskmngframe.cpp](file://cpp/Views/taskmngframe.cpp)
- [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp)
- [DialNew2DTask.cpp](file://cpp/Views/DialNew2DTask.cpp)
- [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp)
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp)
- [DialTaskTree.cpp](file://cpp/Views/DialTaskTree.cpp)
- [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
</cite>
## 目录
1. [任务管理框架与导航逻辑](#任务管理框架与导航逻辑)
2. [测量任务创建流程](#测量任务创建流程)
3. [任务包配置机制](#任务包配置机制)
4. [地形参数设置逻辑](#地形参数设置逻辑)
5. [任务树形视图构建与交互](#任务树形视图构建与交互)
6. [项目数据持久化与加载](#项目数据持久化与加载)
7. [任务参数验证与数据传递](#任务参数验证与数据传递)
8. [任务配置工作流](#任务配置工作流)
9. [UI响应性能优化建议](#ui响应性能优化建议)
## 任务管理框架与导航逻辑
任务管理框架由`taskmngframe.cpp`实现,作为MDI子窗口继承自`CMDIChildWnd`。该框架负责组织和管理所有与任务相关的UI组件,提供统一的导航界面。框架通过消息映射处理窗口激活、关闭等事件,确保在用户切换不同任务管理视图时能够正确更新状态和界面元素。
**Section sources**
- [taskmngframe.cpp](file://cpp/Views/taskmngframe.cpp#L1-L36)
## 测量任务创建流程
### 1D测量任务创建
`DialNew1DTask.cpp`实现了1D测量任务的创建对话框。该对话框初始化时会根据当前UI语言设置控件文本,并从`CTaskDataOper`操作类查询可用的介质类型和脚本信息。用户选择测试类型(电阻率、激电、自电)后,系统会动态更新发射波形和发射周期的选项。在用户点击"创建"按钮后,系统会执行完整的参数验证,包括任务名、测试方式、装置类型、脚本、迭代次数等,确保所有必填项都已正确填写且符合取值范围。
```mermaid
flowchart TD
Start([开始创建1D任务]) --> Init["初始化对话框\n设置语言、加载介质和脚本"]
Init --> SelectType["用户选择测试类型\n(电阻率/激电/自电)"]
SelectType --> UpdateOptions["更新发射波形和周期选项"]
UpdateOptions --> UserInput["用户输入任务参数\n任务名、位置、脚本等"]
UserInput --> Validate["点击创建时验证参数"]
Validate --> CheckName{"任务名为空?"}
CheckName --> |是| ShowError1["显示错误提示"]
CheckName --> |否| CheckType{"测试方式未选?"}
CheckType --> |是| ShowError2["显示错误提示"]
CheckType --> |否| CheckArray{"装置类型未选?"}
CheckArray --> |是| ShowError3["显示错误提示"]
CheckArray --> |否| CheckScript{"脚本未选?"}
CheckScript --> |是| ShowError4["显示错误提示"]
CheckScript --> |否| CheckStacking{"迭代次数有效?"}
CheckStacking --> |否| ShowError5["显示错误提示"]
CheckStacking --> |是| CreateTask["调用CTaskDataOper::Create1DTask\n创建任务"]
CreateTask --> Success{"创建成功?"}
Success --> |是| CloseDialog["关闭对话框"]
Success --> |否| Return["返回等待用户修正"]
ShowError1 --> Return
ShowError2 --> Return
ShowError3 --> Return
ShowError4 --> Return
ShowError5 --> Return
```
**Diagram sources**
- [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L1-L381)
### 2D测量任务创建
`DialNew2DTask.cpp`实现了2D测量任务的创建对话框。与1D任务相比,2D任务需要更多的参数配置,包括电缆布线方式、起始/结束电极、电极间距、孔间距(对于交叉孔装置)等。对话框在初始化时会根据装置类型动态显示或隐藏相关控件,例如交叉孔装置会显示孔间距输入框。当用户选择不同的测试类型时,系统会过滤可用的电缆布线方式,确保选择的配置是有效的。
```mermaid
flowchart TD
Start([开始创建2D任务]) --> Init["初始化对话框\n加载介质、脚本、电缆布局"]
Init --> SelectType["用户选择测试类型"]
SelectType --> FilterLayout["根据测试类型过滤\n电缆布线方式"]
FilterLayout --> UserInput["用户输入任务参数\n包括电极间距、起始/结束电极等"]
UserInput --> Validate["点击创建时验证参数"]
Validate --> CheckCommon["验证通用参数\n(任务名、测试方式等)"]
CheckCommon --> CheckSpace{"电极间距为零?"}
CheckSpace --> |是| ShowError1["显示错误提示"]
CheckSpace --> |否| CheckHole{"交叉孔装置且孔间距为零?"}
CheckHole --> |是| ShowError2["显示错误提示"]
CheckHole --> |否| CheckRange{"起始/结束电极越界?"}
CheckRange --> |是| ShowError3["显示错误提示"]
CheckRange --> |否| CreateTask["调用CTaskDataOper::Create2DTask\n创建任务"]
CreateTask --> Success{"创建成功?"}
Success --> |是| CloseDialog["关闭对话框"]
Success --> |否| Return["返回等待用户修正"]
ShowError1 --> Return
ShowError2 --> Return
ShowError3 --> Return
```
**Diagram sources**
- [DialNew2DTask.cpp](file://cpp/Views/DialNew2DTask.cpp#L1-L665)
### 3D测量任务创建
`DialNew3DTask.cpp`实现了3D测量任务的创建对话框。3D任务的配置最为复杂,需要设置网格大小、X/Y方向电极步长和距离等参数。当用户选择脚本时,系统会自动查询并显示网格信息(X和Y方向的点数),帮助用户理解测量范围。对话框还提供了发射周期的"自动"选项,为用户提供更灵活的配置选择。
```mermaid
flowchart TD
Start([开始创建3D任务]) --> Init["初始化对话框\n加载介质、脚本、电缆布局"]
Init --> SelectScript["用户选择脚本"]
SelectScript --> QueryGrid["查询并显示网格信息\n(X方向点数, Y方向点数)"]
QueryGrid --> UserInput["用户输入任务参数\n包括步长、距离等"]
UserInput --> Validate["点击创建时验证参数"]
Validate --> CheckCommon["验证通用参数\n(任务名、测试方式等)"]
CheckCommon --> CheckStep{"步长为空?"}
CheckStep --> |是| ShowError["显示错误提示"]
CheckStep --> |否| CreateTask["调用CTaskDataOper::Create3DTask\n创建任务"]
CreateTask --> Success{"创建成功?"}
Success --> |是| CloseDialog["关闭对话框"]
Success --> |否| Return["返回等待用户修正"]
ShowError --> Return
```
**Diagram sources**
- [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L1-L570)
## 任务包配置机制
`DialCfgTaskPacket.cpp`实现了任务包的配置对话框,允许用户将多个任务组织成一个任务包进行循环执行。对话框包含一个任务选择下拉框和一个任务列表,用户可以将选中的任务添加到列表中,也可以从列表中删除任务。系统会检查重复添加的任务,避免同一个任务被多次执行。
在用户点击"保存"时,系统会对输入的参数进行严格验证:
- 循环次数必须在1-60000之间
- 时间间隔必须在1-60000之间
- PLC ID不能为空
验证通过后,系统会将任务列表和属性信息保存到数据库中,供后续执行使用。
```mermaid
classDiagram
class CDialCfgTaskPacket {
+m_cmbTaskName : CComboBox
+m_listTaskPacket : CListCtrl
+m_cmbTaskName : CComboBox
+OnButtonAdd() void
+OnButtonDel() void
+OnOK() void
+IsRepeatTask(int) bool
+InitialTaskList() void
}
class CTaskDataOper {
+QueryTdBrowseInfo() void
+QueryTaskPacketAttr() bool
+InsertTaskPacketInfo() bool
}
CDialCfgTaskPacket --> CTaskDataOper : "使用"
```
**Diagram sources**
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L1-L301)
## 地形参数设置逻辑
`DialCfgTerrain.cpp`实现了地形参数的配置对话框,允许用户导入DAT文件并编辑地形数据点。对话框提供了添加、修改、删除地形数据点的功能,并支持从文件导入地形数据。用户可以设置地形数据标志(水平距离或垂直距离)和第一个电极对应的地形数据点编号。
在保存地形数据时,系统会执行严格的验证:
- 必须已导入DAT文件
- 必须选择地形数据标志
- 必须输入至少一个地形数据点
- 第一个电极对应的地形数据点编号必须在有效范围内
验证通过后,系统会将地形数据写入原DAT文件的末尾,遵循特定的文件格式要求。
```mermaid
flowchart TD
Start([开始配置地形]) --> ImportFile["用户导入DAT文件"]
ImportFile --> EditData["编辑地形数据点\n添加、修改、删除"]
EditData --> SetParams["设置地形参数\n标志、第一个电极编号"]
SetParams --> Save["点击保存"]
Save --> Validate["验证参数"]
Validate --> CheckFile{"已导入文件?"}
CheckFile --> |否| ShowError1["显示错误提示"]
CheckFile --> |是| CheckFlag{"选择数据标志?"}
CheckFlag --> |否| ShowError2["显示错误提示"]
CheckFlag --> |是| CheckData{"输入地形数据?"}
CheckData --> |否| ShowError3["显示错误提示"]
CheckData --> |是| CheckIndex{"第一个电极编号有效?"}
CheckIndex --> |否| ShowError4["显示错误提示"]
CheckIndex --> |是| WriteFile["将地形数据写入DAT文件"]
WriteFile --> Success{"写入成功?"}
Success --> |是| ShowSuccess["显示成功提示"]
Success --> |否| ShowFail["显示失败提示"]
ShowError1 --> Return["返回等待用户修正"]
ShowError2 --> Return
ShowError3 --> Return
ShowError4 --> Return
```
**Diagram sources**
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L1-L843)
## 任务树形视图构建与交互
### 任务树形视图构建
`DialTaskTree.cpp`实现了任务树形视图,使用`CTreeCtrl`控件显示任务列表。视图支持复选框功能,允许用户选择多个任务进行批量操作。视图初始化时会根据任务类型(2D或3D)从服务器获取任务数据,并构建树形结构。
```mermaid
classDiagram
class CDialTaskTree {
+m_treeTask : CTreeCtrl
+m_iSptType : int
+m_pParentWnd : CWnd*
+ShowTaskTree(int, time_t, time_t) void
+OnClickTreeTaskList() void
+OnNMRClickTreeTaskList() void
+OnAddNewItemToTaskList() bool
+OnClearTaskList() void
}
class CTaskDataOper {
+InitOnLineTaskTreeCtrl() void
+SetCurrentTimeRange() void
}
CDialTaskTree --> CTaskDataOper : "使用"
```
**Diagram sources**
- [DialTaskTree.cpp](file://cpp/Views/DialTaskTree.cpp#L1-L686)
### 任务树形视图交互
任务树形视图支持丰富的交互功能:
- 点击复选框:选择或取消选择任务,同时更新父节点的选中计数
- 右键点击:显示上下文菜单,提供创建任务、删除任务、取消测试、刷新列表等操作
- 点击任务节点:通知父窗口当前选中的任务
上下文菜单的选项会根据当前UI语言动态调整文本内容,确保用户界面的国际化支持。
```mermaid
sequenceDiagram
participant User as "用户"
participant Tree as "任务树"
participant Parent as "父窗口"
User->>Tree : 右键点击任务节点
Tree->>Tree : 显示上下文菜单
User->>Tree : 选择"删除任务"
Tree->>Parent : 发送WM_MSG_DELETE_TASK消息
Parent->>Parent : 处理删除任务逻辑
Parent->>Tree : 刷新任务列表
Tree->>User : 显示操作结果
```
**Diagram sources**
- [DialTaskTree.cpp](file://cpp/Views/DialTaskTree.cpp#L1-L686)
## 项目数据持久化与加载
`ProManager.cpp`实现了项目管理器,负责项目数据的持久化与加载。项目管理器通过`CProManager`类与数据库交互,实现项目和测区的创建、查询和同步功能。
项目创建流程包括:
1. 在数据库中创建项目记录
2. 在设备上创建项目文件夹和配置文件
3. 同步项目数据到设备
```mermaid
sequenceDiagram
participant UI as "用户界面"
participant ProMgr as "CProManager"
participant DB as "数据库"
participant Dev as "设备"
UI->>ProMgr : 创建项目
ProMgr->>ProMgr : 显示创建对话框
ProMgr->>ProMgr : 验证项目名称唯一性
ProMgr->>DB : 插入项目记录
DB-->>ProMgr : 返回项目ID
ProMgr->>Dev : 在设备上创建项目文件夹
Dev-->>ProMgr : 文件夹创建成功
ProMgr->>Dev : 发送项目配置文件
Dev-->>ProMgr : 文件发送成功
ProMgr->>DB : 记录同步状态
DB-->>ProMgr : 同步记录创建成功
ProMgr-->>UI : 显示创建成功
```
**Diagram sources**
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
## 任务参数验证与数据传递
### 任务参数验证
系统在创建任务时执行严格的参数验证,确保所有输入都符合业务规则:
- **必填项验证**:任务名、测试方式、装置类型、脚本等必须填写
- **取值范围验证**:迭代次数(1-255)、采样间隔(0-30000)、电极间距(>0)等
- **逻辑关系验证**:交叉孔装置的孔间距必须大于电极间距
- **唯一性验证**:任务包中不能包含重复任务
### 跨对话框数据传递
系统通过多种机制实现跨对话框的数据传递:
- **构造函数传递**:在创建对话框时通过构造函数传递必要的操作对象(如`CTaskDataOper`
- **成员变量共享**:父窗口与子窗口通过成员变量共享数据
- **消息机制**:使用Windows消息在不同窗口间传递数据和状态
例如,在`DialTaskManager.cpp`中,创建任务时会根据任务类型显示相应的创建对话框,并将创建好的任务参数传递给上传逻辑:
```cpp
// 伪代码示例
if (0 == m_iSelTaskType) {
iRet = m_dialNew2DTask.DoModal();
if (IDOK == iRet) {
// 从对话框获取创建好的任务参数
strTaskCN = m_dialNew2DTask.m_strTaskCN;
// 构造任务参数结构体
strcpy(m_TaskArg.ucTaskID, strTmp);
strcpy(m_TaskArg.ucTDName, m_dialNew2DTask.m_strTaskName);
// ... 其他参数
// 上传任务数据
CDownloadDataProgressDlg uploadDlg(&m_TaskArg, &m_taskOper,this);
uploadDlg.DoModal();
}
}
```
**Section sources**
- [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L1-L381)
- [DialNew2DTask.cpp](file://cpp/Views/DialNew2DTask.cpp#L1-L665)
- [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L1-L570)
- [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp#L1-L2242)
## 任务配置工作流
对于初学者,任务配置的工作流可以概括为以下步骤:
1. **创建项目**:通过项目管理器创建新的项目,填写项目基本信息
2. **创建测区**:在项目中创建测区,定义测量区域
3. **创建任务**
- 选择任务类型(1D、2D或3D
- 选择测试方式(电阻率、激电或自电)
- 选择装置类型和测量脚本
- 设置任务参数(迭代次数、发射周期等)
- 点击"创建"完成任务创建
4. **配置地形**(可选):为任务配置地形数据,导入或手动输入地形点
5. **组织任务包**(可选):将多个任务组织成任务包,设置循环执行参数
6. **执行任务**:在任务管理器中选择任务并开始测量
每个步骤都有相应的对话框引导用户完成配置,系统会在关键操作前进行参数验证,确保配置的正确性。
## UI响应性能优化建议
针对大型项目下的UI响应性能,建议采取以下优化措施:
1. **分页加载任务数据**:避免一次性加载所有任务,采用分页或按时间范围加载的方式,减少内存占用和UI阻塞
2. **异步数据加载**:将耗时的数据查询操作放在后台线程执行,避免阻塞UI线程
3. **虚拟化列表控件**:对于包含大量任务的列表,使用虚拟化技术,只渲染可见区域的项目
4. **缓存常用数据**:将频繁访问的数据(如介质类型、脚本列表)缓存到内存中,减少数据库查询次数
5. **优化数据库查询**:为常用查询字段建立索引,优化SQL查询语句,减少查询时间
6. **延迟加载**:对于非关键信息,在用户需要时才进行加载,提高初始加载速度
7. **批量操作优化**:对于批量删除等操作,使用事务处理,减少数据库交互次数
这些优化措施可以显著提升大型项目下的UI响应速度,改善用户体验。