credit.go 3.4 KB

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