keyword = get_params('keyword'); if (get_params('datetime')) { $form->date_start = get_params('datetime')[0]; $form->date_end = get_params('datetime')[1]; } $form->type = get_params('type', 'coupon'); $form->platform = get_params('platform'); $form->keyword_1 = get_params('keyword_1'); $form->store_id = get_store_id(); return $this->asJson($form->GrantSearch()); } /** * Undocumented function * * @Author LGL 24963@qq.com * @DateTime 2021-01-21 * @desc: 分销排行 * @return void */ public function actionDistributor() { $form = new StatisticForm(); $form->keyword = get_params('keyword'); $form->platform = get_params('platform'); return $this->asJson($form->getShareList()); } /** * Undocumented function * * @Author LGL 24963@qq.com * @DateTime 2021-01-21 * @desc: 销售统计 * @return void */ public function actionSale() { $form = new StatisticForm(); $form->keyword = get_params('keyword'); if (get_params('datetime')) { $form->date_start = get_params('datetime')[0]; $form->date_end = get_params('datetime')[1]; } return $this->asJson($form->OrderSearch()); } /** * Undocumented function * * @Author LGL 24963@qq.com * @DateTime 2021-01-23 * @desc: 积分统计 * @return void */ public function actionIntegral() { $form = new StatisticForm(); $form->keyword = get_params('keyword'); $form->platform = get_params('platform'); if (get_params('datetime')) { $form->date_start = get_params('datetime')[0]; $form->date_end = get_params('datetime')[1]; } return $this->asJson($form->IntegralSearch()); } /** * Undocumented function * * @Author LGL 24963@qq.com * @DateTime 2021-01-23 * @desc: 发放统计 * @return void */ public function actionGrant() { $form = new StatisticForm(); $form->keyword = get_params('keyword'); if (get_params('datetime')) { $form->date_start = get_params('datetime')[0]; $form->date_end = get_params('datetime')[1]; } $form->type = get_params('type', 'coupon'); $form->platform = get_params('platform'); $form->keyword_1 = get_params('keyword_1'); $form->store_id = get_store_id(); return $this->asJson($form->GrantSearch()); } /** * @description: 客户端图片统计 * @param {*} * @return {*} */ public function actionGetImg() { $form = new StoreImageFrom(); $img = $form->search(); return $this->asJson([ 'code' => 0, 'data' => $img ]); } /** * 小程序数据分析 */ public function actionCollect() { if (\Yii::$app->request->isPost) { $post = \Yii::$app->request->post(); $new_time = $post['time']; $now_time = time(); $new_day = [ 'begin_date' => date('Ymd', strtotime($new_time)), 'end_date' => date('Ymd', strtotime($new_time)), ]; $last_day = [ 'begin_date' => date('Ymd', strtotime("-2 day", $now_time)), 'end_date' => date('Ymd', strtotime("-2 day", $now_time)), ]; $data = [ 'visitdistribution' => $this->checkAnalysis(7, $new_day), 'lastvisitdistribution' => $this->checkAnalysis(7, $last_day), ]; return $this->asJson([ 'code' => 0, 'data' => $data, ]); } $date = date('Ymd'); $cacheK = 'admin_statistic_data_recharge_' . get_store_id() . '_' . $date; $cacheV = cache()->get($cacheK); if($cacheV){ return $this->asJson([ 'code' => 0, 'data' => $cacheV, ]); } $timestamp = time(); //day $day = [ 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $lastday = [ 'begin_date' => date('Ymd', strtotime("-2 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-2 day", $timestamp)), ]; //week $week = [ 'begin_date' => date('Ymd', strtotime("last week Monday", $timestamp)), 'end_date' => date('Ymd', strtotime("last week Sunday", $timestamp)), ]; $lastweek = [ 'begin_date' => date('Ymd', strtotime("last week Monday -7 day", $timestamp)), 'end_date' => date('Ymd', strtotime("last week Sunday -7 day", $timestamp)), ]; //month $last_month = date('Y-m-01', strtotime("last month", $timestamp)); $month = [ 'begin_date' => date('Ymd', strtotime($last_month)), 'end_date' => date('Ymd', strtotime("$last_month +1 month -1 seconds")), ]; $last_last_month = date('Y-m-01', strtotime("last month -1 month", $timestamp)); $lastmonth = [ 'begin_date' => date('Ymd', strtotime($last_last_month)), 'end_date' => date('Ymd', strtotime("$last_last_month +1 month -1 seconds")), ]; $lastmonth = [ 'begin_date' => date('Ymd', strtotime($last_last_month)), 'end_date' => date('Ymd', strtotime("$last_last_month +1 month -1 seconds")), ]; //day $thirdDay = [ 'begin_date' => date('Ymd', strtotime("-3 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-3 day", $timestamp)), ]; $fourthDay = [ 'begin_date' => date('Ymd', strtotime("-4 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-4 day", $timestamp)), ]; $fifthDay = [ 'begin_date' => date('Ymd', strtotime("-5 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-5 day", $timestamp)), ]; $sixthDay = [ 'begin_date' => date('Ymd', strtotime("-6 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-6 day", $timestamp)), ]; $seventhDay = [ 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-7 day", $timestamp)), ]; $timestamp = time(); $userDay = [ 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $userSevenDay = [ 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $userThirtyDay = [ 'begin_date' => date('Ymd', strtotime("-30 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $data = [ 'dailyretaininfo' => $this->checkAnalysis(0, $day), 'lastdailyretaininfo' => $this->checkAnalysis(0, $lastday), 'weeklyretaininfo' => $this->checkAnalysis(1, $week), 'lastweeklyretaininfo' => $this->checkAnalysis(1, $lastweek), 'monthlyretaininfo' => $this->checkAnalysis(2, $month), 'lastmonthlyretaininfo' => $this->checkAnalysis(2, $lastmonth), 'dailyvisittrend' => $this->checkAnalysis(3, $day), 'lastdailyvisittrend' => $this->checkAnalysis(3, $lastday), 'weeklyvisittrend' => $this->checkAnalysis(4, $week), 'lastweeklyvisittrend' => $this->checkAnalysis(4, $lastweek), 'monthlyvisittrend' => $this->checkAnalysis(5, $month), 'lastmonthlyvisittrend' => $this->checkAnalysis(5, $lastmonth), 'userportraitone'=>$this->checkAnalysis(6, $userDay), 'userportraitseven'=>$this->checkAnalysis(6, $userSevenDay), 'userportraitthirty'=>$this->checkAnalysis(6, $userThirtyDay), 'visitdistribution'=>$this->checkAnalysis(7, $userDay), 'dailysummarytrend' => $this->checkAnalysis(8, $day), 'lastsummarytrend' => $this->checkAnalysis(8, $lastday), 'thirdretaininfo' => $this->checkAnalysis(0, $thirdDay), 'thirdvisittrend' => $this->checkAnalysis(3, $thirdDay), 'fourthretaininfo' => $this->checkAnalysis(0, $fourthDay), 'fourthvisittrend' => $this->checkAnalysis(3, $fourthDay), 'fifthretaininfo' => $this->checkAnalysis(0, $fifthDay), 'fifthvisittrend' => $this->checkAnalysis(3, $fifthDay), 'sixthretaininfo' => $this->checkAnalysis(0, $sixthDay), 'sixthvisittrend' => $this->checkAnalysis(3, $sixthDay), 'seventhretaininfo' => $this->checkAnalysis(0, $seventhDay), 'seventhvisittrend' => $this->checkAnalysis(3, $seventhDay), ]; if(empty($data['lastmonthlyvisittrend']['list'])){ $data['lastmonthlyvisittrend']['list'][0] = ["ref_date"=>substr($lastmonth['begin_date'], 0, 6),"session_cnt"=>0,"visit_pv"=>0,"visit_uv"=>1,"visit_uv_new"=>1,"stay_time_uv"=>0,"stay_time_session"=>0,"visit_depth"=>0]; } cache()->set($cacheK, $data, strtotime(date('Y-m-d 00:00:00', time() + 86400)) - time()); return $this->asJson([ 'code' => 0, 'data' => $data, ]); } public function actionAnalyticsOne() { $timestamp = time(); $day = [ 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $sevenDay = [ 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $thirtyDay = [ 'begin_date' => date('Ymd', strtotime("-30 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)), ]; $data = [ 'userportraitone' => $this->checkAnalysis(6, $day), 'userportraitseven' => $this->checkAnalysis(6, $sevenDay), 'userportraitthirty' => $this->checkAnalysis(6, $thirtyDay), 'visitdistribution' => $this->checkAnalysis(7, $day), ]; return $this->asJson([ 'code' => 0, 'data' => $data, ]); } public function actionAnalyticsTwo() { $timestamp = time(); //day $thirdDay = [ 'begin_date' => date('Ymd', strtotime("-3 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-3 day", $timestamp)), ]; $fourthDay = [ 'begin_date' => date('Ymd', strtotime("-4 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-4 day", $timestamp)), ]; $fifthDay = [ 'begin_date' => date('Ymd', strtotime("-5 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-5 day", $timestamp)), ]; $sixthDay = [ 'begin_date' => date('Ymd', strtotime("-6 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-6 day", $timestamp)), ]; $seventhDay = [ 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)), 'end_date' => date('Ymd', strtotime("-7 day", $timestamp)), ]; $data = [ 'thirdretaininfo' => $this->checkAnalysis(0, $thirdDay), 'thirdvisittrend' => $this->checkAnalysis(3, $thirdDay), 'fourthretaininfo' => $this->checkAnalysis(0, $fourthDay), 'fourthvisittrend' => $this->checkAnalysis(3, $fourthDay), 'fifthretaininfo' => $this->checkAnalysis(0, $fifthDay), 'fifthvisittrend' => $this->checkAnalysis(3, $fifthDay), 'sixthretaininfo' => $this->checkAnalysis(0, $sixthDay), 'sixthvisittrend' => $this->checkAnalysis(3, $sixthDay), 'seventhretaininfo' => $this->checkAnalysis(0, $seventhDay), 'seventhvisittrend' => $this->checkAnalysis(3, $seventhDay), ]; return $this->asJson([ 'code' => 0, 'data' => $data, ]); } private function checkAnalysis($type, $time) { $res = [ 'code'=>0, 'data'=>[] ]; if (is_open_platform()) { //获取三方平台配置信息 $config = [ 'app_id' => Option::get("platform_third_appid", 0, 'saas')['value'], 'secret' => Option::get("platform_third_secret", 0, 'saas')['value'], 'token' => Option::get("platform_token", 0, 'saas')['value'], 'aes_key' => Option::get("platform_encodingAesKey", 0, 'saas')['value'] ]; //设置小程序配置 $WechatConfig = WechatConfig::findOne(['store_id' => get_store_id()]); $store_mini = StoreMini::find()->where(['appid' => $WechatConfig->app_id, 'store_id' => get_store_id(), 'is_cancle' => 0, 'is_use' => 1])->select('id, appid, authorizer_refresh_token')->one(); if(empty($store_mini->appid) || empty($store_mini->authorizer_refresh_token)){ return [ 'code'=>1, 'msg'=>"参数配置错误" ]; } $openPlatform = Factory::openPlatform($config); $mini_program = $openPlatform->miniProgram($store_mini->appid, $store_mini->authorizer_refresh_token); $client = new BaseClient($mini_program); $data = [ 'begin_date' => $time['begin_date'], 'end_date' => $time['end_date'] ]; switch($type) { case 0: $res = $client->httpPostJson("datacube/getweanalysisappiddailyretaininfo", $data); break; case 1: $res = $client->httpPostJson("datacube/getweanalysisappidweeklyretaininfo", $data); break; case 2: $res = $client->httpPostJson("datacube/getweanalysisappidmonthlyretaininfo", $data); break; case 3: $res = $client->httpPostJson("datacube/getweanalysisappiddailyvisittrend", $data); break; case 4: $res = $client->httpPostJson("datacube/getweanalysisappidweeklyvisittrend", $data); break; case 5: $res = $client->httpPostJson("datacube/getweanalysisappidmonthlyvisittrend", $data); break; case 6: $res = $client->httpPostJson("datacube/getweanalysisappiduserportrait", $data); break; case 7: $res = $client->httpPostJson("datacube/getweanalysisappidvisitpage", $data); break; case 8: $res = $client->httpPostJson("datacube/getweanalysisappiddailysummarytrend", $data); break; } } else { $this->mini_program = $this->wechat; if(!empty($this->mini_program)){ switch($type) { case 0: $res = $this->mini_program->data_cube->dailyRetainInfo($time['begin_date'], $time['end_date']); break; case 1: $res = $this->mini_program->data_cube->weeklyRetainInfo($time['begin_date'], $time['end_date']); break; case 2: $res = $this->mini_program->data_cube->monthlyRetainInfo($time['begin_date'], $time['end_date']); break; case 3: $res = $this->mini_program->data_cube->dailyVisitTrend($time['begin_date'], $time['end_date']); break; case 4: $res = $this->mini_program->data_cube->weeklyVisitTrend($time['begin_date'], $time['end_date']); break; case 5: $res = $this->mini_program->data_cube->monthlyVisitTrend($time['begin_date'], $time['end_date']); break; case 6: $res = $this->mini_program->data_cube->userPortrait($time['begin_date'], $time['end_date']); break; case 7: $res = $this->mini_program->data_cube->visitPage($time['begin_date'], $time['end_date']); break; case 8: $res = $this->mini_program->data_cube->summaryTrend($time['begin_date'], $time['end_date']); break; } } } return $res; } public function getParams($k = null) { $dateType = input_params('dateType', '') ?: ''; $beginTime = input_params('beginTime', ''); $endTime = input_params('endTime', ''); $statistics = input_params('statistics', 1); // $params = [ // 'dateType' => $dateType ?: 'day', //day/week/month/year // 'beginTime' => $beginTime ?: date('Y-m-d 00:00:00'), // 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()), // ]; $params = [ 'dateType' => $dateType ?: 'week', //day/week/month/year 'beginTime' => $beginTime ?: date('Y-m-d 00:00:00', strtotime('last monday')), 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()), ]; // $params = [ // 'dateType' => $dateType ?: 'month', //day/week/month/year // 'beginTime' => $beginTime ?: date('Y-m-01 00:00:00'), // 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()), // ]; // $params = [ // 'dateType' => $dateType ?: 'year', //day/week/month/year // 'beginTime' => $beginTime ?: date('Y-01-01 00:00:00'), // 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()), // ]; $params['statistics'] = $statistics; $params['keyword'] = input_params('keyword', ''); $params['tableType'] = input_params('tableType', ''); if($params['keyword'] || $params['tableType']){ $params['statistics'] = 0; } return $k ? $params[$k] : $params; } //会员储值 public function actionRecharge() { $store_id = get_store_id(); $where = [ 'and', ['store_id' => $store_id], [ 'and', ['>=', 'created_at', strtotime($this->params['beginTime'])], ['<=', 'created_at', strtotime($this->params['endTime'])] ] ]; $query = AccountLog::find()->where($where)->andWhere(['>', 'amount', 0]) ->andWhere(['OR', ['operator_type' => AccountLog::TYPE_OPERATOR_BACK], ['AND', ['>', 'order_id', 0], ['order_type' => AccountLog::TYPE_RECHARGE_ORDER]]]); if(empty($this->params['tableType']) || $this->params['tableType'] == 'list'){ $select = '*, amount pay_price'; $queryList = clone $query; if($this->params['keyword']){ $queryU = \app\models\SaasUser::find()->where(['or', ['like', 'name', $this->params['keyword']], ['like', 'mobile', $this->params['keyword']]])->select('mobile'); $queryList->andWhere(['user_id' => \app\models\User::find()->where(['binding' => $queryU])->select('id')]); } $list = pagination_make($queryList->select($select)->orderBy('id DESC')); foreach ($list['list'] as &$item) { $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); $user = \app\models\User::findOne($item['user_id']); $saasUser = \app\models\SaasUser::findOne(['mobile' => $user['binding'], 'is_delete' => 0]); $item['userInfo'] = [ 'name' => $saasUser['name'], 'avatar' => $saasUser['avatar'], 'money' => $user['money'], 'phone' => $user['binding'], ]; $item['send_price'] = '0.00'; if ($item['order_id'] > 0) { $reorder = ReOrder::findOne($item['order_id']); if ($reorder) { $item['send_price'] = $reorder->send_price; } } if (intval($item['log_type']) === AccountLog::LOG_TYPE_EXPEND) { $item['pay_price'] = '-' . $item['pay_price']; } } } if($this->params['statistics']){ $reUserCount = (clone $query)->groupBy('user_id')->count(); $reCount = (clone $query)->count(); $reSum = (clone $query)->andWhere(['log_type' => AccountLog::LOG_TYPE_INCOME])->sum('amount'); $reduceSum = (clone $query)->andWhere(['log_type' => AccountLog::LOG_TYPE_EXPEND])->sum('amount'); $reSum = bcsub($reSum, $reduceSum, 2); $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1])->andWhere(['or', ['>', 'combine_money', 0], ['pay_type' => \app\models\Order::PAY_TYPE_BALANCE_PAID]]); $orderUserCount = (clone $queryOrder)->groupBy('user_id')->count(); $orderCount = (clone $queryOrder)->count(); $orderSum = (clone $queryOrder)->sum('pay_price'); } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, // '$s' => $query->createCommand()->getRawSql(), 'data' => [ 'reUserCount' => $reUserCount, 'reCount' => $reCount, 'reSum' => (float)$reSum, 'orderUserCount' => $orderUserCount, 'orderCount' => $orderCount, 'orderSum' => (float)$orderSum, 'list' => $list, ], ]); } //会员分析 public function actionUser() { $store_id = get_store_id(); $where = [ 'and', ['store_id' => $store_id, 'is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime($this->params['beginTime'])], ['<=', 'created_at', strtotime($this->params['endTime'])], ] ]; $query = \app\models\User::find()->where($where); if(empty($this->params['tableType']) || $this->params['tableType'] == 'list'){ $select = 'id,binding,level,money,integral'; $queryList = clone $query; if($this->params['keyword']){ $queryU = \app\models\SaasUser::find()->where(['or', ['like', 'name', $this->params['keyword']], ['like', 'mobile', $this->params['keyword']]])->select('mobile'); $queryList->andWhere(['binding' => $queryU]); } $levelList = \app\models\Level::findAll(['store_id' => $store_id]); $levels = array_column($levelList, 'name', 'level'); $list = pagination_make($queryList->select($select)->orderBy('money DESC')); foreach ($list['list'] as &$user) { $saasUser = \app\models\SaasUser::findOne(['mobile' => $user['binding'], 'is_delete' => 0]); $user['userInfo'] = [ 'name' => $saasUser['name'], 'avatar' => $saasUser['avatar'], 'money' => $user['money'], 'phone' => $user['binding'], 'level_name' => $levels[$user['level']] ?? '普通用户', ]; } } if($this->params['statistics']){ $allUserCount = \app\models\User::find()->where(['store_id' => $store_id, 'is_delete' => 0])->count(); $userCount = $query->count(); $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1]); $orderCount = $queryOrder->count(); $orderSum = $queryOrder->sum('pay_price'); } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, // '$s' => $query->createCommand()->getRawSql(), 'data' => [ 'userCount' => $userCount, 'allUserCount' => $allUserCount, 'orderCount' => $orderCount, 'orderSum' => (float)$orderSum, 'list' => $list, ], ]); } //库存分析 public function actionGoodsNum() { $store_id = get_store_id(); $where = [ 'and', ['store_id' => $store_id, 'is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime($this->params['beginTime'])], ['<=', 'created_at', strtotime($this->params['endTime'])], ] ]; $goodsNum = \app\models\Goods::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])->sum('goods_num'); if(empty($this->params['tableType']) || $this->params['tableType'] == 'kuCun'){ $catGoodsNumQuery = \app\models\GoodsCat::find()->alias('gc') ->leftJoin(['c' => \app\models\Cat::tableName()], 'gc.cat_id = c.id') ->leftJoin(['g' => \app\models\Goods::tableName()], 'gc.goods_id = g.id') ->where(['c.store_id' => $store_id, 'gc.store_id' => $store_id, 'g.store_id' => $store_id, 'g.is_delete' => 0, 'g.status' => 1]) ->select('gc.cat_id, c.name, sum(g.goods_num) as gn') ->orderBy('gn DESC') ->groupBy('gc.cat_id'); $catGoodsNum = $catGoodsNumQuery->asArray()->all(); $catOrderNumQuery = \app\models\OrderDetail::find()->alias('od') ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id') ->leftJoin(['gc' => \app\models\GoodsCat::tableName()], 'gc.goods_id = od.goods_id') ->where(['o.store_id' => $store_id, 'o.is_pay' => 1]) ->select('gc.cat_id, sum(od.num) as gn') ->groupBy('gc.cat_id'); $catOrderNum = $catOrderNumQuery->asArray()->all(); $catOrderNum = array_combine(array_column($catOrderNum, 'cat_id'), array_column($catOrderNum, 'gn')); foreach($catGoodsNum as &$item){ $item['per'] = sprintf('%01.5f', $goodsNum > 0 ? ($item['gn'] / $goodsNum * 100) : 0); $item['catOrderNum'] = $catOrderNum[$item['cat_id']] ?? 0; } } if(empty($this->params['tableType']) || $this->params['tableType'] == 'zhiXiao'){ $weekOrderGoodsQuery = \app\models\OrderDetail::find()->alias('od') ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id') ->where(['o.store_id' => $store_id, 'o.is_pay' => 1]) // 滞销时间统计修改为90天内没有订单的商品 ->andWhere(['>=', 'o.created_at', time() - 86400 * 90]) ->select('od.goods_id') ->groupBy('od.goods_id'); $unsalaGoodsQuery = \app\models\Goods::find() ->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1]) ->andWhere(['>=', 'goods_num', 0]) ->andWhere(['>=', 'created_at', time() - 86400 * 30]) ->andWhere(['not in', 'id', $weekOrderGoodsQuery]) ->orderBy('goods_num DESC') ->select('id,name,cover_pic,goods_num,created_at'); if($this->params['keyword']){ $unsalaGoodsQuery->andWhere(['or', ['like', 'name', $this->params['keyword']], ['like', 'key_word', $this->params['keyword']]]); } $unsalaGoods = pagination_make($unsalaGoodsQuery); foreach($unsalaGoods['list'] as &$item){ $lastOrder = \app\models\OrderDetail::find()->alias('od') ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id') ->where(['od.goods_id' => $item['id'], 'o.is_pay' => 1]) ->andWhere(['>=', 'o.created_at', time() - 86400 * 30]) ->select('max(o.id) last_order_id, sum(od.num) gn, max(o.created_at) last_order_time') ->asArray()->one(); $lastOrder['last_order_time'] = $lastOrder['last_order_time'] ? date('Y-m-d H:i:s', $lastOrder['last_order_time']) : ''; $item['lastOrder'] = $lastOrder; } } if($this->params['statistics']){ $goodsCostPriceSum = \app\models\Goods::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])->select('sum(goods_num * cost_price) as cost_price_sum')->scalar(); $goodsPriceSum = \app\models\Goods::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])->select('sum(goods_num * price) as cost_price_sum')->scalar(); $lilv = $goodsPriceSum > 0 ? ($goodsPriceSum - $goodsCostPriceSum) / $goodsPriceSum : 0; $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1]); $orderCount = $queryOrder->count(); $orderSum = $queryOrder->sum('pay_price'); $orderProfit = $orderSum * $lilv; } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, // '$catGoodsNumQuery' => $catGoodsNumQuery->createCommand()->getRawSql(), // '$catOrderNumQuery' => $catOrderNumQuery->createCommand()->getRawSql(), 'data' => [ 'goodsNum' => $goodsNum, 'goodsCostPriceSum' => (float)$goodsCostPriceSum, 'goodsPriceSum' => (float)$goodsPriceSum, 'lilv' => $lilv, 'orderCount' => $orderCount, 'orderSum' => (float)$orderSum, 'orderProfit' => sprintf('%01.2f', $orderProfit), 'kuCun' => $catGoodsNum, 'zhiXiao' => $unsalaGoods, ], ]); } //热销商品 public function actionGoodsSaleTop() { $goodsList = $this->actionGoodsSale(); $goodsList = $goodsList->data['data']['list']; $gids = array_column($goodsList['list'], 'id'); if(!$goodsList['totalCount']){ $gids = [0]; } $form = new StatisticForm(); $form->gids = $gids; $form->date_start = $this->params['beginTime']; $form->date_end = $this->params['endTime']; $form->store_id = get_store_id(); return $this->asJson($form->GoodsSearch()); } //热销商品 public function actionGoodsSale() { $store_id = get_store_id(); $where = [ 'and', ['store_id' => $store_id, 'is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime($this->params['beginTime'])], ['<=', 'created_at', strtotime($this->params['endTime'])], ] ]; if(empty($this->params['tableType']) || $this->params['tableType'] == 'list'){ $weekOrderGoodsQuery = \app\models\OrderDetail::find()->alias('od') ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id') ->where(['o.store_id' => $store_id, 'o.is_pay' => 1]) ->andWhere(['>=', 'o.created_at', strtotime($this->params['beginTime'])]) ->andWhere(['<=', 'o.created_at', strtotime($this->params['endTime'])]) ->select('od.goods_id, sum(od.num) gn') ->groupBy('od.goods_id'); $salaGoodsQuery = \app\models\Goods::find()->alias('g') ->innerJoin(['od' => $weekOrderGoodsQuery], 'g.id = od.goods_id') ->where(['g.store_id' => $store_id, 'g.is_delete' => 0, 'g.status' => 1]) ->orderBy('od.gn DESC, goods_num ASC') ->select('id,name,cover_pic,goods_num,created_at'); if($this->params['keyword']){ $salaGoodsQuery->andWhere(['or', ['like', 'name', $this->params['keyword']], ['like', 'key_word', $this->params['keyword']]]); } $salaGoods = pagination_make($salaGoodsQuery); foreach($salaGoods['list'] as &$item){ $lastOrder = \app\models\OrderDetail::find()->alias('od') ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id') ->where(['od.goods_id' => $item['id'], 'o.is_pay' => 1]) // ->andWhere(['>=', 'o.created_at', time() - 86400 * 7]) ->andWhere(['>=', 'o.created_at', strtotime($this->params['beginTime'])]) ->select('max(o.id) last_order_id, sum(od.num) gn, max(o.created_at) last_order_time') ->asArray()->one(); $lastOrder['last_order_time'] = $lastOrder['last_order_time'] ? date('Y-m-d H:i:s', $lastOrder['last_order_time']) : ''; $item['lastOrder'] = $lastOrder; } } if($this->params['statistics']){ $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1]); $orderGoodsCount = \app\models\OrderDetail::find()->where(['order_id' => $queryOrder->select('id')])->sum('num'); $orderCount = $queryOrder->count(); $orderSum = $queryOrder->sum('pay_price'); $allQueryOrder = \app\models\Order::find()->where(['store_id' => $store_id, 'is_delete' => 0])->andWhere(['is_pay' => 1]); $allOrderGoodsCount = \app\models\OrderDetail::find()->where(['order_id' => $allQueryOrder->select('id')])->sum('num'); $allOrderCount = $allQueryOrder->count(); $allOrderSum = $allQueryOrder->sum('pay_price'); } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, 'data' => [ 'orderGoodsCount' => $orderGoodsCount, 'orderCount' => $orderCount, 'orderSum' => (float)$orderSum, 'allOrderGoodsCount' => $allOrderGoodsCount, 'allOrderCount' => $allOrderCount, 'allOrderSum' => (float)$allOrderSum, 'list' => $salaGoods, ], ]); } //销量分析 public function actionSales() { $store_id = get_store_id(); $where = [ 'and', ['store_id' => $store_id, 'is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime($this->params['beginTime'])], ['<=', 'created_at', strtotime($this->params['endTime'])], ] ]; $whereDay0 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00'))], ]; $whereDay1 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time() - 86400))], ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time()))], ]; $whereDay2 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time() - 86400 * 7))], ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time() - 86400 * 6))], ]; $whereWeek0 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday')))], ]; $whereWeek1 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday') - 86400 * 7))], ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday')))], ]; $whereWeek2 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday') - 86400 * 7 * 4))], ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday') - 86400 * 7 * 3))], ]; $whereMonth0 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-01 00:00:00'))], ]; $whereMonth1 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-01 00:00:00', strtotime('-1 month')))], ['<', 'o.created_at', strtotime(date('Y-m-01 00:00:00'))], ]; $whereMonth2 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-m-01 00:00:00', strtotime('-12 month')))], ['<', 'o.created_at', strtotime(date('Y-m-01 00:00:00', strtotime('-11 month')))], ]; $q = ceil(date('n')/3); $whereQ0 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-' . ($q * 3 - 2) . '-01 00:00:00'))], ]; $whereQ1 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-' . ((($q - 1) % 4) * 3 - 2) . '-01 00:00:00', strtotime('-3 month')))], ['<', 'o.created_at', strtotime(date('Y-' . ($q * 3 - 2) . '-01 00:00:00'))], ]; $whereQ2 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-' . ($q * 3 - 2) . '-01 00:00:00', strtotime('-12 month')))], ['<', 'o.created_at', strtotime(date('Y-' . ((($q + 1) % 4) * 3 - 2) . '-01 00:00:00', strtotime('-9 month')))], ]; $whereYear0 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-01-01 00:00:00'))], ]; $whereYear1 = [ 'and', ['>=', 'o.created_at', strtotime(date('Y-01-01 00:00:00', strtotime('-12 month')))], ['<=', 'o.created_at', strtotime(date('Y-01-01 00:00:00'))], ]; if($this->params['statistics']){ $orderQuery = \app\models\OrderDetail::find()->alias('od')->where(['is_delete' => 0]) ->select(['od.order_id', 'COALESCE(SUM(`od`.`num`),0) AS `num`'])->groupBy('od.order_id'); $query = \app\models\Order::find()->alias('o')->where(['o.is_delete' => 0, 'o.store_id' => $store_id]) ->andWhere(['or', ['o.is_pay' => 1], ['o.pay_type' => 2]]) ->rightJoin(['d' => $orderQuery], 'd.order_id = o.id'); $select = "COUNT(DISTINCT `o`.`user_id`) AS `user_num`, COUNT(`o`.`id`) AS `order_num`,COALESCE(SUM(`o`.`pay_price`),0) AS `pay_price`,COALESCE(sum(`d`.`num`),0) as `goods_num`"; $dataDay0 = (clone $query)->andWhere($whereDay0)->select($select)->asArray()->one(); $dataDay1 = (clone $query)->andWhere($whereDay1)->select($select)->asArray()->one(); $dataDay2 = (clone $query)->andWhere($whereDay2)->select($select)->asArray()->one(); $dataWeek0 = (clone $query)->andWhere($whereWeek0)->select($select)->asArray()->one(); $dataWeek1 = (clone $query)->andWhere($whereWeek1)->select($select)->asArray()->one(); $dataWeek2 = (clone $query)->andWhere($whereWeek2)->select($select)->asArray()->one(); $dataMonth0 = (clone $query)->andWhere($whereMonth0)->select($select)->asArray()->one(); $dataMonth1 = (clone $query)->andWhere($whereMonth1)->select($select)->asArray()->one(); $dataMonth2 = (clone $query)->andWhere($whereMonth2)->select($select)->asArray()->one(); $dataQ0 = (clone $query)->andWhere($whereQ0)->select($select)->asArray()->one(); $dataQ1 = (clone $query)->andWhere($whereQ1)->select($select)->asArray()->one(); $dataQ2 = (clone $query)->andWhere($whereQ2)->select($select)->asArray()->one(); $dataYear0 = (clone $query)->andWhere($whereYear0)->select($select)->asArray()->one(); $dataYear1 = (clone $query)->andWhere($whereYear1)->select($select)->asArray()->one(); $sales = [ 'salesDayOrderPrice' => [ 'data0' => $dataDay0['pay_price'], 'data1' => $this->DataChange($dataDay1['pay_price'], $dataDay0['pay_price']), 'data2' => $this->DataChange($dataDay2['pay_price'], $dataDay0['pay_price']), ], 'salesDayOrderNum' => [ 'data0' => $dataDay0['order_num'], 'data1' => $this->DataChange($dataDay1['order_num'], $dataDay0['order_num']), 'data2' => $this->DataChange($dataDay2['order_num'], $dataDay0['order_num']), ], 'salesDayUserNum' => [ 'data0' => $dataDay0['user_num'], 'data1' => $this->DataChange($dataDay1['user_num'], $dataDay0['user_num']), 'data2' => $this->DataChange($dataDay2['user_num'], $dataDay0['user_num']), ], 'salesMonthOrderPrice' => [ 'data0' => $dataMonth0['pay_price'], 'data1' => $this->DataChange($dataMonth1['pay_price'], $dataMonth0['pay_price']), 'data2' => $this->DataChange($dataMonth2['pay_price'], $dataMonth0['pay_price']), ], 'salesMonthOrderNum' => [ 'data0' => $dataMonth0['order_num'], 'data1' => $this->DataChange($dataMonth1['order_num'], $dataMonth0['order_num']), 'data2' => $this->DataChange($dataMonth2['order_num'], $dataMonth0['order_num']), ], 'salesMonthUserNum' => [ 'data0' => $dataMonth0['user_num'], 'data1' => $this->DataChange($dataMonth1['user_num'], $dataMonth0['user_num']), 'data2' => $this->DataChange($dataMonth2['user_num'], $dataMonth0['user_num']), ], 'salesYearOrderPrice' => [ 'data0' => $dataYear0['pay_price'], 'data1' => $this->DataChange($dataYear1['pay_price'], $dataYear0['pay_price']), ], 'salesYearOrderNum' => [ 'data0' => $dataYear0['order_num'], 'data1' => $this->DataChange($dataYear1['order_num'], $dataYear0['order_num']), ], 'salesYearUserNum' => [ 'data0' => $dataYear0['user_num'], 'data1' => $this->DataChange($dataYear1['user_num'], $dataYear0['user_num']), ], ]; $dataWeekRe0 = (clone $query)->andWhere($whereWeek0)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataWeekRe1 = (clone $query)->andWhere($whereWeek1)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataWeekRe2 = (clone $query)->andWhere($whereWeek2)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataMonthRe0 = (clone $query)->andWhere($whereMonth0)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataMonthRe1 = (clone $query)->andWhere($whereMonth1)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataMonthRe2 = (clone $query)->andWhere($whereMonth2)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataQRe0 = (clone $query)->andWhere($whereQ0)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataQRe1 = (clone $query)->andWhere($whereQ1)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $dataQRe2 = (clone $query)->andWhere($whereQ2)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count(); $sales = array_merge($sales, [ 'avgOrderPriceDay' => [ 'data0' => sprintf('%01.2f', $dataDay0['order_num'] > 0 ? ($dataDay0['pay_price'] / $dataDay0['order_num']) : 0), 'data1' => $this->DataChange($dataDay1['order_num'] > 0 ? ($dataDay1['pay_price'] / $dataDay1['order_num']) : 0, $dataDay0['order_num'] > 0 ? ($dataDay0['pay_price'] / $dataDay0['order_num']) : 0), 'data2' => $this->DataChange($dataDay2['order_num'] > 0 ? ($dataDay2['pay_price'] / $dataDay2['order_num']) : 0, $dataDay0['order_num'] > 0 ? ($dataDay0['pay_price'] / $dataDay0['order_num']) : 0), ], 'avgOrderPriceWeek' => [ 'data0' => sprintf('%01.2f', $dataWeek0['order_num'] > 0 ? ($dataWeek0['pay_price'] / $dataWeek0['order_num']) : 0), 'data1' => $this->DataChange($dataWeek1['order_num'] > 0 ? ($dataWeek1['pay_price'] / $dataWeek1['order_num']) : 0, $dataWeek0['order_num'] > 0 ? ($dataWeek0['pay_price'] / $dataWeek0['order_num']) : 0), 'data2' => $this->DataChange($dataWeek2['order_num'] > 0 ? ($dataWeek2['pay_price'] / $dataWeek2['order_num']) : 0, $dataWeek0['order_num'] > 0 ? ($dataWeek0['pay_price'] / $dataWeek0['order_num']) : 0), ], 'avgOrderPriceMonth' => [ 'data0' => sprintf('%01.2f', $dataMonth0['order_num'] > 0 ? ($dataMonth0['pay_price'] / $dataMonth0['order_num']) : 0), 'data1' => $this->DataChange($dataMonth1['order_num'] > 0 ? ($dataMonth1['pay_price'] / $dataMonth1['order_num']) : 0, $dataMonth0['order_num'] > 0 ? ($dataMonth0['pay_price'] / $dataMonth0['order_num']) : 0), 'data2' => $this->DataChange($dataMonth2['order_num'] > 0 ? ($dataMonth2['pay_price'] / $dataMonth2['order_num']) : 0, $dataMonth0['order_num'] > 0 ? ($dataMonth0['pay_price'] / $dataMonth0['order_num']) : 0), ], 'avgUserOrderNumDay' => [ 'data0' => sprintf('%01.2f', $dataDay0['user_num'] > 0 ? ($dataDay0['order_num'] / $dataDay0['user_num']) : 0), 'data1' => $this->DataChange($dataDay1['user_num'] > 0 ? ($dataDay1['order_num'] / $dataDay1['user_num']) : 0, $dataDay0['user_num'] > 0 ? ($dataDay0['order_num'] / $dataDay0['user_num']) : 0), 'data2' => $this->DataChange($dataDay2['user_num'] > 0 ? ($dataDay2['order_num'] / $dataDay2['user_num']) : 0, $dataDay0['user_num'] > 0 ? ($dataDay0['order_num'] / $dataDay0['user_num']) : 0), ], 'avgUserOrderNumWeek' => [ 'data0' => sprintf('%01.2f', $dataWeek0['user_num'] > 0 ? ($dataWeek0['order_num'] / $dataWeek0['user_num']) : 0), 'data1' => $this->DataChange($dataWeek1['user_num'] > 0 ? ($dataWeek1['order_num'] / $dataWeek1['user_num']) : 0, $dataWeek0['user_num'] > 0 ? ($dataWeek0['order_num'] / $dataWeek0['user_num']) : 0), 'data2' => $this->DataChange($dataWeek2['user_num'] > 0 ? ($dataWeek2['order_num'] / $dataWeek2['user_num']) : 0, $dataWeek0['user_num'] > 0 ? ($dataWeek0['order_num'] / $dataWeek0['user_num']) : 0), ], 'avgUserOrderNumMonth' => [ 'data0' => sprintf('%01.2f', $dataMonth0['user_num'] > 0 ? ($dataMonth0['order_num'] / $dataMonth0['user_num']) : 0), 'data1' => $this->DataChange($dataMonth1['user_num'] > 0 ? ($dataMonth1['order_num'] / $dataMonth1['user_num']) : 0, $dataMonth0['user_num'] > 0 ? ($dataMonth0['order_num'] / $dataMonth0['user_num']) : 0), 'data2' => $this->DataChange($dataMonth2['user_num'] > 0 ? ($dataMonth2['order_num'] / $dataMonth2['user_num']) : 0, $dataMonth0['user_num'] > 0 ? ($dataMonth0['order_num'] / $dataMonth0['user_num']) : 0), ], 'fuGouWeek' => [ 'data0' => sprintf('%01.2f', $dataWeek0['user_num'] > 0 ? ($dataWeekRe0 / $dataWeek0['user_num'] * 100) : 0), 'data1' => $this->DataChange($dataWeek1['user_num'] > 0 ? ($dataWeekRe1 / $dataWeek1['user_num']) : 0, $dataWeek0['user_num'] > 0 ? ($dataWeekRe0 / $dataWeek0['user_num']) : 0), 'data2' => $this->DataChange($dataWeek2['user_num'] > 0 ? ($dataWeekRe2 / $dataWeek2['user_num']) : 0, $dataWeek0['user_num'] > 0 ? ($dataWeekRe0 / $dataWeek0['user_num']) : 0), ], 'fuGouMonth' => [ 'data0' => sprintf('%01.2f', $dataMonth0['user_num'] > 0 ? ($dataMonthRe0 / $dataMonth0['user_num'] * 100) : 0), 'data1' => $this->DataChange($dataMonth1['user_num'] > 0 ? ($dataMonthRe1 / $dataMonth1['user_num']) : 0, $dataMonth0['user_num'] > 0 ? ($dataMonthRe0 / $dataMonth0['user_num']) : 0), 'data2' => $this->DataChange($dataMonth2['user_num'] > 0 ? ($dataMonthRe2 / $dataMonth2['user_num']) : 0, $dataMonth0['user_num'] > 0 ? ($dataMonthRe0 / $dataMonth0['user_num']) : 0), ], 'fuGouQ' => [ 'data0' => sprintf('%01.2f', $dataQ0['user_num'] > 0 ? ($dataQRe0 / $dataQ0['user_num'] * 100) : 0), 'data1' => $this->DataChange($dataQ1['user_num'] > 0 ? ($dataQRe1 / $dataQ1['user_num']) : 0, $dataQ0['user_num'] > 0 ? ($dataQRe0 / $dataQ0['user_num']) : 0), 'data2' => $this->DataChange($dataQ2['user_num'] > 0 ? ($dataQRe2 / $dataQ2['user_num']) : 0, $dataQ0['user_num'] > 0 ? ($dataQRe0 / $dataQ0['user_num']) : 0), ], ]); } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, '$whereQ0' => $whereQ0, '$whereQ1' => $whereQ1, '$whereQ2' => $whereQ2, 'data' => [ // 'sql$dataDay0' => $query->andWhere($whereMonth1)->select($select)->createCommand()->getRawSql(), 'sales' => $sales, '$dataDay0' => $dataDay0, '$dataDay1' => $dataDay1, '$dataDay2' => $dataDay2, '$dataWeek0' => $dataWeek0, '$dataWeek1' => $dataWeek1, '$dataWeek2' => $dataWeek2, '$dataMonth0' => $dataMonth0, '$dataMonth1' => $dataMonth1, '$dataMonth2' => $dataMonth2, '$dataQ0' => $dataQ0, '$dataQ1' => $dataQ1, '$dataQ2' => $dataQ2, '$dataYear0' => $dataYear0, '$dataYear1' => $dataYear1, '$dataWeekRe0' => $dataWeekRe0, '$dataWeekRe1' => $dataWeekRe1, '$dataWeekRe2' => $dataWeekRe2, '$dataMonthRe0' => $dataMonthRe0, '$dataMonthRe1' => $dataMonthRe1, '$dataMonthRe2' => $dataMonthRe2, 'dailysummarytrend' => $this->checkAnalysis(8, ['begin_date' => '20231010', 'end_date' => '20231010']), ], ]); } //销售分析 public function actionSalesAnalysis() { $store_id = get_store_id(); $where = [ 'and', ['store_id' => $store_id, 'is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime($this->params['beginTime'])], ['<=', 'created_at', strtotime($this->params['endTime'])], ] ]; if($this->params['statistics']){ $queryOrder = \app\models\Order::find()->where($where)->andWhere(['NOT IN', 'trade_status', [1, -1]])->andWhere(['or', ['is_pay' => 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]); $orderCount = (clone $queryOrder)->count(); $orderSum = (clone $queryOrder)->sum('total_price'); $orderPaySum = (clone $queryOrder)->sum('pay_price'); $orderGrossProfit = (clone $queryOrder)->sum('gross_profit'); $orderGrossProfitRate = sprintf('%01.2f', $orderSum > 0 ? ($orderGrossProfit / $orderSum * 100) : 0); $orderRefundQuery = \app\models\OrderRefund::find()->where(['order_id' => (clone $queryOrder)->select('id'), 'status' => [1, 2]]); $orderRefundMoneyQuery = \app\models\OrderRefundMoney::find()->where(['order_id' => (clone $queryOrder)->select('id'), 'status' => 1]); $orderRefundCount = $orderRefundQuery->count(); $orderRefundSum = $orderRefundQuery->sum('refund_price') + $orderRefundMoneyQuery->sum('refund_price'); $queryReOrder = \app\models\ReOrder::find()->where($where)->andWhere(['is_pay' => 1]); $reOrderCount = $queryReOrder->count(); $reOrderSum = $queryReOrder->sum('pay_price'); $orderMiniCount = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_MINI])->count(); $orderMiniSum = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_MINI])->sum('total_price'); $orderMiniPaySum = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_MINI])->sum('total_price'); $orderDeliveryCount = (clone $queryOrder)->andWhere(['is_delivery' => 1])->count(); $orderDeliverySum = (clone $queryOrder)->andWhere(['is_delivery' => 1])->sum('pay_price'); $orderOfflineCount = (clone $queryOrder)->andWhere(['is_offline' => 1])->count(); $orderOfflineSum = (clone $queryOrder)->andWhere(['is_offline' => 1])->sum('pay_price'); $orderCashierCount = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_CASHIER])->count(); $orderCashierSum = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_CASHIER])->sum('pay_price'); $scanOrder = \app\plugins\scanCodePay\models\Order::find()->where($where); $orderFaceSum = $scanOrder->andWhere(['is_pay' => \app\plugins\scanCodePay\models\Order::IS_PAY_TRUE])->sum('total_price'); $orderFaceCount = $scanOrder->andWhere(['is_pay' => \app\plugins\scanCodePay\models\Order::IS_PAY_TRUE])->count(); } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, 'data' => [ 'orderCount' => $orderCount, 'orderSum' => (float)$orderSum, 'orderPaySum' => (float)$orderPaySum, 'orderGrossProfit' => (float)$orderGrossProfit, 'orderGrossProfitRate' => $orderGrossProfitRate, 'orderRefundCount' => $orderRefundCount, 'orderRefundSum' => sprintf('%01.2f', $orderRefundSum), 'reOrderCount' => $reOrderCount, 'reOrderSum' => (float)$reOrderSum, 'orderMiniCount' => $orderMiniCount, 'orderMiniSum' => (float)$orderMiniSum, 'orderMiniPaySum' => (float)$orderMiniPaySum, 'orderDeliveryCount' => $orderDeliveryCount, 'orderDeliverySum' => (float)$orderDeliverySum, 'orderOfflineCount' => $orderOfflineCount, 'orderOfflineSum' => (float)$orderOfflineSum, 'orderCashierCount' => $orderCashierCount, 'orderCashierSum' => (float)$orderCashierSum, 'orderFaceSum' => (float)$orderFaceSum, 'orderFaceCount' => (float)$orderFaceCount, ], ]); } //订单7日数据 public function actionOrderSeven() { $days = input_params('days', 7); $store_id = get_store_id(); $where = [ 'and', ['is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-' . $days . ' days')))], ] ]; if($store_id > 0){ $where[] = ['store_id' => $store_id]; } $queryOrder = \app\models\Order::find()->where($where)->andWhere(['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]]); $queryOrder->select(['count(1) as c', 'SUBSTR(order_no,3,8) as d'])->groupBy('d'); $listAll = $queryOrder->asArray()->all(); $listConfirm = (clone $queryOrder)->andWhere(['trade_status' => \app\models\Order::ORDER_FLOW_CONFIRM])->asArray()->all(); $listSend = (clone $queryOrder)->andWhere(['trade_status' => \app\models\Order::ORDER_FLOW_SEND])->asArray()->all(); $listAll_column = array_column($listAll, 'c', 'd'); $listConfirm_column = array_column($listConfirm, 'c', 'd'); $listSend_column = array_column($listSend, 'c', 'd'); $list = []; for($i = 0; $i <= $days; $i++){ $t = time() - $i * 86400; $d = date('Ymd', $t); $item = [ 'd' => date('Y-m-d', $t), 'countAll' => $listAll_column[$d] ?? 0, 'countConfirm' => $listConfirm_column[$d] ?? 0, 'countSend' => $listSend_column[$d] ?? 0, ]; $list[] = $item; } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, 'countAll' => (int)\app\models\Order::find()->andWhere(['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]])->count(), 'data' => $list, 'll' => [ $listAll_column, $listConfirm_column, $listSend_column, ] ]); } //会员7日数据 public function actionUserSeven() { $store_id = get_store_id(); $days = input_params('days', 90); $where = [ 'and', ['is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-' . $days . ' days')))], ] ]; if($store_id > 0){ $where[] = ['store_id' => $store_id]; } $queryOrder = \app\models\SaasUser::find()->where($where); $queryOrder->select(['count(1) as c', 'FROM_UNIXTIME(created_at, "%Y-%m-%d") as d'])->groupBy('d'); $listAll = $queryOrder->asArray()->all(); $listAll_column = array_column($listAll, 'c', 'd'); $list = []; for($i = 0; $i <= $days; $i++){ $t = time() - $i * 86400; $d = date('Y-m-d', $t); $item = [ 'd' => $d, 'countAll' => $listAll_column[$d] ?? 0, ]; $list[] = $item; } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, 'countAll' => (int)\app\models\SaasUser::find()->where(['is_delete' => 0])->count(), 'data' => $list, 'll' => [ $listAll_column, ] ]); } //店铺7日数据 public function actionStoreSeven() { $days = input_params('days', 90); $where = [ 'and', ['is_delete' => 0], [ 'and', ['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-' . $days . ' days')))], ] ]; $queryOrder = \app\models\Store::find()->where($where); $queryOrder->select(['count(1) as c', 'FROM_UNIXTIME(created_at, "%Y-%m-%d") as d'])->groupBy('d'); $listAll = $queryOrder->asArray()->all(); $listAll_column = array_column($listAll, 'c', 'd'); $list = []; for($i = 0; $i <= $days; $i++){ $t = time() - $i * 86400; $d = date('Y-m-d', $t); $item = [ 'd' => $d, 'countAll' => $listAll_column[$d] ?? 0, ]; $list[] = $item; } return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, 'countAll' => (int)\app\models\Store::find()->where(['is_delete' => 0])->count(), 'data' => $list, 'll' => [ $listAll_column, ] ]); } //店铺销量数据 public function actionStoreSale() { $storeList = \app\models\Store::find()->where(['is_delete' => 0])->select('id,name')->asArray()->all(); $conditonOrder = ['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]]; $orderSumList = \app\models\Order::find()->where($conditonOrder)->groupBy('store_id')->select('store_id, SUM(pay_price) s, COUNT(1) c')->asArray()->all(); $userList = \app\models\User::find()->where(['is_delete' => 0])->groupBy('store_id')->select('store_id, COUNT(1) c')->asArray()->all(); $orderSums = array_column($orderSumList, null, 'store_id'); $users = array_column($userList, 'c', 'store_id'); foreach($storeList as &$item){ $item['userCount'] = $users[$item['id']] ?? 0; $item['sum'] = $orderSums[$item['id']]['s'] ?? 0; $item['count'] = $orderSums[$item['id']]['c'] ?? 0; } $sort = array_column($storeList, 'sum'); array_multisort($sort, SORT_DESC, $storeList); foreach($storeList as $i => &$item){ $item['sort'] = $i + 1; } return $this->asJson([ 'code' => 0, 'countAll' => count($storeList), 'data' => $storeList, 'll' => [ $storeList, $users, $orderSums, ] ]); } //订单数据 public function actionOrderList() { $order_no = input_params('order_no', ''); $conditonOrder = ['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]]; $query = \app\models\Order::find()->where($conditonOrder)->orderBy('id DESC'); if($order_no){ $query->andWhere(['order_no' => $order_no]); } $data = pagination_make($query); foreach($data['list'] as &$item){ $item['store_name'] = Option::get('name', $item['store_id'])['value']; $user = \app\models\User::findOne($item['user_id']); $saasUser = \app\models\SaasUser::findOne(['mobile' => $user['binding']]); $item['saasUserName'] = $saasUser['name']; $sharingReceiverSum = \app\models\SharingReceiver::find()->where(['order_no' => $item['order_no'], 'is_delete' => 0, 'is_pay' => [0, 1]])->sum('amount'); $item['sharingReceiverSum'] = $sharingReceiverSum ?? 0; $item['store_income'] = sprintf('%0.2f', $item['pay_price'] - $item['sharingReceiverSum']); } return $this->asJson([ 'code' => 0, 'data' => $data, ]); } //提现列表 public function actionCashList() { $store_id = get_store_id(); $where = ['c.store_id' => $store_id, 'c.is_delete' => 0]; $query = \app\models\Cash::find()->alias('c')->where($where); $listType = (clone $query)->select(['cash_type'])->groupBy('cash_type')->asArray()->column(); $query->leftJoin(['u' => \app\models\User::tableName()], 'u.id = c.user_id'); $query->leftJoin(['su' => \app\models\SaasUser::tableName()], 'su.mobile = u.binding'); $query->andWhere(['c.status' => [\app\models\Cash::STATUS_GIVEN, \app\models\Cash::STATUS_HAND]]); $query->select(['c.id', 'c.cash_type', 'c.status', 'c.pay_time', 'c.price', 'su.name', 'su.avatar']); $list = $query->orderBy('c.id DESC')->limit(30)->asArray()->all(); return $this->asJson([ 'code' => 0, 'params' => $this->params, '$where' => $where, 'data' => $list, 'listType' => $listType, ]); } public function DataChange($data0, $data1) { if($data0 > 0){ if($data1 > 0){ return sprintf('%01.2f', ($data1 - $data0) / $data0 * 100); }else{ return -100; } }else{ if($data1 > 0){ return 100; }else{ return 0; } } } }