소스 검색

Add 订单流水分析

兔姬桑 4 년 전
부모
커밋
cb083e8780

+ 55 - 0
app/Http/Controllers/Admin/ReportController.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\Order;
+
+class ReportController extends Controller
+{
+    public function accounting()
+    {
+        $orders = Order::where('status', '>=', 2)->whereHas('goods')->latest()->get(['created_at', 'amount']);
+        $ordersByDay = $orders->groupBy(function ($item) {
+            return $item->created_at->format('Y-m-d');
+        })->map(function ($row) {
+            return $row->sum('amount');
+        })->toArray();
+
+        $ordersByMonth = $orders->groupBy(function ($item) {
+            return $item->created_at->format('Y-m');
+        })->map(function ($row) {
+            return $row->sum('amount');
+        })->toArray();
+
+        $ordersByYear = $orders->groupBy(function ($item) {
+            return $item->created_at->format('Y');
+        })->map(function ($row) {
+            return $row->sum('amount');
+        })->sort()->toArray();
+
+        $currentDays = date('j');
+        $lastDays = date('t', strtotime('-1 months'));
+        $data['days'] = range(1, $currentDays > $lastDays ? $currentDays : $lastDays);
+        $data['years'] = range(1, 12);
+
+        for ($i = 1; $i <= $currentDays; $i++) {
+            $data['currentMonth'][] = $ordersByDay[date(sprintf('Y-m-%02u', $i))] ?? 0;
+        }
+        for ($i = 1; $i <= $lastDays; $i++) {
+            $data['lastMonth'][] = $ordersByDay[date(sprintf('Y-m-%02u', $i), strtotime('-1 months'))] ?? 0;
+        }
+        for ($i = 1; $i <= date('m'); $i++) {
+            $data['currentYear'][] = $ordersByMonth[date(sprintf('Y-%02u', $i))] ?? 0;
+        }
+
+        for ($i = 1; $i <= 12; $i++) {
+            $data['lastYear'][] = $ordersByMonth[date(sprintf('Y-%02u', $i), strtotime('-1 years'))] ?? 0;
+        }
+
+        ksort($ordersByYear);
+        $data['ordersByYear'] = $ordersByYear;
+
+        return view('admin.report.accounting', compact('data'));
+    }
+}

+ 1 - 1
composer.json

@@ -8,7 +8,7 @@
   ],
   "license": "GPL-3.0-or-later",
   "require": {
-    "php": "^7.2.5|^8.0",
+    "php": "^7.2.5",
     "ext-json": "*",
     "ext-mbstring": "*",
     "ext-openssl": "*",

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 168 - 155
composer.lock


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/assets/global/vendor/chartist/chartist.min.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 7 - 0
public/assets/global/vendor/chartist/chartist.min.js


+ 18 - 1
resources/views/admin/layouts.blade.php

@@ -197,7 +197,7 @@
                 @canany(['admin.node.index', 'admin.node.auth.index', 'admin.node.cert.index'])
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.node.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
-                            <i class="site-menu-icon wb-grid-4" aria-hidden="true"></i>
+                            <i class="site-menu-icon wb-cloud" aria-hidden="true"></i>
                             <span class="site-menu-title">线路系统</span>
                         </a>
                         <ul class="site-menu-sub">
@@ -333,6 +333,23 @@
                         </ul>
                     </li>
                 @endcanany
+                @canany(['admin.report.accounting'])
+                    <li class="site-menu-item has-sub {{request()->routeIs('admin.report.*') ? 'active open' : ''}}">
+                        <a href="javascript:void(0)">
+                            <i class="site-menu-icon wb-stats-bars" aria-hidden="true"></i>
+                            <span class="site-menu-title">分析报告</span>
+                        </a>
+                        <ul class="site-menu-sub">
+                            @can('admin.report.accounting')
+                                <li class="site-menu-item {{request()->routeIs('admin.report.accounting') ? 'active open' : ''}}">
+                                    <a href="{{route('admin.report.accounting')}}">
+                                        <span class="site-menu-title">流水账簿</span>
+                                    </a>
+                                </li>
+                            @endcan
+                        </ul>
+                    </li>
+                @endcanany
                 @canany(['admin.log.traffic', 'admin.log.flow', 'admin.log.ban', 'admin.log.ip', 'admin.log.online', 'admin.log.notify', 'admin.payment.callback'])
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.log.traffic', 'admin.log.flow', 'admin.log.ban', 'admin.log.ip', 'admin.log.online', 'admin.log.notify', 'admin.payment.callback') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">

+ 140 - 0
resources/views/admin/report/accounting.blade.php

@@ -0,0 +1,140 @@
+@extends('admin.layouts')
+@section('css')
+    <link rel="stylesheet" href="/assets/global/vendor/chartist/chartist.min.css">
+    <style>
+        #widgetLinearea .ct-label.ct-vertical, #widgetLinearea .ct-label.ct-horizontal {
+            font-size: 14px;
+        }
+
+        #widgetLinearea .ct-area {
+            fill-opacity: 1;
+        }
+
+        #widgetLinearea .ct-series.ct-series-a .ct-area {
+            fill: #b8d7ff;
+        }
+
+        #widgetLinearea .ct-series.ct-series-b .ct-area {
+            fill: #92f0e6;
+        }
+
+        #widgetLinearea ul .icon {
+            vertical-align: text-bottom;
+        }
+
+    </style>
+@endsection
+@section('content')
+    <div class="page-content container" id="widgetLinearea">
+        <div class="card card-shadow">
+            <div class="card-block p-30">
+                <div class="row pb-20">
+                    <div class="col-md-8 col-sm-6">
+                        <div class="blue-grey-700 font-size-26 font-weight-500">月流水账簿</div>
+                    </div>
+                </div>
+                <div class="days mb-30" style="height:270px;"></div>
+                <ul class="list-inline text-center mb-0">
+                    <li class="list-inline-item">
+                        <i class="icon wb-large-point blue-200 mr-10" aria-hidden="true"></i> 本月
+                    </li>
+                    <li class="list-inline-item ml-35">
+                        <i class="icon wb-large-point teal-200 mr-10" aria-hidden="true"></i> 上月
+                    </li>
+                </ul>
+            </div>
+        </div>
+        <div class="card card-shadow">
+            <div class="card-block p-30">
+                <div class="row pb-20">
+                    <div class="col-md-8 col-sm-6">
+                        <div class="blue-grey-700 font-size-26 font-weight-500">年流水账簿</div>
+                    </div>
+                </div>
+                <div class="month mb-30" style="height:270px;"></div>
+                <ul class="list-inline text-center mb-0">
+                    <li class="list-inline-item">
+                        <i class="icon wb-large-point blue-200 mr-10" aria-hidden="true"></i> 今年
+                    </li>
+                    <li class="list-inline-item ml-35">
+                        <i class="icon wb-large-point teal-200 mr-10" aria-hidden="true"></i> 去年
+                    </li>
+                </ul>
+            </div>
+        </div>
+        <div class="card card-shadow">
+            <div class="card-block p-30">
+                <div class="row pb-20">
+                    <div class="col-md-8 col-sm-6">
+                        <div class="blue-grey-700 font-size-26 font-weight-500">历史流水账簿</div>
+                    </div>
+                </div>
+                <div class="year mb-30" style="height:270px;"></div>
+            </div>
+        </div>
+    </div>
+@endsection
+@section('javascript')
+    <script src="/assets/global/vendor/chartist/chartist.min.js"></script>
+    <script type="text/javascript">
+        new Chartist.Line('#widgetLinearea .days', {
+            labels: @json($data['days']),
+            series: [@json($data['currentMonth']), @json($data['lastMonth'])],
+        }, {
+            low: 0,
+            showArea: true,
+            showPoint: false,
+            showLine: false,
+            fullWidth: true,
+            chartPadding: {top: 0, right: 10, bottom: 0, left: 20},
+            axisX: {
+                showGrid: false,
+                labelOffset: {x: -14, y: 0},
+            },
+            axisY: {
+                labelOffset: {x: -10, y: 0},
+                labelInterpolationFnc: function labelInterpolationFnc(num) {return num % 1 === 0 ? num : false;},
+            },
+        });
+
+        new Chartist.Line('#widgetLinearea .month', {
+            labels: @json($data['years']),
+            series: [@json($data['currentYear']), @json($data['lastYear'])],
+        }, {
+            low: 0,
+            showArea: true,
+            showPoint: false,
+            showLine: false,
+            fullWidth: true,
+            chartPadding: {top: 0, right: 10, bottom: 0, left: 20},
+            axisX: {
+                showGrid: false,
+                labelOffset: {x: -14, y: 0},
+            },
+            axisY: {
+                labelOffset: {x: -10, y: 0},
+                labelInterpolationFnc: function labelInterpolationFnc(num) {return num % 1 === 0 ? num : false;},
+            },
+        });
+
+        new Chartist.Line('#widgetLinearea .year', {
+            labels: @json(array_keys($data['ordersByYear'])),
+            series: [@json(array_values($data['ordersByYear']))],
+        }, {
+            low: 0,
+            showArea: true,
+            showPoint: false,
+            showLine: false,
+            fullWidth: true,
+            chartPadding: {top: 0, right: 20, bottom: 0, left: 20},
+            axisX: {
+                showGrid: false,
+                labelOffset: {x: -14, y: 0},
+            },
+            axisY: {
+                labelOffset: {x: -10, y: 0},
+                labelInterpolationFnc: function labelInterpolationFnc(num) {return num % 1 === 0 ? num : false;},
+            },
+        });
+    </script>
+@endsection

+ 3 - 0
routes/admin.php

@@ -68,6 +68,9 @@ Route::prefix('admin')->name('admin.')->group(function () {
         });
 
         Route::get('order', 'LogsController@orderList')->name('order'); // 订单列表
+        Route::prefix('report')->name('report.')->group(function () {
+            Route::get('accounting', 'ReportController@accounting')->name('accounting'); // 流水账簿
+        });
         Route::prefix('log')->name('log.')->group(function () {
             Route::get('traffic', 'LogsController@trafficLog')->name('traffic'); // 流量日志
             Route::get('userCredit', 'LogsController@userCreditLogList')->name('credit'); // 余额变动记录

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.