a
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
# 任务参数配置
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [GeoMative.rc](file://GeoMative.rc)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件围绕任务参数配置功能进行深入文档化,重点聚焦于DialCfgTaskPacket对话框的UI组件与交互逻辑,涵盖:
|
||||
- 循环次数、时间间隔、PLC ID等参数的配置与校验规则(循环次数与时间间隔范围为1-60000)。
|
||||
- 任务选择下拉框的数据来源:通过CTaskDataOper::QueryTdBrowseInfo从数据库查询任务列表。
|
||||
- 任务包属性的存储结构:涉及tdTaskPacket与tdTaskPacketInfo两张表的关联关系。
|
||||
- 提供代码示例路径,展示OnInitDialog中初始化UI控件与OnOK中保存配置数据的具体实现。
|
||||
|
||||
## 项目结构
|
||||
任务参数配置功能位于视图层(Views)与数据操作层(Operator)之间,UI由DialCfgTaskPacket负责,数据访问由TaskDataOper封装。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "视图层"
|
||||
DCP["DialCfgTaskPacket<br/>对话框"]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
TDO["CTaskDataOper<br/>任务数据操作"]
|
||||
end
|
||||
subgraph "数据库"
|
||||
TP["tdTaskPacket<br/>主表"]
|
||||
TPI["tdTaskPacketInfo<br/>明细表"]
|
||||
TD["td<br/>任务基础表"]
|
||||
end
|
||||
DCP --> TDO
|
||||
TDO --> TD
|
||||
TDO --> TP
|
||||
TDO --> TPI
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L1-L177)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L1-L177)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
## 核心组件
|
||||
- DialCfgTaskPacket:任务参数配置对话框,包含任务选择下拉框、任务列表、循环次数、时间间隔、PLC ID输入框及添加/删除按钮。
|
||||
- CTaskDataOper:封装数据库访问,提供任务浏览信息查询、任务包属性查询、任务包信息查询以及任务包写入等接口。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
|
||||
## 架构总览
|
||||
DialCfgTaskPacket作为UI入口,调用CTaskDataOper完成数据库读写;数据库层面以tdTaskPacket为主表存储任务包属性(循环次数、时间间隔、PLC ID),以tdTaskPacketInfo为明细表存储任务包内任务序列(TaskID、TaskName、TaskPacketID);任务基础信息来源于td表。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant D as "DialCfgTaskPacket"
|
||||
participant O as "CTaskDataOper"
|
||||
participant DB as "数据库"
|
||||
U->>D : 打开“任务参数配置”对话框
|
||||
D->>O : QueryTdBrowseInfo(查询任务列表)
|
||||
O->>DB : SELECT td
|
||||
DB-->>O : 返回任务列表
|
||||
O-->>D : 返回任务列表
|
||||
D->>D : 初始化下拉框与列表列头
|
||||
U->>D : 输入循环次数/时间间隔/PLC ID
|
||||
U->>D : 添加任务到列表
|
||||
D->>D : 去重检查与序号更新
|
||||
U->>D : 点击“保存”
|
||||
D->>D : 参数校验(1-60000, PLC ID非空)
|
||||
D->>O : InsertTaskPacketInfo(批量写入)
|
||||
O->>DB : INSERT tdTaskPacket
|
||||
O->>DB : DELETE tdTaskPacketInfo WHERE TaskPacketID=1
|
||||
O->>DB : INSERT tdTaskPacketInfo (逐条)
|
||||
DB-->>O : 提交事务
|
||||
O-->>D : 写入成功
|
||||
D-->>U : 显示保存结果
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1085-L1140)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### DialCfgTaskPacket 对话框
|
||||
- UI控件
|
||||
- 任务选择下拉框:用于选择可执行的任务项。
|
||||
- 任务列表:显示已选任务序列,包含序号、任务名、任务ID三列。
|
||||
- 按钮:添加、删除。
|
||||
- 参数输入框:循环次数、时间间隔(分钟)、PLC ID。
|
||||
- 初始化流程(OnInitDialog)
|
||||
- 查询任务列表并填充下拉框。
|
||||
- 读取任务包属性(循环次数、时间间隔、PLC ID)并回填到对应输入框。
|
||||
- 初始化任务列表列头与内容。
|
||||
- 交互逻辑
|
||||
- 添加:校验下拉框选中状态,去重检查后插入列表。
|
||||
- 删除:选中行删除,末尾行删除时需重排序号。
|
||||
- 保存:对循环次数、时间间隔进行范围校验(1-60000),对PLC ID进行非空校验;收集列表数据与参数,调用数据操作层写入数据库。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L47-L108)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
|
||||
### 任务选择下拉框数据来源
|
||||
- 数据源:CTaskDataOper::QueryTdBrowseInfo返回std::vector<STTdBrowseInfo>,其中包含任务名与任务ID。
|
||||
- 下拉框填充:将任务名加入组合框,同时将任务ID存入SetItemData以便后续使用。
|
||||
- 使用场景:添加任务时,根据下拉框当前选中项获取任务ID与任务名。
|
||||
|
||||
章节来源
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1013-L1083)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L306)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L142)
|
||||
|
||||
### 任务包属性与存储结构
|
||||
- 属性结构:STTaskPacketAttr包含循环次数、时间间隔、PLC ID三项。
|
||||
- 存储位置:
|
||||
- 主表:tdTaskPacket(主键字段MainID=1,存储循环次数、时间间隔、PLC ID)。
|
||||
- 明细表:tdTaskPacketInfo(字段TaskPacketID=1,存储每个任务的TaskID与TaskName)。
|
||||
- 写入策略:先写入tdTaskPacket,再清空tdTaskPacketInfo中TaskPacketID=1的旧记录,最后批量插入新任务序列,事务提交。
|
||||
|
||||
章节来源
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L324-L335)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
### 参数验证规则
|
||||
- 循环次数与时间间隔:必须为整数且在1至60000之间。
|
||||
- PLC ID:必须非空。
|
||||
- 重复任务:列表中不允许出现相同任务ID。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L258)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L110-L121)
|
||||
|
||||
### 代码示例路径
|
||||
- OnInitDialog中初始化UI控件与读取任务包属性
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- OnOK中保存配置数据
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- 任务包写入数据库
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L123-L177)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
## 依赖分析
|
||||
- DialCfgTaskPacket依赖CTaskDataOper进行数据库读写。
|
||||
- CTaskDataOper依赖ADO Recordset访问td、tdTaskPacket、tdTaskPacketInfo表。
|
||||
- UI资源定义在GeoMative.rc中,包含对话框控件ID与布局。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDialCfgTaskPacket {
|
||||
+DoDataExchange(pDX)
|
||||
+OnInitDialog() bool
|
||||
+OnOK() void
|
||||
+OnButtonAdd() void
|
||||
+OnButtonDel() void
|
||||
-InitialTaskList() void
|
||||
-IsRepeatTask(iTaskID) bool
|
||||
-m_listTaskPacket
|
||||
-m_cmbTaskName
|
||||
}
|
||||
class CTaskDataOper {
|
||||
+QueryTdBrowseInfo(vt, bIsQueryTimerTd) void
|
||||
+QueryTdBrowseInfo(vt, iSptType, iType, bIsQueryTimerTd) void
|
||||
+QueryTaskPacketAttr(iLoopTime, iInterval, strPlcID) bool
|
||||
+QueryTaskPacketInfo(vt) bool
|
||||
+InsertTaskPacketInfo(vt, stAttr) bool
|
||||
}
|
||||
CDialCfgTaskPacket --> CTaskDataOper : "调用"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L1-L54)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L336)
|
||||
|
||||
## 性能考虑
|
||||
- 列表操作:删除末尾行时避免重排所有序号,仅在需要时更新后续行序号,降低O(n)更新成本。
|
||||
- 数据库写入:批量插入tdTaskPacketInfo,减少多次往返;使用事务保证一致性。
|
||||
- UI输入限制:对PLC ID设置最大长度,减少无效输入带来的处理开销。
|
||||
|
||||
章节来源
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L81-L108)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L158-L160)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
|
||||
## 故障排查指南
|
||||
- 无法加载任务列表
|
||||
- 检查CTaskDataOper::QueryTdBrowseInfo是否抛出异常或返回空集。
|
||||
- 确认数据库连接正常,td表存在且包含有效记录。
|
||||
- 保存失败
|
||||
- 检查InsertTaskPacketInfo返回值与事务回滚日志。
|
||||
- 确认循环次数、时间间隔、PLC ID均满足校验条件。
|
||||
- 重复任务
|
||||
- 确认IsRepeatTask逻辑正确,列表中不存在相同TaskID。
|
||||
- UI无响应
|
||||
- 检查消息映射与控件ID是否匹配(见资源定义)。
|
||||
|
||||
章节来源
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L1013-L1083)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L716)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
|
||||
## 结论
|
||||
DialCfgTaskPacket通过CTaskDataOper实现了任务参数配置的完整闭环:从任务列表加载、参数输入与校验,到任务包属性与任务序列的持久化存储。其设计遵循清晰的职责分离与事务一致性保障,适合在实际工程中扩展与维护。
|
||||
|
||||
## 附录
|
||||
- 控件ID与资源定义参考
|
||||
- [GeoMative.rc](file://GeoMative.rc#L1925-L1941)
|
||||
@@ -0,0 +1,286 @@
|
||||
# 任务配置
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目结构](#项目结构)
|
||||
2. [任务包配置流程](#任务包配置流程)
|
||||
3. [任务与项目、测区的关联关系](#任务与项目测区的关联关系)
|
||||
4. [任务配置数据的验证机制和错误处理策略](#任务配置数据的验证机制和错误处理策略)
|
||||
5. [任务配置驱动脚本生成过程](#任务配置驱动脚本生成过程)
|
||||
6. [任务配置API使用示例](#任务配置api使用示例)
|
||||
|
||||
## 项目结构
|
||||
|
||||
Geomative Studio项目的任务配置功能主要集中在`cpp/Views`和`cpp/Operator`目录下。核心文件包括`DialCfgTaskPacket.cpp`用于任务包配置的UI交互,`TaskDataOper.cpp`负责任务数据的数据库操作,以及`SptManager.cpp`管理脚本文件的创建和同步。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "UI层"
|
||||
DialCfgTaskPacket["DialCfgTaskPacket.cpp<br/>任务包配置对话框"]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
TaskDataOper["TaskDataOper.cpp<br/>任务数据操作"]
|
||||
SptManager["SptManager.cpp<br/>脚本管理"]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Database[(dptt数据库)]
|
||||
end
|
||||
DialCfgTaskPacket --> TaskDataOper
|
||||
TaskDataOper --> Database
|
||||
SptManager --> TaskDataOper
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
|
||||
## 任务包配置流程
|
||||
|
||||
任务包配置功能通过`DialCfgTaskPacket`对话框实现,允许用户将多个测量任务组合成一个任务包进行管理。配置流程包括:
|
||||
|
||||
1. 初始化对话框时,从数据库查询所有可用任务并填充到下拉列表中
|
||||
2. 用户选择任务后点击"添加"按钮,将选中的任务添加到任务包列表中
|
||||
3. 用户可删除已添加的任务
|
||||
4. 配置任务包的循环次数、时间间隔和PLC ID等属性
|
||||
5. 保存配置时进行数据验证,确保参数在有效范围内
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> Init["初始化对话框"]
|
||||
Init --> Query["查询可用任务"]
|
||||
Query --> Display["显示任务下拉列表"]
|
||||
Display --> Select["用户选择任务"]
|
||||
Select --> Add["点击添加按钮"]
|
||||
Add --> Check["检查任务是否重复"]
|
||||
Check --> |是| Warn["提示任务已存在"]
|
||||
Check --> |否| Insert["插入任务到列表"]
|
||||
Insert --> Continue["继续添加其他任务?"]
|
||||
Continue --> |是| Select
|
||||
Continue --> |否| Config["配置循环参数"]
|
||||
Config --> Validate["验证输入参数"]
|
||||
Validate --> |无效| Error["显示错误信息"]
|
||||
Validate --> |有效| Save["保存任务包配置"]
|
||||
Save --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
|
||||
## 任务与项目、测区的关联关系
|
||||
|
||||
任务配置与项目、测区之间存在明确的层级关联关系。每个任务必须归属于一个测区,而测区又属于特定的项目。这种关系在dptt数据库中通过外键约束实现:
|
||||
|
||||
- `project`表存储项目信息
|
||||
- `tz`表存储测区信息,包含指向`project`表的外键`PRID`
|
||||
- `td`表存储任务信息,包含指向`tz`表的外键`TZID`
|
||||
|
||||
当创建新任务时,系统会自动获取默认测区ID,并将该ID与任务关联。这种设计确保了任务数据的组织结构清晰,便于按项目和测区进行数据管理和查询。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PROJECT {
|
||||
uuid id PK
|
||||
string PRname
|
||||
timestamp create_time
|
||||
}
|
||||
TZ {
|
||||
uuid id PK
|
||||
string TzName
|
||||
uuid PRID FK
|
||||
timestamp create_time
|
||||
}
|
||||
TD {
|
||||
uuid id PK
|
||||
string TDname
|
||||
uuid TZID FK
|
||||
uuid SCID FK
|
||||
int Ttype
|
||||
int Stype
|
||||
timestamp CreateTime
|
||||
}
|
||||
PROJECT ||--o{ TZ : "包含"
|
||||
TZ ||--o{ TD : "包含"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
|
||||
## 任务配置数据的验证机制和错误处理策略
|
||||
|
||||
系统在任务配置过程中实施了严格的验证机制和错误处理策略,确保数据的完整性和有效性:
|
||||
|
||||
1. **输入验证**:
|
||||
- 循环次数必须在1-60000之间
|
||||
- 时间间隔必须在1-60000之间
|
||||
- PLC ID不能为空
|
||||
|
||||
2. **重复性检查**:
|
||||
- 添加任务时检查是否已存在相同任务ID,避免重复
|
||||
|
||||
3. **事务处理**:
|
||||
- 所有数据库操作都在事务中执行,确保数据一致性
|
||||
- 操作失败时自动回滚事务
|
||||
|
||||
4. **异常处理**:
|
||||
- 使用try-catch捕获数据库操作异常
|
||||
- 显示详细的错误信息给用户
|
||||
|
||||
5. **多语言支持**:
|
||||
- 根据系统语言设置显示相应的错误提示信息
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始保存]) --> ValidateLoop["验证循环次数"]
|
||||
ValidateLoop --> |无效| ShowError1["显示范围错误"]
|
||||
ValidateLoop --> |有效| ValidateInterval["验证时间间隔"]
|
||||
ValidateInterval --> |无效| ShowError2["显示范围错误"]
|
||||
ValidateInterval --> |有效| ValidatePLC["验证PLC ID"]
|
||||
ValidatePLC --> |为空| ShowError3["显示不能为空"]
|
||||
ValidatePLC --> |有效| BeginTrans["开始事务"]
|
||||
BeginTrans --> InsertData["插入任务包数据"]
|
||||
InsertData --> Commit["提交事务"]
|
||||
Commit --> |成功| Success["显示保存成功"]
|
||||
Commit --> |失败| Rollback["回滚事务"]
|
||||
Rollback --> ShowError4["显示保存失败"]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
|
||||
## 任务配置驱动脚本生成过程
|
||||
|
||||
任务配置通过`SptManager`与`ProManager`的协作模式驱动后续的脚本生成过程。当任务配置完成后,系统会根据配置参数自动生成相应的测量脚本文件。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "用户界面"
|
||||
participant TaskConfig as "任务配置"
|
||||
participant SptManager as "SptManager"
|
||||
participant ProManager as "ProManager"
|
||||
participant Database as "数据库"
|
||||
UI->>TaskConfig : 配置任务参数
|
||||
TaskConfig->>Database : 保存任务配置
|
||||
Database-->>TaskConfig : 保存成功
|
||||
TaskConfig->>SptManager : 请求生成脚本
|
||||
SptManager->>ProManager : 获取项目/测区信息
|
||||
ProManager-->>SptManager : 返回项目结构
|
||||
SptManager->>Database : 查询任务详情
|
||||
Database-->>SptManager : 返回任务数据
|
||||
SptManager->>SptManager : 生成脚本文件
|
||||
SptManager->>Database : 保存脚本信息
|
||||
Database-->>SptManager : 保存成功
|
||||
SptManager-->>TaskConfig : 脚本生成完成
|
||||
TaskConfig-->>UI : 显示操作结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
|
||||
## 任务配置API使用示例
|
||||
|
||||
以下是通过编程方式创建和修改任务参数的API使用示例:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTaskDataOper {
|
||||
+Create1DTask(ST1DTaskParam, CString) int
|
||||
+Create2DTask(ST2DTaskParam, CString) int
|
||||
+Create3DTask(ST3DTaskParam, CString) int
|
||||
+InsertTaskPacketInfo(vector~STTdBrowseInfo~, STTaskPacketAttr) bool
|
||||
+QueryTaskPacketInfo(vector~STTdBrowseInfo~) bool
|
||||
+QueryTaskPacketAttr(int&, int&, CString&) bool
|
||||
}
|
||||
class ST1DTaskParam {
|
||||
+CString strTDName
|
||||
+int iSptID
|
||||
+CString strSptName
|
||||
+int iSptType
|
||||
+int iTestType
|
||||
+int iStacking
|
||||
+int iTxWave
|
||||
+int iTxPeriod
|
||||
+int iSAInterval
|
||||
+CString strTestPlace
|
||||
}
|
||||
class ST2DTaskParam {
|
||||
+CString strTDName
|
||||
+int iSptID
|
||||
+CString strSptName
|
||||
+int iSptType
|
||||
+int iTestType
|
||||
+int iStacking
|
||||
+int iTxWave
|
||||
+int iTxPeriod
|
||||
+int iSAInterval
|
||||
+CString strTestPlace
|
||||
+int iStartElec
|
||||
+int iEndElec
|
||||
+int iEAmount
|
||||
+int iAR
|
||||
+int iCableLayout
|
||||
+int iSkipCable
|
||||
+int iRollCnt
|
||||
+float fEspace
|
||||
+BYTE ucTestGRFlag
|
||||
+UINT uiDevID
|
||||
}
|
||||
class ST3DTaskParam {
|
||||
+CString strTDName
|
||||
+int iSptID
|
||||
+CString strSptName
|
||||
+int iSptType
|
||||
+int iTestType
|
||||
+int iStacking
|
||||
+int iTxWave
|
||||
+int iTxPeriod
|
||||
+int iSAInterval
|
||||
+CString strTestPlace
|
||||
+int iEAmount
|
||||
+int iAR
|
||||
+int iCableLayout
|
||||
+int iSkipCable
|
||||
+BYTE ucTestGRFlag
|
||||
+UINT uiDevID
|
||||
}
|
||||
class STTaskPacketAttr {
|
||||
+int iLoopTimes
|
||||
+int iInterval
|
||||
+CString strPlcID
|
||||
}
|
||||
CTaskDataOper --> ST1DTaskParam : "使用"
|
||||
CTaskDataOper --> ST2DTaskParam : "使用"
|
||||
CTaskDataOper --> ST3DTaskParam : "使用"
|
||||
CTaskDataOper --> STTaskPacketAttr : "使用"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
@@ -0,0 +1,249 @@
|
||||
# 任务验证与存储
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp)
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [CTaskDataOper类的作用](#ctaskdataoper类的作用)
|
||||
3. [任务数据持久化机制](#任务数据持久化机制)
|
||||
4. [InsertTaskPacketInfo方法分析](#inserttaskpacketinfo方法分析)
|
||||
5. [数据验证流程](#数据验证流程)
|
||||
6. [任务包配置数据存储结构](#任务包配置数据存储结构)
|
||||
7. [错误处理策略](#错误处理策略)
|
||||
8. [UI到数据库的完整流程示例](#ui到数据库的完整流程示例)
|
||||
|
||||
## 简介
|
||||
本文档深入分析了GeomativeStudio软件中任务配置的验证与存储机制,重点阐述了CTaskDataOper类在任务数据持久化中的核心作用。文档详细描述了任务列表和属性信息如何通过InsertTaskPacketInfo方法写入数据库,包括对tdTaskPacket和tdTaskPacketInfo表的操作。同时,文档解释了数据验证流程、存储结构定义以及错误处理策略。
|
||||
|
||||
## CTaskDataOper类的作用
|
||||
CTaskDataOper类是GeomativeStudio系统中负责任务数据操作的核心类,主要承担任务数据的持久化、查询、验证和管理功能。该类通过ADO数据库连接与后端数据库进行交互,实现了任务数据的增删改查操作。
|
||||
|
||||
该类的主要职责包括:
|
||||
- 任务数据的创建与持久化
|
||||
- 任务数据的查询与检索
|
||||
- 任务数据的验证与去重
|
||||
- 事务管理与错误处理
|
||||
- 任务包配置的存储与读取
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L338-L445)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L42-L55)
|
||||
|
||||
## 任务数据持久化机制
|
||||
任务数据持久化机制是系统确保任务配置信息可靠存储的关键组件。系统通过CTaskDataOper类提供的方法,将用户在UI界面配置的任务信息持久化到数据库中,确保数据的一致性和完整性。
|
||||
|
||||
持久化过程遵循以下原则:
|
||||
- 使用数据库事务确保操作的原子性
|
||||
- 通过外键约束维护数据完整性
|
||||
- 采用参数化查询防止SQL注入
|
||||
- 实现批量操作提高性能
|
||||
|
||||
系统主要涉及以下数据库表:
|
||||
- td: 存储任务基本信息
|
||||
- tdTaskPacket: 存储任务包主配置
|
||||
- tdTaskPacketInfo: 存储任务包中包含的任务列表
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L679-L703)
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L418-L420)
|
||||
|
||||
## InsertTaskPacketInfo方法分析
|
||||
InsertTaskPacketInfo方法是任务包信息存储的核心方法,负责将任务列表和属性信息写入数据库。该方法实现了对tdTaskPacket和tdTaskPacketInfo表的批量插入操作。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> BeginTrans["开始事务"]
|
||||
BeginTrans --> DeleteMain["删除tdTaskPacket表中MainID=1的记录"]
|
||||
DeleteMain --> InsertMain["插入新的任务包主配置"]
|
||||
InsertMain --> DeleteDetail["删除tdTaskPacketInfo表中TaskPacketID=1的记录"]
|
||||
DeleteDetail --> LoopStart["循环遍历任务列表"]
|
||||
LoopStart --> InsertDetail["插入单个任务信息到tdTaskPacketInfo表"]
|
||||
InsertDetail --> LoopCheck{"是否还有任务?"}
|
||||
LoopCheck --> |是| LoopStart
|
||||
LoopCheck --> |否| CommitTrans["提交事务"]
|
||||
CommitTrans --> End([结束])
|
||||
Exception["异常捕获"] --> RollbackTrans["回滚事务"]
|
||||
RollbackTrans --> ReturnFalse["返回false"]
|
||||
BeginTrans --> Exception
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L668-L714)
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L668-L714)
|
||||
|
||||
## 数据验证流程
|
||||
系统实现了完善的数据验证流程,确保任务配置的准确性和唯一性。其中,防止重复添加任务是重要的验证逻辑之一。
|
||||
|
||||
### IsRepeatTask方法实现逻辑
|
||||
IsRepeatTask方法用于验证任务是否已存在于任务包中,防止重复添加。该方法通过遍历UI界面上已添加的任务列表,检查新任务的ID是否已存在。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetItemCount["获取任务列表项数"]
|
||||
GetItemCount --> LoopStart["设置循环索引i=0"]
|
||||
LoopStart --> CheckIndex{"i < 任务总数?"}
|
||||
CheckIndex --> |否| ReturnFalse["返回false"]
|
||||
CheckIndex --> |是| GetTaskID["获取第i项任务ID"]
|
||||
GetTaskID --> CompareID{"任务ID匹配?"}
|
||||
CompareID --> |是| ReturnTrue["返回true"]
|
||||
CompareID --> |否| IncrementI["i++"]
|
||||
IncrementI --> LoopStart
|
||||
ReturnTrue --> End([结束])
|
||||
ReturnFalse --> End
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L109-L121)
|
||||
|
||||
**Section sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L109-L121)
|
||||
- [DialCfgTaskPacket.h](file://h/DialCfgTaskPacket.h#L47)
|
||||
|
||||
## 任务包配置数据存储结构
|
||||
系统定义了清晰的数据结构来存储任务包配置信息,包括STTdBrowseInfo和STTaskPacketAttr两个关键数据结构。
|
||||
|
||||
### STTdBrowseInfo数据结构
|
||||
该结构用于存储任务的基本浏览信息,包括任务ID和任务名称。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class STTdBrowseInfo {
|
||||
+int iTaskID
|
||||
+CString strTaskName
|
||||
+STTdBrowseInfo()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L297-L306)
|
||||
|
||||
### STTaskPacketAttr数据结构
|
||||
该结构用于存储任务包的属性配置,包括循环次数、时间间隔和PLC ID。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class STTaskPacketAttr {
|
||||
+int iLoopTimes
|
||||
+int iInterval
|
||||
+CString strPlcID
|
||||
+STTaskPacketAttr()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TaskDataOper.h](file://h/TaskDataOper.h#L324-L335)
|
||||
|
||||
### 数据库表结构
|
||||
系统使用两个数据库表来存储任务包配置:
|
||||
|
||||
#### tdTaskPacket表
|
||||
存储任务包的主配置信息。
|
||||
|
||||
| 字段名 | 数据类型 | 描述 |
|
||||
|--------|---------|------|
|
||||
| MainID | Integer | 主键,固定为1 |
|
||||
| LoopTimes | Integer | 循环次数 |
|
||||
| Interval | Integer | 时间间隔(秒) |
|
||||
| PLCID | Text | PLC设备ID |
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L685-L687)
|
||||
|
||||
#### tdTaskPacketInfo表
|
||||
存储任务包中包含的具体任务列表。
|
||||
|
||||
| 字段名 | 数据类型 | 描述 |
|
||||
|--------|---------|------|
|
||||
| TaskID | Integer | 任务ID |
|
||||
| TaskName | Text | 任务名称 |
|
||||
| TaskPacketID | Integer | 任务包ID,固定为1 |
|
||||
|
||||
**Section sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L697-L699)
|
||||
|
||||
## 错误处理策略
|
||||
系统实现了完善的错误处理策略,确保在数据保存失败时能够正确回滚并提供用户友好的提示信息。
|
||||
|
||||
### 事务回滚机制
|
||||
系统使用数据库事务来确保数据操作的原子性。当任何操作失败时,系统会自动回滚事务,保持数据一致性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "用户界面"
|
||||
participant Logic as "业务逻辑"
|
||||
participant DB as "数据库"
|
||||
UI->>Logic : 请求保存任务包
|
||||
Logic->>DB : 开始事务
|
||||
DB-->>Logic : 事务开始
|
||||
Logic->>DB : 删除旧配置
|
||||
DB-->>Logic : 删除完成
|
||||
Logic->>DB : 插入新配置
|
||||
DB-->>Logic : 插入完成
|
||||
alt 操作成功
|
||||
Logic->>DB : 提交事务
|
||||
DB-->>Logic : 提交成功
|
||||
Logic->>UI : 显示"保存成功"
|
||||
else 操作失败
|
||||
Logic->>DB : 回滚事务
|
||||
DB-->>Logic : 回滚完成
|
||||
Logic->>UI : 显示错误信息
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L677-L712)
|
||||
|
||||
### 用户提示信息
|
||||
系统根据不同的错误情况提供相应的用户提示信息:
|
||||
|
||||
| 错误类型 | 中文提示 | 英文提示 |
|
||||
|---------|--------|--------|
|
||||
| 保存失败 | 保存失败 | Save failed |
|
||||
| 循环次数无效 | 循环次数的值必须在1-60000之间 | The value of LoopTimes should between 1 to 60000 |
|
||||
| 时间间隔无效 | 时间间隔的值必须在1-60000之间 | The value of Interval Time should between 1 to 60000 |
|
||||
| PLC ID为空 | 请输入PLC ID | Please input plcid |
|
||||
| 任务重复 | 任务已存在 | This task has been exist |
|
||||
|
||||
**Section sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L285-L297)
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L222-L235)
|
||||
|
||||
## UI到数据库的完整流程示例
|
||||
以下是从UI数据收集到数据库存储的完整流程示例:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
UIStart([用户界面]) --> SelectTask["用户选择任务"]
|
||||
SelectTask --> ValidateTask["验证任务是否重复"]
|
||||
ValidateTask --> |重复| ShowError["显示'任务已存在'"]
|
||||
ValidateTask --> |不重复| AddToList["添加到任务列表"]
|
||||
AddToList --> ConfigureAttr["配置任务包属性"]
|
||||
ConfigureAttr --> ValidateInput["验证输入参数"]
|
||||
ValidateInput --> |无效| ShowInputError["显示参数错误"]
|
||||
ValidateInput --> |有效| CollectData["收集UI数据"]
|
||||
CollectData --> CreateStruct["创建STTdBrowseInfo和STTaskPacketAttr结构"]
|
||||
CreateStruct --> CallInsert["调用InsertTaskPacketInfo方法"]
|
||||
CallInsert --> DBStart["开始数据库操作"]
|
||||
DBStart --> BeginTrans["开始事务"]
|
||||
BeginTrans --> DeleteOld["删除旧配置"]
|
||||
DeleteOld --> InsertNew["插入新配置"]
|
||||
InsertNew --> Commit["提交事务"]
|
||||
Commit --> |成功| ShowSuccess["显示'保存成功'"]
|
||||
Commit --> |失败| Rollback["回滚事务"]
|
||||
Rollback --> ShowDBError["显示'保存失败'"]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L668-L714)
|
||||
|
||||
**Section sources**
|
||||
- [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp#L206-L300)
|
||||
Reference in New Issue
Block a user