diff --git a/application/admin/controller/Orderplan.php b/application/admin/controller/Orderplan.php index ea9c1ea..eb1f378 100644 --- a/application/admin/controller/Orderplan.php +++ b/application/admin/controller/Orderplan.php @@ -9,6 +9,7 @@ use app\admin\model\AuthGroupAccess; use app\admin\model\order\Invoice; use app\admin\model\OrderAbnormal; use app\admin\model\OrderDispatch; +use app\admin\model\orders\Dispatchlog; use app\admin\model\Worker; use app\admin\model\WorkerItem; use app\common\controller\Backend; @@ -65,6 +66,7 @@ class Orderplan extends Backend $order_count = $this->getOrderCount(); $order_rank = $this->orderRank(); $item_rank = $this->itemRank(); + $order_doing = $this->orderDoing(); $this->success(data: [ 'top' => $top, 'lines' => $lines, @@ -73,6 +75,7 @@ class Orderplan extends Backend 'order_count' => $order_count, 'order_rank' => $order_rank, 'item_rank' => $item_rank, + 'order_doing' => $order_doing, ]); } @@ -92,10 +95,10 @@ class Orderplan extends Backend $worker = Worker::where('status', 1)->count(); if ($res) { return [ - 'total' => $res->total, - 'count' => $res->count, - 'performance' => $res->performance, - 'worker' => $worker, + 'total' => $res->total ?? 0, + 'count' => $res->count ?? 0, + 'performance' => $res->performance ?? 0, + 'worker' => $worker ?? 0, ]; } @@ -110,8 +113,21 @@ class Orderplan extends Backend private function getLine() { $build = new \app\admin\model\Order(); + $start = now()->modify('-14 days')->format('Y-m-d'); - $end_at = now()->format('Y-m-d'); + $end_at = now()->format('Y-m-d 23:29:59'); + $filter ['daterange'] = request()->get('daterange'); + if (!empty($filter['daterange'])) { + $arr = explode(' - ', $filter['daterange']); + if (trim($arr[0])) { + $start = trim($arr[0]); + } + if (trim($arr[1])) { + $end_at = trim($arr[1]) . ' 23:29:59'; + } + } + + $this->buildDate($build); $build->field([ 'DATE(create_time) day', 'sum(total) total', @@ -202,8 +218,18 @@ class Orderplan extends Backend private function buildDate($build, $table_name = null) { $start = now()->modify('-14 days')->format('Y-m-d'); - $end_at = now()->format('Y-m-d'); - + $end_at = now()->format('Y-m-d 23:29:59'); + $filter ['daterange'] = request()->get('daterange'); + if (!empty($filter['daterange'])) { + $arr = explode(' - ', $filter['daterange']); + if (trim($arr[0])) { + $start = trim($arr[0]); + } + if (trim($arr[1])) { + $end_at = trim($arr[1]) . ' 23:29:59'; + } + } +// dd([$start, $end_at]); if ($table_name) { $build->where($table_name . '.create_time', 'between', [$start, $end_at]); } else { @@ -401,7 +427,6 @@ class Orderplan extends Backend $end_at = now()->format('Y-m-d 23:59:59'); - $build = new \app\admin\model\Order(); $build->whereBetween('create_time', [$start, $end_at]); @@ -426,7 +451,7 @@ class Orderplan extends Backend $rank [] = [ 'name' => $da->item->title ?? '', 'count' => $da->count ?? 0, - 'rate' => $this->mydiv($da->count ?? 0,$total) + 'rate' => $this->mydiv($da->count ?? 0, $total) ]; } @@ -437,14 +462,14 @@ class Orderplan extends Backend 'count(id) count', ]) ->group('name') - ->order('count','desc') + ->order('count', 'desc') ->limit(6) ->select(); $area = []; foreach ($res as $re) { $re = $re->getData(); $re['name'] = $this->getProvinceByCode($re['name']); - $re['rate'] = $this->mydiv($da->count ?? 0,$total); + $re['rate'] = $this->mydiv($da->count ?? 0, $total); $area [] = $re; } @@ -454,6 +479,35 @@ class Orderplan extends Backend ]; } + private function orderDoing() + { + + $build = new \app\admin\model\Order(); + + $dispatch = $build->where('status',10)->count('id'); + + $build = new OrderDispatch(); + + $build->whereIn('status',[ + OrderDispatch::STATUS_TOGET, + OrderDispatch::STATUS_PLANIT, + OrderDispatch::STATUS_CLOCK, + ]); + $data = $build->field([ + 'count(if(status=0,1,null)) toget', + 'count(if(status=20,1,null)) plan', + 'count(if(status=30,1,null)) doing', + ])->select(); + + + return [ + 'dispatch' => $dispatch, + 'toget' => $data[0]->toget ?? 0, + 'plan' => $data[0]->plan ?? 0, + 'doing' => $data[0]->doing ?? 0, + ]; + + } private function prepareEchartsBarData(array $data, string $startDate, string $endDate): array @@ -487,7 +541,7 @@ class Orderplan extends Backend $rate[] = $total ? number_format($performance / $total * 100, 2) : '0'; } - return [ + $data = [ 'xAxis' => $xAxis, 'series' => [ 'total' => $series_total, @@ -496,6 +550,56 @@ class Orderplan extends Backend 'rate' => $rate, ], ]; + + + // 判断是否需要按月归档 + if (count($data['xAxis']) > 31) { + $monthly = []; + + foreach ($data['xAxis'] as $i => $date) { + $month = date('Y-m', strtotime($date)); + + if (!isset($monthly[$month])) { + $monthly[$month] = [ + 'total' => 0, + 'count' => 0, + 'performance' => 0, + 'rate_sum' => 0, + 'rate_count' => 0, + ]; + } + + $monthly[$month]['total'] += $data['series']['total'][$i]; + $monthly[$month]['count'] += $data['series']['count'][$i]; + $monthly[$month]['performance'] += $data['series']['performance'][$i]; + + // 处理 rate(字符串,转换为 float) + $rate = (float)$data['series']['rate'][$i]; + $monthly[$month]['rate_sum'] += $rate; + $monthly[$month]['rate_count'] += 1; + } + + // 重新生成 xAxis 和 series + $data['xAxis'] = array_keys($monthly); + $data['series'] = [ + 'total' => [], + 'count' => [], + 'performance' => [], + 'rate' => [] + ]; + + foreach ($monthly as $month => $values) { + $data['series']['total'][] = $values['total']; + $data['series']['count'][] = $values['count']; + $data['series']['performance'][] = $values['performance']; + + // 平均 rate,保留 2 位小数 + $averageRate = $values['rate_count'] > 0 ? $values['rate_sum'] / $values['rate_count'] : 0; + $data['series']['rate'][] = number_format($averageRate, 2); + } + } + + return $data; } @@ -544,11 +648,12 @@ class Orderplan extends Backend } - private function mydiv($a , $b){ + private function mydiv($a, $b) + { if ($b == 0) { return '0'; - }else{ - return (int)($a / $b * 100); + } else { + return (int)($a / $b * 100); } } diff --git a/application/admin/view/orderplan/index.html b/application/admin/view/orderplan/index.html index 372ff91..b08271f 100644 --- a/application/admin/view/orderplan/index.html +++ b/application/admin/view/orderplan/index.html @@ -31,6 +31,18 @@
+ +
+ + +
+ +
+ + + +
+
@@ -86,26 +98,6 @@
-
-
-
-
-
- 进行中的订单 -
-
-
- 1240 / 231 / 23123 / 222 -
-
- 待派单 / 待接单 / 待上门 / 服务中 -
-
-
-
- - -
@@ -255,7 +247,23 @@
- +
+
+
+
+
+ 进行中的订单 +
+
+
+ 0 / 0 / 0 / 0 +
+
+ 待派单 / 待接单 / 待上门 / 服务中 +
+
+
+
订单数据
@@ -264,7 +272,7 @@
-

¥8848

+

loading

今日收款

@@ -274,7 +282,7 @@
-

¥8848

+

loading

本月收款

@@ -294,7 +302,7 @@
-

8848

+

loading

本月订单数

@@ -314,7 +322,7 @@
-

8848

+

loading

本月新增师傅数

@@ -324,7 +332,7 @@
-

8

+

loading

今日退款数

@@ -334,7 +342,7 @@
-

88

+

loading

本月退款数

@@ -344,7 +352,7 @@
-

88

+

loading

今日取消订单数

@@ -354,7 +362,7 @@
-

88

+

loading

本月取消订单数

diff --git a/public/assets/js/backend/orderplan.js b/public/assets/js/backend/orderplan.js index 88966e3..a153b6f 100644 --- a/public/assets/js/backend/orderplan.js +++ b/public/assets/js/backend/orderplan.js @@ -2,22 +2,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th var Controller = { dashboard: function () { - Fast.api.ajax({ - url: 'orderplan/data', - method:'get' - }, function (data, ret) { - Controller.echarts.top(data.top); - Controller.echarts.order(data.order); - Controller.echarts.ordercount(data.order_count); - Controller.echarts.orderrank(data.order_rank); - Controller.echarts.orderItemRank(data.item_rank); - Controller.echarts.money_line(data.lines); - Controller.echarts.cancel_order_pie(data.pie.cancel); - Controller.echarts.item_pie(data.pie.item); - Controller.echarts.area_pie(data.pie.area); - Controller.echarts.source_pie(data.pie.source); - - }); + Controller.api.getData(); + Controller.datetime(); }, add: function () { Controller.api.bindevent(); @@ -28,8 +14,86 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th api: { bindevent: function () { Form.api.bindevent($("form[role=form]")); + }, + + getData:function (){ + // 获取日期范围值 + var daterange = $('#daterange').val(); + + // 构建查询参数 + var params = { + 'daterange': daterange + }; + console.log(params); + + Fast.api.ajax({ + url: 'orderplan/data', + data: params, + method:'get' + }, function (data, ret) { + Controller.echarts.top(data.top); + Controller.echarts.order(data.order); + Controller.echarts.orderdoing(data.order_doing); + Controller.echarts.ordercount(data.order_count); + Controller.echarts.orderrank(data.order_rank); + Controller.echarts.orderItemRank(data.item_rank); + Controller.echarts.money_line(data.lines); + Controller.echarts.cancel_order_pie(data.pie.cancel); + Controller.echarts.item_pie(data.pie.item); + Controller.echarts.area_pie(data.pie.area); + Controller.echarts.source_pie(data.pie.source); + return; + }); } }, + + datetime:function () { + var form = $("#chart-filter"); + var ranges = {}; + ranges[__('Today')] = [Moment().startOf('day'), Moment().endOf('day')]; + ranges[__('Yesterday')] = [Moment().subtract(1, 'days').startOf('day'), Moment().subtract(1, 'days').endOf('day')]; + ranges[__('Last 7 Days')] = [Moment().subtract(6, 'days').startOf('day'), Moment().endOf('day')]; + ranges[__('Last 30 Days')] = [Moment().subtract(29, 'days').startOf('day'), Moment().endOf('day')]; + ranges[__('This Month')] = [Moment().startOf('month'), Moment().endOf('month')]; + ranges[__('Last Month')] = [Moment().subtract(1, 'month').startOf('month'), Moment().subtract(1, 'month').endOf('month')]; + ranges[__('今年')] = [Moment().startOf('year'), Moment()]; + var options = { + timePicker: false, + autoUpdateInput: false, + timePickerSeconds: true, + timePicker24Hour: true, + autoApply: true, + locale: { + format: 'YYYY-MM-DD', + customRangeLabel: __("Custom Range"), + applyLabel: __("Apply"), + cancelLabel: __("Clear"), + }, + ranges: ranges, + }; + + var callback = function (start, end) { + $(this.element).val(start.format(options.locale.format) + + " - " + end.format(options.locale.format)); + }; + require(['bootstrap-daterangepicker'], function () { + $(".datetimerange", form).each(function () { + $(this).on('apply.daterangepicker', function (ev, picker) { + callback.call(picker, picker.startDate, picker.endDate); + var label = picker.chosenLabel; + $(picker.element).data('label', label).trigger("change"); + }); + $(this).on('cancel.daterangepicker', function (ev, picker) { + $(this).val(''); + }); + $(this).daterangepicker($.extend({}, options), callback); + }); + }); + // 绑定查询按钮的点击事件 + $('#filter-btn').on('click', function() { + Controller.api.getData(); + }); + }, echarts: { top: function(data){ let map = [ @@ -52,6 +116,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th $(this).html(data[map[index]]); }); }, + + orderdoing: function(data){ + const text = `${data.dispatch} / ${data.toget} / ${data.plan} / ${data.doing}`; + $('.order-count-num ').html(text); + }, ordercount: function(data){ let map = [ 'total', @@ -125,7 +194,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th item_pie: function(data){ // 基本的饼图配置 var myChart = echarts.init(document.getElementById('item_pie')); - var option = { title: { text: '订单项目类型', @@ -147,6 +215,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th legend: { orient: 'vertical', left: 'left', + type: 'scroll', // 启用分页 data: data.map(item => item.name) }, series: [ @@ -199,6 +268,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th legend: { orient: 'vertical', left: 'left', + type: 'scroll', // 启用分页 data: data.map(item => item.name) }, series: [ @@ -251,6 +321,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th legend: { orient: 'vertical', left: 'left', + type: 'scroll', // 启用分页 data: data.map(item => item.name) }, series: [ @@ -303,6 +374,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts','echarts-th legend: { orient: 'vertical', left: 'left', + type: 'scroll', // 启用分页 data: data.map(item => item.name) }, series: [