--- name: 0017-login-history-query-and-auto-login description: 查询不同类型ORG登录历史及自动登录功能 --- # 变更记录: 查询不同类型ORG登录历史及自动登录功能 ## 元数据 (Metadata) - **变更编号**: 0017 - **变更标题**: 查询不同类型ORG登录历史及自动登录功能 - **变更日期**: 2026-01-16 - **变更人**: SSOT Architect - **相关需求**: [REQ-007](../requirements/REQ-007.md) - **相关ADR**: [ADR-007](../decisions/adr/0007-login-history-query-and-auto-login.md) ## 变更概述 (Overview) 本次变更为 `DataISfLoginController` 添加了两个新接口,支持查询不同类型ORG的成功登录历史和根据登录历史自动登录到对应ORG。同时,在 `IDataiSfLoginHistoryService`、`DataiSfLoginHistoryServiceImpl` 和 `DataiSfLoginHistoryMapper` 中添加了相应的方法支持。 ## 变更详情 (Details) ### 1. 新增接口 #### 接口1: 查询不同类型ORG成功登录历史 **接口路径**: `GET /salesforce/login/history/success/{orgType}` **功能描述**: 查询指定类型的成功登录历史记录 **实现文件**: - [DataISfLoginController.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataISfLoginController.java) **关键代码**: ```java @Operation(summary = "查询不同类型ORG成功登录历史") @GetMapping("/history/success/{orgType}") public AjaxResult getSuccessLoginHistoryByOrgType(@PathVariable String orgType) { logger.info("接收到查询登录历史请求,ORG类型: {}", orgType); try { List 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 **实现文件**: - [DataISfLoginController.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataISfLoginController.java) **关键代码**: ```java @Operation(summary = "根据登录历史自动登录") @PostMapping("/autoLoginByHistory") public AjaxResult autoLoginByHistory(@RequestBody java.util.Map 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 接口 **实现文件**: - [IDataiSfLoginHistoryService.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/IDataiSfLoginHistoryService.java) **新增方法**: ```java public List selectSuccessLoginHistoryByOrgType(String orgType); ``` #### DataiSfLoginHistoryServiceImpl 实现类 **实现文件**: - [DataiSfLoginHistoryServiceImpl.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/impl/DataiSfLoginHistoryServiceImpl.java) **新增方法**: ```java @Override public List selectSuccessLoginHistoryByOrgType(String orgType) { return dataiSfLoginHistoryMapper.selectSuccessLoginHistoryByOrgType(orgType); } ``` ### 3. Mapper 层变更 #### DataiSfLoginHistoryMapper 接口 **实现文件**: - [DataiSfLoginHistoryMapper.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/mapper/DataiSfLoginHistoryMapper.java) **新增方法**: ```java public List selectSuccessLoginHistoryByOrgType(String orgType); ``` #### DataiSfLoginHistoryMapper.xml **实现文件**: - [DataiSfLoginHistoryMapper.xml](../../datai-salesforce-auth/src/main/resources/mapper/auth/DataiSfLoginHistoryMapper.xml) **新增SQL**: ```xml ``` ## 变更影响 (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自动登录 | 返回错误信息,提示历史记录不存在 | 待验证 | 待验证 | ### 测试方法 1. 单元测试:测试 Service 层新方法 2. 集成测试:测试 Controller 层新接口 3. 性能测试:测试接口响应时间 4. 安全测试:测试敏感信息加密 ## 部署建议 (Deployment) ### 部署前检查 - [ ] 确认所有代码变更已提交 - [ ] 确认所有测试用例已通过 - [ ] 确认数据库索引已创建(如果需要) - [ ] 确认 API 文档已更新 ### 部署步骤 1. 停止应用服务 2. 部署新的代码包 3. 启动应用服务 4. 验证新接口是否正常工作 5. 验证现有接口是否正常工作 ### 回滚策略 如果部署失败,可以: 1. 回退到之前的代码版本 2. 删除新增的两个接口 3. 删除 Service 层新增的方法 4. 删除 Mapper 层新增的方法 ## 后续优化 (Future Improvements) ### 性能优化 - 在 `org_type` 字段上添加索引以提高查询性能 - 考虑添加分页查询功能 - 考虑添加查询结果缓存 ### 功能优化 - 支持按时间范围查询登录历史 - 支持按登录状态查询登录历史 - 支持导出登录历史记录 ## 相关文档 (Related Documents) - [需求文档](../requirements/REQ-007.md) - [架构决策](../decisions/adr/0007-login-history-query-and-auto-login.md) - [提示词资产](../prompts/007-login-history-query-and-auto-login.md) - [会话记录](../sessions/20260116-login-history-query-and-auto-login.md) ## 变更历史 (Change History) | 日期 | 版本 | 变更内容 | 变更人 | |------|------|----------|--------| | 2026-01-16 | 1.0.0 | 初始版本 | SSOT Architect |