credit.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package credit
  2. import (
  3. "context"
  4. "fmt"
  5. "wechat-api/ent"
  6. "wechat-api/ent/creditbalance"
  7. "wechat-api/ent/custom_types"
  8. "wechat-api/ent/usagetotal"
  9. )
  10. type Usage struct {
  11. PromptTokens uint64 `json:"prompt_tokens"`
  12. CompletionTokens uint64 `json:"completion_tokens"`
  13. TotalTokens uint64 `json:"total_tokens"`
  14. }
  15. func AddCreditUsage(tx *ent.Tx, ctx context.Context,
  16. agentId string, userId string, departmentId uint64,
  17. question *string, answer *string,
  18. originalData *custom_types.OriginalData, chatData *Usage, model string) error {
  19. // 积分明细表记录使用量
  20. //modelName, price := GetModelPrice(model)
  21. modelName, price := ComputeModelPrice(originalData.VResponse)
  22. number := ComputePrice(price, chatData.TotalTokens)
  23. originalData.VResponse = nil
  24. // 记录Token使用信息
  25. usageDetailItem, err := tx.UsageDetail.Create().
  26. SetType(3). //1-微信 2-名片 3-智能体
  27. SetBotID(agentId). //智能体ID
  28. SetReceiverID(userId). //接收者userID
  29. SetApp(8). //8-智能体
  30. SetSessionID(0).
  31. SetRequest(*question).
  32. SetResponse(*answer).
  33. SetOriginalData(*originalData).
  34. SetTotalTokens(chatData.TotalTokens).
  35. SetPromptTokens(chatData.PromptTokens).
  36. SetCompletionTokens(chatData.CompletionTokens).
  37. SetModel(modelName).
  38. SetCredits(number).
  39. Save(ctx)
  40. if err != nil {
  41. fmt.Printf("create usage_detail failed:%v\n", err)
  42. return err
  43. }
  44. // 记录Token使用总量
  45. usageTotal, err := tx.UsageTotal.Query().Where(usagetotal.OrganizationID(departmentId)).First(ctx)
  46. if err != nil {
  47. if ent.IsNotFound(err) {
  48. usageTotal, err = tx.UsageTotal.Create().
  49. SetBotID(agentId).
  50. SetTotalTokens(chatData.TotalTokens).
  51. SetEndIndex(usageDetailItem.ID).
  52. SetOrganizationID(departmentId).
  53. Save(ctx)
  54. } else {
  55. fmt.Printf("create usage_total failed:organization_id:%v err:%v\n", departmentId, err)
  56. return err
  57. }
  58. } else {
  59. // 更新Token使用总量
  60. _, err = tx.UsageTotal.Update().
  61. Where(usagetotal.OrganizationID(departmentId)).
  62. SetTotalTokens(usageTotal.TotalTokens + chatData.TotalTokens).
  63. SetEndIndex(usageDetailItem.ID).
  64. Save(ctx)
  65. if err != nil {
  66. fmt.Printf("update usage_total failed:organization_id:%v err:%v\n", departmentId, err)
  67. return err
  68. }
  69. }
  70. creditBalanceItem, err := tx.CreditBalance.Query().Where(creditbalance.OrganizationID(departmentId)).First(ctx)
  71. if err != nil {
  72. if ent.IsNotFound(err) {
  73. creditBalanceItem, err = tx.CreditBalance.Create().
  74. SetOrganizationID(departmentId).
  75. SetBalance(0).
  76. Save(ctx)
  77. if err != nil {
  78. fmt.Printf("create credit_balance failed. organization_id:%v error:%v\n", departmentId, err)
  79. return err
  80. }
  81. } else {
  82. fmt.Printf("query credit_balance failed: organization_id:%v error:%v\n", departmentId, err)
  83. return err
  84. }
  85. }
  86. // 积分使用明细记录
  87. beforeNumber := creditBalanceItem.Balance
  88. afterNumber := Subtraction(beforeNumber, number)
  89. _, err = tx.CreditUsage.Create().
  90. SetUserID(userId).
  91. SetNumber(number).
  92. SetBeforeNumber(0).
  93. SetAfterNumber(0).
  94. SetNtype(1).
  95. SetNid(usageDetailItem.ID).
  96. SetTable("usage_detail").
  97. SetOrganizationID(departmentId).
  98. Save(ctx)
  99. if err != nil {
  100. fmt.Printf("create credit_usage failed:%v\n", err)
  101. return err
  102. }
  103. // 积分账户扣减积分
  104. _, err = tx.CreditBalance.Update().Where(creditbalance.OrganizationID(departmentId)).SetBalance(afterNumber).Save(ctx)
  105. if err != nil {
  106. fmt.Printf("update credit_balance failed: organization_id:%v error:%v\n", departmentId, err)
  107. return err
  108. }
  109. return nil
  110. }