12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172 |
- <?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\AdminMerchant;
- 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()->where(AdminMerchant::getMerchantWhere())->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()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
- $data['long_time_no_ridding'] = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
- $data['long_time_no_return_ridding'] = Order::query()->where(AdminMerchant::getMerchantWhere())->filter($orderFilter)->whereIn('area_id', $this->areaIds);
- $long_time_no_return_ridding_order_rent = OrderRent::query()->where(AdminMerchant::getMerchantWhere())->filter($orderRentFilter)->whereIn('area_id', $this->areaIds);
- $data['trouble_num'] = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
- $data['warning_num'] = WorkOrder::query()->where(AdminMerchant::getMerchantWhere())->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(AdminMerchant::getMerchantWhere())->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()
- ->where(AdminMerchant::getMerchantWhere())
- ->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(AdminMerchant::getMerchantWhere())
- ->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()
- ->where(AdminMerchant::getMerchantWhere())
- ->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(AdminMerchant::getMerchantWhere())
- ->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(AdminMerchant::getMerchantWhere())
- ->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(AdminMerchant::getMerchantWhere())
- ->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()->where(AdminMerchant::getMerchantWhere());
- $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()->where(AdminMerchant::getMerchantWhere());
- $todayNewUser = User::query()->where(AdminMerchant::getMerchantWhere());
- $total = User::query()->where(AdminMerchant::getMerchantWhere());
- 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()->where(AdminMerchant::getMerchantWhere());
- $todayOrderNum = Order::query()->where(AdminMerchant::getMerchantWhere());
- $total = Order::query()->where(AdminMerchant::getMerchantWhere());
- $yesterdayOrderRentNum = OrderRent::query()->where(AdminMerchant::getMerchantWhere());
- $todayOrderRentNum = OrderRent::query()->where(AdminMerchant::getMerchantWhere());
- $totalOrderRent = OrderRent::query()->where(AdminMerchant::getMerchantWhere());
- 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()->where(AdminMerchant::getMerchantWhere());
- $todayProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere());
- $total = WalletLog::query()->where(AdminMerchant::getMerchantWhere());
- 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()->where(AdminMerchant::getMerchantWhere())->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()
- ->where(AdminMerchant::getMerchantWhere())
- ->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()->where(AdminMerchant::getMerchantWhere())->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()->where(AdminMerchant::getMerchantWhere())->filter($filter)->where('is_riding', Bike::RIDING_YES); //使用中的数量
- $riding_no_num = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($filter)->where('is_riding', Bike::RIDING_NO); //未使用的数量
- $low_power_num = Bike::query()->where(AdminMerchant::getMerchantWhere())->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()
- ->where(AdminMerchant::getMerchantWhere())
- ->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()
- ->where(AdminMerchant::getMerchantWhere())
- ->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);
- }
- }
|