refactor(ai): 重构AI接口算力点扣费逻辑并添加失败返还机制

- 移除预检查算力点步骤,改为请求前预扣算力点
- 添加请求失败时自动返还算力点的功能
- 修改copyAIResponse函数参数以支持失败回调处理
- 在响应状态异常时也执行算力点返还操作
- 从auth服务中移除EnsureUserCredits方法
- 新增RefundUserCredits方法用于返还用户算力点
- 添加AI_REFUND算力点日志类型常量
- 更新算力点日志类型说明及展示标签
This commit is contained in:
HouYunFei
2026-05-25 15:23:51 +08:00
parent 01f2a4d9d5
commit 2934b1d0bc
10 changed files with 98 additions and 178 deletions
+25 -14
View File
@@ -318,20 +318,6 @@ func AdjustUserCredits(id string, credits int) (model.User, error) {
return user, err
}
func EnsureUserCredits(userID string, credits int) error {
if credits <= 0 {
return nil
}
ok, err := repository.HasUserCredits(userID, credits)
if err != nil {
return err
}
if !ok {
return safeMessageError{message: "算力点不足"}
}
return nil
}
func ConsumeUserCredits(userID string, modelName string, credits int, path string) error {
if credits <= 0 {
return nil
@@ -357,6 +343,31 @@ func ConsumeUserCredits(userID string, modelName string, credits int, path strin
return err
}
func RefundUserCredits(userID string, modelName string, credits int, path string) error {
if credits <= 0 {
return nil
}
user, ok, err := repository.RefundUserCredits(userID, credits, now())
if err != nil {
return err
}
if !ok {
return safeMessageError{message: "用户不存在"}
}
extra, _ := json.Marshal(map[string]string{"model": modelName, "path": path})
_, err = repository.SaveCreditLog(model.CreditLog{
ID: newID("credit"),
UserID: userID,
Type: model.CreditLogTypeAIRefund,
Amount: credits,
Balance: user.Credits,
Remark: "模型调用失败返还 " + modelName,
Extra: string(extra),
CreatedAt: now(),
})
return err
}
func ListCreditLogs(q model.Query) (model.CreditLogList, error) {
logs, total, err := repository.ListCreditLogs(q)
if err != nil {