12 KiB
12 KiB
提示词:高级功能
引用真源
需求描述
根据需求文档,实现 Salesforce Partner API 的高级功能,包括:
-
ConvertLead(转换线索)
- 将线索转换为账户、联系人和商机
- 支持指定转换后的账户、联系人或商机 ID
- 支持覆盖线索来源、不创建商机、发送通知邮件等选项
-
EmptyRecycleBin(清空回收站)
- 永久删除回收站中的记录
- 支持批量删除(最多 200 个记录)
- 返回每个记录的删除结果
-
ProcessSubmitRequest(处理提交请求)
- 提交流程请求,触发审批流程
- 支持添加评论
- 返回流程实例 ID
-
GetUserInfo(获取用户信息)
- 获取当前用户的详细信息
- 复用认证和会话管理子需求的实现
-
GetServerTimestamp(获取服务器时间戳)
- 获取 Salesforce 服务器的当前时间
- 返回 ISO 8601 格式的时间戳和时区信息
设计方案
根据设计文档,采用以下技术方案:
- 技术选型:直接使用 Salesforce Partner API(partner.jar)
- 架构模式:分层架构(Controller → Service → Factory → Connection → Salesforce API)
- 连接管理:通过 PartnerConnectionFactory 获取 PartnerConnection 实例
- 数据转换:DTO → Salesforce 对象 → VO
- 异常处理:统一异常映射,将 Salesforce 错误码转换为友好的中文错误消息
- 复用策略:GetUserInfo 复用认证和会话管理子需求的实现
核心类使用
| 功能 | Salesforce 类 | 说明 |
|---|---|---|
| ConvertLead | LeadConvert / LeadConvertResult |
线索转换参数和结果 |
| EmptyRecycleBin | EmptyRecycleBinResult |
清空回收站结果 |
| ProcessSubmitRequest | ProcessSubmitRequest / ProcessResult |
流程提交请求和结果 |
| GetUserInfo | GetUserInfoResult |
用户信息结果 |
| GetServerTimestamp | Calendar |
服务器时间戳 |
异常映射
| Salesforce 错误码 | 异常类型 | 错误消息 |
|---|---|---|
| CANNOT_UPDATE_CONVERTED_LEAD | SalesforceOperationException | 无法更新已转换的线索 |
| INVALID_LEAD_ID | SalesforceOperationException | 无效的线索 ID |
| INVALID_ACCOUNT_ID | SalesforceOperationException | 无效的账户 ID |
| INVALID_CONTACT_ID | SalesforceOperationException | 无效的联系人 ID |
| INVALID_OPPORTUNITY_ID | SalesforceOperationException | 无效的商机 ID |
| INVALID_CONVERTED_STATUS | SalesforceOperationException | 无效的转换状态 |
| INVALID_ID | SalesforceOperationException | 无效的记录 ID |
| ENTITY_IS_DELETED | SalesforceOperationException | 记录已删除 |
| ENTITY_IS_NOT_IN_RECYCLE_BIN | SalesforceOperationException | 记录不在回收站中 |
| INVALID_OPERATION | SalesforceOperationException | 无效操作 |
| INSUFFICIENT_ACCESS | SalesforceOperationException | 权限不足 |
| OPERATION_FAILED | SalesforceOperationException | 操作失败 |
| PROCESS_SUBMISSION_FAILED | SalesforceOperationException | 流程提交失败 |
| INVALID_OBJECT_ID | SalesforceOperationException | 无效的对象 ID |
输出格式要求
必须包含以下文件
DTO 类(3 个)
-
LeadConvertRequest.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/dto/LeadConvertRequest.java - 字段:leadId, convertedStatus, accountId, contactId, opportunityId, overwriteLeadSource, doNotCreateOpportunity, sendNotificationEmail
- 路径:
-
EmptyRecycleBinRequest.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/dto/EmptyRecycleBinRequest.java - 字段:ids(List)
- 路径:
-
ProcessSubmitRequest.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/dto/ProcessSubmitRequest.java - 字段:objectId, comments
- 路径:
VO 类(5 个)
-
LeadConvertResultVo.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/vo/LeadConvertResultVo.java - 字段:accountId, contactId, opportunityId, leadId, success, errors
- 路径:
-
EmptyRecycleBinResultVo.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/vo/EmptyRecycleBinResultVo.java - 字段:results(List), success, errors
- 路径:
-
ProcessResultVo.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/vo/ProcessResultVo.java - 字段:processInstanceId, success, errors
- 路径:
-
UserInfoVo.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/vo/UserInfoVo.java - 字段:userId, userName, userFullName, userEmail, organizationId, organizationName, userLanguage, userTimeZone, currencySymbol
- 路径:
-
ServerTimestampVo.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/vo/ServerTimestampVo.java - 字段:timestamp, timeZone, success, errors
- 路径:
Service 层(2 个)
-
PartnerAdvancedService.java(接口)
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/service/PartnerAdvancedService.java - 方法:
LeadConvertResultVo convertLead(LeadConvertRequest request)EmptyRecycleBinResultVo emptyRecycleBin(EmptyRecycleBinRequest request)ProcessResultVo processSubmitRequest(ProcessSubmitRequest request)ServerTimestampVo getServerTimestamp()
- 路径:
-
PartnerAdvancedServiceImpl.java(实现)
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/service/impl/PartnerAdvancedServiceImpl.java - 注入:
PartnerConnectionFactory - 实现所有 Service 接口方法
- 路径:
Controller 层(1 个)
- PartnerAdvancedController.java
- 路径:
datai-salesforce-partner/src/main/java/com/datai/partner/controller/PartnerAdvancedController.java - 注入:
PartnerAdvancedService,PartnerConnectionService(用于 GetUserInfo 复用) - 接口:
POST /api/partner/advanced/convert-lead- 转换线索POST /api/partner/advanced/empty-recycle-bin- 清空回收站POST /api/partner/advanced/process-submit-request- 处理提交请求GET /api/partner/advanced/user-info- 获取用户信息(复用)GET /api/partner/advanced/server-timestamp- 获取服务器时间戳
- 路径:
单元测试(1 个)
- PartnerAdvancedServiceImplTest.java
- 路径:
datai-salesforce-partner/src/test/java/com/datai/partner/service/impl/PartnerAdvancedServiceImplTest.java - 测试方法:
testConvertLeadSuccess()- 测试线索转换成功testConvertLeadWithAllOptions()- 测试线索转换带所有选项testEmptyRecycleBinSuccess()- 测试清空回收站成功testEmptyRecycleBinPartialFailure()- 测试清空回收站部分失败testProcessSubmitRequestSuccess()- 测试流程提交成功testGetServerTimestampSuccess()- 测试获取服务器时间戳成功testConvertLeadConnectionException()- 测试连接异常testConvertLeadApiFault()- 测试 API 异常
- 路径:
代码规范要求
- 类命名:首字母大写,驼峰命名,如
PartnerAdvancedController - 方法命名:首字母小写,驼峰命名,如
convertLead - 变量命名:首字母小写,驼峰命名,如
leadId - 注释规范:
- 类注释:使用
/** */,包含类功能描述、作者、创建时间 - 方法注释:使用
/** */,包含方法功能、参数、返回值、异常描述 - 字段注释:使用
/** */,包含字段功能描述
- 类注释:使用
- 代码格式:使用 4 个空格缩进,行宽不超过 120 字符
- 导入规范:使用具体导入,避免通配符导入
- Lombok 使用:使用
@Data、@Slf4j等注解简化代码
框架规范
-
Spring Boot 规范:
- 使用
@RestController定义 REST API - 使用
@RequestMapping定义请求路径 - 使用
@Autowired进行依赖注入 - 使用
@PreAuthorize("@ss.hasLogin()")进行权限控制
- 使用
-
若依框架规范:
- 使用
AjaxResult统一返回格式 - 使用
@Log注解记录操作日志(可选) - 使用
SecurityUtils获取当前用户信息(可选)
- 使用
-
Validation 规范:
- 使用
@NotBlank、@NotEmpty、@Size等注解进行参数验证 - 在 Controller 层使用
@Validated或@Valid触发验证
- 使用
测试要求
- 单元测试覆盖率:不低于 80%
- 测试用例场景:
- 正常场景:所有功能的成功调用
- 异常场景:连接异常、API 异常、参数验证失败
- 边界场景:空列表、最大数量限制
- 测试框架:JUnit 5 和 Mockito
- 测试用例命名规范:
test+方法名+场景,如testConvertLeadSuccess - Mock 对象:
- Mock
PartnerConnectionFactory返回 MockPartnerConnection - Mock
PartnerConnection返回各种结果 - 模拟
ConnectionException和ApiFault异常
- Mock
实现细节要求
ConvertLead 实现要求
- 通过
partnerConnectionFactory.getConnection("source")获取连接 - 创建
LeadConvert对象,设置所有参数 - 调用
connection.convertLead(LeadConvert[])方法 - 将
LeadConvertResult转换为LeadConvertResultVo - 处理异常,转换为自定义异常
EmptyRecycleBin 实现要求
- 验证 ids 数量不超过 200
- 通过
partnerConnectionFactory.getConnection("source")获取连接 - 调用
connection.emptyRecycleBin(String[])方法 - 将
EmptyRecycleBinResult[]转换为EmptyRecycleBinResultVo - 计算整体成功状态
- 处理异常,转换为自定义异常
ProcessSubmitRequest 实现要求
- 通过
partnerConnectionFactory.getConnection("source")获取连接 - 创建
ProcessSubmitRequest对象,设置参数 - 调用
connection.processSubmitRequest(ProcessSubmitRequest[])方法 - 将
ProcessResult转换为ProcessResultVo - 处理异常,转换为自定义异常
GetServerTimestamp 实现要求
- 通过
partnerConnectionFactory.getConnection("source")获取连接 - 调用
connection.getServerTimestamp()方法 - 将
Calendar转换为 ISO 8601 格式字符串 - 提取时区信息
- 处理异常,转换为自定义异常
GetUserInfo 复用要求
- 在 Controller 中注入
PartnerConnectionService - 调用
partnerConnectionService.getUserInfo()方法 - 复用已有的实现,避免重复代码
注意事项
- 固定使用 source org:所有方法都使用
getConnection("source") - 异常处理:必须捕获
ConnectionException和ApiFault,转换为自定义异常 - 日志记录:使用
@Slf4j记录关键操作和异常 - 空值处理:处理 Salesforce API 返回的空值情况
- 时间戳格式:使用 ISO 8601 格式(yyyy-MM-dd'T'HH:mm:ss.SSS'Z')
- 复用策略:GetUserInfo 必须复用认证模块的实现
- 批量限制:EmptyRecycleBin 最多支持 200 个记录
- 权限控制:所有接口使用
@PreAuthorize("@ss.hasLogin()")
依赖项
datai-salesforce-auth模块的PartnerConnectionFactorydatai-salesforce-auth模块的PartnerConnectionService(用于 GetUserInfo 复用)datai-salesforce-common模块的异常类(SalesforceAuthException、SalesforceOperationException)partner.jar中的相关类(PartnerConnection、LeadConvert、LeadConvertResult、EmptyRecycleBinResult、ProcessSubmitRequest、ProcessResult、GetUserInfoResult)- Spring Boot 相关依赖(
spring-boot-starter-web、spring-boot-starter-validation) - Lombok
- JUnit 5 和 Mockito(测试)