| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\admin\controllers\statistic;
- use app\constants\StoreImageFrom;
- use app\models\AccountLog;
- use app\models\Option;
- use app\models\ReOrder;
- use app\models\StoreMini;
- use app\models\WechatConfig;
- use app\modules\admin\controllers\BaseController;
- use app\modules\admin\models\StatisticForm;
- use Curl\Curl;
- use EasyWeChat\Factory;
- use EasyWeChat\Kernel\BaseClient;
- use yii\helpers\Json;
- class DataController extends BaseController
- {
- /**
- * @var \EasyWeChat\MiniProgram\Application
- */
- protected $mini_program;
- /**
- * Undocumented function
- *
- * @Author LGL 24963@qq.com
- * @DateTime 2021-01-21
- * @desc: 数据概括
- * @return void
- */
- public function actionCollecta()
- {
- $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());
- }
- /**
- * 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;
- }
- }
- }
- }
|