REQ-010-1 完成内容: - 创建 6 个数据库表设计(datai_meta_org_config、datai_meta_task、datai_meta_job_execution、datai_meta_component、datai_meta_deploy_history、datai_meta_job_log) - 设计了合理的索引策略 - 对敏感字段进行了加密存储设计 - 表名前缀统一为 datai_meta_ - 所有表包含标准基础字段 REQ-010-2 完成内容: - 补充用户故事和细化验收标准 - 创建架构决策记录(MyBatis Plus 注解 + XML 映射文件混合方案) - 对比了 3 种备选方案 - 分析了决策对系统架构、开发流程、运维管理的影响 - 识别了技术风险、业务风险和实施风险 - 定义了回滚策略和验收标准 文档更新: - 创建 0010-database-table-design.md 架构决策记录 - 创建 0011-entity-mapper-create.md 架构决策记录 - 创建 0020-database-table-design-create.md 变更记录 - 创建 20260117-database-table-design-create.md 会话记录 - 创建 20260117-database-table-design-create-retro.md 复盘报告 - 创建 011-database-table-design-create.md 提示词文档 - 更新 REQ-010-2.md 需求文档 - 更新 docs/index.md 和 CHANGELOG.md
8.3 KiB
8.3 KiB
| name | description |
|---|---|
| 0017-login-history-query-and-auto-login | 查询不同类型ORG登录历史及自动登录功能 |
变更记录: 查询不同类型ORG登录历史及自动登录功能
元数据 (Metadata)
- 变更编号: 0017
- 变更标题: 查询不同类型ORG登录历史及自动登录功能
- 变更日期: 2026-01-16
- 变更人: SSOT Architect
- 相关需求: REQ-007
- 相关ADR: ADR-007
变更概述 (Overview)
本次变更为 DataISfLoginController 添加了两个新接口,支持查询不同类型ORG的成功登录历史和根据登录历史自动登录到对应ORG。同时,在 IDataiSfLoginHistoryService、DataiSfLoginHistoryServiceImpl 和 DataiSfLoginHistoryMapper 中添加了相应的方法支持。
变更详情 (Details)
1. 新增接口
接口1: 查询不同类型ORG成功登录历史
接口路径: GET /salesforce/login/history/success/{orgType}
功能描述: 查询指定类型的成功登录历史记录
实现文件:
关键代码:
@Operation(summary = "查询不同类型ORG成功登录历史")
@GetMapping("/history/success/{orgType}")
public AjaxResult getSuccessLoginHistoryByOrgType(@PathVariable String orgType) {
logger.info("接收到查询登录历史请求,ORG类型: {}", orgType);
try {
List<DataiSfLoginHistory> historyList = loginHistoryService.selectSuccessLoginHistoryByOrgType(orgType);
return AjaxResult.success("查询成功", historyList);
} catch (Exception e) {
logger.error("查询登录历史请求处理失败: {}", e.getMessage(), e);
return AjaxResult.error("查询失败: " + e.getMessage());
}
}
接口2: 根据登录历史自动登录
接口路径: POST /salesforce/login/autoLoginByHistory
功能描述: 根据指定的登录历史记录自动登录到对应ORG
实现文件:
关键代码:
@Operation(summary = "根据登录历史自动登录")
@PostMapping("/autoLoginByHistory")
public AjaxResult autoLoginByHistory(@RequestBody java.util.Map<String, Long> request) {
Long historyId = request.get("historyId");
logger.info("接收到根据历史自动登录请求,历史ID: {}", historyId);
try {
DataiSfLoginHistory loginHistory = loginHistoryService.selectDataiSfLoginHistoryById(historyId);
if (loginHistory == null) {
logger.warn("未找到ID为 {} 的登录历史记录", historyId);
return AjaxResult.error("未找到登录历史记录");
}
SalesforceLoginResult result = salesforceLoginService.autoLogin(historyId);
if (result.isSuccess()) {
logger.info("自动登录成功,用户ID: {}, 组织ID: {}, ORG类型: {}",
result.getUserId(), result.getOrganizationId(), result.getOrgType());
return AjaxResult.success("自动登录成功", result);
} else {
logger.warn("自动登录失败,错误码: {}, 错误信息: {}",
result.getErrorCode(), result.getErrorMessage());
return AjaxResult.error(result.getErrorCode(), result.getErrorMessage());
}
} catch (Exception e) {
logger.error("自动登录请求处理失败: {}", e.getMessage(), e);
return AjaxResult.error("自动登录失败: " + e.getMessage());
}
}
2. Service 层变更
IDataiSfLoginHistoryService 接口
实现文件:
新增方法:
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType);
DataiSfLoginHistoryServiceImpl 实现类
实现文件:
新增方法:
@Override
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType)
{
return dataiSfLoginHistoryMapper.selectSuccessLoginHistoryByOrgType(orgType);
}
3. Mapper 层变更
DataiSfLoginHistoryMapper 接口
实现文件:
新增方法:
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType);
DataiSfLoginHistoryMapper.xml
实现文件:
新增SQL:
<select id="selectSuccessLoginHistoryByOrgType" parameterType="String" resultMap="DataiSfLoginHistoryResult">
<include refid="selectDataiSfLoginHistoryVo"/>
where dslh.login_status = 'success' and dslh.org_type = #{orgType}
order by dslh.create_time desc
</select>
变更影响 (Impact)
影响范围
- Controller 层: DataISfLoginController
- Service 层: IDataiSfLoginHistoryService, DataiSfLoginHistoryServiceImpl
- Mapper 层: DataiSfLoginHistoryMapper, DataiSfLoginHistoryMapper.xml
兼容性
- ✅ 向后兼容:不修改现有接口,只新增接口
- ✅ 不影响现有功能:现有登录、登出、自动登录功能不受影响
性能影响
- 查询登录历史接口:性能影响较小,建议在
org_type字段上添加索引 - 自动登录接口:性能影响较小,与现有自动登录接口性能一致
测试验证 (Testing)
测试用例
| 用例编号 | 用例描述 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|---|
| TC-001 | 查询Source类型的登录历史 | 返回所有Source类型的成功登录记录 | 待验证 | 待验证 |
| TC-002 | 查询Target类型的登录历史 | 返回所有Target类型的成功登录记录 | 待验证 | 待验证 |
| TC-003 | 查询Sandbox类型的登录历史 | 返回所有Sandbox类型的成功登录记录 | 待验证 | 待验证 |
| TC-004 | 查询不存在的ORG类型 | 返回空列表或提示无记录 | 待验证 | 待验证 |
| TC-005 | 根据历史ID自动登录到Source ORG | 使用历史记录中的凭证成功登录到Source ORG | 待验证 | 待验证 |
| TC-006 | 根据历史ID自动登录到Target ORG | 使用历史记录中的凭证成功登录到Target ORG | 待验证 | 待验证 |
| TC-007 | 根据不存在的历史ID自动登录 | 返回错误信息,提示历史记录不存在 | 待验证 | 待验证 |
测试方法
- 单元测试:测试 Service 层新方法
- 集成测试:测试 Controller 层新接口
- 性能测试:测试接口响应时间
- 安全测试:测试敏感信息加密
部署建议 (Deployment)
部署前检查
- 确认所有代码变更已提交
- 确认所有测试用例已通过
- 确认数据库索引已创建(如果需要)
- 确认 API 文档已更新
部署步骤
- 停止应用服务
- 部署新的代码包
- 启动应用服务
- 验证新接口是否正常工作
- 验证现有接口是否正常工作
回滚策略
如果部署失败,可以:
- 回退到之前的代码版本
- 删除新增的两个接口
- 删除 Service 层新增的方法
- 删除 Mapper 层新增的方法
后续优化 (Future Improvements)
性能优化
- 在
org_type字段上添加索引以提高查询性能 - 考虑添加分页查询功能
- 考虑添加查询结果缓存
功能优化
- 支持按时间范围查询登录历史
- 支持按登录状态查询登录历史
- 支持导出登录历史记录
相关文档 (Related Documents)
变更历史 (Change History)
| 日期 | 版本 | 变更内容 | 变更人 |
|---|---|---|---|
| 2026-01-16 | 1.0.0 | 初始版本 | SSOT Architect |