Statistics.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace app\admin\controller\ask;
  3. use app\common\controller\Backend;
  4. /**
  5. * 问答统计管理
  6. *
  7. * @icon fa fa-bar-chart
  8. * @remark 可以查看订单相关统计信息
  9. */
  10. class Statistics extends Backend
  11. {
  12. /**
  13. * 模型对象
  14. */
  15. protected $model = null;
  16. public function _initialize()
  17. {
  18. parent::_initialize();
  19. }
  20. /**
  21. * 查询统计
  22. */
  23. public function index()
  24. {
  25. try {
  26. \think\Db::execute("SET @@sql_mode='';");
  27. } catch (\Exception $e) {
  28. }
  29. $date = $this->request->post('date', '');
  30. $data = $this->getOrderStatisticsData($date);
  31. $statistics = ['columns' => array_keys($data), 'data' => array_values($data), 'amount' => sprintf("%.2f", array_sum(array_values($data)))];
  32. //订单金额数
  33. $statistics['todayincome'] = floatval(\app\admin\model\ask\Order::whereTime('paytime', 'today')->sum('payamount'));
  34. $statistics['totalincome'] = floatval(\app\admin\model\ask\Order::where('paytime', '>', 0)->sum('payamount'));
  35. //订单数
  36. $statistics['todayorders'] = intval(\app\admin\model\ask\Order::whereTime('paytime', 'today')->count());
  37. $statistics['totalorders'] = intval(\app\admin\model\ask\Order::where('paytime', '>', 0)->count());
  38. //问题数
  39. $statistics['todayquestions'] = intval(\app\admin\model\ask\Question::whereTime('createtime', 'today')->count());
  40. $statistics['totalquestions'] = intval(\app\admin\model\ask\Question::where('createtime', '>', 0)->count());
  41. //文章数
  42. $statistics['todayarticles'] = intval(\app\admin\model\ask\Article::whereTime('createtime', 'today')->count());
  43. $statistics['totalarticles'] = intval(\app\admin\model\ask\Article::where('createtime', '>', 0)->count());
  44. //未认证数
  45. $statistics['totaluncertifications'] = intval(\app\admin\model\ask\Certification::where('status', '=', 'hidden')->count());;
  46. //未采纳数
  47. $statistics['totalunadopted'] = intval(\app\admin\model\ask\Question::where('best_answer_id', '=', 0)->count());;
  48. //未处理举报数
  49. $statistics['totalunreports'] = intval(\app\admin\model\ask\Report::where('status', '=', 'hidden')->count());
  50. //总文章数
  51. $statistics['totalanswers'] = intval(\app\admin\model\ask\Answer::where('createtime', '>', 0)->count());
  52. if ($this->request->isPost()) {
  53. $this->success('', '', $statistics);
  54. }
  55. $this->view->assign('statistics', $statistics);
  56. $this->assignconfig('statistics', $statistics);
  57. return $this->view->fetch();
  58. }
  59. /**
  60. * 获取订单统计数据
  61. * @param string $date
  62. * @return array
  63. */
  64. protected function getOrderStatisticsData($date = '')
  65. {
  66. if ($date) {
  67. list($start, $end) = explode(' - ', $date);
  68. $starttime = strtotime($start);
  69. $endtime = strtotime($end);
  70. } else {
  71. $starttime = \fast\Date::unixtime('day', 0, 'begin');
  72. $endtime = \fast\Date::unixtime('day', 0, 'end');
  73. }
  74. $totalseconds = $endtime - $starttime;
  75. $format = '%Y-%m-%d';
  76. if ($totalseconds > 86400 * 30 * 2) {
  77. $format = '%Y-%m';
  78. } else if ($totalseconds > 86400) {
  79. $format = '%Y-%m-%d';
  80. } else {
  81. $format = '%H:00';
  82. }
  83. $orderlist = \app\admin\model\ask\Order::where('paytime', 'between time', [$starttime, $endtime])
  84. ->field('paytime, status, COUNT(*) AS nums, SUM(payamount) AS amount, MIN(paytime) AS min_paytime, MAX(paytime) AS max_paytime,
  85. DATE_FORMAT(FROM_UNIXTIME(paytime), "' . $format . '") AS order_date')
  86. ->group('order_date')
  87. ->select();
  88. if ($totalseconds > 84600 * 30 * 2) {
  89. $starttime = strtotime('last month', $starttime);
  90. while (($starttime = strtotime('next month', $starttime)) <= $endtime) {
  91. $column[] = date('Y-m', $starttime);
  92. }
  93. } else if ($totalseconds > 86400) {
  94. for ($time = $starttime; $time <= $endtime;) {
  95. $column[] = date("Y-m-d", $time);
  96. $time += 86400;
  97. }
  98. } else {
  99. for ($time = $starttime; $time <= $endtime;) {
  100. $column[] = date("H:00", $time);
  101. $time += 3600;
  102. }
  103. }
  104. $list = array_fill_keys($column, 0);
  105. $orderlist = collection($orderlist)->toArray();
  106. foreach ($orderlist as $k => $v) {
  107. $list[$v['order_date']] = $v['amount'];
  108. }
  109. return $list;
  110. }
  111. }