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

8.3 KiB
Raw Blame History

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。同时IDataiSfLoginHistoryServiceDataiSfLoginHistoryServiceImplDataiSfLoginHistoryMapper 中添加了相应的方法支持。

变更详情 (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自动登录 返回错误信息,提示历史记录不存在 待验证 待验证

测试方法

  1. 单元测试:测试 Service 层新方法
  2. 集成测试:测试 Controller 层新接口
  3. 性能测试:测试接口响应时间
  4. 安全测试:测试敏感信息加密

部署建议 (Deployment)

部署前检查

  • 确认所有代码变更已提交
  • 确认所有测试用例已通过
  • 确认数据库索引已创建(如果需要)
  • 确认 API 文档已更新

部署步骤

  1. 停止应用服务
  2. 部署新的代码包
  3. 启动应用服务
  4. 验证新接口是否正常工作
  5. 验证现有接口是否正常工作

回滚策略

如果部署失败,可以:

  1. 回退到之前的代码版本
  2. 删除新增的两个接口
  3. 删除 Service 层新增的方法
  4. 删除 Mapper 层新增的方法

后续优化 (Future Improvements)

性能优化

  • org_type 字段上添加索引以提高查询性能
  • 考虑添加分页查询功能
  • 考虑添加查询结果缓存

功能优化

  • 支持按时间范围查询登录历史
  • 支持按登录状态查询登录历史
  • 支持导出登录历史记录

变更历史 (Change History)

日期 版本 变更内容 变更人
2026-01-16 1.0.0 初始版本 SSOT Architect