# 天元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)