credit.go 3.3 KB

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