DefaultController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <?php
  2. namespace addons\Happiness\backend\controllers;
  3. use addons\Happiness\common\models\HappinessStore;
  4. use addons\Happiness\common\enums\HappinessEnum;
  5. use addons\Happiness\common\logic\store\StoreCensus;
  6. use addons\Happiness\common\models\HappinessGoodsRanking;
  7. use addons\Happiness\common\models\HappinessStoreCommission;
  8. use addons\Happiness\common\models\HappinessWithdrawLog;
  9. use common\enums\RedisKeyEnum;
  10. use common\enums\StatusEnum;
  11. use common\helpers\ArrayHelper;
  12. use common\helpers\DateHelper;
  13. use common\models\common\CommissionLog;
  14. use common\models\common\Region;
  15. use Yii;
  16. use common\controllers\AddonsController;
  17. /**
  18. * 默认控制器
  19. *
  20. * Class DefaultController
  21. * @package addons\Happiness\backend\controllers
  22. */
  23. class DefaultController extends BaseController
  24. {
  25. public function actionIndex()
  26. {
  27. if (!\Yii::$app->request->isAjax) {
  28. return $this->render('index');
  29. }
  30. if (\Yii::$app->request->isGet) {
  31. $time_nodes = DateHelper::yesterDay();
  32. $result = $this->getYesterdayData($time_nodes);
  33. list($waiting_audit_withdraw_amounts, $waiting_pay_withdraw_amounts) = $this->getWithdrawData();
  34. /* 顶部统计 ---- end ---- */
  35. $store_good_ranking_list = $this->getStoreGoodRankingList();
  36. /* 省级地区销售排名 ---- start ---- */
  37. $store_datas = $this->getStoreDatas();
  38. /* 省级地区销售排名 ---- end ---- */
  39. // 门店总数
  40. $all_store_numbers = array_sum(array_column($store_datas, 'store_numbers'));
  41. $all_sale_amounts = round(array_sum(array_column($store_datas, 'sale_amounts')), 2);
  42. $data = [
  43. 'currTime' => date('Y-m-d H:i:s'),
  44. 'statistics' => [
  45. 'pay_people_numbers' => $this->getPayPeopleNumbers(),
  46. 'real_pay_amounts' => $this->getRealPayAmounts(),
  47. 'not_settle_amounts' => $this->getNotSettleAmounts(),
  48. // 'settle_amounts' => $this->getSettleAmounts(),
  49. 'pay_order_numbers' => $this->getPayOrderNumbers(),
  50. 'waiting_audit_withdraw_amounts' => $waiting_audit_withdraw_amounts,
  51. 'waiting_pay_withdraw_amounts' => $waiting_pay_withdraw_amounts,
  52. // 'waiting_audit_store_numbers' => $this->getWaitingAuditStoreNumbers(),
  53. 'yesterday_pay_order_numbers' => $result['yesterday_pay_order_numbers'],
  54. 'yesterday_pay_people_numbers' => $result['yesterday_pay_people_numbers'],
  55. 'yesterday_real_pay_amounts' => $result['yesterday_real_pay_amounts'],
  56. 'yesterday_not_settle_amounts' => $result['yesterday_not_settle_amounts'],
  57. 'yesterday_settle_amounts' => $result['yesterday_settle_amounts'],
  58. 'yesterday_waiting_audit_withdraw_amounts' => $result['yesterday_waiting_audit_withdraw_amounts'],
  59. 'yesterday_waiting_pay_withdraw_amounts' => $result['yesterday_waiting_pay_withdraw_amounts'],
  60. 'yesterday_waiting_audit_store_numbers' => $result['yesterday_waiting_audit_store_numbers'],
  61. ],
  62. 'store_good_ranking_list' => $store_good_ranking_list,
  63. 'region_ranking_list' => $store_datas,
  64. 'map' => [
  65. $all_store_numbers, $all_sale_amounts
  66. ],
  67. 'total_store_numbers' => $all_store_numbers,
  68. 'total_sale_amounts' => $all_sale_amounts,
  69. ];
  70. return $this->success('success', $data);
  71. }
  72. }
  73. public function getStoreGoodRankingList()
  74. {
  75. $store_good_ranking_list = HappinessGoodsRanking::find()
  76. ->select('store_id,sum(sales_money) as sales_money')
  77. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  78. ->orderBy('sales_money desc')
  79. ->groupBy('store_id')
  80. ->limit(10)
  81. ->asArray()
  82. ->all();
  83. if (empty($store_good_ranking_list)) {
  84. $store_good_ranking_list = [];
  85. }
  86. if (!empty($store_good_ranking_list)) {
  87. $store_ids = array_column($store_good_ranking_list, 'store_id');
  88. $stores = HappinessStore::find()
  89. ->select('id,store_name,logo_img')
  90. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $store_ids])
  91. ->asArray()
  92. ->indexBy('id')
  93. ->all();
  94. foreach ($store_good_ranking_list as &$list) {
  95. $store = $stores[$list['store_id']] ?? [];
  96. $list['store_name'] = $store['store_name'] ?? '';
  97. $list['logo_img'] = $store['logo_img'] ?? '';
  98. }
  99. }
  100. return $store_good_ranking_list;
  101. }
  102. public function getStoreDatas()
  103. {
  104. $store_datas = [];
  105. $regions = Region::find()->select('id,name')->where(['level' => 1])->asArray()->indexBy('id')->all();
  106. $page = 1;
  107. $limit = 200;
  108. do {
  109. $offset = ($page - 1) * $limit;
  110. $page++;
  111. $stores = HappinessStore::find()
  112. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  113. ->limit($limit)
  114. ->offset($offset)
  115. ->all();
  116. if (!empty($stores)) {
  117. foreach ($stores as $store) {
  118. $store_datas[$store->province_id]['region_name'] = $regions[$store->province_id]['name'] ?? '';
  119. if (!isset($store_datas[$store->province_id]['store_numbers'])) {
  120. $store_datas[$store->province_id]['store_numbers'] = 0;
  121. }
  122. $store_datas[$store->province_id]['store_numbers'] += 1;
  123. if (!isset($store_datas[$store->province_id]['sale_amounts'])) {
  124. $store_datas[$store->province_id]['sale_amounts'] = 0;
  125. }
  126. // $store_datas[$store->province_id]['sale_amounts'] += $store->total_order_money;
  127. $store_datas[$store->province_id]['sale_amounts'] = bcadd($store_datas[$store->province_id]['sale_amounts'], $store->total_order_money, 2);
  128. }
  129. }
  130. } while ($stores);
  131. $store_datas = ArrayHelper::arraySort($store_datas, 'sale_amounts', 'desc');
  132. $store_datas = array_values($store_datas);
  133. return $store_datas;
  134. }
  135. //实收金额
  136. public function getRealPayAmounts()
  137. {
  138. $key = HappinessEnum::STORE_REAL_PAY_AMOUNTS . ':' . $this->mall_id;
  139. $res = \Yii::$app->redis->get($key);//待结算
  140. if (!empty($res)) return $res;
  141. $realPayAmounts = HappinessStoreCommission::find()->where(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'is_settlement' => [0,1]])
  142. ->sum('amount_received');
  143. if(empty($realPayAmounts)) $realPayAmounts = 0;
  144. \Yii::$app->redis->set($key,$realPayAmounts);
  145. return $realPayAmounts;
  146. }
  147. //待结算
  148. public function getNotSettleAmounts()
  149. {
  150. $key = HappinessEnum::STORE_NOT_SETTLE_AMOUNTS . ':' . $this->mall_id;
  151. $res = \Yii::$app->redis->get($key);//待结算
  152. if (!empty($res)) return $res;
  153. $not_settle_amounts = HappinessStoreCommission::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'is_settlement' => 0])
  154. ->sum('amount_received');
  155. if(empty($not_settle_amounts)) $not_settle_amounts = 0;
  156. \Yii::$app->redis->set($key,$not_settle_amounts);
  157. return $not_settle_amounts;
  158. }
  159. //给会员的佣金
  160. public function getSettleAmounts()
  161. {
  162. $key = HappinessEnum::STORE_SETTLE_AMOUNTS . ':' . $this->mall_id;
  163. $res = \Yii::$app->redis->get($key);//给会员的佣金
  164. if (!empty($res)) return $res;
  165. $settle_amounts = CommissionLog::find()->where(['mall_id' => $this->mall_id, 'source_table' => ['store_order_detail', 'store_cashier_order']])->sum('change_num');
  166. if(empty($settle_amounts)) $settle_amounts = 0;
  167. \Yii::$app->redis->set($key,$settle_amounts);
  168. return $settle_amounts;
  169. }
  170. //支付人数
  171. public function getPayPeopleNumbers()
  172. {
  173. $key = HappinessEnum::STORE_PAY_PEOPLE_NUMBERS . ':' . $this->mall_id;
  174. $res = \Yii::$app->redis->get($key);//支付人数
  175. if (!empty($res)) return $res;
  176. $mall_id = $this->mall_id;
  177. $sql = "select count(*) as counts from (select user_id from qimall_addons_happiness_store_commission where mall_id = {$mall_id} and status in(0,1) group by user_id) t";
  178. $result = \Yii::$app->db->createCommand($sql)->queryAll();
  179. if(empty($result[0]['counts'])) $result[0]['counts'] = 0;
  180. \Yii::$app->redis->set($key,$result[0]['counts']);
  181. return $result[0]['counts'];
  182. }
  183. //支付订单数
  184. public function getPayOrderNumbers()
  185. {
  186. $key = HappinessEnum::STORE_PAY_ORDER_NUMBERS . ':' . $this->mall_id;
  187. $res = \Yii::$app->redis->get($key);//支付订单数
  188. if (!empty($res)) return $res;
  189. $pay_order_numbers = HappinessStoreCommission::find()->where(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  190. ->count();
  191. if(empty($pay_order_numbers)) $pay_order_numbers = 0;
  192. \Yii::$app->redis->set($key,$pay_order_numbers);
  193. return $pay_order_numbers;
  194. }
  195. //待审核门店
  196. // public function getWaitingAuditStoreNumbers()
  197. // {
  198. // $key = HappinessEnum::STORE_WAITING_AUDIT_STORE_NUMBERS . ':' . $this->mall_id;
  199. // $res = \Yii::$app->redis->get($key);//待审核门店
  200. // if (!empty($res)) return $res;
  201. // $waiting_audit_store_numbers = HappinessStore::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'check_status' => StoreEnum::CHECK_WAITING])->count();
  202. // if(empty($waiting_audit_store_numbers)) $waiting_audit_store_numbers = 0;
  203. // \Yii::$app->redis->set($key,$waiting_audit_store_numbers);
  204. // return $waiting_audit_store_numbers;
  205. // }
  206. public function getWithdrawData()
  207. {
  208. $list = HappinessWithdrawLog::lists([
  209. 'where' => [
  210. ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED], ['withdraw_status' => [0, 1]]
  211. ],
  212. 'group' => 'withdraw_status',
  213. 'select' => 'withdraw_status,sum(num) as num'
  214. ]);
  215. $waiting_audit_withdraw_amounts = 0;
  216. $waiting_pay_withdraw_amounts = 0;
  217. foreach ($list as $item) {
  218. if ($item['withdraw_status'] == 0) {
  219. $waiting_audit_withdraw_amounts = $item['num'];
  220. }
  221. if ($item['withdraw_status'] == 1) {
  222. $waiting_pay_withdraw_amounts = $item['num'];
  223. }
  224. }
  225. return [$waiting_audit_withdraw_amounts, $waiting_pay_withdraw_amounts];
  226. }
  227. public function getYesterdayData($time_nodes)
  228. {
  229. $yesterday = date('Y-m-d',strtotime("-1 days"));
  230. $key = HappinessEnum::STORE_GLOBAL_STATISTICS_YESTERDAY . ':' . $this->mall_id.':'.$yesterday;
  231. $result = \Yii::$app->redis->get($key);
  232. if (!empty($result)) {
  233. return json_decode($result, true);
  234. }
  235. $obj = new StoreCensus($this->mall_id, $time_nodes['start'], $time_nodes['end']);
  236. $yesterday_pay_order_numbers = $obj->getPayOrderNumbers();
  237. $yesterday_pay_people_numbers = $obj->getPayPeopleNumbers();
  238. $yesterday_real_pay_amounts = $obj->getRealPayAmounts();
  239. $yesterday_not_settle_amounts = $obj->getNotSettleAmounts();
  240. // $yesterday_settle_amounts = $obj->getSettleAmounts();
  241. list($yesterday_waiting_audit_withdraw_amounts, $yesterday_waiting_pay_withdraw_amounts) = $obj->getWithdrawData();
  242. // $yesterday_waiting_audit_store_numbers = $obj->getWaitingAuditStoreNumbers();
  243. $data = [
  244. 'yesterday_pay_order_numbers' => $yesterday_pay_order_numbers,
  245. 'yesterday_pay_people_numbers' => $yesterday_pay_people_numbers,
  246. 'yesterday_real_pay_amounts' => $yesterday_real_pay_amounts,
  247. 'yesterday_not_settle_amounts' => $yesterday_not_settle_amounts,
  248. // 'yesterday_settle_amounts' => $yesterday_settle_amounts,
  249. 'yesterday_waiting_audit_withdraw_amounts' => $yesterday_waiting_audit_withdraw_amounts,
  250. 'yesterday_waiting_pay_withdraw_amounts' => $yesterday_waiting_pay_withdraw_amounts,
  251. // 'yesterday_waiting_audit_store_numbers' => $yesterday_waiting_audit_store_numbers,
  252. ];
  253. \Yii::$app->redis->set($key,json_encode($data));
  254. return $data;
  255. }
  256. }