diff --git a/app/admin/common.php b/app/admin/common.php index fcdb4d4..3ff30dd 100644 --- a/app/admin/common.php +++ b/app/admin/common.php @@ -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; + } +} \ No newline at end of file diff --git a/app/admin/controller/Api.php b/app/admin/controller/Api.php index fed9b12..0976e97 100644 --- a/app/admin/controller/Api.php +++ b/app/admin/controller/Api.php @@ -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'); + } + + + } diff --git a/app/admin/controller/nk/Analysis.php b/app/admin/controller/nk/Analysis.php index fa9cf73..2839513 100644 --- a/app/admin/controller/nk/Analysis.php +++ b/app/admin/controller/nk/Analysis.php @@ -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 + + } diff --git a/app/admin/view/nk/analysis/index.html b/app/admin/view/nk/analysis/index.html index 9ec598b..84ed5bb 100644 --- a/app/admin/view/nk/analysis/index.html +++ b/app/admin/view/nk/analysis/index.html @@ -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; + }