id); if (count($area_ids) !== 0 && in_array($area_id, $area_ids)) { return false; } else { $id = AdminUserArea::query()->where('admin_id', Admin::user()->id)->value('area_id'); $id = $id ?? 0; if ($area_id == $id) return false; } return true; } /** * 商户列表 * @return \Illuminate\Http\JsonResponse * @author ht */ public function adminMerchantList() { $data = []; // 管理员可以获取商户列表 if (Admin::isAdministrator()) { // status 状态(1正常0暂停) $data = AdminMerchant::where('status', 1)->select(['id', 'username', 'name'])->get()->toArray(); } return $this->ok($data); } /** * 区域列表 - 依据所选商户获取对应区域 * * @param Request $request * @return \Illuminate\Http\JsonResponse * @author ht */ public function areaList(Request $request) { $admin_id = Admin::user()->id; if (Admin::user()->isRole(Admin::ROLE_JISHU_ADMIN)) { $merchant_id = $request->get('merchant_id') ?? 0; if ($merchant_id) { $data = Area::where('status', 1)->where('merchant_id', $merchant_id)->orderByDesc('id')->select(['id', 'name'])->get()->toArray(); } else { $data = Area::where('status', 1)->orderByDesc('id')->select(['id', 'name'])->get()->toArray(); } } else { $area_ids = AdminUser::getAreaIdsByAdminId($admin_id); $data = Area::whereIn('id', $area_ids)->where('status', 1)->orderByDesc('id')->select(['id', 'name'])->get()->toArray(); } return $this->ok($data); } /** * topIndex 头部统计数据 * * @param Request $request * @return \Illuminate\Http\JsonResponse * @author ht * */ public function topIndex(Request $request) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $merchant_id = $request->get('merchant_id') ?? ''; $data = []; $data['new_order'] = $this->newOrder($area_id, $merchant_id); // 新订单 $data['total_user'] = $this->totalUser($area_id, $merchant_id); // 总用户 $data['total_order'] = $this->totalOrder($area_id, $merchant_id); // 总订单 $data['total_profit'] = $this->totalProfitMonth($area_id, $merchant_id); // 总收益 - 统计本月 和 上月的总收益 $data['cumulative_profit'] = $this->cumulativeDeposit($area_id, $merchant_id); // 统计本月和上月的累计押金 return $this->ok($data); } /** * topIndex 头部统计数据 - 统计本月和上月的累计押金,注意本月的包含当天的累计押金 */ protected function cumulativeDeposit($area_id, $merchant_id) { $DepositOrder = DepositOrder::query(); if (!Admin::user()->inRoles([Admin::ROLE_JISHU_ADMIN])) { if ($merchant_id) { $DepositOrder->where('merchant_id', $merchant_id); } else { $DepositOrder->where(AdminMerchant::getMerchantWhere()); } } if ($area_id) { $DepositOrder->where('area_id', $area_id); } $currentMonth = $DepositOrder->where('is_refund', DepositOrder::REFUND_NO)->where('pay_status', DepositOrder::PAY_STATUS_OK)->whereDate('pay_time', '>=', Carbon::now()->firstOfMonth()->toDateString())->sum('money'); $data['cumulative_profit_num'] = floatval($currentMonth); return $data; } // topIndex 头部统计数据 - 新订单 protected function newOrder($area_id = '', $merchant_id = '') { $totalOrder = []; $yesterday = Carbon::yesterday(); $today = Carbon::today(); // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $yesterdayOrderNum = Order::query()->where('merchant_id', $merchant_id); $todayOrderNum = Order::query()->where('merchant_id', $merchant_id); $yesterdayOrderRentNum = OrderRent::query()->where('merchant_id', $merchant_id); $todayOrderRentNum = OrderRent::query()->where('merchant_id', $merchant_id); } else { $yesterdayOrderNum = Order::query()->where(AdminMerchant::getMerchantWhere()); $todayOrderNum = Order::query()->where(AdminMerchant::getMerchantWhere()); $yesterdayOrderRentNum = OrderRent::query()->where(AdminMerchant::getMerchantWhere()); $todayOrderRentNum = OrderRent::query()->where(AdminMerchant::getMerchantWhere()); } if (!empty($area_id)) { $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id); $todayOrderNum = $todayOrderNum->where('area_id', $area_id); $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id); $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id); } else { $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); $yesterdayOrderRentNum = $yesterdayOrderRentNum->whereIn('area_id', $area_ids); $todayOrderRentNum = $todayOrderRentNum->whereIn('area_id', $area_ids); } else { $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id'); $area_id = $area_id ?? 0; $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id); $todayOrderNum = $todayOrderNum->where('area_id', $area_id); $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id); $todayOrderRentNum = $todayOrderRentNum->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'); $orderDifference = (int)$todayOrderNum - (int)$yesterdayOrderNum; $orderRentDifference = (int)$todayOrderRentNum - (int)$yesterdayOrderRentNum; $orderDifference += $orderRentDifference; $totalOrder['new_num'] = $todayOrderNum + $todayOrderRentNum; if ($orderDifference < 0) { $totalOrder['diff'] = '1'; // 表示下降 } elseif ($orderDifference === 0) { $totalOrder['diff'] = '2'; // 表示无变化 } else { $totalOrder['diff'] = '3'; // 表示上升 } $totalOrder['difference'] = abs($orderDifference); return $totalOrder; } // topIndex 头部统计数据 - 总用户 protected function totalUser($area_id = '', $merchant_id = '') { $totalUser = []; $yesterday = Carbon::yesterday(); $today = Carbon::today(); // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $yesterdayNewUser = User::query()->where('merchant_id', $merchant_id); $todayNewUser = User::query()->where('merchant_id', $merchant_id); $total = User::query()->where('merchant_id', $merchant_id); } else { $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); } else { $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)->value('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'); //总用户数量 $totalUser['total_num'] = $total->count('id'); $userDifference = (int)$todayNewUser - (int)$yesterdayNewUser; if ($userDifference < 0) { $totalUser['diff'] = '1'; // 表示下降 } elseif ($userDifference === 0) { $totalUser['diff'] = '2'; // 表示无变化 } else { $totalUser['diff'] = '3'; // 表示上升 } $totalUser['difference'] = abs($userDifference); return $totalUser; } // topIndex 头部统计数据 - 总订单 protected function totalOrder($area_id = '', $merchant_id = '') { $totalOrder = []; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $total = Order::query()->where('merchant_id', $merchant_id); $totalOrderRent = OrderRent::query()->where('merchant_id', $merchant_id); } else { $total = Order::query()->where(AdminMerchant::getMerchantWhere()); $totalOrderRent = OrderRent::query()->where(AdminMerchant::getMerchantWhere()); } if (!empty($area_id)) { $total = $total->where('area_id', $area_id); $totalOrderRent = $totalOrderRent->where('area_id', $area_id); } else { $admin_id = Admin::user()->id; if (!Admin::isAdministrator()) { $area_ids = AdminUser::getAreaIdsByAdminId($admin_id); if (count($area_ids) !== 0) { $total = $total->whereIn('area_id', $area_ids); $totalOrderRent = $totalOrderRent->whereIn('area_id', $area_ids); } else { $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id'); $area_id = $area_id ?? 0; $total = $total->where('area_id', $area_id); $totalOrderRent = $totalOrderRent->where('area_id', $area_id); } } } // 总订单数 $total = $total->where('status', Order::STATUS_COMPLETE_ORDER)->count('id'); $totalOrderRent = $totalOrderRent->where('status', OrderRent::STATUS_COMPLETE_ORDER)->count('id'); $totalOrder['total_num'] = $total + $totalOrderRent; /** * 这个统计没有意义,新订单里已经有了,为了保持数据一致性,就默认写上这两个参数, * 后期前台可以屏蔽掉 - 同比昨日的显示 */ $totalOrder['diff'] = '2'; $totalOrder['difference'] = 0; return $totalOrder; } /** * topIndex 头部统计数据 - 总收益 - 今天收益 = 纯收益 + 骑行卡 * profitChart 总收益趋势 - 总收益 - 今天收益 = 纯收益 + 骑行卡 */ protected function todayProfit($area_id = '', $merchant_id = '', $type = 'top') { $totalProfit = 0; // 管理员,并且选择了商户 if ($merchant_id) { $walletLogProfit = WalletLog::query()->where('merchant_id', $merchant_id); $changeProfit = WalletLog::query()->where('merchant_id', $merchant_id); $cardRidingOrdersProfit = CardRidingOrder::query()->where('merchant_id', $merchant_id); } else { if (Admin::isAdministrator()) { $walletLogProfit = WalletLog::query(); $changeProfit = WalletLog::query(); $cardRidingOrdersProfit = CardRidingOrder::query(); } else { $walletLogProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere()); $changeProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere()); $cardRidingOrdersProfit = CardRidingOrder::query()->where(AdminMerchant::getMerchantWhere()); } } if (!empty($area_id)) { $walletLogProfit = $walletLogProfit->where('area_id', $area_id); $changeProfit = $changeProfit->where('area_id', $area_id); $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id); } else { $admin_id = Admin::user()->id; if (!Admin::isAdministrator()) { $area_ids = AdminUser::getAreaIdsByAdminId($admin_id); if (count($area_ids) !== 0) { $walletLogProfit = $walletLogProfit->whereIn('area_id', $area_ids); $changeProfit = $changeProfit->whereIn('area_id', $area_ids); $cardRidingOrdersProfit = $cardRidingOrdersProfit->whereIn('area_id', $area_ids); } else { $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id'); $area_id = $area_id ?? 0; $walletLogProfit = $walletLogProfit->where('area_id', $area_id); $changeProfit = $changeProfit->where('area_id', $area_id); $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id); } } } // $walletLogProfit; $walletLogProfit // ->whereIn('type', WalletLog::$subType) // 交易类型 - subType 存收益 ->whereIn('type', WalletLog::$statisticsType) ->where('status', WalletLog::STATUS_OK); // 数据状态 - 有效 $cardRidingOrdersProfit = $cardRidingOrdersProfit ->where('pay_type', CardRidingOrder::PAY_TYPE_WECHAT) // 支付方式 - 微信支付 ->where('pay_status', CardRidingOrder::PAY_STATUS_OK) // 支付状态 - 支付成功 ->where('status', CardRidingOrder::STATUS_OK); // 订单状态 - 成功 if ($type == 'top') { // topIndex 头部统计数据 // 纯收益 // $walletLogProfitMoney = 0; $walletLogProfitMoney = $walletLogProfit ->where('created_at', '>=', Carbon::today()) ->select(['area_id', 'money'])->sum('money'); // foreach ($walletLogProfitData as $wv) { // // 加上充值收益 // $total_money_all = WalletLog::query() // ->where('created_at', '>=', Carbon::today()) // ->where('type', WalletLog::TYPE_ADD_WECHAT_TO_WALLET) // ->where('area_id', $wv['area_id']) // ->select(DB::raw('CAST(SUM(money) as DECIMAL(18,2)) as money_all'))->value('money_all'); // $total_money_all = bcsub(0, $total_money_all, 2); // $wv['money'] = bcadd($wv['money'], $total_money_all, 2); // $change_money = $changeProfit->where('area_id', $area_id)->where('created_at', '>=', Carbon::today())->where('type', WalletLog::TYPE_ADD_WECHAT_TO_WALLET)->sum('money'); $walletLogProfitMoney = bcadd($walletLogProfitMoney, $change_money, 2); // } // 骑行卡总收益 $cardRidingOrdersProfitMoney = 0; $cardRidingOrdersProfitData = $cardRidingOrdersProfit ->where('pay_time', '>=', Carbon::today())->select('pay_money')->get()->toArray(); // ->sum('pay_money'); foreach ($cardRidingOrdersProfitData as $cv) { $cardRidingOrdersProfitMoney = bcadd($cardRidingOrdersProfitMoney, $cv['pay_money']); } $w = $walletLogProfitMoney ? abs($walletLogProfitMoney) : 0; $c = $cardRidingOrdersProfitMoney ? abs($cardRidingOrdersProfitMoney) : 0; $totalProfit = bcadd($w, $c, 2); return $totalProfit; } else { // profitChart 总收益趋势 $data = []; // 口袋钱包纯收益 $da = $this->buildDate($walletLogProfit, 'created_at', 'money'); $da3 = $this->buildDate($cardRidingOrdersProfit); $data = []; foreach ($da as $k => $v) { foreach ($da3 as $k3 => $v3) { if ($k == $k3) { $m = bcadd($v, $v3, 2); $data[$k] = $m; } } if (!isset($data[$k])) { $data[$k] = $v['value']; } } return $data; } } /** * topIndex 头部统计数据 * 总收益 - 统计本月 和 上月的总收益 总收益 + 骑行卡 * 本月总收益包含当天收益(纯收益+骑行卡收益) */ protected function totalProfitMonth($area_id = 0, $merchant_id = 0) { $WalletLog = WalletLog::query(); if (!Admin::user()->inRoles([Admin::ROLE_JISHU_ADMIN])) { if ($merchant_id) { $WalletLog->where('merchant_id', $merchant_id); } else { $WalletLog->where(AdminMerchant::getMerchantWhere()); } } if ($area_id) { $WalletLog->where('area_id', $area_id); } $money = $WalletLog->whereDate('created_at', '>=', Carbon::now()->firstOfMonth()->toDateString())->whereIn('type', WalletLog::$subType)->sum('money'); $totalProfit['total_num'] = abs($money); return $totalProfit; } /** * todoEvent 待办事项 统计数据 * * @param Request $request * @param BikeFilter $bikeFilter * @param OrderFilter $orderFilter * @param OrderRentFilter $orderRentFilter * @param WorkOrderFilter $workOrderFilter * @return \Illuminate\Http\JsonResponse * @author ht * */ public function todoEvent(Request $request, BikeFilter $bikeFilter, OrderFilter $orderFilter, OrderRentFilter $orderRentFilter, WorkOrderFilter $workOrderFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $merchant_id = $request->get('merchant_id') ?? ''; $data = []; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $data['low_battery_num'] = Bike::query()->where('merchant_id', $merchant_id)->filter($bikeFilter); $data['current_cycling_num'] = Order::query()->where('merchant_id', $merchant_id)->filter($orderFilter); $current_cycling_num_order_rent = OrderRent::query()->where('merchant_id', $merchant_id)->filter($orderRentFilter); $data['long_time_no_return_ridding'] = Order::query()->where('merchant_id', $merchant_id)->filter($orderFilter); $long_time_no_return_ridding_order_rent = OrderRent::query()->where('merchant_id', $merchant_id)->filter($orderRentFilter); $data['trouble_num'] = Bike::query()->where('merchant_id', $merchant_id)->filter($bikeFilter); $data['warning_num'] = WorkOrder::query()->where('merchant_id', $merchant_id)->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter); } else { $data['low_battery_num'] = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter); $data['current_cycling_num'] = Order::query()->where(AdminMerchant::getMerchantWhere())->filter($orderFilter); $current_cycling_num_order_rent = OrderRent::query()->where(AdminMerchant::getMerchantWhere())->filter($orderRentFilter); $data['long_time_no_return_ridding'] = Order::query()->where(AdminMerchant::getMerchantWhere())->filter($orderFilter); $long_time_no_return_ridding_order_rent = OrderRent::query()->where(AdminMerchant::getMerchantWhere())->filter($orderRentFilter); $data['trouble_num'] = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter); $data['warning_num'] = WorkOrder::query()->where(AdminMerchant::getMerchantWhere())->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter); } if (!empty($area_id)) { $data['low_battery_num'] = $data['low_battery_num']->where('put_area_id', $area_id); $data['current_cycling_num'] = $data['current_cycling_num']->where('area_id', $area_id); $current_cycling_num_order_rent = $current_cycling_num_order_rent->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('put_area_id', $area_id); $data['warning_num'] = $data['warning_num']->where('area_id', $area_id); } else { $admin_id = Admin::user()->id; if (!Admin::isAdministrator()) { $area_ids = AdminUser::getAreaIdsByAdminId($admin_id); if (count($area_ids) !== 0) { $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids); $data['current_cycling_num'] = $data['current_cycling_num']->whereIn('area_id', $area_ids); $current_cycling_num_order_rent = $current_cycling_num_order_rent->whereIn('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)->value('area_id'); $area_id = $area_id ?? 0; $data['low_battery_num'] = $data['low_battery_num']->where('put_area_id', $area_id); $data['current_cycling_num'] = $data['current_cycling_num']->where('area_id', $area_id); $current_cycling_num_order_rent = $current_cycling_num_order_rent->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('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) // 低电量 ->where('put_status', Bike::PUT_STATUS_YES) // 投放成功 ->count('id'); // 当前骑行车辆 $data['current_cycling_num'] = $data['current_cycling_num'] ->whereIn('status', [Order::STATUS_PAUSE_BIKE, Order::STATUS_RIDE_BIKE]) // 临时停车中 和 骑行中 ->count('id'); $current_cycling_num_order_rent = $current_cycling_num_order_rent ->where('status', OrderRent::STATUS_RENT_BIKE) // 租车中 ->count('id'); $data['current_cycling_num'] += $current_cycling_num_order_rent; // 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'); return $this->ok($data); } /** * profitChart 总收益趋势 * * @param Request $request * @param OrderFilter $orderFilter * @param RechargeOrderFilter $rechargeOrderFilter * @param CardRidingOrderFilter $cardRidingOrderFilter * @param DepositCardOrderFilter $depositCardOrderFilter * @param StatisticFilter $statisticFilter * @return \Illuminate\Http\JsonResponse * @author ht * */ public function profitChart(Request $request, OrderFilter $orderFilter, RechargeOrderFilter $rechargeOrderFilter, CardRidingOrderFilter $cardRidingOrderFilter, DepositCardOrderFilter $depositCardOrderFilter, StatisticFilter $statisticFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误'); $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $ordersChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where('merchant_id', $merchant_id)); $ordersDispatchMoneyChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where('merchant_id', $merchant_id), 'dispatch_money'); $rechargeOrdersChart = $this->profitPolygonalChart($request, $rechargeOrderFilter, RechargeOrder::query()->where('merchant_id', $merchant_id)); $cardRidingOrdersChart = $this->profitPolygonalChart($request, $cardRidingOrderFilter, CardRidingOrder::query()->where('merchant_id', $merchant_id)); $depositCardOrdersChart = $this->profitPolygonalChart($request, $depositCardOrderFilter, DepositCardOrder::query()->where('merchant_id', $merchant_id)); $depositChart = $this->depositChart($request); } else { $ordersChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where(AdminMerchant::getMerchantWhere())); $ordersDispatchMoneyChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where(AdminMerchant::getMerchantWhere()), 'dispatch_money'); $rechargeOrdersChart = $this->profitPolygonalChart($request, $rechargeOrderFilter, RechargeOrder::query()->where(AdminMerchant::getMerchantWhere())); $cardRidingOrdersChart = $this->profitPolygonalChart($request, $cardRidingOrderFilter, CardRidingOrder::query()->where(AdminMerchant::getMerchantWhere())); $depositCardOrdersChart = $this->profitPolygonalChart($request, $depositCardOrderFilter, DepositCardOrder::query()->where(AdminMerchant::getMerchantWhere())); $depositChart = $this->depositChart($request); } // 总收益 - 避免重复统计,这里计算只统计 口袋钱包纯收益 $total = $this->totalProfitChart($request); $bikeDailyAverageChart = $this->bikeDailyAverage($request, $statisticFilter); return $this->ok([ [ 'name' => '普通订单收益', 'data' => $ordersChart ], [ 'name' => '普通订单调度费收益', 'data' => $ordersDispatchMoneyChart ], [ 'name' => '充值收益', 'data' => $rechargeOrdersChart ], [ 'name' => '骑行卡收益', 'data' => $cardRidingOrdersChart ], [ 'name' => '免押金卡收益', 'data' => $depositCardOrdersChart ], [ 'name' => '总收益', 'data' => $total ], [ 'name' => '日均车收益', 'data' => $bikeDailyAverageChart ], [ 'name' => '押金收益', 'data' => $depositChart ] ]); } // profitChart 总收益趋势 - 押金收益(净押金) - 今天的押金收益(净收益) = 总押金 - 退回押金 private function todayDeposit($area_id, $merchant_id, $type = '') { $DepositOrder = DepositOrder::query(); if (!Admin::user()->inRoles([Admin::ROLE_JISHU_ADMIN])) { if ($merchant_id) { $DepositOrder->where('merchant_id', $merchant_id); } else { $DepositOrder->where(AdminMerchant::getMerchantWhere()); } } if ($area_id) { $DepositOrder->where('area_id', $area_id); } $currentDayMoney = $DepositOrder->where('is_refund', DepositOrder::REFUND_NO)->where('pay_status', DepositOrder::PAY_STATUS_OK)->whereDate('pay_time', '>=', Carbon::now()->toDateString())->sum('money'); $total = $currentDayMoney; $data[Carbon::now()->toDateString()] = $total; return ($type == 'total') ? $total : $data; } /** * profitChart 总收益趋势 - 押金收益(净押金) * 押金统计查询统计表,注意今天的押金统计是每小时统计的,直接查询数据表 * 押金统计,筛选条件大于今天的时候,把今天的也包含进去 */ public function depositChart($request) { $days = $request->get('days') ?? ''; $area_id = $request->get('area_id') ?? ''; $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator()) { if ($merchant_id) { $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_DEPOSIT_STATIC); } else { $newOrders = Statistic::query()->where('slug', Statistic::SLUG_DEPOSIT_STATIC); } } else { $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_DEPOSIT_STATIC); } if (!empty($area_id)) { $newOrders = $newOrders->where('area_id', $area_id); } else { // 平台的是 9999 商户的是 0 if (Admin::isAdministrator()) { $newOrders = $newOrders->where('area_id', config('statistic.all')); } else { $newOrders = $newOrders->where('area_id', 0); } } switch ($days) { case 'today': // 因为今天的是统计每个小时的押金数据,直接查询押金表即可 $newOrdersKeyVal = $this->todayDeposit($area_id, $merchant_id); // 为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' => bcadd($value, 0, 2)]; } 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)->format('Y-m-d'); // 赋值一个值为0得数组 $arr = []; for ($i; $i >= 0; $i--) { $str = Carbon::today()->subDays($i)->format('Y/m/d'); $arr[$str] = 0; } // 有数据得数组 $newOrders = $newOrders->where('date', '>=', $paramDays) ->selectRaw("DATE_FORMAT(date,'%Y/%m/%d') as date,body") ->get()->toArray(); $newOrdersKeyVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { $body = json_decode($v['body'], true); $money_all = isset($body['money_all']) ? $body['money_all'] : 0; $money_refund_all = isset($body['money_refund_all']) ? $body['money_refund_all'] : 0; $val = bcsub($money_all, $money_refund_all, 2); if (isset($newOrdersKeyVal[$v['date']])) { $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2); } else { $newOrdersKeyVal[$v['date']] = $val; } } } // 合并覆盖0 $merge = array_merge($arr, $newOrdersKeyVal); // 重组结构 $data = []; foreach ($merge as $ks => $vs) { $data[] = ['date' => $ks, 'value' => bcadd($vs, 0, 2)]; } // 包含今天的统计 $total = $this->todayDeposit($area_id, $merchant_id, 'total'); $data[sizeof($data) - 1]['value'] = bcadd($total, 0, 2); } return $data; } // profitChart 总收益趋势- [普通订单收益,普通订单调度费收益,充值收益,骑行卡收益,免押金卡收益] 统计数据 public function profitPolygonalChart($request, $filter, $model, $money = 'pay_money') { $area_id = $request->get('area_id') ?? ''; $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); $newOrders = $model->filter($filter)->where('pay_status', 1); // 支付状态 1 已支付 if (!empty($area_id)) { $newOrders = $newOrders->where('area_id', $area_id); } else { $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)->value('area_id'); $area_id = $area_id ?? 0; $newOrders = $newOrders->where('area_id', $area_id); } } } // 去掉余额支付 $newOrders = $newOrders->where('pay_type', 1); switch ($days) { case 'today': $today = Carbon::today(); $newOrders = $newOrders->where('pay_time', '>=', $today) // ->selectRaw("DATE_FORMAT(pay_time,'%m-%d %H:00') as date,sum($money) as value") ->selectRaw("DATE_FORMAT(pay_time,'%m-%d %H:00') as date,CAST(SUM($money) as DECIMAL(18,2)) 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('pay_time', '>=', $paramDays) ->selectRaw("DATE_FORMAT(pay_time,'%Y/%m/%d') as date,CAST(SUM($money) as DECIMAL(18,2)) 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 $data; } /** * profitChart 总收益趋势 * 总收益统计查询统计表,注意今天的押金统计是每小时统计的,直接查询数据表 * 总收益统计,筛选条件大于今天的时候,把今天的也包含进去 */ protected function totalProfitChart($request) { $area_id = $request->get('area_id') ?? ''; $days = $request->get('days') ?? ''; $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator()) { if ($merchant_id) { $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_PROFIT_STATIC); } else { $newOrders = Statistic::query()->where('slug', Statistic::SLUG_PROFIT_STATIC); } } else { $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_PROFIT_STATIC); } if (!empty($area_id)) { $newOrders = $newOrders->where('area_id', $area_id); } else { // 平台的是 9999 商户的是 0 if (Admin::isAdministrator()) { $newOrders = $newOrders->where('area_id', config('statistic.all')); } else { $newOrders = $newOrders->where('area_id', 0); } } switch ($days) { case 'today': // 因为今天的是统计每个小时的总数据,直接查询数据表即可 $newOrdersKeyVal = $this->todayProfit($area_id, $merchant_id, 'all'); // 为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' => bcadd($value, 0, 2)]; } 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)->toDateString(); // 赋值一个值为0得数组 $arr = []; for ($i; $i >= 0; $i--) { $str = Carbon::today()->subDays($i)->format('Y/m/d'); $arr[$str] = 0; } // 有数据得数组 $newOrders = $newOrders->whereDate('date', '>=', $paramDays)->get()->toArray(); $newOrdersKeyVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { $body = json_decode($v['body'], true); $profit = isset($body['profit']) ? $body['profit'] : 0; $card_profit = isset($body['card_profit']) ? $body['card_profit'] : 0; $val = bcadd($profit, $card_profit, 2); $day = Carbon::parse($v['date'])->format("Y/m/d"); if (isset($newOrdersKeyVal[$v['date']])) { $arr[$day] = bcadd($newOrdersKeyVal[$v['date']], $val, 2); // $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2); } else { $arr[$day] = $val; // $newOrdersKeyVal[$v['date']] = $val; } } } // dd($arr); // 合并覆盖0 // $merge = array_merge($arr, $newOrdersKeyVal); // 重组结构 $data = []; foreach ($arr as $ks => $vs) { $data[] = ['date' => $ks, 'value' => bcadd($vs, 0, 2)]; } // 包含今天的统计 $total = $this->todayProfit($area_id, $merchant_id, 'top'); $data[sizeof($data) - 1]['value'] = bcadd($total, 0, 2); } return $data; } // profitChart 总收益趋势 以特定的格式统计数据 private function buildDate($newOrders, $time = 'pay_time', $money = 'pay_money') { $newOrdersTotal = $newOrders; $today = Carbon::today(); $newOrders = $newOrders->where($time, '>=', $today) ->selectRaw("DATE_FORMAT($time,'%m-%d %H:00') as date,CAST(SUM($money) as DECIMAL(18,2)) as value") ->groupBy('date')->get()->toArray(); // 有数据得数组 $newOrdersKeyVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { if ($time == 'created_at' && $money == 'pay_money') { // 加上充值收益 $total_money_all = $newOrdersTotal ->where('created_at', '>=', $today) ->where('type', WalletLog::TYPE_ADD_WECHAT_TO_WALLET) ->select(DB::raw('CAST(SUM(money) as DECIMAL(18,2)) as money_all'))->value('money_all'); $total_money_all = bcsub(0, $total_money_all, 2); $v['value'] = bcadd($v['value'], $total_money_all, 2); } $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); return $merge; } // profitChart 总收益趋势 日均车收益 private function bikeDailyAverage($request, $statisticFilter) { $area_id = $request->get('area_id') ?? ''; $days = $request->get('days') ?? ''; $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator()) { if ($merchant_id) { $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->filter($statisticFilter); } else { $newOrders = Statistic::query()->where('merchant_id', 0)->filter($statisticFilter); } } else { $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->filter($statisticFilter); } if (!empty($area_id)) { $newOrders = $newOrders->where('area_id', $area_id); } else { // 平台的是 9999 商户的是 0 if (Admin::isAdministrator()) { $newOrders = $newOrders->where('area_id', config('statistic.all')); } else { $newOrders = $newOrders->where('area_id', 0); } } switch ($days) { case 'today': return []; 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('date', '>=', $paramDays) ->where('slug', Statistic::SLUG_PROFIT_STATIC) ->select(['date', 'body']) ->orderByDesc('date') ->get() ->toArray(); $newOrdersKeyVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { $profit_statistics_arr = object_array(json_decode($v['body'], true)); $profit_arr_statistics['profit'] = $profit_statistics_arr['profit'] ?? 0; $profit_arr_statistics['put_bikes'] = $profit_statistics_arr['put_bikes'] ?? 0; if ($profit_arr_statistics['put_bikes'] == 0) { $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = 0; } else { // $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = number_format($profit_arr_statistics['profit'] / $profit_arr_statistics['put_bikes'], 2); $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = bcdiv($profit_arr_statistics['profit'], $profit_arr_statistics['put_bikes'], 2); } } } // 合并覆盖 $merge = array_merge($arr, $newOrdersKeyVal); // 重组结构 $data = []; foreach ($merge as $ks => $vs) { $data[] = ['date' => $ks, 'value' => $vs]; } } return $data; } /** * newUsersChart 新用户增长趋势 * @param Request $request * @param UserFilter $userFilter * @return \Illuminate\Http\JsonResponse * @author ht */ public function newUsersChart(Request $request, UserFilter $userFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误'); $usersChart = $this->usersChart($request, $userFilter); $usersChartDepositCard = $this->usersChart($request, $userFilter, true, User::DEPOSIT_CARD); // 免押金卡 $usersChartDepositMoney = $this->usersChart($request, $userFilter, true, User::DEPOSIT_MONEY); // 缴纳押金 return $this->ok([ ['name' => '每日增长用户数', 'data' => $usersChart], ['name' => '每日增长用户(押金卡)', 'data' => $usersChartDepositCard], ['name' => '每日增长用户(缴纳押金)', 'data' => $usersChartDepositMoney] ]); } // 新用户增长趋势 统计数据 public function usersChart($request, $userFilter, $deposit = false, $deposit_type = User::DEPOSIT_MONEY) { $area_id = $request->get('area_id') ?? ''; $days = $request->get('days') ?? ''; $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $newUsers = User::query() ->where('merchant_id', $merchant_id) ->filter($userFilter) ->where('is_bind_mobile', User::BIND_MOBILE_OK); // 认证状态 - 已实名认证 } else { $newUsers = User::query() ->where(AdminMerchant::getMerchantWhere()) ->filter($userFilter) ->where('is_bind_mobile', User::BIND_MOBILE_OK); // 认证状态 - 已实名认证 } if ($deposit) { $newUsers = $newUsers->where('deposit_type', $deposit_type);// 免押金卡 或 缴纳押金 } if ($area_id) { $newUsers = $newUsers->where('register_area_id', $area_id); } else { $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)->value('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 $data; } /** * newOrderChart 新订单趋势 - 普通订单 * @param Request $request * @param OrderFilter $orderFilter * @return \Illuminate\Http\JsonResponse * @author ht */ public function newOrderChart(Request $request, OrderFilter $orderFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误'); $newOrderChart = $this->orderChart($request, $orderFilter); $dispatchMoneyNewOrderChart = $this->orderChart($request, $orderFilter, true); return $this->ok([ ['name' => '总订单数', 'data' => $newOrderChart], ['name' => '有调度费的订单数', 'data' => $dispatchMoneyNewOrderChart] ]); } // 新订单趋势 统计数据 - 普通订单 public function orderChart($request, $orderFilter, $dispatch_money = false) { $area_id = $request->get('area_id') ?? ''; $days = $request->get('days') ?? ''; $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $newOrders = Order::query() ->where('merchant_id', $merchant_id) ->filter($orderFilter) ->where('status', Order::STATUS_COMPLETE_ORDER); // 订单完成 } else { $newOrders = Order::query() ->where(AdminMerchant::getMerchantWhere()) ->filter($orderFilter) ->where('status', Order::STATUS_COMPLETE_ORDER); // 订单完成 } if ($dispatch_money) { $newOrders = $newOrders->where('dispatch_money', '>', 0); // 有调度费 } if ($area_id) { $newOrders = $newOrders->where('area_id', $area_id); } else { $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)->value('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 []; } 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 $data; } /** * newOrderChart 新订单趋势 - 日租订单 * @param Request $request * @param OrderRentFilter $orderRentFilter * @return \Illuminate\Http\JsonResponse * @author ht */ public function newDayRentOrderChart(Request $request, OrderRentFilter $orderRentFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误'); $newOrderChart = $this->dayRentOrderChart($request, $orderRentFilter); $dispatchMoneyNewOrderChart = $this->dayRentOrderChart($request, $orderRentFilter, true); return $this->ok([ ['name' => '新增日租订单', 'data' => $newOrderChart], ['name' => '新增日租订单(调度费大于0)', 'data' => $dispatchMoneyNewOrderChart] ]); } // 新订单趋势 统计数据 - 日租订单 public function dayRentOrderChart($request, $orderRentFilter, $dispatch_money = false) { $area_id = $request->get('area_id') ?? ''; $days = $request->get('days') ?? ''; $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $newOrders = OrderRent::query() ->where('merchant_id', $merchant_id) ->filter($orderRentFilter) ->where('status', OrderRent::STATUS_COMPLETE_ORDER); // 已完成 } else { $newOrders = OrderRent::query() ->where(AdminMerchant::getMerchantWhere()) ->filter($orderRentFilter) ->where('status', OrderRent::STATUS_COMPLETE_ORDER); // 已完成 } if ($dispatch_money) { $newOrders = $newOrders->where('dispatch_money', '>', 0); // 有调度费 } if ($area_id) { $newOrders = $newOrders->where('area_id', $area_id); } else { $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)->value('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 []; } 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 $data; } /** * riddingRanking 骑行排行榜 - 普通订单 * @param Request $request * @param OrderFilter $orderFilter * @return \Illuminate\Http\JsonResponse * @author ht */ public function riddingRanking(Request $request, OrderFilter $orderFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'sevenDays', 'oneMonth', 'sixMonth'])) return $this->error('参数错误'); $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $order = Order::query() ->where('merchant_id', $merchant_id) ->filter($orderFilter) ->where('status', Order::STATUS_COMPLETE_ORDER) // 订单完成 ->with(['users']); } else { $order = Order::query() ->where(AdminMerchant::getMerchantWhere()) ->filter($orderFilter) ->where('status', Order::STATUS_COMPLETE_ORDER) // 订单完成 ->with(['users']); } if ($area_id) { $order = $order->where('area_id', $area_id); } else { $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)->value('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); $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 * @param OrderRentFilter $orderRentFilter * @return \Illuminate\Http\JsonResponse * @author ht */ public function riddingRankingByDayRentOrder(Request $request, OrderRentFilter $orderRentFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'sevenDays', 'oneMonth', 'sixMonth'])) return $this->error('参数错误'); $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $order = OrderRent::query() ->where('merchant_id', $merchant_id) ->filter($orderRentFilter) ->where('status', OrderRent::STATUS_COMPLETE_ORDER) // 已完成 ->with(['users']); } else { $order = OrderRent::query() ->where(AdminMerchant::getMerchantWhere()) ->filter($orderRentFilter) ->where('status', OrderRent::STATUS_COMPLETE_ORDER) // 已完成 ->with(['users']); } if ($area_id) { $order = $order->where('area_id', $area_id); } else { $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)->value('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 []; } $order = $order ->groupBy(['user_id']) ->select('user_id', DB::raw('count(id) as total_num')) ->orderByDesc('total_num') ->get() ->take(10); 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); } /** * userPhoneChart 手机统计 * @param Request $request * @return \Illuminate\Http\JsonResponse * @author ht */ public function userPhoneChart(Request $request) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少参数'); if (!in_array($days, ['today', 'sevenDays', 'oneMonth', 'sixMonth'])) return $this->error('参数错误'); $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { //platform 系统平台 [ios,android] $platform = UserPhoneDetail::query()->where('merchant_id', $merchant_id); $userPhone = UserPhoneDetail::query()->where('merchant_id', $merchant_id); } else { //platform 系统平台 [ios,android] $platform = UserPhoneDetail::query()->where(AdminMerchant::getMerchantWhere()); $userPhone = UserPhoneDetail::query()->where(AdminMerchant::getMerchantWhere()); } if (!empty($area_id)) { $platform = $platform->whereHas('user', function ($q) use ($area_id) { $q->where('register_area_id', $area_id); }); $userPhone = $userPhone->whereHas('user', function ($q) use ($area_id) { $q->where('register_area_id', $area_id); }); } else { $admin_id = Admin::user()->id; if (!Admin::isAdministrator()) { $area_ids = AdminUser::getAreaIdsByAdminId($admin_id); if (count($area_ids) !== 0) { $platform = $platform->whereHas('user', function ($q) use ($area_ids) { $q->whereIn('register_area_id', $area_ids); }); $userPhone = $userPhone->whereHas('user', function ($q) use ($area_ids) { $q->whereIn('register_area_id', $area_ids); }); } else { $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id'); $area_id = $area_id ?? 0; $platform = $platform->whereHas('user', function ($q) use ($area_id) { $q->where('register_area_id', $area_id); }); $userPhone = $userPhone->whereHas('user', function ($q) use ($area_id) { $q->where('register_area_id', $area_id); }); } } } 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 []; } // 饼图 $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()->where(AdminMerchant::getMerchantWhere())->count('id'); if (!empty($platform)) { foreach ($platform as &$v) { $v['name'] = $v['platform']; } } if (!empty($userPhone)) { foreach ($userPhone as &$i) { // $i['percent'] = (float)number_format($i['number'] / $total * 100, 2); $i['percent'] = bcmul(bcdiv($i['number'], $total, 2), 100, 2); } } return $this->ok(['platform' => $platform, 'userPhone' => $userPhone, 'total' => $total]); } /** * bikeProfitRanking 车辆收益排行榜 * * @param Request $request * @param BikeFilter $bikeFilter * @return \Illuminate\Http\JsonResponse * @author ht */ public function bikeProfitRanking(Request $request, BikeFilter $bikeFilter) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $merchant_id = $request->get('merchant_id') ?? ''; // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $bikes = Bike::query()->where('merchant_id', $merchant_id)->filter($bikeFilter); } else { $bikes = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter); } if ($area_id) { $bikes = $bikes->where('put_area_id', $area_id); } else { $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)->value('area_id'); $area_id = $area_id ?? 0; $bikes = $bikes->where('put_area_id', $area_id); } } } /** * todo * 这里可以优化 * 因为是按照车辆日均收益进行排序的,而数据表里没有日均收益, * 所以要全查询之后通过计算得出日均收益,再按照日均收益结果排序取前10条 * 但是这样的话有一个性能问题,数据表数量越大越影响性能, * 所以目前先验证一下当前商户查询的数量是否大于一个值1500,大于的就按照总金额查询,这个数据不是很准确 * * 优化思路:添加一个字段,用来存放日均收益,在统计总收益的时候,可以把日均收益也顺手统计一下 */ if ($bikes->count() > 1500) { $bikes = $bikes->orderByDesc('total_money')->limit(10)->get(); } else { $bikes = $bikes->get(); } $data = []; if (count($bikes) === 0) return $this->ok($data); foreach ($bikes as $k => $v) { // total_money_time 车辆总收入起始时间 $bike_insert_time = $v->total_money_time ? date('Y-m-d H:i:s', strtotime($v->total_money_time)) : 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 = sprintf("%.2f", substr(sprintf("%.3f", ($v->total_money / $days)), 0, -2)); $per_money = bcdiv($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); } /** * shareOutBonus 分红统计 * * @param Request $request * @return \Illuminate\Http\JsonResponse * @author ht */ public function shareOutBonus(Request $request) { $area_id = $request->get('area_id') ?? ''; if ($area_id) { $flag = $this->validateAreaId($area_id); if ($flag) return $this->error('无权限查看该区域'); } $days = $request->get('days') ?? ''; if (empty($days)) return $this->error('缺少days参数'); // [当月=> current_month ,上月 =>last_month ,近一年 => almost_year] if (!in_array($days, ['current_month', 'last_month', 'almost_year'])) return $this->error('参数错误'); $merchant_id = $request->get('merchant_id') ?? ''; // if (empty($merchant_id)) return $this->error('缺少merchant_id参数'); if ($merchant_id) { /** * 查询当月的可以查询 wallet_logs 这个表 * 查询上个月的查询 statistics * 查询近一年的时候,本月之前的查询statistics,本月的还是查询wallet_logs */ switch ($days) { case 'current_month': $data = $this->monthShare($merchant_id, $area_id); break; case 'last_month': $data = $this->lastMonthShare($merchant_id, $area_id); break; case 'almost_year': $data = $this->yearShare($merchant_id, $area_id); break; default: return []; } } else { $da = []; // 没有商户,就统计所有的商户,避免每个商户的分成不一致,就循环统计,然后再合并 $marr = AdminMerchant::where('status', 1)->pluck('id')->toArray(); foreach ($marr as $v) { /** * 查询当月的可以查询 wallet_logs 这个表 * 查询上个月的查询 statistics * 查询近一年的时候,本月之前的查询statistics,本月的还是查询wallet_logs */ switch ($days) { case 'current_month': $da[] = $this->monthShare($v, $area_id); break; case 'last_month': $da[] = $this->lastMonthShare($v, $area_id); break; case 'almost_year': $da[] = $this->yearShare($v, $area_id); break; default: return []; } } $data = []; // 合并数据 if (isset($da[0])) { // foreach($da[0] as $k=>$v){ // foreach($da as $k1=>$v1){ // if($k1>0){ // foreach($v1 as $v2){ // if($v['date'] == $v2['date']){ // $data[] = [ // 'date' => $v['date'], // 'value' => bcadd($v['value'],$v2['value'],2), // 'share' => bcadd($v['share'],$v2['share'],2) // ]; // } // } // } // } // } // 优化foreach循环 $valueArr = []; $shareArr = []; foreach ($da as $v) { $valueArr[] = array_column($v, 'value', 'date'); $shareArr[] = array_column($v, 'share', 'date'); } // 获取所有的键值 $keyArr = array_keys($valueArr[0]); $valueA = []; $shareA = []; foreach ($keyArr as $v) { foreach ($valueArr as $v1) { $valueA[$v][] = $v1[$v]; } foreach ($shareArr as $v2) { $shareA[$v][] = $v2[$v]; } } // 弃用 array_sum , 采用 bcadd $i = 0; foreach ($valueA as $k => $v) { $value = 0.00; foreach ($v as $v1) { $value = bcadd($value, $v1, 2); } $data[$i] = [ 'date' => $k, 'value' => $value ]; $i++; } $i = 0; foreach ($shareA as $k => $v) { $share = 0.00; foreach ($v as $v1) { $share = bcadd($share, $v1, 2); } $data[$i]['share'] = $share; $i++; } } } return $data; } // 当月分红 (纯收益 + 骑行卡收益) 乘以 商户分成比例 private function monthShare($merchant_id, $area_id) { // 管理员,并且选择了商户 if (Admin::isAdministrator() && $merchant_id) { $walletLogProfit = WalletLog::query()->where('merchant_id', $merchant_id); $cardRidingOrdersProfit = CardRidingOrder::query()->where('merchant_id', $merchant_id); } else { $walletLogProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere()); $cardRidingOrdersProfit = CardRidingOrder::query()->where(AdminMerchant::getMerchantWhere()); } if (!empty($area_id)) { $walletLogProfit = $walletLogProfit->where('area_id', $area_id); $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id); } else { $admin_id = Admin::user()->id; if (!Admin::isAdministrator()) { $area_ids = AdminUser::getAreaIdsByAdminId($admin_id); if (count($area_ids) !== 0) { $walletLogProfit = $walletLogProfit->whereIn('area_id', $area_ids); $cardRidingOrdersProfit = $cardRidingOrdersProfit->whereIn('area_id', $area_ids); } else { $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id'); $area_id = $area_id ?? 0; $walletLogProfit = $walletLogProfit->where('area_id', $area_id); $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id); } } } // 口袋钱包纯收益 $newOrders = $walletLogProfit ->whereIn('type', WalletLog::$subType) // 交易类型 - subType 存收益 ->where('status', WalletLog::STATUS_OK); // 数据状态 - 有效 $now = Carbon::now(); $startTime = $now->firstOfMonth(); $endTime = $now->today()->format('Y-m-d H:i:s'); $i = (int)date('d') - 1; // 赋值一个值为0得数组 $arr = []; for ($i; $i >= 0; $i--) { $str = Carbon::today()->subDays($i)->format('Y/m/d'); $arr[$str] = 0; } // 有数据得数组 $newOrders = $newOrders->whereBetween('created_at', [$startTime, $endTime]) ->selectRaw("DATE_FORMAT(created_at,'%Y/%m/%d') as date,sum(money) as value") ->groupBy('date')->get()->toArray(); $newOrdersKeyVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { $newOrdersKeyVal[$v['date']] = abs($v['value']); // 数据表里的是负数,所以要取正 } } // 骑行卡收益 $cardNewOrders = $cardRidingOrdersProfit->whereBetween('pay_time', [$startTime, $endTime]) ->selectRaw("DATE_FORMAT(pay_time,'%Y/%m/%d') as date,sum(pay_money) as value") ->groupBy('date')->get()->toArray(); if (!empty($cardNewOrders)) { foreach ($cardNewOrders as $v) { if (isset($newOrdersKeyVal[$v['date']])) { $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $v['value'], 2); } else { $newOrdersKeyVal[$v['date']] = $v['value']; } } } // 合并覆盖0 $merge = array_merge($arr, $newOrdersKeyVal); // 重组结构 $data = []; // 该商户的分红比例 proportion $proportion = AdminMerchant::where('id', $merchant_id)->value('proportion'); $proportion = $proportion ? bcdiv($proportion, 100, 2) : 0.00; foreach ($merge as $ks => $vs) { $data[] = [ 'date' => $ks, 'value' => bcadd($vs, 0, 2), 'share' => bcmul($vs, $proportion, 2) ]; } return $data; } // 上月分红 private function lastMonthShare($merchant_id, $area_id) { // 管理员,并且选择了商户 if (Admin::isAdministrator()) { if ($merchant_id) { $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_PROFIT_STATIC); } else { $newOrders = Statistic::query()->where('merchant_id', 0)->where('slug', Statistic::SLUG_PROFIT_STATIC); } } else { $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_PROFIT_STATIC); } // 区域 if (!empty($area_id)) { $newOrders = $newOrders->where('area_id', $area_id); } else { // 平台的是 9999 商户的是 0 if (Admin::isAdministrator()) { $newOrders = $newOrders->where('area_id', config('statistic.all')); } else { $newOrders = $newOrders->where('area_id', 0); } } // 上月时间 $now = Carbon::now()->subMonth(1); $startTime = $now->firstOfMonth()->format('Y-m-d'); $endTime = $now->lastOfMonth()->format('Y-m-d'); $i = (int)date('t', strtotime($endTime)) - 1; // 赋值一个值为0得数组 $arr = []; for ($i; $i >= 0; $i--) { $str = $now->lastOfMonth()->subDays($i)->format('Y/m/d'); $arr[$str] = 0; } // 有数据得数组 $newOrders = $newOrders->whereBetween('date', [$startTime, $endTime]) ->selectRaw("DATE_FORMAT(date,'%Y/%m/%d') as date,body") ->get()->toArray(); $newOrdersKeyVal = []; $totalVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { $body = json_decode($v['body'], true); // 分红 $val = (float)$body['share_out_bonus']; if (isset($newOrdersKeyVal[$v['date']])) { $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2); } else { $newOrdersKeyVal[$v['date']] = $val; } //商户总收益 $total_val = (float)$body['profit'] + (float)$body['card_profit']; if (isset($totalVal[$v['date']])) { $totalVal[$v['date']] = bcadd($totalVal[$v['date']], $total_val, 2); } else { $totalVal[$v['date']] = $total_val; } } } // 合并覆盖0 $merge = array_merge($arr, $newOrdersKeyVal); // 重组结构 $data = []; foreach ($merge as $ks => $vs) { $data[] = [ 'date' => $ks, 'value' => isset($totalVal[$ks]) ? bcadd($totalVal[$ks], 0, 2) : 0.00, 'share' => bcadd($vs, 0, 2) ]; } return $data; } // 近一年分红 private function yearShare($merchant_id, $area_id) { // 管理员,并且选择了商户 if (Admin::isAdministrator()) { if ($merchant_id) { $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_PROFIT_STATIC); } else { $newOrders = Statistic::query()->where('merchant_id', 0)->where('slug', Statistic::SLUG_PROFIT_STATIC); } } else { $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_PROFIT_STATIC); } // 区域 if (!empty($area_id)) { $newOrders = $newOrders->where('area_id', $area_id); } else { // 平台的是 9999 商户的是 0 if (Admin::isAdministrator()) { $newOrders = $newOrders->where('area_id', config('statistic.all')); } else { $newOrders = $newOrders->where('area_id', 0); } } $now = Carbon::now(); $startTime = $now->startOfYear()->format('Y-m-d'); $endTime = $now->endOfYear()->format('Y-m-d'); $i = (int)date('m') - 1; // 赋值一个值为0得数组 $arr = []; for ($i; $i >= 0; $i--) { $str = Carbon::now()->subMonth($i)->format('Y/m'); $arr[$str] = 0; } // 有数据得数组 $newOrders = $newOrders->whereBetween('date', [$startTime, $endTime]) ->selectRaw("DATE_FORMAT(date,'%Y/%m') as date,body") ->get()->toArray(); $newOrdersKeyVal = []; $totalVal = []; if (!empty($newOrders)) { foreach ($newOrders as $v) { $body = json_decode($v['body'], true); $val = (float)$body['share_out_bonus']; if (isset($newOrdersKeyVal[$v['date']])) { $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2); } else { $newOrdersKeyVal[$v['date']] = $val; } //商户总收益 $total_val = (float)$body['profit'] + (float)$body['card_profit']; if (isset($totalVal[$v['date']])) { $totalVal[$v['date']] = bcadd($totalVal[$v['date']], $total_val, 2); } else { $totalVal[$v['date']] = $total_val; } } } // 合并覆盖0 $merge = array_merge($arr, $newOrdersKeyVal); // 重组结构 $data = []; foreach ($merge as $ks => $vs) { $data[] = [ 'date' => $ks, 'value' => isset($totalVal[$ks]) ? bcadd($totalVal[$ks], 0, 2) : 0.00, 'share' => bcadd($vs, 0, 2) ]; } return $data; } }