DataController.php 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\controllers\statistic;
  8. use app\constants\StoreImageFrom;
  9. use app\models\AccountLog;
  10. use app\models\Option;
  11. use app\models\ReOrder;
  12. use app\models\StoreMini;
  13. use app\models\WechatConfig;
  14. use app\modules\admin\controllers\BaseController;
  15. use app\modules\admin\models\StatisticForm;
  16. use Curl\Curl;
  17. use EasyWeChat\Factory;
  18. use EasyWeChat\Kernel\BaseClient;
  19. use yii\helpers\Json;
  20. class DataController extends BaseController
  21. {
  22. /**
  23. * @var \EasyWeChat\MiniProgram\Application
  24. */
  25. protected $mini_program;
  26. /**
  27. * Undocumented function
  28. *
  29. * @Author LGL 24963@qq.com
  30. * @DateTime 2021-01-21
  31. * @desc: 数据概括
  32. * @return void
  33. */
  34. public function actionCollecta()
  35. {
  36. $form = new StatisticForm();
  37. $form->keyword = get_params('keyword');
  38. if (get_params('datetime')) {
  39. $form->date_start = get_params('datetime')[0];
  40. $form->date_end = get_params('datetime')[1];
  41. }
  42. $form->type = get_params('type', 'coupon');
  43. $form->platform = get_params('platform');
  44. $form->keyword_1 = get_params('keyword_1');
  45. $form->store_id = get_store_id();
  46. return $this->asJson($form->GrantSearch());
  47. }
  48. /**
  49. * Undocumented function
  50. *
  51. * @Author LGL 24963@qq.com
  52. * @DateTime 2021-01-21
  53. * @desc: 分销排行
  54. * @return void
  55. */
  56. public function actionDistributor()
  57. {
  58. $form = new StatisticForm();
  59. $form->keyword = get_params('keyword');
  60. $form->platform = get_params('platform');
  61. return $this->asJson($form->getShareList());
  62. }
  63. /**
  64. * Undocumented function
  65. *
  66. * @Author LGL 24963@qq.com
  67. * @DateTime 2021-01-21
  68. * @desc: 销售统计
  69. * @return void
  70. */
  71. public function actionSale()
  72. {
  73. $form = new StatisticForm();
  74. $form->keyword = get_params('keyword');
  75. if (get_params('datetime')) {
  76. $form->date_start = get_params('datetime')[0];
  77. $form->date_end = get_params('datetime')[1];
  78. }
  79. return $this->asJson($form->OrderSearch());
  80. }
  81. /**
  82. * Undocumented function
  83. *
  84. * @Author LGL 24963@qq.com
  85. * @DateTime 2021-01-23
  86. * @desc: 积分统计
  87. * @return void
  88. */
  89. public function actionIntegral()
  90. {
  91. $form = new StatisticForm();
  92. $form->keyword = get_params('keyword');
  93. $form->platform = get_params('platform');
  94. if (get_params('datetime')) {
  95. $form->date_start = get_params('datetime')[0];
  96. $form->date_end = get_params('datetime')[1];
  97. }
  98. return $this->asJson($form->IntegralSearch());
  99. }
  100. /**
  101. * Undocumented function
  102. *
  103. * @Author LGL 24963@qq.com
  104. * @DateTime 2021-01-23
  105. * @desc: 发放统计
  106. * @return void
  107. */
  108. public function actionGrant()
  109. {
  110. $form = new StatisticForm();
  111. $form->keyword = get_params('keyword');
  112. if (get_params('datetime')) {
  113. $form->date_start = get_params('datetime')[0];
  114. $form->date_end = get_params('datetime')[1];
  115. }
  116. $form->type = get_params('type', 'coupon');
  117. $form->platform = get_params('platform');
  118. $form->keyword_1 = get_params('keyword_1');
  119. $form->store_id = get_store_id();
  120. return $this->asJson($form->GrantSearch());
  121. }
  122. /**
  123. * @description: 客户端图片统计
  124. * @param {*}
  125. * @return {*}
  126. */
  127. public function actionGetImg()
  128. {
  129. $form = new StoreImageFrom();
  130. $img = $form->search();
  131. return $this->asJson([
  132. 'code' => 0,
  133. 'data' => $img
  134. ]);
  135. }
  136. /**
  137. * 小程序数据分析
  138. */
  139. public function actionCollect()
  140. {
  141. if (\Yii::$app->request->isPost) {
  142. $post = \Yii::$app->request->post();
  143. $new_time = $post['time'];
  144. $now_time = time();
  145. $new_day = [
  146. 'begin_date' => date('Ymd', strtotime($new_time)),
  147. 'end_date' => date('Ymd', strtotime($new_time)),
  148. ];
  149. $last_day = [
  150. 'begin_date' => date('Ymd', strtotime("-2 day", $now_time)),
  151. 'end_date' => date('Ymd', strtotime("-2 day", $now_time)),
  152. ];
  153. $data = [
  154. 'visitdistribution' => $this->checkAnalysis(7, $new_day),
  155. 'lastvisitdistribution' => $this->checkAnalysis(7, $last_day),
  156. ];
  157. return $this->asJson([
  158. 'code' => 0,
  159. 'data' => $data,
  160. ]);
  161. }
  162. $date = date('Ymd');
  163. $cacheK = 'admin_statistic_data_recharge_' . get_store_id() . '_' . $date;
  164. $cacheV = cache()->get($cacheK);
  165. if($cacheV){
  166. return $this->asJson([
  167. 'code' => 0,
  168. 'data' => $cacheV,
  169. ]);
  170. }
  171. $timestamp = time();
  172. //day
  173. $day = [
  174. 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  175. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  176. ];
  177. $lastday = [
  178. 'begin_date' => date('Ymd', strtotime("-2 day", $timestamp)),
  179. 'end_date' => date('Ymd', strtotime("-2 day", $timestamp)),
  180. ];
  181. //week
  182. $week = [
  183. 'begin_date' => date('Ymd', strtotime("last week Monday", $timestamp)),
  184. 'end_date' => date('Ymd', strtotime("last week Sunday", $timestamp)),
  185. ];
  186. $lastweek = [
  187. 'begin_date' => date('Ymd', strtotime("last week Monday -7 day", $timestamp)),
  188. 'end_date' => date('Ymd', strtotime("last week Sunday -7 day", $timestamp)),
  189. ];
  190. //month
  191. $last_month = date('Y-m-01', strtotime("last month", $timestamp));
  192. $month = [
  193. 'begin_date' => date('Ymd', strtotime($last_month)),
  194. 'end_date' => date('Ymd', strtotime("$last_month +1 month -1 seconds")),
  195. ];
  196. $last_last_month = date('Y-m-01', strtotime("last month -1 month", $timestamp));
  197. $lastmonth = [
  198. 'begin_date' => date('Ymd', strtotime($last_last_month)),
  199. 'end_date' => date('Ymd', strtotime("$last_last_month +1 month -1 seconds")),
  200. ];
  201. $lastmonth = [
  202. 'begin_date' => date('Ymd', strtotime($last_last_month)),
  203. 'end_date' => date('Ymd', strtotime("$last_last_month +1 month -1 seconds")),
  204. ];
  205. //day
  206. $thirdDay = [
  207. 'begin_date' => date('Ymd', strtotime("-3 day", $timestamp)),
  208. 'end_date' => date('Ymd', strtotime("-3 day", $timestamp)),
  209. ];
  210. $fourthDay = [
  211. 'begin_date' => date('Ymd', strtotime("-4 day", $timestamp)),
  212. 'end_date' => date('Ymd', strtotime("-4 day", $timestamp)),
  213. ];
  214. $fifthDay = [
  215. 'begin_date' => date('Ymd', strtotime("-5 day", $timestamp)),
  216. 'end_date' => date('Ymd', strtotime("-5 day", $timestamp)),
  217. ];
  218. $sixthDay = [
  219. 'begin_date' => date('Ymd', strtotime("-6 day", $timestamp)),
  220. 'end_date' => date('Ymd', strtotime("-6 day", $timestamp)),
  221. ];
  222. $seventhDay = [
  223. 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)),
  224. 'end_date' => date('Ymd', strtotime("-7 day", $timestamp)),
  225. ];
  226. $timestamp = time();
  227. $userDay = [
  228. 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  229. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  230. ];
  231. $userSevenDay = [
  232. 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)),
  233. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  234. ];
  235. $userThirtyDay = [
  236. 'begin_date' => date('Ymd', strtotime("-30 day", $timestamp)),
  237. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  238. ];
  239. $data = [
  240. 'dailyretaininfo' => $this->checkAnalysis(0, $day),
  241. 'lastdailyretaininfo' => $this->checkAnalysis(0, $lastday),
  242. 'weeklyretaininfo' => $this->checkAnalysis(1, $week),
  243. 'lastweeklyretaininfo' => $this->checkAnalysis(1, $lastweek),
  244. 'monthlyretaininfo' => $this->checkAnalysis(2, $month),
  245. 'lastmonthlyretaininfo' => $this->checkAnalysis(2, $lastmonth),
  246. 'dailyvisittrend' => $this->checkAnalysis(3, $day),
  247. 'lastdailyvisittrend' => $this->checkAnalysis(3, $lastday),
  248. 'weeklyvisittrend' => $this->checkAnalysis(4, $week),
  249. 'lastweeklyvisittrend' => $this->checkAnalysis(4, $lastweek),
  250. 'monthlyvisittrend' => $this->checkAnalysis(5, $month),
  251. 'lastmonthlyvisittrend' => $this->checkAnalysis(5, $lastmonth),
  252. 'userportraitone'=>$this->checkAnalysis(6, $userDay),
  253. 'userportraitseven'=>$this->checkAnalysis(6, $userSevenDay),
  254. 'userportraitthirty'=>$this->checkAnalysis(6, $userThirtyDay),
  255. 'visitdistribution'=>$this->checkAnalysis(7, $userDay),
  256. 'dailysummarytrend' => $this->checkAnalysis(8, $day),
  257. 'lastsummarytrend' => $this->checkAnalysis(8, $lastday),
  258. 'thirdretaininfo' => $this->checkAnalysis(0, $thirdDay),
  259. 'thirdvisittrend' => $this->checkAnalysis(3, $thirdDay),
  260. 'fourthretaininfo' => $this->checkAnalysis(0, $fourthDay),
  261. 'fourthvisittrend' => $this->checkAnalysis(3, $fourthDay),
  262. 'fifthretaininfo' => $this->checkAnalysis(0, $fifthDay),
  263. 'fifthvisittrend' => $this->checkAnalysis(3, $fifthDay),
  264. 'sixthretaininfo' => $this->checkAnalysis(0, $sixthDay),
  265. 'sixthvisittrend' => $this->checkAnalysis(3, $sixthDay),
  266. 'seventhretaininfo' => $this->checkAnalysis(0, $seventhDay),
  267. 'seventhvisittrend' => $this->checkAnalysis(3, $seventhDay),
  268. ];
  269. if(empty($data['lastmonthlyvisittrend']['list'])){
  270. $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];
  271. }
  272. cache()->set($cacheK, $data, strtotime(date('Y-m-d 00:00:00', time() + 86400)) - time());
  273. return $this->asJson([
  274. 'code' => 0,
  275. 'data' => $data,
  276. ]);
  277. }
  278. public function actionAnalyticsOne()
  279. {
  280. $timestamp = time();
  281. $day = [
  282. 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  283. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  284. ];
  285. $sevenDay = [
  286. 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)),
  287. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  288. ];
  289. $thirtyDay = [
  290. 'begin_date' => date('Ymd', strtotime("-30 day", $timestamp)),
  291. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  292. ];
  293. $data = [
  294. 'userportraitone' => $this->checkAnalysis(6, $day),
  295. 'userportraitseven' => $this->checkAnalysis(6, $sevenDay),
  296. 'userportraitthirty' => $this->checkAnalysis(6, $thirtyDay),
  297. 'visitdistribution' => $this->checkAnalysis(7, $day),
  298. ];
  299. return $this->asJson([
  300. 'code' => 0,
  301. 'data' => $data,
  302. ]);
  303. }
  304. public function actionAnalyticsTwo()
  305. {
  306. $timestamp = time();
  307. //day
  308. $thirdDay = [
  309. 'begin_date' => date('Ymd', strtotime("-3 day", $timestamp)),
  310. 'end_date' => date('Ymd', strtotime("-3 day", $timestamp)),
  311. ];
  312. $fourthDay = [
  313. 'begin_date' => date('Ymd', strtotime("-4 day", $timestamp)),
  314. 'end_date' => date('Ymd', strtotime("-4 day", $timestamp)),
  315. ];
  316. $fifthDay = [
  317. 'begin_date' => date('Ymd', strtotime("-5 day", $timestamp)),
  318. 'end_date' => date('Ymd', strtotime("-5 day", $timestamp)),
  319. ];
  320. $sixthDay = [
  321. 'begin_date' => date('Ymd', strtotime("-6 day", $timestamp)),
  322. 'end_date' => date('Ymd', strtotime("-6 day", $timestamp)),
  323. ];
  324. $seventhDay = [
  325. 'begin_date' => date('Ymd', strtotime("-7 day", $timestamp)),
  326. 'end_date' => date('Ymd', strtotime("-7 day", $timestamp)),
  327. ];
  328. $data = [
  329. 'thirdretaininfo' => $this->checkAnalysis(0, $thirdDay),
  330. 'thirdvisittrend' => $this->checkAnalysis(3, $thirdDay),
  331. 'fourthretaininfo' => $this->checkAnalysis(0, $fourthDay),
  332. 'fourthvisittrend' => $this->checkAnalysis(3, $fourthDay),
  333. 'fifthretaininfo' => $this->checkAnalysis(0, $fifthDay),
  334. 'fifthvisittrend' => $this->checkAnalysis(3, $fifthDay),
  335. 'sixthretaininfo' => $this->checkAnalysis(0, $sixthDay),
  336. 'sixthvisittrend' => $this->checkAnalysis(3, $sixthDay),
  337. 'seventhretaininfo' => $this->checkAnalysis(0, $seventhDay),
  338. 'seventhvisittrend' => $this->checkAnalysis(3, $seventhDay),
  339. ];
  340. return $this->asJson([
  341. 'code' => 0,
  342. 'data' => $data,
  343. ]);
  344. }
  345. private function checkAnalysis($type, $time)
  346. {
  347. $res = [
  348. 'code'=>0,
  349. 'data'=>[]
  350. ];
  351. if (is_open_platform()) {
  352. //获取三方平台配置信息
  353. $config = [
  354. 'app_id' => Option::get("platform_third_appid", 0, 'saas')['value'],
  355. 'secret' => Option::get("platform_third_secret", 0, 'saas')['value'],
  356. 'token' => Option::get("platform_token", 0, 'saas')['value'],
  357. 'aes_key' => Option::get("platform_encodingAesKey", 0, 'saas')['value']
  358. ];
  359. //设置小程序配置
  360. $WechatConfig = WechatConfig::findOne(['store_id' => get_store_id()]);
  361. $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();
  362. if(empty($store_mini->appid) || empty($store_mini->authorizer_refresh_token)){
  363. return [
  364. 'code'=>1,
  365. 'msg'=>"参数配置错误"
  366. ];
  367. }
  368. $openPlatform = Factory::openPlatform($config);
  369. $mini_program = $openPlatform->miniProgram($store_mini->appid, $store_mini->authorizer_refresh_token);
  370. $client = new BaseClient($mini_program);
  371. $data = [
  372. 'begin_date' => $time['begin_date'],
  373. 'end_date' => $time['end_date']
  374. ];
  375. switch($type) {
  376. case 0:
  377. $res = $client->httpPostJson("datacube/getweanalysisappiddailyretaininfo", $data);
  378. break;
  379. case 1:
  380. $res = $client->httpPostJson("datacube/getweanalysisappidweeklyretaininfo", $data);
  381. break;
  382. case 2:
  383. $res = $client->httpPostJson("datacube/getweanalysisappidmonthlyretaininfo", $data);
  384. break;
  385. case 3:
  386. $res = $client->httpPostJson("datacube/getweanalysisappiddailyvisittrend", $data);
  387. break;
  388. case 4:
  389. $res = $client->httpPostJson("datacube/getweanalysisappidweeklyvisittrend", $data);
  390. break;
  391. case 5:
  392. $res = $client->httpPostJson("datacube/getweanalysisappidmonthlyvisittrend", $data);
  393. break;
  394. case 6:
  395. $res = $client->httpPostJson("datacube/getweanalysisappiduserportrait", $data);
  396. break;
  397. case 7:
  398. $res = $client->httpPostJson("datacube/getweanalysisappidvisitpage", $data);
  399. break;
  400. case 8:
  401. $res = $client->httpPostJson("datacube/getweanalysisappiddailysummarytrend", $data);
  402. break;
  403. }
  404. } else {
  405. $this->mini_program = $this->wechat;
  406. if(!empty($this->mini_program)){
  407. switch($type) {
  408. case 0:
  409. $res = $this->mini_program->data_cube->dailyRetainInfo($time['begin_date'], $time['end_date']);
  410. break;
  411. case 1:
  412. $res = $this->mini_program->data_cube->weeklyRetainInfo($time['begin_date'], $time['end_date']);
  413. break;
  414. case 2:
  415. $res = $this->mini_program->data_cube->monthlyRetainInfo($time['begin_date'], $time['end_date']);
  416. break;
  417. case 3:
  418. $res = $this->mini_program->data_cube->dailyVisitTrend($time['begin_date'], $time['end_date']);
  419. break;
  420. case 4:
  421. $res = $this->mini_program->data_cube->weeklyVisitTrend($time['begin_date'], $time['end_date']);
  422. break;
  423. case 5:
  424. $res = $this->mini_program->data_cube->monthlyVisitTrend($time['begin_date'], $time['end_date']);
  425. break;
  426. case 6:
  427. $res = $this->mini_program->data_cube->userPortrait($time['begin_date'], $time['end_date']);
  428. break;
  429. case 7:
  430. $res = $this->mini_program->data_cube->visitPage($time['begin_date'], $time['end_date']);
  431. break;
  432. case 8:
  433. $res = $this->mini_program->data_cube->summaryTrend($time['begin_date'], $time['end_date']);
  434. break;
  435. }
  436. }
  437. }
  438. return $res;
  439. }
  440. public function getParams($k = null) {
  441. $dateType = input_params('dateType', '') ?: '';
  442. $beginTime = input_params('beginTime', '');
  443. $endTime = input_params('endTime', '');
  444. $statistics = input_params('statistics', 1);
  445. // $params = [
  446. // 'dateType' => $dateType ?: 'day', //day/week/month/year
  447. // 'beginTime' => $beginTime ?: date('Y-m-d 00:00:00'),
  448. // 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()),
  449. // ];
  450. $params = [
  451. 'dateType' => $dateType ?: 'week', //day/week/month/year
  452. 'beginTime' => $beginTime ?: date('Y-m-d 00:00:00', strtotime('last monday')),
  453. 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()),
  454. ];
  455. // $params = [
  456. // 'dateType' => $dateType ?: 'month', //day/week/month/year
  457. // 'beginTime' => $beginTime ?: date('Y-m-01 00:00:00'),
  458. // 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()),
  459. // ];
  460. // $params = [
  461. // 'dateType' => $dateType ?: 'year', //day/week/month/year
  462. // 'beginTime' => $beginTime ?: date('Y-01-01 00:00:00'),
  463. // 'endTime' => $endTime ?: date('Y-m-d 23:59:59', time()),
  464. // ];
  465. $params['statistics'] = $statistics;
  466. $params['keyword'] = input_params('keyword', '');
  467. $params['tableType'] = input_params('tableType', '');
  468. if($params['keyword'] || $params['tableType']){
  469. $params['statistics'] = 0;
  470. }
  471. return $k ? $params[$k] : $params;
  472. }
  473. //会员储值
  474. public function actionRecharge() {
  475. $store_id = get_store_id();
  476. $where = [
  477. 'and',
  478. ['store_id' => $store_id],
  479. [
  480. 'and',
  481. ['>=', 'created_at', strtotime($this->params['beginTime'])],
  482. ['<=', 'created_at', strtotime($this->params['endTime'])]
  483. ]
  484. ];
  485. $query = AccountLog::find()->where($where)->andWhere(['>', 'amount', 0])
  486. ->andWhere(['OR', ['operator_type' => AccountLog::TYPE_OPERATOR_BACK], ['AND', ['>', 'order_id', 0], ['order_type' => AccountLog::TYPE_RECHARGE_ORDER]]]);
  487. if(empty($this->params['tableType']) || $this->params['tableType'] == 'list'){
  488. $select = '*, amount pay_price';
  489. $queryList = clone $query;
  490. if($this->params['keyword']){
  491. $queryU = \app\models\SaasUser::find()->where(['or', ['like', 'name', $this->params['keyword']], ['like', 'mobile', $this->params['keyword']]])->select('mobile');
  492. $queryList->andWhere(['user_id' => \app\models\User::find()->where(['binding' => $queryU])->select('id')]);
  493. }
  494. $list = pagination_make($queryList->select($select)->orderBy('id DESC'));
  495. foreach ($list['list'] as &$item) {
  496. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  497. $user = \app\models\User::findOne($item['user_id']);
  498. $saasUser = \app\models\SaasUser::findOne(['mobile' => $user['binding'], 'is_delete' => 0]);
  499. $item['userInfo'] = [
  500. 'name' => $saasUser['name'],
  501. 'avatar' => $saasUser['avatar'],
  502. 'money' => $user['money'],
  503. 'phone' => $user['binding'],
  504. ];
  505. $item['send_price'] = '0.00';
  506. if ($item['order_id'] > 0) {
  507. $reorder = ReOrder::findOne($item['order_id']);
  508. if ($reorder) {
  509. $item['send_price'] = $reorder->send_price;
  510. }
  511. }
  512. if (intval($item['log_type']) === AccountLog::LOG_TYPE_EXPEND) {
  513. $item['pay_price'] = '-' . $item['pay_price'];
  514. }
  515. }
  516. }
  517. if($this->params['statistics']){
  518. $reUserCount = (clone $query)->groupBy('user_id')->count();
  519. $reCount = (clone $query)->count();
  520. $reSum = (clone $query)->andWhere(['log_type' => AccountLog::LOG_TYPE_INCOME])->sum('amount');
  521. $reduceSum = (clone $query)->andWhere(['log_type' => AccountLog::LOG_TYPE_EXPEND])->sum('amount');
  522. $reSum = bcsub($reSum, $reduceSum, 2);
  523. $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]]);
  524. $orderUserCount = (clone $queryOrder)->groupBy('user_id')->count();
  525. $orderCount = (clone $queryOrder)->count();
  526. $orderSum = (clone $queryOrder)->sum('pay_price');
  527. }
  528. return $this->asJson([
  529. 'code' => 0,
  530. 'params' => $this->params,
  531. '$where' => $where,
  532. // '$s' => $query->createCommand()->getRawSql(),
  533. 'data' => [
  534. 'reUserCount' => $reUserCount,
  535. 'reCount' => $reCount,
  536. 'reSum' => (float)$reSum,
  537. 'orderUserCount' => $orderUserCount,
  538. 'orderCount' => $orderCount,
  539. 'orderSum' => (float)$orderSum,
  540. 'list' => $list,
  541. ],
  542. ]);
  543. }
  544. //会员分析
  545. public function actionUser() {
  546. $store_id = get_store_id();
  547. $where = [
  548. 'and',
  549. ['store_id' => $store_id, 'is_delete' => 0],
  550. [
  551. 'and',
  552. ['>=', 'created_at', strtotime($this->params['beginTime'])],
  553. ['<=', 'created_at', strtotime($this->params['endTime'])],
  554. ]
  555. ];
  556. $query = \app\models\User::find()->where($where);
  557. if(empty($this->params['tableType']) || $this->params['tableType'] == 'list'){
  558. $select = 'id,binding,level,money,integral';
  559. $queryList = clone $query;
  560. if($this->params['keyword']){
  561. $queryU = \app\models\SaasUser::find()->where(['or', ['like', 'name', $this->params['keyword']], ['like', 'mobile', $this->params['keyword']]])->select('mobile');
  562. $queryList->andWhere(['binding' => $queryU]);
  563. }
  564. $levelList = \app\models\Level::findAll(['store_id' => $store_id]);
  565. $levels = array_column($levelList, 'name', 'level');
  566. $list = pagination_make($queryList->select($select)->orderBy('money DESC'));
  567. foreach ($list['list'] as &$user) {
  568. $saasUser = \app\models\SaasUser::findOne(['mobile' => $user['binding'], 'is_delete' => 0]);
  569. $user['userInfo'] = [
  570. 'name' => $saasUser['name'],
  571. 'avatar' => $saasUser['avatar'],
  572. 'money' => $user['money'],
  573. 'phone' => $user['binding'],
  574. 'level_name' => $levels[$user['level']] ?? '普通用户',
  575. ];
  576. }
  577. }
  578. if($this->params['statistics']){
  579. $allUserCount = \app\models\User::find()->where(['store_id' => $store_id, 'is_delete' => 0])->count();
  580. $userCount = $query->count();
  581. $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1]);
  582. $orderCount = $queryOrder->count();
  583. $orderSum = $queryOrder->sum('pay_price');
  584. }
  585. return $this->asJson([
  586. 'code' => 0,
  587. 'params' => $this->params,
  588. '$where' => $where,
  589. // '$s' => $query->createCommand()->getRawSql(),
  590. 'data' => [
  591. 'userCount' => $userCount,
  592. 'allUserCount' => $allUserCount,
  593. 'orderCount' => $orderCount,
  594. 'orderSum' => (float)$orderSum,
  595. 'list' => $list,
  596. ],
  597. ]);
  598. }
  599. //库存分析
  600. public function actionGoodsNum() {
  601. $store_id = get_store_id();
  602. $where = [
  603. 'and',
  604. ['store_id' => $store_id, 'is_delete' => 0],
  605. [
  606. 'and',
  607. ['>=', 'created_at', strtotime($this->params['beginTime'])],
  608. ['<=', 'created_at', strtotime($this->params['endTime'])],
  609. ]
  610. ];
  611. $goodsNum = \app\models\Goods::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])->sum('goods_num');
  612. if(empty($this->params['tableType']) || $this->params['tableType'] == 'kuCun'){
  613. $catGoodsNumQuery = \app\models\GoodsCat::find()->alias('gc')
  614. ->leftJoin(['c' => \app\models\Cat::tableName()], 'gc.cat_id = c.id')
  615. ->leftJoin(['g' => \app\models\Goods::tableName()], 'gc.goods_id = g.id')
  616. ->where(['c.store_id' => $store_id, 'gc.store_id' => $store_id, 'g.store_id' => $store_id, 'g.is_delete' => 0, 'g.status' => 1])
  617. ->select('gc.cat_id, c.name, sum(g.goods_num) as gn')
  618. ->orderBy('gn DESC')
  619. ->groupBy('gc.cat_id');
  620. $catGoodsNum = $catGoodsNumQuery->asArray()->all();
  621. $catOrderNumQuery = \app\models\OrderDetail::find()->alias('od')
  622. ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id')
  623. ->leftJoin(['gc' => \app\models\GoodsCat::tableName()], 'gc.goods_id = od.goods_id')
  624. ->where(['o.store_id' => $store_id, 'o.is_pay' => 1])
  625. ->select('gc.cat_id, sum(od.num) as gn')
  626. ->groupBy('gc.cat_id');
  627. $catOrderNum = $catOrderNumQuery->asArray()->all();
  628. $catOrderNum = array_combine(array_column($catOrderNum, 'cat_id'), array_column($catOrderNum, 'gn'));
  629. foreach($catGoodsNum as &$item){
  630. $item['per'] = sprintf('%01.5f', $goodsNum > 0 ? ($item['gn'] / $goodsNum * 100) : 0);
  631. $item['catOrderNum'] = $catOrderNum[$item['cat_id']] ?? 0;
  632. }
  633. }
  634. if(empty($this->params['tableType']) || $this->params['tableType'] == 'zhiXiao'){
  635. $weekOrderGoodsQuery = \app\models\OrderDetail::find()->alias('od')
  636. ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id')
  637. ->where(['o.store_id' => $store_id, 'o.is_pay' => 1])
  638. // 滞销时间统计修改为90天内没有订单的商品
  639. ->andWhere(['>=', 'o.created_at', time() - 86400 * 90])
  640. ->select('od.goods_id')
  641. ->groupBy('od.goods_id');
  642. $unsalaGoodsQuery = \app\models\Goods::find()
  643. ->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])
  644. ->andWhere(['>=', 'goods_num', 0])
  645. ->andWhere(['>=', 'created_at', time() - 86400 * 30])
  646. ->andWhere(['not in', 'id', $weekOrderGoodsQuery])
  647. ->orderBy('goods_num DESC')
  648. ->select('id,name,cover_pic,goods_num,created_at');
  649. if($this->params['keyword']){
  650. $unsalaGoodsQuery->andWhere(['or', ['like', 'name', $this->params['keyword']], ['like', 'key_word', $this->params['keyword']]]);
  651. }
  652. $unsalaGoods = pagination_make($unsalaGoodsQuery);
  653. foreach($unsalaGoods['list'] as &$item){
  654. $lastOrder = \app\models\OrderDetail::find()->alias('od')
  655. ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id')
  656. ->where(['od.goods_id' => $item['id'], 'o.is_pay' => 1])
  657. ->andWhere(['>=', 'o.created_at', time() - 86400 * 30])
  658. ->select('max(o.id) last_order_id, sum(od.num) gn, max(o.created_at) last_order_time')
  659. ->asArray()->one();
  660. $lastOrder['last_order_time'] = $lastOrder['last_order_time'] ? date('Y-m-d H:i:s', $lastOrder['last_order_time']) : '';
  661. $item['lastOrder'] = $lastOrder;
  662. }
  663. }
  664. if($this->params['statistics']){
  665. $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();
  666. $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();
  667. $lilv = $goodsPriceSum > 0 ? ($goodsPriceSum - $goodsCostPriceSum) / $goodsPriceSum : 0;
  668. $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1]);
  669. $orderCount = $queryOrder->count();
  670. $orderSum = $queryOrder->sum('pay_price');
  671. $orderProfit = $orderSum * $lilv;
  672. }
  673. return $this->asJson([
  674. 'code' => 0,
  675. 'params' => $this->params,
  676. '$where' => $where,
  677. // '$catGoodsNumQuery' => $catGoodsNumQuery->createCommand()->getRawSql(),
  678. // '$catOrderNumQuery' => $catOrderNumQuery->createCommand()->getRawSql(),
  679. 'data' => [
  680. 'goodsNum' => $goodsNum,
  681. 'goodsCostPriceSum' => (float)$goodsCostPriceSum,
  682. 'goodsPriceSum' => (float)$goodsPriceSum,
  683. 'lilv' => $lilv,
  684. 'orderCount' => $orderCount,
  685. 'orderSum' => (float)$orderSum,
  686. 'orderProfit' => sprintf('%01.2f', $orderProfit),
  687. 'kuCun' => $catGoodsNum,
  688. 'zhiXiao' => $unsalaGoods,
  689. ],
  690. ]);
  691. }
  692. //热销商品
  693. public function actionGoodsSaleTop() {
  694. $goodsList = $this->actionGoodsSale();
  695. $goodsList = $goodsList->data['data']['list'];
  696. $gids = array_column($goodsList['list'], 'id');
  697. if(!$goodsList['totalCount']){
  698. $gids = [0];
  699. }
  700. $form = new StatisticForm();
  701. $form->gids = $gids;
  702. $form->date_start = $this->params['beginTime'];
  703. $form->date_end = $this->params['endTime'];
  704. $form->store_id = get_store_id();
  705. return $this->asJson($form->GoodsSearch());
  706. }
  707. //热销商品
  708. public function actionGoodsSale() {
  709. $store_id = get_store_id();
  710. $where = [
  711. 'and',
  712. ['store_id' => $store_id, 'is_delete' => 0],
  713. [
  714. 'and',
  715. ['>=', 'created_at', strtotime($this->params['beginTime'])],
  716. ['<=', 'created_at', strtotime($this->params['endTime'])],
  717. ]
  718. ];
  719. if(empty($this->params['tableType']) || $this->params['tableType'] == 'list'){
  720. $weekOrderGoodsQuery = \app\models\OrderDetail::find()->alias('od')
  721. ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id')
  722. ->where(['o.store_id' => $store_id, 'o.is_pay' => 1])
  723. ->andWhere(['>=', 'o.created_at', strtotime($this->params['beginTime'])])
  724. ->andWhere(['<=', 'o.created_at', strtotime($this->params['endTime'])])
  725. ->select('od.goods_id, sum(od.num) gn')
  726. ->groupBy('od.goods_id');
  727. $salaGoodsQuery = \app\models\Goods::find()->alias('g')
  728. ->innerJoin(['od' => $weekOrderGoodsQuery], 'g.id = od.goods_id')
  729. ->where(['g.store_id' => $store_id, 'g.is_delete' => 0, 'g.status' => 1])
  730. ->orderBy('od.gn DESC, goods_num ASC')
  731. ->select('id,name,cover_pic,goods_num,created_at');
  732. if($this->params['keyword']){
  733. $salaGoodsQuery->andWhere(['or', ['like', 'name', $this->params['keyword']], ['like', 'key_word', $this->params['keyword']]]);
  734. }
  735. $salaGoods = pagination_make($salaGoodsQuery);
  736. foreach($salaGoods['list'] as &$item){
  737. $lastOrder = \app\models\OrderDetail::find()->alias('od')
  738. ->leftJoin(['o' => \app\models\Order::tableName()], 'o.id = od.order_id')
  739. ->where(['od.goods_id' => $item['id'], 'o.is_pay' => 1])
  740. // ->andWhere(['>=', 'o.created_at', time() - 86400 * 7])
  741. ->andWhere(['>=', 'o.created_at', strtotime($this->params['beginTime'])])
  742. ->select('max(o.id) last_order_id, sum(od.num) gn, max(o.created_at) last_order_time')
  743. ->asArray()->one();
  744. $lastOrder['last_order_time'] = $lastOrder['last_order_time'] ? date('Y-m-d H:i:s', $lastOrder['last_order_time']) : '';
  745. $item['lastOrder'] = $lastOrder;
  746. }
  747. }
  748. if($this->params['statistics']){
  749. $queryOrder = \app\models\Order::find()->where($where)->andWhere(['is_pay' => 1]);
  750. $orderGoodsCount = \app\models\OrderDetail::find()->where(['order_id' => $queryOrder->select('id')])->sum('num');
  751. $orderCount = $queryOrder->count();
  752. $orderSum = $queryOrder->sum('pay_price');
  753. $allQueryOrder = \app\models\Order::find()->where(['store_id' => $store_id, 'is_delete' => 0])->andWhere(['is_pay' => 1]);
  754. $allOrderGoodsCount = \app\models\OrderDetail::find()->where(['order_id' => $allQueryOrder->select('id')])->sum('num');
  755. $allOrderCount = $allQueryOrder->count();
  756. $allOrderSum = $allQueryOrder->sum('pay_price');
  757. }
  758. return $this->asJson([
  759. 'code' => 0,
  760. 'params' => $this->params,
  761. '$where' => $where,
  762. 'data' => [
  763. 'orderGoodsCount' => $orderGoodsCount,
  764. 'orderCount' => $orderCount,
  765. 'orderSum' => (float)$orderSum,
  766. 'allOrderGoodsCount' => $allOrderGoodsCount,
  767. 'allOrderCount' => $allOrderCount,
  768. 'allOrderSum' => (float)$allOrderSum,
  769. 'list' => $salaGoods,
  770. ],
  771. ]);
  772. }
  773. //销量分析
  774. public function actionSales() {
  775. $store_id = get_store_id();
  776. $where = [
  777. 'and',
  778. ['store_id' => $store_id, 'is_delete' => 0],
  779. [
  780. 'and',
  781. ['>=', 'created_at', strtotime($this->params['beginTime'])],
  782. ['<=', 'created_at', strtotime($this->params['endTime'])],
  783. ]
  784. ];
  785. $whereDay0 = [
  786. 'and',
  787. ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00'))],
  788. ];
  789. $whereDay1 = [
  790. 'and',
  791. ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time() - 86400))],
  792. ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time()))],
  793. ];
  794. $whereDay2 = [
  795. 'and',
  796. ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time() - 86400 * 7))],
  797. ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', time() - 86400 * 6))],
  798. ];
  799. $whereWeek0 = [
  800. 'and',
  801. ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday')))],
  802. ];
  803. $whereWeek1 = [
  804. 'and',
  805. ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday') - 86400 * 7))],
  806. ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday')))],
  807. ];
  808. $whereWeek2 = [
  809. 'and',
  810. ['>=', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday') - 86400 * 7 * 4))],
  811. ['<', 'o.created_at', strtotime(date('Y-m-d 00:00:00', strtotime('last monday') - 86400 * 7 * 3))],
  812. ];
  813. $whereMonth0 = [
  814. 'and',
  815. ['>=', 'o.created_at', strtotime(date('Y-m-01 00:00:00'))],
  816. ];
  817. $whereMonth1 = [
  818. 'and',
  819. ['>=', 'o.created_at', strtotime(date('Y-m-01 00:00:00', strtotime('-1 month')))],
  820. ['<', 'o.created_at', strtotime(date('Y-m-01 00:00:00'))],
  821. ];
  822. $whereMonth2 = [
  823. 'and',
  824. ['>=', 'o.created_at', strtotime(date('Y-m-01 00:00:00', strtotime('-12 month')))],
  825. ['<', 'o.created_at', strtotime(date('Y-m-01 00:00:00', strtotime('-11 month')))],
  826. ];
  827. $q = ceil(date('n')/3);
  828. $whereQ0 = [
  829. 'and',
  830. ['>=', 'o.created_at', strtotime(date('Y-' . ($q * 3 - 2) . '-01 00:00:00'))],
  831. ];
  832. $whereQ1 = [
  833. 'and',
  834. ['>=', 'o.created_at', strtotime(date('Y-' . ((($q - 1) % 4) * 3 - 2) . '-01 00:00:00', strtotime('-3 month')))],
  835. ['<', 'o.created_at', strtotime(date('Y-' . ($q * 3 - 2) . '-01 00:00:00'))],
  836. ];
  837. $whereQ2 = [
  838. 'and',
  839. ['>=', 'o.created_at', strtotime(date('Y-' . ($q * 3 - 2) . '-01 00:00:00', strtotime('-12 month')))],
  840. ['<', 'o.created_at', strtotime(date('Y-' . ((($q + 1) % 4) * 3 - 2) . '-01 00:00:00', strtotime('-9 month')))],
  841. ];
  842. $whereYear0 = [
  843. 'and',
  844. ['>=', 'o.created_at', strtotime(date('Y-01-01 00:00:00'))],
  845. ];
  846. $whereYear1 = [
  847. 'and',
  848. ['>=', 'o.created_at', strtotime(date('Y-01-01 00:00:00', strtotime('-12 month')))],
  849. ['<=', 'o.created_at', strtotime(date('Y-01-01 00:00:00'))],
  850. ];
  851. if($this->params['statistics']){
  852. $orderQuery = \app\models\OrderDetail::find()->alias('od')->where(['is_delete' => 0])
  853. ->select(['od.order_id', 'COALESCE(SUM(`od`.`num`),0) AS `num`'])->groupBy('od.order_id');
  854. $query = \app\models\Order::find()->alias('o')->where(['o.is_delete' => 0, 'o.store_id' => $store_id])
  855. ->andWhere(['or', ['o.is_pay' => 1], ['o.pay_type' => 2]])
  856. ->rightJoin(['d' => $orderQuery], 'd.order_id = o.id');
  857. $select = "COUNT(DISTINCT `o`.`user_id`) AS `user_num`,
  858. COUNT(`o`.`id`) AS `order_num`,COALESCE(SUM(`o`.`pay_price`),0) AS `pay_price`,COALESCE(sum(`d`.`num`),0) as `goods_num`";
  859. $dataDay0 = (clone $query)->andWhere($whereDay0)->select($select)->asArray()->one();
  860. $dataDay1 = (clone $query)->andWhere($whereDay1)->select($select)->asArray()->one();
  861. $dataDay2 = (clone $query)->andWhere($whereDay2)->select($select)->asArray()->one();
  862. $dataWeek0 = (clone $query)->andWhere($whereWeek0)->select($select)->asArray()->one();
  863. $dataWeek1 = (clone $query)->andWhere($whereWeek1)->select($select)->asArray()->one();
  864. $dataWeek2 = (clone $query)->andWhere($whereWeek2)->select($select)->asArray()->one();
  865. $dataMonth0 = (clone $query)->andWhere($whereMonth0)->select($select)->asArray()->one();
  866. $dataMonth1 = (clone $query)->andWhere($whereMonth1)->select($select)->asArray()->one();
  867. $dataMonth2 = (clone $query)->andWhere($whereMonth2)->select($select)->asArray()->one();
  868. $dataQ0 = (clone $query)->andWhere($whereQ0)->select($select)->asArray()->one();
  869. $dataQ1 = (clone $query)->andWhere($whereQ1)->select($select)->asArray()->one();
  870. $dataQ2 = (clone $query)->andWhere($whereQ2)->select($select)->asArray()->one();
  871. $dataYear0 = (clone $query)->andWhere($whereYear0)->select($select)->asArray()->one();
  872. $dataYear1 = (clone $query)->andWhere($whereYear1)->select($select)->asArray()->one();
  873. $sales = [
  874. 'salesDayOrderPrice' => [
  875. 'data0' => $dataDay0['pay_price'],
  876. 'data1' => $this->DataChange($dataDay1['pay_price'], $dataDay0['pay_price']),
  877. 'data2' => $this->DataChange($dataDay2['pay_price'], $dataDay0['pay_price']),
  878. ],
  879. 'salesDayOrderNum' => [
  880. 'data0' => $dataDay0['order_num'],
  881. 'data1' => $this->DataChange($dataDay1['order_num'], $dataDay0['order_num']),
  882. 'data2' => $this->DataChange($dataDay2['order_num'], $dataDay0['order_num']),
  883. ],
  884. 'salesDayUserNum' => [
  885. 'data0' => $dataDay0['user_num'],
  886. 'data1' => $this->DataChange($dataDay1['user_num'], $dataDay0['user_num']),
  887. 'data2' => $this->DataChange($dataDay2['user_num'], $dataDay0['user_num']),
  888. ],
  889. 'salesMonthOrderPrice' => [
  890. 'data0' => $dataMonth0['pay_price'],
  891. 'data1' => $this->DataChange($dataMonth1['pay_price'], $dataMonth0['pay_price']),
  892. 'data2' => $this->DataChange($dataMonth2['pay_price'], $dataMonth0['pay_price']),
  893. ],
  894. 'salesMonthOrderNum' => [
  895. 'data0' => $dataMonth0['order_num'],
  896. 'data1' => $this->DataChange($dataMonth1['order_num'], $dataMonth0['order_num']),
  897. 'data2' => $this->DataChange($dataMonth2['order_num'], $dataMonth0['order_num']),
  898. ],
  899. 'salesMonthUserNum' => [
  900. 'data0' => $dataMonth0['user_num'],
  901. 'data1' => $this->DataChange($dataMonth1['user_num'], $dataMonth0['user_num']),
  902. 'data2' => $this->DataChange($dataMonth2['user_num'], $dataMonth0['user_num']),
  903. ],
  904. 'salesYearOrderPrice' => [
  905. 'data0' => $dataYear0['pay_price'],
  906. 'data1' => $this->DataChange($dataYear1['pay_price'], $dataYear0['pay_price']),
  907. ],
  908. 'salesYearOrderNum' => [
  909. 'data0' => $dataYear0['order_num'],
  910. 'data1' => $this->DataChange($dataYear1['order_num'], $dataYear0['order_num']),
  911. ],
  912. 'salesYearUserNum' => [
  913. 'data0' => $dataYear0['user_num'],
  914. 'data1' => $this->DataChange($dataYear1['user_num'], $dataYear0['user_num']),
  915. ],
  916. ];
  917. $dataWeekRe0 = (clone $query)->andWhere($whereWeek0)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  918. $dataWeekRe1 = (clone $query)->andWhere($whereWeek1)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  919. $dataWeekRe2 = (clone $query)->andWhere($whereWeek2)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  920. $dataMonthRe0 = (clone $query)->andWhere($whereMonth0)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  921. $dataMonthRe1 = (clone $query)->andWhere($whereMonth1)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  922. $dataMonthRe2 = (clone $query)->andWhere($whereMonth2)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  923. $dataQRe0 = (clone $query)->andWhere($whereQ0)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  924. $dataQRe1 = (clone $query)->andWhere($whereQ1)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  925. $dataQRe2 = (clone $query)->andWhere($whereQ2)->groupBy('o.user_id')->having('count(o.id) > 1')->asArray()->count();
  926. $sales = array_merge($sales, [
  927. 'avgOrderPriceDay' => [
  928. 'data0' => sprintf('%01.2f', $dataDay0['order_num'] > 0 ? ($dataDay0['pay_price'] / $dataDay0['order_num']) : 0),
  929. '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),
  930. '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),
  931. ],
  932. 'avgOrderPriceWeek' => [
  933. 'data0' => sprintf('%01.2f', $dataWeek0['order_num'] > 0 ? ($dataWeek0['pay_price'] / $dataWeek0['order_num']) : 0),
  934. '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),
  935. '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),
  936. ],
  937. 'avgOrderPriceMonth' => [
  938. 'data0' => sprintf('%01.2f', $dataMonth0['order_num'] > 0 ? ($dataMonth0['pay_price'] / $dataMonth0['order_num']) : 0),
  939. '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),
  940. '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),
  941. ],
  942. 'avgUserOrderNumDay' => [
  943. 'data0' => sprintf('%01.2f', $dataDay0['user_num'] > 0 ? ($dataDay0['order_num'] / $dataDay0['user_num']) : 0),
  944. '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),
  945. '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),
  946. ],
  947. 'avgUserOrderNumWeek' => [
  948. 'data0' => sprintf('%01.2f', $dataWeek0['user_num'] > 0 ? ($dataWeek0['order_num'] / $dataWeek0['user_num']) : 0),
  949. '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),
  950. '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),
  951. ],
  952. 'avgUserOrderNumMonth' => [
  953. 'data0' => sprintf('%01.2f', $dataMonth0['user_num'] > 0 ? ($dataMonth0['order_num'] / $dataMonth0['user_num']) : 0),
  954. '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),
  955. '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),
  956. ],
  957. 'fuGouWeek' => [
  958. 'data0' => sprintf('%01.2f', $dataWeek0['user_num'] > 0 ? ($dataWeekRe0 / $dataWeek0['user_num'] * 100) : 0),
  959. 'data1' => $this->DataChange($dataWeek1['user_num'] > 0 ? ($dataWeekRe1 / $dataWeek1['user_num']) : 0, $dataWeek0['user_num'] > 0 ? ($dataWeekRe0 / $dataWeek0['user_num']) : 0),
  960. 'data2' => $this->DataChange($dataWeek2['user_num'] > 0 ? ($dataWeekRe2 / $dataWeek2['user_num']) : 0, $dataWeek0['user_num'] > 0 ? ($dataWeekRe0 / $dataWeek0['user_num']) : 0),
  961. ],
  962. 'fuGouMonth' => [
  963. 'data0' => sprintf('%01.2f', $dataMonth0['user_num'] > 0 ? ($dataMonthRe0 / $dataMonth0['user_num'] * 100) : 0),
  964. 'data1' => $this->DataChange($dataMonth1['user_num'] > 0 ? ($dataMonthRe1 / $dataMonth1['user_num']) : 0, $dataMonth0['user_num'] > 0 ? ($dataMonthRe0 / $dataMonth0['user_num']) : 0),
  965. 'data2' => $this->DataChange($dataMonth2['user_num'] > 0 ? ($dataMonthRe2 / $dataMonth2['user_num']) : 0, $dataMonth0['user_num'] > 0 ? ($dataMonthRe0 / $dataMonth0['user_num']) : 0),
  966. ],
  967. 'fuGouQ' => [
  968. 'data0' => sprintf('%01.2f', $dataQ0['user_num'] > 0 ? ($dataQRe0 / $dataQ0['user_num'] * 100) : 0),
  969. 'data1' => $this->DataChange($dataQ1['user_num'] > 0 ? ($dataQRe1 / $dataQ1['user_num']) : 0, $dataQ0['user_num'] > 0 ? ($dataQRe0 / $dataQ0['user_num']) : 0),
  970. 'data2' => $this->DataChange($dataQ2['user_num'] > 0 ? ($dataQRe2 / $dataQ2['user_num']) : 0, $dataQ0['user_num'] > 0 ? ($dataQRe0 / $dataQ0['user_num']) : 0),
  971. ],
  972. ]);
  973. }
  974. return $this->asJson([
  975. 'code' => 0,
  976. 'params' => $this->params,
  977. '$where' => $where,
  978. '$whereQ0' => $whereQ0,
  979. '$whereQ1' => $whereQ1,
  980. '$whereQ2' => $whereQ2,
  981. 'data' => [
  982. // 'sql$dataDay0' => $query->andWhere($whereMonth1)->select($select)->createCommand()->getRawSql(),
  983. 'sales' => $sales,
  984. '$dataDay0' => $dataDay0,
  985. '$dataDay1' => $dataDay1,
  986. '$dataDay2' => $dataDay2,
  987. '$dataWeek0' => $dataWeek0,
  988. '$dataWeek1' => $dataWeek1,
  989. '$dataWeek2' => $dataWeek2,
  990. '$dataMonth0' => $dataMonth0,
  991. '$dataMonth1' => $dataMonth1,
  992. '$dataMonth2' => $dataMonth2,
  993. '$dataQ0' => $dataQ0,
  994. '$dataQ1' => $dataQ1,
  995. '$dataQ2' => $dataQ2,
  996. '$dataYear0' => $dataYear0,
  997. '$dataYear1' => $dataYear1,
  998. '$dataWeekRe0' => $dataWeekRe0,
  999. '$dataWeekRe1' => $dataWeekRe1,
  1000. '$dataWeekRe2' => $dataWeekRe2,
  1001. '$dataMonthRe0' => $dataMonthRe0,
  1002. '$dataMonthRe1' => $dataMonthRe1,
  1003. '$dataMonthRe2' => $dataMonthRe2,
  1004. 'dailysummarytrend' => $this->checkAnalysis(8, ['begin_date' => '20231010', 'end_date' => '20231010']),
  1005. ],
  1006. ]);
  1007. }
  1008. //销售分析
  1009. public function actionSalesAnalysis() {
  1010. $store_id = get_store_id();
  1011. $where = [
  1012. 'and',
  1013. ['store_id' => $store_id, 'is_delete' => 0],
  1014. [
  1015. 'and',
  1016. ['>=', 'created_at', strtotime($this->params['beginTime'])],
  1017. ['<=', 'created_at', strtotime($this->params['endTime'])],
  1018. ]
  1019. ];
  1020. if($this->params['statistics']){
  1021. $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]]);
  1022. $orderCount = (clone $queryOrder)->count();
  1023. $orderSum = (clone $queryOrder)->sum('total_price');
  1024. $orderPaySum = (clone $queryOrder)->sum('pay_price');
  1025. $orderGrossProfit = (clone $queryOrder)->sum('gross_profit');
  1026. $orderGrossProfitRate = sprintf('%01.2f', $orderSum > 0 ? ($orderGrossProfit / $orderSum * 100) : 0);
  1027. $orderRefundQuery = \app\models\OrderRefund::find()->where(['order_id' => (clone $queryOrder)->select('id'), 'status' => [1, 2]]);
  1028. $orderRefundMoneyQuery = \app\models\OrderRefundMoney::find()->where(['order_id' => (clone $queryOrder)->select('id'), 'status' => 1]);
  1029. $orderRefundCount = $orderRefundQuery->count();
  1030. $orderRefundSum = $orderRefundQuery->sum('refund_price') + $orderRefundMoneyQuery->sum('refund_price');
  1031. $queryReOrder = \app\models\ReOrder::find()->where($where)->andWhere(['is_pay' => 1]);
  1032. $reOrderCount = $queryReOrder->count();
  1033. $reOrderSum = $queryReOrder->sum('pay_price');
  1034. $orderMiniCount = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_MINI])->count();
  1035. $orderMiniSum = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_MINI])->sum('total_price');
  1036. $orderMiniPaySum = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_MINI])->sum('total_price');
  1037. $orderDeliveryCount = (clone $queryOrder)->andWhere(['is_delivery' => 1])->count();
  1038. $orderDeliverySum = (clone $queryOrder)->andWhere(['is_delivery' => 1])->sum('pay_price');
  1039. $orderOfflineCount = (clone $queryOrder)->andWhere(['is_offline' => 1])->count();
  1040. $orderOfflineSum = (clone $queryOrder)->andWhere(['is_offline' => 1])->sum('pay_price');
  1041. $orderCashierCount = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_CASHIER])->count();
  1042. $orderCashierSum = (clone $queryOrder)->andWhere(['order_origin' => \app\models\Order::ORDER_SOURCE_CASHIER])->sum('pay_price');
  1043. $scanOrder = \app\plugins\scanCodePay\models\Order::find()->where($where);
  1044. $orderFaceSum = $scanOrder->andWhere(['is_pay' => \app\plugins\scanCodePay\models\Order::IS_PAY_TRUE])->sum('total_price');
  1045. $orderFaceCount = $scanOrder->andWhere(['is_pay' => \app\plugins\scanCodePay\models\Order::IS_PAY_TRUE])->count();
  1046. }
  1047. return $this->asJson([
  1048. 'code' => 0,
  1049. 'params' => $this->params,
  1050. '$where' => $where,
  1051. 'data' => [
  1052. 'orderCount' => $orderCount,
  1053. 'orderSum' => (float)$orderSum,
  1054. 'orderPaySum' => (float)$orderPaySum,
  1055. 'orderGrossProfit' => (float)$orderGrossProfit,
  1056. 'orderGrossProfitRate' => $orderGrossProfitRate,
  1057. 'orderRefundCount' => $orderRefundCount,
  1058. 'orderRefundSum' => sprintf('%01.2f', $orderRefundSum),
  1059. 'reOrderCount' => $reOrderCount,
  1060. 'reOrderSum' => (float)$reOrderSum,
  1061. 'orderMiniCount' => $orderMiniCount,
  1062. 'orderMiniSum' => (float)$orderMiniSum,
  1063. 'orderMiniPaySum' => (float)$orderMiniPaySum,
  1064. 'orderDeliveryCount' => $orderDeliveryCount,
  1065. 'orderDeliverySum' => (float)$orderDeliverySum,
  1066. 'orderOfflineCount' => $orderOfflineCount,
  1067. 'orderOfflineSum' => (float)$orderOfflineSum,
  1068. 'orderCashierCount' => $orderCashierCount,
  1069. 'orderCashierSum' => (float)$orderCashierSum,
  1070. 'orderFaceSum' => (float)$orderFaceSum,
  1071. 'orderFaceCount' => (float)$orderFaceCount,
  1072. ],
  1073. ]);
  1074. }
  1075. //订单7日数据
  1076. public function actionOrderSeven() {
  1077. $days = input_params('days', 7);
  1078. $store_id = get_store_id();
  1079. $where = [
  1080. 'and',
  1081. ['is_delete' => 0],
  1082. [
  1083. 'and',
  1084. ['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-' . $days . ' days')))],
  1085. ]
  1086. ];
  1087. if($store_id > 0){
  1088. $where[] = ['store_id' => $store_id];
  1089. }
  1090. $queryOrder = \app\models\Order::find()->where($where)->andWhere(['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]]);
  1091. $queryOrder->select(['count(1) as c', 'SUBSTR(order_no,3,8) as d'])->groupBy('d');
  1092. $listAll = $queryOrder->asArray()->all();
  1093. $listConfirm = (clone $queryOrder)->andWhere(['trade_status' => \app\models\Order::ORDER_FLOW_CONFIRM])->asArray()->all();
  1094. $listSend = (clone $queryOrder)->andWhere(['trade_status' => \app\models\Order::ORDER_FLOW_SEND])->asArray()->all();
  1095. $listAll_column = array_column($listAll, 'c', 'd');
  1096. $listConfirm_column = array_column($listConfirm, 'c', 'd');
  1097. $listSend_column = array_column($listSend, 'c', 'd');
  1098. $list = [];
  1099. for($i = 0; $i <= $days; $i++){
  1100. $t = time() - $i * 86400;
  1101. $d = date('Ymd', $t);
  1102. $item = [
  1103. 'd' => date('Y-m-d', $t),
  1104. 'countAll' => $listAll_column[$d] ?? 0,
  1105. 'countConfirm' => $listConfirm_column[$d] ?? 0,
  1106. 'countSend' => $listSend_column[$d] ?? 0,
  1107. ];
  1108. $list[] = $item;
  1109. }
  1110. return $this->asJson([
  1111. 'code' => 0,
  1112. 'params' => $this->params,
  1113. '$where' => $where,
  1114. 'countAll' => (int)\app\models\Order::find()->andWhere(['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]])->count(),
  1115. 'data' => $list,
  1116. 'll' => [
  1117. $listAll_column,
  1118. $listConfirm_column,
  1119. $listSend_column,
  1120. ]
  1121. ]);
  1122. }
  1123. //会员7日数据
  1124. public function actionUserSeven() {
  1125. $store_id = get_store_id();
  1126. $days = input_params('days', 90);
  1127. $where = [
  1128. 'and',
  1129. ['is_delete' => 0],
  1130. [
  1131. 'and',
  1132. ['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-' . $days . ' days')))],
  1133. ]
  1134. ];
  1135. if($store_id > 0){
  1136. $where[] = ['store_id' => $store_id];
  1137. }
  1138. $queryOrder = \app\models\SaasUser::find()->where($where);
  1139. $queryOrder->select(['count(1) as c', 'FROM_UNIXTIME(created_at, "%Y-%m-%d") as d'])->groupBy('d');
  1140. $listAll = $queryOrder->asArray()->all();
  1141. $listAll_column = array_column($listAll, 'c', 'd');
  1142. $list = [];
  1143. for($i = 0; $i <= $days; $i++){
  1144. $t = time() - $i * 86400;
  1145. $d = date('Y-m-d', $t);
  1146. $item = [
  1147. 'd' => $d,
  1148. 'countAll' => $listAll_column[$d] ?? 0,
  1149. ];
  1150. $list[] = $item;
  1151. }
  1152. return $this->asJson([
  1153. 'code' => 0,
  1154. 'params' => $this->params,
  1155. '$where' => $where,
  1156. 'countAll' => (int)\app\models\SaasUser::find()->where(['is_delete' => 0])->count(),
  1157. 'data' => $list,
  1158. 'll' => [
  1159. $listAll_column,
  1160. ]
  1161. ]);
  1162. }
  1163. //店铺7日数据
  1164. public function actionStoreSeven() {
  1165. $days = input_params('days', 90);
  1166. $where = [
  1167. 'and',
  1168. ['is_delete' => 0],
  1169. [
  1170. 'and',
  1171. ['>=', 'created_at', strtotime(date('Y-m-d', strtotime('-' . $days . ' days')))],
  1172. ]
  1173. ];
  1174. $queryOrder = \app\models\Store::find()->where($where);
  1175. $queryOrder->select(['count(1) as c', 'FROM_UNIXTIME(created_at, "%Y-%m-%d") as d'])->groupBy('d');
  1176. $listAll = $queryOrder->asArray()->all();
  1177. $listAll_column = array_column($listAll, 'c', 'd');
  1178. $list = [];
  1179. for($i = 0; $i <= $days; $i++){
  1180. $t = time() - $i * 86400;
  1181. $d = date('Y-m-d', $t);
  1182. $item = [
  1183. 'd' => $d,
  1184. 'countAll' => $listAll_column[$d] ?? 0,
  1185. ];
  1186. $list[] = $item;
  1187. }
  1188. return $this->asJson([
  1189. 'code' => 0,
  1190. 'params' => $this->params,
  1191. '$where' => $where,
  1192. 'countAll' => (int)\app\models\Store::find()->where(['is_delete' => 0])->count(),
  1193. 'data' => $list,
  1194. 'll' => [
  1195. $listAll_column,
  1196. ]
  1197. ]);
  1198. }
  1199. //店铺销量数据
  1200. public function actionStoreSale() {
  1201. $storeList = \app\models\Store::find()->where(['is_delete' => 0])->select('id,name')->asArray()->all();
  1202. $conditonOrder = ['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]];
  1203. $orderSumList = \app\models\Order::find()->where($conditonOrder)->groupBy('store_id')->select('store_id, SUM(pay_price) s, COUNT(1) c')->asArray()->all();
  1204. $userList = \app\models\User::find()->where(['is_delete' => 0])->groupBy('store_id')->select('store_id, COUNT(1) c')->asArray()->all();
  1205. $orderSums = array_column($orderSumList, null, 'store_id');
  1206. $users = array_column($userList, 'c', 'store_id');
  1207. foreach($storeList as &$item){
  1208. $item['userCount'] = $users[$item['id']] ?? 0;
  1209. $item['sum'] = $orderSums[$item['id']]['s'] ?? 0;
  1210. $item['count'] = $orderSums[$item['id']]['c'] ?? 0;
  1211. }
  1212. $sort = array_column($storeList, 'sum');
  1213. array_multisort($sort, SORT_DESC, $storeList);
  1214. foreach($storeList as $i => &$item){
  1215. $item['sort'] = $i + 1;
  1216. }
  1217. return $this->asJson([
  1218. 'code' => 0,
  1219. 'countAll' => count($storeList),
  1220. 'data' => $storeList,
  1221. 'll' => [
  1222. $storeList,
  1223. $users,
  1224. $orderSums,
  1225. ]
  1226. ]);
  1227. }
  1228. //订单数据
  1229. public function actionOrderList() {
  1230. $order_no = input_params('order_no', '');
  1231. $conditonOrder = ['or', ['is_pay' => 1], ['and', ['!=', 'trade_status', 1], ['pay_type' => \app\models\Order::PAY_TYPE_COD]]];
  1232. $query = \app\models\Order::find()->where($conditonOrder)->orderBy('id DESC');
  1233. if($order_no){
  1234. $query->andWhere(['order_no' => $order_no]);
  1235. }
  1236. $data = pagination_make($query);
  1237. foreach($data['list'] as &$item){
  1238. $item['store_name'] = Option::get('name', $item['store_id'])['value'];
  1239. $user = \app\models\User::findOne($item['user_id']);
  1240. $saasUser = \app\models\SaasUser::findOne(['mobile' => $user['binding']]);
  1241. $item['saasUserName'] = $saasUser['name'];
  1242. $sharingReceiverSum = \app\models\SharingReceiver::find()->where(['order_no' => $item['order_no'], 'is_delete' => 0, 'is_pay' => [0, 1]])->sum('amount');
  1243. $item['sharingReceiverSum'] = $sharingReceiverSum ?? 0;
  1244. $item['store_income'] = sprintf('%0.2f', $item['pay_price'] - $item['sharingReceiverSum']);
  1245. }
  1246. return $this->asJson([
  1247. 'code' => 0,
  1248. 'data' => $data,
  1249. ]);
  1250. }
  1251. //提现列表
  1252. public function actionCashList() {
  1253. $store_id = get_store_id();
  1254. $where = ['c.store_id' => $store_id, 'c.is_delete' => 0];
  1255. $query = \app\models\Cash::find()->alias('c')->where($where);
  1256. $listType = (clone $query)->select(['cash_type'])->groupBy('cash_type')->asArray()->column();
  1257. $query->leftJoin(['u' => \app\models\User::tableName()], 'u.id = c.user_id');
  1258. $query->leftJoin(['su' => \app\models\SaasUser::tableName()], 'su.mobile = u.binding');
  1259. $query->andWhere(['c.status' => [\app\models\Cash::STATUS_GIVEN, \app\models\Cash::STATUS_HAND]]);
  1260. $query->select(['c.id', 'c.cash_type', 'c.status', 'c.pay_time', 'c.price', 'su.name', 'su.avatar']);
  1261. $list = $query->orderBy('c.id DESC')->limit(30)->asArray()->all();
  1262. return $this->asJson([
  1263. 'code' => 0,
  1264. 'params' => $this->params,
  1265. '$where' => $where,
  1266. 'data' => $list,
  1267. 'listType' => $listType,
  1268. ]);
  1269. }
  1270. public function DataChange($data0, $data1) {
  1271. if($data0 > 0){
  1272. if($data1 > 0){
  1273. return sprintf('%01.2f', ($data1 - $data0) / $data0 * 100);
  1274. }else{
  1275. return -100;
  1276. }
  1277. }else{
  1278. if($data1 > 0){
  1279. return 100;
  1280. }else{
  1281. return 0;
  1282. }
  1283. }
  1284. }
  1285. }