| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- <?php
- namespace addons\Store\backend\controllers;
- use addons\Store\common\enums\StoreEnum;
- use addons\Store\common\logic\store\StoreCensus;
- use addons\Store\common\models\Store;
- use addons\Store\common\models\StoreCommission;
- use addons\Store\common\models\StoreGoodsRanking;
- use addons\Store\common\models\StoreWithdrawLog;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\helpers\ArrayHelper;
- use common\helpers\DateHelper;
- use common\models\common\CommissionLog;
- use common\models\common\Region;
- /**
- * 默认控制器
- *
- * Class DefaultController
- * @package addons\Store\backend\controllers
- */
- class DefaultController extends BaseController
- {
- /**
- * 首页
- *
- * @return string
- */
- public function actionIndexOld()
- {
- if (!\Yii::$app->request->isAjax) {
- return $this->render('index');
- }
- if (\Yii::$app->request->isGet) {
- $cache = \Yii::$app->cache;
- $cache_key = RedisKeyEnum::BACKEND_CENSUS_KEY . 'mall_id:' . $this->mall_id;
- $data = $cache->get($cache_key);
- if (!empty($data)) {
- return $this->success('success', $data);
- }
- /* 顶部统计 ---- start ---- */
- $time_nodes = DateHelper::yesterDay();
- $query_com = StoreCommission::find()
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);
- // 实际支付金额(实收金额)、待结算佣金、已结算佣金、支付人数、支付订单数量
- $real_pay_amounts = $not_settle_amounts = $settle_amounts = $pay_people_numbers = $pay_order_numbers = 0;
- $yesterday_real_pay_amounts = $yesterday_not_settle_amounts = $yesterday_settle_amounts = $yesterday_pay_people_numbers = $yesterday_pay_order_numbers = 0;
- $user_ids = $yesterday_user_ids = [];
- $page = 1;
- $limit = 200;
- do {
- $offset = ($page - 1) * $limit;
- $page++;
- $commissions = $query_com->limit($limit)->offset($offset)->all();
- if (!empty($commissions)) {
- foreach ($commissions as $commission) {
- $real_pay_amounts += $commission->pay_money;
- if ($commission->is_settlement == 1) {
- $settle_amounts += $commission->amount_received;
- } else {
- $not_settle_amounts += $commission->amount_received;
- }
- $pay_order_numbers += 1;
- $user_ids[] = $commission->user_id;
- if ($commission->created_at >= $time_nodes['start'] && $commission->created_at <= $time_nodes['end']) {
- $yesterday_real_pay_amounts += $commission->pay_money;
- if ($commission->is_settlement == 1) {
- $yesterday_settle_amounts += $commission->amount_received;
- } else {
- $yesterday_not_settle_amounts += $commission->amount_received;
- }
- $yesterday_pay_order_numbers += 1;
- $yesterday_user_ids[] = $commission->user_id;
- }
- }
- }
- } while ($commissions);
- $pay_people_numbers = count(array_flip(array_flip($user_ids)));
- $real_pay_amounts = round($real_pay_amounts, 2);
- $not_settle_amounts = round($not_settle_amounts, 2);
- $settle_amounts = round($settle_amounts, 2);
- $yesterday_pay_people_numbers = count(array_flip(array_flip($yesterday_user_ids)));
- $yesterday_real_pay_amounts = round($yesterday_real_pay_amounts, 2);
- $yesterday_not_settle_amounts = round($yesterday_not_settle_amounts, 2);
- $yesterday_settle_amounts = round($yesterday_settle_amounts, 2);
- // 待审核提现、待贷款提现
- $waiting_audit_withdraw_amounts = $waiting_pay_withdraw_amounts = 0;
- $yesterday_waiting_audit_withdraw_amounts = $yesterday_waiting_pay_withdraw_amounts = 0;
- $query_withdraw = StoreWithdrawLog::find()
- ->select('withdraw_status,actual_num')
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'withdraw_status' => [0, 1]]);
- $page = 1;
- $limit = 200;
- do {
- $offset = ($page - 1) * $limit;
- $page++;
- $withdraws = $query_withdraw->limit($limit)->offset($offset)->all();
- if (!empty($withdraws)) {
- foreach ($withdraws as $withdraw) {
- if ($withdraw->withdraw_status == 0) {
- $waiting_audit_withdraw_amounts += $withdraw->actual_num;
- } else {
- $waiting_pay_withdraw_amounts += $withdraw->actual_num;
- }
- if ($commission->created_at >= $time_nodes['start'] && $commission->created_at <= $time_nodes['end']) {
- if ($withdraw->withdraw_status == 0) {
- $yesterday_waiting_audit_withdraw_amounts += $withdraw->actual_num;
- } else {
- $yesterday_waiting_pay_withdraw_amounts += $withdraw->actual_num;
- }
- }
- }
- }
- } while ($withdraws);
- $waiting_audit_withdraw_amounts = round($waiting_audit_withdraw_amounts, 2);
- $waiting_pay_withdraw_amounts = round($waiting_pay_withdraw_amounts, 2);
- $yesterday_waiting_audit_withdraw_amounts = round($yesterday_waiting_audit_withdraw_amounts, 2);
- $yesterday_waiting_pay_withdraw_amounts = round($yesterday_waiting_pay_withdraw_amounts, 2);
- // 待审核门店数量
- $waiting_audit_store_numbers = $yesterday_waiting_audit_store_numbers = 0;
- $page = 1;
- $limit = 200;
- do {
- $offset = ($page - 1) * $limit;
- $page++;
- $stores = Store::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])->limit($limit)->offset($offset)->all();
- if (!empty($stores)) {
- foreach ($stores as $store) {
- if (StoreEnum::CHECK_WAITING == $store->check_status) {
- $waiting_audit_store_numbers += 1;
- if ($store->created_at >= $time_nodes['start'] && $store->created_at <= $time_nodes['end']) {
- $yesterday_waiting_audit_store_numbers += 1;
- }
- }
- }
- }
- } while ($stores);
- /* 顶部统计 ---- end ---- */
- /* 门店销售排名 ---- start ---- */
- $store_good_ranking_list = StoreGoodsRanking::find()
- ->select('store_id,sum(sales_money) as sales_money')
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
- ->orderBy('sales_money desc')
- ->groupBy('store_id')
- ->limit(10)
- ->asArray()
- ->all();
- if (empty($store_good_ranking_list)) {
- $store_good_ranking_list = [
- 1 => ['store_id' => 1, 'sales_money' => 1234],
- 2 => ['store_id' => 2, 'sales_money' => 222],
- 3 => ['store_id' => 3, 'sales_money' => 2342],
- ];
- }
- if (!empty($store_good_ranking_list)) {
- $store_ids = array_column($store_good_ranking_list, 'store_id');
- $stores = Store::find()
- ->select('id,store_name,logo_img')
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $store_ids])
- ->asArray()
- ->indexBy('id')
- ->all();
- foreach ($store_good_ranking_list as &$list) {
- $store = $stores[$list['store_id']] ?? [];
- $list['store_name'] = $store['store_name'] ?? '';
- $list['logo_img'] = $store['logo_img'] ?? '';
- }
- }
- /* 门店销售排名 ---- end ---- */
- /* 省级地区销售排名 ---- start ---- */
- $store_datas = [];
- $regions = Region::find()->select('id,name')->where(['level' => 1])->asArray()->indexBy('id')->all();
- $page = 1;
- $limit = 200;
- do {
- $offset = ($page - 1) * $limit;
- $page++;
- $stores = Store::find()
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
- ->andWhere(['check_status' => 1])
- ->limit($limit)
- ->offset($offset)
- ->all();
- if (!empty($stores)) {
- foreach ($stores as $store) {
- $store_datas[$store->province_id]['region_name'] = $regions[$store->province_id]['name'] ?? '';
- if (!isset($store_datas[$store->province_id]['store_numbers'])) {
- $store_datas[$store->province_id]['store_numbers'] = 0;
- }
- $store_datas[$store->province_id]['store_numbers'] += 1;
- if (!isset($store_datas[$store->province_id]['sale_amounts'])) {
- $store_datas[$store->province_id]['sale_amounts'] = 0;
- }
- // $store_datas[$store->province_id]['sale_amounts'] += $store->total_order_money;
- $store_datas[$store->province_id]['sale_amounts'] = bcadd($store_datas[$store->province_id]['sale_amounts'], $store->total_order_money, 2);
- }
- }
- } while ($stores);
- $store_datas = ArrayHelper::arraySort($store_datas, 'sale_amounts', 'desc');
- $store_datas = array_values($store_datas);
- // $store_datas = ArrayHelper::multisort(array_values($store_datas), 'sale_amounts', 'asc');
- // 门店总数
- $all_store_numbers = array_sum(array_column($store_datas, 'store_numbers'));
- $all_sale_amounts = round(array_sum(array_column($store_datas, 'sale_amounts')), 2);
- /* 省级地区销售排名 ---- end ---- */
- $data = [
- 'currTime' => date('Y-m-d H:i:s'),
- 'statistics' => [
- 'pay_people_numbers' => $pay_people_numbers,
- 'real_pay_amounts' => $real_pay_amounts,
- 'not_settle_amounts' => $not_settle_amounts,
- 'settle_amounts' => $settle_amounts,
- 'pay_order_numbers' => $pay_order_numbers,
- 'yesterday_pay_order_numbers' => $yesterday_pay_order_numbers,
- 'waiting_audit_withdraw_amounts' => $waiting_audit_withdraw_amounts,
- 'waiting_pay_withdraw_amounts' => $waiting_pay_withdraw_amounts,
- 'waiting_audit_store_numbers' => $waiting_audit_store_numbers,
- 'yesterday_pay_people_numbers' => $yesterday_pay_people_numbers,
- 'yesterday_real_pay_amounts' => $yesterday_real_pay_amounts,
- 'yesterday_not_settle_amounts' => $yesterday_not_settle_amounts,
- 'yesterday_settle_amounts' => $yesterday_settle_amounts,
- 'yesterday_waiting_audit_withdraw_amounts' => $yesterday_waiting_audit_withdraw_amounts,
- 'yesterday_waiting_pay_withdraw_amounts' => $yesterday_waiting_pay_withdraw_amounts,
- 'yesterday_waiting_audit_store_numbers' => $yesterday_waiting_audit_store_numbers,
- ],
- 'store_good_ranking_list' => $store_good_ranking_list,
- 'region_ranking_list' => $store_datas,
- 'map' => [
- $all_store_numbers, $all_sale_amounts
- ],
- 'total_store_numbers' => $all_store_numbers,
- 'total_sale_amounts' => $all_sale_amounts,
- ];
- // 统计结果缓存半个小时
- $cache->set($data, $cache_key, 1800);
- return $this->success('success', $data);
- }
- }
- public function actionIndex()
- {
- if (!\Yii::$app->request->isAjax) {
- return $this->render('index');
- }
- if (\Yii::$app->request->isGet) {
- $time_nodes = DateHelper::yesterDay();
- $result = $this->getYesterdayData($time_nodes);
- list($waiting_audit_withdraw_amounts, $waiting_pay_withdraw_amounts) = $this->getWithdrawData();
- /* 顶部统计 ---- end ---- */
- $store_good_ranking_list = $this->getStoreGoodRankingList();
- /* 省级地区销售排名 ---- start ---- */
- $store_datas = $this->getStoreDatas();
- /* 省级地区销售排名 ---- end ---- */
- // 门店总数
- $all_store_numbers = array_sum(array_column($store_datas, 'store_numbers'));
- $all_sale_amounts = round(array_sum(array_column($store_datas, 'sale_amounts')), 2);
- $data = [
- 'currTime' => date('Y-m-d H:i:s'),
- 'statistics' => [
- 'pay_people_numbers' => $this->getPayPeopleNumbers(),
- 'real_pay_amounts' => $this->getRealPayAmounts(),
- 'not_settle_amounts' => $this->getNotSettleAmounts(),
- 'settle_amounts' => $this->getSettleAmounts(),
- 'pay_order_numbers' => $this->getPayOrderNumbers(),
- 'waiting_audit_withdraw_amounts' => $waiting_audit_withdraw_amounts,
- 'waiting_pay_withdraw_amounts' => $waiting_pay_withdraw_amounts,
- 'waiting_audit_store_numbers' => $this->getWaitingAuditStoreNumbers(),
- 'yesterday_pay_order_numbers' => $result['yesterday_pay_order_numbers'],
- 'yesterday_pay_people_numbers' => $result['yesterday_pay_people_numbers'],
- 'yesterday_real_pay_amounts' => $result['yesterday_real_pay_amounts'],
- 'yesterday_not_settle_amounts' => $result['yesterday_not_settle_amounts'],
- 'yesterday_settle_amounts' => $result['yesterday_settle_amounts'],
- 'yesterday_waiting_audit_withdraw_amounts' => $result['yesterday_waiting_audit_withdraw_amounts'],
- 'yesterday_waiting_pay_withdraw_amounts' => $result['yesterday_waiting_pay_withdraw_amounts'],
- 'yesterday_waiting_audit_store_numbers' => $result['yesterday_waiting_audit_store_numbers'],
- ],
- 'store_good_ranking_list' => $store_good_ranking_list,
- 'region_ranking_list' => $store_datas,
- 'map' => [
- $all_store_numbers, $all_sale_amounts
- ],
- 'total_store_numbers' => $all_store_numbers,
- 'total_sale_amounts' => $all_sale_amounts,
- ];
- return $this->success('success', $data);
- }
- }
- public function getStoreGoodRankingList()
- {
- $store_good_ranking_list = StoreGoodsRanking::find()
- ->select('store_id,sum(sales_money) as sales_money')
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
- ->orderBy('sales_money desc')
- ->groupBy('store_id')
- ->limit(10)
- ->asArray()
- ->all();
- if (empty($store_good_ranking_list)) {
- $store_good_ranking_list = [];
- }
- if (!empty($store_good_ranking_list)) {
- $store_ids = array_column($store_good_ranking_list, 'store_id');
- $stores = Store::find()
- ->select('id,store_name,logo_img')
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $store_ids])
- ->asArray()
- ->indexBy('id')
- ->all();
- foreach ($store_good_ranking_list as &$list) {
- $store = $stores[$list['store_id']] ?? [];
- $list['store_name'] = $store['store_name'] ?? '';
- $list['logo_img'] = $store['logo_img'] ?? '';
- }
- }
- return $store_good_ranking_list;
- }
- public function getStoreDatas()
- {
- $store_datas = [];
- $regions = Region::find()->select('id,name')->where(['level' => 1])->asArray()->indexBy('id')->all();
- $page = 1;
- $limit = 200;
- do {
- $offset = ($page - 1) * $limit;
- $page++;
- $stores = Store::find()
- ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
- ->andWhere(['check_status' => 1])
- ->limit($limit)
- ->offset($offset)
- ->all();
- if (!empty($stores)) {
- foreach ($stores as $store) {
- $store_datas[$store->province_id]['region_name'] = $regions[$store->province_id]['name'] ?? '';
- if (!isset($store_datas[$store->province_id]['store_numbers'])) {
- $store_datas[$store->province_id]['store_numbers'] = 0;
- }
- $store_datas[$store->province_id]['store_numbers'] += 1;
- if (!isset($store_datas[$store->province_id]['sale_amounts'])) {
- $store_datas[$store->province_id]['sale_amounts'] = 0;
- }
- // $store_datas[$store->province_id]['sale_amounts'] += $store->total_order_money;
- $store_datas[$store->province_id]['sale_amounts'] = bcadd($store_datas[$store->province_id]['sale_amounts'], $store->total_order_money, 2);
- }
- }
- } while ($stores);
- $store_datas = ArrayHelper::arraySort($store_datas, 'sale_amounts', 'desc');
- $store_datas = array_values($store_datas);
- return $store_datas;
- }
- //实收金额
- public function getRealPayAmounts()
- {
- $key = StoreEnum::STORE_REAL_PAY_AMOUNTS . ':' . $this->mall_id;
- $res = \Yii::$app->redis->get($key);//待结算
- if (!empty($res)) return $res;
- $realPayAmounts = StoreCommission::find()->where(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
- ->sum('amount_received');
- if(empty($realPayAmounts)) $realPayAmounts = 0;
- \Yii::$app->redis->set($key,$realPayAmounts);
- return $realPayAmounts;
- }
- //待结算
- public function getNotSettleAmounts()
- {
- $key = StoreEnum::STORE_NOT_SETTLE_AMOUNTS . ':' . $this->mall_id;
- $res = \Yii::$app->redis->get($key);//待结算
- if (!empty($res)) return $res;
- $not_settle_amounts = StoreCommission::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'is_settlement' => 0])
- ->sum('amount_received');
- if(empty($not_settle_amounts)) $not_settle_amounts = 0;
- \Yii::$app->redis->set($key,$not_settle_amounts);
- return $not_settle_amounts;
- }
- //给会员的佣金
- public function getSettleAmounts()
- {
- $key = StoreEnum::STORE_SETTLE_AMOUNTS . ':' . $this->mall_id;
- $res = \Yii::$app->redis->get($key);//给会员的佣金
- if (!empty($res)) return $res;
- $settle_amounts = CommissionLog::find()->where(['mall_id' => $this->mall_id, 'source_table' => ['store_order_detail', 'store_cashier_order']])->sum('change_num');
- if(empty($settle_amounts)) $settle_amounts = 0;
- \Yii::$app->redis->set($key,$settle_amounts);
- return $settle_amounts;
- }
- //支付人数
- public function getPayPeopleNumbers()
- {
- $key = StoreEnum::STORE_PAY_PEOPLE_NUMBERS . ':' . $this->mall_id;
- $res = \Yii::$app->redis->get($key);//支付人数
- if (!empty($res)) return $res;
- $mall_id = $this->mall_id;
- $sql = "select count(*) as counts from (select user_id from qimall_addons_store_commission where mall_id = {$mall_id} and status in(0,1) group by user_id) t";
- $result = \Yii::$app->db->createCommand($sql)->queryAll();
- if(empty($result[0]['counts'])) $result[0]['counts'] = 0;
- \Yii::$app->redis->set($key,$result[0]['counts']);
- return $result[0]['counts'];
- }
- //支付订单数
- public function getPayOrderNumbers()
- {
- $key = StoreEnum::STORE_PAY_ORDER_NUMBERS . ':' . $this->mall_id;
- $res = \Yii::$app->redis->get($key);//支付订单数
- if (!empty($res)) return $res;
- $pay_order_numbers = StoreCommission::find()->where(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
- ->count();
- if(empty($pay_order_numbers)) $pay_order_numbers = 0;
- \Yii::$app->redis->set($key,$pay_order_numbers);
- return $pay_order_numbers;
- }
- //待审核门店
- public function getWaitingAuditStoreNumbers()
- {
- $key = StoreEnum::STORE_WAITING_AUDIT_STORE_NUMBERS . ':' . $this->mall_id;
- $res = \Yii::$app->redis->get($key);//待审核门店
- if (!empty($res)) return $res;
- $waiting_audit_store_numbers = Store::find()->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'check_status' => StoreEnum::CHECK_WAITING])->count();
- if(empty($waiting_audit_store_numbers)) $waiting_audit_store_numbers = 0;
- \Yii::$app->redis->set($key,$waiting_audit_store_numbers);
- return $waiting_audit_store_numbers;
- }
- public function getWithdrawData()
- {
- $list = StoreWithdrawLog::lists([
- 'where' => [
- ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED], ['withdraw_status' => [0, 1]]
- ],
- 'group' => 'withdraw_status',
- 'select' => 'withdraw_status,sum(num) as num'
- ]);
- $waiting_audit_withdraw_amounts = 0;
- $waiting_pay_withdraw_amounts = 0;
- foreach ($list as $item) {
- if ($item['withdraw_status'] == 0) {
- $waiting_audit_withdraw_amounts = $item['num'];
- }
- if ($item['withdraw_status'] == 1) {
- $waiting_pay_withdraw_amounts = $item['num'];
- }
- }
- return [$waiting_audit_withdraw_amounts, $waiting_pay_withdraw_amounts];
- }
- public function getYesterdayData($time_nodes)
- {
- $yesterday = date('Y-m-d',strtotime("-1 days"));
- $key = StoreEnum::STORE_GLOBAL_STATISTICS_YESTERDAY . ':' . $this->mall_id.':'.$yesterday;
- $result = \Yii::$app->redis->get($key);
- if (!empty($result)) {
- return json_decode($result, true);
- }
- $obj = new StoreCensus($this->mall_id, $time_nodes['start'], $time_nodes['end']);
- $yesterday_pay_order_numbers = $obj->getPayOrderNumbers();
- $yesterday_pay_people_numbers = $obj->getPayPeopleNumbers();
- $yesterday_real_pay_amounts = $obj->getRealPayAmounts();
- $yesterday_not_settle_amounts = $obj->getNotSettleAmounts();
- $yesterday_settle_amounts = $obj->getSettleAmounts();
- list($yesterday_waiting_audit_withdraw_amounts, $yesterday_waiting_pay_withdraw_amounts) = $obj->getWithdrawData();
- $yesterday_waiting_audit_store_numbers = $obj->getWaitingAuditStoreNumbers();
- $data = [
- 'yesterday_pay_order_numbers' => $yesterday_pay_order_numbers,
- 'yesterday_pay_people_numbers' => $yesterday_pay_people_numbers,
- 'yesterday_real_pay_amounts' => $yesterday_real_pay_amounts,
- 'yesterday_not_settle_amounts' => $yesterday_not_settle_amounts,
- 'yesterday_settle_amounts' => $yesterday_settle_amounts,
- 'yesterday_waiting_audit_withdraw_amounts' => $yesterday_waiting_audit_withdraw_amounts,
- 'yesterday_waiting_pay_withdraw_amounts' => $yesterday_waiting_pay_withdraw_amounts,
- 'yesterday_waiting_audit_store_numbers' => $yesterday_waiting_audit_store_numbers,
- ];
- \Yii::$app->redis->set($key,json_encode($data));
- return $data;
- }
- }
|