服务项目统计

This commit is contained in:
hant 2025-05-12 17:53:19 +08:00
parent 961ad7d2de
commit 685e847208
5 changed files with 332 additions and 6 deletions

View File

@ -52,9 +52,7 @@ class Orderplan extends Backend
public function dashboard()
{
return $this->fetch('orderplan/index');
}
public function data()
@ -127,7 +125,6 @@ class Orderplan extends Backend
}
}
$this->buildDate($build);
$build->field([
'DATE(create_time) day',
'sum(total) total',

View File

@ -0,0 +1,72 @@
<?php
namespace app\admin\controller\statistics;
use app\admin\model\Admin;
use app\admin\model\Aftersale;
use app\admin\model\Order;
use app\admin\model\OrderDispatch;
use app\admin\model\OrderReview;
use app\common\controller\Backend;
use PDOStatement;
use think\Collection;
use think\Exception;
use think\exception\DbException;
use think\Loader;
use think\response\Json;
use function Symfony\Component\Clock\now;
/**
* 服务项目统计
*
* @icon fa fa-circle-o
*/
class Item extends Backend
{
protected $relationSearch = true;
public function _initialize()
{
parent::_initialize();
}
public function index()
{
return $this->fetch('index');
}
public function list(){
$build = new Order();
$start = now()->modify('-14 days')->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';
}
}
$build->field([
'item_title',
'sum(total) total',
'count(id) count',
'sum(performance) performance'
])->group('item_title');
return [];
}
public function chartData(){
return [];
}
}

View File

@ -0,0 +1,61 @@
<div class="panel panel-default panel-intro">
<div class="panel-heading">
<ul class="nav nav-tabs">
<li class="active"><a data-val="first" href="#first" data-toggle="tab">统计图表</a></li>
<li><a href="#second" data-val="second" data-toggle="tab">统计列表</a></li>
</ul>
</div>
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="first">
<section class="connectedSortable">
<div class="nav-tabs-custom charts-custom">
<!-- Tabs within a box -->
<ul class="nav nav-tabs pull-right">
<li class="active"><a href="#bar-chart" data-toggle="tab">柱状图</a></li>
<!-- <li><a href="#pie-chart" data-toggle="tab">饼图</a></li>-->
<li class="pull-left header"><i class="fa fa-inbox"></i> 服务项目</li>
</ul>
<div>
<div class="form-inline" id="chart-filter" style="margin-top:20px;margin-bottom: 30px;">
<!-- 单选:维度 -->
<div class="form-group">
<label class="radio-inline">
<input type="radio" name="filter[time_by]" value="1" checked> 派单时间
</label>
<label class="radio-inline">
<input type="radio" name="filter[time_by]" value="2"> 录单时间
</label>
</div>
<!-- 时间范围 -->
<div class="form-group" style="margin-left: 15px;">
<input type="text" class="form-control datetimerange" data-locale='{"format":"YYYY-MM-DD"}' placeholder="指定日期" name="filter[daterange]" id="daterange" autocomplete="off" style="width: 170px;">
</div>
<!-- 查询按钮 -->
<button class="btn btn-default" id="filter-btn" style="margin-left: 15px;">查询</button>
</div>
</div>
<div class="tab-content no-padding">
<div class="chart tab-pane active" id="bar-chart" style="width: 100%; height: 500px;"></div>
</div>
</div>
</section>
</div>
<div class="tab-pane fade" id="second">
<table id="table2" class="table table-striped table-bordered table-hover">
</table>
</div>
</div>
</div>
</div>

View File

@ -1,6 +1,8 @@
define([], function () {
require([], function () {
//绑定data-toggle=addresspicker属性点击事件
console.log('111');
$(document).on('click', "[data-toggle='addresspicker']", function () {
var that = this;
var callback = $(that).data('callback');
@ -10,9 +12,9 @@ define([], function () {
var zoom_id = $(that).data("zoom-id") ? $(that).data("zoom-id") : "";
var lat = lat_id ? $("#" + lat_id).val() : '';
var lng = lng_id ? $("#" + lng_id).val() : '';
var city_code = $("#c-city").val();
var city_code = $("#area_id").val();
var zoom = zoom_id ? $("#" + zoom_id).val() : '';
var url = "/addons/address/index/select?a=1";
var url = "/addons/address/index/select?1=1";
url += (lat && lng) ? 'lat=' + lat + '&lng=' + lng +
(input_id ? "&address=" + $("#" + input_id).val() : "")
+(zoom ? "&zoom=" + zoom : "") : ''
@ -20,7 +22,7 @@ define([], function () {
if (city_code){
url += city_code ? "&city_code=" + city_code : "";
}
// console.log(url);
console.log(url);
Fast.api.open(url, '位置选择', {
callback: function (res) {
input_id && $("#" + input_id).val(res.address).trigger("change");

View File

@ -0,0 +1,194 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts', 'echarts-theme', 'template','addtabs','moment'], function ($, undefined, Backend, Table, Form,Echarts,undefined,Template,Datatable,Moment) {
var Controller = {
index: function () {
//绑定事件
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
var $targetPanel = $($(this).attr("href"));
var tabVal = $(this).data('val');
if (tabVal === 'second') {
// 当切换到“统计列表”时,自动刷新表格
//$targetPanel.find(".btn-refresh").trigger("click");
// 初始化表格参数配置
Table.api.init();
// 表格2
var table2 = $("#table2");
table2.bootstrapTable({
url: 'statistics/item/list' + location.search,
toolbar: '#toolbar1',
sortName: 'id',
search: false,
commonSearch:true,
visible: false,
showToggle: false,
showColumns: false,
showExport: true,
searchFormVisible:true,
columns: [
[
//{field: 'id', title: __('Id')},
{field: 'id', title: __('ID'),visible:true,operate: false},
{field: 'admin_user', title: __('派单员'),operate: "LIKE"},
{field: 'count_num', title: __('总订单数'),operate: false},
{field: 'finish_num', title: __('完单数'),operate: false},
{field: 'total', title: __('成效额(¥)'), operate: false},
{field: 'performance', title: __('总业绩(¥)'), operate: false},
{field: 'cost_total', title: __('总成本(¥)'), operate: false},
{field: 'refund_total', title: __('退款金额(¥)'), operate: false},
{field: 'refund_count', title: __('退款单数'), operate: false},
{field: 'performance_rate', title: __('利润率(%)'), operate: false},
{field: 'trans_rate', title: __('转化率(%)'), operate: false},
{field: 'cash_value', title: __('变现值'), operate: false},
{field: 'performance_avg', title: __('客单利润(¥)'), operate: false},
{field: 'total_avg', title: __('客单价(¥)'), operate: false},
{field: 'avg_time_diff', title: __('派单时效(小时)'), operate: false},
//{field: 'admin_user', title: __('派单员'),operate: "LIKE",visible:false},
//{field: 'city_name', title: __('城市'),operate: "LIKE",visible:false},
//{field: 'city_name', title: __('城市'),operate: "LIKE",visible:false},
{field: 'time_by', title: __('时间维度'), visible:false,searchList: {"1":__('录单时间'),"2":__('派单时间')},defaultValue:1, formatter: Table.api.formatter.normal},
{field: 'daterange', title: __('时间筛选'), addclass:'datetimerange',
autocomplete:false,
operate: "RANGE",
datetimeFormat: "YYYY-MM-DD",
//defaultValue:today()+' - '+today(),
data:'autocomplete="off" data-local={"format":"YYYY-MM-DD"}',
visible:false,
defaultValue: Config.default_daterange
},
{field: 'operate', title: __('Operate'), table: table2, events: Table.api.events.operate, formatter: Table.api.formatter.operate,
buttons: [
{
name: 'aftersales',
text:"售后列表",
title:"售后列表",
icon: 'fa fa-list',
url: function(row){
return 'aftersales/aftersale/index?from=2&man_id='+row.id;
},
extend: 'data-toggle="tooltip" data-container="body"',
classname: 'btn btn-xs btn-default btn-dialog',
visible:function(row){
return true;
}
},
]
}
]
]
});
// 为表格2绑定事件
Table.api.bindevent(table2);
}
});
// 触发 tab 后发起 ajax 获取图表数据
$('ul.nav-tabs li.active a[data-toggle="tab"]').on("shown.bs.tab", function () {
getChartData();
});
function getChartData(){
// 获取单选框选中的值
var timeBy = $('input[name="filter[time_by]"]:checked').val();
// 获取日期范围值
var daterange = $('#daterange').val();
// 构建查询参数
var params = {
'time_by': timeBy,
'daterange': daterange
};
$.ajax({
url: "statistics/item/chartData", //
type: "POST",
dataType: "json",
data:params,
success: function (response) {
},
error: function () {
console.error("图表数据加载失败");
}
});
}
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().endOf('year')];
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);
});
});
// 手动触发一次激活 tab 的 shown.bs.tab
getChartData();
// 绑定查询按钮的点击事件
$('#filter-btn').on('click', function() {
getChartData();
});
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
aftersales: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});