datai/datai-scenes/datai-scene-salesforce/docs/changelog/0017-login-history-query-and-auto-login.md
Kris 469c78cf29 feat: REQ-010-1 完成数据库表结构设计和创建,REQ-010-2 完成基础实体类和Mapper创建需求定义和架构决策
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
2026-01-18 19:44:13 +08:00

226 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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<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
**实现文件**:
- [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<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 接口
**实现文件**:
- [IDataiSfLoginHistoryService.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/IDataiSfLoginHistoryService.java)
**新增方法**:
```java
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType);
```
#### DataiSfLoginHistoryServiceImpl 实现类
**实现文件**:
- [DataiSfLoginHistoryServiceImpl.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/impl/DataiSfLoginHistoryServiceImpl.java)
**新增方法**:
```java
@Override
public List<DataiSfLoginHistory> 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<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType);
```
#### DataiSfLoginHistoryMapper.xml
**实现文件**:
- [DataiSfLoginHistoryMapper.xml](../../datai-salesforce-auth/src/main/resources/mapper/auth/DataiSfLoginHistoryMapper.xml)
**新增SQL**:
```xml
<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自动登录 | 返回错误信息,提示历史记录不存在 | 待验证 | 待验证 |
### 测试方法
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 |