后台产品情况管理

This commit is contained in:
彭桃 2023-02-07 17:10:23 +08:00
parent d44c1db4cf
commit 2417f63729
5 changed files with 371 additions and 63 deletions

View File

@ -318,3 +318,65 @@ function add_log($type, $param_id = '', $param = [])
$data['create_time'] = time();
Db::name('AdminLog')->strict(false)->field(true)->insert($data);
}
if (!function_exists('getModelTime')) {
/**
* @param BaseQuery $model
* @param string $section
* @param string $prefix
* @param string $field
* @return mixed
* @author xaboy
* @day 2020-04-29
*/
function getModelTime( $model, string $section, $prefix = 'create_time', $field = '-',$time = '')
{
if (!isset($section)) return $model;
switch ($section) {
case 'today':
$model->whereBetween($prefix, [date('Y-m-d H:i:s', strtotime('today')), date('Y-m-d H:i:s', strtotime('tomorrow -1second'))]);
break;
case 'week':
$model->whereBetween($prefix, [date('Y-m-d H:i:s', strtotime('this week 00:00:00')), date('Y-m-d H:i:s', strtotime('next week 00:00:00 -1second'))]);
break;
case 'month':
$model->whereBetween($prefix, [date('Y-m-d H:i:s', strtotime('first Day of this month 00:00:00')), date('Y-m-d H:i:s', strtotime('first Day of next month 00:00:00 -1second'))]);
break;
case 'year':
$model->whereBetween($prefix, [date('Y-m-d H:i:s', strtotime('this year 1/1')), date('Y-m-d H:i:s', strtotime('next year 1/1 -1second'))]);
break;
case 'yesterday':
$model->whereBetween($prefix, [date('Y-m-d H:i:s', strtotime('yesterday')), date('Y-m-d H:i:s', strtotime('today -1second'))]);
break;
case 'quarter':
list($startTime, $endTime) = getMonth();
$model = $model->where($prefix, '>', $startTime);
$model = $model->where($prefix, '<', $endTime);
break;
case 'lately7':
$model = $model->where($prefix, 'between', [date('Y-m-d', strtotime("-7 day")), date('Y-m-d H:i:s')]);
break;
case 'lately30':
$model = $model->where($prefix, 'between', [date('Y-m-d', strtotime("-30 day")), date('Y-m-d H:i:s')]);
break;
default:
if (strstr($section, $field) !== false) {
list($startTime, $endTime) = explode($field, $section);
if (strlen($startTime) == 4) {
$model->whereBetweenTime($prefix, date('Y-m-d H:i:s', strtotime($section)), date('Y-m-d H:i:s', strtotime($section . ' +1day -1second')));
} else {
if ($startTime == $endTime) {
$model = $model->whereBetweenTime($prefix, date('Y-m-d 0:0:0', strtotime($startTime)), date('Y-m-d 23:59:59', strtotime($endTime)));
} else if(strpos($startTime, ':')) {
$model = $model->whereBetweenTime($prefix, $startTime, $endTime);
} else {
$model = $model->whereBetweenTime($prefix, date('Y-m-d H:i:s', strtotime($startTime)), date('Y-m-d H:i:s', strtotime($endTime . ' +1day -1second')));
}
}
}
break;
}
return $model;
}
}

View File

@ -381,5 +381,97 @@ class Api extends BaseController
}
}
public function tongji(){
$mmm = $www = [];
$post = get_params();
//镇农产品需求量分析(事业单位、企业、居民)
$date = 'month';
$num_5 = Db::connect('shop')->table('eb_store_order')
->field('from_unixtime(unix_timestamp(create_time),\'%m-%d\') as time, count(DISTINCT order_id) as total')
->group('time')
->order('time ASC')
->whereBetween('create_time', [date('Y-m-d H:i:s', strtotime('first Day of this month 00:00:00')), date('Y-m-d H:i:s', strtotime('first Day of next month 00:00:00 -1second'))])
->select()->toarray();
$day_time = array_column($num_5,'time');
$total = array_column($num_5,'total');
//农产品市场行情分析、显示
$list['num_6'] = 6;
//农产品市内需求量
$list['num_7'] = 7;
$visitUser = $this->dateVisitUserNum($date, '');
$orderUser = $this->orderUserNum($date, null, '');
$orderPrice = $this->orderPrice($date, null, '');
$payOrderUser = $this->orderUserNum($date, 1, '');
$payOrderPrice = $this->orderPrice($date, 1, '');
// halt($payOrderUser);
// $userRate = $payOrderUser ? bcdiv($payOrderPrice, $payOrderUser, 2) : 0;
// $orderRate = $visitUser ? bcdiv($orderUser, $visitUser, 2) : 0;
// $payOrderRate = $orderUser ? bcdiv($payOrderUser, $orderUser, 2) : 0;
$result = compact('day_time','total','visitUser', 'orderUser', 'orderPrice', 'payOrderUser', 'payOrderPrice');
$result = ['data' => $result];
return table_assign(0, '', $result);
}
public function dateVisitUserNum($date, $merId = null)
{
return Db::connect('shop')->table('eb_user_visit')->alias('A')->join('eb_store_product B', 'A.type_id = B.product_id')->when($date, function ($query, $date) {
getModelTime($query, $date, 'A.create_time');
})->when($merId, function ($query, $merId) {
$query->where('B.mer_id', $merId);
})->where('A.type', 'product')->group('uid')->count();
}
public function orderUserNum($date, $paid = null, $merId = null)
{
return Db::connect('shop')->table('eb_store_order')->when($paid, function ($query, $paid) {
$query->where('paid', $paid);
})->when($merId, function ($query, $merId) {
$query->where('mer_id', $merId);
})->when($date, function ($query, $date) use ($paid) {
if (!$paid) {
getModelTime($query, $date);
// $query->where(function ($query) use ($date) {
// $query->where(function ($query) use ($date) {
// $query->where('paid', 1);
// getModelTime($query, $date, 'pay_time');
// })->whereOr(function ($query) use ($date) {
// $query->where('paid', 0);
// getModelTime($query, $date);
// });
// });
} else
getModelTime($query, $date, 'pay_time');
})->group('uid')->count();
}
public function orderPrice($date, $paid = null, $merId = null)
{
return Db::connect('shop')->table('eb_store_order')->when($paid, function ($query, $paid) {
$query->where('paid', $paid);
})->when($merId, function ($query, $merId) {
$query->where('mer_id', $merId);
})->when($date, function ($query, $date) use ($paid) {
if (!$paid) {
$query->where(function ($query) use ($date) {
$query->where(function ($query) use ($date) {
$query->where('paid', 1);
getModelTime($query, $date, 'pay_time');
})->whereOr(function ($query) use ($date) {
$query->where('paid', 0);
getModelTime($query, $date);
});
});
} else
getModelTime($query, $date, 'pay_time');
})->sum('pay_price');
}
}

View File

@ -31,7 +31,7 @@ class Analysis extends BaseController
public function index()
{
if (request()->isAjax()) {
$mmm = [];
$mmm = $www = [];
$post = get_params();
//权限组信息
@ -39,60 +39,65 @@ class Analysis extends BaseController
$find = Db::table('fa_szxc_information_useraddress')->where('admin_id', $this->adminInfo['id'])->find();
if ($find) {
if ($find['auth_range'] == 1) {
$mmm['b.village_id'] = $find['village_id'];
$mmm['b.village_id'] = $www['d.village_id'] = $find['village_id'];
} elseif ($find['auth_range'] == 2) {
$mmm['b.street_id'] = $find['street_id'];
$mmm['b.street_id'] = $www['d.street_id'] = $find['street_id'];
} elseif ($find['auth_range'] == 3) {
$mmm['b.area_id'] = $find['area_id'];
$mmm['b.area_id'] = $www['d.area_id'] = $find['area_id'];
}
}
}
if ($post) {
if (isset($post['area_id']) && !empty($post['area_id'])) {
$mmm['b.area_id'] = $post['area_id'];
$mmm['b.area_id'] = $www['d.area_id'] = $post['area_id'];
}
if (isset($post['street_id']) && !empty($post['street_id'])) {
$mmm['b.street_id'] = $post['street_id'];
$mmm['b.street_id'] = $www['d.street_id'] = $post['street_id'];
}
if (isset($post['village_id']) && !empty($post['village_id'])) {
$mmm['b.village_id'] = $post['village_id'];
}
if (isset($post['brigade_id']) && !empty($post['brigade_id'])) {
$mmm['b.brigade_id'] = $post['brigade_id'];
$mmm['b.village_id'] = $www['d.village_id'] = $post['village_id'];
}
// if (isset($post['brigade_id']) && !empty($post['brigade_id'])) {
// $mmm['b.brigade_id'] = $www['d.brigade_id'] = $post['brigade_id'];
// }
}
//加工企业和品牌企业数量
$map[] = ['a.status','=',1];
$map[] = ['a.is_del','=',0];
//企业农产品销量
$list['num_2'] = Db::connect('shop')->table('eb_merchant')->alias('a')->join('eb_merchant_address b','a.mer_id = b.mer_id')->join('eb_store_order c','a.mer_id = c.mer_id')->where($mmm)->where($map)->where('c.is_del',0)->where('c.paid',1)->count();
//本镇已录入的商户
$list['num_4'] = Db::connect('shop')->table('eb_merchant')->alias('a')->join('eb_merchant_address b','a.mer_id = b.mer_id')->where($mmm)->where($map)->count();
//加工企业和品牌企业数量
$map[] = ['a.type_id','in','2,3'];
$list['num_1'] = Db::connect('shop')->table('eb_merchant')->alias('a')->join('eb_merchant_address b','a.mer_id = b.mer_id')->where($mmm)->where($map)->count();
//企业农产品销量
$list['num_2'] = 2;
//企业通过我们平台采购的农产品
$list['num_3'] = 3;
//本镇已录入的商户
$list['num_4'] = 4;
$list['num_3'] = Db::connect('shop')->table('eb_user')->alias('a')->join('eb_nk_user b','a.uid = b.user_id')->join('eb_store_order c','a.uid = c.uid')->join('nk_lihaink_cn.fa_szxc_information_useraddress d','b.n_user_id = d.user_id')->where($www)->where('a.status',1)->where('c.is_del',0)->where('c.paid',1)->count();
//镇农产品需求量分析(事业单位、企业、居民)
$list['num_5'] = 5;
//农产品市场行情分析、显示
//农产品市内需求量
$result = ['data' => $list];
return table_assign(0, '', $result);
}
//权限组信息
$mmm = [];
$mmm = $www = [];
if ($this->adminInfo['group_access'] != 1) { //不是超级管理员
$www['admin_id'] = $this->adminInfo['id'];
$user_address = Db::table('fa_szxc_information_useraddress')->where($www)->find();
if ($user_address) {
if ($user_address['auth_range'] == 1) {
$mmm['b.village_id'] = $user_address['village_id'];
$mmm['b.village_id'] = $www['d.village_id'] = $user_address['village_id'];
} elseif ($user_address['auth_range'] == 2) {
$mmm['b.street_id'] = $user_address['street_id'];
$mmm['b.street_id'] = $www['d.street_id'] = $user_address['street_id'];
} elseif ($user_address['auth_range'] == 3) {
$mmm['b.area_id'] = $user_address['area_id'];
$mmm['b.area_id'] = $www['d.area_id'] = $user_address['area_id'];
}
if ($user_address['auth_range'] <=3 &&$user_address['auth_range'] >=1 ) {
@ -121,19 +126,22 @@ class Analysis extends BaseController
$is_admin = 1;
}
//加工企业和品牌企业数量
$map[] = ['a.status','=',1];
$map[] = ['a.is_del','=',0];
//企业农产品销量
$list['num_2'] = Db::connect('shop')->table('eb_merchant')->alias('a')->join('eb_merchant_address b','a.mer_id = b.mer_id')->join('eb_store_order c','a.mer_id = c.mer_id')->where($mmm)->where($map)->where('c.is_del',0)->where('c.paid',1)->count();
//本镇已录入的商户
$list['num_4'] = Db::connect('shop')->table('eb_merchant')->alias('a')->join('eb_merchant_address b','a.mer_id = b.mer_id')->where($mmm)->where($map)->count();
//加工企业和品牌企业数量
$map[] = ['a.type_id','in','2,3'];
$list['num_1'] = Db::connect('shop')->table('eb_merchant')->alias('a')->join('eb_merchant_address b','a.mer_id = b.mer_id')->where($mmm)->where($map)->count();
//企业农产品销量
$list['num_2'] = 2;
//企业通过我们平台采购的农产品
$list['num_3'] = 3;
//本镇已录入的商户
$list['num_4'] = 4;
$list['num_3'] = Db::connect('shop')->table('eb_user')->alias('a')->join('eb_nk_user b','a.uid = b.user_id')->join('eb_store_order c','a.uid = c.uid')->join('nk_lihaink_cn.fa_szxc_information_useraddress d','b.n_user_id = d.user_id')->where($www)->where('a.status',1)->where('c.is_del',0)->where('c.paid',1)->count();
//镇农产品需求量分析(事业单位、企业、居民)
$list['num_5'] = 5;
//农产品市场行情分析、显示
//农产品市内需求量
View::assign('data', $list);
@ -147,4 +155,6 @@ class Analysis extends BaseController
}

View File

@ -41,6 +41,24 @@
.panel{
background-color: #fff;
}
.dashboard-num table {width: 100%;}
.dashboard-num td {text-align: center; padding: 16px 0; width: 20%;border-left: 1px solid #f1f1f1; position: relative;}
.dashboard-num td:nth-child(1) { border-left: none}
.dashboard-num .num-title { padding-bottom: 10px; color: #999;}
.dashboard-num .blue {font-size: 20px; font-weight: 300;}
.dashboard-num td .badge {position: absolute;top: 0; right: 0;}
.dashboard-num td .badge span { padding: 2px 4px; font-size: 12px; border-radius: 0 0 0 4px;}
.dashboard-total td {border-top: 1px solid #f1f1f1}
.dashboard-logs .layui-timeline-item {padding-bottom: 1px;}
.info-td { width: 90px; text-align: right;background-color: #fafafa; color: #999; padding: 5px 3px;}
.info-td {width: 90px; text-align: right;background-color: #fafafa; color: #999; padding: 5px 3px;}
.layui-card-body .layui-timeline-title {
padding-bottom: 0;
font-size: 14px;
}
.layui-card-body .layui-timeline-item {
padding-bottom: 5px;
}
</style>
<div class="p-3 panel">
<form class="layui-form gg-form-bar border-t border-x" style="display: inline-block;">
@ -67,12 +85,7 @@
<div id="demo2"></div>
</div>
</div>
<div class="layui-input-inline" style="width:300px;">
<label class="layui-form-label">大队</label>
<div class="layui-input-block">
<div id="demo3"></div>
</div>
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="searcharea">提交</button>
</form>
@ -110,17 +123,18 @@
</div>
</div>
</div>
<div class="col-sm-2 col-xs-6">
<div class="sm-st clearfix">
<div class="sm-st-info">
<span id="num_5">{$data.num_5}</span>
镇农产品需求量分析
</div>
</div>
</div>
</div>
<div class="layui-card">
<div id="chartView" style="width: 100%;height:300px;"></div>
</div>
<div class="layui-card">
<div id="chartView2" style="width: 100%;height:500px;"></div>
</div>
</div>
<script type="text/html" id="status">
@ -137,6 +151,7 @@
<!-- 脚本 -->
{block name="script"}
<script src="/static/assets/js/xm-select.js"></script>
<script src="https://cdn.staticfile.org/echarts/5.3.0/echarts.min.js"></script>
<script>
const moduleInit = ['tool'];
var group_access = "{:session('gougu_admin')['group_access']}";
@ -150,7 +165,6 @@
}
if (street_id != 0) {
village(street_id)
brigade()
}
form.on('select(area_id)', function (data) {
@ -170,7 +184,11 @@
disabled: group_access == 2 || group_access==4 ? true : false,
on: function (data) {
var arr = data.arr;
village(arr[0]['code'])
if(arr.length > 0){
village(arr[0]['code']);
}else{
village();
}
},
})
$.get('/api/geo/street?pcode=' + id, function (result) {
@ -195,40 +213,162 @@
initValue: ["{$row.village_id}"],
disabled: group_access == 2 ? true : false,
})
var demo3 = xmSelect.render({
name: 'brigade_id',
el: '#demo3',
prop: {
name: 'brigade_name',
value: 'id',
},
data: [],
radio: true,
})
// var demo3 = xmSelect.render({
// name: 'brigade_id',
// el: '#demo3',
// prop: {
// name: 'brigade_name',
// value: 'id',
// },
// data: [],
// radio: true,
// })
$.get('/api/geo/village?pcode=' + id, function (result) {
demo2.update({
data: result.data
})
});
$.get('/api/geo/brigade', function (result) {
demo3.update({
data: result.data
})
});
// $.get('/api/geo/brigade', function (result) {
// demo3.update({
// data: result.data
// })
// });
}
//监听搜索提交
form.on('submit(searcharea)', function(data) {
tool.get("/admin/nk.analysis/index", data.field, function (res) {
let data = res.data;
console.log(data);
$('#num_1').text(data.num_1);
$('#num_2').text(data.num_2);
$('#num_3').text(data.num_3);
$('#num_4').text(data.num_4);
$('#num_5').text(data.num_5);
});
return false;
});
get_view_data();
}
var chartView = echarts.init(document.getElementById('chartView'));
var chartView2 = echarts.init(document.getElementById('chartView2'));
function get_view_data() {
$.ajax({
url: "/admin/api/tongji",
type: 'post',
data: {},
success: function (e) {
if (e.code == 0) {
var data_first = e.data.day_time;
var data_second = e.data.total;
var visitUser = e.data.visitUser;
var payOrderUser = e.data.payOrderUser;
var orderUser = e.data.orderUser;
var myDate = new Date();
var nowHour = myDate.getHours(); //获取当前小时数(0-23)
var xData = [];
var yData1 = [];
var yData2 = [];
ops = {
title: {
text: '订单量数据'
},
tooltip: {
trigger: 'axis'
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: data_first
},
yAxis: {
type: 'value'
},
series: [
{
name: '订单量',
type: 'line',
stack: 'Total',
data: data_second
}
]
};
chartView.setOption(ops);
option = {
title: {
text: '成交用户'
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c}'
},
legend: {
data: ['访问', '下单', '支付']
},
series: [
{
name: '用户',
type: 'funnel',
left: '10%',
top: 60,
bottom: 60,
width: '80%',
min: 0,
max: 100,
minSize: '0%',
maxSize: '100%',
sort: 'descending',
gap: 2,
label: {
show: true,
position: 'inside'
},
labelLine: {
length: 10,
lineStyle: {
width: 1,
type: 'solid'
}
},
itemStyle: {
borderColor: '#fff',
borderWidth: 1
},
emphasis: {
label: {
fontSize: 20
}
},
data: [
{ value: payOrderUser, name: '支付' },
{ value: orderUser, name: '下单' },
{ value: visitUser, name: '访问' }
]
}
]
};
chartView2.setOption(option);
setTimeout(function () {
window.onresize = function () {
chartView.resize();
myChart.resize();
}
})
}
}
})
}
</script>

View File

@ -234,7 +234,11 @@
disabled: group_access == 2 || group_access==4 ? true : false,
on: function (data) {
var arr = data.arr;
village(arr[0]['code'])
if(arr.length > 0){
village(arr[0]['code']);
}else{
village();
}
},
})
$.get('/api/geo/street?pcode=' + id, function (result) {