IndexController.php 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Filters\BikeFilter;
  4. use App\Filters\CardRidingOrderFilter;
  5. use App\Filters\DepositCardOrderFilter;
  6. use App\Filters\OrderFilter;
  7. use App\Filters\OrderRentFilter;
  8. use App\Filters\RechargeOrderFilter;
  9. use App\Filters\StatisticFilter;
  10. use App\Filters\UserFilter;
  11. use App\Filters\WalletLogFilter;
  12. use App\Filters\WorkOrderFilter;
  13. use App\Models\AdminUser;
  14. use App\Models\AdminUserArea;
  15. use App\Models\Area;
  16. use App\Models\Bike;
  17. // use App\Models\BikeTrouble;
  18. use App\Models\CardRidingOrder;
  19. use App\Models\DepositCardOrder;
  20. use App\Models\Model;
  21. use App\Models\Order;
  22. use App\Models\OrderRent;
  23. use App\Models\RechargeOrder;
  24. use App\Models\Statistic;
  25. use App\Models\User;
  26. use App\Models\UserPhoneDetail;
  27. use App\Models\WalletLog;
  28. use App\Models\WorkOrder;
  29. use App\Utils\Admin;
  30. use App\Utils\RedisKeys;
  31. use Carbon\Carbon;
  32. use Illuminate\Http\Request;
  33. use App\Http\Controllers\Controller;
  34. use Illuminate\Support\Facades\DB;
  35. use Illuminate\Support\Facades\Log;
  36. /**
  37. * Class IndexController
  38. * @package App\Http\Controllers\Admin
  39. */
  40. class IndexController extends Controller
  41. {
  42. /**
  43. * topIndex 首页头部统计数据
  44. *
  45. * @param Request $request
  46. * @return \Illuminate\Http\JsonResponse
  47. * @author Fx
  48. *
  49. */
  50. public function topIndex(Request $request)
  51. {
  52. $area_id = $request->get('area_id') ?? '';
  53. $data = [];
  54. $data['new_order'] = $this->newOrder($area_id);
  55. $data['total_user'] = $this->totalUser($area_id);
  56. $data['total_order'] = $this->totalOrder($area_id);
  57. $data['total_profit'] = $this->totalProfit($area_id);
  58. return $this->ok($data);
  59. }
  60. /**
  61. * todoEvent 首页待办事项 统计数据
  62. *
  63. * @param BikeFilter $bikeFilter
  64. * @param OrderFilter $orderFilter
  65. * @param OrderRentFilter $orderRentFilter
  66. * @param WorkOrderFilter $workOrderFilter
  67. * @return \Illuminate\Http\JsonResponse
  68. * @author Fx
  69. *
  70. */
  71. public function todoEvent(BikeFilter $bikeFilter, OrderFilter $orderFilter, OrderRentFilter $orderRentFilter, WorkOrderFilter $workOrderFilter)
  72. {
  73. $data = [];
  74. $data['low_battery_num'] = Bike::query()->filter($bikeFilter);
  75. $data['long_time_no_ridding'] = Order::query()->filter($orderFilter);
  76. $data['long_time_no_return_ridding'] = Order::query()->filter($orderFilter);
  77. $long_time_no_return_ridding_order_rent = OrderRent::query()->filter($orderRentFilter);
  78. $data['trouble_num'] = Bike::query()->filter($bikeFilter);
  79. $data['warning_num'] = WorkOrder::query()->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter);
  80. $admin_id = Admin::user()->id;
  81. if (!Admin::isAdministrator()) {
  82. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  83. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->pluck('area_id')->toArray();
  84. $area_ids = array_merge($area_ids, $area_id);
  85. $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids);
  86. $data['long_time_no_ridding'] = $data['long_time_no_ridding']->whereIn('area_id', $area_ids);
  87. $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->whereIn('area_id', $area_ids);
  88. $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->whereIn('area_id', $area_ids);
  89. $data['trouble_num'] = $data['trouble_num']->whereIn('put_area_id', $area_ids);
  90. $data['warning_num'] = $data['warning_num']->whereIn('area_id', $area_ids);
  91. }
  92. // 低电量
  93. $data['low_battery_num'] = $data['low_battery_num']
  94. ->where('is_low_battery_power', Bike::BATTERY_POWER_LOW)
  95. ->where('put_status', Bike::PUT_STATUS_YES)
  96. ->count('id');
  97. // 24小时未骑车辆
  98. $data['long_time_no_ridding'] = $data['long_time_no_ridding']
  99. ->whereIn('status', [Order::STATUS_PAUSE_BIKE, Order::STATUS_RIDE_BIKE])
  100. ->count('id');
  101. // 24小时未还车 此处查询订单
  102. $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']
  103. ->where(function ($q) {
  104. $q->where('status', Order::STATUS_PAUSE_BIKE)
  105. ->orWhere('status', Order::STATUS_RIDE_BIKE);
  106. })
  107. ->where('start_use_bike_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
  108. ->count('id');
  109. $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent
  110. ->where(function ($q) {
  111. $q->where('status', OrderRent::STATUS_RENT_BIKE);
  112. })
  113. ->where('start_use_bike_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
  114. ->count('id');
  115. $data['long_time_no_return_ridding'] += $long_time_no_return_ridding_order_rent;
  116. //故障车辆
  117. $data['trouble_num'] = $data['trouble_num']
  118. ->where('is_trouble', Bike::TROUBLE_YES)
  119. ->count('id');
  120. // 报警信息
  121. $data['warning_num'] = $data['warning_num']
  122. ->where('status', WorkOrder::STATUS_NO)
  123. ->count('id');
  124. // $data['warning_num'] = 0;
  125. return $this->ok($data);
  126. }
  127. /**
  128. * profitPolygonalChart 总收益 折线统计图
  129. *
  130. * @param Request $request
  131. * @param WalletLogFilter $walletLogFilter
  132. * @return \Illuminate\Http\JsonResponse
  133. * @author Fx
  134. *
  135. */
  136. /**
  137. * profitStatistics 日收益统计信息
  138. *
  139. * @param $area_id
  140. * @return array
  141. * @author Fx
  142. *
  143. */
  144. private function profitStatistics($area_id, $dateBetween)
  145. {
  146. if (!empty($dateBetween)) {
  147. $profit_statistic_date_start = Carbon::parse($dateBetween[0])->subDay()->format('Y-m-d');
  148. $profit_statistic_date_end = Carbon::parse($dateBetween[1])->format('Y-m-d');
  149. } else {
  150. $profit_statistic_date_start = date('Y-m-d', strtotime("-8 day"));
  151. $profit_statistic_date_end = Carbon::today();
  152. }
  153. if ($area_id == config('statistic.all')) {
  154. // 判断是否为超级管理员
  155. $admin_id = Admin::user()->id;
  156. if (!Admin::isAdministrator() && !Admin::isNormalAdministrator()) {
  157. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  158. $profit_statistics = Statistic::query()
  159. ->where('slug', Statistic::SLUG_PROFIT_STATIC)
  160. ->where('date', '>', $profit_statistic_date_start)
  161. ->where('date', '<', $profit_statistic_date_end)
  162. // ->where('area_id',$area_id)
  163. ->whereIn('area_id', $area_ids)
  164. ->select(['date', 'body'])
  165. ->orderByDesc('date')
  166. ->get()
  167. ->toArray();
  168. // Log::info($profit_statistics);
  169. $arr1 = [];
  170. foreach ($profit_statistics as $v) {
  171. // 非超级管理员 需要重新组装叠加总收益统计
  172. $profit_statistics_arr = object_array(json_decode($v['body']));
  173. if (array_key_exists($v['date'], $arr1)) {
  174. $arr1[$v['date']] += $profit_statistics_arr['profit'] ?? 0;
  175. } else {
  176. $arr1[$v['date']] = $profit_statistics_arr['profit'] ?? 0;
  177. }
  178. }
  179. $res = [];
  180. foreach ($arr1 as $k => $v) {
  181. $arr2 = [];
  182. $arr2['profit'] = $v;
  183. $arr2['date'] = $k;
  184. $res[] = $arr2;
  185. }
  186. return $res;
  187. }
  188. }
  189. // 其他均走下面 按照区域id查询
  190. $profit_statistics = Statistic::query()
  191. ->where('slug', Statistic::SLUG_PROFIT_STATIC)
  192. ->where('date', '>', $profit_statistic_date_start)
  193. ->where('date', '<', $profit_statistic_date_end)
  194. ->where('area_id', $area_id)
  195. ->select(['date', 'body'])
  196. ->orderByDesc('date')
  197. ->get()
  198. ->toArray();
  199. $res = [];
  200. // dd($profit_statistics);
  201. foreach ($profit_statistics as $v) {
  202. $profit_statistics_arr = object_array(json_decode($v['body']));
  203. $profit_arr_statistics = [];
  204. $profit_arr_statistics['profit'] = $profit_statistics_arr['profit'] ?? 0;
  205. $profit_arr_statistics['date'] = $v['date'];
  206. $res[] = $profit_arr_statistics;
  207. }
  208. return $res;
  209. }
  210. /**
  211. * bikeDailyAverage 日均车收益
  212. *
  213. * @param $days
  214. * @param $statisticFilter
  215. * @return array|\Illuminate\Http\JsonResponse
  216. * @author Fx
  217. *
  218. */
  219. private function bikeDailyAverage($days, $statisticFilter)
  220. {
  221. if (empty($days)) return $this->error('缺少参数');
  222. $newOrders = Statistic::query()
  223. ->filter($statisticFilter);
  224. $admin_id = Admin::user()->id;
  225. if (!Admin::isAdministrator()) {
  226. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  227. if (count($area_ids) !== 0) {
  228. $newOrders = $newOrders->whereIn('area_id', $area_ids);
  229. } else {
  230. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  231. $area_id = $area_id ?? 0;
  232. $newOrders = $newOrders->where('area_id', $area_id);
  233. }
  234. }
  235. switch ($days) {
  236. case 'today':
  237. return [];
  238. break;
  239. case 'threeDays':
  240. $i = 2;
  241. break;
  242. case 'sevenDays':
  243. $i = 6;
  244. break;
  245. case 'fifteenDays':
  246. $i = 14;
  247. break;
  248. case 'thirtyDays':
  249. $i = 29;
  250. break;
  251. default:
  252. return $this->error('参数错误');
  253. }
  254. if ($days !== 'today') {
  255. $paramDays = Carbon::today()->subDays($i);
  256. // 赋值一个值为0得数组
  257. $arr = [];
  258. for ($i; $i >= 0; $i--) {
  259. $str = Carbon::today()->subDays($i)->format('Y/m/d');
  260. $arr[$str] = 0;
  261. }
  262. // 有数据得数组
  263. $newOrders = $newOrders->where('date', '>', $paramDays)
  264. ->where('slug',Statistic::SLUG_PROFIT_STATIC)
  265. ->select(['date', 'body'])
  266. ->orderByDesc('date')
  267. ->get()
  268. ->toArray();
  269. $newOrdersKeyVal = [];
  270. if (!empty($newOrders)) {
  271. foreach ($newOrders as $v) {
  272. $profit_statistics_arr = object_array(json_decode($v['body'],true));
  273. $profit_arr_statistics['profit'] = $profit_statistics_arr['profit'] ?? 0;
  274. $profit_arr_statistics['put_bikes'] = $profit_statistics_arr['put_bikes'] ?? 0;
  275. if ($profit_arr_statistics['put_bikes'] == 0) {
  276. $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = 0;
  277. } else {
  278. $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = number_format($profit_arr_statistics['profit'] / $profit_arr_statistics['put_bikes'], 2);
  279. }
  280. }
  281. }
  282. // 合并覆盖0
  283. // Log::info($arr);
  284. // Log::info($newOrdersKeyVal);
  285. $merge = array_merge($arr, $newOrdersKeyVal);
  286. // 重组结构
  287. $data = [];
  288. foreach ($merge as $ks => $vs) {
  289. $data[] = ['date' => $ks, 'value' => $vs];
  290. }
  291. }
  292. return $data;
  293. }
  294. public function profitPolygonalChart($days, $filter, $model, $money = 'pay_money')
  295. {
  296. if (empty($days)) return $this->error('缺少参数');
  297. $newOrders = $model
  298. ->filter($filter)
  299. ->where('pay_status', 1);
  300. $admin_id = Admin::user()->id;
  301. if (!Admin::isAdministrator()) {
  302. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  303. if (count($area_ids) !== 0) {
  304. $newOrders = $newOrders->whereIn('area_id', $area_ids);
  305. } else {
  306. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  307. $area_id = $area_id ?? 0;
  308. $newOrders = $newOrders->where('area_id', $area_id);
  309. }
  310. }
  311. switch ($days) {
  312. case 'today':
  313. $today = Carbon::today();
  314. $newOrders = $newOrders->where('pay_time', '>', $today)
  315. ->selectRaw("DATE_FORMAT(pay_time,'%m-%d %H:00') as date,sum($money) as value")
  316. ->groupBy('date')->get()->toArray();
  317. // 有数据得数组
  318. $newOrdersKeyVal = [];
  319. if (!empty($newOrders)) {
  320. foreach ($newOrders as $v) {
  321. $newOrdersKeyVal[$v['date']] = $v['value'];
  322. }
  323. }
  324. // 为0得数组
  325. $i = Carbon::now()->format('H');
  326. $arr = [];
  327. for ($i; $i >= 0; $i--) {
  328. $str = Carbon::now()->subHours($i)->format('m-d H:00');
  329. $arr[$str] = 0;
  330. }
  331. //合并
  332. $merge = array_merge($arr, $newOrdersKeyVal);
  333. $data = [];
  334. foreach ($merge as $key => $value) {
  335. $data[] = ['date' => $key, 'value' => $value];
  336. }
  337. break;
  338. case 'threeDays':
  339. $i = 2;
  340. break;
  341. case 'sevenDays':
  342. $i = 6;
  343. break;
  344. case 'fifteenDays':
  345. $i = 14;
  346. break;
  347. case 'thirtyDays':
  348. $i = 29;
  349. break;
  350. default:
  351. return $this->error('参数错误');
  352. }
  353. if ($days !== 'today') {
  354. $paramDays = Carbon::today()->subDays($i);
  355. // 赋值一个值为0得数组
  356. $arr = [];
  357. for ($i; $i >= 0; $i--) {
  358. $str = Carbon::today()->subDays($i)->format('Y/m/d');
  359. $arr[$str] = 0;
  360. }
  361. // 有数据得数组
  362. $newOrders = $newOrders->where('pay_time', '>', $paramDays)
  363. ->selectRaw("DATE_FORMAT(pay_time,'%Y/%m/%d') as date,sum($money) as value")
  364. ->groupBy('date')->get()->toArray();
  365. $newOrdersKeyVal = [];
  366. if (!empty($newOrders)) {
  367. foreach ($newOrders as $v) {
  368. $newOrdersKeyVal[$v['date']] = $v['value'];
  369. }
  370. }
  371. // 合并覆盖0
  372. $merge = array_merge($arr, $newOrdersKeyVal);
  373. // 重组结构
  374. $data = [];
  375. foreach ($merge as $ks => $vs) {
  376. $data[] = ['date' => $ks, 'value' => $vs];
  377. }
  378. }
  379. return $data;
  380. }
  381. public function profitChart(Request $request, OrderFilter $orderFilter, RechargeOrderFilter $rechargeOrderFilter, CardRidingOrderFilter $cardRidingOrderFilter, DepositCardOrderFilter $depositCardOrderFilter, StatisticFilter $statisticFilter)
  382. {
  383. $days = $request->get('days') ?? '';
  384. $ordersChart = $this->profitPolygonalChart($days, $orderFilter, Order::query());
  385. $ordersDispatchMoneyChart = $this->profitPolygonalChart($days, $orderFilter, Order::query(), 'dispatch_money');
  386. $rechargeOrdersChart = $this->profitPolygonalChart($days, $rechargeOrderFilter, RechargeOrder::query());
  387. $cardRidingOrdersChart = $this->profitPolygonalChart($days, $cardRidingOrderFilter, CardRidingOrder::query());
  388. $depositCardOrdersChart = $this->profitPolygonalChart($days, $depositCardOrderFilter, DepositCardOrder::query());
  389. $total = [];
  390. foreach ($ordersChart as $k => $v) {
  391. $total[] = [
  392. 'date' => $v['date'],
  393. 'value' => bcadd(bcadd(bcadd($v['value'], $rechargeOrdersChart[$k]['value'], 2), $cardRidingOrdersChart[$k]['value'], 2), $depositCardOrdersChart[$k]['value'], 2)
  394. ];
  395. }
  396. $bikeDailyAverageChart = $this->bikeDailyAverage($days, $statisticFilter);
  397. return $this->ok([
  398. [
  399. 'name' => '普通订单收益',
  400. 'data' => $ordersChart
  401. ],
  402. [
  403. 'name' => '普通订单调度费收益',
  404. 'data' => $ordersDispatchMoneyChart
  405. ],
  406. [
  407. 'name' => '充值收益',
  408. 'data' => $rechargeOrdersChart
  409. ],
  410. [
  411. 'name' => '骑行卡收益',
  412. 'data' => $cardRidingOrdersChart
  413. ],
  414. [
  415. 'name' => '免押金卡收益',
  416. 'data' => $depositCardOrdersChart
  417. ],
  418. [
  419. 'name' => '总收益',
  420. 'data' => $total
  421. ],
  422. [
  423. 'name' => '日均车收益',
  424. 'data' => $bikeDailyAverageChart
  425. ],
  426. ]);
  427. }
  428. /**
  429. * newUsersChart 新用户增长统计图
  430. *
  431. * @param Request $request
  432. * @return array
  433. * @author Fx
  434. *
  435. */
  436. public function usersChart($days, $userFilter, $deposit = false, $deposit_type = User::DEPOSIT_MONEY)
  437. {
  438. $newUsers = User::query()
  439. ->filter($userFilter)
  440. ->where('is_card_certified', User::CARD_OK);
  441. if ($deposit) {
  442. $newUsers = $newUsers->where('deposit_type', $deposit_type);
  443. }
  444. $admin_id = Admin::user()->id;
  445. if (!Admin::isAdministrator()) {
  446. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  447. if (count($area_ids) !== 0) {
  448. $newUsers = $newUsers->whereIn('register_area_id', $area_ids);
  449. } else {
  450. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  451. $area_id = $area_id ?? 0;
  452. $newUsers = $newUsers->where('register_area_id', $area_id);
  453. }
  454. }
  455. $newOrders = $newUsers;
  456. switch ($days) {
  457. case 'today':
  458. $today = Carbon::today();
  459. $newOrders = $newOrders->where('created_at', '>', $today)
  460. ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
  461. ->groupBy('date')->get()->toArray();
  462. // 有数据得数组
  463. $newOrdersKeyVal = [];
  464. if (!empty($newOrders)) {
  465. foreach ($newOrders as $v) {
  466. $newOrdersKeyVal[$v['date']] = $v['value'];
  467. }
  468. }
  469. // 为0得数组
  470. $i = Carbon::now()->format('H');
  471. $arr = [];
  472. for ($i; $i >= 0; $i--) {
  473. $str = Carbon::now()->subHours($i)->format('m-d H:00');
  474. $arr[$str] = 0;
  475. }
  476. //合并
  477. $merge = array_merge($arr, $newOrdersKeyVal);
  478. $data = [];
  479. foreach ($merge as $key => $value) {
  480. $data[] = ['date' => $key, 'value' => $value];
  481. }
  482. break;
  483. case 'threeDays':
  484. $i = 2;
  485. break;
  486. case 'sevenDays':
  487. $i = 6;
  488. break;
  489. case 'fifteenDays':
  490. $i = 14;
  491. break;
  492. case 'thirtyDays':
  493. $i = 29;
  494. break;
  495. default:
  496. return $this->error('参数错误');
  497. }
  498. if ($days !== 'today') {
  499. $paramDays = Carbon::today()->subDays($i);
  500. // 赋值一个值为0得数组
  501. $arr = [];
  502. for ($i; $i >= 0; $i--) {
  503. $str = Carbon::today()->subDays($i)->format('Y/m/d');
  504. $arr[$str] = 0;
  505. }
  506. // 有数据得数组
  507. $newOrders = $newOrders->where('created_at', '>', $paramDays)
  508. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  509. ->groupBy('date')->get()->toArray();
  510. $newOrdersKeyVal = [];
  511. if (!empty($newOrders)) {
  512. foreach ($newOrders as $v) {
  513. $newOrdersKeyVal[$v['date']] = $v['value'];
  514. }
  515. }
  516. // 合并覆盖0
  517. $merge = array_merge($arr, $newOrdersKeyVal);
  518. // 重组结构
  519. $data = [];
  520. foreach ($merge as $ks => $vs) {
  521. $data[] = ['date' => $ks, 'value' => $vs];
  522. }
  523. }
  524. return $data;
  525. }
  526. public function newUsersChart(Request $request, UserFilter $userFilter)
  527. {
  528. $days = $request->get('days') ?? '';
  529. if (empty($days)) return $this->error('缺少参数');
  530. $usersChart = $this->usersChart($days, $userFilter);
  531. $usersChartDepositCard = $this->usersChart($days, $userFilter, true, User::DEPOSIT_CARD);
  532. $usersChartDepositMoney = $this->usersChart($days, $userFilter, true, User::DEPOSIT_MONEY);
  533. return $this->ok([
  534. [
  535. 'name' => '每日增长用户数',
  536. 'data' => $usersChart
  537. ],
  538. [
  539. 'name' => '每日增长用户(缴纳押金)',
  540. 'data' => $usersChartDepositCard
  541. ],
  542. [
  543. 'name' => '每日增长用户(押金卡)',
  544. 'data' => $usersChartDepositMoney
  545. ]
  546. ]);
  547. }
  548. /**
  549. * newOrderChart 新订单统计图
  550. *
  551. * @param Request $request
  552. * @param OrderFilter $orderFilter
  553. * @return array
  554. * @author Fx
  555. *
  556. */
  557. public function orderChart($days, $orderFilter, $dispatch_money = false)
  558. {
  559. $newOrders = Order::query()
  560. ->filter($orderFilter)
  561. ->where('status', Order::STATUS_COMPLETE_ORDER);
  562. if ($dispatch_money) {
  563. $newOrders = $newOrders->where('dispatch_money', '>', 0);
  564. }
  565. $admin_id = Admin::user()->id;
  566. if (!Admin::isAdministrator()) {
  567. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  568. if (count($area_ids) !== 0) {
  569. $newOrders = $newOrders->whereIn('area_id', $area_ids);
  570. } else {
  571. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  572. $area_id = $area_id ?? 0;
  573. $newOrders = $newOrders->where('area_id', $area_id);
  574. }
  575. }
  576. switch ($days) {
  577. case 'today':
  578. $today = Carbon::today();
  579. $newOrders = $newOrders->where('created_at', '>', $today)
  580. ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
  581. ->groupBy('date')->get()->toArray();
  582. // 有数据得数组
  583. $newOrdersKeyVal = [];
  584. if (!empty($newOrders)) {
  585. foreach ($newOrders as $v) {
  586. $newOrdersKeyVal[$v['date']] = $v['value'];
  587. }
  588. }
  589. // 为0得数组
  590. $i = Carbon::now()->format('H');
  591. $arr = [];
  592. for ($i; $i >= 0; $i--) {
  593. $str = Carbon::now()->subHours($i)->format('m-d H:00');
  594. $arr[$str] = 0;
  595. }
  596. //合并
  597. $merge = array_merge($arr, $newOrdersKeyVal);
  598. $data = [];
  599. foreach ($merge as $key => $value) {
  600. $data[] = ['date' => $key, 'value' => $value];
  601. }
  602. break;
  603. case 'threeDays':
  604. $i = 2;
  605. break;
  606. case 'sevenDays':
  607. $i = 6;
  608. break;
  609. case 'fifteenDays':
  610. $i = 14;
  611. break;
  612. case 'thirtyDays':
  613. $i = 29;
  614. break;
  615. default:
  616. return [];
  617. }
  618. if ($days !== 'today') {
  619. $paramDays = Carbon::today()->subDays($i);
  620. // 赋值一个值为0得数组
  621. $arr = [];
  622. for ($i; $i >= 0; $i--) {
  623. $str = Carbon::today()->subDays($i)->format('Y/m/d');
  624. $arr[$str] = 0;
  625. }
  626. // 有数据得数组
  627. $newOrders = $newOrders->where('created_at', '>', $paramDays)
  628. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  629. ->groupBy('date')->get()->toArray();
  630. $newOrdersKeyVal = [];
  631. if (!empty($newOrders)) {
  632. foreach ($newOrders as $v) {
  633. $newOrdersKeyVal[$v['date']] = $v['value'];
  634. }
  635. }
  636. // 合并覆盖0
  637. $merge = array_merge($arr, $newOrdersKeyVal);
  638. // 重组结构
  639. $data = [];
  640. foreach ($merge as $ks => $vs) {
  641. $data[] = ['date' => $ks, 'value' => $vs];
  642. }
  643. }
  644. return $data;
  645. }
  646. public function newOrderChart(Request $request, OrderFilter $orderFilter)
  647. {
  648. $days = $request->get('days') ?? '';
  649. if (empty($days)) return $this->error('缺少参数');
  650. $newOrderChart = $this->orderChart($days, $orderFilter);
  651. $dispatchMoneyNewOrderChart = $this->orderChart($days, $orderFilter, true);
  652. return $this->ok([
  653. [
  654. 'name' => '总订单数',
  655. 'data' => $newOrderChart
  656. ], [
  657. 'name' => '有调度费的订单数',
  658. 'data' => $dispatchMoneyNewOrderChart
  659. ],
  660. ]);
  661. }
  662. /**
  663. * newDayRentOrderChart 日租新订单统计图
  664. *
  665. * @param Request $request
  666. * @return array
  667. * @author Fx
  668. *
  669. */
  670. public function dayRentOrderChart($days, $orderRentFilter, $dispatch_money = false)
  671. {
  672. $newOrders = OrderRent::query()
  673. ->filter($orderRentFilter)
  674. ->where('status', OrderRent::STATUS_COMPLETE_ORDER);
  675. if ($dispatch_money) {
  676. $newOrders = $newOrders->where('dispatch_money', '>', 0);
  677. }
  678. $admin_id = Admin::user()->id;
  679. if (!Admin::isAdministrator()) {
  680. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  681. if (count($area_ids) !== 0) {
  682. $newOrders = $newOrders->whereIn('area_id', $area_ids);
  683. } else {
  684. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  685. $area_id = $area_id ?? 0;
  686. $newOrders = $newOrders->where('area_id', $area_id);
  687. }
  688. }
  689. switch ($days) {
  690. case 'today':
  691. $today = Carbon::today();
  692. $newOrders = $newOrders->where('created_at', '>', $today)
  693. ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
  694. ->groupBy('date')->get()->toArray();
  695. // 有数据得数组
  696. $newOrdersKeyVal = [];
  697. if (!empty($newOrders)) {
  698. foreach ($newOrders as $v) {
  699. $newOrdersKeyVal[$v['date']] = $v['value'];
  700. }
  701. }
  702. // 为0得数组
  703. $i = Carbon::now()->format('H');
  704. $arr = [];
  705. for ($i; $i >= 0; $i--) {
  706. $str = Carbon::now()->subHours($i)->format('m-d H:00');
  707. $arr[$str] = 0;
  708. }
  709. //合并
  710. $merge = array_merge($arr, $newOrdersKeyVal);
  711. $data = [];
  712. foreach ($merge as $key => $value) {
  713. $data[] = ['date' => $key, 'value' => $value];
  714. }
  715. break;
  716. case 'threeDays':
  717. $i = 2;
  718. break;
  719. case 'sevenDays':
  720. $i = 6;
  721. break;
  722. case 'fifteenDays':
  723. $i = 14;
  724. break;
  725. case 'thirtyDays':
  726. $i = 29;
  727. break;
  728. default:
  729. return [];
  730. }
  731. if ($days !== 'today') {
  732. $paramDays = Carbon::today()->subDays($i);
  733. // 赋值一个值为0得数组
  734. $arr = [];
  735. for ($i; $i >= 0; $i--) {
  736. $str = Carbon::today()->subDays($i)->format('Y/m/d');
  737. $arr[$str] = 0;
  738. }
  739. // 有数据得数组
  740. $newOrders = $newOrders->where('created_at', '>', $paramDays)
  741. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  742. ->groupBy('date')->get()->toArray();
  743. $newOrdersKeyVal = [];
  744. if (!empty($newOrders)) {
  745. foreach ($newOrders as $v) {
  746. $newOrdersKeyVal[$v['date']] = $v['value'];
  747. }
  748. }
  749. // 合并覆盖0
  750. $merge = array_merge($arr, $newOrdersKeyVal);
  751. // 重组结构
  752. $data = [];
  753. foreach ($merge as $ks => $vs) {
  754. $data[] = ['date' => $ks, 'value' => $vs];
  755. }
  756. }
  757. return $data;
  758. }
  759. public function newDayRentOrderChart(Request $request, OrderRentFilter $orderRentFilter)
  760. {
  761. $days = $request->get('days') ?? '';
  762. if (empty($days)) return $this->error('缺少参数');
  763. $newOrderChart = $this->dayRentOrderChart($days, $orderRentFilter);
  764. $dispatchMoneyNewOrderChart = $this->dayRentOrderChart($days, $orderRentFilter, true);
  765. return $this->ok([
  766. [
  767. 'name' => '新增日租订单',
  768. 'data' => $newOrderChart
  769. ], [
  770. 'name' => '新增日租订单(调度费大于0)',
  771. 'data' => $dispatchMoneyNewOrderChart
  772. ],
  773. ]);
  774. }
  775. /**
  776. * riddingRanking 普通订单骑行排行榜
  777. *
  778. * @param Request $request
  779. * @return \Illuminate\Http\JsonResponse
  780. * @author Fx
  781. *
  782. */
  783. public function riddingRanking(Request $request, OrderFilter $orderFilter)
  784. {
  785. $days = $request->get('days') ?? '';
  786. if (empty($days)) return $this->error('缺少参数');
  787. $order = Order::query()
  788. ->filter($orderFilter)
  789. ->where('status', Order::STATUS_COMPLETE_ORDER)
  790. ->with(['users']);
  791. $admin_id = Admin::user()->id;
  792. if (!Admin::isAdministrator()) {
  793. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  794. if (count($area_ids) !== 0) {
  795. $order = $order->whereIn('area_id', $area_ids);
  796. } else {
  797. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  798. $area_id = $area_id ?? 0;
  799. $order = $order->where('area_id', $area_id);
  800. }
  801. }
  802. switch ($days) {
  803. case 'today':
  804. $today = Carbon::today();
  805. $order = $order->where('created_at', '>', $today);
  806. break;
  807. case 'sevenDays':
  808. $time = Carbon::today()->subDays(7);
  809. $order = $order->where('created_at', '>', $time);
  810. break;
  811. case 'oneMonth':
  812. $time = Carbon::today()->subMonth();
  813. $order = $order->where('created_at', '>', $time);
  814. break;
  815. case 'sixMonth':
  816. $time = Carbon::today()->subMonths(6);
  817. $order = $order->where('created_at', '>', $time);
  818. break;
  819. default:
  820. return $this->error('参数错误');
  821. }
  822. $order = $order
  823. ->groupBy(['user_id'])
  824. ->select('user_id', DB::raw('count(id) as total_num'))
  825. ->orderByDesc('total_num')
  826. ->get()
  827. ->take(10);
  828. // ->take(10);
  829. // Log::info($order);
  830. $i = 0;
  831. foreach ($order as &$v) {
  832. $v['username'] = $v->users->nickname ?? '';
  833. $v['phone'] = $v->users->mobile ?? '';
  834. $v['ranking'] = ++$i;
  835. unset($v);
  836. }
  837. return $this->ok($order);
  838. }
  839. /**
  840. * riddingRankingByDayRentOrder 日租订单骑行排行榜
  841. *
  842. * @param Request $request
  843. * @return \Illuminate\Http\JsonResponse
  844. * @author Fx
  845. *
  846. */
  847. public function riddingRankingByDayRentOrder(Request $request, OrderRentFilter $orderRentFilter)
  848. {
  849. $days = $request->get('days') ?? '';
  850. if (empty($days)) return $this->error('缺少参数');
  851. $order = OrderRent::query()
  852. ->filter($orderRentFilter)
  853. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  854. ->with(['users']);
  855. $admin_id = Admin::user()->id;
  856. if (!Admin::isAdministrator()) {
  857. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  858. if (count($area_ids) !== 0) {
  859. $order = $order->whereIn('area_id', $area_ids);
  860. } else {
  861. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  862. $area_id = $area_id ?? 0;
  863. $order = $order->where('area_id', $area_id);
  864. }
  865. }
  866. switch ($days) {
  867. case 'today':
  868. $today = Carbon::today();
  869. $order = $order->where('pay_time', '>', $today);
  870. break;
  871. case 'sevenDays':
  872. $time = Carbon::today()->subDays(7);
  873. $order = $order->where('pay_time', '>', $time);
  874. break;
  875. case 'oneMonth':
  876. $time = Carbon::today()->subMonth();
  877. $order = $order->where('pay_time', '>', $time);
  878. break;
  879. case 'sixMonth':
  880. $time = Carbon::today()->subMonths(6);
  881. $order = $order->where('pay_time', '>', $time);
  882. break;
  883. default:
  884. return $this->error('参数错误');
  885. }
  886. $order = $order
  887. ->groupBy(['user_id'])
  888. ->select('user_id', DB::raw('count(id) as total_num'))
  889. ->orderByDesc('total_num')
  890. ->get()
  891. ->take(10);
  892. // ->take(10);
  893. // Log::info($order);
  894. if (count($order) == 0) return $this->ok([]);
  895. $i = 0;
  896. foreach ($order as &$v) {
  897. $v['username'] = $v->users->nickname ?? '';
  898. $v['phone'] = $v->users->mobile ?? '';
  899. $v['ranking'] = ++$i;
  900. unset($v);
  901. }
  902. return $this->ok($order);
  903. }
  904. /**
  905. * bikeProfitRanking 车辆收益统计排行榜
  906. *
  907. * @return \Illuminate\Http\JsonResponse
  908. * @author Fx
  909. *
  910. */
  911. public function bikeProfitRanking(BikeFilter $bikeFilter)
  912. {
  913. $bikes = Bike::query()->filter($bikeFilter);
  914. $admin_id = Admin::user()->id;
  915. if (!Admin::isAdministrator()) {
  916. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  917. if (count($area_ids) !== 0) {
  918. $bikes = $bikes->whereIn('put_area_id', $area_ids);
  919. } else {
  920. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  921. $area_id = $area_id ?? 0;
  922. $bikes = $bikes->where('put_area_id', $area_id);
  923. }
  924. }
  925. $bikes = $bikes->get();
  926. $data = [];
  927. if (count($bikes) === 0) return $this->ok($data);
  928. foreach ($bikes as $k => $v) {
  929. $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));
  930. $days = Carbon::today()->diffInDays($bike_insert_time);
  931. $per_money = 0;
  932. if ($days != 0) {
  933. $per_money = round($v->total_money / $days, 2);
  934. }
  935. // $v['phone'] = $v->users->mobile ?? '';
  936. $data[] = [
  937. 'bike_no' => $v->bike_no ?? '',
  938. 'put_days' => $days,
  939. 'total_money' => $v->total_money,
  940. 'per_money' => $per_money
  941. ];
  942. $volume[$k] = $per_money; // 排序依据
  943. $edition[$k] = $v->bike_no ?? ''; // 排序人
  944. // $v['ranking'] = ++$i;
  945. unset($v);
  946. }
  947. array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
  948. if (count($data) > 10) {
  949. $res = array_slice($data, 0, 10);
  950. } else {
  951. $res = $data;
  952. }
  953. return $this->ok($res);
  954. }
  955. /**
  956. * totalUser 总用户数量统计
  957. *
  958. * @param string $area_id
  959. * @return array
  960. * @author Fx
  961. *
  962. */
  963. protected function totalUser($area_id = '')
  964. {
  965. $totalUser = [];
  966. $yesterday = Carbon::yesterday();
  967. $today = Carbon::today();
  968. $yesterdayNewUser = User::query();
  969. $todayNewUser = User::query();
  970. $total = User::query();
  971. if (!empty($area_id)) {
  972. $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
  973. $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
  974. $total = $total->where('register_area_id', $area_id);
  975. }
  976. $admin_id = Admin::user()->id;
  977. if (!Admin::isAdministrator()) {
  978. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  979. if (count($area_ids) !== 0) {
  980. $yesterdayNewUser = $yesterdayNewUser->whereIn('register_area_id', $area_ids);
  981. $todayNewUser = $todayNewUser->whereIn('register_area_id', $area_ids);
  982. $total = $total->whereIn('register_area_id', $area_ids);
  983. } else {
  984. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  985. $area_id = $area_id ?? 0;
  986. $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
  987. $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
  988. $total = $total->where('register_area_id', $area_id);
  989. }
  990. }
  991. //昨日新增用户
  992. $yesterdayNewUser = $yesterdayNewUser
  993. ->where('created_at', '>', $yesterday)
  994. ->where('created_at', '<', $today)
  995. ->count('id');
  996. //今日新增用户数
  997. $todayNewUser = $todayNewUser
  998. ->where('created_at', '>', $today)
  999. ->count('id');
  1000. $total = $total->count('id');
  1001. $userDifference = (int)$todayNewUser - (int)$yesterdayNewUser;
  1002. $totalUser['total_num'] = $total;
  1003. if ($userDifference < 0) {
  1004. $totalUser['diff'] = '1'; // 表示下降
  1005. } elseif ($userDifference === 0) {
  1006. $totalUser['diff'] = '2'; // 表示无变化
  1007. } else {
  1008. $totalUser['diff'] = '3'; // 表示上升
  1009. }
  1010. $totalUser['difference'] = abs($userDifference);
  1011. return $totalUser;
  1012. }
  1013. /**
  1014. * totalOrder 总订单数量统计
  1015. *
  1016. * @param string $area_id
  1017. * @return array
  1018. * @author Fx
  1019. *
  1020. */
  1021. protected function totalOrder($area_id = '')
  1022. {
  1023. $totalOrder = $this->orderStistics($area_id);
  1024. unset($totalOrder['new_num']); // 删除多余得本日新增订单数
  1025. return $totalOrder;
  1026. }
  1027. /**
  1028. * newOrder 新订单统计
  1029. *
  1030. * @param string $area_id
  1031. * @return array
  1032. * @author Fx
  1033. *
  1034. */
  1035. protected function newOrder($area_id = '')
  1036. {
  1037. $newOrder = $this->orderStistics($area_id);
  1038. unset($newOrder['total_num']); // 删除多余得总订单数
  1039. return $newOrder;
  1040. }
  1041. /**
  1042. * orderStistics 订单数量统计
  1043. *
  1044. * @param string $area_id
  1045. * @return array
  1046. * @author Fx
  1047. *
  1048. */
  1049. protected function orderStistics($area_id = '')
  1050. {
  1051. $totalOrder = [];
  1052. $yesterday = Carbon::yesterday();
  1053. $today = Carbon::today();
  1054. $yesterdayOrderNum = Order::query();
  1055. $todayOrderNum = Order::query();
  1056. $total = Order::query();
  1057. $yesterdayOrderRentNum = OrderRent::query();
  1058. $todayOrderRentNum = OrderRent::query();
  1059. $totalOrderRent = OrderRent::query();
  1060. if (!empty($area_id)) {
  1061. $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
  1062. $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
  1063. $total = $total->where('area_id', $area_id);
  1064. $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id);
  1065. $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id);
  1066. $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
  1067. }
  1068. $admin_id = Admin::user()->id;
  1069. if (!Admin::isAdministrator()) {
  1070. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  1071. if (count($area_ids) !== 0) {
  1072. $yesterdayOrderNum = $yesterdayOrderNum->whereIn('area_id', $area_ids);
  1073. $todayOrderNum = $todayOrderNum->whereIn('area_id', $area_ids);
  1074. $total = $total->whereIn('area_id', $area_ids);
  1075. $yesterdayOrderRentNum = $yesterdayOrderRentNum->whereIn('area_id', $area_ids);
  1076. $todayOrderRentNum = $todayOrderRentNum->whereIn('area_id', $area_ids);
  1077. $totalOrderRent = $totalOrderRent->whereIn('area_id', $area_ids);
  1078. } else {
  1079. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  1080. $area_id = $area_id ?? 0;
  1081. $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
  1082. $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
  1083. $total = $total->where('area_id', $area_id);
  1084. $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id);
  1085. $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id);
  1086. $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
  1087. }
  1088. }
  1089. // 昨日新订单数
  1090. $yesterdayOrderNum = $yesterdayOrderNum
  1091. ->where('pay_time', '>', $yesterday)
  1092. ->where('pay_time', '<', $today)
  1093. ->where('status', Order::STATUS_COMPLETE_ORDER)
  1094. ->count('id');
  1095. $yesterdayOrderRentNum = $yesterdayOrderRentNum
  1096. ->where('pay_time', '>', $yesterday)
  1097. ->where('pay_time', '<', $today)
  1098. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  1099. ->count('id');
  1100. // 今日新订单数
  1101. $todayOrderNum = $todayOrderNum
  1102. ->where('pay_time', '>', $today)
  1103. ->where('status', Order::STATUS_COMPLETE_ORDER)
  1104. ->count('id');
  1105. $todayOrderRentNum = $todayOrderRentNum
  1106. ->where('pay_time', '>', $today)
  1107. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  1108. ->count('id');
  1109. // 总订单数
  1110. $total = $total
  1111. ->where('status', Order::STATUS_COMPLETE_ORDER)
  1112. ->count('id');
  1113. $totalOrderRent = $totalOrderRent
  1114. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  1115. ->count('id');
  1116. $orderDifference = (int)$todayOrderNum - (int)$yesterdayOrderNum;
  1117. $orderRentDifference = (int)$todayOrderRentNum - (int)$yesterdayOrderRentNum;
  1118. $orderDifference += $orderRentDifference;
  1119. $totalOrder['new_num'] = $todayOrderNum + $todayOrderRentNum;
  1120. $totalOrder['total_num'] = $total + $totalOrderRent;
  1121. if ($orderDifference < 0) {
  1122. $totalOrder['diff'] = '1'; // 表示下降
  1123. } elseif ($orderDifference === 0) {
  1124. $totalOrder['diff'] = '2'; // 表示无变化
  1125. } else {
  1126. $totalOrder['diff'] = '3'; // 表示上升
  1127. }
  1128. $totalOrder['difference'] = abs($orderDifference);
  1129. return $totalOrder;
  1130. }
  1131. /**
  1132. * totalProfit 总收益数据统计
  1133. *
  1134. * @param string $area_id
  1135. * @return array
  1136. * @author Fx
  1137. *
  1138. */
  1139. protected function totalProfit($area_id = '')
  1140. {
  1141. $totalProfit = [];
  1142. $yesterday = Carbon::yesterday();
  1143. $today = Carbon::today();
  1144. $yesterdayProfit = Order::query();
  1145. $todayProfit = Order::query();
  1146. $total = Order::query();
  1147. if (!empty($area_id)) {
  1148. $yesterdayProfit = $yesterdayProfit->where('area_id', $area_id);
  1149. $todayProfit = $todayProfit->where('area_id', $area_id);
  1150. $total = $total->where('area_id', $area_id);
  1151. }
  1152. $admin_id = Admin::user()->id;
  1153. if (!Admin::isAdministrator()) {
  1154. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  1155. if (count($area_ids) !== 0) {
  1156. $yesterdayProfit = $yesterdayProfit->whereIn('area_id', $area_ids);
  1157. $todayProfit = $todayProfit->whereIn('area_id', $area_ids);
  1158. $total = $total->whereIn('area_id', $area_ids);
  1159. } else {
  1160. $yesterdayProfit = $yesterdayProfit->where('area_id', 0);
  1161. $todayProfit = $todayProfit->where('area_id', 0);
  1162. $total = $total->where('area_id', 0);
  1163. }
  1164. }
  1165. // 昨日日收益
  1166. $yesterdayProfit = $yesterdayProfit
  1167. ->where('created_at', '>', $yesterday)
  1168. ->where('created_at', '<', $today)
  1169. ->where('status', Order::STATUS_COMPLETE_ORDER)
  1170. ->sum('pay_money');
  1171. // 今日收益
  1172. $todayProfit = $todayProfit
  1173. ->where('created_at', '>', $today)
  1174. ->where('status', Order::STATUS_COMPLETE_ORDER)
  1175. ->sum('pay_money');
  1176. //总收益
  1177. $total = $total
  1178. ->where('status', Order::STATUS_COMPLETE_ORDER)
  1179. ->sum('pay_money');
  1180. $profitDifference = (float)$todayProfit - (float)$yesterdayProfit;
  1181. $totalProfit['total_num'] = $total;
  1182. $totalProfit['today_num'] = (float)$todayProfit;
  1183. if ($profitDifference < 0) {
  1184. $totalProfit['diff'] = '1'; // 下降
  1185. } elseif ($profitDifference > 0) {
  1186. $totalProfit['diff'] = '3'; // 上升
  1187. } else {
  1188. $totalProfit['diff'] = '2'; // 上升
  1189. }
  1190. $totalProfit['difference'] = abs($profitDifference);
  1191. return $totalProfit;
  1192. }
  1193. public function userPhoneChart(Request $request)
  1194. {
  1195. $days = $request->get('days') ?? '';
  1196. $area_id = $request->get('area_id') ?? '';
  1197. if (empty($days)) return $this->error('缺少参数');
  1198. //platform
  1199. $platform = UserPhoneDetail::query();
  1200. $userPhone = UserPhoneDetail::query();
  1201. if (!empty($area_id)) {
  1202. $platform = $platform->whereHas('user', function ($q) use ($area_id) {
  1203. $q->where('register_area_id', $area_id);
  1204. });
  1205. $userPhone = $userPhone->whereHas('user', function ($q) use ($area_id) {
  1206. $q->where('register_area_id', $area_id);
  1207. });
  1208. }
  1209. switch ($days) {
  1210. case 'today':
  1211. $param_days = Carbon::today();
  1212. break;
  1213. case 'threeDays':
  1214. $param_days = Carbon::today()->subDays(3);
  1215. break;
  1216. case 'sevenDays':
  1217. $param_days = Carbon::today()->subDays(7);
  1218. break;
  1219. case 'fifteenDays':
  1220. $param_days = Carbon::today()->subDays(15);
  1221. break;
  1222. case 'thirtyDays':
  1223. $param_days = Carbon::today()->subDays(30);
  1224. break;
  1225. case 'oneMonth':
  1226. $param_days = Carbon::today()->subDays(30);
  1227. break;
  1228. case 'sixMonth':
  1229. $param_days = Carbon::today()->subMonths(6);
  1230. break;
  1231. default:
  1232. return $this->error('参数错误');
  1233. }
  1234. $platform = $platform->where('created_at', '>', $param_days)
  1235. ->where('platform', '!=', 'devtools')
  1236. ->groupBy(['platform'])
  1237. ->select('platform', DB::raw('count(id) as value'))
  1238. ->get()
  1239. ->toArray();
  1240. $userPhone = $userPhone->where('created_at', '>', $param_days)
  1241. ->groupBy(['model'])
  1242. ->select('model', DB::raw('count(id) as number'))
  1243. ->orderByDesc('number')
  1244. ->limit(10)
  1245. ->get()
  1246. ->toArray();
  1247. $total = UserPhoneDetail::query()->count('id');
  1248. if (!empty($platform)) {
  1249. foreach ($platform as &$v) {
  1250. // $v['percent'] = round($v['number'] / $total * 100 ,2) .'%';
  1251. $v['name'] = $v['platform'];
  1252. }
  1253. }
  1254. if (!empty($userPhone)) {
  1255. foreach ($userPhone as &$i) {
  1256. $i['percent'] = (float)number_format($i['number'] / $total * 100, 2);
  1257. }
  1258. }
  1259. return $this->ok(['platform' => $platform, 'userPhone' => $userPhone, 'total' => $total]);
  1260. dd($userPhone);
  1261. }
  1262. /**
  1263. * heatMap 热力图
  1264. *
  1265. * @param OrderFilter $orderFilter
  1266. * @return \Illuminate\Http\JsonResponse
  1267. * @author Fx
  1268. *
  1269. */
  1270. public function heatMap(OrderFilter $orderFilter)
  1271. {
  1272. $today = Carbon::today();
  1273. $order = Order::query()->filter($orderFilter)->where('created_at', '>', $today)->get();
  1274. $data1 = [];
  1275. if (!empty($order)) {
  1276. foreach ($order as $v) {
  1277. $location = json_decode($v->start_use_bike_location);
  1278. $data1[] = ['lat' => $location->latitude, 'lng' => $location->longitude, 'count' => 30];
  1279. }
  1280. }
  1281. $data = $data1;
  1282. return $this->ok($data);
  1283. }
  1284. }