# 项目管理界面 **本文档引用的文件** - [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) ## 目录 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响应速度,改善用户体验。