DefaultController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <?php
  2. namespace addons\LuckyGroup\backend\controllers;
  3. use addons\LuckyGroup\common\enums\LuckyGroupEnum;
  4. use addons\LuckyGroup\common\models\LuckyGroupActivity;
  5. use addons\LuckyGroup\common\models\LuckyGroupCategory;
  6. use addons\LuckyGroup\common\models\LuckyGroupMallOpenGroupStatistics;
  7. use addons\LuckyGroup\common\models\LuckyGroupMallStatistics;
  8. use addons\LuckyGroup\common\models\LuckyGroupGoods;
  9. use addons\LuckyGroup\common\models\LuckyGroupUser;
  10. use addons\LuckyGroup\common\models\LuckyGroupVisitLog;
  11. use common\enums\StatusEnum;
  12. use common\models\user\User;
  13. /**
  14. * 默认控制器
  15. *
  16. * Class DefaultController
  17. * @package addons\LuckyGroup\backend\controllers
  18. */
  19. class DefaultController extends BaseController
  20. {
  21. /**
  22. * 幸运拼团数据概况页面
  23. *
  24. * @return string
  25. */
  26. public function actionIndex()
  27. {
  28. if (!\Yii::$app->request->isAjax) {
  29. return $this->render('/statistics/index');
  30. }
  31. if (!\Yii::$app->request->isGet) {
  32. return $this->error('请求方式错误');
  33. }
  34. $start_date = \Yii::$app->request->get('start_date');
  35. $end_date = \Yii::$app->request->get('end_date');
  36. /* 页面顶部统计汇总 ----- start ------*/
  37. $this_moth_statistics = LuckyGroupMallStatistics::find()
  38. ->select('attend_commission,attend_money,win_money,attend_peoples,win_peoples,total_attend_commission,total_attend_money,total_win_money,total_attend_peoples,total_win_peoples')
  39. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'statistics_month' => date('Y-m')])
  40. ->asArray()
  41. ->one();
  42. $total_statistics = [];
  43. if (empty($this_moth_statistics)) {
  44. $this_moth_statistics = [];
  45. $total_statistics = LuckyGroupMallStatistics::find()
  46. ->select('total_attend_commission,total_attend_money,total_win_money,total_attend_peoples,total_win_peoples')
  47. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  48. ->orderBy('created_at desc')
  49. ->limit(1)
  50. ->asArray()
  51. ->one();
  52. }
  53. $all_statistics = array_merge($this_moth_statistics, $total_statistics);
  54. /* 页面顶部统计汇总 ----- end ------*/
  55. /* 访问概况 ----- start ------- */
  56. $start_time = $start_date ? strtotime($start_date . ' 00:00:00') : strtotime("-0 year -0 month -10 day");
  57. $end_time = $end_date ? strtotime($end_date . ' 23:59:59') : time();
  58. $visit_logs = LuckyGroupVisitLog::find()
  59. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  60. ->andWhere(['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]])
  61. ->asArray()
  62. ->all();
  63. //浏览量
  64. $data = self::getDayByDayData($visit_logs, $start_time, $end_time, 'visit-view');
  65. $echarts_visit_data['view_num'] = ['keys' => array_keys($data), 'values' => array_values($data)];
  66. //访客数
  67. $data = self::getDayByDayData($visit_logs, $start_time, $end_time, 'visit');
  68. $echarts_visit_data['visit_num'] = ['keys' => array_keys($data), 'values' => array_values($data)];
  69. $echarts_visit_data['sum_view_num'] = array_sum($echarts_visit_data['view_num']['values']);
  70. $echarts_visit_data['sum_visit_num'] = array_sum($echarts_visit_data['visit_num']['values']);
  71. // dd($echarts_visit_data);
  72. /* 访问概况 ----- end ------- */
  73. /* 金额图表 ---- start ---- */
  74. $attend_win_amounts = $attend_loss_amounts = 0;
  75. $open_group_stat_query = LuckyGroupMallOpenGroupStatistics::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);
  76. foreach ($open_group_stat_query->batch(200) as $open_group_stats) {
  77. foreach ($open_group_stats as $stat) {
  78. $attend_win_amounts += $stat->win_money;
  79. $attend_loss_amounts += $stat->loss_money;
  80. }
  81. }
  82. $configs['customize_text'] = \Yii::$app->services->setting->addons->get($this->mall_id, LuckyGroupEnum::ADDONS_NAME, 'customize_text');
  83. $customize_texts = [];
  84. foreach ($configs['customize_text'] as $key => $customize_text) {
  85. $customize_text = json_decode($customize_text, true);
  86. $customize_texts[$customize_text['field_name']] = $customize_text;
  87. }
  88. // dd($customize_texts);
  89. $attend_win_name = $customize_texts['join_success_text']['new_text'];
  90. $attend_loss_name = $customize_texts['join_fail_text']['new_text'];
  91. $attend_amounts = $all_statistics['total_attend_money'] ?? 0;
  92. $total_win_amounts = $all_statistics['total_win_money'] ?? 0;
  93. $echarts_money_data = [
  94. 'names' => [$attend_win_name, $attend_loss_name],
  95. 'attend_amounts' => $attend_amounts,
  96. 'echarts_money' => [
  97. ['name' => $attend_win_name, 'value' => $total_win_amounts],
  98. ['name' => $attend_loss_name, 'value' => bcsub($attend_amounts, $total_win_amounts, 2)],
  99. ],
  100. ];
  101. // dd($echarts_money_data);
  102. /* 金额图表 ---- end ---- */
  103. /* 会员概况 ---- start ----- */
  104. $mall_statistics = LuckyGroupMallOpenGroupStatistics::find()
  105. ->select('id,mall_id,attend_peoples,win_peoples,loss_peoples,created_at')
  106. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  107. ->andWhere(['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]])
  108. ->asArray()
  109. ->all();
  110. $data = self::getDayByDayData($mall_statistics, $start_time, $end_time, 'user-attend');
  111. $echarts_user_data['attend_peoples'] = ['keys' => array_keys($data), 'values' => array_values($data)];
  112. $data = self::getDayByDayData($mall_statistics, $start_time, $end_time, 'user-win');
  113. $echarts_user_data['win_peoples'] = ['keys' => array_keys($data), 'values' => array_values($data)];
  114. $data = self::getDayByDayData($mall_statistics, $start_time, $end_time, 'user-loss');
  115. $echarts_user_data['loss_peoples'] = ['keys' => array_keys($data), 'values' => array_values($data)];
  116. // dd($echarts_user_data);
  117. /* 会员概况 ---- end ----- */
  118. /* 拼中排行榜 ---- start ----- */
  119. $user_ranking_list = LuckyGroupUser::find()
  120. ->select('id,user_id,has_attend_times,win_orders,win_num,max_order_money,attend_money')
  121. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  122. ->orderBy('win_num desc,created_at asc')
  123. ->limit(10)
  124. ->asArray()
  125. ->all();
  126. if (!empty($user_ranking_list)) {
  127. $user_ids = array_column($user_ranking_list, 'user_id');
  128. $users = User::find()
  129. ->select('id,nickname,mobile,avatar_url')
  130. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_ids])
  131. ->asArray()
  132. ->indexBy('id')
  133. ->all();
  134. foreach ($user_ranking_list as &$list) {
  135. $user = $users[$list['user_id']] ?? [];
  136. $list['nickname'] = $user['nickname'] ?? '';
  137. $list['mobile'] = $user['mobile'] ?? '';
  138. $list['avatar_url'] = !empty($user['avatar_url']) ? $user['avatar_url'] : \Yii::$app->request->hostInfo . '/resources/img/common/default-avatar.png';
  139. }
  140. }
  141. /* 拼中排行榜 ---- end ----- */
  142. $data = [
  143. 'user_ranking_list' => $user_ranking_list,
  144. 'echarts_user_data' => $echarts_user_data,
  145. 'echarts_money_data' => $echarts_money_data,
  146. 'echarts_visit_data' => $echarts_visit_data,
  147. 'statistic' => $all_statistics,
  148. ];
  149. return $this->success('success', $data);
  150. }
  151. //获取统计表数据格式
  152. private static function getDayByDayData($list, $start = "", $end = "", $type)
  153. {
  154. $data = array();
  155. if (!empty($list)) {
  156. foreach ($list as $val) {
  157. $key = date('Y-m-d', $val['created_at']);
  158. if ($type == 'user-attend') {
  159. if (!isset($data[$key])) {
  160. $data[$key] = 0;
  161. }
  162. $data[$key] += $val['attend_peoples'];
  163. } elseif ($type == 'user-win') {
  164. if (!isset($data[$key])) {
  165. $data[$key] = 0;
  166. }
  167. $data[$key] += $val['win_peoples'];
  168. } elseif ($type == 'user-loss') {
  169. if (!isset($data[$key])) {
  170. $data[$key] = 0;
  171. }
  172. $data[$key] += $val['loss_peoples'];
  173. } elseif ($type == 'visit-view') {
  174. if (!isset($data[$key])) {
  175. $data[$key] = 0;
  176. }
  177. $data[$key] += $val['view_num'];
  178. } elseif ($type == 'visit') {
  179. if (!isset($data[$key])) {
  180. $data[$key] = 0;
  181. }
  182. $data[$key] += 1;
  183. }
  184. }
  185. }
  186. //补足不存在的天
  187. for ($start; $start <= $end; $start = strtotime('+1 day', $start)) {
  188. $date = date('Y-m-d', $start);
  189. if (!isset($data[$date])) $data[$date] = 0;
  190. }
  191. ksort($data);
  192. return $data;
  193. }
  194. /**
  195. * @desc:拼团商品列表
  196. * @Author: hua
  197. * @Date: 2021/12/14
  198. * @Time: 15:52
  199. * @Copyright: copyright (c) 2021 广东七件事集团
  200. * @return mixed|void
  201. */
  202. public function actionCheckActiveList()
  203. {
  204. $get = \Yii::$app->request->get();
  205. $goods_id = json_decode($get['goods_id'], true);
  206. $list = LuckyGroupGoods::getGoodsList($this->mall_id,$goods_id);
  207. return $this->success('操作成功', $list);
  208. }
  209. /**
  210. * @desc:获取拼团分类列表,添加活动使用,不用验证权限
  211. * @Author: hua
  212. * @Date: 2021/12/13
  213. * @Time: 18:51
  214. * @Copyright: copyright (c) 2021 广东七件事集团
  215. * @return mixed|string|void
  216. */
  217. public function actionCateList()
  218. {
  219. $request = \Yii::$app->request;
  220. if ($request->isAjax) {
  221. $list = LuckyGroupCategory::lists(['where' => [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]], 'order' => 'id asc', 'select' => 'id,title as name']);
  222. return $this->success('操作成功', compact('list'));
  223. }
  224. }
  225. }