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); } }