# 1D项目创建 **本文引用的文件** - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp) - [DialNew1DTask.h](file://h/DialNew1DTask.h) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [TaskDataOper.h](file://h/TaskDataOper.h) - [GeoMative.rc](file://GeoMative.rc) - [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件系统性地文档化1D项目创建流程,覆盖任务名称、测试位置、测试类型(电阻率/激电/自电)、装置类型、测试脚本、迭代次数、发射波形和发射周期等参数的配置;解释DialNew1DTask对话框的UI控件布局、数据验证逻辑与CTaskDataOper服务的交互机制;阐述不同测试类型对发射周期选项的动态影响,以及装置类型与脚本之间的关联查询逻辑;并为开发者提供界面元素扩展、参数验证规则定制与错误提示本地化的实现方法。 ## 项目结构 1D项目创建涉及三个关键层次: - 视图层:DialNew1DTask对话框负责用户输入与参数校验,并调用服务层接口创建任务。 - 服务层:CTaskDataOper封装数据库操作与业务逻辑,包括任务参数持久化、脚本与装置类型的关联查询等。 - 资源层:GeoMative.rc定义对话框控件布局与标签文本,支持多语言显示。 ```mermaid graph TB subgraph "视图层" D1["DialNew1DTask
对话框"] end subgraph "服务层" S1["CTaskDataOper
任务数据操作"] end subgraph "资源层" R1["GeoMative.rc
控件布局/标签"] end D1 --> S1 D1 --- R1 ``` 图表来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L1-L120) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [GeoMative.rc](file://GeoMative.rc#L906-L929) 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L1-L120) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [GeoMative.rc](file://GeoMative.rc#L906-L929) ## 核心组件 - DialNew1DTask:1D任务创建对话框,包含任务名称、测试地点、测试类型、装置类型、测试脚本、迭代次数、发射波形、发射周期等输入项;负责基础校验与调用服务层创建任务。 - CTaskDataOper:封装任务创建、脚本与装置类型关联查询、默认测区获取等逻辑;负责将任务参数写入数据库并返回新任务ID。 - GeoMative.rc:定义对话框控件ID与布局,支持中英文标签切换。 章节来源 - [DialNew1DTask.h](file://h/DialNew1DTask.h#L13-L71) - [TaskDataOper.h](file://h/TaskDataOper.h#L12-L37) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [GeoMative.rc](file://GeoMative.rc#L906-L929) ## 架构总览 1D任务创建的端到端流程如下: - 用户在DialNew1DTask中填写参数并点击“创建”。 - 对话框执行参数校验,组装ST1DTaskParam结构体。 - 调用CTaskDataOper::CreateTaskCN生成任务编号,再调用CTaskDataOper::Create1DTask持久化任务。 - 创建成功后返回新任务ID,对话框关闭。 ```mermaid sequenceDiagram participant U as "用户" participant V as "DialNew1DTask" participant S as "CTaskDataOper" participant DB as "数据库" U->>V : 输入任务参数并点击“创建” V->>V : 参数校验名称、测试类型、装置类型、脚本、迭代次数、发射周期 V->>S : CreateTaskCN(测试类型) S-->>V : 返回任务编号 V->>S : Create1DTask(参数, 任务编号) S->>DB : 插入td、tdchannel、td1dcon、gr等记录 DB-->>S : 返回新任务ID S-->>V : 新任务ID V-->>U : 关闭对话框 ``` 图表来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L239-L366) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L239-L366) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) ## 详细组件分析 ### DialNew1DTask对话框 - 控件布局与标签 - 任务名称、测试地点、测试类型、装置类型、测试脚本、迭代次数、发射波形、发射周期。 - 支持中英文双语标签切换。 - 初始化逻辑 - 测试类型下拉框初始化为电阻率/激电/自电(中文或英文)。 - 装置类型下拉框通过CTaskDataOper::QueryMediumInfo加载介质信息。 - 发射波形默认固定为0+0-,不可编辑。 - 发射周期下拉框按2的幂次生成(1S、2S、4S、8S、16S、32S、64S),其中“自动”对应1S。 - 事件处理 - 装置类型变化:触发脚本下拉框重载,基于所选装置类型与脚本类型查询关联脚本。 - 测试类型变化:根据选择动态调整发射波形与发射周期可用性与内容。 - “创建”按钮:执行参数校验,组装ST1DTaskParam,调用服务层创建任务。 - 参数校验 - 任务名称非空。 - 必须选择测试类型。 - 必须选择装置类型。 - 必须选择测试脚本。 - 迭代次数必须为1~255整数。 - 电阻率/激电需选择发射周期;自电不启用发射周期。 - 采样间隔范围校验(0~30000)。 ```mermaid flowchart TD Start(["进入对话框"]) --> Init["初始化控件
加载测试类型/装置类型/发射周期"] Init --> SelArray["选择装置类型"] SelArray --> LoadSpt["查询关联脚本并填充下拉"] SelArray --> ChangeType["选择测试类型"] ChangeType --> DynaWave["动态设置发射波形"] DynaWave --> DynaPeriod["动态设置发射周期项
电阻率/激电可选;自电禁用"] DynaPeriod --> ClickOK["点击“创建”"] ClickOK --> Validate["参数校验
名称/类型/装置/脚本/迭代次数/采样间隔"] Validate --> Valid{"校验通过?"} Valid -- 否 --> ShowErr["弹出错误提示并终止"] Valid -- 是 --> CallSvc["调用服务层创建任务"] CallSvc --> Done(["完成"]) ``` 图表来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L66-L165) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L167-L237) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L239-L366) - [GeoMative.rc](file://GeoMative.rc#L906-L929) 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L66-L165) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L167-L237) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L239-L366) - [GeoMative.rc](file://GeoMative.rc#L906-L929) ### CTaskDataOper服务 - 任务创建 - CreateTaskCN:生成任务编号(含设备序列号与时间戳)。 - Create1DTask:插入td、tdchannel、td1dcon、gr等记录,返回新任务ID。 - 装置类型与脚本关联 - QuerySptByAR:根据装置类型ID与脚本类型查询可用脚本列表。 - QueryMediumInfo:查询介质(装置类型)列表。 - 默认测区 - GetDefaultTzID:获取默认测区ID。 ```mermaid classDiagram class CTaskDataOper { +CreateTaskCN(iTestType) CString +Create1DTask(stTaskParam, strTaskCN) int +QuerySptByAR(iAR, vtRes, iSptType) void +QueryMediumInfo(iSptType, vtRes) void +GetDefaultTzID() int } class ST1DTaskParam { +strTDName +strTestPlace +iTestType +iAR +iSptID +strSptName +iSptType +iStacking +iTxWave +iTxPeriod +iSAInterval } CTaskDataOper --> ST1DTaskParam : "使用" ``` 图表来源 - [TaskDataOper.h](file://h/TaskDataOper.h#L12-L37) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L774-L791) 章节来源 - [TaskDataOper.h](file://h/TaskDataOper.h#L12-L37) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L774-L791) ### 不同测试类型对发射周期的影响 - 电阻率:发射波形为0+0-,发射周期可选(1S、2S、4S、8S、16S、32S、64S),其中“自动”映射为1S。 - 激电:发射波形为+0-0,发射周期可选(1S、2S、4S、8S、16S、32S、64S)。 - 自电:发射波形为0,发射周期禁用且不选择。 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L186-L237) ### 装置类型与脚本的关联查询逻辑 - 当用户选择装置类型后,对话框清空并重新加载脚本下拉框。 - 服务层根据装置类型ID与脚本类型查询关联脚本,填充下拉列表。 - 该逻辑确保仅展示与当前装置类型匹配的脚本。 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L167-L184) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L774-L791) ### 与任务管理器的集成 - DialTaskManager在创建任务时,会将DialNew1DTask中的参数打包到任务参数结构中,随后调用服务层创建任务。 章节来源 - [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp#L253-L266) ## 依赖关系分析 - DialNew1DTask依赖CTaskDataOper进行数据查询与任务创建。 - 服务层依赖数据库连接与ADO记录集进行数据持久化。 - 资源层通过资源脚本定义控件布局与标签文本,支持多语言。 ```mermaid graph LR D1["DialNew1DTask"] --> S1["CTaskDataOper"] S1 --> DB["数据库"] D1 --- RC["GeoMative.rc"] ``` 图表来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L1-L40) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [GeoMative.rc](file://GeoMative.rc#L906-L929) 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L1-L40) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) - [GeoMative.rc](file://GeoMative.rc#L906-L929) ## 性能考量 - 下拉框数据加载:装置类型与脚本查询应避免重复请求,建议在对话框初始化时一次性加载并缓存。 - 数据库事务:任务创建采用事务提交,异常回滚,保证一致性。 - UI响应:参数校验应在用户输入过程中及时反馈,减少无效提交。 ## 故障排查指南 - 常见错误 - 未选择测试类型/装置类型/脚本:弹出相应提示并阻止提交。 - 迭代次数不在1~255范围内:提示范围错误。 - 采样间隔不在0~30000范围内:提示范围错误。 - 电阻率/激电未选择发射周期:提示必选项。 - 自电类型不启用发射周期:保持禁用状态。 - 服务端错误 - 查询脚本信息失败:提示查询失败并返回负值。 - 默认测区ID获取失败:提示获取失败。 - 数据库异常:捕获COM异常并回滚事务。 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L239-L366) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L97-L199) ## 结论 DialNew1DTask通过清晰的UI布局与严格的参数校验,结合CTaskDataOper的服务能力,实现了1D项目的标准化创建流程。测试类型对发射周期的动态控制与装置类型到脚本的关联查询,确保了参数的一致性与可执行性。开发者可在现有基础上扩展界面元素、定制验证规则与增强本地化提示。 ## 附录 ### 开发者指南:界面元素扩展 - 在资源脚本中添加新的控件ID与布局,参考现有控件命名规范。 - 在对话框类中声明控件变量并在DoDataExchange中绑定。 - 在OnInitDialog中初始化控件状态与默认值。 - 在消息映射中添加事件处理函数,必要时调用服务层查询数据。 章节来源 - [GeoMative.rc](file://GeoMative.rc#L906-L929) - [DialNew1DTask.h](file://h/DialNew1DTask.h#L13-L47) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L43-L65) ### 开发者指南:参数验证规则定制 - 在OnOK中增加自定义校验分支,如范围检查、格式校验、互斥条件判断。 - 使用本地化字符串资源统一提示文案,便于多语言维护。 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L239-L366) ### 开发者指南:错误提示本地化 - 将提示文案集中到资源脚本或字符串常量,通过语言标识切换显示。 - 统一使用消息框接口输出提示,确保用户体验一致。 章节来源 - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L246-L251) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp#L256-L262)