CenterLogic.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop100%开源免费商用商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | 商业版本务必购买商业授权,以免引起法律纠纷
  8. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  9. // | gitee下载:https://gitee.com/likeshop_gitee
  10. // | github下载:https://github.com/likeshop-github
  11. // | 访问官网:https://www.likeshop.cn
  12. // | 访问社区:https://home.likeshop.cn
  13. // | 访问手册:http://doc.likeshop.cn
  14. // | 微信公众号:likeshop技术社区
  15. // | likeshop团队 版权所有 拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshopTeam
  18. // +----------------------------------------------------------------------
  19. namespace app\adminapi\logic\data;
  20. use app\common\enum\AfterSaleEnum;
  21. use app\common\enum\YesNoEnum;
  22. use app\common\logic\BaseLogic;
  23. use app\common\model\AfterSale;
  24. use app\common\model\Goods;
  25. use app\common\model\GoodsVisit;
  26. use app\common\model\IndexVisit;
  27. use app\common\model\Order;
  28. use app\common\model\OrderGoods;
  29. use app\common\model\User;
  30. /**
  31. * 数据中心
  32. * Class CenterLogic
  33. * @package app\adminapi\logic
  34. */
  35. class CenterLogic extends BaseLogic
  36. {
  37. /**
  38. * @notes 流量分析
  39. * @return array
  40. * @author Tab
  41. * @date 2021/9/27 10:31
  42. */
  43. public static function trafficAnalysis($params)
  44. {
  45. if (!isset($params['month'])) {
  46. // 未传月份,默认获取当前月份数据
  47. $params['month'] = date('Y-m');
  48. }
  49. return [
  50. // 首页数据汇总
  51. 'summary' => self::taSummary($params),
  52. // 首页访问量
  53. 'visit' => self::taVisit($params),
  54. // 首页访客数
  55. 'user' => self::taUser($params),
  56. ];
  57. }
  58. /**
  59. * @notes 流量分板 - 首页数据汇总
  60. * @param $params
  61. * @return array
  62. * @author Tab
  63. * @date 2021/9/27 10:47
  64. */
  65. public static function taSummary($params)
  66. {
  67. // 访问量
  68. $visit = IndexVisit::whereMonth('create_time', $params['month'])->sum('visit');
  69. // 访客数(去重)
  70. $ips = IndexVisit::distinct(true)->whereMonth('create_time', $params['month'])->column('ip');
  71. return [
  72. 'visit' => intval($visit),
  73. 'visitor' => count($ips)
  74. ];
  75. }
  76. /**
  77. * @notes 流量分析 - 首页访问量图表数据
  78. * @param $params
  79. * @return array
  80. * @author Tab
  81. * @date 2021/9/27 11:04
  82. */
  83. public static function taVisit($params)
  84. {
  85. $field = [
  86. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  87. "sum(visit) as today_data"
  88. ];
  89. $lists = IndexVisit::field($field)
  90. ->whereMonth('create_time', $params['month'])
  91. ->group('date')
  92. ->select()
  93. ->toArray();
  94. $lists = array_column($lists, 'today_data', 'date');
  95. // 转时间戳
  96. $timestamp = strtotime($params['month']);
  97. // 转格式
  98. $month = date('Ym', $timestamp);
  99. // 获取指定月份共有几天
  100. $days = date('t', $timestamp);
  101. // 数据存储器
  102. $data = [];
  103. // 日期存储器
  104. $date = [];
  105. for($i = $days; $i >= 1; $i--) {
  106. $day = $month . day_format($i);
  107. $date[] = $day;
  108. $data[] = $lists[$day] ?? 0;
  109. }
  110. return [
  111. 'date' => $date,
  112. 'list' => [
  113. ['name' => '浏览量', 'data' => $data]
  114. ]
  115. ];
  116. }
  117. /**
  118. * @notes 流量分析 - 首页访客数图表数据
  119. * @param $params
  120. * @return array
  121. * @author Tab
  122. * @date 2021/9/27 11:09
  123. */
  124. public static function taUser($params)
  125. {
  126. $field = [
  127. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  128. "ip"
  129. ];
  130. // 去重
  131. $lists = IndexVisit::distinct(true)
  132. ->field($field)
  133. ->whereMonth('create_time', $params['month'])
  134. ->select()
  135. ->toArray();
  136. // 集合一天的IP
  137. $temp1 = [];
  138. foreach ($lists as $item) {
  139. $temp1[$item['date']][] = $item['ip'];
  140. }
  141. // 统计ip数量
  142. $temp2 = [];
  143. foreach ($temp1 as $k => $v) {
  144. $temp2[$k] = count($v);
  145. }
  146. // 转时间戳
  147. $timestamp = strtotime($params['month']);
  148. // 转格式
  149. $month = date('Ym', $timestamp);
  150. // 获取指定月份共有几天
  151. $days = date('t', $timestamp);
  152. // 数据存储器
  153. $data = [];
  154. // 日期存储器
  155. $date = [];
  156. for($i = $days; $i >= 1; $i--) {
  157. $day = $month . day_format($i);
  158. $date[] = $day;
  159. $data[] = $temp2[$day] ?? 0;
  160. }
  161. return [
  162. 'date' => $date,
  163. 'list' => [
  164. ['name' => '访客数', 'data' => $data]
  165. ]
  166. ];
  167. }
  168. /**
  169. * @notes 用户分析
  170. * @param $params
  171. * @return array
  172. * @author Tab
  173. * @date 2021/9/27 11:21
  174. */
  175. public static function userAnalysis($params)
  176. {
  177. if (!isset($params['month'])) {
  178. // 未传月份,默认获取当前月份数据
  179. $params['month'] = date('Y-m');
  180. }
  181. return [
  182. // 数据汇总
  183. 'summary' => self::uaSummary($params),
  184. // 用户总人数
  185. 'user' => self::uaUser($params),
  186. // 新增用户数
  187. 'new_user' => self::uaNewUser($params),
  188. ];
  189. }
  190. /**
  191. * @notes 用户分析 - 数据汇总
  192. * @param $params
  193. * @return array
  194. * @author Tab
  195. * @date 2021/9/27 11:27
  196. */
  197. public static function uaSummary($params)
  198. {
  199. // 用户总人数
  200. $user = User::count();
  201. // 新增用户数
  202. $newUser = User::whereMonth('create_time', $params['month'])->count();
  203. return [
  204. 'user' => $user,
  205. 'new_user' => $newUser
  206. ];
  207. }
  208. /**
  209. * @notes 用户分析 - 用户总数图表数据
  210. * @param $params
  211. * @return array
  212. * @author Tab
  213. * @date 2021/9/27 14:52
  214. */
  215. public static function uaUser($params)
  216. {
  217. // 转时间戳
  218. $timestamp = strtotime($params['month']);
  219. // 转格式
  220. $month = date('Ym', $timestamp);
  221. // 获取指定月份共有几天
  222. $days = date('t', $timestamp);
  223. // 数据存储器
  224. $data = [];
  225. // 日期存储器
  226. $date = [];
  227. for($i = $days; $i >= 1; $i--) {
  228. $day = $month . day_format($i);
  229. $dayTimestamp = strtotime($day. ' 23:59:59');
  230. $date[] = $day;
  231. $data[] = User::where('create_time', '<=', $dayTimestamp)->count();
  232. }
  233. return [
  234. 'date' => $date,
  235. 'list' => [
  236. ['name' => '用户总数', 'data' => $data]
  237. ]
  238. ];
  239. }
  240. /**
  241. * @notes 用户分析 - 新增用户图表数据
  242. * @param $params
  243. * @return array
  244. * @author Tab
  245. * @date 2021/9/27 14:55
  246. */
  247. public static function uaNewUser($params)
  248. {
  249. $field = [
  250. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  251. "count(id) as today_data"
  252. ];
  253. $lists = User::field($field)
  254. ->whereMonth('create_time', $params['month'])
  255. ->group('date')
  256. ->select()
  257. ->toArray();
  258. $lists = array_column($lists, 'today_data', 'date');
  259. // 转时间戳
  260. $timestamp = strtotime($params['month']);
  261. // 转格式
  262. $month = date('Ym', $timestamp);
  263. // 获取指定月份共有几天
  264. $days = date('t', $timestamp);
  265. // 数据存储器
  266. $data = [];
  267. // 日期存储器
  268. $date = [];
  269. for($i = $days; $i >= 1; $i--) {
  270. $day = $month . day_format($i);
  271. $date[] = $day;
  272. $data[] = $lists[$day] ?? 0;
  273. }
  274. return [
  275. 'date' => $date,
  276. 'list' => [
  277. ['name' => '新增用户', 'data' => $data]
  278. ]
  279. ];
  280. }
  281. /**
  282. * @notes 交易分析
  283. * @param $params
  284. * @return array
  285. * @author Tab
  286. * @date 2021/9/27 15:01
  287. */
  288. public static function transactionAnalysis($params)
  289. {
  290. if (!isset($params['month'])) {
  291. // 未传月份,默认获取当前月份数据
  292. $params['month'] = date('Y-m');
  293. }
  294. return [
  295. // 数据汇总
  296. 'summary' => self::tsaSummary($params),
  297. // 成交订单
  298. 'order' => self::tsaOrder($params),
  299. // 订单金额
  300. 'order_amount' => self::tsaOrderAmount($params),
  301. ];
  302. }
  303. /**
  304. * @notes 交易分析 - 数据汇总
  305. * @param $params
  306. * @return array
  307. * @author Tab
  308. * @date 2021/9/27 15:25
  309. */
  310. public static function tsaSummary($params)
  311. {
  312. // 成交订单
  313. $order = Order::whereMonth('create_time', $params['month'])->where('pay_status', YesNoEnum::YES)->count();
  314. // 订单金额
  315. $orderAmount = Order::whereMonth('create_time', $params['month'])->where('pay_status', YesNoEnum::YES)->sum('order_amount');
  316. return [
  317. 'order' => $order,
  318. 'order_amount' => $orderAmount
  319. ];
  320. }
  321. /**
  322. * @notes 交易分析 - 成交订单图表数据
  323. * @param $params
  324. * @return array
  325. * @author Tab
  326. * @date 2021/9/27 15:26
  327. */
  328. public static function tsaOrder($params)
  329. {
  330. $field = [
  331. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  332. "count(id) as today_data"
  333. ];
  334. $lists = Order::field($field)
  335. ->whereMonth('create_time', $params['month'])
  336. ->where('pay_status', YesNoEnum::YES)
  337. ->group('date')
  338. ->select()
  339. ->toArray();
  340. $lists = array_column($lists, 'today_data', 'date');
  341. // 转时间戳
  342. $timestamp = strtotime($params['month']);
  343. // 转格式
  344. $month = date('Ym', $timestamp);
  345. // 获取指定月份共有几天
  346. $days = date('t', $timestamp);
  347. // 数据存储器
  348. $data = [];
  349. // 日期存储器
  350. $date = [];
  351. for($i = $days; $i >= 1; $i--) {
  352. $day = $month . day_format($i);
  353. $date[] = $day;
  354. $data[] = $lists[$day] ?? 0;
  355. }
  356. return [
  357. 'date' => $date,
  358. 'list' => [
  359. ['name' => '成交订单', 'data' => $data]
  360. ]
  361. ];
  362. }
  363. /**
  364. * @notes 交易分析 - 订单金额图表数据
  365. * @param $params
  366. * @return array
  367. * @author Tab
  368. * @date 2021/9/27 15:29
  369. */
  370. public static function tsaOrderAmount($params)
  371. {
  372. $field = [
  373. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  374. "sum(order_amount) as today_data"
  375. ];
  376. $lists = Order::field($field)
  377. ->whereMonth('create_time', $params['month'])
  378. ->where('pay_status', YesNoEnum::YES)
  379. ->group('date')
  380. ->select()
  381. ->toArray();
  382. $lists = array_column($lists, 'today_data', 'date');
  383. // 转时间戳
  384. $timestamp = strtotime($params['month']);
  385. // 转格式
  386. $month = date('Ym', $timestamp);
  387. // 获取指定月份共有几天
  388. $days = date('t', $timestamp);
  389. // 数据存储器
  390. $data = [];
  391. // 日期存储器
  392. $date = [];
  393. for($i = $days; $i >= 1; $i--) {
  394. $day = $month . day_format($i);
  395. $date[] = $day;
  396. $data[] = $lists[$day] ?? 0;
  397. }
  398. return [
  399. 'date' => $date,
  400. 'list' => [
  401. ['name' => '订单金额', 'data' => $data]
  402. ]
  403. ];
  404. }
  405. /**
  406. * @notes 商品分析
  407. * @param $params
  408. * @return array
  409. * @author Tab
  410. * @date 2021/9/27 15:34
  411. */
  412. public static function goodsAnalysis($params)
  413. {
  414. if (!isset($params['month'])) {
  415. // 未传月份,默认获取当前月份数据
  416. $params['month'] = date('Y-m');
  417. }
  418. return [
  419. // 数据汇总
  420. 'summary' => self::gaSummary($params),
  421. // 浏览量
  422. 'visit' => self::gaVisit($params),
  423. // 销售量
  424. 'num' => self::gaNum($params),
  425. ];
  426. }
  427. /**
  428. * @notes 商品分析 - 数据汇总
  429. * @param $params
  430. * @return array
  431. * @author Tab
  432. * @date 2021/9/27 15:36
  433. */
  434. public static function gaSummary($params)
  435. {
  436. // 浏览量
  437. $visit = GoodsVisit::whereMonth('create_time', $params['month'])->sum('visit');
  438. // 销售量
  439. $num = Order::whereMonth('create_time', $params['month'])->where('pay_status', YesNoEnum::YES)->sum('total_num');
  440. return [
  441. 'visit' => $visit,
  442. 'num' => $num
  443. ];
  444. }
  445. /**
  446. * @notes 商品分析 - 浏览量图表数据
  447. * @param $params
  448. * @return array
  449. * @author Tab
  450. * @date 2021/9/27 15:41
  451. */
  452. public static function gaVisit($params)
  453. {
  454. $field = [
  455. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  456. "sum(visit) as today_data"
  457. ];
  458. $lists = GoodsVisit::field($field)
  459. ->whereMonth('create_time', $params['month'])
  460. ->group('date')
  461. ->select()
  462. ->toArray();
  463. $lists = array_column($lists, 'today_data', 'date');
  464. // 转时间戳
  465. $timestamp = strtotime($params['month']);
  466. // 转格式
  467. $month = date('Ym', $timestamp);
  468. // 获取指定月份共有几天
  469. $days = date('t', $timestamp);
  470. // 数据存储器
  471. $data = [];
  472. // 日期存储器
  473. $date = [];
  474. for($i = $days; $i >= 1; $i--) {
  475. $day = $month . day_format($i);
  476. $date[] = $day;
  477. $data[] = $lists[$day] ?? 0;
  478. }
  479. return [
  480. 'date' => $date,
  481. 'list' => [
  482. ['name' => '浏览量', 'data' => $data]
  483. ]
  484. ];
  485. }
  486. /**
  487. * @notes 商品分析 - 销量图表数据
  488. * @param $params
  489. * @return array
  490. * @author Tab
  491. * @date 2021/9/27 15:43
  492. */
  493. public static function gaNum($params)
  494. {
  495. $field = [
  496. "FROM_UNIXTIME(create_time,'%Y%m%d') as date",
  497. "sum(total_num) as today_data"
  498. ];
  499. $lists = Order::field($field)
  500. ->whereMonth('create_time', $params['month'])
  501. ->where('pay_status', YesNoEnum::YES)
  502. ->group('date')
  503. ->select()
  504. ->toArray();
  505. $lists = array_column($lists, 'today_data', 'date');
  506. // 转时间戳
  507. $timestamp = strtotime($params['month']);
  508. // 转格式
  509. $month = date('Ym', $timestamp);
  510. // 获取指定月份共有几天
  511. $days = date('t', $timestamp);
  512. // 数据存储器
  513. $data = [];
  514. // 日期存储器
  515. $date = [];
  516. for($i = $days; $i >= 1; $i--) {
  517. $day = $month . day_format($i);
  518. $date[] = $day;
  519. $data[] = $lists[$day] ?? 0;
  520. }
  521. return [
  522. 'date' => $date,
  523. 'list' => [
  524. ['name' => '销量', 'data' => $data]
  525. ]
  526. ];
  527. }
  528. /**
  529. * @notes 商品排行榜
  530. * @param $params
  531. * @return array
  532. * @throws \think\db\exception\DataNotFoundException
  533. * @throws \think\db\exception\DbException
  534. * @throws \think\db\exception\ModelNotFoundException
  535. * @author Tab
  536. * @date 2021/9/27 16:37
  537. */
  538. public static function goodsTop($params)
  539. {
  540. // 排序字段
  541. if (!isset($params['sort_field']) || empty($params['sort_field'])) {
  542. $params['sort_field'] = 'visit';
  543. }
  544. $lists = Goods::field('id,image,name')
  545. ->select()
  546. ->toArray();
  547. foreach($lists as &$item) {
  548. $item['visit'] = self::goodsVisit($item);
  549. $item['num'] = self::goodsNum($item);
  550. $item['amount'] = self::goodsAmount($item);
  551. }
  552. $idSort = array_column($lists, 'id');
  553. $visitSort = array_column($lists, 'visit');
  554. $numSort = array_column($lists, 'num');
  555. $amountSort = array_column($lists, 'amount');
  556. // 排序
  557. switch ($params['sort_field'])
  558. {
  559. // 浏览量排序
  560. case 'visit':
  561. array_multisort($visitSort, SORT_DESC, SORT_NUMERIC, $lists);
  562. break;
  563. // 销量排序
  564. case 'num':
  565. array_multisort($numSort, SORT_DESC, SORT_NUMERIC, $lists);
  566. break;
  567. // 销售额排序
  568. case 'amount':
  569. array_multisort($amountSort, SORT_DESC, SORT_NUMERIC, $lists);
  570. break;
  571. // id排序
  572. default:
  573. array_multisort($idSort, SORT_DESC, SORT_NUMERIC, $lists);
  574. break;
  575. }
  576. return $lists;
  577. }
  578. /**
  579. * @notes 商品浏览量
  580. * @param $item
  581. * @return float
  582. * @author Tab
  583. * @date 2021/9/27 16:14
  584. */
  585. public static function goodsVisit($item)
  586. {
  587. $visit = GoodsVisit::where('goods_id', $item['id'])->sum('visit');
  588. return intval($visit);
  589. }
  590. /**
  591. * @notes 商品销量
  592. * @param $item
  593. * @return mixed
  594. * @author Tab
  595. * @date 2021/9/27 16:18
  596. */
  597. public static function goodsNum($item)
  598. {
  599. $num = OrderGoods::alias('og')
  600. ->leftJoin('order o', 'o.id = og.order_id')
  601. ->where([
  602. ['og.goods_id', '=', $item['id']],
  603. ['o.pay_status', '=', YesNoEnum::YES],
  604. ])
  605. ->sum('og.goods_num');
  606. return intval($num);
  607. }
  608. /**
  609. * @notes 商品销量额
  610. * @param $item
  611. * @return mixed
  612. * @author Tab
  613. * @date 2021/9/27 16:19
  614. */
  615. public static function goodsAmount($item)
  616. {
  617. $amount = OrderGoods::alias('og')
  618. ->leftJoin('order o', 'o.id = og.order_id')
  619. ->where([
  620. ['og.goods_id', '=', $item['id']],
  621. ['o.pay_status', '=', YesNoEnum::YES],
  622. ])
  623. ->sum('og.total_pay_price');
  624. return $amount;
  625. }
  626. }