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; } }