Pārlūkot izejas kodu

fix:增加model字段;增加消耗积分数;

jimmyyem 2 nedēļas atpakaļ
vecāks
revīzija
ac247d03f9
38 mainītis faili ar 1605 papildinājumiem un 53 dzēšanām
  1. 27 0
      crontask/compute_statistic.go
  2. 1 0
      desc/wechat/dashboard.api
  3. 2 0
      desc/wechat/usage_detail.api
  4. 24 26
      ent/client.go
  5. 1 1
      ent/ent.go
  6. 4 0
      ent/migrate/schema.go
  7. 399 5
      ent/mutation.go
  8. 16 0
      ent/runtime/runtime.go
  9. 3 0
      ent/schema/usage_detail.go
  10. 1 0
      ent/schema/usage_statistic_day.go
  11. 1 0
      ent/schema/usage_statistic_hour.go
  12. 1 0
      ent/schema/usage_statistic_month.go
  13. 96 0
      ent/set_not_nil.go
  14. 13 2
      ent/usagedetail.go
  15. 10 0
      ent/usagedetail/usagedetail.go
  16. 80 0
      ent/usagedetail/where.go
  17. 82 0
      ent/usagedetail_create.go
  18. 52 0
      ent/usagedetail_update.go
  19. 13 2
      ent/usagestatisticday.go
  20. 10 0
      ent/usagestatisticday/usagestatisticday.go
  21. 55 0
      ent/usagestatisticday/where.go
  22. 102 0
      ent/usagestatisticday_create.go
  23. 72 0
      ent/usagestatisticday_update.go
  24. 13 2
      ent/usagestatistichour.go
  25. 10 0
      ent/usagestatistichour/usagestatistichour.go
  26. 55 0
      ent/usagestatistichour/where.go
  27. 102 0
      ent/usagestatistichour_create.go
  28. 72 0
      ent/usagestatistichour_update.go
  29. 13 2
      ent/usagestatisticmonth.go
  30. 10 0
      ent/usagestatisticmonth/usagestatisticmonth.go
  31. 55 0
      ent/usagestatisticmonth/where.go
  32. 102 0
      ent/usagestatisticmonth_create.go
  33. 72 0
      ent/usagestatisticmonth_update.go
  34. 13 12
      internal/logic/UsageDetail/get_usage_detail_list_logic.go
  35. 1 0
      internal/logic/UsageDetail/get_usage_detail_logic.go
  36. 1 1
      internal/logic/chatrecords/gpts_submit_api_chat_logic.go
  37. 19 0
      internal/logic/dashboard/get_charts_logic.go
  38. 2 0
      internal/types/types.go

+ 27 - 0
crontask/compute_statistic.go

@@ -6,6 +6,7 @@ import (
 	"time"
 	"wechat-api/ent"
 	"wechat-api/ent/contact"
+	"wechat-api/ent/creditusage"
 	"wechat-api/ent/custom_types"
 	"wechat-api/ent/labelrelationship"
 	"wechat-api/ent/messagerecords"
@@ -55,13 +56,16 @@ func (l *CronTask) computeStatistic() {
 	lc := []custom_types.LabelDist{}
 
 	var allHourAiResponseInt, allHourSopRunInt, allHourFriendCountInt, allHourGroupCountInt, allHourAccountBalanceInt, allHourConsumeTokenInt, allHourActiveUserInt, allHourNewUserInt int
+	var allHourConsumeCoinInt int
 	for orgID, wxinfos := range wxbotsSet {
 		var orgAiResponseInt, orgSopRunInt, orgFriendCountInt, orgGroupCountInt, orgAccountBalanceInt, orgConsumeTokenInt, orgActiveUserInt, orgNewUserInt int
+		var orgHourConsumeCoinInt int
 		for _, wxinfo := range wxinfos {
 			l.Logger.Infof("开始计算小时数据:%d\n", lastHourInt)
 
 			// 先判断该账号是否已经统计了小时数据,如果已经统计了,就不需要再统计了
 			var aiResponseInt, sopRunInt, friendCountInt, groupCountInt, accountBalanceInt, consumeTokenInt, activeUserInt, newUserInt int
+			var consumeCoinInt int
 			hourDataCount, _ := l.svcCtx.DB.UsageStatisticHour.Query().Where(
 				usagestatistichour.Type(1),
 				usagestatistichour.BotID(wxinfo.Wxid),
@@ -131,6 +135,17 @@ func (l *CronTask) computeStatistic() {
 			orgConsumeTokenInt += consumeTokenInt
 			allHourConsumeTokenInt += consumeTokenInt
 
+			// 计算积分消耗
+			consumeCoinInt, _ = l.svcCtx.DB.CreditUsage.Query().Where(
+				creditusage.UserID(wxinfo.Wxid),
+				creditusage.OrganizationID(orgID),
+				creditusage.Ntype(2),
+				creditusage.CreatedAtGTE(lastHour),
+				creditusage.CreatedAtLT(currentHour),
+			).Aggregate(ent.Sum("number")).Int(l.ctx)
+			allHourConsumeCoinInt += consumeCoinInt
+			orgHourConsumeCoinInt += consumeCoinInt
+
 			// 账户余额
 			accountBalanceInt = 0
 			orgAccountBalanceInt = 0
@@ -171,6 +186,7 @@ func (l *CronTask) computeStatistic() {
 				SetTotalGroup(uint64(groupCountInt)).
 				SetAccountBalance(uint64(accountBalanceInt)).
 				SetConsumeToken(uint64(consumeTokenInt)).
+				SetConsumeCoin(uint64(consumeCoinInt)).
 				SetActiveUser(uint64(activeUserInt)).
 				SetNewUser(int64(newUserInt)).
 				SetAddtime(uint64(lastHourInt)).
@@ -205,6 +221,7 @@ func (l *CronTask) computeStatistic() {
 			SetTotalGroup(uint64(orgGroupCountInt)).
 			SetAccountBalance(uint64(orgAccountBalanceInt)).
 			SetConsumeToken(uint64(orgConsumeTokenInt)).
+			SetConsumeCoin(uint64(orgHourConsumeCoinInt)).
 			SetActiveUser(uint64(orgActiveUserInt)).
 			SetNewUser(int64(orgNewUserInt)).
 			SetAddtime(uint64(lastHourInt)).
@@ -230,6 +247,7 @@ func (l *CronTask) computeStatistic() {
 			SetTotalGroup(uint64(allHourGroupCountInt)).
 			SetAccountBalance(uint64(allHourAccountBalanceInt)).
 			SetConsumeToken(uint64(allHourConsumeTokenInt)).
+			SetConsumeCoin(uint64(allHourConsumeCoinInt)).
 			SetActiveUser(uint64(allHourActiveUserInt)).
 			SetNewUser(int64(allHourNewUserInt)).
 			SetAddtime(uint64(lastHourInt)).
@@ -257,9 +275,11 @@ func (l *CronTask) computeStatistic() {
 
 	var allDayAiResponseInt, allDaySopRunInt, allDayFriendCountInt, allDayGroupCountInt, allDayAccountBalanceInt, allDayConsumeTokenInt, allDayActiveUserInt uint64
 	var allDayNewUserInt int64
+	var allDayConsumeCoinInt uint64
 	for orgID, wxinfos := range wxbotsSet {
 		var orgAiResponseInt, orgSopRunInt, orgFriendCountInt, orgGroupCountInt, orgAccountBalanceInt, orgConsumeTokenInt, orgActiveUserInt uint64
 		var orgNewUserInt int64
+		var orgDayConsumeCoinInt uint64
 		for _, wxinfo := range wxinfos {
 			l.Logger.Infof("开始计算日数据:%d\n", yesterdayInt)
 
@@ -275,6 +295,7 @@ func (l *CronTask) computeStatistic() {
 			}
 			var aiResponse, sopRun, totalFriend, totalGroup, accountBalance, consumeToken, activeUser uint64
 			var newUser int64
+			var consumeCoin uint64
 			for _, hourData := range hourDataBatch {
 				aiResponse += hourData.AiResponse
 				sopRun += hourData.SopRun
@@ -284,6 +305,7 @@ func (l *CronTask) computeStatistic() {
 				consumeToken += hourData.ConsumeToken
 				//activeUser += hourData.ActiveUser
 				newUser += hourData.NewUser
+				consumeCoin += hourData.ConsumeCoin
 			}
 
 			// 活跃好友:usage_detail 表 type = 1
@@ -303,6 +325,7 @@ func (l *CronTask) computeStatistic() {
 			orgConsumeTokenInt += consumeToken
 			orgActiveUserInt += activeUser
 			orgNewUserInt += newUser
+			orgDayConsumeCoinInt += consumeCoin
 
 			allDayAiResponseInt += aiResponse
 			allDaySopRunInt += sopRun
@@ -312,6 +335,7 @@ func (l *CronTask) computeStatistic() {
 			allDayConsumeTokenInt += consumeToken
 			allDayActiveUserInt += activeUser
 			allDayNewUserInt += newUser
+			allDayConsumeCoinInt += consumeCoin
 
 			// 先判断该账号是否已经统计了日数据,如果已经统计了,就不需要再统计了
 			dayDataCount, _ := l.svcCtx.DB.UsageStatisticDay.Query().Where(
@@ -333,6 +357,7 @@ func (l *CronTask) computeStatistic() {
 					SetTotalGroup(totalGroup).
 					SetAccountBalance(accountBalance).
 					SetConsumeToken(consumeToken).
+					SetConsumeCoin(consumeCoin).
 					SetActiveUser(activeUser).
 					SetNewUser(newUser).
 					SetLabelDist(lc).
@@ -363,6 +388,7 @@ func (l *CronTask) computeStatistic() {
 				SetTotalGroup(orgGroupCountInt).
 				SetAccountBalance(orgAccountBalanceInt).
 				SetConsumeToken(orgConsumeTokenInt).
+				SetConsumeCoin(orgDayConsumeCoinInt).
 				SetActiveUser(orgActiveUserInt).
 				SetNewUser(orgNewUserInt).
 				SetNotNilLabelDist(LabelsCountSet[orgID]).
@@ -394,6 +420,7 @@ func (l *CronTask) computeStatistic() {
 			SetTotalGroup(allDayGroupCountInt).
 			SetAccountBalance(allDayAccountBalanceInt).
 			SetConsumeToken(allDayConsumeTokenInt).
+			SetConsumeCoin(allDayConsumeCoinInt).
 			SetActiveUser(allDayActiveUserInt).
 			SetNewUser(allDayNewUserInt).
 			SetLabelDist(lc).

+ 1 - 0
desc/wechat/dashboard.api

@@ -31,6 +31,7 @@ type (
         ActiveUser *ChartsUint `json:"active_user"`
         NewUser *ChartsInt `json:"new_user"`
         LabelDist []LabelsData `json:"label_dist"`
+		ConsumeCoin *ChartsUint `json:"consume_coin"`
     }
 
     ChartsUint {

+ 2 - 0
desc/wechat/usage_detail.api

@@ -41,6 +41,8 @@ type (
         // 组织ID
         OrganizationId *uint64 `json:"organizationId,optional"`
 		OrganizationName *string `json:"organizationName,optional"`
+
+		Model *string `json:"model,optional"`
     }
 
     // The response data of UsageDetail list | UsageDetail列表数据

+ 24 - 26
ent/client.go

@@ -321,7 +321,7 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) {
 		Category:             NewCategoryClient(cfg),
 		ChatRecords:          NewChatRecordsClient(cfg),
 		ChatSession:          NewChatSessionClient(cfg),
-		CompapiAsynctask:    NewCompapiAsynctaskClient(cfg),
+		CompapiAsynctask:     NewCompapiAsynctaskClient(cfg),
 		Contact:              NewContactClient(cfg),
 		ContactField:         NewContactFieldClient(cfg),
 		ContactFieldTemplate: NewContactFieldTemplateClient(cfg),
@@ -386,7 +386,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error)
 		Category:             NewCategoryClient(cfg),
 		ChatRecords:          NewChatRecordsClient(cfg),
 		ChatSession:          NewChatSessionClient(cfg),
-		CompapiAsynctask:    NewCompapiAsynctaskClient(cfg),
+		CompapiAsynctask:     NewCompapiAsynctaskClient(cfg),
 		Contact:              NewContactClient(cfg),
 		ContactField:         NewContactFieldClient(cfg),
 		ContactFieldTemplate: NewContactFieldTemplateClient(cfg),
@@ -454,11 +454,10 @@ func (c *Client) Use(hooks ...Hook) {
 	for _, n := range []interface{ Use(...Hook) }{
 		c.Agent, c.AgentBase, c.AliyunAvatar, c.AllocAgent, c.ApiKey, c.BatchMsg,
 		c.Category, c.ChatRecords, c.ChatSession, c.CompapiAsynctask, c.Contact,
-		c.ContactField,
-		c.ContactFieldTemplate, c.CreditBalance, c.CreditUsage, c.Employee,
-		c.EmployeeConfig, c.Label, c.LabelRelationship, c.LabelTagging, c.Message,
-		c.MessageRecords, c.Msg, c.PayRecharge, c.Server, c.SopNode, c.SopStage,
-		c.SopTask, c.Token, c.Tutorial, c.UsageDetail, c.UsageStatisticDay,
+		c.ContactField, c.ContactFieldTemplate, c.CreditBalance, c.CreditUsage,
+		c.Employee, c.EmployeeConfig, c.Label, c.LabelRelationship, c.LabelTagging,
+		c.Message, c.MessageRecords, c.Msg, c.PayRecharge, c.Server, c.SopNode,
+		c.SopStage, c.SopTask, c.Token, c.Tutorial, c.UsageDetail, c.UsageStatisticDay,
 		c.UsageStatisticHour, c.UsageStatisticMonth, c.UsageTotal, c.Whatsapp,
 		c.WhatsappChannel, c.WorkExperience, c.WpChatroom, c.WpChatroomMember, c.Wx,
 		c.WxCard, c.WxCardUser, c.WxCardVisit, c.Xunji, c.XunjiService,
@@ -473,11 +472,10 @@ func (c *Client) Intercept(interceptors ...Interceptor) {
 	for _, n := range []interface{ Intercept(...Interceptor) }{
 		c.Agent, c.AgentBase, c.AliyunAvatar, c.AllocAgent, c.ApiKey, c.BatchMsg,
 		c.Category, c.ChatRecords, c.ChatSession, c.CompapiAsynctask, c.Contact,
-		c.ContactField,
-		c.ContactFieldTemplate, c.CreditBalance, c.CreditUsage, c.Employee,
-		c.EmployeeConfig, c.Label, c.LabelRelationship, c.LabelTagging, c.Message,
-		c.MessageRecords, c.Msg, c.PayRecharge, c.Server, c.SopNode, c.SopStage,
-		c.SopTask, c.Token, c.Tutorial, c.UsageDetail, c.UsageStatisticDay,
+		c.ContactField, c.ContactFieldTemplate, c.CreditBalance, c.CreditUsage,
+		c.Employee, c.EmployeeConfig, c.Label, c.LabelRelationship, c.LabelTagging,
+		c.Message, c.MessageRecords, c.Msg, c.PayRecharge, c.Server, c.SopNode,
+		c.SopStage, c.SopTask, c.Token, c.Tutorial, c.UsageDetail, c.UsageStatisticDay,
 		c.UsageStatisticHour, c.UsageStatisticMonth, c.UsageTotal, c.Whatsapp,
 		c.WhatsappChannel, c.WorkExperience, c.WpChatroom, c.WpChatroomMember, c.Wx,
 		c.WxCard, c.WxCardUser, c.WxCardVisit, c.Xunji, c.XunjiService,
@@ -7308,23 +7306,23 @@ func (c *XunjiServiceClient) mutate(ctx context.Context, m *XunjiServiceMutation
 type (
 	hooks struct {
 		Agent, AgentBase, AliyunAvatar, AllocAgent, ApiKey, BatchMsg, Category,
-		ChatRecords, ChatSession, CompapiAsynctask, Contact, ContactField, ContactFieldTemplate,
-		CreditBalance, CreditUsage, Employee, EmployeeConfig, Label, LabelRelationship,
-		LabelTagging, Message, MessageRecords, Msg, PayRecharge, Server, SopNode,
-		SopStage, SopTask, Token, Tutorial, UsageDetail, UsageStatisticDay,
-		UsageStatisticHour, UsageStatisticMonth, UsageTotal, Whatsapp, WhatsappChannel,
-		WorkExperience, WpChatroom, WpChatroomMember, Wx, WxCard, WxCardUser,
-		WxCardVisit, Xunji, XunjiService []ent.Hook
+		ChatRecords, ChatSession, CompapiAsynctask, Contact, ContactField,
+		ContactFieldTemplate, CreditBalance, CreditUsage, Employee, EmployeeConfig,
+		Label, LabelRelationship, LabelTagging, Message, MessageRecords, Msg,
+		PayRecharge, Server, SopNode, SopStage, SopTask, Token, Tutorial, UsageDetail,
+		UsageStatisticDay, UsageStatisticHour, UsageStatisticMonth, UsageTotal,
+		Whatsapp, WhatsappChannel, WorkExperience, WpChatroom, WpChatroomMember, Wx,
+		WxCard, WxCardUser, WxCardVisit, Xunji, XunjiService []ent.Hook
 	}
 	inters struct {
 		Agent, AgentBase, AliyunAvatar, AllocAgent, ApiKey, BatchMsg, Category,
-		ChatRecords, ChatSession, CompapiAsynctask, Contact, ContactField, ContactFieldTemplate,
-		CreditBalance, CreditUsage, Employee, EmployeeConfig, Label, LabelRelationship,
-		LabelTagging, Message, MessageRecords, Msg, PayRecharge, Server, SopNode,
-		SopStage, SopTask, Token, Tutorial, UsageDetail, UsageStatisticDay,
-		UsageStatisticHour, UsageStatisticMonth, UsageTotal, Whatsapp, WhatsappChannel,
-		WorkExperience, WpChatroom, WpChatroomMember, Wx, WxCard, WxCardUser,
-		WxCardVisit, Xunji, XunjiService []ent.Interceptor
+		ChatRecords, ChatSession, CompapiAsynctask, Contact, ContactField,
+		ContactFieldTemplate, CreditBalance, CreditUsage, Employee, EmployeeConfig,
+		Label, LabelRelationship, LabelTagging, Message, MessageRecords, Msg,
+		PayRecharge, Server, SopNode, SopStage, SopTask, Token, Tutorial, UsageDetail,
+		UsageStatisticDay, UsageStatisticHour, UsageStatisticMonth, UsageTotal,
+		Whatsapp, WhatsappChannel, WorkExperience, WpChatroom, WpChatroomMember, Wx,
+		WxCard, WxCardUser, WxCardVisit, Xunji, XunjiService []ent.Interceptor
 	}
 )
 

+ 1 - 1
ent/ent.go

@@ -127,7 +127,7 @@ func checkColumn(table, column string) error {
 			category.Table:             category.ValidColumn,
 			chatrecords.Table:          chatrecords.ValidColumn,
 			chatsession.Table:          chatsession.ValidColumn,
-			compapiasynctask.Table:    compapiasynctask.ValidColumn,
+			compapiasynctask.Table:     compapiasynctask.ValidColumn,
 			contact.Table:              contact.ValidColumn,
 			contactfield.Table:         contactfield.ValidColumn,
 			contactfieldtemplate.Table: contactfieldtemplate.ValidColumn,

+ 4 - 0
ent/migrate/schema.go

@@ -998,6 +998,7 @@ var (
 		{Name: "prompt_tokens", Type: field.TypeUint64, Nullable: true, Comment: "请求token数", Default: 0},
 		{Name: "completion_tokens", Type: field.TypeUint64, Nullable: true, Comment: "响应token数", Default: 0},
 		{Name: "organization_id", Type: field.TypeUint64, Nullable: true, Comment: "机构 ID", Default: 1},
+		{Name: "model", Type: field.TypeString, Nullable: true, Comment: "模型", Default: "GPT-4o mini"},
 	}
 	// UsageDetailTable holds the schema information for the "usage_detail" table.
 	UsageDetailTable = &schema.Table{
@@ -1037,6 +1038,7 @@ var (
 		{Name: "active_user", Type: field.TypeUint64, Comment: "活跃用户数"},
 		{Name: "new_user", Type: field.TypeInt64, Comment: "新增用户数"},
 		{Name: "label_dist", Type: field.TypeJSON, Comment: "标签分布"},
+		{Name: "consume_coin", Type: field.TypeUint64, Nullable: true, Comment: "消耗积分", Default: 0},
 	}
 	// UsageStatisticDayTable holds the schema information for the "usage_statistic_day" table.
 	UsageStatisticDayTable = &schema.Table{
@@ -1076,6 +1078,7 @@ var (
 		{Name: "active_user", Type: field.TypeUint64, Comment: "活跃用户数"},
 		{Name: "new_user", Type: field.TypeInt64, Comment: "新增用户数"},
 		{Name: "label_dist", Type: field.TypeJSON, Comment: "标签分布"},
+		{Name: "consume_coin", Type: field.TypeUint64, Nullable: true, Comment: "消耗积分", Default: 0},
 	}
 	// UsageStatisticHourTable holds the schema information for the "usage_statistic_hour" table.
 	UsageStatisticHourTable = &schema.Table{
@@ -1115,6 +1118,7 @@ var (
 		{Name: "active_user", Type: field.TypeUint64, Comment: "活跃用户数"},
 		{Name: "new_user", Type: field.TypeInt64, Comment: "新增用户数"},
 		{Name: "label_dist", Type: field.TypeJSON, Comment: "标签分布"},
+		{Name: "consume_coin", Type: field.TypeUint64, Nullable: true, Comment: "消耗积分", Default: 0},
 	}
 	// UsageStatisticMonthTable holds the schema information for the "usage_statistic_month" table.
 	UsageStatisticMonthTable = &schema.Table{

+ 399 - 5
ent/mutation.go

@@ -79,7 +79,7 @@ const (
 	TypeCategory             = "Category"
 	TypeChatRecords          = "ChatRecords"
 	TypeChatSession          = "ChatSession"
-	TypeCompapiAsynctask    = "CompapiAsynctask"
+	TypeCompapiAsynctask     = "CompapiAsynctask"
 	TypeContact              = "Contact"
 	TypeContactField         = "ContactField"
 	TypeContactFieldTemplate = "ContactFieldTemplate"
@@ -35613,6 +35613,7 @@ type UsageDetailMutation struct {
 	addcompletion_tokens *int64
 	organization_id      *uint64
 	addorganization_id   *int64
+	model                *string
 	clearedFields        map[string]struct{}
 	done                 bool
 	oldValue             func(context.Context) (*UsageDetail, error)
@@ -36535,6 +36536,55 @@ func (m *UsageDetailMutation) ResetOrganizationID() {
 	delete(m.clearedFields, usagedetail.FieldOrganizationID)
 }
 
+// SetModel sets the "model" field.
+func (m *UsageDetailMutation) SetModel(s string) {
+	m.model = &s
+}
+
+// Model returns the value of the "model" field in the mutation.
+func (m *UsageDetailMutation) Model() (r string, exists bool) {
+	v := m.model
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// OldModel returns the old "model" field's value of the UsageDetail entity.
+// If the UsageDetail object wasn't provided to the builder, the object is fetched from the database.
+// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
+func (m *UsageDetailMutation) OldModel(ctx context.Context) (v string, err error) {
+	if !m.op.Is(OpUpdateOne) {
+		return v, errors.New("OldModel is only allowed on UpdateOne operations")
+	}
+	if m.id == nil || m.oldValue == nil {
+		return v, errors.New("OldModel requires an ID field in the mutation")
+	}
+	oldValue, err := m.oldValue(ctx)
+	if err != nil {
+		return v, fmt.Errorf("querying old value for OldModel: %w", err)
+	}
+	return oldValue.Model, nil
+}
+
+// ClearModel clears the value of the "model" field.
+func (m *UsageDetailMutation) ClearModel() {
+	m.model = nil
+	m.clearedFields[usagedetail.FieldModel] = struct{}{}
+}
+
+// ModelCleared returns if the "model" field was cleared in this mutation.
+func (m *UsageDetailMutation) ModelCleared() bool {
+	_, ok := m.clearedFields[usagedetail.FieldModel]
+	return ok
+}
+
+// ResetModel resets all changes to the "model" field.
+func (m *UsageDetailMutation) ResetModel() {
+	m.model = nil
+	delete(m.clearedFields, usagedetail.FieldModel)
+}
+
 // Where appends a list predicates to the UsageDetailMutation builder.
 func (m *UsageDetailMutation) Where(ps ...predicate.UsageDetail) {
 	m.predicates = append(m.predicates, ps...)
@@ -36569,7 +36619,7 @@ func (m *UsageDetailMutation) Type() string {
 // order to get all numeric fields that were incremented/decremented, call
 // AddedFields().
 func (m *UsageDetailMutation) Fields() []string {
-	fields := make([]string, 0, 15)
+	fields := make([]string, 0, 16)
 	if m.created_at != nil {
 		fields = append(fields, usagedetail.FieldCreatedAt)
 	}
@@ -36615,6 +36665,9 @@ func (m *UsageDetailMutation) Fields() []string {
 	if m.organization_id != nil {
 		fields = append(fields, usagedetail.FieldOrganizationID)
 	}
+	if m.model != nil {
+		fields = append(fields, usagedetail.FieldModel)
+	}
 	return fields
 }
 
@@ -36653,6 +36706,8 @@ func (m *UsageDetailMutation) Field(name string) (ent.Value, bool) {
 		return m.CompletionTokens()
 	case usagedetail.FieldOrganizationID:
 		return m.OrganizationID()
+	case usagedetail.FieldModel:
+		return m.Model()
 	}
 	return nil, false
 }
@@ -36692,6 +36747,8 @@ func (m *UsageDetailMutation) OldField(ctx context.Context, name string) (ent.Va
 		return m.OldCompletionTokens(ctx)
 	case usagedetail.FieldOrganizationID:
 		return m.OldOrganizationID(ctx)
+	case usagedetail.FieldModel:
+		return m.OldModel(ctx)
 	}
 	return nil, fmt.Errorf("unknown UsageDetail field %s", name)
 }
@@ -36806,6 +36863,13 @@ func (m *UsageDetailMutation) SetField(name string, value ent.Value) error {
 		}
 		m.SetOrganizationID(v)
 		return nil
+	case usagedetail.FieldModel:
+		v, ok := value.(string)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.SetModel(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageDetail field %s", name)
 }
@@ -36959,6 +37023,9 @@ func (m *UsageDetailMutation) ClearedFields() []string {
 	if m.FieldCleared(usagedetail.FieldOrganizationID) {
 		fields = append(fields, usagedetail.FieldOrganizationID)
 	}
+	if m.FieldCleared(usagedetail.FieldModel) {
+		fields = append(fields, usagedetail.FieldModel)
+	}
 	return fields
 }
 
@@ -36997,6 +37064,9 @@ func (m *UsageDetailMutation) ClearField(name string) error {
 	case usagedetail.FieldOrganizationID:
 		m.ClearOrganizationID()
 		return nil
+	case usagedetail.FieldModel:
+		m.ClearModel()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageDetail nullable field %s", name)
 }
@@ -37050,6 +37120,9 @@ func (m *UsageDetailMutation) ResetField(name string) error {
 	case usagedetail.FieldOrganizationID:
 		m.ResetOrganizationID()
 		return nil
+	case usagedetail.FieldModel:
+		m.ResetModel()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageDetail field %s", name)
 }
@@ -37138,6 +37211,8 @@ type UsageStatisticDayMutation struct {
 	addnew_user        *int64
 	label_dist         *[]custom_types.LabelDist
 	appendlabel_dist   []custom_types.LabelDist
+	consume_coin       *uint64
+	addconsume_coin    *int64
 	clearedFields      map[string]struct{}
 	done               bool
 	oldValue           func(context.Context) (*UsageStatisticDay, error)
@@ -38169,6 +38244,76 @@ func (m *UsageStatisticDayMutation) ResetLabelDist() {
 	m.appendlabel_dist = nil
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (m *UsageStatisticDayMutation) SetConsumeCoin(u uint64) {
+	m.consume_coin = &u
+	m.addconsume_coin = nil
+}
+
+// ConsumeCoin returns the value of the "consume_coin" field in the mutation.
+func (m *UsageStatisticDayMutation) ConsumeCoin() (r uint64, exists bool) {
+	v := m.consume_coin
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// OldConsumeCoin returns the old "consume_coin" field's value of the UsageStatisticDay entity.
+// If the UsageStatisticDay object wasn't provided to the builder, the object is fetched from the database.
+// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
+func (m *UsageStatisticDayMutation) OldConsumeCoin(ctx context.Context) (v uint64, err error) {
+	if !m.op.Is(OpUpdateOne) {
+		return v, errors.New("OldConsumeCoin is only allowed on UpdateOne operations")
+	}
+	if m.id == nil || m.oldValue == nil {
+		return v, errors.New("OldConsumeCoin requires an ID field in the mutation")
+	}
+	oldValue, err := m.oldValue(ctx)
+	if err != nil {
+		return v, fmt.Errorf("querying old value for OldConsumeCoin: %w", err)
+	}
+	return oldValue.ConsumeCoin, nil
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (m *UsageStatisticDayMutation) AddConsumeCoin(u int64) {
+	if m.addconsume_coin != nil {
+		*m.addconsume_coin += u
+	} else {
+		m.addconsume_coin = &u
+	}
+}
+
+// AddedConsumeCoin returns the value that was added to the "consume_coin" field in this mutation.
+func (m *UsageStatisticDayMutation) AddedConsumeCoin() (r int64, exists bool) {
+	v := m.addconsume_coin
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (m *UsageStatisticDayMutation) ClearConsumeCoin() {
+	m.consume_coin = nil
+	m.addconsume_coin = nil
+	m.clearedFields[usagestatisticday.FieldConsumeCoin] = struct{}{}
+}
+
+// ConsumeCoinCleared returns if the "consume_coin" field was cleared in this mutation.
+func (m *UsageStatisticDayMutation) ConsumeCoinCleared() bool {
+	_, ok := m.clearedFields[usagestatisticday.FieldConsumeCoin]
+	return ok
+}
+
+// ResetConsumeCoin resets all changes to the "consume_coin" field.
+func (m *UsageStatisticDayMutation) ResetConsumeCoin() {
+	m.consume_coin = nil
+	m.addconsume_coin = nil
+	delete(m.clearedFields, usagestatisticday.FieldConsumeCoin)
+}
+
 // Where appends a list predicates to the UsageStatisticDayMutation builder.
 func (m *UsageStatisticDayMutation) Where(ps ...predicate.UsageStatisticDay) {
 	m.predicates = append(m.predicates, ps...)
@@ -38203,7 +38348,7 @@ func (m *UsageStatisticDayMutation) Type() string {
 // order to get all numeric fields that were incremented/decremented, call
 // AddedFields().
 func (m *UsageStatisticDayMutation) Fields() []string {
-	fields := make([]string, 0, 17)
+	fields := make([]string, 0, 18)
 	if m.created_at != nil {
 		fields = append(fields, usagestatisticday.FieldCreatedAt)
 	}
@@ -38255,6 +38400,9 @@ func (m *UsageStatisticDayMutation) Fields() []string {
 	if m.label_dist != nil {
 		fields = append(fields, usagestatisticday.FieldLabelDist)
 	}
+	if m.consume_coin != nil {
+		fields = append(fields, usagestatisticday.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -38297,6 +38445,8 @@ func (m *UsageStatisticDayMutation) Field(name string) (ent.Value, bool) {
 		return m.NewUser()
 	case usagestatisticday.FieldLabelDist:
 		return m.LabelDist()
+	case usagestatisticday.FieldConsumeCoin:
+		return m.ConsumeCoin()
 	}
 	return nil, false
 }
@@ -38340,6 +38490,8 @@ func (m *UsageStatisticDayMutation) OldField(ctx context.Context, name string) (
 		return m.OldNewUser(ctx)
 	case usagestatisticday.FieldLabelDist:
 		return m.OldLabelDist(ctx)
+	case usagestatisticday.FieldConsumeCoin:
+		return m.OldConsumeCoin(ctx)
 	}
 	return nil, fmt.Errorf("unknown UsageStatisticDay field %s", name)
 }
@@ -38468,6 +38620,13 @@ func (m *UsageStatisticDayMutation) SetField(name string, value ent.Value) error
 		}
 		m.SetLabelDist(v)
 		return nil
+	case usagestatisticday.FieldConsumeCoin:
+		v, ok := value.(uint64)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.SetConsumeCoin(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticDay field %s", name)
 }
@@ -38512,6 +38671,9 @@ func (m *UsageStatisticDayMutation) AddedFields() []string {
 	if m.addnew_user != nil {
 		fields = append(fields, usagestatisticday.FieldNewUser)
 	}
+	if m.addconsume_coin != nil {
+		fields = append(fields, usagestatisticday.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -38544,6 +38706,8 @@ func (m *UsageStatisticDayMutation) AddedField(name string) (ent.Value, bool) {
 		return m.AddedActiveUser()
 	case usagestatisticday.FieldNewUser:
 		return m.AddedNewUser()
+	case usagestatisticday.FieldConsumeCoin:
+		return m.AddedConsumeCoin()
 	}
 	return nil, false
 }
@@ -38637,6 +38801,13 @@ func (m *UsageStatisticDayMutation) AddField(name string, value ent.Value) error
 		}
 		m.AddNewUser(v)
 		return nil
+	case usagestatisticday.FieldConsumeCoin:
+		v, ok := value.(int64)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.AddConsumeCoin(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticDay numeric field %s", name)
 }
@@ -38657,6 +38828,9 @@ func (m *UsageStatisticDayMutation) ClearedFields() []string {
 	if m.FieldCleared(usagestatisticday.FieldOrganizationID) {
 		fields = append(fields, usagestatisticday.FieldOrganizationID)
 	}
+	if m.FieldCleared(usagestatisticday.FieldConsumeCoin) {
+		fields = append(fields, usagestatisticday.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -38683,6 +38857,9 @@ func (m *UsageStatisticDayMutation) ClearField(name string) error {
 	case usagestatisticday.FieldOrganizationID:
 		m.ClearOrganizationID()
 		return nil
+	case usagestatisticday.FieldConsumeCoin:
+		m.ClearConsumeCoin()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticDay nullable field %s", name)
 }
@@ -38742,6 +38919,9 @@ func (m *UsageStatisticDayMutation) ResetField(name string) error {
 	case usagestatisticday.FieldLabelDist:
 		m.ResetLabelDist()
 		return nil
+	case usagestatisticday.FieldConsumeCoin:
+		m.ResetConsumeCoin()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticDay field %s", name)
 }
@@ -38830,6 +39010,8 @@ type UsageStatisticHourMutation struct {
 	addnew_user        *int64
 	label_dist         *[]custom_types.LabelDist
 	appendlabel_dist   []custom_types.LabelDist
+	consume_coin       *uint64
+	addconsume_coin    *int64
 	clearedFields      map[string]struct{}
 	done               bool
 	oldValue           func(context.Context) (*UsageStatisticHour, error)
@@ -39861,6 +40043,76 @@ func (m *UsageStatisticHourMutation) ResetLabelDist() {
 	m.appendlabel_dist = nil
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (m *UsageStatisticHourMutation) SetConsumeCoin(u uint64) {
+	m.consume_coin = &u
+	m.addconsume_coin = nil
+}
+
+// ConsumeCoin returns the value of the "consume_coin" field in the mutation.
+func (m *UsageStatisticHourMutation) ConsumeCoin() (r uint64, exists bool) {
+	v := m.consume_coin
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// OldConsumeCoin returns the old "consume_coin" field's value of the UsageStatisticHour entity.
+// If the UsageStatisticHour object wasn't provided to the builder, the object is fetched from the database.
+// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
+func (m *UsageStatisticHourMutation) OldConsumeCoin(ctx context.Context) (v uint64, err error) {
+	if !m.op.Is(OpUpdateOne) {
+		return v, errors.New("OldConsumeCoin is only allowed on UpdateOne operations")
+	}
+	if m.id == nil || m.oldValue == nil {
+		return v, errors.New("OldConsumeCoin requires an ID field in the mutation")
+	}
+	oldValue, err := m.oldValue(ctx)
+	if err != nil {
+		return v, fmt.Errorf("querying old value for OldConsumeCoin: %w", err)
+	}
+	return oldValue.ConsumeCoin, nil
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (m *UsageStatisticHourMutation) AddConsumeCoin(u int64) {
+	if m.addconsume_coin != nil {
+		*m.addconsume_coin += u
+	} else {
+		m.addconsume_coin = &u
+	}
+}
+
+// AddedConsumeCoin returns the value that was added to the "consume_coin" field in this mutation.
+func (m *UsageStatisticHourMutation) AddedConsumeCoin() (r int64, exists bool) {
+	v := m.addconsume_coin
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (m *UsageStatisticHourMutation) ClearConsumeCoin() {
+	m.consume_coin = nil
+	m.addconsume_coin = nil
+	m.clearedFields[usagestatistichour.FieldConsumeCoin] = struct{}{}
+}
+
+// ConsumeCoinCleared returns if the "consume_coin" field was cleared in this mutation.
+func (m *UsageStatisticHourMutation) ConsumeCoinCleared() bool {
+	_, ok := m.clearedFields[usagestatistichour.FieldConsumeCoin]
+	return ok
+}
+
+// ResetConsumeCoin resets all changes to the "consume_coin" field.
+func (m *UsageStatisticHourMutation) ResetConsumeCoin() {
+	m.consume_coin = nil
+	m.addconsume_coin = nil
+	delete(m.clearedFields, usagestatistichour.FieldConsumeCoin)
+}
+
 // Where appends a list predicates to the UsageStatisticHourMutation builder.
 func (m *UsageStatisticHourMutation) Where(ps ...predicate.UsageStatisticHour) {
 	m.predicates = append(m.predicates, ps...)
@@ -39895,7 +40147,7 @@ func (m *UsageStatisticHourMutation) Type() string {
 // order to get all numeric fields that were incremented/decremented, call
 // AddedFields().
 func (m *UsageStatisticHourMutation) Fields() []string {
-	fields := make([]string, 0, 17)
+	fields := make([]string, 0, 18)
 	if m.created_at != nil {
 		fields = append(fields, usagestatistichour.FieldCreatedAt)
 	}
@@ -39947,6 +40199,9 @@ func (m *UsageStatisticHourMutation) Fields() []string {
 	if m.label_dist != nil {
 		fields = append(fields, usagestatistichour.FieldLabelDist)
 	}
+	if m.consume_coin != nil {
+		fields = append(fields, usagestatistichour.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -39989,6 +40244,8 @@ func (m *UsageStatisticHourMutation) Field(name string) (ent.Value, bool) {
 		return m.NewUser()
 	case usagestatistichour.FieldLabelDist:
 		return m.LabelDist()
+	case usagestatistichour.FieldConsumeCoin:
+		return m.ConsumeCoin()
 	}
 	return nil, false
 }
@@ -40032,6 +40289,8 @@ func (m *UsageStatisticHourMutation) OldField(ctx context.Context, name string)
 		return m.OldNewUser(ctx)
 	case usagestatistichour.FieldLabelDist:
 		return m.OldLabelDist(ctx)
+	case usagestatistichour.FieldConsumeCoin:
+		return m.OldConsumeCoin(ctx)
 	}
 	return nil, fmt.Errorf("unknown UsageStatisticHour field %s", name)
 }
@@ -40160,6 +40419,13 @@ func (m *UsageStatisticHourMutation) SetField(name string, value ent.Value) erro
 		}
 		m.SetLabelDist(v)
 		return nil
+	case usagestatistichour.FieldConsumeCoin:
+		v, ok := value.(uint64)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.SetConsumeCoin(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticHour field %s", name)
 }
@@ -40204,6 +40470,9 @@ func (m *UsageStatisticHourMutation) AddedFields() []string {
 	if m.addnew_user != nil {
 		fields = append(fields, usagestatistichour.FieldNewUser)
 	}
+	if m.addconsume_coin != nil {
+		fields = append(fields, usagestatistichour.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -40236,6 +40505,8 @@ func (m *UsageStatisticHourMutation) AddedField(name string) (ent.Value, bool) {
 		return m.AddedActiveUser()
 	case usagestatistichour.FieldNewUser:
 		return m.AddedNewUser()
+	case usagestatistichour.FieldConsumeCoin:
+		return m.AddedConsumeCoin()
 	}
 	return nil, false
 }
@@ -40329,6 +40600,13 @@ func (m *UsageStatisticHourMutation) AddField(name string, value ent.Value) erro
 		}
 		m.AddNewUser(v)
 		return nil
+	case usagestatistichour.FieldConsumeCoin:
+		v, ok := value.(int64)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.AddConsumeCoin(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticHour numeric field %s", name)
 }
@@ -40349,6 +40627,9 @@ func (m *UsageStatisticHourMutation) ClearedFields() []string {
 	if m.FieldCleared(usagestatistichour.FieldOrganizationID) {
 		fields = append(fields, usagestatistichour.FieldOrganizationID)
 	}
+	if m.FieldCleared(usagestatistichour.FieldConsumeCoin) {
+		fields = append(fields, usagestatistichour.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -40375,6 +40656,9 @@ func (m *UsageStatisticHourMutation) ClearField(name string) error {
 	case usagestatistichour.FieldOrganizationID:
 		m.ClearOrganizationID()
 		return nil
+	case usagestatistichour.FieldConsumeCoin:
+		m.ClearConsumeCoin()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticHour nullable field %s", name)
 }
@@ -40434,6 +40718,9 @@ func (m *UsageStatisticHourMutation) ResetField(name string) error {
 	case usagestatistichour.FieldLabelDist:
 		m.ResetLabelDist()
 		return nil
+	case usagestatistichour.FieldConsumeCoin:
+		m.ResetConsumeCoin()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticHour field %s", name)
 }
@@ -40522,6 +40809,8 @@ type UsageStatisticMonthMutation struct {
 	addnew_user        *int64
 	label_dist         *[]custom_types.LabelDist
 	appendlabel_dist   []custom_types.LabelDist
+	consume_coin       *uint64
+	addconsume_coin    *int64
 	clearedFields      map[string]struct{}
 	done               bool
 	oldValue           func(context.Context) (*UsageStatisticMonth, error)
@@ -41553,6 +41842,76 @@ func (m *UsageStatisticMonthMutation) ResetLabelDist() {
 	m.appendlabel_dist = nil
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (m *UsageStatisticMonthMutation) SetConsumeCoin(u uint64) {
+	m.consume_coin = &u
+	m.addconsume_coin = nil
+}
+
+// ConsumeCoin returns the value of the "consume_coin" field in the mutation.
+func (m *UsageStatisticMonthMutation) ConsumeCoin() (r uint64, exists bool) {
+	v := m.consume_coin
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// OldConsumeCoin returns the old "consume_coin" field's value of the UsageStatisticMonth entity.
+// If the UsageStatisticMonth object wasn't provided to the builder, the object is fetched from the database.
+// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
+func (m *UsageStatisticMonthMutation) OldConsumeCoin(ctx context.Context) (v uint64, err error) {
+	if !m.op.Is(OpUpdateOne) {
+		return v, errors.New("OldConsumeCoin is only allowed on UpdateOne operations")
+	}
+	if m.id == nil || m.oldValue == nil {
+		return v, errors.New("OldConsumeCoin requires an ID field in the mutation")
+	}
+	oldValue, err := m.oldValue(ctx)
+	if err != nil {
+		return v, fmt.Errorf("querying old value for OldConsumeCoin: %w", err)
+	}
+	return oldValue.ConsumeCoin, nil
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (m *UsageStatisticMonthMutation) AddConsumeCoin(u int64) {
+	if m.addconsume_coin != nil {
+		*m.addconsume_coin += u
+	} else {
+		m.addconsume_coin = &u
+	}
+}
+
+// AddedConsumeCoin returns the value that was added to the "consume_coin" field in this mutation.
+func (m *UsageStatisticMonthMutation) AddedConsumeCoin() (r int64, exists bool) {
+	v := m.addconsume_coin
+	if v == nil {
+		return
+	}
+	return *v, true
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (m *UsageStatisticMonthMutation) ClearConsumeCoin() {
+	m.consume_coin = nil
+	m.addconsume_coin = nil
+	m.clearedFields[usagestatisticmonth.FieldConsumeCoin] = struct{}{}
+}
+
+// ConsumeCoinCleared returns if the "consume_coin" field was cleared in this mutation.
+func (m *UsageStatisticMonthMutation) ConsumeCoinCleared() bool {
+	_, ok := m.clearedFields[usagestatisticmonth.FieldConsumeCoin]
+	return ok
+}
+
+// ResetConsumeCoin resets all changes to the "consume_coin" field.
+func (m *UsageStatisticMonthMutation) ResetConsumeCoin() {
+	m.consume_coin = nil
+	m.addconsume_coin = nil
+	delete(m.clearedFields, usagestatisticmonth.FieldConsumeCoin)
+}
+
 // Where appends a list predicates to the UsageStatisticMonthMutation builder.
 func (m *UsageStatisticMonthMutation) Where(ps ...predicate.UsageStatisticMonth) {
 	m.predicates = append(m.predicates, ps...)
@@ -41587,7 +41946,7 @@ func (m *UsageStatisticMonthMutation) Type() string {
 // order to get all numeric fields that were incremented/decremented, call
 // AddedFields().
 func (m *UsageStatisticMonthMutation) Fields() []string {
-	fields := make([]string, 0, 17)
+	fields := make([]string, 0, 18)
 	if m.created_at != nil {
 		fields = append(fields, usagestatisticmonth.FieldCreatedAt)
 	}
@@ -41639,6 +41998,9 @@ func (m *UsageStatisticMonthMutation) Fields() []string {
 	if m.label_dist != nil {
 		fields = append(fields, usagestatisticmonth.FieldLabelDist)
 	}
+	if m.consume_coin != nil {
+		fields = append(fields, usagestatisticmonth.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -41681,6 +42043,8 @@ func (m *UsageStatisticMonthMutation) Field(name string) (ent.Value, bool) {
 		return m.NewUser()
 	case usagestatisticmonth.FieldLabelDist:
 		return m.LabelDist()
+	case usagestatisticmonth.FieldConsumeCoin:
+		return m.ConsumeCoin()
 	}
 	return nil, false
 }
@@ -41724,6 +42088,8 @@ func (m *UsageStatisticMonthMutation) OldField(ctx context.Context, name string)
 		return m.OldNewUser(ctx)
 	case usagestatisticmonth.FieldLabelDist:
 		return m.OldLabelDist(ctx)
+	case usagestatisticmonth.FieldConsumeCoin:
+		return m.OldConsumeCoin(ctx)
 	}
 	return nil, fmt.Errorf("unknown UsageStatisticMonth field %s", name)
 }
@@ -41852,6 +42218,13 @@ func (m *UsageStatisticMonthMutation) SetField(name string, value ent.Value) err
 		}
 		m.SetLabelDist(v)
 		return nil
+	case usagestatisticmonth.FieldConsumeCoin:
+		v, ok := value.(uint64)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.SetConsumeCoin(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticMonth field %s", name)
 }
@@ -41896,6 +42269,9 @@ func (m *UsageStatisticMonthMutation) AddedFields() []string {
 	if m.addnew_user != nil {
 		fields = append(fields, usagestatisticmonth.FieldNewUser)
 	}
+	if m.addconsume_coin != nil {
+		fields = append(fields, usagestatisticmonth.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -41928,6 +42304,8 @@ func (m *UsageStatisticMonthMutation) AddedField(name string) (ent.Value, bool)
 		return m.AddedActiveUser()
 	case usagestatisticmonth.FieldNewUser:
 		return m.AddedNewUser()
+	case usagestatisticmonth.FieldConsumeCoin:
+		return m.AddedConsumeCoin()
 	}
 	return nil, false
 }
@@ -42021,6 +42399,13 @@ func (m *UsageStatisticMonthMutation) AddField(name string, value ent.Value) err
 		}
 		m.AddNewUser(v)
 		return nil
+	case usagestatisticmonth.FieldConsumeCoin:
+		v, ok := value.(int64)
+		if !ok {
+			return fmt.Errorf("unexpected type %T for field %s", value, name)
+		}
+		m.AddConsumeCoin(v)
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticMonth numeric field %s", name)
 }
@@ -42041,6 +42426,9 @@ func (m *UsageStatisticMonthMutation) ClearedFields() []string {
 	if m.FieldCleared(usagestatisticmonth.FieldOrganizationID) {
 		fields = append(fields, usagestatisticmonth.FieldOrganizationID)
 	}
+	if m.FieldCleared(usagestatisticmonth.FieldConsumeCoin) {
+		fields = append(fields, usagestatisticmonth.FieldConsumeCoin)
+	}
 	return fields
 }
 
@@ -42067,6 +42455,9 @@ func (m *UsageStatisticMonthMutation) ClearField(name string) error {
 	case usagestatisticmonth.FieldOrganizationID:
 		m.ClearOrganizationID()
 		return nil
+	case usagestatisticmonth.FieldConsumeCoin:
+		m.ClearConsumeCoin()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticMonth nullable field %s", name)
 }
@@ -42126,6 +42517,9 @@ func (m *UsageStatisticMonthMutation) ResetField(name string) error {
 	case usagestatisticmonth.FieldLabelDist:
 		m.ResetLabelDist()
 		return nil
+	case usagestatisticmonth.FieldConsumeCoin:
+		m.ResetConsumeCoin()
+		return nil
 	}
 	return fmt.Errorf("unknown UsageStatisticMonth field %s", name)
 }

+ 16 - 0
ent/runtime/runtime.go

@@ -1404,6 +1404,10 @@ func init() {
 	usagedetailDescOrganizationID := usagedetailFields[11].Descriptor()
 	// usagedetail.DefaultOrganizationID holds the default value on creation for the organization_id field.
 	usagedetail.DefaultOrganizationID = usagedetailDescOrganizationID.Default.(uint64)
+	// usagedetailDescModel is the schema descriptor for model field.
+	usagedetailDescModel := usagedetailFields[12].Descriptor()
+	// usagedetail.DefaultModel holds the default value on creation for the model field.
+	usagedetail.DefaultModel = usagedetailDescModel.Default.(string)
 	usagestatisticdayMixin := schema.UsageStatisticDay{}.Mixin()
 	usagestatisticdayMixinHooks2 := usagestatisticdayMixin[2].Hooks()
 	usagestatisticday.Hooks[0] = usagestatisticdayMixinHooks2[0]
@@ -1429,6 +1433,10 @@ func init() {
 	usagestatisticdayDescStatus := usagestatisticdayMixinFields1[0].Descriptor()
 	// usagestatisticday.DefaultStatus holds the default value on creation for the status field.
 	usagestatisticday.DefaultStatus = usagestatisticdayDescStatus.Default.(uint8)
+	// usagestatisticdayDescConsumeCoin is the schema descriptor for consume_coin field.
+	usagestatisticdayDescConsumeCoin := usagestatisticdayFields[13].Descriptor()
+	// usagestatisticday.DefaultConsumeCoin holds the default value on creation for the consume_coin field.
+	usagestatisticday.DefaultConsumeCoin = usagestatisticdayDescConsumeCoin.Default.(uint64)
 	usagestatistichourMixin := schema.UsageStatisticHour{}.Mixin()
 	usagestatistichourMixinHooks2 := usagestatistichourMixin[2].Hooks()
 	usagestatistichour.Hooks[0] = usagestatistichourMixinHooks2[0]
@@ -1454,6 +1462,10 @@ func init() {
 	usagestatistichourDescStatus := usagestatistichourMixinFields1[0].Descriptor()
 	// usagestatistichour.DefaultStatus holds the default value on creation for the status field.
 	usagestatistichour.DefaultStatus = usagestatistichourDescStatus.Default.(uint8)
+	// usagestatistichourDescConsumeCoin is the schema descriptor for consume_coin field.
+	usagestatistichourDescConsumeCoin := usagestatistichourFields[13].Descriptor()
+	// usagestatistichour.DefaultConsumeCoin holds the default value on creation for the consume_coin field.
+	usagestatistichour.DefaultConsumeCoin = usagestatistichourDescConsumeCoin.Default.(uint64)
 	usagestatisticmonthMixin := schema.UsageStatisticMonth{}.Mixin()
 	usagestatisticmonthMixinHooks2 := usagestatisticmonthMixin[2].Hooks()
 	usagestatisticmonth.Hooks[0] = usagestatisticmonthMixinHooks2[0]
@@ -1479,6 +1491,10 @@ func init() {
 	usagestatisticmonthDescStatus := usagestatisticmonthMixinFields1[0].Descriptor()
 	// usagestatisticmonth.DefaultStatus holds the default value on creation for the status field.
 	usagestatisticmonth.DefaultStatus = usagestatisticmonthDescStatus.Default.(uint8)
+	// usagestatisticmonthDescConsumeCoin is the schema descriptor for consume_coin field.
+	usagestatisticmonthDescConsumeCoin := usagestatisticmonthFields[13].Descriptor()
+	// usagestatisticmonth.DefaultConsumeCoin holds the default value on creation for the consume_coin field.
+	usagestatisticmonth.DefaultConsumeCoin = usagestatisticmonthDescConsumeCoin.Default.(uint64)
 	usagetotalMixin := schema.UsageTotal{}.Mixin()
 	usagetotalMixinFields0 := usagetotalMixin[0].Fields()
 	_ = usagetotalMixinFields0

+ 3 - 0
ent/schema/usage_detail.go

@@ -52,6 +52,9 @@ func (UsageDetail) Fields() []ent.Field {
 		field.Uint64("organization_id").Optional().Default(1).
 			Comment("机构 ID").
 			Annotations(entsql.WithComments(true)),
+		field.String("model").Optional().Default("GPT-4o mini").
+			Comment("模型").
+			Annotations(entsql.WithComments(true)),
 	}
 }
 

+ 1 - 0
ent/schema/usage_statistic_day.go

@@ -33,6 +33,7 @@ func (UsageStatisticDay) Fields() []ent.Field {
 		field.JSON("label_dist", []custom_types.LabelDist{}).
 			Annotations(entsql.WithComments(true)).
 			Comment("标签分布"),
+		field.Uint64("consume_coin").Optional().Default(0).Comment("消耗积分"),
 	}
 }
 

+ 1 - 0
ent/schema/usage_statistic_hour.go

@@ -33,6 +33,7 @@ func (UsageStatisticHour) Fields() []ent.Field {
 		field.JSON("label_dist", []custom_types.LabelDist{}).
 			Annotations(entsql.WithComments(true)).
 			Comment("标签分布"),
+		field.Uint64("consume_coin").Optional().Default(0).Comment("消耗积分"),
 	}
 }
 

+ 1 - 0
ent/schema/usage_statistic_month.go

@@ -33,6 +33,7 @@ func (UsageStatisticMonth) Fields() []ent.Field {
 		field.JSON("label_dist", []custom_types.LabelDist{}).
 			Annotations(entsql.WithComments(true)).
 			Comment("标签分布"),
+		field.Uint64("consume_coin").Optional().Default(0).Comment("消耗积分"),
 	}
 }
 

+ 96 - 0
ent/set_not_nil.go

@@ -7928,6 +7928,30 @@ func (ud *UsageDetailCreate) SetNotNilOrganizationID(value *uint64) *UsageDetail
 }
 
 // set field if value's pointer is not nil.
+func (ud *UsageDetailUpdate) SetNotNilModel(value *string) *UsageDetailUpdate {
+	if value != nil {
+		return ud.SetModel(*value)
+	}
+	return ud
+}
+
+// set field if value's pointer is not nil.
+func (ud *UsageDetailUpdateOne) SetNotNilModel(value *string) *UsageDetailUpdateOne {
+	if value != nil {
+		return ud.SetModel(*value)
+	}
+	return ud
+}
+
+// set field if value's pointer is not nil.
+func (ud *UsageDetailCreate) SetNotNilModel(value *string) *UsageDetailCreate {
+	if value != nil {
+		return ud.SetModel(*value)
+	}
+	return ud
+}
+
+// set field if value's pointer is not nil.
 func (usd *UsageStatisticDayUpdate) SetNotNilUpdatedAt(value *time.Time) *UsageStatisticDayUpdate {
 	if value != nil {
 		return usd.SetUpdatedAt(*value)
@@ -8312,6 +8336,30 @@ func (usd *UsageStatisticDayCreate) SetNotNilLabelDist(value []custom_types.Labe
 }
 
 // set field if value's pointer is not nil.
+func (usd *UsageStatisticDayUpdate) SetNotNilConsumeCoin(value *uint64) *UsageStatisticDayUpdate {
+	if value != nil {
+		return usd.SetConsumeCoin(*value)
+	}
+	return usd
+}
+
+// set field if value's pointer is not nil.
+func (usd *UsageStatisticDayUpdateOne) SetNotNilConsumeCoin(value *uint64) *UsageStatisticDayUpdateOne {
+	if value != nil {
+		return usd.SetConsumeCoin(*value)
+	}
+	return usd
+}
+
+// set field if value's pointer is not nil.
+func (usd *UsageStatisticDayCreate) SetNotNilConsumeCoin(value *uint64) *UsageStatisticDayCreate {
+	if value != nil {
+		return usd.SetConsumeCoin(*value)
+	}
+	return usd
+}
+
+// set field if value's pointer is not nil.
 func (ush *UsageStatisticHourUpdate) SetNotNilUpdatedAt(value *time.Time) *UsageStatisticHourUpdate {
 	if value != nil {
 		return ush.SetUpdatedAt(*value)
@@ -8696,6 +8744,30 @@ func (ush *UsageStatisticHourCreate) SetNotNilLabelDist(value []custom_types.Lab
 }
 
 // set field if value's pointer is not nil.
+func (ush *UsageStatisticHourUpdate) SetNotNilConsumeCoin(value *uint64) *UsageStatisticHourUpdate {
+	if value != nil {
+		return ush.SetConsumeCoin(*value)
+	}
+	return ush
+}
+
+// set field if value's pointer is not nil.
+func (ush *UsageStatisticHourUpdateOne) SetNotNilConsumeCoin(value *uint64) *UsageStatisticHourUpdateOne {
+	if value != nil {
+		return ush.SetConsumeCoin(*value)
+	}
+	return ush
+}
+
+// set field if value's pointer is not nil.
+func (ush *UsageStatisticHourCreate) SetNotNilConsumeCoin(value *uint64) *UsageStatisticHourCreate {
+	if value != nil {
+		return ush.SetConsumeCoin(*value)
+	}
+	return ush
+}
+
+// set field if value's pointer is not nil.
 func (usm *UsageStatisticMonthUpdate) SetNotNilUpdatedAt(value *time.Time) *UsageStatisticMonthUpdate {
 	if value != nil {
 		return usm.SetUpdatedAt(*value)
@@ -9080,6 +9152,30 @@ func (usm *UsageStatisticMonthCreate) SetNotNilLabelDist(value []custom_types.La
 }
 
 // set field if value's pointer is not nil.
+func (usm *UsageStatisticMonthUpdate) SetNotNilConsumeCoin(value *uint64) *UsageStatisticMonthUpdate {
+	if value != nil {
+		return usm.SetConsumeCoin(*value)
+	}
+	return usm
+}
+
+// set field if value's pointer is not nil.
+func (usm *UsageStatisticMonthUpdateOne) SetNotNilConsumeCoin(value *uint64) *UsageStatisticMonthUpdateOne {
+	if value != nil {
+		return usm.SetConsumeCoin(*value)
+	}
+	return usm
+}
+
+// set field if value's pointer is not nil.
+func (usm *UsageStatisticMonthCreate) SetNotNilConsumeCoin(value *uint64) *UsageStatisticMonthCreate {
+	if value != nil {
+		return usm.SetConsumeCoin(*value)
+	}
+	return usm
+}
+
+// set field if value's pointer is not nil.
 func (ut *UsageTotalUpdate) SetNotNilUpdatedAt(value *time.Time) *UsageTotalUpdate {
 	if value != nil {
 		return ut.SetUpdatedAt(*value)

+ 13 - 2
ent/usagedetail.go

@@ -49,7 +49,9 @@ type UsageDetail struct {
 	CompletionTokens uint64 `json:"completion_tokens,omitempty"`
 	// 机构 ID
 	OrganizationID uint64 `json:"organization_id,omitempty"`
-	selectValues   sql.SelectValues
+	// 模型
+	Model        string `json:"model,omitempty"`
+	selectValues sql.SelectValues
 }
 
 // scanValues returns the types for scanning values from sql.Rows.
@@ -61,7 +63,7 @@ func (*UsageDetail) scanValues(columns []string) ([]any, error) {
 			values[i] = new([]byte)
 		case usagedetail.FieldID, usagedetail.FieldStatus, usagedetail.FieldType, usagedetail.FieldApp, usagedetail.FieldSessionID, usagedetail.FieldTotalTokens, usagedetail.FieldPromptTokens, usagedetail.FieldCompletionTokens, usagedetail.FieldOrganizationID:
 			values[i] = new(sql.NullInt64)
-		case usagedetail.FieldBotID, usagedetail.FieldReceiverID, usagedetail.FieldRequest, usagedetail.FieldResponse:
+		case usagedetail.FieldBotID, usagedetail.FieldReceiverID, usagedetail.FieldRequest, usagedetail.FieldResponse, usagedetail.FieldModel:
 			values[i] = new(sql.NullString)
 		case usagedetail.FieldCreatedAt, usagedetail.FieldUpdatedAt:
 			values[i] = new(sql.NullTime)
@@ -178,6 +180,12 @@ func (ud *UsageDetail) assignValues(columns []string, values []any) error {
 			} else if value.Valid {
 				ud.OrganizationID = uint64(value.Int64)
 			}
+		case usagedetail.FieldModel:
+			if value, ok := values[i].(*sql.NullString); !ok {
+				return fmt.Errorf("unexpected type %T for field model", values[i])
+			} else if value.Valid {
+				ud.Model = value.String
+			}
 		default:
 			ud.selectValues.Set(columns[i], values[i])
 		}
@@ -258,6 +266,9 @@ func (ud *UsageDetail) String() string {
 	builder.WriteString(", ")
 	builder.WriteString("organization_id=")
 	builder.WriteString(fmt.Sprintf("%v", ud.OrganizationID))
+	builder.WriteString(", ")
+	builder.WriteString("model=")
+	builder.WriteString(ud.Model)
 	builder.WriteByte(')')
 	return builder.String()
 }

+ 10 - 0
ent/usagedetail/usagedetail.go

@@ -43,6 +43,8 @@ const (
 	FieldCompletionTokens = "completion_tokens"
 	// FieldOrganizationID holds the string denoting the organization_id field in the database.
 	FieldOrganizationID = "organization_id"
+	// FieldModel holds the string denoting the model field in the database.
+	FieldModel = "model"
 	// Table holds the table name of the usagedetail in the database.
 	Table = "usage_detail"
 )
@@ -65,6 +67,7 @@ var Columns = []string{
 	FieldPromptTokens,
 	FieldCompletionTokens,
 	FieldOrganizationID,
+	FieldModel,
 }
 
 // ValidColumn reports if the column name is valid (part of the table columns).
@@ -108,6 +111,8 @@ var (
 	DefaultCompletionTokens uint64
 	// DefaultOrganizationID holds the default value on creation for the "organization_id" field.
 	DefaultOrganizationID uint64
+	// DefaultModel holds the default value on creation for the "model" field.
+	DefaultModel string
 )
 
 // OrderOption defines the ordering options for the UsageDetail queries.
@@ -187,3 +192,8 @@ func ByCompletionTokens(opts ...sql.OrderTermOption) OrderOption {
 func ByOrganizationID(opts ...sql.OrderTermOption) OrderOption {
 	return sql.OrderByField(FieldOrganizationID, opts...).ToFunc()
 }
+
+// ByModel orders the results by the model field.
+func ByModel(opts ...sql.OrderTermOption) OrderOption {
+	return sql.OrderByField(FieldModel, opts...).ToFunc()
+}

+ 80 - 0
ent/usagedetail/where.go

@@ -124,6 +124,11 @@ func OrganizationID(v uint64) predicate.UsageDetail {
 	return predicate.UsageDetail(sql.FieldEQ(FieldOrganizationID, v))
 }
 
+// Model applies equality check predicate on the "model" field. It's identical to ModelEQ.
+func Model(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldEQ(FieldModel, v))
+}
+
 // CreatedAtEQ applies the EQ predicate on the "created_at" field.
 func CreatedAtEQ(v time.Time) predicate.UsageDetail {
 	return predicate.UsageDetail(sql.FieldEQ(FieldCreatedAt, v))
@@ -864,6 +869,81 @@ func OrganizationIDNotNil() predicate.UsageDetail {
 	return predicate.UsageDetail(sql.FieldNotNull(FieldOrganizationID))
 }
 
+// ModelEQ applies the EQ predicate on the "model" field.
+func ModelEQ(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldEQ(FieldModel, v))
+}
+
+// ModelNEQ applies the NEQ predicate on the "model" field.
+func ModelNEQ(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldNEQ(FieldModel, v))
+}
+
+// ModelIn applies the In predicate on the "model" field.
+func ModelIn(vs ...string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldIn(FieldModel, vs...))
+}
+
+// ModelNotIn applies the NotIn predicate on the "model" field.
+func ModelNotIn(vs ...string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldNotIn(FieldModel, vs...))
+}
+
+// ModelGT applies the GT predicate on the "model" field.
+func ModelGT(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldGT(FieldModel, v))
+}
+
+// ModelGTE applies the GTE predicate on the "model" field.
+func ModelGTE(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldGTE(FieldModel, v))
+}
+
+// ModelLT applies the LT predicate on the "model" field.
+func ModelLT(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldLT(FieldModel, v))
+}
+
+// ModelLTE applies the LTE predicate on the "model" field.
+func ModelLTE(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldLTE(FieldModel, v))
+}
+
+// ModelContains applies the Contains predicate on the "model" field.
+func ModelContains(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldContains(FieldModel, v))
+}
+
+// ModelHasPrefix applies the HasPrefix predicate on the "model" field.
+func ModelHasPrefix(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldHasPrefix(FieldModel, v))
+}
+
+// ModelHasSuffix applies the HasSuffix predicate on the "model" field.
+func ModelHasSuffix(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldHasSuffix(FieldModel, v))
+}
+
+// ModelIsNil applies the IsNil predicate on the "model" field.
+func ModelIsNil() predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldIsNull(FieldModel))
+}
+
+// ModelNotNil applies the NotNil predicate on the "model" field.
+func ModelNotNil() predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldNotNull(FieldModel))
+}
+
+// ModelEqualFold applies the EqualFold predicate on the "model" field.
+func ModelEqualFold(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldEqualFold(FieldModel, v))
+}
+
+// ModelContainsFold applies the ContainsFold predicate on the "model" field.
+func ModelContainsFold(v string) predicate.UsageDetail {
+	return predicate.UsageDetail(sql.FieldContainsFold(FieldModel, v))
+}
+
 // And groups predicates with the AND operator between them.
 func And(predicates ...predicate.UsageDetail) predicate.UsageDetail {
 	return predicate.UsageDetail(sql.AndPredicates(predicates...))

+ 82 - 0
ent/usagedetail_create.go

@@ -225,6 +225,20 @@ func (udc *UsageDetailCreate) SetNillableOrganizationID(u *uint64) *UsageDetailC
 	return udc
 }
 
+// SetModel sets the "model" field.
+func (udc *UsageDetailCreate) SetModel(s string) *UsageDetailCreate {
+	udc.mutation.SetModel(s)
+	return udc
+}
+
+// SetNillableModel sets the "model" field if the given value is not nil.
+func (udc *UsageDetailCreate) SetNillableModel(s *string) *UsageDetailCreate {
+	if s != nil {
+		udc.SetModel(*s)
+	}
+	return udc
+}
+
 // SetID sets the "id" field.
 func (udc *UsageDetailCreate) SetID(u uint64) *UsageDetailCreate {
 	udc.mutation.SetID(u)
@@ -322,6 +336,10 @@ func (udc *UsageDetailCreate) defaults() {
 		v := usagedetail.DefaultOrganizationID
 		udc.mutation.SetOrganizationID(v)
 	}
+	if _, ok := udc.mutation.Model(); !ok {
+		v := usagedetail.DefaultModel
+		udc.mutation.SetModel(v)
+	}
 }
 
 // check runs all checks and user-defined validators on the builder.
@@ -440,6 +458,10 @@ func (udc *UsageDetailCreate) createSpec() (*UsageDetail, *sqlgraph.CreateSpec)
 		_spec.SetField(usagedetail.FieldOrganizationID, field.TypeUint64, value)
 		_node.OrganizationID = value
 	}
+	if value, ok := udc.mutation.Model(); ok {
+		_spec.SetField(usagedetail.FieldModel, field.TypeString, value)
+		_node.Model = value
+	}
 	return _node, _spec
 }
 
@@ -756,6 +778,24 @@ func (u *UsageDetailUpsert) ClearOrganizationID() *UsageDetailUpsert {
 	return u
 }
 
+// SetModel sets the "model" field.
+func (u *UsageDetailUpsert) SetModel(v string) *UsageDetailUpsert {
+	u.Set(usagedetail.FieldModel, v)
+	return u
+}
+
+// UpdateModel sets the "model" field to the value that was provided on create.
+func (u *UsageDetailUpsert) UpdateModel() *UsageDetailUpsert {
+	u.SetExcluded(usagedetail.FieldModel)
+	return u
+}
+
+// ClearModel clears the value of the "model" field.
+func (u *UsageDetailUpsert) ClearModel() *UsageDetailUpsert {
+	u.SetNull(usagedetail.FieldModel)
+	return u
+}
+
 // UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field.
 // Using this option is equivalent to using:
 //
@@ -1115,6 +1155,27 @@ func (u *UsageDetailUpsertOne) ClearOrganizationID() *UsageDetailUpsertOne {
 	})
 }
 
+// SetModel sets the "model" field.
+func (u *UsageDetailUpsertOne) SetModel(v string) *UsageDetailUpsertOne {
+	return u.Update(func(s *UsageDetailUpsert) {
+		s.SetModel(v)
+	})
+}
+
+// UpdateModel sets the "model" field to the value that was provided on create.
+func (u *UsageDetailUpsertOne) UpdateModel() *UsageDetailUpsertOne {
+	return u.Update(func(s *UsageDetailUpsert) {
+		s.UpdateModel()
+	})
+}
+
+// ClearModel clears the value of the "model" field.
+func (u *UsageDetailUpsertOne) ClearModel() *UsageDetailUpsertOne {
+	return u.Update(func(s *UsageDetailUpsert) {
+		s.ClearModel()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageDetailUpsertOne) Exec(ctx context.Context) error {
 	if len(u.create.conflict) == 0 {
@@ -1640,6 +1701,27 @@ func (u *UsageDetailUpsertBulk) ClearOrganizationID() *UsageDetailUpsertBulk {
 	})
 }
 
+// SetModel sets the "model" field.
+func (u *UsageDetailUpsertBulk) SetModel(v string) *UsageDetailUpsertBulk {
+	return u.Update(func(s *UsageDetailUpsert) {
+		s.SetModel(v)
+	})
+}
+
+// UpdateModel sets the "model" field to the value that was provided on create.
+func (u *UsageDetailUpsertBulk) UpdateModel() *UsageDetailUpsertBulk {
+	return u.Update(func(s *UsageDetailUpsert) {
+		s.UpdateModel()
+	})
+}
+
+// ClearModel clears the value of the "model" field.
+func (u *UsageDetailUpsertBulk) ClearModel() *UsageDetailUpsertBulk {
+	return u.Update(func(s *UsageDetailUpsert) {
+		s.ClearModel()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageDetailUpsertBulk) Exec(ctx context.Context) error {
 	if u.create.err != nil {

+ 52 - 0
ent/usagedetail_update.go

@@ -321,6 +321,26 @@ func (udu *UsageDetailUpdate) ClearOrganizationID() *UsageDetailUpdate {
 	return udu
 }
 
+// SetModel sets the "model" field.
+func (udu *UsageDetailUpdate) SetModel(s string) *UsageDetailUpdate {
+	udu.mutation.SetModel(s)
+	return udu
+}
+
+// SetNillableModel sets the "model" field if the given value is not nil.
+func (udu *UsageDetailUpdate) SetNillableModel(s *string) *UsageDetailUpdate {
+	if s != nil {
+		udu.SetModel(*s)
+	}
+	return udu
+}
+
+// ClearModel clears the value of the "model" field.
+func (udu *UsageDetailUpdate) ClearModel() *UsageDetailUpdate {
+	udu.mutation.ClearModel()
+	return udu
+}
+
 // Mutation returns the UsageDetailMutation object of the builder.
 func (udu *UsageDetailUpdate) Mutation() *UsageDetailMutation {
 	return udu.mutation
@@ -461,6 +481,12 @@ func (udu *UsageDetailUpdate) sqlSave(ctx context.Context) (n int, err error) {
 	if udu.mutation.OrganizationIDCleared() {
 		_spec.ClearField(usagedetail.FieldOrganizationID, field.TypeUint64)
 	}
+	if value, ok := udu.mutation.Model(); ok {
+		_spec.SetField(usagedetail.FieldModel, field.TypeString, value)
+	}
+	if udu.mutation.ModelCleared() {
+		_spec.ClearField(usagedetail.FieldModel, field.TypeString)
+	}
 	if n, err = sqlgraph.UpdateNodes(ctx, udu.driver, _spec); err != nil {
 		if _, ok := err.(*sqlgraph.NotFoundError); ok {
 			err = &NotFoundError{usagedetail.Label}
@@ -773,6 +799,26 @@ func (uduo *UsageDetailUpdateOne) ClearOrganizationID() *UsageDetailUpdateOne {
 	return uduo
 }
 
+// SetModel sets the "model" field.
+func (uduo *UsageDetailUpdateOne) SetModel(s string) *UsageDetailUpdateOne {
+	uduo.mutation.SetModel(s)
+	return uduo
+}
+
+// SetNillableModel sets the "model" field if the given value is not nil.
+func (uduo *UsageDetailUpdateOne) SetNillableModel(s *string) *UsageDetailUpdateOne {
+	if s != nil {
+		uduo.SetModel(*s)
+	}
+	return uduo
+}
+
+// ClearModel clears the value of the "model" field.
+func (uduo *UsageDetailUpdateOne) ClearModel() *UsageDetailUpdateOne {
+	uduo.mutation.ClearModel()
+	return uduo
+}
+
 // Mutation returns the UsageDetailMutation object of the builder.
 func (uduo *UsageDetailUpdateOne) Mutation() *UsageDetailMutation {
 	return uduo.mutation
@@ -943,6 +989,12 @@ func (uduo *UsageDetailUpdateOne) sqlSave(ctx context.Context) (_node *UsageDeta
 	if uduo.mutation.OrganizationIDCleared() {
 		_spec.ClearField(usagedetail.FieldOrganizationID, field.TypeUint64)
 	}
+	if value, ok := uduo.mutation.Model(); ok {
+		_spec.SetField(usagedetail.FieldModel, field.TypeString, value)
+	}
+	if uduo.mutation.ModelCleared() {
+		_spec.ClearField(usagedetail.FieldModel, field.TypeString)
+	}
 	_node = &UsageDetail{config: uduo.config}
 	_spec.Assign = _node.assignValues
 	_spec.ScanValues = _node.scanValues

+ 13 - 2
ent/usagestatisticday.go

@@ -52,7 +52,9 @@ type UsageStatisticDay struct {
 	// 新增用户数
 	NewUser int64 `json:"new_user,omitempty"`
 	// 标签分布
-	LabelDist    []custom_types.LabelDist `json:"label_dist,omitempty"`
+	LabelDist []custom_types.LabelDist `json:"label_dist,omitempty"`
+	// 消耗积分
+	ConsumeCoin  uint64 `json:"consume_coin,omitempty"`
 	selectValues sql.SelectValues
 }
 
@@ -63,7 +65,7 @@ func (*UsageStatisticDay) scanValues(columns []string) ([]any, error) {
 		switch columns[i] {
 		case usagestatisticday.FieldLabelDist:
 			values[i] = new([]byte)
-		case usagestatisticday.FieldID, usagestatisticday.FieldStatus, usagestatisticday.FieldAddtime, usagestatisticday.FieldType, usagestatisticday.FieldOrganizationID, usagestatisticday.FieldAiResponse, usagestatisticday.FieldSopRun, usagestatisticday.FieldTotalFriend, usagestatisticday.FieldTotalGroup, usagestatisticday.FieldAccountBalance, usagestatisticday.FieldConsumeToken, usagestatisticday.FieldActiveUser, usagestatisticday.FieldNewUser:
+		case usagestatisticday.FieldID, usagestatisticday.FieldStatus, usagestatisticday.FieldAddtime, usagestatisticday.FieldType, usagestatisticday.FieldOrganizationID, usagestatisticday.FieldAiResponse, usagestatisticday.FieldSopRun, usagestatisticday.FieldTotalFriend, usagestatisticday.FieldTotalGroup, usagestatisticday.FieldAccountBalance, usagestatisticday.FieldConsumeToken, usagestatisticday.FieldActiveUser, usagestatisticday.FieldNewUser, usagestatisticday.FieldConsumeCoin:
 			values[i] = new(sql.NullInt64)
 		case usagestatisticday.FieldBotID:
 			values[i] = new(sql.NullString)
@@ -194,6 +196,12 @@ func (usd *UsageStatisticDay) assignValues(columns []string, values []any) error
 					return fmt.Errorf("unmarshal field label_dist: %w", err)
 				}
 			}
+		case usagestatisticday.FieldConsumeCoin:
+			if value, ok := values[i].(*sql.NullInt64); !ok {
+				return fmt.Errorf("unexpected type %T for field consume_coin", values[i])
+			} else if value.Valid {
+				usd.ConsumeCoin = uint64(value.Int64)
+			}
 		default:
 			usd.selectValues.Set(columns[i], values[i])
 		}
@@ -280,6 +288,9 @@ func (usd *UsageStatisticDay) String() string {
 	builder.WriteString(", ")
 	builder.WriteString("label_dist=")
 	builder.WriteString(fmt.Sprintf("%v", usd.LabelDist))
+	builder.WriteString(", ")
+	builder.WriteString("consume_coin=")
+	builder.WriteString(fmt.Sprintf("%v", usd.ConsumeCoin))
 	builder.WriteByte(')')
 	return builder.String()
 }

+ 10 - 0
ent/usagestatisticday/usagestatisticday.go

@@ -48,6 +48,8 @@ const (
 	FieldNewUser = "new_user"
 	// FieldLabelDist holds the string denoting the label_dist field in the database.
 	FieldLabelDist = "label_dist"
+	// FieldConsumeCoin holds the string denoting the consume_coin field in the database.
+	FieldConsumeCoin = "consume_coin"
 	// Table holds the table name of the usagestatisticday in the database.
 	Table = "usage_statistic_day"
 )
@@ -72,6 +74,7 @@ var Columns = []string{
 	FieldActiveUser,
 	FieldNewUser,
 	FieldLabelDist,
+	FieldConsumeCoin,
 }
 
 // ValidColumn reports if the column name is valid (part of the table columns).
@@ -100,6 +103,8 @@ var (
 	UpdateDefaultUpdatedAt func() time.Time
 	// DefaultStatus holds the default value on creation for the "status" field.
 	DefaultStatus uint8
+	// DefaultConsumeCoin holds the default value on creation for the "consume_coin" field.
+	DefaultConsumeCoin uint64
 )
 
 // OrderOption defines the ordering options for the UsageStatisticDay queries.
@@ -189,3 +194,8 @@ func ByActiveUser(opts ...sql.OrderTermOption) OrderOption {
 func ByNewUser(opts ...sql.OrderTermOption) OrderOption {
 	return sql.OrderByField(FieldNewUser, opts...).ToFunc()
 }
+
+// ByConsumeCoin orders the results by the consume_coin field.
+func ByConsumeCoin(opts ...sql.OrderTermOption) OrderOption {
+	return sql.OrderByField(FieldConsumeCoin, opts...).ToFunc()
+}

+ 55 - 0
ent/usagestatisticday/where.go

@@ -134,6 +134,11 @@ func NewUser(v int64) predicate.UsageStatisticDay {
 	return predicate.UsageStatisticDay(sql.FieldEQ(FieldNewUser, v))
 }
 
+// ConsumeCoin applies equality check predicate on the "consume_coin" field. It's identical to ConsumeCoinEQ.
+func ConsumeCoin(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldEQ(FieldConsumeCoin, v))
+}
+
 // CreatedAtEQ applies the EQ predicate on the "created_at" field.
 func CreatedAtEQ(v time.Time) predicate.UsageStatisticDay {
 	return predicate.UsageStatisticDay(sql.FieldEQ(FieldCreatedAt, v))
@@ -839,6 +844,56 @@ func NewUserLTE(v int64) predicate.UsageStatisticDay {
 	return predicate.UsageStatisticDay(sql.FieldLTE(FieldNewUser, v))
 }
 
+// ConsumeCoinEQ applies the EQ predicate on the "consume_coin" field.
+func ConsumeCoinEQ(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldEQ(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinNEQ applies the NEQ predicate on the "consume_coin" field.
+func ConsumeCoinNEQ(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldNEQ(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinIn applies the In predicate on the "consume_coin" field.
+func ConsumeCoinIn(vs ...uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldIn(FieldConsumeCoin, vs...))
+}
+
+// ConsumeCoinNotIn applies the NotIn predicate on the "consume_coin" field.
+func ConsumeCoinNotIn(vs ...uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldNotIn(FieldConsumeCoin, vs...))
+}
+
+// ConsumeCoinGT applies the GT predicate on the "consume_coin" field.
+func ConsumeCoinGT(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldGT(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinGTE applies the GTE predicate on the "consume_coin" field.
+func ConsumeCoinGTE(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldGTE(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinLT applies the LT predicate on the "consume_coin" field.
+func ConsumeCoinLT(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldLT(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinLTE applies the LTE predicate on the "consume_coin" field.
+func ConsumeCoinLTE(v uint64) predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldLTE(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinIsNil applies the IsNil predicate on the "consume_coin" field.
+func ConsumeCoinIsNil() predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldIsNull(FieldConsumeCoin))
+}
+
+// ConsumeCoinNotNil applies the NotNil predicate on the "consume_coin" field.
+func ConsumeCoinNotNil() predicate.UsageStatisticDay {
+	return predicate.UsageStatisticDay(sql.FieldNotNull(FieldConsumeCoin))
+}
+
 // And groups predicates with the AND operator between them.
 func And(predicates ...predicate.UsageStatisticDay) predicate.UsageStatisticDay {
 	return predicate.UsageStatisticDay(sql.AndPredicates(predicates...))

+ 102 - 0
ent/usagestatisticday_create.go

@@ -173,6 +173,20 @@ func (usdc *UsageStatisticDayCreate) SetLabelDist(ctd []custom_types.LabelDist)
 	return usdc
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (usdc *UsageStatisticDayCreate) SetConsumeCoin(u uint64) *UsageStatisticDayCreate {
+	usdc.mutation.SetConsumeCoin(u)
+	return usdc
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (usdc *UsageStatisticDayCreate) SetNillableConsumeCoin(u *uint64) *UsageStatisticDayCreate {
+	if u != nil {
+		usdc.SetConsumeCoin(*u)
+	}
+	return usdc
+}
+
 // SetID sets the "id" field.
 func (usdc *UsageStatisticDayCreate) SetID(u uint64) *UsageStatisticDayCreate {
 	usdc.mutation.SetID(u)
@@ -234,6 +248,10 @@ func (usdc *UsageStatisticDayCreate) defaults() error {
 		v := usagestatisticday.DefaultStatus
 		usdc.mutation.SetStatus(v)
 	}
+	if _, ok := usdc.mutation.ConsumeCoin(); !ok {
+		v := usagestatisticday.DefaultConsumeCoin
+		usdc.mutation.SetConsumeCoin(v)
+	}
 	return nil
 }
 
@@ -379,6 +397,10 @@ func (usdc *UsageStatisticDayCreate) createSpec() (*UsageStatisticDay, *sqlgraph
 		_spec.SetField(usagestatisticday.FieldLabelDist, field.TypeJSON, value)
 		_node.LabelDist = value
 	}
+	if value, ok := usdc.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatisticday.FieldConsumeCoin, field.TypeUint64, value)
+		_node.ConsumeCoin = value
+	}
 	return _node, _spec
 }
 
@@ -719,6 +741,30 @@ func (u *UsageStatisticDayUpsert) UpdateLabelDist() *UsageStatisticDayUpsert {
 	return u
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticDayUpsert) SetConsumeCoin(v uint64) *UsageStatisticDayUpsert {
+	u.Set(usagestatisticday.FieldConsumeCoin, v)
+	return u
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticDayUpsert) UpdateConsumeCoin() *UsageStatisticDayUpsert {
+	u.SetExcluded(usagestatisticday.FieldConsumeCoin)
+	return u
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticDayUpsert) AddConsumeCoin(v uint64) *UsageStatisticDayUpsert {
+	u.Add(usagestatisticday.FieldConsumeCoin, v)
+	return u
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticDayUpsert) ClearConsumeCoin() *UsageStatisticDayUpsert {
+	u.SetNull(usagestatisticday.FieldConsumeCoin)
+	return u
+}
+
 // UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field.
 // Using this option is equivalent to using:
 //
@@ -1106,6 +1152,34 @@ func (u *UsageStatisticDayUpsertOne) UpdateLabelDist() *UsageStatisticDayUpsertO
 	})
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticDayUpsertOne) SetConsumeCoin(v uint64) *UsageStatisticDayUpsertOne {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.SetConsumeCoin(v)
+	})
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticDayUpsertOne) AddConsumeCoin(v uint64) *UsageStatisticDayUpsertOne {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.AddConsumeCoin(v)
+	})
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticDayUpsertOne) UpdateConsumeCoin() *UsageStatisticDayUpsertOne {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.UpdateConsumeCoin()
+	})
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticDayUpsertOne) ClearConsumeCoin() *UsageStatisticDayUpsertOne {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.ClearConsumeCoin()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageStatisticDayUpsertOne) Exec(ctx context.Context) error {
 	if len(u.create.conflict) == 0 {
@@ -1659,6 +1733,34 @@ func (u *UsageStatisticDayUpsertBulk) UpdateLabelDist() *UsageStatisticDayUpsert
 	})
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticDayUpsertBulk) SetConsumeCoin(v uint64) *UsageStatisticDayUpsertBulk {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.SetConsumeCoin(v)
+	})
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticDayUpsertBulk) AddConsumeCoin(v uint64) *UsageStatisticDayUpsertBulk {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.AddConsumeCoin(v)
+	})
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticDayUpsertBulk) UpdateConsumeCoin() *UsageStatisticDayUpsertBulk {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.UpdateConsumeCoin()
+	})
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticDayUpsertBulk) ClearConsumeCoin() *UsageStatisticDayUpsertBulk {
+	return u.Update(func(s *UsageStatisticDayUpsert) {
+		s.ClearConsumeCoin()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageStatisticDayUpsertBulk) Exec(ctx context.Context) error {
 	if u.create.err != nil {

+ 72 - 0
ent/usagestatisticday_update.go

@@ -352,6 +352,33 @@ func (usdu *UsageStatisticDayUpdate) AppendLabelDist(ctd []custom_types.LabelDis
 	return usdu
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (usdu *UsageStatisticDayUpdate) SetConsumeCoin(u uint64) *UsageStatisticDayUpdate {
+	usdu.mutation.ResetConsumeCoin()
+	usdu.mutation.SetConsumeCoin(u)
+	return usdu
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (usdu *UsageStatisticDayUpdate) SetNillableConsumeCoin(u *uint64) *UsageStatisticDayUpdate {
+	if u != nil {
+		usdu.SetConsumeCoin(*u)
+	}
+	return usdu
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (usdu *UsageStatisticDayUpdate) AddConsumeCoin(u int64) *UsageStatisticDayUpdate {
+	usdu.mutation.AddConsumeCoin(u)
+	return usdu
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (usdu *UsageStatisticDayUpdate) ClearConsumeCoin() *UsageStatisticDayUpdate {
+	usdu.mutation.ClearConsumeCoin()
+	return usdu
+}
+
 // Mutation returns the UsageStatisticDayMutation object of the builder.
 func (usdu *UsageStatisticDayUpdate) Mutation() *UsageStatisticDayMutation {
 	return usdu.mutation
@@ -509,6 +536,15 @@ func (usdu *UsageStatisticDayUpdate) sqlSave(ctx context.Context) (n int, err er
 			sqljson.Append(u, usagestatisticday.FieldLabelDist, value)
 		})
 	}
+	if value, ok := usdu.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatisticday.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if value, ok := usdu.mutation.AddedConsumeCoin(); ok {
+		_spec.AddField(usagestatisticday.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if usdu.mutation.ConsumeCoinCleared() {
+		_spec.ClearField(usagestatisticday.FieldConsumeCoin, field.TypeUint64)
+	}
 	if n, err = sqlgraph.UpdateNodes(ctx, usdu.driver, _spec); err != nil {
 		if _, ok := err.(*sqlgraph.NotFoundError); ok {
 			err = &NotFoundError{usagestatisticday.Label}
@@ -851,6 +887,33 @@ func (usduo *UsageStatisticDayUpdateOne) AppendLabelDist(ctd []custom_types.Labe
 	return usduo
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (usduo *UsageStatisticDayUpdateOne) SetConsumeCoin(u uint64) *UsageStatisticDayUpdateOne {
+	usduo.mutation.ResetConsumeCoin()
+	usduo.mutation.SetConsumeCoin(u)
+	return usduo
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (usduo *UsageStatisticDayUpdateOne) SetNillableConsumeCoin(u *uint64) *UsageStatisticDayUpdateOne {
+	if u != nil {
+		usduo.SetConsumeCoin(*u)
+	}
+	return usduo
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (usduo *UsageStatisticDayUpdateOne) AddConsumeCoin(u int64) *UsageStatisticDayUpdateOne {
+	usduo.mutation.AddConsumeCoin(u)
+	return usduo
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (usduo *UsageStatisticDayUpdateOne) ClearConsumeCoin() *UsageStatisticDayUpdateOne {
+	usduo.mutation.ClearConsumeCoin()
+	return usduo
+}
+
 // Mutation returns the UsageStatisticDayMutation object of the builder.
 func (usduo *UsageStatisticDayUpdateOne) Mutation() *UsageStatisticDayMutation {
 	return usduo.mutation
@@ -1038,6 +1101,15 @@ func (usduo *UsageStatisticDayUpdateOne) sqlSave(ctx context.Context) (_node *Us
 			sqljson.Append(u, usagestatisticday.FieldLabelDist, value)
 		})
 	}
+	if value, ok := usduo.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatisticday.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if value, ok := usduo.mutation.AddedConsumeCoin(); ok {
+		_spec.AddField(usagestatisticday.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if usduo.mutation.ConsumeCoinCleared() {
+		_spec.ClearField(usagestatisticday.FieldConsumeCoin, field.TypeUint64)
+	}
 	_node = &UsageStatisticDay{config: usduo.config}
 	_spec.Assign = _node.assignValues
 	_spec.ScanValues = _node.scanValues

+ 13 - 2
ent/usagestatistichour.go

@@ -52,7 +52,9 @@ type UsageStatisticHour struct {
 	// 新增用户数
 	NewUser int64 `json:"new_user,omitempty"`
 	// 标签分布
-	LabelDist    []custom_types.LabelDist `json:"label_dist,omitempty"`
+	LabelDist []custom_types.LabelDist `json:"label_dist,omitempty"`
+	// 消耗积分
+	ConsumeCoin  uint64 `json:"consume_coin,omitempty"`
 	selectValues sql.SelectValues
 }
 
@@ -63,7 +65,7 @@ func (*UsageStatisticHour) scanValues(columns []string) ([]any, error) {
 		switch columns[i] {
 		case usagestatistichour.FieldLabelDist:
 			values[i] = new([]byte)
-		case usagestatistichour.FieldID, usagestatistichour.FieldStatus, usagestatistichour.FieldAddtime, usagestatistichour.FieldType, usagestatistichour.FieldOrganizationID, usagestatistichour.FieldAiResponse, usagestatistichour.FieldSopRun, usagestatistichour.FieldTotalFriend, usagestatistichour.FieldTotalGroup, usagestatistichour.FieldAccountBalance, usagestatistichour.FieldConsumeToken, usagestatistichour.FieldActiveUser, usagestatistichour.FieldNewUser:
+		case usagestatistichour.FieldID, usagestatistichour.FieldStatus, usagestatistichour.FieldAddtime, usagestatistichour.FieldType, usagestatistichour.FieldOrganizationID, usagestatistichour.FieldAiResponse, usagestatistichour.FieldSopRun, usagestatistichour.FieldTotalFriend, usagestatistichour.FieldTotalGroup, usagestatistichour.FieldAccountBalance, usagestatistichour.FieldConsumeToken, usagestatistichour.FieldActiveUser, usagestatistichour.FieldNewUser, usagestatistichour.FieldConsumeCoin:
 			values[i] = new(sql.NullInt64)
 		case usagestatistichour.FieldBotID:
 			values[i] = new(sql.NullString)
@@ -194,6 +196,12 @@ func (ush *UsageStatisticHour) assignValues(columns []string, values []any) erro
 					return fmt.Errorf("unmarshal field label_dist: %w", err)
 				}
 			}
+		case usagestatistichour.FieldConsumeCoin:
+			if value, ok := values[i].(*sql.NullInt64); !ok {
+				return fmt.Errorf("unexpected type %T for field consume_coin", values[i])
+			} else if value.Valid {
+				ush.ConsumeCoin = uint64(value.Int64)
+			}
 		default:
 			ush.selectValues.Set(columns[i], values[i])
 		}
@@ -280,6 +288,9 @@ func (ush *UsageStatisticHour) String() string {
 	builder.WriteString(", ")
 	builder.WriteString("label_dist=")
 	builder.WriteString(fmt.Sprintf("%v", ush.LabelDist))
+	builder.WriteString(", ")
+	builder.WriteString("consume_coin=")
+	builder.WriteString(fmt.Sprintf("%v", ush.ConsumeCoin))
 	builder.WriteByte(')')
 	return builder.String()
 }

+ 10 - 0
ent/usagestatistichour/usagestatistichour.go

@@ -48,6 +48,8 @@ const (
 	FieldNewUser = "new_user"
 	// FieldLabelDist holds the string denoting the label_dist field in the database.
 	FieldLabelDist = "label_dist"
+	// FieldConsumeCoin holds the string denoting the consume_coin field in the database.
+	FieldConsumeCoin = "consume_coin"
 	// Table holds the table name of the usagestatistichour in the database.
 	Table = "usage_statistic_hour"
 )
@@ -72,6 +74,7 @@ var Columns = []string{
 	FieldActiveUser,
 	FieldNewUser,
 	FieldLabelDist,
+	FieldConsumeCoin,
 }
 
 // ValidColumn reports if the column name is valid (part of the table columns).
@@ -100,6 +103,8 @@ var (
 	UpdateDefaultUpdatedAt func() time.Time
 	// DefaultStatus holds the default value on creation for the "status" field.
 	DefaultStatus uint8
+	// DefaultConsumeCoin holds the default value on creation for the "consume_coin" field.
+	DefaultConsumeCoin uint64
 )
 
 // OrderOption defines the ordering options for the UsageStatisticHour queries.
@@ -189,3 +194,8 @@ func ByActiveUser(opts ...sql.OrderTermOption) OrderOption {
 func ByNewUser(opts ...sql.OrderTermOption) OrderOption {
 	return sql.OrderByField(FieldNewUser, opts...).ToFunc()
 }
+
+// ByConsumeCoin orders the results by the consume_coin field.
+func ByConsumeCoin(opts ...sql.OrderTermOption) OrderOption {
+	return sql.OrderByField(FieldConsumeCoin, opts...).ToFunc()
+}

+ 55 - 0
ent/usagestatistichour/where.go

@@ -134,6 +134,11 @@ func NewUser(v int64) predicate.UsageStatisticHour {
 	return predicate.UsageStatisticHour(sql.FieldEQ(FieldNewUser, v))
 }
 
+// ConsumeCoin applies equality check predicate on the "consume_coin" field. It's identical to ConsumeCoinEQ.
+func ConsumeCoin(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldEQ(FieldConsumeCoin, v))
+}
+
 // CreatedAtEQ applies the EQ predicate on the "created_at" field.
 func CreatedAtEQ(v time.Time) predicate.UsageStatisticHour {
 	return predicate.UsageStatisticHour(sql.FieldEQ(FieldCreatedAt, v))
@@ -839,6 +844,56 @@ func NewUserLTE(v int64) predicate.UsageStatisticHour {
 	return predicate.UsageStatisticHour(sql.FieldLTE(FieldNewUser, v))
 }
 
+// ConsumeCoinEQ applies the EQ predicate on the "consume_coin" field.
+func ConsumeCoinEQ(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldEQ(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinNEQ applies the NEQ predicate on the "consume_coin" field.
+func ConsumeCoinNEQ(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldNEQ(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinIn applies the In predicate on the "consume_coin" field.
+func ConsumeCoinIn(vs ...uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldIn(FieldConsumeCoin, vs...))
+}
+
+// ConsumeCoinNotIn applies the NotIn predicate on the "consume_coin" field.
+func ConsumeCoinNotIn(vs ...uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldNotIn(FieldConsumeCoin, vs...))
+}
+
+// ConsumeCoinGT applies the GT predicate on the "consume_coin" field.
+func ConsumeCoinGT(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldGT(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinGTE applies the GTE predicate on the "consume_coin" field.
+func ConsumeCoinGTE(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldGTE(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinLT applies the LT predicate on the "consume_coin" field.
+func ConsumeCoinLT(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldLT(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinLTE applies the LTE predicate on the "consume_coin" field.
+func ConsumeCoinLTE(v uint64) predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldLTE(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinIsNil applies the IsNil predicate on the "consume_coin" field.
+func ConsumeCoinIsNil() predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldIsNull(FieldConsumeCoin))
+}
+
+// ConsumeCoinNotNil applies the NotNil predicate on the "consume_coin" field.
+func ConsumeCoinNotNil() predicate.UsageStatisticHour {
+	return predicate.UsageStatisticHour(sql.FieldNotNull(FieldConsumeCoin))
+}
+
 // And groups predicates with the AND operator between them.
 func And(predicates ...predicate.UsageStatisticHour) predicate.UsageStatisticHour {
 	return predicate.UsageStatisticHour(sql.AndPredicates(predicates...))

+ 102 - 0
ent/usagestatistichour_create.go

@@ -173,6 +173,20 @@ func (ushc *UsageStatisticHourCreate) SetLabelDist(ctd []custom_types.LabelDist)
 	return ushc
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (ushc *UsageStatisticHourCreate) SetConsumeCoin(u uint64) *UsageStatisticHourCreate {
+	ushc.mutation.SetConsumeCoin(u)
+	return ushc
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (ushc *UsageStatisticHourCreate) SetNillableConsumeCoin(u *uint64) *UsageStatisticHourCreate {
+	if u != nil {
+		ushc.SetConsumeCoin(*u)
+	}
+	return ushc
+}
+
 // SetID sets the "id" field.
 func (ushc *UsageStatisticHourCreate) SetID(u uint64) *UsageStatisticHourCreate {
 	ushc.mutation.SetID(u)
@@ -234,6 +248,10 @@ func (ushc *UsageStatisticHourCreate) defaults() error {
 		v := usagestatistichour.DefaultStatus
 		ushc.mutation.SetStatus(v)
 	}
+	if _, ok := ushc.mutation.ConsumeCoin(); !ok {
+		v := usagestatistichour.DefaultConsumeCoin
+		ushc.mutation.SetConsumeCoin(v)
+	}
 	return nil
 }
 
@@ -379,6 +397,10 @@ func (ushc *UsageStatisticHourCreate) createSpec() (*UsageStatisticHour, *sqlgra
 		_spec.SetField(usagestatistichour.FieldLabelDist, field.TypeJSON, value)
 		_node.LabelDist = value
 	}
+	if value, ok := ushc.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatistichour.FieldConsumeCoin, field.TypeUint64, value)
+		_node.ConsumeCoin = value
+	}
 	return _node, _spec
 }
 
@@ -719,6 +741,30 @@ func (u *UsageStatisticHourUpsert) UpdateLabelDist() *UsageStatisticHourUpsert {
 	return u
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticHourUpsert) SetConsumeCoin(v uint64) *UsageStatisticHourUpsert {
+	u.Set(usagestatistichour.FieldConsumeCoin, v)
+	return u
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticHourUpsert) UpdateConsumeCoin() *UsageStatisticHourUpsert {
+	u.SetExcluded(usagestatistichour.FieldConsumeCoin)
+	return u
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticHourUpsert) AddConsumeCoin(v uint64) *UsageStatisticHourUpsert {
+	u.Add(usagestatistichour.FieldConsumeCoin, v)
+	return u
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticHourUpsert) ClearConsumeCoin() *UsageStatisticHourUpsert {
+	u.SetNull(usagestatistichour.FieldConsumeCoin)
+	return u
+}
+
 // UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field.
 // Using this option is equivalent to using:
 //
@@ -1106,6 +1152,34 @@ func (u *UsageStatisticHourUpsertOne) UpdateLabelDist() *UsageStatisticHourUpser
 	})
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticHourUpsertOne) SetConsumeCoin(v uint64) *UsageStatisticHourUpsertOne {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.SetConsumeCoin(v)
+	})
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticHourUpsertOne) AddConsumeCoin(v uint64) *UsageStatisticHourUpsertOne {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.AddConsumeCoin(v)
+	})
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticHourUpsertOne) UpdateConsumeCoin() *UsageStatisticHourUpsertOne {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.UpdateConsumeCoin()
+	})
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticHourUpsertOne) ClearConsumeCoin() *UsageStatisticHourUpsertOne {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.ClearConsumeCoin()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageStatisticHourUpsertOne) Exec(ctx context.Context) error {
 	if len(u.create.conflict) == 0 {
@@ -1659,6 +1733,34 @@ func (u *UsageStatisticHourUpsertBulk) UpdateLabelDist() *UsageStatisticHourUpse
 	})
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticHourUpsertBulk) SetConsumeCoin(v uint64) *UsageStatisticHourUpsertBulk {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.SetConsumeCoin(v)
+	})
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticHourUpsertBulk) AddConsumeCoin(v uint64) *UsageStatisticHourUpsertBulk {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.AddConsumeCoin(v)
+	})
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticHourUpsertBulk) UpdateConsumeCoin() *UsageStatisticHourUpsertBulk {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.UpdateConsumeCoin()
+	})
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticHourUpsertBulk) ClearConsumeCoin() *UsageStatisticHourUpsertBulk {
+	return u.Update(func(s *UsageStatisticHourUpsert) {
+		s.ClearConsumeCoin()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageStatisticHourUpsertBulk) Exec(ctx context.Context) error {
 	if u.create.err != nil {

+ 72 - 0
ent/usagestatistichour_update.go

@@ -352,6 +352,33 @@ func (ushu *UsageStatisticHourUpdate) AppendLabelDist(ctd []custom_types.LabelDi
 	return ushu
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (ushu *UsageStatisticHourUpdate) SetConsumeCoin(u uint64) *UsageStatisticHourUpdate {
+	ushu.mutation.ResetConsumeCoin()
+	ushu.mutation.SetConsumeCoin(u)
+	return ushu
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (ushu *UsageStatisticHourUpdate) SetNillableConsumeCoin(u *uint64) *UsageStatisticHourUpdate {
+	if u != nil {
+		ushu.SetConsumeCoin(*u)
+	}
+	return ushu
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (ushu *UsageStatisticHourUpdate) AddConsumeCoin(u int64) *UsageStatisticHourUpdate {
+	ushu.mutation.AddConsumeCoin(u)
+	return ushu
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (ushu *UsageStatisticHourUpdate) ClearConsumeCoin() *UsageStatisticHourUpdate {
+	ushu.mutation.ClearConsumeCoin()
+	return ushu
+}
+
 // Mutation returns the UsageStatisticHourMutation object of the builder.
 func (ushu *UsageStatisticHourUpdate) Mutation() *UsageStatisticHourMutation {
 	return ushu.mutation
@@ -509,6 +536,15 @@ func (ushu *UsageStatisticHourUpdate) sqlSave(ctx context.Context) (n int, err e
 			sqljson.Append(u, usagestatistichour.FieldLabelDist, value)
 		})
 	}
+	if value, ok := ushu.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatistichour.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if value, ok := ushu.mutation.AddedConsumeCoin(); ok {
+		_spec.AddField(usagestatistichour.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if ushu.mutation.ConsumeCoinCleared() {
+		_spec.ClearField(usagestatistichour.FieldConsumeCoin, field.TypeUint64)
+	}
 	if n, err = sqlgraph.UpdateNodes(ctx, ushu.driver, _spec); err != nil {
 		if _, ok := err.(*sqlgraph.NotFoundError); ok {
 			err = &NotFoundError{usagestatistichour.Label}
@@ -851,6 +887,33 @@ func (ushuo *UsageStatisticHourUpdateOne) AppendLabelDist(ctd []custom_types.Lab
 	return ushuo
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (ushuo *UsageStatisticHourUpdateOne) SetConsumeCoin(u uint64) *UsageStatisticHourUpdateOne {
+	ushuo.mutation.ResetConsumeCoin()
+	ushuo.mutation.SetConsumeCoin(u)
+	return ushuo
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (ushuo *UsageStatisticHourUpdateOne) SetNillableConsumeCoin(u *uint64) *UsageStatisticHourUpdateOne {
+	if u != nil {
+		ushuo.SetConsumeCoin(*u)
+	}
+	return ushuo
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (ushuo *UsageStatisticHourUpdateOne) AddConsumeCoin(u int64) *UsageStatisticHourUpdateOne {
+	ushuo.mutation.AddConsumeCoin(u)
+	return ushuo
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (ushuo *UsageStatisticHourUpdateOne) ClearConsumeCoin() *UsageStatisticHourUpdateOne {
+	ushuo.mutation.ClearConsumeCoin()
+	return ushuo
+}
+
 // Mutation returns the UsageStatisticHourMutation object of the builder.
 func (ushuo *UsageStatisticHourUpdateOne) Mutation() *UsageStatisticHourMutation {
 	return ushuo.mutation
@@ -1038,6 +1101,15 @@ func (ushuo *UsageStatisticHourUpdateOne) sqlSave(ctx context.Context) (_node *U
 			sqljson.Append(u, usagestatistichour.FieldLabelDist, value)
 		})
 	}
+	if value, ok := ushuo.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatistichour.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if value, ok := ushuo.mutation.AddedConsumeCoin(); ok {
+		_spec.AddField(usagestatistichour.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if ushuo.mutation.ConsumeCoinCleared() {
+		_spec.ClearField(usagestatistichour.FieldConsumeCoin, field.TypeUint64)
+	}
 	_node = &UsageStatisticHour{config: ushuo.config}
 	_spec.Assign = _node.assignValues
 	_spec.ScanValues = _node.scanValues

+ 13 - 2
ent/usagestatisticmonth.go

@@ -52,7 +52,9 @@ type UsageStatisticMonth struct {
 	// 新增用户数
 	NewUser int64 `json:"new_user,omitempty"`
 	// 标签分布
-	LabelDist    []custom_types.LabelDist `json:"label_dist,omitempty"`
+	LabelDist []custom_types.LabelDist `json:"label_dist,omitempty"`
+	// 消耗积分
+	ConsumeCoin  uint64 `json:"consume_coin,omitempty"`
 	selectValues sql.SelectValues
 }
 
@@ -63,7 +65,7 @@ func (*UsageStatisticMonth) scanValues(columns []string) ([]any, error) {
 		switch columns[i] {
 		case usagestatisticmonth.FieldLabelDist:
 			values[i] = new([]byte)
-		case usagestatisticmonth.FieldID, usagestatisticmonth.FieldStatus, usagestatisticmonth.FieldAddtime, usagestatisticmonth.FieldType, usagestatisticmonth.FieldOrganizationID, usagestatisticmonth.FieldAiResponse, usagestatisticmonth.FieldSopRun, usagestatisticmonth.FieldTotalFriend, usagestatisticmonth.FieldTotalGroup, usagestatisticmonth.FieldAccountBalance, usagestatisticmonth.FieldConsumeToken, usagestatisticmonth.FieldActiveUser, usagestatisticmonth.FieldNewUser:
+		case usagestatisticmonth.FieldID, usagestatisticmonth.FieldStatus, usagestatisticmonth.FieldAddtime, usagestatisticmonth.FieldType, usagestatisticmonth.FieldOrganizationID, usagestatisticmonth.FieldAiResponse, usagestatisticmonth.FieldSopRun, usagestatisticmonth.FieldTotalFriend, usagestatisticmonth.FieldTotalGroup, usagestatisticmonth.FieldAccountBalance, usagestatisticmonth.FieldConsumeToken, usagestatisticmonth.FieldActiveUser, usagestatisticmonth.FieldNewUser, usagestatisticmonth.FieldConsumeCoin:
 			values[i] = new(sql.NullInt64)
 		case usagestatisticmonth.FieldBotID:
 			values[i] = new(sql.NullString)
@@ -194,6 +196,12 @@ func (usm *UsageStatisticMonth) assignValues(columns []string, values []any) err
 					return fmt.Errorf("unmarshal field label_dist: %w", err)
 				}
 			}
+		case usagestatisticmonth.FieldConsumeCoin:
+			if value, ok := values[i].(*sql.NullInt64); !ok {
+				return fmt.Errorf("unexpected type %T for field consume_coin", values[i])
+			} else if value.Valid {
+				usm.ConsumeCoin = uint64(value.Int64)
+			}
 		default:
 			usm.selectValues.Set(columns[i], values[i])
 		}
@@ -280,6 +288,9 @@ func (usm *UsageStatisticMonth) String() string {
 	builder.WriteString(", ")
 	builder.WriteString("label_dist=")
 	builder.WriteString(fmt.Sprintf("%v", usm.LabelDist))
+	builder.WriteString(", ")
+	builder.WriteString("consume_coin=")
+	builder.WriteString(fmt.Sprintf("%v", usm.ConsumeCoin))
 	builder.WriteByte(')')
 	return builder.String()
 }

+ 10 - 0
ent/usagestatisticmonth/usagestatisticmonth.go

@@ -48,6 +48,8 @@ const (
 	FieldNewUser = "new_user"
 	// FieldLabelDist holds the string denoting the label_dist field in the database.
 	FieldLabelDist = "label_dist"
+	// FieldConsumeCoin holds the string denoting the consume_coin field in the database.
+	FieldConsumeCoin = "consume_coin"
 	// Table holds the table name of the usagestatisticmonth in the database.
 	Table = "usage_statistic_month"
 )
@@ -72,6 +74,7 @@ var Columns = []string{
 	FieldActiveUser,
 	FieldNewUser,
 	FieldLabelDist,
+	FieldConsumeCoin,
 }
 
 // ValidColumn reports if the column name is valid (part of the table columns).
@@ -100,6 +103,8 @@ var (
 	UpdateDefaultUpdatedAt func() time.Time
 	// DefaultStatus holds the default value on creation for the "status" field.
 	DefaultStatus uint8
+	// DefaultConsumeCoin holds the default value on creation for the "consume_coin" field.
+	DefaultConsumeCoin uint64
 )
 
 // OrderOption defines the ordering options for the UsageStatisticMonth queries.
@@ -189,3 +194,8 @@ func ByActiveUser(opts ...sql.OrderTermOption) OrderOption {
 func ByNewUser(opts ...sql.OrderTermOption) OrderOption {
 	return sql.OrderByField(FieldNewUser, opts...).ToFunc()
 }
+
+// ByConsumeCoin orders the results by the consume_coin field.
+func ByConsumeCoin(opts ...sql.OrderTermOption) OrderOption {
+	return sql.OrderByField(FieldConsumeCoin, opts...).ToFunc()
+}

+ 55 - 0
ent/usagestatisticmonth/where.go

@@ -134,6 +134,11 @@ func NewUser(v int64) predicate.UsageStatisticMonth {
 	return predicate.UsageStatisticMonth(sql.FieldEQ(FieldNewUser, v))
 }
 
+// ConsumeCoin applies equality check predicate on the "consume_coin" field. It's identical to ConsumeCoinEQ.
+func ConsumeCoin(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldEQ(FieldConsumeCoin, v))
+}
+
 // CreatedAtEQ applies the EQ predicate on the "created_at" field.
 func CreatedAtEQ(v time.Time) predicate.UsageStatisticMonth {
 	return predicate.UsageStatisticMonth(sql.FieldEQ(FieldCreatedAt, v))
@@ -839,6 +844,56 @@ func NewUserLTE(v int64) predicate.UsageStatisticMonth {
 	return predicate.UsageStatisticMonth(sql.FieldLTE(FieldNewUser, v))
 }
 
+// ConsumeCoinEQ applies the EQ predicate on the "consume_coin" field.
+func ConsumeCoinEQ(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldEQ(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinNEQ applies the NEQ predicate on the "consume_coin" field.
+func ConsumeCoinNEQ(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldNEQ(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinIn applies the In predicate on the "consume_coin" field.
+func ConsumeCoinIn(vs ...uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldIn(FieldConsumeCoin, vs...))
+}
+
+// ConsumeCoinNotIn applies the NotIn predicate on the "consume_coin" field.
+func ConsumeCoinNotIn(vs ...uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldNotIn(FieldConsumeCoin, vs...))
+}
+
+// ConsumeCoinGT applies the GT predicate on the "consume_coin" field.
+func ConsumeCoinGT(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldGT(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinGTE applies the GTE predicate on the "consume_coin" field.
+func ConsumeCoinGTE(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldGTE(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinLT applies the LT predicate on the "consume_coin" field.
+func ConsumeCoinLT(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldLT(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinLTE applies the LTE predicate on the "consume_coin" field.
+func ConsumeCoinLTE(v uint64) predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldLTE(FieldConsumeCoin, v))
+}
+
+// ConsumeCoinIsNil applies the IsNil predicate on the "consume_coin" field.
+func ConsumeCoinIsNil() predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldIsNull(FieldConsumeCoin))
+}
+
+// ConsumeCoinNotNil applies the NotNil predicate on the "consume_coin" field.
+func ConsumeCoinNotNil() predicate.UsageStatisticMonth {
+	return predicate.UsageStatisticMonth(sql.FieldNotNull(FieldConsumeCoin))
+}
+
 // And groups predicates with the AND operator between them.
 func And(predicates ...predicate.UsageStatisticMonth) predicate.UsageStatisticMonth {
 	return predicate.UsageStatisticMonth(sql.AndPredicates(predicates...))

+ 102 - 0
ent/usagestatisticmonth_create.go

@@ -173,6 +173,20 @@ func (usmc *UsageStatisticMonthCreate) SetLabelDist(ctd []custom_types.LabelDist
 	return usmc
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (usmc *UsageStatisticMonthCreate) SetConsumeCoin(u uint64) *UsageStatisticMonthCreate {
+	usmc.mutation.SetConsumeCoin(u)
+	return usmc
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (usmc *UsageStatisticMonthCreate) SetNillableConsumeCoin(u *uint64) *UsageStatisticMonthCreate {
+	if u != nil {
+		usmc.SetConsumeCoin(*u)
+	}
+	return usmc
+}
+
 // SetID sets the "id" field.
 func (usmc *UsageStatisticMonthCreate) SetID(u uint64) *UsageStatisticMonthCreate {
 	usmc.mutation.SetID(u)
@@ -234,6 +248,10 @@ func (usmc *UsageStatisticMonthCreate) defaults() error {
 		v := usagestatisticmonth.DefaultStatus
 		usmc.mutation.SetStatus(v)
 	}
+	if _, ok := usmc.mutation.ConsumeCoin(); !ok {
+		v := usagestatisticmonth.DefaultConsumeCoin
+		usmc.mutation.SetConsumeCoin(v)
+	}
 	return nil
 }
 
@@ -379,6 +397,10 @@ func (usmc *UsageStatisticMonthCreate) createSpec() (*UsageStatisticMonth, *sqlg
 		_spec.SetField(usagestatisticmonth.FieldLabelDist, field.TypeJSON, value)
 		_node.LabelDist = value
 	}
+	if value, ok := usmc.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64, value)
+		_node.ConsumeCoin = value
+	}
 	return _node, _spec
 }
 
@@ -719,6 +741,30 @@ func (u *UsageStatisticMonthUpsert) UpdateLabelDist() *UsageStatisticMonthUpsert
 	return u
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticMonthUpsert) SetConsumeCoin(v uint64) *UsageStatisticMonthUpsert {
+	u.Set(usagestatisticmonth.FieldConsumeCoin, v)
+	return u
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticMonthUpsert) UpdateConsumeCoin() *UsageStatisticMonthUpsert {
+	u.SetExcluded(usagestatisticmonth.FieldConsumeCoin)
+	return u
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticMonthUpsert) AddConsumeCoin(v uint64) *UsageStatisticMonthUpsert {
+	u.Add(usagestatisticmonth.FieldConsumeCoin, v)
+	return u
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticMonthUpsert) ClearConsumeCoin() *UsageStatisticMonthUpsert {
+	u.SetNull(usagestatisticmonth.FieldConsumeCoin)
+	return u
+}
+
 // UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field.
 // Using this option is equivalent to using:
 //
@@ -1106,6 +1152,34 @@ func (u *UsageStatisticMonthUpsertOne) UpdateLabelDist() *UsageStatisticMonthUps
 	})
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticMonthUpsertOne) SetConsumeCoin(v uint64) *UsageStatisticMonthUpsertOne {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.SetConsumeCoin(v)
+	})
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticMonthUpsertOne) AddConsumeCoin(v uint64) *UsageStatisticMonthUpsertOne {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.AddConsumeCoin(v)
+	})
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticMonthUpsertOne) UpdateConsumeCoin() *UsageStatisticMonthUpsertOne {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.UpdateConsumeCoin()
+	})
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticMonthUpsertOne) ClearConsumeCoin() *UsageStatisticMonthUpsertOne {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.ClearConsumeCoin()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageStatisticMonthUpsertOne) Exec(ctx context.Context) error {
 	if len(u.create.conflict) == 0 {
@@ -1659,6 +1733,34 @@ func (u *UsageStatisticMonthUpsertBulk) UpdateLabelDist() *UsageStatisticMonthUp
 	})
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (u *UsageStatisticMonthUpsertBulk) SetConsumeCoin(v uint64) *UsageStatisticMonthUpsertBulk {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.SetConsumeCoin(v)
+	})
+}
+
+// AddConsumeCoin adds v to the "consume_coin" field.
+func (u *UsageStatisticMonthUpsertBulk) AddConsumeCoin(v uint64) *UsageStatisticMonthUpsertBulk {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.AddConsumeCoin(v)
+	})
+}
+
+// UpdateConsumeCoin sets the "consume_coin" field to the value that was provided on create.
+func (u *UsageStatisticMonthUpsertBulk) UpdateConsumeCoin() *UsageStatisticMonthUpsertBulk {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.UpdateConsumeCoin()
+	})
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (u *UsageStatisticMonthUpsertBulk) ClearConsumeCoin() *UsageStatisticMonthUpsertBulk {
+	return u.Update(func(s *UsageStatisticMonthUpsert) {
+		s.ClearConsumeCoin()
+	})
+}
+
 // Exec executes the query.
 func (u *UsageStatisticMonthUpsertBulk) Exec(ctx context.Context) error {
 	if u.create.err != nil {

+ 72 - 0
ent/usagestatisticmonth_update.go

@@ -352,6 +352,33 @@ func (usmu *UsageStatisticMonthUpdate) AppendLabelDist(ctd []custom_types.LabelD
 	return usmu
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (usmu *UsageStatisticMonthUpdate) SetConsumeCoin(u uint64) *UsageStatisticMonthUpdate {
+	usmu.mutation.ResetConsumeCoin()
+	usmu.mutation.SetConsumeCoin(u)
+	return usmu
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (usmu *UsageStatisticMonthUpdate) SetNillableConsumeCoin(u *uint64) *UsageStatisticMonthUpdate {
+	if u != nil {
+		usmu.SetConsumeCoin(*u)
+	}
+	return usmu
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (usmu *UsageStatisticMonthUpdate) AddConsumeCoin(u int64) *UsageStatisticMonthUpdate {
+	usmu.mutation.AddConsumeCoin(u)
+	return usmu
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (usmu *UsageStatisticMonthUpdate) ClearConsumeCoin() *UsageStatisticMonthUpdate {
+	usmu.mutation.ClearConsumeCoin()
+	return usmu
+}
+
 // Mutation returns the UsageStatisticMonthMutation object of the builder.
 func (usmu *UsageStatisticMonthUpdate) Mutation() *UsageStatisticMonthMutation {
 	return usmu.mutation
@@ -509,6 +536,15 @@ func (usmu *UsageStatisticMonthUpdate) sqlSave(ctx context.Context) (n int, err
 			sqljson.Append(u, usagestatisticmonth.FieldLabelDist, value)
 		})
 	}
+	if value, ok := usmu.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if value, ok := usmu.mutation.AddedConsumeCoin(); ok {
+		_spec.AddField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if usmu.mutation.ConsumeCoinCleared() {
+		_spec.ClearField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64)
+	}
 	if n, err = sqlgraph.UpdateNodes(ctx, usmu.driver, _spec); err != nil {
 		if _, ok := err.(*sqlgraph.NotFoundError); ok {
 			err = &NotFoundError{usagestatisticmonth.Label}
@@ -851,6 +887,33 @@ func (usmuo *UsageStatisticMonthUpdateOne) AppendLabelDist(ctd []custom_types.La
 	return usmuo
 }
 
+// SetConsumeCoin sets the "consume_coin" field.
+func (usmuo *UsageStatisticMonthUpdateOne) SetConsumeCoin(u uint64) *UsageStatisticMonthUpdateOne {
+	usmuo.mutation.ResetConsumeCoin()
+	usmuo.mutation.SetConsumeCoin(u)
+	return usmuo
+}
+
+// SetNillableConsumeCoin sets the "consume_coin" field if the given value is not nil.
+func (usmuo *UsageStatisticMonthUpdateOne) SetNillableConsumeCoin(u *uint64) *UsageStatisticMonthUpdateOne {
+	if u != nil {
+		usmuo.SetConsumeCoin(*u)
+	}
+	return usmuo
+}
+
+// AddConsumeCoin adds u to the "consume_coin" field.
+func (usmuo *UsageStatisticMonthUpdateOne) AddConsumeCoin(u int64) *UsageStatisticMonthUpdateOne {
+	usmuo.mutation.AddConsumeCoin(u)
+	return usmuo
+}
+
+// ClearConsumeCoin clears the value of the "consume_coin" field.
+func (usmuo *UsageStatisticMonthUpdateOne) ClearConsumeCoin() *UsageStatisticMonthUpdateOne {
+	usmuo.mutation.ClearConsumeCoin()
+	return usmuo
+}
+
 // Mutation returns the UsageStatisticMonthMutation object of the builder.
 func (usmuo *UsageStatisticMonthUpdateOne) Mutation() *UsageStatisticMonthMutation {
 	return usmuo.mutation
@@ -1038,6 +1101,15 @@ func (usmuo *UsageStatisticMonthUpdateOne) sqlSave(ctx context.Context) (_node *
 			sqljson.Append(u, usagestatisticmonth.FieldLabelDist, value)
 		})
 	}
+	if value, ok := usmuo.mutation.ConsumeCoin(); ok {
+		_spec.SetField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if value, ok := usmuo.mutation.AddedConsumeCoin(); ok {
+		_spec.AddField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64, value)
+	}
+	if usmuo.mutation.ConsumeCoinCleared() {
+		_spec.ClearField(usagestatisticmonth.FieldConsumeCoin, field.TypeUint64)
+	}
 	_node = &UsageStatisticMonth{config: usmuo.config}
 	_spec.Assign = _node.assignValues
 	_spec.ScanValues = _node.scanValues

+ 13 - 12
internal/logic/UsageDetail/get_usage_detail_list_logic.go

@@ -117,21 +117,22 @@ func (l *GetUsageDetailListLogic) GetUsageDetailList(req *types.UsageDetailListR
 				BaseIDInfo: types.BaseIDInfo{
 					Id:        &v.ID,
 					CreatedAt: pointy.GetPointer(v.CreatedAt.UnixMilli()),
-					UpdatedAt: pointy.GetPointer(v.UpdatedAt.UnixMilli()),
+					//UpdatedAt: pointy.GetPointer(v.UpdatedAt.UnixMilli()),
 				},
-				Status:           &v.Status,
-				Type:             &v.Type,
-				BotId:            &v.BotID,
-				ReceiverId:       &v.ReceiverID,
-				App:              &app,
-				SessionId:        &v.SessionID,
-				Request:          &request,
-				Response:         &v.Response,
-				TotalTokens:      &v.TotalTokens,
-				PromptTokens:     &v.PromptTokens,
-				CompletionTokens: &v.CompletionTokens,
+				//Status:      &v.Status,
+				Type:       &v.Type,
+				BotId:      &v.BotID,
+				ReceiverId: &v.ReceiverID,
+				App:        &app,
+				//SessionId:   &v.SessionID,
+				Request:     &request,
+				Response:    &v.Response,
+				TotalTokens: &v.TotalTokens,
+				//PromptTokens:     &v.PromptTokens,
+				//CompletionTokens: &v.CompletionTokens,
 				OrganizationId:   &v.OrganizationID,
 				OrganizationName: &organizationName,
+				Model:            &v.Model,
 			})
 	}
 

+ 1 - 0
internal/logic/UsageDetail/get_usage_detail_logic.go

@@ -78,6 +78,7 @@ func (l *GetUsageDetailLogic) GetUsageDetail(req *types.IDReq) (resp *types.Usag
 			PromptTokens:     &data.PromptTokens,
 			CompletionTokens: &data.CompletionTokens,
 			OrganizationId:   &data.OrganizationID,
+			Model:            &data.Model,
 		}
 	}
 

+ 1 - 1
internal/logic/chatrecords/gpts_submit_api_chat_logic.go

@@ -81,7 +81,7 @@ func (l *GptsSubmitApiChatLogic) GptsSubmitApiChat(tokenStr string, req *types.G
 	// 先查用户的积分余额,如果不足 则查租户的积分余额
 	var switcher bool
 	var balance float64
-	switcher = true //TODO 打开这里就是开始计费,并且会记录使用积分和token的信息
+	switcher = false //TODO 打开这里就是开始计费,并且会记录使用积分和token的信息
 	creditBalance, err := l.svcCtx.DB.CreditBalance.Query().Where(creditbalance.OrganizationID(*userInfo.DepartmentId)).Only(l.ctx)
 	if switcher {
 		if err != nil {

+ 19 - 0
internal/logic/dashboard/get_charts_logic.go

@@ -116,6 +116,7 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 	accountBalance := types.ChartsUint{}
 	accountBalance.LabelText = "积分"
 	consumeToken := types.ChartsUint{}
+	consumeCoin := types.ChartsUint{}
 	activeUser := types.ChartsUint{}
 	activeUser.Tip = &activeUserTip
 	newUser := types.ChartsInt{}
@@ -180,6 +181,11 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 			consumeToken.Label = append(consumeToken.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
 			consumeToken.LabelText = "token"
 
+			consumeCoin.Count += hourData.ConsumeCoin
+			consumeCoin.Val = append(consumeCoin.Val, hourData.ConsumeCoin)
+			consumeCoin.Label = append(consumeCoin.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
+			consumeCoin.LabelText = "coin"
+
 			//activeUser.Count = hourData.ActiveUser
 			activeUser.Val = append(activeUser.Val, hourData.ActiveUser)
 			activeUser.Label = append(activeUser.Label, fmt.Sprintf("%02d-%02d点", addtimeLastTwoDigits, addtimeLastTwoDigits+1))
@@ -289,6 +295,11 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 			consumeToken.Label = append(consumeToken.Label, fmt.Sprintf("%d", dayData.Addtime))
 			consumeToken.LabelText = "token"
 
+			consumeCoin.Count += dayData.ConsumeCoin
+			consumeCoin.Val = append(consumeCoin.Val, dayData.ConsumeCoin)
+			consumeCoin.Label = append(consumeCoin.Label, fmt.Sprintf("%d", dayData.Addtime))
+			consumeCoin.LabelText = "coin"
+
 			//activeUser.Count = dayData.ActiveUser
 			activeUser.Val = append(activeUser.Val, dayData.ActiveUser)
 			activeUser.Label = append(activeUser.Label, fmt.Sprintf("%d", dayData.Addtime))
@@ -356,6 +367,7 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 				var totalFriendOfDay uint64
 				var totalGroupOfDay uint64
 				var consumeTokenOfDay uint64
+				var consumeCoinOfDay uint64
 				var activeUserOfDay uint64
 				var newUserOfDay int64
 
@@ -363,6 +375,7 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 					aiResponseOfDay += hourData.AiResponse
 					sopRunOfDay += hourData.SopRun
 					consumeTokenOfDay += hourData.ConsumeToken
+					consumeCoinOfDay += hourData.ConsumeCoin
 				}
 				totalFriendOfDay = usageStatisticHour[hourLen-1].TotalFriend
 				totalGroupOfDay = usageStatisticHour[hourLen-1].TotalGroup
@@ -406,6 +419,11 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 				consumeToken.Label = append(consumeToken.Label, "今日")
 				consumeToken.LabelText = "token"
 
+				consumeCoin.Count = consumeCoin.Count + consumeTokenOfDay
+				consumeToken.Val = append(consumeToken.Val, consumeTokenOfDay)
+				consumeToken.Label = append(consumeToken.Label, "今日")
+				consumeToken.LabelText = "token"
+
 				//activeUser.Count = activeUserOfDay
 				activeUser.Val = append(activeUser.Val, activeUserOfDay)
 				activeUser.Label = append(activeUser.Label, "今日")
@@ -472,6 +490,7 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 		TotalGroup:     &totalGroup,
 		AccountBalance: &accountBalance,
 		ConsumeToken:   &consumeToken,
+		ConsumeCoin:    &consumeCoin,
 		ActiveUser:     &activeUser,
 		NewUser:        &newUser,
 		LabelDist:      labelsData,

+ 2 - 0
internal/types/types.go

@@ -3391,6 +3391,7 @@ type UsageDetailInfo struct {
 	// 组织ID
 	OrganizationId   *uint64 `json:"organizationId,optional"`
 	OrganizationName *string `json:"organizationName,optional"`
+	Model            *string `json:"model,optional"`
 }
 
 // The response data of UsageDetail list | UsageDetail列表数据
@@ -3577,6 +3578,7 @@ type ChartsData struct {
 	ActiveUser     *ChartsUint  `json:"active_user"`
 	NewUser        *ChartsInt   `json:"new_user"`
 	LabelDist      []LabelsData `json:"label_dist"`
+	ConsumeCoin    *ChartsUint  `json:"consume_coin"`
 }
 
 type ChartsUint struct {