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