feat: 图片生成计费功能

- 新增 Group 图片价格配置(image_price_1k/2k/4k)
- BillingService 新增 CalculateImageCost 方法
- AntigravityGatewayService 支持识别图片生成模型并按次计费
- UsageLog 新增 image_count 和 image_size 字段
- 前端分组管理支持配置图片价格(antigravity 和 gemini 平台)
- 图片计费复用通用计费能力(余额检查、扣费、倍率、订阅限额)
This commit is contained in:
song
2026-01-05 17:07:29 +08:00
parent e78c864650
commit d4c2b723a5
41 changed files with 2747 additions and 40 deletions

View File

@@ -273,6 +273,87 @@ func (_u *GroupUpdate) AddDefaultValidityDays(v int) *GroupUpdate {
return _u
}
// SetImagePrice1k sets the "image_price_1k" field.
func (_u *GroupUpdate) SetImagePrice1k(v float64) *GroupUpdate {
_u.mutation.ResetImagePrice1k()
_u.mutation.SetImagePrice1k(v)
return _u
}
// SetNillableImagePrice1k sets the "image_price_1k" field if the given value is not nil.
func (_u *GroupUpdate) SetNillableImagePrice1k(v *float64) *GroupUpdate {
if v != nil {
_u.SetImagePrice1k(*v)
}
return _u
}
// AddImagePrice1k adds value to the "image_price_1k" field.
func (_u *GroupUpdate) AddImagePrice1k(v float64) *GroupUpdate {
_u.mutation.AddImagePrice1k(v)
return _u
}
// ClearImagePrice1k clears the value of the "image_price_1k" field.
func (_u *GroupUpdate) ClearImagePrice1k() *GroupUpdate {
_u.mutation.ClearImagePrice1k()
return _u
}
// SetImagePrice2k sets the "image_price_2k" field.
func (_u *GroupUpdate) SetImagePrice2k(v float64) *GroupUpdate {
_u.mutation.ResetImagePrice2k()
_u.mutation.SetImagePrice2k(v)
return _u
}
// SetNillableImagePrice2k sets the "image_price_2k" field if the given value is not nil.
func (_u *GroupUpdate) SetNillableImagePrice2k(v *float64) *GroupUpdate {
if v != nil {
_u.SetImagePrice2k(*v)
}
return _u
}
// AddImagePrice2k adds value to the "image_price_2k" field.
func (_u *GroupUpdate) AddImagePrice2k(v float64) *GroupUpdate {
_u.mutation.AddImagePrice2k(v)
return _u
}
// ClearImagePrice2k clears the value of the "image_price_2k" field.
func (_u *GroupUpdate) ClearImagePrice2k() *GroupUpdate {
_u.mutation.ClearImagePrice2k()
return _u
}
// SetImagePrice4k sets the "image_price_4k" field.
func (_u *GroupUpdate) SetImagePrice4k(v float64) *GroupUpdate {
_u.mutation.ResetImagePrice4k()
_u.mutation.SetImagePrice4k(v)
return _u
}
// SetNillableImagePrice4k sets the "image_price_4k" field if the given value is not nil.
func (_u *GroupUpdate) SetNillableImagePrice4k(v *float64) *GroupUpdate {
if v != nil {
_u.SetImagePrice4k(*v)
}
return _u
}
// AddImagePrice4k adds value to the "image_price_4k" field.
func (_u *GroupUpdate) AddImagePrice4k(v float64) *GroupUpdate {
_u.mutation.AddImagePrice4k(v)
return _u
}
// ClearImagePrice4k clears the value of the "image_price_4k" field.
func (_u *GroupUpdate) ClearImagePrice4k() *GroupUpdate {
_u.mutation.ClearImagePrice4k()
return _u
}
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs.
func (_u *GroupUpdate) AddAPIKeyIDs(ids ...int64) *GroupUpdate {
_u.mutation.AddAPIKeyIDs(ids...)
@@ -642,6 +723,33 @@ func (_u *GroupUpdate) sqlSave(ctx context.Context) (_node int, err error) {
if value, ok := _u.mutation.AddedDefaultValidityDays(); ok {
_spec.AddField(group.FieldDefaultValidityDays, field.TypeInt, value)
}
if value, ok := _u.mutation.ImagePrice1k(); ok {
_spec.SetField(group.FieldImagePrice1k, field.TypeFloat64, value)
}
if value, ok := _u.mutation.AddedImagePrice1k(); ok {
_spec.AddField(group.FieldImagePrice1k, field.TypeFloat64, value)
}
if _u.mutation.ImagePrice1kCleared() {
_spec.ClearField(group.FieldImagePrice1k, field.TypeFloat64)
}
if value, ok := _u.mutation.ImagePrice2k(); ok {
_spec.SetField(group.FieldImagePrice2k, field.TypeFloat64, value)
}
if value, ok := _u.mutation.AddedImagePrice2k(); ok {
_spec.AddField(group.FieldImagePrice2k, field.TypeFloat64, value)
}
if _u.mutation.ImagePrice2kCleared() {
_spec.ClearField(group.FieldImagePrice2k, field.TypeFloat64)
}
if value, ok := _u.mutation.ImagePrice4k(); ok {
_spec.SetField(group.FieldImagePrice4k, field.TypeFloat64, value)
}
if value, ok := _u.mutation.AddedImagePrice4k(); ok {
_spec.AddField(group.FieldImagePrice4k, field.TypeFloat64, value)
}
if _u.mutation.ImagePrice4kCleared() {
_spec.ClearField(group.FieldImagePrice4k, field.TypeFloat64)
}
if _u.mutation.APIKeysCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
@@ -1195,6 +1303,87 @@ func (_u *GroupUpdateOne) AddDefaultValidityDays(v int) *GroupUpdateOne {
return _u
}
// SetImagePrice1k sets the "image_price_1k" field.
func (_u *GroupUpdateOne) SetImagePrice1k(v float64) *GroupUpdateOne {
_u.mutation.ResetImagePrice1k()
_u.mutation.SetImagePrice1k(v)
return _u
}
// SetNillableImagePrice1k sets the "image_price_1k" field if the given value is not nil.
func (_u *GroupUpdateOne) SetNillableImagePrice1k(v *float64) *GroupUpdateOne {
if v != nil {
_u.SetImagePrice1k(*v)
}
return _u
}
// AddImagePrice1k adds value to the "image_price_1k" field.
func (_u *GroupUpdateOne) AddImagePrice1k(v float64) *GroupUpdateOne {
_u.mutation.AddImagePrice1k(v)
return _u
}
// ClearImagePrice1k clears the value of the "image_price_1k" field.
func (_u *GroupUpdateOne) ClearImagePrice1k() *GroupUpdateOne {
_u.mutation.ClearImagePrice1k()
return _u
}
// SetImagePrice2k sets the "image_price_2k" field.
func (_u *GroupUpdateOne) SetImagePrice2k(v float64) *GroupUpdateOne {
_u.mutation.ResetImagePrice2k()
_u.mutation.SetImagePrice2k(v)
return _u
}
// SetNillableImagePrice2k sets the "image_price_2k" field if the given value is not nil.
func (_u *GroupUpdateOne) SetNillableImagePrice2k(v *float64) *GroupUpdateOne {
if v != nil {
_u.SetImagePrice2k(*v)
}
return _u
}
// AddImagePrice2k adds value to the "image_price_2k" field.
func (_u *GroupUpdateOne) AddImagePrice2k(v float64) *GroupUpdateOne {
_u.mutation.AddImagePrice2k(v)
return _u
}
// ClearImagePrice2k clears the value of the "image_price_2k" field.
func (_u *GroupUpdateOne) ClearImagePrice2k() *GroupUpdateOne {
_u.mutation.ClearImagePrice2k()
return _u
}
// SetImagePrice4k sets the "image_price_4k" field.
func (_u *GroupUpdateOne) SetImagePrice4k(v float64) *GroupUpdateOne {
_u.mutation.ResetImagePrice4k()
_u.mutation.SetImagePrice4k(v)
return _u
}
// SetNillableImagePrice4k sets the "image_price_4k" field if the given value is not nil.
func (_u *GroupUpdateOne) SetNillableImagePrice4k(v *float64) *GroupUpdateOne {
if v != nil {
_u.SetImagePrice4k(*v)
}
return _u
}
// AddImagePrice4k adds value to the "image_price_4k" field.
func (_u *GroupUpdateOne) AddImagePrice4k(v float64) *GroupUpdateOne {
_u.mutation.AddImagePrice4k(v)
return _u
}
// ClearImagePrice4k clears the value of the "image_price_4k" field.
func (_u *GroupUpdateOne) ClearImagePrice4k() *GroupUpdateOne {
_u.mutation.ClearImagePrice4k()
return _u
}
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs.
func (_u *GroupUpdateOne) AddAPIKeyIDs(ids ...int64) *GroupUpdateOne {
_u.mutation.AddAPIKeyIDs(ids...)
@@ -1594,6 +1783,33 @@ func (_u *GroupUpdateOne) sqlSave(ctx context.Context) (_node *Group, err error)
if value, ok := _u.mutation.AddedDefaultValidityDays(); ok {
_spec.AddField(group.FieldDefaultValidityDays, field.TypeInt, value)
}
if value, ok := _u.mutation.ImagePrice1k(); ok {
_spec.SetField(group.FieldImagePrice1k, field.TypeFloat64, value)
}
if value, ok := _u.mutation.AddedImagePrice1k(); ok {
_spec.AddField(group.FieldImagePrice1k, field.TypeFloat64, value)
}
if _u.mutation.ImagePrice1kCleared() {
_spec.ClearField(group.FieldImagePrice1k, field.TypeFloat64)
}
if value, ok := _u.mutation.ImagePrice2k(); ok {
_spec.SetField(group.FieldImagePrice2k, field.TypeFloat64, value)
}
if value, ok := _u.mutation.AddedImagePrice2k(); ok {
_spec.AddField(group.FieldImagePrice2k, field.TypeFloat64, value)
}
if _u.mutation.ImagePrice2kCleared() {
_spec.ClearField(group.FieldImagePrice2k, field.TypeFloat64)
}
if value, ok := _u.mutation.ImagePrice4k(); ok {
_spec.SetField(group.FieldImagePrice4k, field.TypeFloat64, value)
}
if value, ok := _u.mutation.AddedImagePrice4k(); ok {
_spec.AddField(group.FieldImagePrice4k, field.TypeFloat64, value)
}
if _u.mutation.ImagePrice4kCleared() {
_spec.ClearField(group.FieldImagePrice4k, field.TypeFloat64)
}
if _u.mutation.APIKeysCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,