259 lines
11 KiB
Markdown
259 lines
11 KiB
Markdown
# Salesforce 多系统配置开发会话记录
|
||
|
||
## 元数据
|
||
- 需求编号:2026-01-21-003-01
|
||
- 会话日期:2026-01-22
|
||
- 会话类型:开发会话
|
||
- 参与人员:SSOT 架构师
|
||
- 会话状态:已完成
|
||
|
||
## 会话概述
|
||
本次会话完成了 Salesforce 多系统配置功能的代码生成和修复工作,包括 Mapper 接口、Mapper XML、Service 接口、Service 实现类和 Controller 的开发和修复。
|
||
|
||
## 关键决策
|
||
|
||
### 决策 1:保留 DTO 和 VO 类中的敏感字段
|
||
**决策时间**:2026-01-22
|
||
**决策背景**:用户明确指示不要移除 DTO 和 VO 类中的敏感字段(clientSecret、password、securityToken)
|
||
**决策内容**:
|
||
- 保留 DataiSfSystemConfigDto 中的所有字段,包括敏感字段
|
||
- 保留 DataiSfSystemConfigVo 中的所有字段,包括敏感字段
|
||
- 敏感字段在数据库中使用 EncryptUtils 加密存储
|
||
**决策理由**:用户明确要求保留敏感字段,可能需要在某些场景下返回这些字段
|
||
|
||
### 决策 2:Mapper 接口方法命名
|
||
**决策时间**:2026-01-22
|
||
**决策背景**:生成的 Mapper 接口方法名与需求文档不匹配
|
||
**决策内容**:
|
||
- 将 `selectConfigById` 重命名为 `selectById`
|
||
- 将 `selectConfigList` 重命名为 `selectList`
|
||
- 将 `insertConfig` 重命名为 `insert`
|
||
- 将 `updateConfig` 重命名为 `updateById`
|
||
- 将 `deleteConfigById` 重命名为 `deleteById`
|
||
- 添加 `selectBySystemName` 方法
|
||
- 添加 `selectByOrgType` 方法
|
||
- 添加 `updateLoginInfo` 方法
|
||
**决策理由**:方法命名需要与需求文档保持一致,确保代码可读性和可维护性
|
||
|
||
### 决策 3:Service 接口扩展
|
||
**决策时间**:2026-01-22
|
||
**决策背景**:生成的 Service 接口缺少需求文档中要求的方法
|
||
**决策内容**:
|
||
- 添加 `getBySystemName` 方法
|
||
- 添加 `listByOrgType` 方法
|
||
- 添加 `updateLoginInfo` 方法
|
||
- 添加 `checkSystemNameUnique` 方法
|
||
- 添加 `enableSystem` 方法
|
||
- 添加 `disableSystem` 方法
|
||
**决策理由**:Service 接口需要提供完整的业务操作方法,满足需求文档中的所有功能点
|
||
|
||
### 决策 4:Controller API 路径和端点
|
||
**决策时间**:2026-01-22
|
||
**决策背景**:生成的 Controller API 路径和端点与需求文档不匹配
|
||
**决策内容**:
|
||
- 将 API 路径从 `/salesforce/system/config` 更新为 `/api/salesforce/system/config`
|
||
- 添加 `POST /api/salesforce/system/config` 端点(添加系统配置)
|
||
- 添加 `PUT /api/salesforce/system/config` 端点(修改系统配置)
|
||
- 添加 `DELETE /api/salesforce/system/config/{id}` 端点(删除系统配置)
|
||
- 添加 `PUT /api/salesforce/system/config/{id}/enable` 端点(启用系统)
|
||
- 添加 `PUT /api/salesforce/system/config/{id}/disable` 端点(停用系统)
|
||
- 添加 `GET /api/salesforce/system/config/source` 端点(查询源 org 列表)
|
||
- 添加 `GET /api/salesforce/system/config/target` 端点(查询目标 org 列表)
|
||
**决策理由**:API 路径和端点需要与需求文档保持一致,确保前后端对接顺畅
|
||
|
||
## 问题与解决方案
|
||
|
||
### 问题 1:生成的 Mapper 接口方法名与需求不匹配
|
||
**问题描述**:代码生成器生成的 Mapper 接口方法名与需求文档中定义的方法名不一致
|
||
**影响范围**:Mapper 接口、Mapper XML、Service 层
|
||
**解决方案**:
|
||
- 修改 Mapper 接口方法名,使其与需求文档一致
|
||
- 同步更新 Mapper XML 中的 SQL 语句 ID
|
||
- 确保所有方法命名遵循统一的命名规范
|
||
**解决时间**:2026-01-22
|
||
**经验教训**:代码生成前需要仔细检查需求文档,确保生成的代码符合需求规范
|
||
|
||
### 问题 2:生成的 Service 接口缺少必需方法
|
||
**问题描述**:代码生成器生成的 Service 接口缺少需求文档中要求的多个方法
|
||
**影响范围**:Service 接口、Service 实现类、Controller
|
||
**解决方案**:
|
||
- 扩展 Service 接口,添加缺失的方法
|
||
- 在 Service 实现类中实现新添加的方法
|
||
- 在 Controller 中调用新添加的方法
|
||
**解决时间**:2026-01-22
|
||
**经验教训**:代码生成后需要人工审查,确保所有需求功能都已实现
|
||
|
||
### 问题 3:生成的 Controller API 路径和端点不完整
|
||
**问题描述**:代码生成器生成的 Controller API 路径和端点与需求文档不一致,缺少多个端点
|
||
**影响范围**:Controller、前端对接
|
||
**解决方案**:
|
||
- 更新 Controller 的 API 路径
|
||
- 添加缺失的端点(启用、停用、源 org 列表、目标 org 列表)
|
||
- 确保所有端点都有正确的权限控制和日志记录
|
||
**解决时间**:2026-01-22
|
||
**经验教训**:代码生成后需要仔细对照需求文档,确保所有 API 端点都已实现
|
||
|
||
## 代码变更记录
|
||
|
||
### Mapper 接口变更
|
||
**文件路径**:`datai-salesforce-auth/src/main/java/com/datai/salesforceauth/mapper/DataiSfSystemConfigMapper.java`
|
||
**变更类型**:修改
|
||
**变更内容**:
|
||
- 重命名方法:`selectConfigById` → `selectById`
|
||
- 重命名方法:`selectConfigList` → `selectList`
|
||
- 重命名方法:`insertConfig` → `insert`
|
||
- 重命名方法:`updateConfig` → `updateById`
|
||
- 重命名方法:`deleteConfigById` → `deleteById`
|
||
- 新增方法:`selectBySystemName`
|
||
- 新增方法:`selectByOrgType`
|
||
- 新增方法:`updateLoginInfo`
|
||
|
||
### Mapper XML 变更
|
||
**文件路径**:`datai-salesforce-auth/src/main/resources/mapper/salesforceauth/DataiSfSystemConfigMapper.xml`
|
||
**变更类型**:修改
|
||
**变更内容**:
|
||
- 更新 SQL 语句 ID 以匹配 Mapper 接口方法名
|
||
- 新增 `selectBySystemName` 查询语句
|
||
- 新增 `selectByOrgType` 查询语句
|
||
- 新增 `updateLoginInfo` 更新语句
|
||
|
||
### Service 接口变更
|
||
**文件路径**:`datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/IDataiSfSystemConfigService.java`
|
||
**变更类型**:修改
|
||
**变更内容**:
|
||
- 新增方法:`getBySystemName`
|
||
- 新增方法:`listByOrgType`
|
||
- 新增方法:`updateLoginInfo`
|
||
- 新增方法:`checkSystemNameUnique`
|
||
- 新增方法:`enableSystem`
|
||
- 新增方法:`disableSystem`
|
||
|
||
### Service 实现类变更
|
||
**文件路径**:`datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/impl/DataiSfSystemConfigServiceImpl.java`
|
||
**变更类型**:修改
|
||
**变更内容**:
|
||
- 实现 `getBySystemName` 方法
|
||
- 实现 `listByOrgType` 方法
|
||
- 实现 `updateLoginInfo` 方法
|
||
- 实现 `checkSystemNameUnique` 方法
|
||
- 实现 `enableSystem` 方法
|
||
- 实现 `disableSystem` 方法
|
||
|
||
### Controller 变更
|
||
**文件路径**:`datai-salesforce-auth/src/main/java/com/datai/salesforceauth/controller/DataiSfSystemConfigController.java`
|
||
**变更类型**:修改
|
||
**变更内容**:
|
||
- 更新 API 路径:`/salesforce/system/config` → `/api/salesforce/system/config`
|
||
- 新增端点:`POST /api/salesforce/system/config`(添加系统配置)
|
||
- 新增端点:`PUT /api/salesforce/system/config`(修改系统配置)
|
||
- 新增端点:`DELETE /api/salesforce/system/config/{id}`(删除系统配置)
|
||
- 新增端点:`PUT /api/salesforce/system/config/{id}/enable`(启用系统)
|
||
- 新增端点:`PUT /api/salesforce/system/config/{id}/disable`(停用系统)
|
||
- 新增端点:`GET /api/salesforce/system/config/source`(查询源 org 列表)
|
||
- 新增端点:`GET /api/salesforce/system/config/target`(查询目标 org 列表)
|
||
|
||
## 技术要点
|
||
|
||
### 1. 系统名称唯一性检查
|
||
在添加或修改系统配置时,需要检查系统名称是否唯一。实现方式:
|
||
```java
|
||
@Override
|
||
public boolean checkSystemNameUnique(DataiSfSystemConfig config)
|
||
{
|
||
Long configId = StringUtils.isNull(config.getId()) ? -1L : config.getId();
|
||
DataiSfSystemConfig info = dataiSfSystemConfigMapper.selectBySystemName(config.getSystemName());
|
||
if (StringUtils.isNotNull(info) && !info.getId().equals(configId))
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
```
|
||
|
||
### 2. 启用/停用系统
|
||
启用和停用系统时,需要更新状态字段和审计信息:
|
||
```java
|
||
@Override
|
||
public void enableSystem(Long id)
|
||
{
|
||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||
String username = loginUser.getUsername();
|
||
|
||
DataiSfSystemConfig config = new DataiSfSystemConfig();
|
||
config.setId(id);
|
||
config.setStatus("0");
|
||
config.setUpdateBy(username);
|
||
config.setUpdateTime(DateUtils.getNowDate());
|
||
dataiSfSystemConfigMapper.updateById(config);
|
||
}
|
||
```
|
||
|
||
### 3. 查询源 org 和目标 org 列表
|
||
根据 orgType 字段查询源 org 或目标 org 列表:
|
||
```java
|
||
@Override
|
||
public List<DataiSfSystemConfig> listByOrgType(String orgType)
|
||
{
|
||
return dataiSfSystemConfigMapper.selectByOrgType(orgType);
|
||
}
|
||
```
|
||
|
||
### 4. 更新登录信息
|
||
登录成功后,更新系统配置表中的登录信息:
|
||
```java
|
||
@Override
|
||
public int updateLoginInfo(DataiSfSystemConfig config)
|
||
{
|
||
return dataiSfSystemConfigMapper.updateLoginInfo(config);
|
||
}
|
||
```
|
||
|
||
## 测试建议
|
||
|
||
### 1. 单元测试
|
||
- 测试 `checkSystemNameUnique` 方法的各种场景
|
||
- 测试 `enableSystem` 和 `disableSystem` 方法
|
||
- 测试 `updateLoginInfo` 方法
|
||
|
||
### 2. 集成测试
|
||
- 测试完整的添加系统配置流程
|
||
- 测试系统名称唯一性验证
|
||
- 测试启用/停用系统功能
|
||
- 测试查询源 org 和目标 org 列表
|
||
|
||
### 3. API 测试
|
||
- 测试所有 API 端点的请求和响应
|
||
- 测试权限控制
|
||
- 测试日志记录
|
||
|
||
## 后续工作
|
||
|
||
1. **阶段 8:变更日志** - 记录本次开发的变更内容
|
||
2. **阶段 9:复盘与 API** - 进行复盘总结,生成 API 文档
|
||
3. **阶段 10:代码提交** - 提交代码到版本控制系统
|
||
4. **子需求 2:Salesforce 策略模式登录** - 开始下一个子需求的开发
|
||
|
||
## 经验总结
|
||
|
||
1. **代码生成器验证**:代码生成后需要仔细对照需求文档,确保生成的代码符合需求规范
|
||
2. **方法命名规范**:保持方法命名的一致性,遵循统一的命名规范
|
||
3. **接口完整性**:确保 Service 接口提供完整的业务操作方法
|
||
4. **API 设计**:API 路径和端点需要与需求文档保持一致,确保前后端对接顺畅
|
||
5. **敏感字段处理**:根据实际需求决定是否在 DTO 和 VO 中保留敏感字段
|
||
|
||
## 附录
|
||
|
||
### 相关文档
|
||
- [需求文档](../requirements/2026-01-21-003-01-salesforce-multi-system-config.md)
|
||
- [设计文档](../design/2026-01-21-003-01-salesforce-multi-system-config-design.md)
|
||
- [架构决策](../decisions/2026-01-21-003-01-ADR-salesforce-multi-system-config.md)
|
||
- [数据库脚本](../sql/2026-01-21-003-01-datai_sf_system_config.sql)
|
||
- [代码生成提示词](../prompts/2026-01-21-003-01-salesforce-multi-system-config代码生成提示词.md)
|
||
|
||
### 相关代码
|
||
- [Mapper 接口](../../datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/mapper/DataiSfSystemConfigMapper.java)
|
||
- [Mapper XML](../../datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/resources/mapper/salesforceauth/DataiSfSystemConfigMapper.xml)
|
||
- [Service 接口](../../datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/IDataiSfSystemConfigService.java)
|
||
- [Service 实现类](../../datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/service/impl/DataiSfSystemConfigServiceImpl.java)
|
||
- [Controller](../../datai-scenes/datai-scene-salesforce/datai-salesforce-auth/src/main/java/com/datai/salesforceauth/controller/DataiSfSystemConfigController.java)
|