a
This commit is contained in:
@@ -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