statistic.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. # -*- coding:utf-8 -*-
  2. from datetime import datetime
  3. import pytz
  4. from flask import jsonify
  5. from flask_login import login_required, current_user
  6. from flask_restful import Resource, reqparse
  7. from controllers.console import api
  8. from controllers.console.app import _get_app
  9. from controllers.console.setup import setup_required
  10. from controllers.console.wraps import account_initialization_required
  11. from libs.helper import datetime_string
  12. from extensions.ext_database import db
  13. class DailyConversationStatistic(Resource):
  14. @setup_required
  15. @login_required
  16. @account_initialization_required
  17. def get(self, app_id):
  18. account = current_user
  19. app_id = str(app_id)
  20. app_model = _get_app(app_id)
  21. parser = reqparse.RequestParser()
  22. parser.add_argument('start', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
  23. parser.add_argument('end', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
  24. args = parser.parse_args()
  25. sql_query = '''
  26. SELECT date(DATE_TRUNC('day', created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, count(distinct messages.conversation_id) AS conversation_count
  27. FROM messages where app_id = :app_id
  28. '''
  29. arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
  30. timezone = pytz.timezone(account.timezone)
  31. utc_timezone = pytz.utc
  32. if args['start']:
  33. start_datetime = datetime.strptime(args['start'], '%Y-%m-%d %H:%M')
  34. start_datetime = start_datetime.replace(second=0)
  35. start_datetime_timezone = timezone.localize(start_datetime)
  36. start_datetime_utc = start_datetime_timezone.astimezone(utc_timezone)
  37. sql_query += ' and created_at >= :start'
  38. arg_dict['start'] = start_datetime_utc
  39. if args['end']:
  40. end_datetime = datetime.strptime(args['end'], '%Y-%m-%d %H:%M')
  41. end_datetime = end_datetime.replace(second=0)
  42. end_datetime_timezone = timezone.localize(end_datetime)
  43. end_datetime_utc = end_datetime_timezone.astimezone(utc_timezone)
  44. sql_query += ' and created_at < :end'
  45. arg_dict['end'] = end_datetime_utc
  46. sql_query += ' GROUP BY date order by date'
  47. rs = db.session.execute(sql_query, arg_dict)
  48. response_date = []
  49. for i in rs:
  50. response_date.append({
  51. 'date': str(i.date),
  52. 'conversation_count': i.conversation_count
  53. })
  54. return jsonify({
  55. 'data': response_date
  56. })
  57. class DailyTerminalsStatistic(Resource):
  58. @setup_required
  59. @login_required
  60. @account_initialization_required
  61. def get(self, app_id):
  62. account = current_user
  63. app_id = str(app_id)
  64. app_model = _get_app(app_id)
  65. parser = reqparse.RequestParser()
  66. parser.add_argument('start', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
  67. parser.add_argument('end', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
  68. args = parser.parse_args()
  69. sql_query = '''
  70. SELECT date(DATE_TRUNC('day', created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, count(distinct messages.from_end_user_id) AS terminal_count
  71. FROM messages where app_id = :app_id
  72. '''
  73. arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
  74. timezone = pytz.timezone(account.timezone)
  75. utc_timezone = pytz.utc
  76. if args['start']:
  77. start_datetime = datetime.strptime(args['start'], '%Y-%m-%d %H:%M')
  78. start_datetime = start_datetime.replace(second=0)
  79. start_datetime_timezone = timezone.localize(start_datetime)
  80. start_datetime_utc = start_datetime_timezone.astimezone(utc_timezone)
  81. sql_query += ' and created_at >= :start'
  82. arg_dict['start'] = start_datetime_utc
  83. if args['end']:
  84. end_datetime = datetime.strptime(args['end'], '%Y-%m-%d %H:%M')
  85. end_datetime = end_datetime.replace(second=0)
  86. end_datetime_timezone = timezone.localize(end_datetime)
  87. end_datetime_utc = end_datetime_timezone.astimezone(utc_timezone)
  88. sql_query += ' and created_at < :end'
  89. arg_dict['end'] = end_datetime_utc
  90. sql_query += ' GROUP BY date order by date'
  91. rs = db.session.execute(sql_query, arg_dict)
  92. response_date = []
  93. for i in rs:
  94. response_date.append({
  95. 'date': str(i.date),
  96. 'terminal_count': i.terminal_count
  97. })
  98. return jsonify({
  99. 'data': response_date
  100. })
  101. class DailyTokenCostStatistic(Resource):
  102. @setup_required
  103. @login_required
  104. @account_initialization_required
  105. def get(self, app_id):
  106. account = current_user
  107. app_id = str(app_id)
  108. app_model = _get_app(app_id)
  109. parser = reqparse.RequestParser()
  110. parser.add_argument('start', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
  111. parser.add_argument('end', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
  112. args = parser.parse_args()
  113. sql_query = '''
  114. SELECT date(DATE_TRUNC('day', created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date,
  115. (sum(messages.message_tokens) + sum(messages.answer_tokens)) as token_count,
  116. sum(total_price) as total_price
  117. FROM messages where app_id = :app_id
  118. '''
  119. arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
  120. timezone = pytz.timezone(account.timezone)
  121. utc_timezone = pytz.utc
  122. if args['start']:
  123. start_datetime = datetime.strptime(args['start'], '%Y-%m-%d %H:%M')
  124. start_datetime = start_datetime.replace(second=0)
  125. start_datetime_timezone = timezone.localize(start_datetime)
  126. start_datetime_utc = start_datetime_timezone.astimezone(utc_timezone)
  127. sql_query += ' and created_at >= :start'
  128. arg_dict['start'] = start_datetime_utc
  129. if args['end']:
  130. end_datetime = datetime.strptime(args['end'], '%Y-%m-%d %H:%M')
  131. end_datetime = end_datetime.replace(second=0)
  132. end_datetime_timezone = timezone.localize(end_datetime)
  133. end_datetime_utc = end_datetime_timezone.astimezone(utc_timezone)
  134. sql_query += ' and created_at < :end'
  135. arg_dict['end'] = end_datetime_utc
  136. sql_query += ' GROUP BY date order by date'
  137. rs = db.session.execute(sql_query, arg_dict)
  138. response_date = []
  139. for i in rs:
  140. response_date.append({
  141. 'date': str(i.date),
  142. 'token_count': i.token_count,
  143. 'total_price': i.total_price,
  144. 'currency': 'USD'
  145. })
  146. return jsonify({
  147. 'data': response_date
  148. })
  149. api.add_resource(DailyConversationStatistic, '/apps/<uuid:app_id>/statistics/daily-conversations')
  150. api.add_resource(DailyTerminalsStatistic, '/apps/<uuid:app_id>/statistics/daily-end-users')
  151. api.add_resource(DailyTokenCostStatistic, '/apps/<uuid:app_id>/statistics/token-costs')