12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175 |
- <?php
- namespace App\Http\Controllers\Admin;
- use App\Filters\BikeFilter;
- use App\Filters\OrderFilter;
- use App\Filters\OrderRentFilter;
- use App\Filters\UserFilter;
- use App\Filters\WalletLogFilter;
- use App\Filters\WorkOrderFilter;
- use App\Models\AdminUser;
- use App\Models\AdminUserArea;
- use App\Models\Area;
- use App\Models\Bike;
- // use App\Models\BikeTrouble;
- use App\Models\Order;
- use App\Models\OrderRent;
- use App\Models\User;
- use App\Models\UserPhoneDetail;
- use App\Models\WalletLog;
- use App\Models\WorkOrder;
- use App\Utils\Admin;
- use App\Utils\RedisKeys;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- /**
- * Class IndexController
- * @package App\Http\Controllers\Admin
- */
- class IndexController extends Controller
- {
- /**
- * topIndex 首页头部统计数据
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function topIndex(Request $request)
- {
- $area_id = $request->get('area_id') ?? '';
- $data = [];
- $data['new_order'] = $this->newOrder($area_id);
- $data['total_user'] = $this->totalUser($area_id);
- $data['total_order'] = $this->totalOrder($area_id);
- $data['total_profit'] = $this->totalProfit($area_id);
- return $this->ok($data);
- }
- /**
- * todoEvent 首页待办事项 统计数据
- *
- * @param BikeFilter $bikeFilter
- * @param OrderFilter $orderFilter
- * @param OrderRentFilter $orderRentFilter
- * @param WorkOrderFilter $workOrderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function todoEvent(BikeFilter $bikeFilter, OrderFilter $orderFilter, OrderRentFilter $orderRentFilter, WorkOrderFilter $workOrderFilter)
- {
- $data = [];
- $data['low_battery_num'] = Bike::query()->filter($bikeFilter);
- $data['long_time_no_ridding'] = Bike::query()->filter($bikeFilter);
- $data['long_time_no_return_ridding'] = Order::query()->filter($orderFilter);
- $long_time_no_return_ridding_order_rent = OrderRent::query()->filter($orderRentFilter);
- $data['trouble_num'] = Bike::query()->filter($bikeFilter);
- $data['warning_num'] = WorkOrder::query()->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->pluck('area_id')->toArray();
- $area_ids = array_merge($area_ids,$area_id);
- $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids);
- $data['long_time_no_ridding'] = $data['long_time_no_ridding']->whereIn('put_area_id', $area_ids);
- $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->whereIn('area_id', $area_ids);
- $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->whereIn('area_id', $area_ids);
- $data['trouble_num'] = $data['trouble_num']->whereIn('put_area_id', $area_ids);
- $data['warning_num'] = $data['warning_num']->whereIn('area_id', $area_ids);
- // if (count($area_ids) !== 0) {
- // $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids);
- // $data['long_time_no_ridding'] = $data['long_time_no_ridding']->whereIn('put_area_id', $area_ids);
- // $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->whereIn('area_id', $area_ids);
- // $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->whereIn('area_id', $area_ids);
- // $data['trouble_num'] = $data['trouble_num']->whereIn('put_area_id', $area_ids);
- // $data['warning_num'] = $data['warning_num']->whereIn('area_id', $area_ids);
- // } else {
- //// $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- //// $area_id = $area_id ?? 0;
- // $data['low_battery_num'] = $data['low_battery_num']->where('put_area_id', $area_id);
- // $data['long_time_no_ridding'] = $data['long_time_no_ridding']->where('put_area_id', $area_id);
- // $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->where('area_id', $area_id);
- // $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->where('area_id', $area_id);
- // $data['trouble_num'] = $data['trouble_num']->where('put_area_id', $area_id);
- // $data['warning_num'] = $data['warning_num']->where('area_id', $area_id);
- // }
- }
- // 低电量
- $data['low_battery_num'] = $data['low_battery_num']
- ->where('is_low_battery_power', Bike::BATTERY_POWER_LOW)
- ->count('id');
- // 24小时未骑车辆
- $data['long_time_no_ridding'] = $data['long_time_no_ridding']
- ->where('last_use_bike_end_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
- ->count('id');
- // 24小时未还车 此处查询订单
- $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']
- ->where(function ($q) {
- $q->where('status', Order::STATUS_PAUSE_BIKE)
- ->orWhere('status', Order::STATUS_RIDE_BIKE);
- })
- ->where('start_use_bike_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
- ->count('id');
- $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent
- ->where(function ($q) {
- $q->where('status', OrderRent::STATUS_RENT_BIKE);
- })
- ->where('start_use_bike_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
- ->count('id');
- $data['long_time_no_return_ridding'] += $long_time_no_return_ridding_order_rent;
- //故障车辆
- $data['trouble_num'] = $data['trouble_num']
- ->where('is_trouble', Bike::TROUBLE_YES)
- ->count('id');
- // 报警信息
- $data['warning_num'] = $data['warning_num']
- ->where('status', WorkOrder::STATUS_NO)
- ->count('id');
- // $data['warning_num'] = 0;
- return $this->ok($data);
- }
- /**
- * profitPolygonalChart 总收益 折线统计图
- *
- * @param Request $request
- * @param WalletLogFilter $walletLogFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function profitPolygonalChart11(Request $request, WalletLogFilter $walletLogFilter)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $profit = WalletLog::query()
- ->filter($walletLogFilter)
- ->whereIn('type', WalletLog::$subType);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $profit = $profit->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $profit = $profit->where('area_id', $area_id);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $profit = $profit->where('created_at', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,sum(money) as value')
- ->groupBy('date')->get();
- break;
- case 'threeDays':
- $threeDaysAgo = Carbon::today()->subDays(3);
- $profit = $profit->where('created_at', '>', $threeDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
- ->groupBy('date')->get();
- break;
- case 'sevenDays':
- $sevenDaysAgo = Carbon::today()->subDays(7);
- $profit = $profit->where('created_at', '>', $sevenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
- ->groupBy('date')->get();
- break;
- case 'fifteenDays':
- $fifteenDaysAgo = Carbon::today()->subDays(15);
- $profit = $profit->where('created_at', '>', $fifteenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
- ->groupBy('date')->get();
- break;
- case 'thirtyDays':
- $thirtyDaysAgo = Carbon::today()->subDays(30);
- $profit = $profit->where('created_at', '>', $thirtyDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
- ->groupBy('date')->get();
- break;
- default:
- return $this->error('参数错误');
- }
- return $this->ok($profit);
- }
- public function profitPolygonalChart(Request $request, OrderFilter $orderFilter){
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $newOrders = Order::query()
- ->filter($orderFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newOrders = $newOrders->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $newOrders = $newOrders->where('area_id', $area_id);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,sum(pay_money) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key=>$value){
- $data[]=['date'=>$key,'value'=>$value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if($days !== 'today'){
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i ; $i >= 0; $i--){
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(pay_money) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if(!empty($newOrders)){
- foreach ($newOrders as $v){
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr,$newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks=>$vs){
- $data[]=['date'=>$ks,'value'=>$vs];
- }
- }
- return $this->ok($data);
- }
- /**
- * newUsersChart 新用户增长统计图
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function newUsersChart(Request $request)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $newUsers = User::query()
- ->where('is_card_certified', User::CARD_OK);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newUsers = $newUsers->whereIn('register_area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $newUsers = $newUsers->where('register_area_id', $area_id);
- }
- }
- $newOrders = $newUsers;
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key=>$value){
- $data[]=['date'=>$key,'value'=>$value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if($days !== 'today'){
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i ; $i >= 0; $i--){
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if(!empty($newOrders)){
- foreach ($newOrders as $v){
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr,$newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks=>$vs){
- $data[]=['date'=>$ks,'value'=>$vs];
- }
- }
- return $this->ok($data);
- }
- /**
- * newOrderChart 新订单统计图
- *
- * @param Request $request
- * @param OrderFilter $orderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function newOrderChart(Request $request, OrderFilter $orderFilter)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $newOrders = Order::query()
- ->filter($orderFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newOrders = $newOrders->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $newOrders = $newOrders->where('area_id', $area_id);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key=>$value){
- $data[]=['date'=>$key,'value'=>$value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if($days !== 'today'){
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i ; $i >= 0; $i--){
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if(!empty($newOrders)){
- foreach ($newOrders as $v){
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr,$newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks=>$vs){
- $data[]=['date'=>$ks,'value'=>$vs];
- }
- }
- return $this->ok($data);
- }
- /**
- * newDayRentOrderChart 日租新订单统计图
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function newDayRentOrderChart(Request $request,OrderRentFilter $orderRentFilter)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $newOrders = Order::query()
- ->filter($orderRentFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newOrders = $newOrders->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $newOrders = $newOrders->where('area_id', $area_id);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key=>$value){
- $data[]=['date'=>$key,'value'=>$value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if($days !== 'today'){
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i ; $i >= 0; $i--){
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if(!empty($newOrders)){
- foreach ($newOrders as $v){
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr,$newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks=>$vs){
- $data[]=['date'=>$ks,'value'=>$vs];
- }
- }
- return $this->ok($data);
- }
- /**
- * riddingRanking 普通订单骑行排行榜
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function riddingRanking(Request $request)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $order = Order::query()
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->with(['users']);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $order = $order->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $order = $order->where('area_id', $area_id);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $order = $order->where('created_at', '>', $today);
- break;
- case 'sevenDays':
- $time = Carbon::today()->subDays(7);
- $order = $order->where('created_at', '>', $time);
- break;
- case 'oneMonth':
- $time = Carbon::today()->subMonth();
- $order = $order->where('created_at', '>', $time);
- break;
- case 'sixMonth':
- $time = Carbon::today()->subMonths(6);
- $order = $order->where('created_at', '>', $time);
- break;
- default:
- return $this->error('参数错误');
- }
- $order = $order
- ->groupBy(['user_id'])
- ->select('user_id', DB::raw('count(id) as total_num'))
- ->orderByDesc('total_num')
- ->get()
- ->take(10);
- // ->take(10);
- // Log::info($order);
- $i = 0;
- foreach ($order as &$v) {
- $v['username'] = $v->users->nickname ?? '';
- $v['phone'] = $v->users->mobile ?? '';
- $v['ranking'] = ++$i;
- unset($v);
- }
- return $this->ok($order);
- }
- /**
- * riddingRankingByDayRentOrder 日租订单骑行排行榜
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function riddingRankingByDayRentOrder(Request $request)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $order = OrderRent::query()
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
- ->with(['users']);
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $order = $order->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $order = $order->where('area_id', $area_id);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $order = $order->where('pay_time', '>', $today);
- break;
- case 'sevenDays':
- $time = Carbon::today()->subDays(7);
- $order = $order->where('pay_time', '>', $time);
- break;
- case 'oneMonth':
- $time = Carbon::today()->subMonth();
- $order = $order->where('pay_time', '>', $time);
- break;
- case 'sixMonth':
- $time = Carbon::today()->subMonths(6);
- $order = $order->where('pay_time', '>', $time);
- break;
- default:
- return $this->error('参数错误');
- }
- $order = $order
- ->groupBy(['user_id'])
- ->select('user_id', DB::raw('count(id) as total_num'))
- ->orderByDesc('total_num')
- ->get()
- ->take(10);
- // ->take(10);
- // Log::info($order);
- if (count($order) == 0) return $this->ok([]);
- $i = 0;
- foreach ($order as &$v) {
- $v['username'] = $v->users->nickname ?? '';
- $v['phone'] = $v->users->mobile ?? '';
- $v['ranking'] = ++$i;
- unset($v);
- }
- return $this->ok($order);
- }
- /**
- * bikeProfitRanking 车辆收益统计排行榜
- *
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function bikeProfitRanking()
- {
- $bikes = Bike::query();
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $bikes = $bikes->whereIn('put_area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $bikes = $bikes->where('put_area_id', $area_id);
- }
- }
- $bikes = $bikes->get();
- $data = [];
- if (count($bikes) === 0) return $this->ok($data);
- foreach ($bikes as $k => $v) {
- $bike_insert_time = $v->created_at ? date('Y-m-d H:i:s', strtotime($v->created_at)) : '';
- $days = Carbon::today()->diffInDays($bike_insert_time);
- $per_money = 0;
- if ($days != 0) {
- $per_money = round($v->total_money / $days, 2);
- }
- // $v['phone'] = $v->users->mobile ?? '';
- $data[] = [
- 'bike_no' => $v->bike_no ?? '',
- 'put_days' => $days,
- 'total_money' => $v->total_money,
- 'per_money' => $per_money
- ];
- $volume[$k] = $per_money; // 排序依据
- $edition[$k] = $v->bike_no ?? ''; // 排序人
- // $v['ranking'] = ++$i;
- unset($v);
- }
- array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
- if (count($data) > 10) {
- $res = array_slice($data, 0, 10);
- } else {
- $res = $data;
- }
- return $this->ok($res);
- }
- /**
- * totalUser 总用户数量统计
- *
- * @param string $area_id
- * @return array
- * @author Fx
- *
- */
- protected function totalUser($area_id = '')
- {
- $totalUser = [];
- $yesterday = Carbon::yesterday();
- $today = Carbon::today();
- $yesterdayNewUser = User::query();
- $todayNewUser = User::query();
- $total = User::query();
- if (!empty($area_id)) {
- $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
- $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
- $total = $total->where('register_area_id', $area_id);
- }
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $yesterdayNewUser = $yesterdayNewUser->whereIn('register_area_id', $area_ids);
- $todayNewUser = $todayNewUser->whereIn('register_area_id', $area_ids);
- $total = $total->whereIn('register_area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
- $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
- $total = $total->where('register_area_id', $area_id);
- }
- }
- //昨日新增用户
- $yesterdayNewUser = $yesterdayNewUser
- ->where('created_at', '>', $yesterday)
- ->where('created_at', '<', $today)
- ->count('id');
- //今日新增用户数
- $todayNewUser = $todayNewUser
- ->where('created_at', '>', $today)
- ->count('id');
- $total = $total->count('id');
- $userDifference = (int)$todayNewUser - (int)$yesterdayNewUser;
- $totalUser['total_num'] = $total;
- if ($userDifference < 0) {
- $totalUser['diff'] = '1'; // 表示下降
- } elseif ($userDifference === 0) {
- $totalUser['diff'] = '2'; // 表示无变化
- } else {
- $totalUser['diff'] = '3'; // 表示上升
- }
- $totalUser['difference'] = abs($userDifference);
- return $totalUser;
- }
- /**
- * totalOrder 总订单数量统计
- *
- * @param string $area_id
- * @return array
- * @author Fx
- *
- */
- protected function totalOrder($area_id = '')
- {
- $totalOrder = $this->orderStistics($area_id);
- unset($totalOrder['new_num']); // 删除多余得本日新增订单数
- return $totalOrder;
- }
- /**
- * newOrder 新订单统计
- *
- * @param string $area_id
- * @return array
- * @author Fx
- *
- */
- protected function newOrder($area_id = '')
- {
- $newOrder = $this->orderStistics($area_id);
- unset($newOrder['total_num']); // 删除多余得总订单数
- return $newOrder;
- }
- /**
- * orderStistics 订单数量统计
- *
- * @param string $area_id
- * @return array
- * @author Fx
- *
- */
- protected function orderStistics($area_id = '')
- {
- $totalOrder = [];
- $yesterday = Carbon::yesterday();
- $today = Carbon::today();
- $yesterdayOrderNum = Order::query();
- $todayOrderNum = Order::query();
- $total = Order::query();
- $yesterdayOrderRentNum = OrderRent::query();
- $todayOrderRentNum = OrderRent::query();
- $totalOrderRent = OrderRent::query();
- if (!empty($area_id)) {
- $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
- $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
- $total = $total->where('area_id', $area_id);
- }
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $yesterdayOrderNum = $yesterdayOrderNum->whereIn('area_id', $area_ids);
- $todayOrderNum = $todayOrderNum->whereIn('area_id', $area_ids);
- $total = $total->whereIn('area_id', $area_ids);
- $yesterdayOrderRentNum = $yesterdayOrderRentNum->whereIn('area_id', $area_ids);
- $todayOrderRentNum = $todayOrderRentNum->whereIn('area_id', $area_ids);
- $totalOrderRent = $totalOrderRent->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
- $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
- $total = $total->where('area_id', $area_id);
- $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id);
- $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id);
- $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
- }
- }
- // 昨日新订单数
- $yesterdayOrderNum = $yesterdayOrderNum
- ->where('pay_time', '>', $yesterday)
- ->where('pay_time', '<', $today)
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->count('id');
- $yesterdayOrderRentNum = $yesterdayOrderRentNum
- ->where('pay_time', '>', $yesterday)
- ->where('pay_time', '<', $today)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
- ->count('id');
- // 今日新订单数
- $todayOrderNum = $todayOrderNum
- ->where('pay_time', '>', $today)
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->count('id');
- $todayOrderRentNum = $todayOrderRentNum
- ->where('pay_time', '>', $today)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
- ->count('id');
- // 总订单数
- $total = $total
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->count('id');
- $totalOrderRent = $totalOrderRent
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
- ->count('id');
- $orderDifference = (int)$todayOrderNum - (int)$yesterdayOrderNum;
- $orderRentDifference = (int)$todayOrderRentNum - (int)$yesterdayOrderRentNum;
- $orderDifference += $orderRentDifference;
- $totalOrder['new_num'] = $todayOrderNum + $todayOrderRentNum;
- $totalOrder['total_num'] = $total + $totalOrderRent;
- if ($orderDifference < 0) {
- $totalOrder['diff'] = '1'; // 表示下降
- } elseif ($orderDifference === 0) {
- $totalOrder['diff'] = '2'; // 表示无变化
- } else {
- $totalOrder['diff'] = '3'; // 表示上升
- }
- $totalOrder['difference'] = abs($orderDifference);
- return $totalOrder;
- }
- /**
- * totalProfit 总收益数据统计
- *
- * @param string $area_id
- * @return array
- * @author Fx
- *
- */
- protected function totalProfit($area_id = '')
- {
- $totalProfit = [];
- $yesterday = Carbon::yesterday();
- $today = Carbon::today();
- $yesterdayProfit = Order::query();
- $todayProfit = Order::query();
- $total = Order::query();
- if (!empty($area_id)) {
- $yesterdayProfit = $yesterdayProfit->where('area_id', $area_id);
- $todayProfit = $todayProfit->where('area_id', $area_id);
- $total = $total->where('area_id', $area_id);
- }
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $yesterdayProfit = $yesterdayProfit->whereIn('area_id', $area_ids);
- $todayProfit = $todayProfit->whereIn('area_id', $area_ids);
- $total = $total->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
- $area_id = $area_id ?? 0;
- $yesterdayProfit = $yesterdayProfit->where('area_id', $area_id);
- $todayProfit = $todayProfit->where('area_id', $area_id);
- $total = $total->where('area_id', $area_id);
- }
- }
- // 昨日日收益
- $yesterdayProfit = $yesterdayProfit
- ->where('created_at', '>', $yesterday)
- ->where('created_at', '<', $today)
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->sum('pay_money');
- // 今日收益
- $todayProfit = $todayProfit
- ->where('created_at', '>', $today)
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->sum('pay_money');
- //总收益
- $total = $total
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->sum('pay_money');
- $profitDifference = (float)$todayProfit - (float)$yesterdayProfit;
- $totalProfit['total_num'] = $total;
- $totalProfit['today_num'] = (float)$todayProfit;
- if ($profitDifference < 0) {
- $totalProfit['diff'] = '1'; // 下降
- } elseif ($profitDifference > 0) {
- $totalProfit['diff'] = '3'; // 上升
- } else {
- $totalProfit['diff'] = '2'; // 上升
- }
- $totalProfit['difference'] = abs($profitDifference);
- return $totalProfit;
- }
- public function userPhoneChart(Request $request)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- //platform
- $platform = UserPhoneDetail::query();
- $userPhone = UserPhoneDetail::query();
- switch ($days) {
- case 'today':
- $param_days = Carbon::today();
- break;
- case 'threeDays':
- $param_days = Carbon::today()->subDays(3);
- break;
- case 'sevenDays':
- $param_days = Carbon::today()->subDays(7);
- break;
- case 'fifteenDays':
- $param_days = Carbon::today()->subDays(15);
- break;
- case 'thirtyDays':
- $param_days = Carbon::today()->subDays(30);
- break;
- case 'oneMonth':
- $param_days = Carbon::today()->subDays(30);
- break;
- case 'sixMonth':
- $param_days = Carbon::today()->subMonths(6);
- break;
- default:
- return $this->error('参数错误');
- }
- $platform = $platform->where('created_at', '>', $param_days)
- ->where('platform', '!=', 'devtools')
- ->groupBy(['platform'])
- ->select('platform', DB::raw('count(id) as value'))
- ->get()
- ->toArray();
- $userPhone = $userPhone->where('created_at', '>', $param_days)
- ->groupBy(['model'])
- ->select('model', DB::raw('count(id) as number'))
- ->orderByDesc('number')
- ->limit(10)
- ->get()
- ->toArray();
- $total = UserPhoneDetail::query()->count('id');
- if (!empty($platform)) {
- foreach ($platform as &$v) {
- // $v['percent'] = round($v['number'] / $total * 100 ,2) .'%';
- $v['name'] = $v['platform'];
- }
- }
- if (!empty($userPhone)) {
- foreach ($userPhone as &$i) {
- $i['percent'] = (float)number_format($i['number'] / $total * 100, 2);
- }
- }
- return $this->ok(['platform' => $platform, 'userPhone' => $userPhone, 'total' => $total]);
- dd($userPhone);
- }
- /**
- * heatMap 热力图
- *
- * @param OrderFilter $orderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function heatMap(OrderFilter $orderFilter)
- {
- $today = Carbon::today();
- $order = Order::query()->filter($orderFilter)->where('created_at', '>', $today)->get();
- $data1 = [];
- if (!empty($order)) {
- foreach ($order as $v) {
- $location = json_decode($v->start_use_bike_location);
- $data1[] = ['lat' => $location->latitude, 'lng' => $location->longitude, 'count' => 30];
- }
- }
- $data = $data1;
- return $this->ok($data);
- }
- }
|