This commit is contained in:
2026-01-13 18:30:10 +08:00
parent 0206710e29
commit 04df8460a4
29 changed files with 2472 additions and 111 deletions

View File

@@ -0,0 +1,159 @@
# 天元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