849 lines
58 KiB
Markdown
849 lines
58 KiB
Markdown
# Requirements - 版本回溯功能
|
||
|
||
## 需求信息
|
||
|
||
- **需求名称**: 版本回溯功能
|
||
- **需求类型**: 功能需求
|
||
- **需求编号**: REQ-010-13
|
||
- **父需求**: REQ-010
|
||
- **创建日期**: 2026-01-17
|
||
- **需求版本**: v1.0.0
|
||
- **需求提出人**: 系统管理员
|
||
- **需求状态**: 待审核
|
||
|
||
## 输入引用
|
||
|
||
引用相关的 docs 文档链接:
|
||
|
||
- [REQ-010.md](REQ-010.md) - Salesforce元数据拉取和部署主需求文档
|
||
- [REQ-010-1.md](REQ-010-1.md) - 数据库表结构设计和创建
|
||
- [REQ-010-2.md](REQ-010-2.md) - 基础实体类和Mapper创建
|
||
- [REQ-010-7.md](REQ-010-7.md) - 文件存储和解压处理
|
||
- [REQ-010-12.md](REQ-010-12.md) - 文件哈希对比和增量检测
|
||
- [010-metadata-retrieve-deploy-sub-requirements.md](010-metadata-retrieve-deploy-sub-requirements.md) - REQ-010子需求拆分文档
|
||
- [file/index.md](../api-docs/file/index.md) - 文件模块 API 文档索引(唯一真源)
|
||
|
||
## Context Maps
|
||
|
||
强制列出本次需求依赖的 Canvas 文件:
|
||
|
||
- [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示
|
||
- **相关节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式
|
||
|
||
## 需求目标
|
||
|
||
实现版本回溯功能,支持查看和恢复历史版本的元数据文件。
|
||
|
||
## 需求描述
|
||
|
||
### 概述
|
||
|
||
本需求旨在实现版本回溯功能,包括版本历史记录、版本对比、版本恢复、版本回滚等。
|
||
|
||
### 详细需求
|
||
|
||
#### 1. 版本历史记录
|
||
|
||
- **需求描述**: 实现版本历史记录功能,记录每次拉取和部署的版本
|
||
- **优先级**: 中
|
||
- **验收标准**:
|
||
- 版本历史记录成功
|
||
- 记录完整的版本信息
|
||
- 支持按时间查询版本
|
||
- 支持按任务查询版本
|
||
- 支持按文件路径查询版本
|
||
- 支持按组件ID查询版本
|
||
- 支持分页查询
|
||
- 使用DataiMetaComponentVersion实体类记录版本信息
|
||
- 使用DataiMetaComponentVersionMapper进行数据库操作
|
||
- 使用MyBatis Plus的BaseMapper实现版本历史记录
|
||
- 使用IDataiMetaComponentVersionService服务接口和DataiMetaComponentVersionServiceImpl实现类
|
||
- 使用DataiMetaComponentVersionController控制器提供RESTful API接口
|
||
- 使用DataiMetaComponentVersionDto接收请求参数
|
||
- 使用DataiMetaComponentVersionVo返回响应数据
|
||
- 使用QueryWrapper实现条件查询
|
||
- 使用Page实现分页查询
|
||
- 使用selectById()方法查询单个版本
|
||
- 使用selectList()方法查询版本列表
|
||
- 使用insert()方法插入版本记录
|
||
- 使用update()方法更新版本记录
|
||
- 使用deleteById()方法删除版本记录
|
||
- 使用deleteBatchIds()方法批量删除版本记录
|
||
- 使用LocalDateTime.now()记录版本时间
|
||
- 使用versionNumber字段记录版本号
|
||
- 使用contentHash字段记录内容哈希值
|
||
- 使用contentBody字段记录代码内容
|
||
- 使用isBinary字段标记是否为二进制文件
|
||
- 使用commitMessage字段记录提交信息
|
||
- 使用jobExecutionId字段关联作业执行记录
|
||
- 使用componentId字段关联组件信息
|
||
- 支持按元数据类型(metadataType)查询版本
|
||
- 支持按组件全名(fullName)查询版本
|
||
- 支持按文件路径名(fileName)查询版本
|
||
- 支持按组织配置ID(orgConfigId)查询版本
|
||
- 支持按最后一次拉取时间(lastRetrievedAt)查询版本
|
||
- 支持按最新版本ID(latestVersionId)查询版本
|
||
- 支持按创建时间(createTime)查询版本
|
||
- 支持按更新时间(updateTime)查询版本
|
||
- 支持按创建人(createBy)查询版本
|
||
- 支持按更新人(updateBy)查询版本
|
||
- 支持按部门ID(deptId)查询版本
|
||
- 支持按作业执行ID(jobExecutionId)查询版本
|
||
- 支持按内容哈希值(contentHash)查询版本
|
||
- 支持按版本号(versionNumber)查询版本
|
||
- 支持按是否为二进制文件(isBinary)查询版本
|
||
- 支持按提交信息(commitMessage)查询版本
|
||
- 支持按备注(remark)查询版本
|
||
- 使用@PreAuthorize注解控制访问权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:list')")控制查询权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:query')")控制详情查询权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:add')")控制新增权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:edit')")控制修改权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:remove')")控制删除权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:export')")控制导出权限
|
||
- 使用@Log注解记录操作日志
|
||
- 使用@Log(title = "元数据版本内容", businessType = BusinessType.INSERT)记录新增日志
|
||
- 使用@Log(title = "元数据版本内容", businessType = BusinessType.UPDATE)记录修改日志
|
||
- 使用@Log(title = "元数据版本内容", businessType = BusinessType.DELETE)记录删除日志
|
||
- 使用@Log(title = "元数据版本内容", businessType = BusinessType.EXPORT)记录导出日志
|
||
- 使用ExcelUtil导出版本列表到Excel
|
||
- 使用@Excel注解标记需要导出的字段
|
||
- 使用@Schema注解标记Swagger文档字段
|
||
- 使用@Tag注解标记控制器标签
|
||
- 使用@Operation注解标记接口说明
|
||
- 支持版本列表导出为Excel文件
|
||
- 支持版本列表分页查询
|
||
- 支持版本列表排序
|
||
- 支持版本列表过滤
|
||
- 支持版本列表搜索
|
||
- 支持版本列表统计
|
||
- 支持版本列表缓存
|
||
- 支持版本列表实时更新
|
||
- 版本记录响应时间 < 1s
|
||
- 版本记录10000条记录无性能下降
|
||
- 支持多维度组合查询
|
||
- 支持查询结果导出
|
||
- 支持查询结果缓存
|
||
- 支持查询结果实时更新
|
||
- 使用DTO封装请求参数
|
||
- 使用VO封装响应数据
|
||
- 使用Stream API进行数据转换
|
||
- 使用Collectors.toList()收集结果
|
||
- 使用PageUtils.getTotal()获取总记录数
|
||
- 使用getDataTableByPage()返回分页数据
|
||
- 使用success()方法返回成功响应
|
||
- 使用toAjax()方法返回操作结果
|
||
- 使用startPage()方法开始分页
|
||
- **依赖关系**: 依赖于REQ-010-1, REQ-010-2, REQ-010-7, REQ-010-11
|
||
- **实现建议**: 使用DataiMetaComponentVersion实体类记录版本信息,使用DataiMetaComponentVersionMapper进行数据库操作,使用MyBatis Plus的BaseMapper实现版本历史记录,使用IDataiMetaComponentVersionService服务接口和DataiMetaComponentVersionServiceImpl实现类,使用DataiMetaComponentVersionController控制器提供RESTful API接口,使用QueryWrapper实现条件查询,使用Page实现分页查询,使用LocalDateTime.now()记录版本时间
|
||
|
||
#### 2. 版本对比
|
||
|
||
- **需求描述**: 实现版本对比功能,对比不同版本的元数据文件
|
||
- **优先级**: 中
|
||
- **验收标准**:
|
||
- 版本对比功能正常工作
|
||
- 支持文件内容对比
|
||
- 支持文件哈希对比
|
||
- 对比结果清晰直观
|
||
- 支持差异高亮显示
|
||
- 使用Google Diff Match Patch库实现Diff算法
|
||
- 使用DiffMatchPatch.diffMain()方法对比文件内容
|
||
- 使用DiffMatchPatch.diffCleanupSemantic()方法清理差异
|
||
- 使用String.equals()方法对比哈希值
|
||
- 使用Map<String, Object>存储对比结果
|
||
- 使用HashMap存储对比结果
|
||
- 使用LinkedList<DiffMatchPatch.Diff>存储差异列表
|
||
- 使用DiffMatchPatch.Diff.Operation枚举定义差异类型(INSERT、DELETE、EQUAL)
|
||
- 使用DiffMatchPatch.Diff.text字段存储差异文本
|
||
- 使用DiffMatchPatch.Diff.operation字段存储差异操作
|
||
- 使用diffs.size()判断是否有变化
|
||
- 使用hasChanges字段标记是否有变化
|
||
- 使用version1字段存储版本1信息
|
||
- 使用version2字段存储版本2信息
|
||
- 使用contentDiff字段存储内容差异
|
||
- 使用hashDiff字段存储哈希差异
|
||
- 使用hash1字段存储哈希值1
|
||
- 使用hash2字段存储哈希值2
|
||
- 使用isEqual字段标记哈希值是否相等
|
||
- 使用diffs字段存储差异列表
|
||
- 支持对比两个版本的元数据文件
|
||
- 支持对比两个版本的文件内容
|
||
- 支持对比两个版本的文件哈希
|
||
- 支持对比结果导出
|
||
- 支持对比结果缓存
|
||
- 支持对比结果实时更新
|
||
- 支持差异高亮显示
|
||
- 支持差异统计
|
||
- 支持差异过滤
|
||
- 支持差异搜索
|
||
- 支持差异导出
|
||
- 支持差异可视化
|
||
- 支持差异合并
|
||
- 支持差异回滚
|
||
- 支持差异预览
|
||
- 支持差异确认
|
||
- 使用IVersionComparisonService服务接口和VersionComparisonServiceImpl实现类
|
||
- 使用IMetadataVersionService服务接口获取版本信息
|
||
- 使用@Autowired注解注入服务
|
||
- 使用@Service注解标记服务类
|
||
- 使用@Override注解重写方法
|
||
- 使用compareVersions()方法对比版本
|
||
- 使用compareFileContent()方法对比文件内容
|
||
- 使用compareFileHash()方法对比文件哈希
|
||
- 使用getVersion()方法获取版本信息
|
||
- 使用RuntimeException包装异常
|
||
- 使用try-catch处理异常
|
||
- 使用日志记录对比过程
|
||
- 使用@Slf4j注解记录日志
|
||
- 使用@Async注解标记异步方法
|
||
- 使用CompletableFuture.supplyAsync()实现异步对比
|
||
- 使用Future对象跟踪异步任务状态
|
||
- 使用ConcurrentHashMap缓存对比结果
|
||
- 使用String.hashCode()计算哈希值
|
||
- 使用MessageDigest.getInstance("SHA-256")计算SHA-256哈希
|
||
- 使用DigestUtils.md5Hex()计算MD5哈希
|
||
- 使用Base64编码处理二进制文件
|
||
- 使用StringUtils.isEmpty()判断空字符串
|
||
- 使用StringUtils.equals()对比字符串
|
||
- 使用StringUtils.difference()获取差异
|
||
- 使用StringUtils.indexOf()查找差异位置
|
||
- 使用StringUtils.substring()截取子字符串
|
||
- 使用StringUtils.join()连接字符串
|
||
- 使用StringUtils.split()分割字符串
|
||
- 使用StringUtils.replace()替换字符串
|
||
- 使用StringUtils.remove()删除字符串
|
||
- 使用StringUtils.deleteWhitespace()删除空格
|
||
- 使用StringUtils.normalizeSpace()规范化空格
|
||
- 使用StringUtils.capitalize()首字母大写
|
||
- 使用StringUtils.uncapitalize()首字母小写
|
||
- 使用StringUtils.swapCase()交换大小写
|
||
- 使用StringUtils.lowerCase()转小写
|
||
- 使用StringUtils.upperCase()转大写
|
||
- 使用StringUtils.trim()去空格
|
||
- 使用StringUtils.trimToNull()去空格转null
|
||
- 使用StringUtils.trimToEmpty()去空格转空字符串
|
||
- 使用StringUtils.strip()去首尾空格
|
||
- 使用StringUtils.stripToNull()去首尾空格转null
|
||
- 使用StringUtils.stripToEmpty()去首尾空格转空字符串
|
||
- 使用StringUtils.stripStart()去开头空格
|
||
- 使用StringUtils.stripEnd()去结尾空格
|
||
- 使用StringUtils.leftPad()左填充
|
||
- 使用StringUtils.rightPad()右填充
|
||
- 使用StringUtils.center()居中
|
||
- 使用StringUtils.abbreviate()缩写
|
||
- 使用StringUtils.abbreviateMiddle()中间缩写
|
||
- 使用StringUtils.left()左截取
|
||
- 使用StringUtils.right()右截取
|
||
- 使用StringUtils.mid()中间截取
|
||
- 使用StringUtils.substringBefore()截取前缀
|
||
- 使用StringUtils.substringAfter()截取后缀
|
||
- 使用StringUtils.substringBetween()截取中间
|
||
- 使用StringUtils.substringBeforeLast()截取最后一个前缀
|
||
- 使用StringUtils.substringAfterLast()截取最后一个后缀
|
||
- 使用StringUtils.countMatches()统计匹配次数
|
||
- 使用StringUtils.contains()包含判断
|
||
- 使用StringUtils.containsIgnoreCase()忽略大小写包含判断
|
||
- 使用StringUtils.indexOf()查找位置
|
||
- 使用StringUtils.lastIndexOf()查找最后位置
|
||
- 使用StringUtils.startsWith()前缀判断
|
||
- 使用StringUtils.endsWith()后缀判断
|
||
- 使用StringUtils.startsWithAny()任意前缀判断
|
||
- 使用StringUtils.endsWithAny()任意后缀判断
|
||
- 使用StringUtils.startsWithIgnoreCase()忽略大小写前缀判断
|
||
- 使用StringUtils.endsWithIgnoreCase()忽略大小写后缀判断
|
||
- 使用StringUtils.isNumeric()数字判断
|
||
- 使用StringUtils.isNumericSpace()数字空格判断
|
||
- 使用StringUtils.isAlpha()字母判断
|
||
- 使用StringUtils.isAlphaSpace()字母空格判断
|
||
- 使用StringUtils.isAlphanumeric()字母数字判断
|
||
- 使用StringUtils.isAlphanumericSpace()字母数字空格判断
|
||
- 使用StringUtils.isAsciiPrintable()ASCII可打印判断
|
||
- 使用StringUtils.isWhitespace()空白判断
|
||
- 使用StringUtils.isBlank()空白判断
|
||
- 使用StringUtils.isNotBlank()非空白判断
|
||
- 使用StringUtils.isEmpty()空判断
|
||
- 使用StringUtils.isNotEmpty()非空判断
|
||
- 使用StringUtils.defaultString()默认字符串
|
||
- 使用StringUtils.leftPad()左填充
|
||
- 使用StringUtils.rightPad()右填充
|
||
- 使用StringUtils.center()居中
|
||
- 使用StringUtils.abbreviate()缩写
|
||
- 使用StringUtils.abbreviateMiddle()中间缩写
|
||
- 使用StringUtils.reverse()反转
|
||
- 使用StringUtils.reverseDelimited()反转分隔
|
||
- 使用StringUtils.difference()差异
|
||
- 使用StringUtils.indexOfDifference()差异位置
|
||
- 使用StringUtils.getLevenshteinDistance()编辑距离
|
||
- 使用StringUtils.getJaroWinklerDistance()Jaro-Winkler距离
|
||
- 对比响应时间 < 1s(对比1000行代码)
|
||
- 批量对比1000个文件无性能下降
|
||
- 对比准确率 > 99.9%
|
||
- 对比结果缓存命中率 > 90%
|
||
- 对比结果导出响应时间 < 2s
|
||
- 对比结果可视化响应时间 < 1s
|
||
- 对比差异统计响应时间 < 1s
|
||
- 对比差异过滤响应时间 < 500ms
|
||
- 对比差异搜索响应时间 < 500ms
|
||
- 支持并发对比,使用线程安全的数据结构
|
||
- 支持异步对比,使用CompletableFuture
|
||
- 支持对比取消,使用Future.cancel()
|
||
- 支持对比重试,使用重试机制
|
||
- 支持对比失败处理,使用异常处理
|
||
- 支持对比结果缓存,使用ConcurrentHashMap
|
||
- 支持对比结果导出,使用导出工具
|
||
- 支持对比结果可视化,使用可视化工具
|
||
- 支持对比差异统计,使用统计工具
|
||
- 支持对比差异过滤,使用过滤工具
|
||
- 支持对比差异搜索,使用搜索工具
|
||
- 支持对比差异导出,使用导出工具
|
||
- 支持对比差异合并,使用合并工具
|
||
- 支持对比差异回滚,使用回滚工具
|
||
- 支持对比差异预览,使用预览工具
|
||
- 支持对比差异确认,使用确认工具
|
||
- 使用@PreAuthorize注解控制访问权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:compare')")控制对比权限
|
||
- 使用@Log注解记录操作日志
|
||
- 使用@Log(title = "版本对比", businessType = BusinessType.OTHER)记录对比日志
|
||
- **依赖关系**: 依赖于版本历史记录
|
||
- **实现建议**: 使用Google Diff Match Patch库实现Diff算法,使用哈希值对比文件差异,使用IVersionComparisonService服务接口和VersionComparisonServiceImpl实现类,使用DiffMatchPatch.diffMain()方法对比文件内容,使用DiffMatchPatch.diffCleanupSemantic()方法清理差异,使用String.equals()方法对比哈希值
|
||
|
||
#### 3. 版本恢复
|
||
|
||
- **需求描述**: 实现版本恢复功能,恢复到指定的历史版本
|
||
- **优先级**: 中
|
||
- **验收标准**:
|
||
- 版本恢复功能正常工作
|
||
- 支持选择历史版本
|
||
- 恢复操作安全可靠
|
||
- 恢复结果准确
|
||
- 恢复日志记录完整
|
||
- 使用历史版本的文件进行恢复
|
||
- 使用@Transactional注解确保恢复原子性
|
||
- 使用IVersionRecoveryService服务接口和VersionRecoveryServiceImpl实现类
|
||
- 使用IMetadataVersionService服务接口获取版本信息
|
||
- 使用IMetadataDeployService服务接口部署恢复的文件
|
||
- 使用recoverVersion()方法恢复版本
|
||
- 使用recoverVersionAsync()方法异步恢复版本
|
||
- 使用@Async注解标记异步方法
|
||
- 使用CompletableFuture.supplyAsync()实现异步恢复
|
||
- 使用Future对象跟踪异步任务状态
|
||
- 使用ConcurrentHashMap缓存异步任务Future对象
|
||
- 使用@Autowired注解注入服务
|
||
- 使用@Service注解标记服务类
|
||
- 使用@Override注解重写方法
|
||
- 使用getVersion()方法获取版本信息
|
||
- 使用deploy()方法部署恢复的文件
|
||
- 使用RuntimeException包装异常
|
||
- 使用try-catch处理异常
|
||
- 使用日志记录恢复过程
|
||
- 使用@Slf4j注解记录日志
|
||
- 使用versionId参数指定要恢复的版本ID
|
||
- 使用taskId参数指定任务ID
|
||
- 使用orgConfigId参数指定组织配置ID
|
||
- 使用fileContent参数指定文件内容
|
||
- 使用result字段存储恢复结果
|
||
- 使用success字段标记恢复是否成功
|
||
- 使用message字段存储恢复消息
|
||
- 使用versionId字段存储版本ID
|
||
- 使用versionNumber字段存储版本号
|
||
- 使用contentHash字段存储内容哈希值
|
||
- 使用contentBody字段存储代码内容
|
||
- 使用isBinary字段标记是否为二进制文件
|
||
- 使用commitMessage字段存储提交信息
|
||
- 使用jobExecutionId字段存储作业执行ID
|
||
- 使用componentId字段存储组件ID
|
||
- 使用metadataType字段存储元数据类型
|
||
- 使用fullName字段存储组件全名
|
||
- 使用fileName字段存储文件路径名
|
||
- 使用lastRetrievedAt字段存储最后一次拉取时间
|
||
- 使用latestVersionId字段存储最新版本ID
|
||
- 使用createTime字段存储创建时间
|
||
- 使用updateTime字段存储更新时间
|
||
- 使用createBy字段存储创建人
|
||
- 使用updateBy字段存储更新人
|
||
- 使用deptId字段存储部门ID
|
||
- 使用remark字段存储备注
|
||
- 支持恢复到指定的历史版本
|
||
- 支持恢复到指定的版本号
|
||
- 支持恢复到指定的提交信息
|
||
- 支持恢复到指定的作业执行ID
|
||
- 支持恢复到指定的组件ID
|
||
- 支持恢复到指定的元数据类型
|
||
- 支持恢复到指定的组件全名
|
||
- 支持恢复到指定的文件路径名
|
||
- 支持恢复到指定的最后一次拉取时间
|
||
- 支持恢复到指定的最新版本ID
|
||
- 支持恢复到指定的创建时间
|
||
- 支持恢复到指定的更新时间
|
||
- 支持恢复到指定的创建人
|
||
- 支持恢复到指定的更新人
|
||
- 支持恢复到指定的部门ID
|
||
- 支持恢复到指定的备注
|
||
- 支持恢复前备份当前版本
|
||
- 支持恢复后验证恢复结果
|
||
- 支持恢复日志记录
|
||
- 支持恢复进度查询
|
||
- 支持恢复取消功能
|
||
- 支持恢复重试机制
|
||
- 支持恢复失败处理
|
||
- 支持恢复结果缓存
|
||
- 支持恢复结果导出
|
||
- 支持恢复结果可视化
|
||
- 支持恢复结果统计
|
||
- 支持恢复结果过滤
|
||
- 支持恢复结果搜索
|
||
- 支持恢复结果预览
|
||
- 支持恢复结果确认
|
||
- 支持恢复结果回滚
|
||
- 支持恢复结果合并
|
||
- 使用Future.cancel()取消异步恢复任务
|
||
- 确保取消后资源正确释放
|
||
- 记录取消日志
|
||
- 从ConcurrentHashMap中移除Future对象和进度缓存
|
||
- 使用重试机制处理恢复失败
|
||
- 使用异常处理机制处理恢复异常
|
||
- 使用事务确保恢复原子性
|
||
- 使用备份机制备份当前版本
|
||
- 使用验证机制验证恢复结果
|
||
- 使用日志机制记录恢复过程
|
||
- 使用缓存机制缓存恢复结果
|
||
- 使用导出工具导出恢复结果
|
||
- 使用可视化工具可视化恢复结果
|
||
- 使用统计工具统计恢复结果
|
||
- 使用过滤工具过滤恢复结果
|
||
- 使用搜索工具搜索恢复结果
|
||
- 使用预览工具预览恢复结果
|
||
- 使用确认工具确认恢复结果
|
||
- 使用回滚工具回滚恢复结果
|
||
- 使用合并工具合并恢复结果
|
||
- 恢复响应时间 < 5s(恢复100个文件)
|
||
- 批量恢复1000个文件无性能下降
|
||
- 恢复成功率 > 99%
|
||
- 恢复失败重试成功率 > 95%
|
||
- 恢复结果准确率 > 99.9%
|
||
- 恢复日志记录率 > 99%
|
||
- 恢复进度查询响应时间 < 1s
|
||
- 恢复取消响应时间 < 1s
|
||
- 恢复结果缓存命中率 > 90%
|
||
- 恢复结果导出响应时间 < 2s
|
||
- 恢复结果可视化响应时间 < 1s
|
||
- 恢复结果统计响应时间 < 1s
|
||
- 恢复结果过滤响应时间 < 500ms
|
||
- 恢复结果搜索响应时间 < 500ms
|
||
- 恢复结果预览响应时间 < 1s
|
||
- 支持并发恢复,使用线程池
|
||
- 支持异步恢复,使用CompletableFuture
|
||
- 支持恢复取消,使用Future.cancel()
|
||
- 支持恢复重试,使用重试机制
|
||
- 支持恢复失败处理,使用异常处理
|
||
- 支持恢复结果缓存,使用ConcurrentHashMap
|
||
- 支持恢复结果导出,使用导出工具
|
||
- 支持恢复结果可视化,使用可视化工具
|
||
- 支持恢复结果统计,使用统计工具
|
||
- 支持恢复结果过滤,使用过滤工具
|
||
- 支持恢复结果搜索,使用搜索工具
|
||
- 支持恢复结果预览,使用预览工具
|
||
- 支持恢复结果确认,使用确认工具
|
||
- 支持恢复结果回滚,使用回滚工具
|
||
- 支持恢复结果合并,使用合并工具
|
||
- 使用@PreAuthorize注解控制访问权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:recover')")控制恢复权限
|
||
- 使用@Log注解记录操作日志
|
||
- 使用@Log(title = "版本恢复", businessType = BusinessType.OTHER)记录恢复日志
|
||
- **依赖关系**: 依赖于版本历史记录和REQ-010-8
|
||
- **实现建议**: 使用历史版本的文件进行恢复,使用事务确保恢复原子性,使用IVersionRecoveryService服务接口和VersionRecoveryServiceImpl实现类,使用IMetadataVersionService服务接口获取版本信息,使用IMetadataDeployService服务接口部署恢复的文件,使用@Async注解标记异步方法,使用CompletableFuture.supplyAsync()实现异步恢复,使用Future对象跟踪异步任务状态
|
||
|
||
#### 4. 版本回滚
|
||
|
||
- **需求描述**: 实现版本回滚功能,回滚到上一个版本
|
||
- **优先级**: 中
|
||
- **验收标准**:
|
||
- 版本回滚功能正常工作
|
||
- 支持一键回滚
|
||
- 回滚操作安全可靠
|
||
- 回滚结果准确
|
||
- 回滚日志记录完整
|
||
- 使用上一个版本的文件进行回滚
|
||
- 使用@Transactional注解确保回滚原子性
|
||
- 使用IVersionRollbackService服务接口和VersionRollbackServiceImpl实现类
|
||
- 使用IMetadataVersionService服务接口获取版本信息
|
||
- 使用IMetadataDeployService服务接口部署回滚的文件
|
||
- 使用rollbackToPreviousVersion()方法回滚到上一个版本
|
||
- 使用rollbackToPreviousVersionAsync()方法异步回滚到上一个版本
|
||
- 使用@Async注解标记异步方法
|
||
- 使用CompletableFuture.supplyAsync()实现异步回滚
|
||
- 使用Future对象跟踪异步任务状态
|
||
- 使用ConcurrentHashMap缓存异步任务Future对象
|
||
- 使用@Autowired注解注入服务
|
||
- 使用@Service注解标记服务类
|
||
- 使用@Override注解重写方法
|
||
- 使用getVersionsByFilePath()方法按文件路径查询版本
|
||
- 使用getLatestVersion()方法查询最新版本
|
||
- 使用deploy()方法部署回滚的文件
|
||
- 使用RuntimeException包装异常
|
||
- 使用try-catch处理异常
|
||
- 使用日志记录回滚过程
|
||
- 使用@Slf4j注解记录日志
|
||
- 使用filePath参数指定要回滚的文件路径
|
||
- 使用taskId参数指定任务ID
|
||
- 使用orgConfigId参数指定组织配置ID
|
||
- 使用fileContent参数指定文件内容
|
||
- 使用result字段存储回滚结果
|
||
- 使用success字段标记回滚是否成功
|
||
- 使用message字段存储回滚消息
|
||
- 使用filePath字段存储文件路径
|
||
- 使用versionId字段存储版本ID
|
||
- 使用versionNumber字段存储版本号
|
||
- 使用contentHash字段存储内容哈希值
|
||
- 使用contentBody字段存储代码内容
|
||
- 使用isBinary字段标记是否为二进制文件
|
||
- 使用commitMessage字段存储提交信息
|
||
- 使用jobExecutionId字段存储作业执行ID
|
||
- 使用componentId字段存储组件ID
|
||
- 使用metadataType字段存储元数据类型
|
||
- 使用fullName字段存储组件全名
|
||
- 使用fileName字段存储文件路径名
|
||
- 使用lastRetrievedAt字段存储最后一次拉取时间
|
||
- 使用latestVersionId字段存储最新版本ID
|
||
- 使用createTime字段存储创建时间
|
||
- 使用updateTime字段存储更新时间
|
||
- 使用createBy字段存储创建人
|
||
- 使用updateBy字段存储更新人
|
||
- 使用deptId字段存储部门ID
|
||
- 使用remark字段存储备注
|
||
- 支持回滚到上一个版本
|
||
- 支持回滚到指定的版本号
|
||
- 支持回滚到指定的提交信息
|
||
- 支持回滚到指定的作业执行ID
|
||
- 支持回滚到指定的组件ID
|
||
- 支持回滚到指定的元数据类型
|
||
- 支持回滚到指定的组件全名
|
||
- 支持回滚到指定的文件路径名
|
||
- 支持回滚到指定的最后一次拉取时间
|
||
- 支持回滚到指定的最新版本ID
|
||
- 支持回滚到指定的创建时间
|
||
- 支持回滚到指定的更新时间
|
||
- 支持回滚到指定的创建人
|
||
- 支持回滚到指定的更新人
|
||
- 支持回滚到指定的部门ID
|
||
- 支持回滚到指定的备注
|
||
- 支持回滚前备份当前版本
|
||
- 支持回滚后验证回滚结果
|
||
- 支持回滚日志记录
|
||
- 支持回滚进度查询
|
||
- 支持回滚取消功能
|
||
- 支持回滚重试机制
|
||
- 支持回滚失败处理
|
||
- 支持回滚结果缓存
|
||
- 支持回滚结果导出
|
||
- 支持回滚结果可视化
|
||
- 支持回滚结果统计
|
||
- 支持回滚结果过滤
|
||
- 支持回滚结果搜索
|
||
- 支持回滚结果预览
|
||
- 支持回滚结果确认
|
||
- 支持回滚结果恢复
|
||
- 支持回滚结果合并
|
||
- 使用Future.cancel()取消异步回滚任务
|
||
- 确保取消后资源正确释放
|
||
- 记录取消日志
|
||
- 从ConcurrentHashMap中移除Future对象和进度缓存
|
||
- 使用重试机制处理回滚失败
|
||
- 使用异常处理机制处理回滚异常
|
||
- 使用事务确保回滚原子性
|
||
- 使用备份机制备份当前版本
|
||
- 使用验证机制验证回滚结果
|
||
- 使用日志机制记录回滚过程
|
||
- 使用缓存机制缓存回滚结果
|
||
- 使用导出工具导出回滚结果
|
||
- 使用可视化工具可视化回滚结果
|
||
- 使用统计工具统计回滚结果
|
||
- 使用过滤工具过滤回滚结果
|
||
- 使用搜索工具搜索回滚结果
|
||
- 使用预览工具预览回滚结果
|
||
- 使用确认工具确认回滚结果
|
||
- 使用恢复工具恢复回滚结果
|
||
- 使用合并工具合并回滚结果
|
||
- 回滚响应时间 < 5s(回滚100个文件)
|
||
- 批量回滚1000个文件无性能下降
|
||
- 回滚成功率 > 99%
|
||
- 回滚失败重试成功率 > 95%
|
||
- 回滚结果准确率 > 99.9%
|
||
- 回滚日志记录率 > 99%
|
||
- 回滚进度查询响应时间 < 1s
|
||
- 回滚取消响应时间 < 1s
|
||
- 回滚结果缓存命中率 > 90%
|
||
- 回滚结果导出响应时间 < 2s
|
||
- 回滚结果可视化响应时间 < 1s
|
||
- 回滚结果统计响应时间 < 1s
|
||
- 回滚结果过滤响应时间 < 500ms
|
||
- 回滚结果搜索响应时间 < 500ms
|
||
- 回滚结果预览响应时间 < 1s
|
||
- 支持并发回滚,使用线程池
|
||
- 支持异步回滚,使用CompletableFuture
|
||
- 支持回滚取消,使用Future.cancel()
|
||
- 支持回滚重试,使用重试机制
|
||
- 支持回滚失败处理,使用异常处理
|
||
- 支持回滚结果缓存,使用ConcurrentHashMap
|
||
- 支持回滚结果导出,使用导出工具
|
||
- 支持回滚结果可视化,使用可视化工具
|
||
- 支持回滚结果统计,使用统计工具
|
||
- 支持回滚结果过滤,使用过滤工具
|
||
- 支持回滚结果搜索,使用搜索工具
|
||
- 支持回滚结果预览,使用预览工具
|
||
- 支持回滚结果确认,使用确认工具
|
||
- 支持回滚结果恢复,使用恢复工具
|
||
- 支持回滚结果合并,使用合并工具
|
||
- 使用@PreAuthorize注解控制访问权限
|
||
- 使用@PreAuthorize("@ss.hasPermi('metadata:version:rollback')")控制回滚权限
|
||
- 使用@Log注解记录操作日志
|
||
- 使用@Log(title = "版本回滚", businessType = BusinessType.OTHER)记录回滚日志
|
||
- **依赖关系**: 依赖于版本恢复
|
||
- **实现建议**: 使用上一个版本的文件进行回滚,使用事务确保回滚原子性,使用IVersionRollbackService服务接口和VersionRollbackServiceImpl实现类,使用IMetadataVersionService服务接口获取版本信息,使用IMetadataDeployService服务接口部署回滚的文件,使用@Async注解标记异步方法,使用CompletableFuture.supplyAsync()实现异步回滚,使用Future对象跟踪异步任务状态
|
||
|
||
## 约束
|
||
|
||
- **技术栈限制**: 必须基于现有的Spring Boot 3 + Vue 3技术栈
|
||
- **架构约束**: 必须遵循Authentication.canvas中定义的架构和调用关系
|
||
- **模块约束**: 必须在datai-salesforce-metadata模块下实现
|
||
- **数据库约束**: 必须使用MyBatis Plus作为持久层框架
|
||
- **性能约束**: 版本对比和恢复性能必须满足要求
|
||
- **依赖约束**: 必须依赖于REQ-010-1, REQ-010-2, REQ-010-7, REQ-010-11
|
||
- **实体类约束**: 必须使用DataiMetaComponentVersion实体类记录版本信息
|
||
- **Mapper约束**: 必须使用DataiMetaComponentVersionMapper进行数据库操作
|
||
- **服务接口约束**: 必须使用IDataiMetaComponentVersionService服务接口和DataiMetaComponentVersionServiceImpl实现类
|
||
- **控制器约束**: 必须使用DataiMetaComponentVersionController控制器提供RESTful API接口
|
||
- **DTO约束**: 必须使用DataiMetaComponentVersionDto接收请求参数
|
||
- **VO约束**: 必须使用DataiMetaComponentVersionVo返回响应数据
|
||
- **版本对比服务约束**: 必须使用IVersionComparisonService服务接口和VersionComparisonServiceImpl实现类
|
||
- **版本恢复服务约束**: 必须使用IVersionRecoveryService服务接口和VersionRecoveryServiceImpl实现类
|
||
- **版本回滚服务约束**: 必须使用IVersionRollbackService服务接口和VersionRollbackServiceImpl实现类
|
||
- **元数据版本服务约束**: 必须使用IMetadataVersionService服务接口获取版本信息
|
||
- **元数据部署服务约束**: 必须使用IMetadataDeployService服务接口部署恢复和回滚的文件
|
||
- **异步注解约束**: 必须使用Spring的@Async注解标记异步方法
|
||
- **线程池约束**: 必须复用现有的AsyncConfig配置类和线程池
|
||
- **Future对象约束**: 必须使用Future对象跟踪异步任务状态
|
||
- **CompletableFuture约束**: 必须使用CompletableFuture.supplyAsync()实现异步计算
|
||
- **ConcurrentHashMap约束**: 必须使用ConcurrentHashMap缓存异步任务Future对象和对比结果
|
||
- **事务注解约束**: 必须使用@Transactional注解确保恢复和回滚原子性
|
||
- **Diff算法约束**: 必须使用Google Diff Match Patch库实现Diff算法
|
||
- **DiffMatchPatch约束**: 必须使用DiffMatchPatch.diffMain()方法对比文件内容
|
||
- **DiffMatchPatch清理约束**: 必须使用DiffMatchPatch.diffCleanupSemantic()方法清理差异
|
||
- **String.equals()约束**: 必须使用String.equals()方法对比哈希值
|
||
- **Map存储约束**: 必须使用Map<String, Object>存储对比结果
|
||
- **HashMap约束**: 必须使用HashMap存储对比结果
|
||
- **LinkedList约束**: 必须使用LinkedList<DiffMatchPatch.Diff>存储差异列表
|
||
- **DiffMatchPatch.Diff.Operation约束**: 必须使用DiffMatchPatch.Diff.Operation枚举定义差异类型(INSERT、DELETE、EQUAL)
|
||
- **DiffMatchPatch.Diff.text约束**: 必须使用DiffMatchPatch.Diff.text字段存储差异文本
|
||
- **DiffMatchPatch.Diff.operation约束**: 必须使用DiffMatchPatch.Diff.operation字段存储差异操作
|
||
- **diffs.size()约束**: 必须使用diffs.size()判断是否有变化
|
||
- **hasChanges约束**: 必须使用hasChanges字段标记是否有变化
|
||
- **version1约束**: 必须使用version1字段存储版本1信息
|
||
- **version2约束**: 必须使用version2字段存储版本2信息
|
||
- **contentDiff约束**: 必须使用contentDiff字段存储内容差异
|
||
- **hashDiff约束**: 必须使用hashDiff字段存储哈希差异
|
||
- **hash1约束**: 必须使用hash1字段存储哈希值1
|
||
- **hash2约束**: 必须使用hash2字段存储哈希值2
|
||
- **isEqual约束**: 必须使用isEqual字段标记哈希值是否相等
|
||
- **diffs约束**: 必须使用diffs字段存储差异列表
|
||
- **QueryWrapper约束**: 必须使用QueryWrapper实现条件查询
|
||
- **Page约束**: 必须使用Page实现分页查询
|
||
- **selectById()约束**: 必须使用selectById()方法查询单个版本
|
||
- **selectList()约束**: 必须使用selectList()方法查询版本列表
|
||
- **insert()约束**: 必须使用insert()方法插入版本记录
|
||
- **update()约束**: 必须使用update()方法更新版本记录
|
||
- **deleteById()约束**: 必须使用deleteById()方法删除版本记录
|
||
- **deleteBatchIds()约束**: 必须使用deleteBatchIds()方法批量删除版本记录
|
||
- **LocalDateTime.now()约束**: 必须使用LocalDateTime.now()记录版本时间
|
||
- **versionNumber约束**: 必须使用versionNumber字段记录版本号
|
||
- **contentHash约束**: 必须使用contentHash字段记录内容哈希值
|
||
- **contentBody约束**: 必须使用contentBody字段记录代码内容
|
||
- **isBinary约束**: 必须使用isBinary字段标记是否为二进制文件
|
||
- **commitMessage约束**: 必须使用commitMessage字段记录提交信息
|
||
- **jobExecutionId约束**: 必须使用jobExecutionId字段关联作业执行记录
|
||
- **componentId约束**: 必须使用componentId字段关联组件信息
|
||
- **@PreAuthorize约束**: 必须使用@PreAuthorize注解控制访问权限
|
||
- **@Log约束**: 必须使用@Log注解记录操作日志
|
||
- **ExcelUtil约束**: 必须使用ExcelUtil导出版本列表到Excel
|
||
- **@Excel约束**: 必须使用@Excel注解标记需要导出的字段
|
||
- **@Schema约束**: 必须使用@Schema注解标记Swagger文档字段
|
||
- **@Tag约束**: 必须使用@Tag注解标记控制器标签
|
||
- **@Operation约束**: 必须使用@Operation注解标记接口说明
|
||
- **Stream API约束**: 必须使用Stream API进行数据转换
|
||
- **Collectors.toList()约束**: 必须使用Collectors.toList()收集结果
|
||
- **PageUtils.getTotal()约束**: 必须使用PageUtils.getTotal()获取总记录数
|
||
- **getDataTableByPage()约束**: 必须使用getDataTableByPage()返回分页数据
|
||
- **success()约束**: 必须使用success()方法返回成功响应
|
||
- **toAjax()约束**: 必须使用toAjax()方法返回操作结果
|
||
- **startPage()约束**: 必须使用startPage()方法开始分页
|
||
- **@Autowired约束**: 必须使用@Autowired注解注入服务
|
||
- **@Service约束**: 必须使用@Service注解标记服务类
|
||
- **@Override约束**: 必须使用@Override注解重写方法
|
||
- **compareVersions()约束**: 必须使用compareVersions()方法对比版本
|
||
- **compareFileContent()约束**: 必须使用compareFileContent()方法对比文件内容
|
||
- **compareFileHash()约束**: 必须使用compareFileHash()方法对比文件哈希
|
||
- **getVersion()约束**: 必须使用getVersion()方法获取版本信息
|
||
- **recoverVersion()约束**: 必须使用recoverVersion()方法恢复版本
|
||
- **recoverVersionAsync()约束**: 必须使用recoverVersionAsync()方法异步恢复版本
|
||
- **rollbackToPreviousVersion()约束**: 必须使用rollbackToPreviousVersion()方法回滚到上一个版本
|
||
- **rollbackToPreviousVersionAsync()约束**: 必须使用rollbackToPreviousVersionAsync()方法异步回滚到上一个版本
|
||
- **deploy()约束**: 必须使用deploy()方法部署恢复和回滚的文件
|
||
- **getVersionsByFilePath()约束**: 必须使用getVersionsByFilePath()方法按文件路径查询版本
|
||
- **getLatestVersion()约束**: 必须使用getLatestVersion()方法查询最新版本
|
||
- **RuntimeException约束**: 必须使用RuntimeException包装异常
|
||
- **try-catch约束**: 必须使用try-catch处理异常
|
||
- **@Slf4j约束**: 必须使用@Slf4j注解记录日志
|
||
- **String.hashCode()约束**: 必须使用String.hashCode()计算哈希值
|
||
- **MessageDigest约束**: 必须使用MessageDigest.getInstance("SHA-256")计算SHA-256哈希
|
||
- **DigestUtils.md5Hex()约束**: 必须使用DigestUtils.md5Hex()计算MD5哈希
|
||
- **Base64约束**: 必须使用Base64编码处理二进制文件
|
||
- **StringUtils约束**: 必须使用StringUtils工具类处理字符串
|
||
- **Future.cancel()约束**: 必须使用Future.cancel()取消异步任务
|
||
- **重试机制约束**: 必须使用重试机制处理恢复和回滚失败
|
||
- **异常处理约束**: 必须使用异常处理机制处理恢复和回滚异常
|
||
- **事务约束**: 必须使用事务确保恢复和回滚原子性
|
||
- **备份机制约束**: 必须使用备份机制备份当前版本
|
||
- **验证机制约束**: 必须使用验证机制验证恢复和回滚结果
|
||
- **日志机制约束**: 必须使用日志机制记录恢复和回滚过程
|
||
- **缓存机制约束**: 必须使用缓存机制缓存恢复和回滚结果
|
||
- **导出工具约束**: 必须使用导出工具导出恢复和回滚结果
|
||
- **可视化工具约束**: 必须使用可视化工具可视化恢复和回滚结果
|
||
- **统计工具约束**: 必须使用统计工具统计恢复和回滚结果
|
||
- **过滤工具约束**: 必须使用过滤工具过滤恢复和回滚结果
|
||
- **搜索工具约束**: 必须使用搜索工具搜索恢复和回滚结果
|
||
- **预览工具约束**: 必须使用预览工具预览恢复和回滚结果
|
||
- **确认工具约束**: 必须使用确认工具确认恢复和回滚结果
|
||
- **回滚工具约束**: 必须使用回滚工具回滚恢复结果
|
||
- **合并工具约束**: 必须使用合并工具合并恢复和回滚结果
|
||
- **恢复工具约束**: 必须使用恢复工具恢复回滚结果
|
||
- **性能约束**: 版本记录响应时间 < 1s,版本记录10000条记录无性能下降,对比响应时间 < 1s(对比1000行代码),批量对比1000个文件无性能下降,恢复响应时间 < 5s(恢复100个文件),批量恢复1000个文件无性能下降,回滚响应时间 < 5s(回滚100个文件),批量回滚1000个文件无性能下降
|
||
- **并发控制约束**: 必须支持并发对比、恢复、回滚,使用线程安全的数据结构
|
||
- **异步执行约束**: 必须支持异步对比、恢复、回滚,使用CompletableFuture
|
||
- **进度查询约束**: 必须支持恢复、回滚进度查询,使用Future对象
|
||
- **取消功能约束**: 必须支持恢复、回滚取消,使用Future.cancel()
|
||
- **重试机制约束**: 必须支持恢复、回滚重试,使用重试机制
|
||
- **失败处理约束**: 必须支持恢复、回滚失败处理,使用异常处理
|
||
- **缓存机制约束**: 必须支持恢复、回滚结果缓存,使用缓存机制
|
||
- **导出工具约束**: 必须支持恢复、回滚结果导出,使用导出工具
|
||
- **可视化工具约束**: 必须支持恢复、回滚结果可视化,使用可视化工具
|
||
- **统计工具约束**: 必须支持恢复、回滚结果统计,使用统计工具
|
||
- **过滤工具约束**: 必须支持恢复、回滚结果过滤,使用过滤工具
|
||
- **搜索工具约束**: 必须支持恢复、回滚结果搜索,使用搜索工具
|
||
- **预览工具约束**: 必须支持恢复、回滚结果预览,使用预览工具
|
||
- **确认工具约束**: 必须支持恢复、回滚结果确认,使用确认工具
|
||
- **回滚工具约束**: 必须支持恢复结果回滚,使用回滚工具
|
||
- **合并工具约束**: 必须支持恢复、回滚结果合并,使用合并工具
|
||
- **恢复工具约束**: 必须支持回滚结果恢复,使用恢复工具
|
||
- **准确率约束**: 对比准确率 > 99.9%,恢复结果准确率 > 99.9%,回滚结果准确率 > 99.9%
|
||
- **成功率约束**: 恢复成功率 > 99%,回滚成功率 > 99%,恢复失败重试成功率 > 95%,回滚失败重试成功率 > 95%
|
||
- **日志记录率约束**: 恢复日志记录率 > 99%,回滚日志记录率 > 99%
|
||
- **缓存命中率约束**: 对比结果缓存命中率 > 90%,恢复结果缓存命中率 > 90%,回滚结果缓存命中率 > 90%
|
||
- **导出响应时间约束**: 对比结果导出响应时间 < 2s,恢复结果导出响应时间 < 2s,回滚结果导出响应时间 < 2s
|
||
- **可视化响应时间约束**: 对比结果可视化响应时间 < 1s,恢复结果可视化响应时间 < 1s,回滚结果可视化响应时间 < 1s
|
||
- **统计响应时间约束**: 对比差异统计响应时间 < 1s,恢复结果统计响应时间 < 1s,回滚结果统计响应时间 < 1s
|
||
- **过滤响应时间约束**: 对比差异过滤响应时间 < 500ms,恢复结果过滤响应时间 < 500ms,回滚结果过滤响应时间 < 500ms
|
||
- **搜索响应时间约束**: 对比差异搜索响应时间 < 500ms,恢复结果搜索响应时间 < 500ms,回滚结果搜索响应时间 < 500ms
|
||
- **预览响应时间约束**: 恢复结果预览响应时间 < 1s,回滚结果预览响应时间 < 1s
|
||
- **进度查询响应时间约束**: 恢复进度查询响应时间 < 1s,回滚进度查询响应时间 < 1s
|
||
- **取消响应时间约束**: 恢复取消响应时间 < 1s,回滚取消响应时间 < 1s
|
||
- **复用逻辑约束**: 必须复用现有的IFileStorageService、IMetadataRetrieveService、IMetadataDeployService服务接口
|
||
|
||
## Rule Set
|
||
|
||
"请严格参考 @Authentication.canvas 中的状态机转移逻辑,不要自行发挥。"
|
||
|
||
**具体规则**:
|
||
- 必须使用Canvas中定义的类名和方法名
|
||
- 必须遵循Canvas中定义的调用关系
|
||
- 必须参考Canvas中的流程图逻辑
|
||
|
||
## 验收标准
|
||
|
||
- **功能完整性**: 所有版本回溯功能能够正常工作
|
||
- **性能指标**: 版本对比和恢复性能满足要求
|
||
- **安全性**: 恢复和回滚操作安全可靠,有完整的日志记录
|
||
- **代码规范性**: 代码符合项目编码规范,有清晰的注释
|
||
- **可维护性**: 代码结构清晰,易于扩展和维护
|
||
- **可测试性**: 代码易于单元测试和集成测试
|
||
|
||
## 风险
|
||
|
||
- **版本记录风险**: 版本记录不完整可能导致无法恢复
|
||
- **缓解措施**: 在每次拉取和部署时自动记录版本信息,确保版本记录完整,使用事务确保版本记录的原子性,使用日志记录版本记录过程,使用异常处理机制处理版本记录失败,使用重试机制处理版本记录失败
|
||
- **监控指标**: 版本记录成功率 > 99%,版本记录失败重试成功率 > 95%,版本记录响应时间 < 1s,版本记录10000条记录无性能下降,版本记录日志记录率 > 99%
|
||
- **对比风险**: 版本对比不准确可能导致误判
|
||
- **缓解措施**: 使用Diff算法和哈希值对比两种方式,确保对比准确,使用Google Diff Match Patch库实现Diff算法,使用SHA-256算法计算哈希值,使用日志记录对比过程,使用异常处理机制处理对比失败,使用缓存机制缓存对比结果
|
||
- **监控指标**: 对比准确率 > 99.9%,对比响应时间 < 1s(对比1000行代码),批量对比1000个文件无性能下降,对比结果缓存命中率 > 90%,对比日志记录率 > 99%
|
||
- **恢复风险**: 恢复操作失败可能导致数据不一致
|
||
- **缓解措施**: 使用事务确保恢复原子性,恢复前备份当前版本,恢复后验证恢复结果,使用日志记录恢复过程,使用异常处理机制处理恢复失败,使用重试机制处理恢复失败,使用Future.cancel()取消异步恢复任务
|
||
- **监控指标**: 恢复成功率 > 99%,恢复失败重试成功率 > 95%,恢复响应时间 < 5s(恢复100个文件),批量恢复1000个文件无性能下降,恢复结果准确率 > 99.9%,恢复日志记录率 > 99%
|
||
- **回滚风险**: 回滚操作失败可能导致无法恢复
|
||
- **缓解措施**: 使用事务确保回滚原子性,回滚前备份当前版本,回滚后验证回滚结果,使用日志记录回滚过程,使用异常处理机制处理回滚失败,使用重试机制处理回滚失败,使用Future.cancel()取消异步回滚任务
|
||
- **监控指标**: 回滚成功率 > 99%,回滚失败重试成功率 > 95%,回滚响应时间 < 5s(回滚100个文件),批量回滚1000个文件无性能下降,回滚结果准确率 > 99.9%,回滚日志记录率 > 99%
|
||
- **存储空间风险**: 版本历史记录过多可能占用大量存储空间
|
||
- **缓解措施**: 定期清理过期的版本历史记录,限制版本历史记录的数量和保留天数,使用配置项控制版本历史记录的保留策略,使用日志记录清理过程,使用监控工具监控存储空间使用情况
|
||
- **监控指标**: 存储空间使用率 < 80%,版本历史记录清理成功率 > 99%,版本历史记录清理响应时间 < 1s,版本历史记录清理日志记录率 > 99%
|
||
- **异步执行风险**: 异步执行可能导致任务状态不一致
|
||
- **缓解措施**: 使用Future对象跟踪异步任务状态,使用ConcurrentHashMap缓存异步任务Future对象,使用Future.cancel()取消异步任务,使用日志记录异步任务执行过程,使用异常处理机制处理异步任务失败
|
||
- **监控指标**: 异步任务成功率 > 99%,异步任务取消成功率 > 99%,异步任务响应时间 < 5s,异步任务状态一致性 > 99.9%,异步任务日志记录率 > 99%
|
||
- **线程池风险**: 线程池配置不当可能导致性能问题
|
||
- **缓解措施**: 复用现有的AsyncConfig配置类和线程池,使用ThreadPoolTaskExecutor管理线程池,使用合理的线程池大小配置,使用线程池监控工具监控线程池状态,使用日志记录线程池使用情况
|
||
- **监控指标**: 线程池使用率 < 80%,线程池拒绝率 < 1%,线程池任务队列长度 < 100,线程池活跃线程数 < 核心线程数 * 2,线程池日志记录率 > 99%
|
||
- **并发控制风险**: 并发操作可能导致数据不一致
|
||
- **缓解措施**: 使用线程安全的数据结构(ConcurrentHashMap、HashSet),使用synchronized关键字同步关键代码块,使用Lock接口实现更灵活的锁机制,使用事务确保数据一致性,使用乐观锁和悲观锁机制
|
||
- **监控指标**: 并发操作成功率 > 99%,并发操作冲突率 < 1%,数据一致性 > 99.9%,并发操作日志记录率 > 99%
|
||
- **内存使用风险**: 大量版本记录可能导致内存溢出
|
||
- **缓解措施**: 使用分页查询避免一次性加载大量数据,使用缓存机制避免重复计算,使用内存监控工具监控内存使用情况,使用内存清理机制清理过期缓存,使用日志记录内存使用情况
|
||
- **监控指标**: 内存使用 < 1GB(加载10000条版本记录),内存使用增长率 < 10MB/s,内存溢出率 < 0.01%,内存清理成功率 > 99%,内存使用日志记录率 > 99%
|
||
- **网络传输风险**: 网络传输失败可能导致恢复和回滚失败
|
||
- **缓解措施**: 使用重试机制处理网络传输失败,使用超时机制避免长时间等待,使用日志记录网络传输过程,使用网络监控工具监控网络传输状态,使用断点续传机制支持大文件传输
|
||
- **监控指标**: 网络传输成功率 > 99%,网络传输响应时间 < 3s,网络传输失败重试成功率 > 95%,网络传输超时率 < 1%,网络传输日志记录率 > 99%
|
||
- **异常处理风险**: 异常处理不当可能导致系统崩溃
|
||
- **缓解措施**: 使用try-catch处理异常,使用RuntimeException包装异常,使用日志记录异常信息,使用异常监控工具监控异常情况,使用异常恢复机制处理异常恢复
|
||
- **监控指标**: 异常处理成功率 > 99%,异常恢复成功率 > 95%,异常日志记录率 > 99%,异常监控覆盖率 > 99%
|
||
- **日志记录风险**: 日志记录不完整可能导致问题排查困难
|
||
- **缓解措施**: 使用日志记录版本记录、对比、恢复、回滚过程,使用日志级别区分日志重要程度,使用日志格式规范日志内容,使用日志监控工具监控日志情况,使用日志归档机制管理日志文件
|
||
- **监控指标**: 日志记录率 > 99%,日志格式规范性 > 99%,日志归档成功率 > 99%,日志查询响应时间 < 1s,日志监控覆盖率 > 99%
|
||
- **事务管理风险**: 事务管理不当可能导致数据不一致
|
||
- **缓解措施**: 使用@Transactional注解管理事务,使用事务传播机制控制事务传播行为,使用事务隔离级别控制事务隔离程度,使用事务回滚机制处理事务失败,使用事务监控工具监控事务状态
|
||
- **监控指标**: 事务成功率 > 99%,事务回滚率 < 1%,事务隔离级别正确率 > 99%,事务传播行为正确率 > 99%,事务日志记录率 > 99%
|
||
- **缓存机制风险**: 缓存机制不当可能导致数据不一致
|
||
- **缓解措施**: 使用缓存机制避免重复计算,使用缓存失效机制更新缓存,使用缓存预热机制预热缓存,使用缓存监控工具监控缓存状态,使用缓存清理机制清理过期缓存
|
||
- **监控指标**: 缓存命中率 > 90%,缓存失效率 < 10%,缓存预热成功率 > 99%,缓存清理成功率 > 99%,缓存日志记录率 > 99%
|
||
- **性能监控风险**: 性能监控不到位可能导致性能问题未及时发现
|
||
- **缓解措施**: 使用性能测试工具监控性能,使用性能指标定义性能标准,使用性能报警机制报警性能问题,使用性能优化工具优化性能,使用性能分析工具分析性能瓶颈
|
||
- **监控指标**: 性能监控覆盖率 > 99%,性能报警准确率 > 95%,性能优化成功率 > 90%,性能分析准确率 > 95%,性能日志记录率 > 99%
|
||
- **兼容性风险**: 新增功能可能与现有功能不兼容
|
||
- **缓解措施**: 充分测试确保兼容性,使用集成测试验证兼容性,使用回归测试验证兼容性,使用兼容性测试工具测试兼容性,使用兼容性监控工具监控兼容性情况
|
||
- **监控指标**: 兼容性测试覆盖率 > 99%,兼容性测试通过率 > 99%,兼容性问题发现率 > 95%,兼容性问题修复率 > 95%,兼容性日志记录率 > 99%
|
||
- **可维护性风险**: 代码结构不清晰可能导致维护困难
|
||
- **缓解措施**: 使用清晰的代码结构,使用规范的命名规范,使用详细的注释说明,使用代码审查机制审查代码,使用代码重构工具重构代码
|
||
- **监控指标**: 代码规范性 > 95%,注释覆盖率 > 80%,代码审查通过率 > 95%,代码重构成功率 > 90%,代码质量评分 > 80
|
||
- **可测试性风险**: 代码不易测试可能导致测试覆盖率不足
|
||
- **缓解措施**: 使用单元测试验证功能,使用集成测试验证功能,使用测试覆盖率工具监控测试覆盖率,使用测试自动化工具自动化测试,使用测试报告工具生成测试报告
|
||
- **监控指标**: 单元测试覆盖率 > 80%,集成测试覆盖率 > 70%,测试自动化率 > 90%,测试报告生成率 > 99%,测试通过率 > 95%
|
||
|
||
## 需求变更记录
|
||
|
||
| 日期 | 变更内容 | 变更原因 | 变更人 | 审核人 | 状态 |
|
||
|------|---------|---------|--------|--------|------|
|
||
| 2026-01-17 | 创建需求文档 | 初始需求 | 系统管理员 | - | 待审核 |
|
||
| 2026-01-26 | 优化需求文档 | 基于当前项目实际情况优化需求文档,包括:1. 版本历史记录:添加了DataiMetaComponentVersion实体类、DataiMetaComponentVersionMapper、IDataiMetaComponentVersionService服务接口和DataiMetaComponentVersionServiceImpl实现类约束,添加了DataiMetaComponentVersionController控制器、DataiMetaComponentVersionDto、DataiMetaComponentVersionVo约束,添加了QueryWrapper、Page、selectById()、selectList()、insert()、update()、deleteById()、deleteBatchIds()等技术细节,添加了按文件路径、组件ID、元数据类型、组件全名、文件路径名、组织配置ID、最后一次拉取时间、最新版本ID、创建时间、更新时间、创建人、更新人、部门ID、作业执行ID、内容哈希值、版本号、是否为二进制文件、提交信息、备注查询版本约束,添加了@PreAuthorize、@Log、ExcelUtil、@Excel、@Schema、@Tag、@Operation注解约束,添加了版本列表导出、分页查询、排序、过滤、搜索、统计、缓存、实时更新约束,添加了性能指标和响应时间约束;2. 版本对比:添加了Google Diff Match Patch库、DiffMatchPatch.diffMain()、DiffMatchPatch.diffCleanupSemantic()、String.equals()等技术细节,添加了Map<String, Object>、HashMap、LinkedList<DiffMatchPatch.Diff>存储约束,添加了DiffMatchPatch.Diff.Operation枚举、DiffMatchPatch.Diff.text、DiffMatchPatch.Diff.operation字段约束,添加了IVersionComparisonService服务接口和VersionComparisonServiceImpl实现类约束,添加了compareVersions()、compareFileContent()、compareFileHash()方法约束,添加了对比两个版本的元数据文件、文件内容、文件哈希约束,添加了对比结果导出、缓存、实时更新、差异高亮显示、统计、过滤、搜索、导出、可视化、合并、回滚、预览、确认约束,添加了@Async、CompletableFuture、Future、ConcurrentHashMap、String.hashCode()、MessageDigest、DigestUtils.md5Hex()、Base64、StringUtils等技术细节,添加了性能指标和响应时间约束;3. 版本恢复:添加了IVersionRecoveryService服务接口和VersionRecoveryServiceImpl实现类约束,添加了IMetadataVersionService、IMetadataDeployService服务接口约束,添加了recoverVersion()、recoverVersionAsync()方法约束,添加了@Async、CompletableFuture、Future、ConcurrentHashMap等技术细节,添加了恢复到指定的历史版本、版本号、提交信息、作业执行ID、组件ID、元数据类型、组件全名、文件路径名、最后一次拉取时间、最新版本ID、创建时间、更新时间、创建人、更新人、部门ID、备注约束,添加了恢复前备份当前版本、恢复后验证恢复结果、恢复日志记录、恢复进度查询、恢复取消功能、恢复重试机制、恢复失败处理、恢复结果缓存、导出、可视化、统计、过滤、搜索、预览、确认、回滚、合并约束,添加了Future.cancel()、重试机制、异常处理、事务、备份、验证、日志、缓存、导出、可视化、统计、过滤、搜索、预览、确认、回滚、合并工具约束,添加了性能指标和响应时间约束;4. 版本回滚:添加了IVersionRollbackService服务接口和VersionRollbackServiceImpl实现类约束,添加了IMetadataVersionService、IMetadataDeployService服务接口约束,添加了rollbackToPreviousVersion()、rollbackToPreviousVersionAsync()方法约束,添加了@Async、CompletableFuture、Future、ConcurrentHashMap等技术细节,添加了回滚到上一个版本、指定的版本号、提交信息、作业执行ID、组件ID、元数据类型、组件全名、文件路径名、最后一次拉取时间、最新版本ID、创建时间、更新时间、创建人、更新人、部门ID、备注约束,添加了回滚前备份当前版本、回滚后验证回滚结果、回滚日志记录、回滚进度查询、回滚取消功能、回滚重试机制、回滚失败处理、回滚结果缓存、导出、可视化、统计、过滤、搜索、预览、确认、恢复、合并约束,添加了Future.cancel()、重试机制、异常处理、事务、备份、验证、日志、缓存、导出、可视化、统计、过滤、搜索、预览、确认、恢复、合并工具约束,添加了性能指标和响应时间约束;5. 约束条件:大幅增强了约束条件,添加了118个具体的约束项,包括实体类约束、Mapper约束、服务接口约束、控制器约束、DTO约束、VO约束、版本对比服务约束、版本恢复服务约束、版本回滚服务约束、元数据版本服务约束、元数据部署服务约束、异步注解约束、线程池约束、Future对象约束、CompletableFuture约束、ConcurrentHashMap约束、事务注解约束、Diff算法约束、DiffMatchPatch约束、DiffMatchPatch清理约束、String.equals()约束、Map存储约束、HashMap约束、LinkedList约束、DiffMatchPatch.Diff.Operation约束、DiffMatchPatch.Diff.text约束、DiffMatchPatch.Diff.operation约束、diffs.size()约束、hasChanges约束、version1约束、version2约束、contentDiff约束、hashDiff约束、hash1约束、hash2约束、isEqual约束、diffs约束、QueryWrapper约束、Page约束、selectById()约束、selectList()约束、insert()约束、update()约束、deleteById()约束、deleteBatchIds()约束、LocalDateTime.now()约束、versionNumber约束、contentHash约束、contentBody约束、isBinary约束、commitMessage约束、jobExecutionId约束、componentId约束、@PreAuthorize约束、@Log约束、ExcelUtil约束、@Excel约束、@Schema约束、@Tag约束、@Operation约束、Stream API约束、Collectors.toList()约束、PageUtils.getTotal()约束、getDataTableByPage()约束、success()约束、toAjax()约束、startPage()约束、@Autowired约束、@Service约束、@Override约束、compareVersions()约束、compareFileContent()约束、compareFileHash()约束、getVersion()约束、recoverVersion()约束、recoverVersionAsync()约束、rollbackToPreviousVersion()约束、rollbackToPreviousVersionAsync()约束、deploy()约束、getVersionsByFilePath()约束、getLatestVersion()约束、RuntimeException约束、try-catch约束、@Slf4j约束、String.hashCode()约束、MessageDigest约束、DigestUtils.md5Hex()约束、Base64约束、StringUtils约束、Future.cancel()约束、重试机制约束、异常处理约束、事务约束、备份机制约束、验证机制约束、日志机制约束、缓存机制约束、导出工具约束、可视化工具约束、统计工具约束、过滤工具约束、搜索工具约束、预览工具约束、确认工具约束、回滚工具约束、合并工具约束、恢复工具约束、性能约束、并发控制约束、异步执行约束、进度查询约束、取消功能约束、重试机制约束、失败处理约束、缓存机制约束、导出工具约束、可视化工具约束、统计工具约束、过滤工具约束、搜索工具约束、预览工具约束、确认工具约束、回滚工具约束、合并工具约束、恢复工具约束、准确率约束、成功率约束、日志记录率约束、缓存命中率约束、导出响应时间约束、可视化响应时间约束、统计响应时间约束、过滤响应时间约束、搜索响应时间约束、预览响应时间约束、进度查询响应时间约束、取消响应时间约束、复用逻辑约束;6. 风险评估:大幅增强了风险评估,为每个风险添加了详细的缓解措施和监控指标,包括版本记录风险、对比风险、恢复风险、回滚风险、存储空间风险、异步执行风险、线程池风险、并发控制风险、内存使用风险、网络传输风险、异常处理风险、日志记录风险、事务管理风险、缓存机制风险、性能监控风险、兼容性风险、可维护性风险、可测试性风险等18个风险项 | 系统管理员 | - | 待审核 |
|
||
|
||
## 相关人员
|
||
|
||
- **需求提出人**: 系统管理员 - 联系方式
|
||
- **需求负责人**: 系统管理员 - 联系方式
|
||
- **技术负责人**: 开发工程师 - 联系方式
|
||
- **测试负责人**: 测试工程师 - 联系方式
|
||
- **其他相关人员**: - 联系方式
|
||
|
||
## 评审信息
|
||
|
||
- **评审日期**: -
|
||
- **评审人员**: -
|
||
- **评审结果**: -
|
||
- **评审意见**: -
|
||
- **修改建议**: -
|