datai/datai-scenes/datai-scene-salesforce/docs/sessions/2026-02-06-003-04-session.md

10 KiB
Raw Permalink Blame History

会话记录003-04 异步操作

元数据

  • 需求编号: 003-04
  • 需求名称: 异步操作
  • 会话开始时间: 2026-02-06
  • 会话结束时间: 2026-02-06
  • 当前阶段: 阶段 9闭环复盘和接口文档
  • 状态: 已完成

需求描述

实现 Metadata API 异步操作管理模块,包括:

  • 异步操作状态查询checkStatus
  • 服务端同步轮询poll
  • 异步操作取消cancel
  • 操作历史记录

本需求是 003Metadata API 管理模块的重要组成部分为部署操作003-03和其他异步操作提供状态管理能力。


执行阶段

阶段 1需求定义与入库

  • 状态: 已完成(前置阶段)
  • 生成文档: 需求文档
  • 关键决策:
    • 确定需求范围:异步操作状态查询、轮询、取消、历史记录
    • 确定轮询策略:由 ADR-003-04 决策(服务端同步轮询)
    • 确定权限模型:查询权限和取消权限分离

阶段 2方案设计

  • 状态: 已完成(前置阶段)
  • 生成文档: 设计文档
  • 关键决策:
    • 复用现有的 datai_metadata_async 表结构
    • Service 层设计 5 个核心方法
    • Controller 提供 5 个 REST API 接口
    • 使用 VO 类封装响应数据

阶段 3方案决策

  • 状态: 已完成(前置阶段)
  • 生成文档: 决策记录
  • 关键决策:
    • 选择服务端同步轮询:简单可靠,实现成本低,简化上层业务代码
    • 拒绝客户端轮询:增加前端复杂度,需要处理网络异常和超时
    • 拒绝 WebSocket实现复杂度高Salesforce 不支持
    • 轮询参数:默认间隔 5 秒,超时 5 分钟

阶段 4数据库结构生成

  • 状态: 跳过(复用现有表)
  • 说明: 复用已有的 datai_metadata_async 表,无需新建表

阶段 5提示词生成

阶段 6执行代码生成

  • 状态: 已完成
  • 生成代码文件:

1. Service 接口

  • 文件: IMetadataAsyncService.java
  • 路径: com.datai.metadata.service
  • 方法:
    • getAsyncResult(String asyncId): 获取异步操作结果
    • pollAsyncResult(String asyncId, long interval, long timeout): 轮询异步操作状态
    • cancelAsyncResult(String asyncId): 取消异步操作
    • getAsyncHistory(int limit): 获取异步操作历史
    • selectByAsyncId(String asyncId): 根据 asyncId 查询记录

2. Service 实现

  • 文件: MetadataAsyncServiceImpl.java
  • 路径: com.datai.metadata.service.impl
  • 核心功能:
    • 调用 Salesforce Metadata API 查询异步状态
    • 服务端同步轮询策略(根据 ADR-003-04
    • 数据库持久化操作记录
    • 异常转换和处理

3. Controller

  • 文件: MetadataAsyncController.java
  • 路径: com.datai.metadata.controller
  • API 接口:
    • GET /salesforce/metadata/async/status/{asyncId}: 获取异步操作状态
    • GET /salesforce/metadata/async/poll/{asyncId}: 同步轮询
    • POST /salesforce/metadata/async/cancel/{asyncId}: 取消异步操作
    • GET /salesforce/metadata/async/history: 获取历史记录
    • GET /salesforce/metadata/async/record/{asyncId}: 查询本地记录

4. VO 类

  • 文件: AsyncResultVo.java

  • 路径: com.datai.metadata.model.vo

  • 字段: id, done, message, state, checkTime

  • 文件: CancelResultVo.java

  • 路径: com.datai.metadata.model.vo

  • 字段: asyncId, success, cancelTime, message

5. Mapper 扩展

  • 文件: DataiMetadataAsyncMapper.java
  • 新增方法:
    • selectByAsyncId(String asyncId): 根据 asyncId 查询
    • selectRecentAsyncHistory(int limit): 查询最近历史

阶段 7记录当前会话

  • 状态: 已完成
  • 生成文档: 会话记录
  • 关键决策: 完整记录会话过程,包括对话记录、生成的文档和代码

阶段 8变更记录与归档

  • 状态: 已完成
  • 生成文档: 变更日志
  • 关键决策:
    • 创建详细的变更日志,包含新增功能、接口、代码文件、影响范围
    • 更新根目录 CHANGELOG.md
    • 更新索引和需求文档
  • 变更内容:
    • 新增 5 个 REST API 接口
    • 新增 5 个代码文件2 个 VO + 1 个 Service 接口 + 1 个 Service 实现 + 1 个 Controller
    • 修改 1 个文件DataiMetadataAsyncMapper.java
    • 新增 2 个权限点

对话记录

2026-02-06 会话开始

用户: 进入阶段 6代码生成

AI: 好的,进入阶段 6代码生成。我将根据设计文档和决策记录生成 003-04 异步操作功能的代码。

AI: 首先让我检查现有的代码结构和相关文件...

AI: 我注意到项目中已经存在一些异步操作相关的代码。让我检查现有的实现,然后根据设计文档进行完善。

AI: 我看到已经存在基础的异步操作日志管理代码,但缺少与 Salesforce Metadata API 交互的核心功能。让我查看现有的 VO 和 DTO 类,然后根据设计文档创建缺失的 Service 接口和实现。

AI: 现在让我创建任务列表,然后按照设计文档实现缺失的核心功能。

代码生成过程

AI: 现在创建 MetadataAsyncService 接口和实现...

AI: 现在创建 AsyncResultVo 和 CancelResultVo...

AI: 现在创建 MetadataAsyncServiceImpl 实现类...

AI: 现在需要检查 Mapper 中是否有需要的方法...

AI: 我需要在 Mapper 中添加两个新方法。让我更新 Mapper 接口...

AI: 现在创建 MetadataAsyncController 控制器...

会话结束确认

AI: ## 003-04 异步操作 - 代码生成阶段已完成!

AI: ### 已生成的代码文件 ...

AI: 代码生成是否完整?是否进入下一阶段(阶段 7会话记录归档

用户: 进入下一阶段(阶段 7会话记录归档

AI: 好的,我将按照阶段 7 的技能书执行会话记录归档...


关键决策引用

ADR-003-04: 异步操作轮询策略

  • 决策: 使用服务端同步轮询 (Server-side Synchronous Polling)
  • 理由:
    1. 简单可靠,实现成本低
    2. 简化上层业务代码
    3. 服务端统一控制超时和重试
  • 实现: MetadataAsyncServiceImpl.pollAsyncResult()

技术实现要点

1. 服务端同步轮询

public AsyncResultVo pollAsyncResult(String asyncId, long interval, long timeout) {
    long startTime = System.currentTimeMillis();
    while (true) {
        AsyncResultVo result = getAsyncResult(asyncId);
        if (result.isDone()) {
            return result;
        }
        if (System.currentTimeMillis() - startTime > timeout) {
            throw new SalesforceOperationException("异步操作轮询超时");
        }
        Thread.sleep(interval);
    }
}

2. 异常转换规则

  • InvalidSessionId / Session expiredSalesforceAuthException
  • UnauthorizedSalesforceAuthException
  • InvalidAsyncIdSalesforceOperationException
  • 其他 → SalesforceOperationException

3. 数据库持久化

  • 每次状态查询都记录到 datai_metadata_async
  • 支持插入新记录或更新现有记录
  • 记录创建人和更新人

权限配置

接口 权限
GET /status/{asyncId} salesforce:metadata:async:query
GET /poll/{asyncId} salesforce:metadata:async:query
POST /cancel/{asyncId} salesforce:metadata:async:cancel
GET /history salesforce:metadata:async:query
GET /record/{asyncId} salesforce:metadata:async:query

代码统计

  • 新增文件: 5 个

    • IMetadataAsyncService.java
    • MetadataAsyncServiceImpl.java
    • MetadataAsyncController.java
    • AsyncResultVo.java
    • CancelResultVo.java
  • 修改文件: 1 个

    • DataiMetadataAsyncMapper.java添加 2 个方法)
  • 代码行数: 约 600 行


生成的文档

生成的代码文件

  • datai-salesforce-metadata/src/main/java/com/datai/metadata/service/IMetadataAsyncService.java
  • datai-salesforce-metadata/src/main/java/com/datai/metadata/service/impl/MetadataAsyncServiceImpl.java
  • datai-salesforce-metadata/src/main/java/com/datai/metadata/controller/MetadataAsyncController.java
  • datai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/AsyncResultVo.java
  • datai-salesforce-metadata/src/main/java/com/datai/metadata/model/vo/CancelResultVo.java
  • datai-salesforce-metadata/src/main/java/com/datai/metadata/mapper/DataiMetadataAsyncMapper.java(修改)

阶段 9闭环复盘和接口文档

  • 状态: 已完成
  • 生成文档:
  • 关键决策:
    • 复盘文档包含 5 条成功经验、4 个改进点、2 个问题分析、4 条行动计划
    • 提取了 3 条有效的 Prompt 技巧和 3 个避免的坑
    • 提出了 4 项模板迭代建议
    • API 文档包含 5 个接口的详细说明、请求/响应参数、示例、错误码
  • 复盘主要结论:
    • 复用现有代码和表结构的策略成功,减少了开发工作量
    • 清晰的 ADR 决策指导了代码实现
    • 需要改进Mapper XML 的 SQL 实现可以同步完成、单元测试可以同步生成
    • 问题:代码生成时未同步检查依赖项、权限配置未同步完成

下一步行动

  1. Mapper XML: 添加 selectByAsyncIdselectRecentAsyncHistory 的 SQL 实现
  2. 单元测试: 编写 Service 和 Controller 的单元测试
  3. 集成测试: 与 Salesforce 环境进行集成测试
  4. 进入阶段 10: 代码提交

回退记录