123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package credit
- import (
- "context"
- "fmt"
- "wechat-api/ent"
- "wechat-api/ent/creditbalance"
- "wechat-api/ent/custom_types"
- "wechat-api/ent/usagetotal"
- "wechat-api/hook/dify"
- )
- func AddCreditUsage(tx *ent.Tx, ctx context.Context,
- agentId string, userId string, departmentId uint64,
- question *string, answer *string,
- originalData *custom_types.OriginalData, chatData *dify.ChatResp) error {
- // 积分明细表记录使用量
- modelName, price := GetModelPrice()
- number := ComputePrice(price, chatData.Metadata.Usage.TotalTokens)
- // 记录Token使用信息
- usageDetailItem, err := tx.UsageDetail.Create().
- SetType(3). //1-微信 2-名片 3-智能体
- SetBotID(agentId). //智能体ID
- SetReceiverID(userId). //接收者userID
- SetApp(8). //8-智能体
- SetSessionID(0).
- SetRequest(*question).
- SetResponse(*answer).
- SetOriginalData(*originalData).
- SetTotalTokens(chatData.Metadata.Usage.TotalTokens).
- SetPromptTokens(chatData.Metadata.Usage.PromptTokens).
- SetCompletionTokens(chatData.Metadata.Usage.CompletionTokens).
- SetModel(modelName).
- SetCredits(number).
- Save(ctx)
- if err != nil {
- fmt.Printf("create usage_detail failed:%v\n", err)
- return err
- }
- // 记录Token使用总量
- usageTotal, err := tx.UsageTotal.Query().Where(usagetotal.OrganizationID(departmentId)).First(ctx)
- if err != nil {
- if ent.IsNotFound(err) {
- usageTotal, err = tx.UsageTotal.Create().
- SetBotID(agentId).
- SetTotalTokens(chatData.Metadata.Usage.TotalTokens).
- SetEndIndex(usageDetailItem.ID).
- SetOrganizationID(departmentId).
- Save(ctx)
- } else {
- fmt.Printf("create usage_total failed:organization_id:%v err:%v\n", departmentId, err)
- return err
- }
- } else {
- // 更新Token使用总量
- _, err = tx.UsageTotal.Update().
- Where(usagetotal.OrganizationID(departmentId)).
- SetTotalTokens(usageTotal.TotalTokens + chatData.Metadata.Usage.TotalTokens).
- SetEndIndex(usageDetailItem.ID).
- Save(ctx)
- if err != nil {
- fmt.Printf("update usage_total failed:organization_id:%v err:%v\n", departmentId, err)
- return err
- }
- }
- creditBalanceItem, err := tx.CreditBalance.Query().Where(creditbalance.OrganizationID(departmentId)).First(ctx)
- if err != nil {
- if ent.IsNotFound(err) {
- creditBalanceItem, err = tx.CreditBalance.Create().
- SetOrganizationID(departmentId).
- SetBalance(0).
- Save(ctx)
- if err != nil {
- fmt.Printf("create credit_balance failed. organization_id:%v error:%v\n", departmentId, err)
- return err
- }
- } else {
- fmt.Printf("query credit_balance failed: organization_id:%v error:%v\n", departmentId, err)
- return err
- }
- }
- // 积分使用明细记录
- beforeNumber := creditBalanceItem.Balance
- afterNumber := Subtraction(beforeNumber, number)
- _, err = tx.CreditUsage.Create().
- SetUserID(userId).
- SetNumber(number).
- SetBeforeNumber(beforeNumber).
- SetAfterNumber(afterNumber).
- SetNtype(1).
- SetNid(usageDetailItem.ID).
- SetTable("usage_detail").
- SetOrganizationID(departmentId).
- Save(ctx)
- if err != nil {
- fmt.Printf("create credit_usage failed:%v\n", err)
- return err
- }
- // 积分账户扣减积分
- _, err = tx.CreditBalance.Update().Where(creditbalance.OrganizationID(departmentId)).SetBalance(afterNumber).Save(ctx)
- if err != nil {
- fmt.Printf("update credit_balance failed: organization_id:%v error:%v\n", departmentId, err)
- return err
- }
- return nil
- }
|