160 lines
5.4 KiB
Markdown
160 lines
5.4 KiB
Markdown
# 天元API调用记录功能 - 代码修改说明
|
||
|
||
## 概述
|
||
本文档说明如何修改 `apirequestService.go`,为每次天元API调用添加记录功能。
|
||
|
||
## 已完成的修改
|
||
|
||
### 1. 数据库层面
|
||
- ✅ 创建 `tianyuanapi_cost_migration.sql` 脚本
|
||
- 在 `feature` 表添加 `cost_price` 字段
|
||
- 创建 `tianyuanapi_call_log` 表
|
||
|
||
### 2. Service层面
|
||
- ✅ 创建 `tianyuanapiCallLogService.go` 服务
|
||
- `RecordCall()` - 记录API调用
|
||
- `GetStatistics()` - 获取统计信息
|
||
|
||
### 3. Model层面
|
||
- ⏳ 需要执行 `generate_tianyuanapi_models.sh` 生成Model代码
|
||
|
||
### 4. ApiRequestService修改
|
||
- ✅ 添加 `tianyuanapiCallLogService` 字段
|
||
- ✅ 修改构造函数,添加 `tianyuanapiCallLogService` 参数
|
||
- ✅ 创建 `callTianyuanApiWithLog()` 辅助方法
|
||
|
||
## 待完成的修改
|
||
|
||
### 1. 执行SQL脚本
|
||
```bash
|
||
# 在数据库中执行迁移脚本
|
||
mysql -u root -p ycc < ycc-proxy-server/deploy/sql/tianyuanapi_cost_migration.sql
|
||
```
|
||
|
||
### 2. 生成Model代码
|
||
```bash
|
||
cd ycc-proxy-server/deploy/sql
|
||
bash generate_tianyuanapi_models.sh
|
||
```
|
||
|
||
### 3. 更新 servicecontext.go
|
||
在 `svc/servicecontext.go` 中添加:
|
||
```go
|
||
// 初始化Model
|
||
tianyuanapiCallLogModel := model.NewTianyuanapiCallLogModel(db, cacheConf)
|
||
|
||
// 初始化Service
|
||
tianyuanapiCallLogService := service.NewTianyuanapiCallLogService(
|
||
tianyuanapiCallLogModel,
|
||
featureModel,
|
||
)
|
||
|
||
// 修改ApiRequestService初始化
|
||
apiRequestService := service.NewApiRequestService(
|
||
c,
|
||
featureModel,
|
||
productFeatureModel,
|
||
userFeatureWhitelistModel,
|
||
tianyuanapi,
|
||
tianyuanapiCallLogService, // 新增参数
|
||
)
|
||
|
||
// 在ServiceContext结构体中添加字段
|
||
TianyuanapiCallLogModel model.TianyuanapiCallLogModel
|
||
TianyuanapiCallLogService *service.TianyuanapiCallLogService
|
||
|
||
// 在返回的ServiceContext中添加
|
||
TianyuanapiCallLogModel: tianyuanapiCallLogModel,
|
||
TianyuanapiCallLogService: tianyuanapiCallLogService,
|
||
```
|
||
|
||
### 4. 修改API调用方法示例
|
||
|
||
#### 原代码:
|
||
```go
|
||
resp, err := a.callTianyuanApiWithLog(ctx, "", "QYGLB4C0", map[string]interface{}{
|
||
"id_card": idCard.String(),
|
||
})
|
||
```
|
||
|
||
#### 修改后:
|
||
```go
|
||
resp, err := a.callTianyuanApiWithLog(ctx, featureID, "QYGLB4C0", map[string]interface{}{
|
||
"id_card": idCard.String(),
|
||
})
|
||
```
|
||
|
||
### 需要修改的方法列表(共32个)
|
||
|
||
1. `ProcessPersonEnterpriseProRequest` - 需要修改2处
|
||
- 第253行:`QYGLB4C0` - 主接口
|
||
- 第455行:`QYGL8271` - 涉诉信息查询
|
||
|
||
2. `ProcessFLXG0V4BRequest` - 第586行:`FLXG0V4B`
|
||
3. `ProcessFLXG0687Request` - 第608行:`FLXG0687`
|
||
4. `ProcessFLXG3D56Request` - 第638行:`FLXG3D56`
|
||
5. `ProcessIVYZ5733Request` - 第692行:`IVYZ5733`
|
||
6. `ProcessIVYZ9A2BRequest` - 第748行:`IVYZ9A2B`
|
||
7. `ProcessYYSYBE08Request` - 第819行:`YYSYBE08`
|
||
8. `ProcessJRZQ0A03Request` - 第861行:`JRZQ0A03`
|
||
9. `ProcessJRZQ8203Request` - 第918行:`JRZQ8203`
|
||
10. `ProcessJRZQ4AA8Request` - 第975行:`JRZQ4AA8`
|
||
11. `ProcessQYGL8271Request` - 第1024行:`QYGL8271`
|
||
12. `ProcessQYGL6F2DRequest` - 第1082行:`QYGL6F2D`
|
||
13. `ProcessQCXG7A2BRequest` - 第1123行:`QCXG7A2B`
|
||
14. `ProcessYYSY09CDRequest` - 第1143行:`YYSY09CD`
|
||
15. `ProcessDWBG8B4DRequest` - 第1254行:`DWBG8B4D`
|
||
16. `ProcessDWBG6A2CRequest` - 第1279行:`DWBG6A2C`
|
||
17. `ProcessJRZQ4B6CRequest` - 第1303行:`JRZQ4B6C`
|
||
18. `ProcessJRZQ09J8Request` - 第1327行:`JRZQ09J8`
|
||
19. `ProcessJRZQ5E9FRequest` - 第1351行:`JRZQ5E9F`
|
||
20. `ProcessQYGL3F8ERequest` - 第1373行:`QYGL3F8E`
|
||
21. `ProcessIVYZ81NCRequest` - 第1393行:`IVYZ81NC`
|
||
22. `ProcessIVYZ7F3ARequest` - 第1414行:`IVYZ7F3A`
|
||
23. `ProcessDWBG7F3ARequest` - 第1437行:`DWBG7F3A`
|
||
24. `ProcessJRZQ8A2DRequest` - 第1460行:`JRZQ8A2D`
|
||
25. `ProcessYYSY8B1CRequest` - 第1482行:`YYSY8B1C`
|
||
26. `ProcessYYSY7D3ERequest` - 第1501行:`YYSY7D3E`
|
||
27. `ProcessFLXG7E8FRequest` - 第1522行:`FLXG7E8F`
|
||
28. `ProcessIVYZ8I9JRequest` - 第1545行:`IVYZ8I9J`
|
||
29. `ProcessJRZQ7F1ARequest` - 第1568行:`JRZQ7F1A`
|
||
30. `ProcessIVYZ3P9MRequest` - 第1591行:`IVYZ3P9M`
|
||
31. `ProcessJRZQ6F2ARequest` - 第1612行:`JRZQ6F2A`
|
||
|
||
### 注意事项
|
||
|
||
1. **featureID获取**:每个方法中已经有了 `feature` 对象,直接使用 `feature.Id` 即可
|
||
2. **context传递**:需要从方法签名中获取 `ctx context.Context` 参数
|
||
3. **错误处理**:`callTianyuanApiWithLog` 已经包含了错误处理,无需额外处理
|
||
4. **批量修改建议**:可以使用查找替换功能批量修改
|
||
- 查找:`a.callTianyuanApiWithLog(ctx, "", "`
|
||
- 替换为:`a.callTianyuanApiWithLog(ctx, feature.Id, "`
|
||
|
||
## 统计功能使用示例
|
||
|
||
```go
|
||
// 获取某个功能在某个时间段的调用统计
|
||
filter := StatisticsFilter{
|
||
FeatureID: "feature-id-123",
|
||
StartDate: time.Now().AddDate(0, 0, -30), // 30天前
|
||
EndDate: time.Now(),
|
||
}
|
||
stats, err := ctx.TianyuanapiCallLogService.GetStatistics(context.Background(), filter)
|
||
if err == nil {
|
||
fmt.Printf("总调用次数: %d\n", stats.TotalCalls)
|
||
fmt.Printf("成功次数: %d\n", stats.SuccessCalls)
|
||
fmt.Printf("失败次数: %d\n", stats.FailedCalls)
|
||
fmt.Printf("总成本: %.2f元\n", stats.TotalCost)
|
||
}
|
||
```
|
||
|
||
## 验证步骤
|
||
|
||
1. 执行SQL脚本,检查表是否创建成功
|
||
2. 运行Model生成脚本,检查Model文件是否生成
|
||
3. 编译项目,检查是否有编译错误
|
||
4. 运行项目,发起一个API请求
|
||
5. 检查 `tianyuanapi_call_log` 表,验证记录是否正确插入
|
||
6. 检查成本价是否正确计算(成功调用有成本,失败调用成本为0)
|
||
|