app.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. from flask import Flask
  2. import base64
  3. from io import BytesIO
  4. from matplotlib.figure import Figure
  5. import json
  6. from DataCenter import dataCenter
  7. from MchDataCenter import mchDataCenter
  8. # from plog import initLog
  9. from flask import request, jsonify
  10. import logging
  11. from logging.handlers import RotatingFileHandler
  12. import time
  13. import signal as sig
  14. import sys, getopt
  15. app = Flask(__name__)
  16. app.debug = True
  17. curname = __name__
  18. logging.basicConfig(filename='/var/www/html/data/log/flask.log',
  19. format='%(levelname)10s %(asctime)s %(name)10s %(thread)d %(message)s',
  20. level=logging.DEBUG)
  21. logger = logging.getLogger('plot')
  22. from refill import ChannelCumPainter, MerchantPainter
  23. from refill import filter_chname, filter_cardtype, filter_mchids, get_channels, get_mchids
  24. def parse_parmeter():
  25. end_time = request.args.get('end_time')
  26. end_time = None if end_time is None else int(end_time.strip())
  27. start_time = request.args.get('start_time')
  28. start_time = None if start_time is None else int(start_time.strip())
  29. card_types = request.args.get('card_types')
  30. card_types = filter_cardtype(card_types)
  31. spec = request.args.get('spec')
  32. if spec is not None:
  33. spec = int(spec.strip())
  34. filter_wave = request.args.get('filter_wave')
  35. if filter_wave is not None:
  36. filter_wave = int(filter_wave.strip())
  37. return start_time, end_time, card_types, spec, filter_wave
  38. def onError(ex):
  39. logger.error(ex)
  40. return jsonify({'state': 'fail'})
  41. @app.route('/plot/ch_ratio')
  42. def ch_ratio():
  43. try:
  44. logger.debug('start chratio')
  45. start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
  46. chnames = request.args.get('chnames')
  47. chnames = filter_chname(chnames)
  48. painter = ChannelCumPainter(start_time=start_time, end_time=end_time, chnames=chnames, card_types=card_types, spec=spec, filter_wave=filter_wave)
  49. buf, ratios = painter.paint()
  50. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  51. return jsonify({'img': data, 'ratios': ratios, 'state': 'success'})
  52. except Exception as ex:
  53. return onError(ex)
  54. @app.route('/plot/channels')
  55. def channels():
  56. try:
  57. channels = get_channels()
  58. return jsonify(channels)
  59. except Exception as ex:
  60. logger.error(ex)
  61. return jsonify([])
  62. @app.route('/plot/mchids')
  63. def mchids():
  64. try:
  65. mchids = get_mchids()
  66. return jsonify(mchids)
  67. except Exception as ex:
  68. logger.error(ex)
  69. return jsonify([])
  70. @app.route('/plot/mch_ratio')
  71. def mch_ratio():
  72. try:
  73. logger.debug('start mchratio')
  74. start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
  75. mchids = request.args.get('mchids')
  76. mchids = filter_mchids(mchids)
  77. painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave)
  78. buf, ratios = painter.paint_ratios()
  79. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  80. return jsonify({'img': data, 'ratios': ratios, 'state': 'success'})
  81. except Exception as ex:
  82. return onError(ex)
  83. @app.route('/plot/mch_order_send')
  84. def mch_order_send():
  85. try:
  86. logger.debug('start mch_order_send')
  87. start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
  88. mchids = request.args.get('mchids')
  89. mchids = filter_mchids(mchids)
  90. painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave)
  91. buf, mchids = painter.paint_refilling()
  92. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  93. return jsonify({'img': data, 'mchids': mchids, 'state': 'success'})
  94. except Exception as ex:
  95. return onError(ex)
  96. @app.route('/plot/index')
  97. def index():
  98. app.logger.debug('start')
  99. time_stamp = request.args.get('time_stamp')
  100. interval = request.args.get('interval')
  101. chname = request.args.get('chname')
  102. quality = request.args.get('quality')
  103. card_type = request.args.get('card_type')
  104. amount = request.args.get('amount')
  105. app.logger.info('time_stamp=%s interval= %s chname=%s quality=%s card_type=%s amount=%s',
  106. time_stamp, interval, chname, quality, card_type, amount)
  107. if time_stamp is None:
  108. time_stamp = time.time()
  109. else:
  110. time_stamp = int(time_stamp)
  111. if interval is None:
  112. interval = 300
  113. else:
  114. interval = int(interval)
  115. buf = dataCenter.draw_plot(time_stamp,
  116. interval=interval,
  117. chname=chname,
  118. quality=quality,
  119. card_type=card_type,
  120. amount=amount)
  121. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  122. return f"<img src='data:image/png;base64,{data}'/>"
  123. @app.route('/plot/days')
  124. def days():
  125. s_time = time.time()
  126. dates = dataCenter.days()
  127. e_time = time.time()
  128. print('time=', e_time - s_time)
  129. dates.reverse()
  130. dates = dates[0:30]
  131. return jsonify(dates)
  132. @app.route('/plot/paths')
  133. def paths():
  134. time_stamp = request.args.get('time_stamp')
  135. time_stamp = int(time_stamp)
  136. paths = dataCenter.paths(time_stamp)
  137. return jsonify(paths)
  138. @app.route('/plot/mchdays')
  139. def mchdays():
  140. dates = mchDataCenter.days()
  141. dates.reverse()
  142. dates = dates[0:30]
  143. return jsonify(dates)
  144. @app.route('/plot/mchpaths')
  145. def mchpaths():
  146. time_stamp = request.args.get('time_stamp')
  147. time_stamp = int(time_stamp)
  148. paths = mchDataCenter.paths(time_stamp)
  149. return jsonify(paths)
  150. @app.route('/plot/mchplot')
  151. def mchplot():
  152. time_stamp = request.args.get('time_stamp')
  153. interval = request.args.get('interval')
  154. mchid = request.args.get('mchid')
  155. quality = request.args.get('quality')
  156. card_type = request.args.get('card_type')
  157. amount = request.args.get('amount')
  158. app.logger.info('time_stamp=%s interval= %s chname=%s quality=%s card_type=%s amount=%s',
  159. time_stamp, interval, mchid, quality, card_type, amount)
  160. if time_stamp is None:
  161. time_stamp = time.time()
  162. else:
  163. time_stamp = int(time_stamp)
  164. if interval is None:
  165. interval = 300
  166. else:
  167. interval = int(interval)
  168. buf = mchDataCenter.draw_plot(time_stamp, interval=interval, mchid=mchid, quality=quality, card_type=card_type,
  169. amount=amount)
  170. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  171. return f"<img src='data:image/png;base64,{data}'/>"
  172. if __name__ == "__main__":
  173. debug_mode = True
  174. if debug_mode:
  175. app.run(debug=True, host='0.0.0.0', port=5000)
  176. else:
  177. from gevent import monkey
  178. from gevent.pywsgi import WSGIServer
  179. from gevent import signal as geventsig
  180. monkey.patch_all()
  181. http_server = WSGIServer(('0.0.0.0', 5000), app)
  182. geventsig.signal(sig.SIGTERM, lambda: http_server.stop())
  183. geventsig.signal(sig.SIGINT, lambda: http_server.stop())
  184. http_server.serve_forever()