|
| 1 | +# 任务历史新增引擎版本展示 - 设计文档 |
| 2 | + |
| 3 | +## 文档信息 |
| 4 | + |
| 5 | +| 项目 | 内容 | |
| 6 | +|-----|------| |
| 7 | +| 设计名称 | 任务历史新增引擎版本展示 | |
| 8 | +| 需求类型 | 功能增强(ENHANCE) | |
| 9 | +| 优先级 | P2(重要) | |
| 10 | +| 预估工作量 | 2-3人天 | |
| 11 | +| 目标版本 | dev-1.19.0-webank | |
| 12 | +| 创建日期 | 2026-02-09 | |
| 13 | +| 文档状态 | 已完成 | |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +## 📋 执行摘要 |
| 18 | + |
| 19 | +### 设计目标 |
| 20 | +为JobHistory模块的list接口增加引擎版本筛选能力,支持精确匹配和模糊匹配。 |
| 21 | + |
| 22 | +### 核心决策 |
| 23 | +1. **参数扩展**: 添加可选参数engineVersion,保持向后兼容 |
| 24 | +2. **数据查询**: 基于labels字段JSON内容进行LIKE匹配 |
| 25 | +3. **版本匹配**: 支持精确(2.4.3)和模糊(2.4、3)匹配 |
| 26 | +4. **参数校验**: Controller层校验engineVersion必须与engineType一起使用 |
| 27 | + |
| 28 | +### 兼容性策略 |
| 29 | +- 接口兼容:engineVersion为可选参数 |
| 30 | +- 数据兼容:基于现有labels字段 |
| 31 | +- 行为兼容:不修改现有engineType筛选逻辑 |
| 32 | + |
| 33 | +--- |
| 34 | + |
| 35 | +## 一、代码改动清单 |
| 36 | + |
| 37 | +### 1.1 Controller层 |
| 38 | + |
| 39 | +**文件**: `QueryRestfulApi.java` |
| 40 | + |
| 41 | +**改动1**: list方法添加engineVersion参数 |
| 42 | +```java |
| 43 | +@RequestParam(value = "engineVersion", required = false) String engineVersion |
| 44 | +``` |
| 45 | + |
| 46 | +**改动2**: 参数校验 |
| 47 | +```java |
| 48 | +if (StringUtils.isNotBlank(engineVersion) && StringUtils.isBlank(runType)) { |
| 49 | + return Message.error("engineVersion参数必须与engineType参数一起使用"); |
| 50 | +} |
| 51 | +``` |
| 52 | + |
| 53 | +**改动3**: 传递参数到Service层 |
| 54 | +```java |
| 55 | +queryTasks = getJobhistoryList(..., runType, engineVersion); |
| 56 | +``` |
| 57 | + |
| 58 | +### 1.2 Service层 |
| 59 | + |
| 60 | +**文件**: `JobHistoryQueryService.java` |
| 61 | + |
| 62 | +**改动**: 接口方法添加engineVersion参数 |
| 63 | +```java |
| 64 | +List<JobHistory> search(..., String runType, String engineVersion, ...); |
| 65 | +``` |
| 66 | + |
| 67 | +**文件**: `JobHistoryQueryServiceImpl.java` |
| 68 | + |
| 69 | +**改动**: 实现类传递参数到Mapper |
| 70 | +```java |
| 71 | +@Override |
| 72 | +public List<JobHistory> search(..., String runType, String engineVersion, ...) { |
| 73 | + return jobHistoryMapper.search(..., runType, engineVersion, ...); |
| 74 | +} |
| 75 | +``` |
| 76 | + |
| 77 | +### 1.3 Mapper层 |
| 78 | + |
| 79 | +**文件**: `JobHistoryMapper.java` |
| 80 | + |
| 81 | +**改动**: 接口方法添加@Param注解 |
| 82 | +```java |
| 83 | +List<JobHistory> search( |
| 84 | + ..., |
| 85 | + @Param("runType") String runType, |
| 86 | + @Param("engineVersion") String engineVersion, |
| 87 | + ... |
| 88 | +); |
| 89 | +``` |
| 90 | + |
| 91 | +**文件**: `JobHistoryMapper.xml` |
| 92 | + |
| 93 | +**改动**: 添加动态SQL条件 |
| 94 | +```xml |
| 95 | +<if test="engineVersion != null and engineVersion != ''"> |
| 96 | + AND labels LIKE CONCAT('%"engineType":"', #{runType}, '-', #{engineVersion}, '%') |
| 97 | +</if> |
| 98 | +``` |
| 99 | + |
| 100 | +--- |
| 101 | + |
| 102 | +## 二、时序图 |
| 103 | + |
| 104 | +``` |
| 105 | +用户 -> 前端: 选择引擎类型和版本 |
| 106 | +前端 -> QueryRestfulApi: GET /jobhistory/list?engineType=spark&engineVersion=2.4.3 |
| 107 | +QueryRestfulApi -> QueryRestfulApi: 参数校验 |
| 108 | +QueryRestfulApi -> JobHistoryQueryService: search(..., "spark", "2.4.3", ...) |
| 109 | +JobHistoryQueryService -> JobHistoryMapper: search(..., "spark", "2.4.3", ...) |
| 110 | +JobHistoryMapper -> Database: SELECT * WHERE labels LIKE '%"engineType":"spark-2.4.3%' |
| 111 | +Database -> JobHistoryMapper: List<JobHistory> |
| 112 | +JobHistoryMapper -> JobHistoryQueryService: List<JobHistory> |
| 113 | +JobHistoryQueryService -> QueryRestfulApi: List<JobHistory> |
| 114 | +QueryRestfulApi -> 前端: Message.ok().data("tasks", vos) |
| 115 | +前端 -> 用户: 显示筛选结果 |
| 116 | +``` |
| 117 | + |
| 118 | +--- |
| 119 | + |
| 120 | +## 三、SQL设计 |
| 121 | + |
| 122 | +### 3.1 版本匹配SQL |
| 123 | + |
| 124 | +**精确匹配** (engineVersion=2.4.3): |
| 125 | +```sql |
| 126 | +SELECT * FROM linkis_ps_job_history |
| 127 | +WHERE engine_type = 'spark' |
| 128 | + AND labels LIKE '%"engineType":"spark-2.4.3%' |
| 129 | +``` |
| 130 | + |
| 131 | +**模糊匹配-次版本** (engineVersion=2.4): |
| 132 | +```sql |
| 133 | +SELECT * FROM linkis_ps_job_history |
| 134 | +WHERE engine_type = 'spark' |
| 135 | + AND labels LIKE '%"engineType":"spark-2.4%' |
| 136 | +``` |
| 137 | + |
| 138 | +**模糊匹配-主版本** (engineVersion=3): |
| 139 | +```sql |
| 140 | +SELECT * FROM linkis_ps_job_history |
| 141 | +WHERE engine_type = 'spark' |
| 142 | + AND labels LIKE '%"engineType":"spark-3%' |
| 143 | +``` |
| 144 | + |
| 145 | +### 3.2 动态SQL实现 |
| 146 | + |
| 147 | +```xml |
| 148 | +<select id="search" resultMap="JobHistoryMap"> |
| 149 | + SELECT * FROM linkis_ps_job_history |
| 150 | + WHERE 1=1 |
| 151 | + <if test="runType != null and runType != ''"> |
| 152 | + AND engine_type = #{runType} |
| 153 | + </if> |
| 154 | + <if test="engineVersion != null and engineVersion != ''"> |
| 155 | + AND labels LIKE CONCAT('%"engineType":"', #{runType}, '-', #{engineVersion}, '%') |
| 156 | + </if> |
| 157 | + <!-- 其他现有条件 --> |
| 158 | +</select> |
| 159 | +``` |
| 160 | + |
| 161 | +--- |
| 162 | + |
| 163 | +## 四、兼容性分析 |
| 164 | + |
| 165 | +### 4.1 接口兼容性 |
| 166 | + |
| 167 | +| 场景 | 参数 | 行为 | 兼容性 | |
| 168 | +|-----|------|------|--------| |
| 169 | +| 现有调用 | 不传engineVersion | 查询逻辑不变 | ✅ 完全兼容 | |
| 170 | +| 新增调用 | 传engineVersion | 增加版本筛选 | ✅ 功能增强 | |
| 171 | +| 错误调用 | 只传engineVersion | 返回异常提示 | ✅ 明确提示 | |
| 172 | + |
| 173 | +### 4.2 数据兼容性 |
| 174 | + |
| 175 | +- 基于现有labels字段,无需数据迁移 |
| 176 | +- labels字段格式固定:`{"engineType":"spark-2.4.3"}` |
| 177 | +- 不修改现有数据结构 |
| 178 | + |
| 179 | +### 4.3 性能影响 |
| 180 | + |
| 181 | +| 影响项 | 评估 | 说明 | |
| 182 | +|-------|------|------| |
| 183 | +| 查询性能 | 中等影响 | LIKE查询,暂不添加索引 | |
| 184 | +| 接口响应时间 | 微小增加 | 增加一个可选条件 | |
| 185 | +| 数据库负载 | 无明显影响 | 查询条件增加,但数据量可控 | |
| 186 | + |
| 187 | +--- |
| 188 | + |
| 189 | +## 五、测试策略 |
| 190 | + |
| 191 | +### 5.1 单元测试 |
| 192 | + |
| 193 | +**测试类**: `QueryRestfulApiTest.java` |
| 194 | + |
| 195 | +**测试用例**: |
| 196 | +1. testListWithEngineVersion_Precise() - 精确版本匹配 |
| 197 | +2. testListWithEngineVersion_Fuzzy() - 模糊版本匹配 |
| 198 | +3. testListWithoutEngineVersion() - 兼容性测试 |
| 199 | +4. testListWithEngineVersionOnly() - 参数校验测试 |
| 200 | + |
| 201 | +### 5.2 集成测试 |
| 202 | + |
| 203 | +**测试场景**: |
| 204 | +1. 端到端测试:前端 -> Controller -> Service -> Mapper -> Database |
| 205 | +2. 性能测试:大数据量下的查询性能 |
| 206 | +3. 兼容性测试:现有调用方不受影响 |
| 207 | + |
| 208 | +--- |
| 209 | + |
| 210 | +## 六、部署方案 |
| 211 | + |
| 212 | +### 6.1 部署步骤 |
| 213 | + |
| 214 | +1. 代码合并到dev-1.19.0-webank分支 |
| 215 | +2. 执行单元测试和集成测试 |
| 216 | +3. 部署到测试环境验证 |
| 217 | +4. 部署到生产环境 |
| 218 | + |
| 219 | +### 6.2 回滚方案 |
| 220 | + |
| 221 | +- 代码回滚:回退到上一个版本 |
| 222 | +- 数据回滚:无需数据回滚(未修改数据结构) |
| 223 | +- 接口回滚:移除engineVersion参数 |
| 224 | + |
| 225 | +--- |
| 226 | + |
| 227 | +## 七、监控指标 |
| 228 | + |
| 229 | +| 指标 | 监控方式 | 告警阈值 | |
| 230 | +|-----|---------|---------| |
| 231 | +| 接口响应时间 | APM监控 | >2秒 | |
| 232 | +| 查询错误率 | 日志监控 | >1% | |
| 233 | +| 参数校验失败次数 | 日志统计 | >100次/小时 | |
| 234 | + |
| 235 | +--- |
| 236 | + |
| 237 | +## 八、附录 |
| 238 | + |
| 239 | +### 8.1 相关文档 |
| 240 | + |
| 241 | +- 需求文档:`docs/dev-1.19.0-webank/requirements/job-history-engine-version-filter_需求.md` |
| 242 | +- Feature文件:`docs/dev-1.19.0-webank/features/job-history-engine-version-filter.feature` |
| 243 | + |
| 244 | +### 8.2 变更历史 |
| 245 | + |
| 246 | +| 版本 | 日期 | 变更内容 | 变更人 | |
| 247 | +|-----|------|---------|--------| |
| 248 | +| 1.0 | 2026-02-09 | 初始版本 | des-enhance-feature | |
| 249 | + |
| 250 | +--- |
| 251 | + |
| 252 | +**文档生成信息**: |
| 253 | +- 生成时间:2026-02-09T03:45:00Z |
| 254 | +- 生成工具:des-enhance-feature v3.3 |
| 255 | +- 设计复杂度:中等 |
0 commit comments