# 离线任务管理 **本文档引用的文件** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [DialTaskManagerOffline.h](file://h/DialTaskManagerOffline.h) - [DialTaskTreeOffline.h](file://h/DialTaskTreeOffline.h) - [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp) - [FileTransfer.h](file://h/FileTransfer.h) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 简介 本文档详细描述了Geomative Studio软件中离线模式下的任务管理功能。该功能允许用户在没有网络连接的情况下创建、编辑、删除和同步测量任务。文档重点介绍了DialTaskManagerOffline和DialTaskTreeOffline组件的实现逻辑,以及与在线模式的差异。同时,文档还涵盖了离线任务数据的本地存储策略、与设备的批量传输协议(FileTransfer模块)和冲突解决机制。 ## 项目结构 项目结构显示了离线任务管理功能相关的文件主要分布在cpp/Views和h/目录下,其中核心实现文件为DialTaskManagerOffline.cpp和DialTaskTreeOffline.cpp,头文件为DialTaskManagerOffline.h和DialTaskTreeOffline.h。数据操作相关的功能则在cpp/Operator/TaskDataOper.cpp中实现。 ```mermaid graph TD A[离线任务管理] --> B[DialTaskManagerOffline] A --> C[DialTaskTreeOffline] A --> D[TaskDataOper] A --> E[FileTransfer] B --> F[任务创建] B --> G[任务删除] B --> H[任务测量] C --> I[任务树显示] C --> J[任务选择] D --> K[数据库操作] D --> L[任务数据查询] E --> M[文件传输] E --> N[数据同步] ``` **图表来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp) **章节来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) ## 核心组件 离线任务管理功能的核心组件包括DialTaskManagerOffline和DialTaskTreeOffline两个类。DialTaskManagerOffline负责任务的创建、删除和测量等操作,而DialTaskTreeOffline则负责任务树的显示和用户交互。这些组件通过TaskDataOper类与数据库进行交互,实现任务数据的持久化存储。 **章节来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) ## 架构概述 离线任务管理的架构采用MVC模式,其中DialTaskManagerOffline和DialTaskTreeOffline作为视图层,负责用户界面的显示和交互;TaskDataOper作为模型层,负责数据的存储和查询;而控制器逻辑则分散在各个组件中。这种架构使得界面和数据逻辑分离,提高了代码的可维护性。 ```mermaid classDiagram class DialTaskManagerOffline { +m_listTaskAttr ListCtrl +m_listTaskData ListCtrl +m_tabTaskChg TabCtrl +m_dialTaskTreeOffline DialTaskTreeOffline +m_taskOper TaskDataOper +OnButtonCreateTask() +OnButtonDelTask() +OnButtonMeasureTask() +OnClickTaskTree() } class DialTaskTreeOffline { +m_treeTask TreeCtrl +m_pParentWnd CWnd +m_dwTaskID DWORD +ShowTaskTree() +OnSelchangedTreeTaskList() } class TaskDataOper { +m_pRecTdData Recordset +m_iTdType int +m_bIsOpenTdData bool +Create1DTask() +Create2DTask() +Create3DTask() +DeleteTask() +QueryTdAttrToCtrl() +QueryTdDataToCtrl() } class FileTransfer { +TransferFile() +ReceiveFile() +GetTransferStatus() +CancelTransfer() } DialTaskManagerOffline --> DialTaskTreeOffline : "包含" DialTaskManagerOffline --> TaskDataOper : "使用" DialTaskManagerOffline --> FileTransfer : "使用" DialTaskTreeOffline --> DialTaskManagerOffline : "通知" ``` **图表来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp) ## 详细组件分析 ### DialTaskManagerOffline分析 DialTaskManagerOffline类是离线任务管理的主要界面组件,负责处理用户对任务的各种操作。该组件通过消息映射机制响应用户界面事件,如创建任务、删除任务和开始测量等。 #### 任务创建流程 ```mermaid flowchart TD Start([开始创建任务]) --> SelectType["选择任务类型(1D/2D/3D)"] SelectType --> CreateDialog["创建相应任务对话框"] CreateDialog --> ValidateInput["验证输入参数"] ValidateInput --> InputValid{"输入有效?"} InputValid --> |否| ShowError["显示错误信息"] InputValid --> |是| CreateTask["调用TaskDataOper创建任务"] CreateTask --> InsertTree["在任务树中插入新任务"] InsertTree --> RefreshUI["刷新用户界面"] RefreshUI --> End([任务创建完成]) ShowError --> End ``` **图表来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp#L62-L112) #### 任务删除流程 ```mermaid sequenceDiagram 用户->>DialTaskManagerOffline : 点击删除按钮 DialTaskManagerOffline->>DialTaskManagerOffline : 验证是否选择了任务 alt 未选择任务 DialTaskManagerOffline-->>用户 : 显示"请先选择任务"提示 else 已选择任务 DialTaskManagerOffline->>TaskDataOper : 调用DeleteTask方法 TaskDataOper->>数据库 : 执行删除SQL语句 alt 删除成功 数据库-->>TaskDataOper : 返回成功 TaskDataOper-->>DialTaskManagerOffline : 返回成功 DialTaskManagerOffline->>DialTaskTreeOffline : 从任务树中删除节点 DialTaskManagerOffline-->>用户 : 显示"删除任务成功" else 删除失败 数据库-->>TaskDataOper : 返回错误 TaskDataOper-->>DialTaskManagerOffline : 返回失败 DialTaskManagerOffline-->>用户 : 显示"删除任务失败" end end ``` **图表来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp#L114-L157) **章节来源** - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) ### DialTaskTreeOffline分析 DialTaskTreeOffline类负责任务树的显示和用户交互。它作为一个独立的对话框控件,被嵌入到DialTaskManagerOffline中,提供任务的层次化视图。 #### 任务树初始化流程 ```mermaid flowchart TD Start([初始化任务树]) --> GetTaskType["获取任务类型"] GetTaskType --> QueryTasks["调用TaskDataOper查询任务"] QueryTasks --> CreateRoot["创建根节点"] CreateRoot --> LoopTasks["遍历任务列表"] LoopTasks --> CreateNode["为每个任务创建树节点"] CreateNode --> SetNodeData["设置节点数据(任务ID)"] SetNodeData --> AddNode["将节点添加到树中"] AddNode --> CheckMore["还有更多任务?"] CheckMore --> |是| LoopTasks CheckMore --> |否| ExpandRoot["展开根节点"] ExpandRoot --> End([任务树初始化完成]) ``` **图表来源** - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp#L60-L65) #### 任务选择通知流程 ```mermaid sequenceDiagram 用户->>DialTaskTreeOffline : 选择任务树节点 DialTaskTreeOffline->>DialTaskTreeOffline : 获取选中节点的任务ID DialTaskTreeOffline->>DialTaskManagerOffline : 发送WM_CLICK_TASK_TREE消息 DialTaskManagerOffline->>TaskDataOper : 调用QueryTdAttrToCtrl TaskDataOper->>数据库 : 查询任务属性 数据库-->>TaskDataOper : 返回任务属性 TaskDataOper-->>DialTaskManagerOffline : 设置任务属性到界面 DialTaskManagerOffline->>TaskDataOper : 调用QueryTdDataToCtrl TaskDataOper->>数据库 : 查询任务数据 数据库-->>TaskDataOper : 返回任务数据 TaskDataOper-->>DialTaskManagerOffline : 设置任务数据到界面 DialTaskManagerOffline-->>用户 : 显示任务详细信息 ``` **图表来源** - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp#L82-L102) - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp#L326-L335) **章节来源** - [DialTaskTreeOffline.cpp](file://cpp/Views/DialTaskTreeOffline.cpp) - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) ## 依赖分析 离线任务管理功能依赖于多个组件和模块,形成了一个复杂的依赖网络。主要依赖关系包括: ```mermaid graph TD A[DialTaskManagerOffline] --> B[DialTaskTreeOffline] A --> C[TaskDataOper] A --> D[FileTransfer] B --> A C --> E[数据库] D --> F[设备通信] A --> G[TdManager] C --> H[GUCodeCreator] D --> I[Crc32] A --> J[AutoLock] style A fill:#f9f,stroke:#333 style B fill:#f9f,stroke:#333 style C fill:#f9f,stroke:#333 style D fill:#f9f,stroke:#333 ``` **图表来源** - [DialTaskManagerOffline.h](file://h/DialTaskManagerOffline.h) - [DialTaskTreeOffline.h](file://h/DialTaskTreeOffline.h) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [FileTransfer.h](file://h/FileTransfer.h) **章节来源** - [DialTaskManagerOffline.h](file://h/DialTaskManagerOffline.h) - [DialTaskTreeOffline.h](file://h/DialTaskTreeOffline.h) ## 性能考虑 离线任务管理功能在设计时考虑了性能因素,特别是在处理大量任务数据时。TaskDataOper类使用了数据库事务来确保数据操作的原子性,同时在查询大量数据时采用了分页机制。任务树的显示采用了懒加载策略,只有在用户展开节点时才加载子节点数据,减少了初始加载时间。 ## 故障排除指南 当离线任务管理功能出现问题时,可以按照以下步骤进行排查: 1. 检查数据库连接是否正常 2. 验证任务数据文件是否完整 3. 检查用户权限设置 4. 查看日志文件中的错误信息 5. 确认设备通信是否正常 常见问题包括任务创建失败、任务数据无法加载和任务同步错误等。对于这些问题,应首先检查数据库状态和日志记录,然后根据具体错误信息进行针对性处理。 **章节来源** - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [DialTaskManagerOffline.cpp](file://cpp/Views/DialTaskManagerOffline.cpp) ## 结论 离线任务管理功能为Geomative Studio用户提供了一个完整的离线工作环境,使得在没有网络连接的情况下也能进行任务的创建、编辑和管理。通过DialTaskManagerOffline和DialTaskTreeOffline组件的协同工作,结合TaskDataOper的数据操作功能,实现了高效的任务管理。该功能的设计考虑了用户体验和性能优化,为地质勘探工作提供了可靠的支持。