1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162 |
- <?php
- namespace App\Http\Controllers\Admin;
- use App\Filters\AreaFilter;
- 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\Handlers\BikeStatusInfoSyncHandler;
- use App\Http\Resources\AreaResource;
- 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\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\Cache;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- class IndexOpenController extends Controller
- {
- protected $areaIds = [];
- public function __construct()
- {
- $admin_id = Admin::user()->id ?? '';
- if (!empty($admin_id)) {
- $this->areaIds = AdminUser::getAreaIdsByAdminId(Admin::user()->id);
- }
- }
- /**
- * 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);
- $bike = Bike::query()->whereIn('put_area_id', $this->areaIds);
- if (!empty($area_id)) {
- $bike = $bike->where('put_area_id', $area_id);
- }
- $bike_num = $bike->where('put_status', Bike::PUT_STATUS_YES)->count();
- $data['total_put_bikes'] = $bike_num;
- 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)->whereIn('put_area_id', $this->areaIds);
- $data['long_time_no_ridding'] = Bike::query()->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
- $data['long_time_no_return_ridding'] = Order::query()->filter($orderFilter)->whereIn('area_id', $this->areaIds);
- $long_time_no_return_ridding_order_rent = OrderRent::query()->filter($orderRentFilter)->whereIn('area_id', $this->areaIds);
- $data['trouble_num'] = Bike::query()->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
- $data['warning_num'] = WorkOrder::query()->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter)->whereIn('area_id', $this->areaIds);
- $admin_id = 1;
- 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('area_id', $area_id);
- // $data['long_time_no_ridding'] = $data['long_time_no_ridding']->where('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('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 profitPolygonalChart(Request $request, WalletLogFilter $walletLogFilter)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $profit = WalletLog::query()
- ->filter($walletLogFilter)
- ->whereIn('type', WalletLog::$addType);
- $admin_id = 1;
- 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;
- default:
- return $this->error('参数错误');
- }
- return $this->ok($profit);
- }
- /**
- * 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 = 1;
- 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);
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newUsers = $newUsers->where('created_at', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'threeDays':
- $threeDaysAgo = Carbon::today()->subDays(3);
- $newUsers = $newUsers->where('created_at', '>', $threeDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'sevenDays':
- $sevenDaysAgo = Carbon::today()->subDays(7);
- $newUsers = $newUsers->where('created_at', '>', $sevenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'fifteenDays':
- $fifteenDaysAgo = Carbon::today()->subDays(15);
- $newUsers = $newUsers->where('created_at', '>', $fifteenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- default:
- return $this->error('参数错误');
- }
- return $this->ok($newUsers);
- }
- /**
- * 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 = 1;
- 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,"%Y/%m/%d/%H") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'yesterday':
- $yesterday = Carbon::yesterday();
- $newOrders = $newOrders->where('created_at', '>', $yesterday)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'threeDays':
- $threeDaysAgo = Carbon::today()->subDays(3);
- $newOrders = $newOrders->where('created_at', '>', $threeDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'sevenDays':
- $sevenDaysAgo = Carbon::today()->subDays(7);
- $newOrders = $newOrders->where('created_at', '>', $sevenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'fifteenDays':
- $fifteenDaysAgo = Carbon::today()->subDays(15);
- $newOrders = $newOrders->where('created_at', '>', $fifteenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- default:
- return $this->error('参数错误');
- }
- return $this->ok($newOrders);
- }
- /**
- * newDayRentOrderChart 日租新订单统计图
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function newDayRentOrderChart(Request $request)
- {
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $newOrders = OrderRent::query()
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER);
- $admin_id = 1;
- 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('pay_time', '>', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'threeDays':
- $threeDaysAgo = Carbon::today()->subDays(3);
- $newOrders = $newOrders->where('pay_time', '>', $threeDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'sevenDays':
- $sevenDaysAgo = Carbon::today()->subDays(7);
- $newOrders = $newOrders->where('pay_time', '>', $sevenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- case 'fifteenDays':
- $fifteenDaysAgo = Carbon::today()->subDays(15);
- $newOrders = $newOrders->where('pay_time', '>', $fifteenDaysAgo)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get();
- break;
- default:
- return $this->error('参数错误');
- }
- return $this->ok($newOrders);
- }
- /**
- * 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 = 1;
- 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 = 1;
- 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 = 1;
- 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 = 1;
- 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 ($area_id != '') {
- // Log::info($area_id);
- $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
- $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
- $total = $total->where('area_id', $area_id);
- $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
- }
- $admin_id = 1;
- 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;
- // Log::info($total);
- // Log::info($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 = WalletLog::query();
- $todayProfit = WalletLog::query();
- $total = WalletLog::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 = 1;
- 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)
- ->whereIn('type', WalletLog::$addType)
- ->sum('money');
- // 今日收益
- $todayProfit = $todayProfit
- ->where('created_at', '>', $today)
- ->whereIn('type', WalletLog::$addType)
- ->sum('money');
- //总收益
- $total = $total
- ->whereIn('type', WalletLog::$addType)
- ->sum('money');
- $profitDifference = bcsub($todayProfit, $yesterdayProfit, 2);
- $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;
- }
- /**
- * heatMap 热力图
- *
- * @param OrderFilter $orderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function heatMap(OrderFilter $orderFilter)
- {
- $today = Carbon::today()->subMonth();
- $order = Order::query()->whereIn('area_id', $this->areaIds)->filter($orderFilter)->where('created_at', '>', $today)->get();
- $data1 = [];
- $data2 = [];
- if (!empty($order)) {
- foreach ($order as $v) {
- $location = json_decode($v->start_use_bike_location);
- $location2 = json_decode($v->end_use_bike_location);
- $data1[] = ['lat' => $location->latitude, 'lng' => $location->longitude, 'count' => 3];
- if (!empty($location2)) {
- $data2[] = ['lat' => $location2->latitude, 'lng' => $location2->longitude, 'count' => 3];
- }
- }
- }
- $data = [
- 'start' => $data1,
- 'end' => $data2
- ];
- return $this->ok($data);
- }
- /**
- * indexOpen 地图区域
- *
- * @param Request $request
- * @param AreaFilter $filter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function indexOpen(Request $request, AreaFilter $filter)
- {
- //
- $area = Area::query()
- ->filter($filter);
- //->orderByDesc('id');
- if (!Admin::isAdministrator()) {
- $admin_id = Admin::user()->id;
- $ids = AdminUser::getAreaIdsByAdminId($admin_id);
- $area = $area->whereIn('id', $ids);
- }
- $area = $request->get('all') ? $area->get() : $area->paginate();
- return $this->ok(AreaResource::collection($area));
- }
- /**
- * mapsOpen 地图车辆
- *
- * @param Request $request
- * @param BikeFilter $filter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function mapsOpen(Request $request, BikeFilter $filter)
- {
- //
- $admin_id = Admin::user()->id;
- $bike = Bike::query()->filter($filter)->orderByDesc('id');
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $bike = $bike->whereIn('put_area_id', $area_ids);
- } else {
- $area = AdminUserArea::query()->where('admin_id', $admin_id)->first();
- $area_id = $area->area_id ?? 0;
- $bike = $bike->where('put_area_id', $area_id);
- }
- }
- $bike = $bike->get();
- $data = [];
- foreach ($bike as $v) {
- $style = 1;
- if ($v->is_low_battery_power == Bike::BATTERY_POWER_LOW) {
- $style = 0;
- } elseif ($v->is_riding == Bike::RIDING_YES) {
- $style = 2;
- }
- $data[] = [
- 'lnglat' => $v->last_location ? [json_decode($v->last_location)->lng, json_decode($v->last_location)->lat] : [116.397546, 39.909153],
- 'name' => $v->bike_no,
- 'id' => $v->id,
- 'style' => $style
- ];
- }
- return $this->ok($data);
- // return $this->ok(BikeResource::collection($bike));
- }
- /**
- * statistics 简要统计信息
- *
- * @param BikeFilter $filter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function statisticsOpen(BikeFilter $filter)
- {
- $riding_yes_num = Bike::query()->filter($filter)->where('is_riding', Bike::RIDING_YES); //使用中的数量
- $riding_no_num = Bike::query()->filter($filter)->where('is_riding', Bike::RIDING_NO); //未使用的数量
- $low_power_num = Bike::query()->filter($filter)->where('is_low_battery_power', Bike::BATTERY_POWER_LOW); //低电量的数量
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $riding_yes_num = $riding_yes_num->whereIn('put_area_id', $area_ids);
- $riding_no_num = $riding_no_num->whereIn('put_area_id', $area_ids);
- $low_power_num = $low_power_num->whereIn('put_area_id', $area_ids);
- } else {
- $area = AdminUserArea::query()->where('admin_id', $admin_id)->first();
- $area_id = $area->area_id ?? 0;
- $riding_yes_num = $riding_yes_num->where('put_area_id', $area_id);
- $riding_no_num = $riding_no_num->where('put_area_id', $area_id);
- $low_power_num = $low_power_num->where('put_area_id', $area_id);
- }
- }
- $riding_yes_num = $riding_yes_num->count('id');
- $riding_no_num = $riding_no_num->count('id');
- $low_power_num = $low_power_num->count('id');
- $worker_riding_num = app()->redis->hkeys(BikeStatusInfoSyncHandler::REDIS_RIDE_BIKE_WORKER_ORDERS_TAG);
- $data = [
- 'riding_yes_num' => $riding_yes_num,
- 'riding_no_num' => $riding_no_num,
- 'low_power_num' => $low_power_num,
- 'worker_riding_num' => Bike::query()->filter($filter)->whereIn('bike_no', $worker_riding_num)->count('id')
- ];
- return $this->ok($data);
- }
- /**
- * acticveWxUserSattistics 小程序昨日活跃用户年龄统计
- *
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function acticveWxUserSattistics()
- {
- $yesterday = Carbon::yesterday()->format('Ymd');
- $last_month_yseterday = Carbon::yesterday()->subDays(29)->format('Ymd');
- $app = app('wechat.mini_program');
- $data = $app->data_cube->userPortrait($last_month_yseterday, $yesterday);
- $ages = $data['visit_uv']['ages'];
- $genders = $data['visit_uv']['genders'];
- return $this->ok(['ages' => $ages, 'genders' => $genders]);
- }
- /**
- * 前七天小时订单统计
- * @return \Illuminate\Http\JsonResponse
- * User: Mead
- */
- public function hourOrderNumber(Request $request, OrderFilter $filter)
- {
- $day = [
- ["num" => 0, "hour" => 0],
- ["num" => 0, "hour" => 1],
- ["num" => 0, "hour" => 2],
- ["num" => 0, "hour" => 3],
- ["num" => 0, "hour" => 4],
- ["num" => 0, "hour" => 5],
- ["num" => 0, "hour" => 6],
- ["num" => 0, "hour" => 7],
- ["num" => 0, "hour" => 8],
- ["num" => 0, "hour" => 9],
- ["num" => 0, "hour" => 10],
- ["num" => 0, "hour" => 11],
- ["num" => 0, "hour" => 12],
- ["num" => 0, "hour" => 13],
- ["num" => 0, "hour" => 14],
- ["num" => 0, "hour" => 15],
- ["num" => 0, "hour" => 16],
- ["num" => 0, "hour" => 17],
- ["num" => 0, "hour" => 18],
- ["num" => 0, "hour" => 19],
- ["num" => 0, "hour" => 20],
- ["num" => 0, "hour" => 21],
- ["num" => 0, "hour" => 22],
- ["num" => 0, "hour" => 23]
- ];
- $weeks = [];
- for ($i = 1, $c = 7; $i < 7; $i++, $c--) {
- $now = Carbon::parse("-{$i}day");
- $date = $now->toDateString();
- $key = "{$date}-hour-order-num";
- $area_id = $request->get('area_id') ?? '';
- if (!empty($area_id)) {
- $key = $key . '-area_id:' . $area_id;
- }
- $weeks["{$date}"] = Cache::remember($key, Carbon::parse("+{$c}day")->diffInMinutes(Carbon::now()), function () use ($date, $day, $filter) {
- return array_replace($day, Order::query()->filter($filter)->whereDate("created_at", $date)->whereIn('area_id', $this->areaIds)->select(DB::raw("count(*) as num,DATE_FORMAT(created_at,'%H') as hour"))->groupBy("hour")->get()->mapWithKeys(function ($item) {
- $arr = [
- 'num' => (integer)$item->num,
- 'hour' => (integer)$item->hour,
- ];
- return [(integer)$item->hour => $arr];
- })->toArray());
- });
- }
- $data = [
- 'date' => [],
- 'data' => []
- ];
- foreach ($weeks as $k => $v) {
- $data['date'][] = $k;
- $data['data'][$k] = [];
- foreach ($v as $value) {
- array_push($data['data'][$k], $value['num']);
- }
- }
- // dd($data);
- return $this->ok($data);
- }
- /**
- * recentMonthOrderProfit 近月新增订单收益
- *
- * @param OrderFilter $orderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function recentMonthOrderProfit(OrderFilter $orderFilter)
- {
- $recentMonth = Carbon::now()->subMonth();
- $order = Order::query()
- ->whereIn('area_id', $this->areaIds)
- ->filter($orderFilter)
- ->where('created_at', '>', $recentMonth)
- ->selectRaw('DATE_FORMAT(created_at,"%Y-%m-%d") as dateWeek,sum(pay_money) as value')
- ->groupBy('dateWeek')->get();
- //dd($order);
- return $this->ok($order);
- }
- /**
- * recentMonthAddUser 近月新增用户
- *
- * @param UserFilter $userFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function recentMonthAddUser(UserFilter $userFilter)
- {
- $recentMonth = Carbon::now()->subMonth();
- $order = User::query()
- ->whereIn('register_area_id', $this->areaIds)
- ->filter($userFilter)
- ->where('created_at', '>', $recentMonth)
- ->selectRaw('DATE_FORMAT(created_at,"%Y-%m-%d") as dateWeek,count(id) as value')
- ->groupBy('dateWeek')->get();
- //dd($order);
- return $this->ok($order);
- }
- }
|