IndexOpenController.php 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Filters\AreaFilter;
  4. use App\Filters\BikeFilter;
  5. use App\Filters\OrderFilter;
  6. use App\Filters\OrderRentFilter;
  7. use App\Filters\UserFilter;
  8. use App\Filters\WalletLogFilter;
  9. use App\Filters\WorkOrderFilter;
  10. use App\Handlers\BikeStatusInfoSyncHandler;
  11. use App\Http\Resources\AreaResource;
  12. use App\Models\AdminUser;
  13. use App\Models\AdminUserArea;
  14. use App\Models\Area;
  15. use App\Models\Bike;
  16. // use App\Models\BikeTrouble;
  17. use App\Models\Order;
  18. use App\Models\OrderRent;
  19. use App\Models\User;
  20. use App\Models\WalletLog;
  21. use App\Models\WorkOrder;
  22. use App\Utils\Admin;
  23. use App\Utils\RedisKeys;
  24. use Carbon\Carbon;
  25. use Illuminate\Http\Request;
  26. use App\Http\Controllers\Controller;
  27. use Illuminate\Support\Facades\Cache;
  28. use Illuminate\Support\Facades\DB;
  29. use Illuminate\Support\Facades\Log;
  30. class IndexOpenController extends Controller
  31. {
  32. protected $areaIds = [];
  33. public function __construct()
  34. {
  35. $admin_id = Admin::user()->id ?? '';
  36. if (!empty($admin_id)) {
  37. $this->areaIds = AdminUser::getAreaIdsByAdminId(Admin::user()->id);
  38. }
  39. }
  40. /**
  41. * topIndex 首页头部统计数据
  42. *
  43. * @param Request $request
  44. * @return \Illuminate\Http\JsonResponse
  45. * @author Fx
  46. *
  47. */
  48. public function topIndex(Request $request)
  49. {
  50. $area_id = $request->get('area_id') ?? '';
  51. $data = [];
  52. $data['new_order'] = $this->newOrder($area_id);
  53. $data['total_user'] = $this->totalUser($area_id);
  54. $data['total_order'] = $this->totalOrder($area_id);
  55. $data['total_profit'] = $this->totalProfit($area_id);
  56. $bike = Bike::query()->whereIn('put_area_id', $this->areaIds);
  57. if (!empty($area_id)) {
  58. $bike = $bike->where('put_area_id', $area_id);
  59. }
  60. $bike_num = $bike->where('put_status', Bike::PUT_STATUS_YES)->count();
  61. $data['total_put_bikes'] = $bike_num;
  62. return $this->ok($data);
  63. }
  64. /**
  65. * todoEvent 首页待办事项 统计数据
  66. *
  67. * @param BikeFilter $bikeFilter
  68. * @param OrderFilter $orderFilter
  69. * @param OrderRentFilter $orderRentFilter
  70. * @param WorkOrderFilter $workOrderFilter
  71. * @return \Illuminate\Http\JsonResponse
  72. * @author Fx
  73. *
  74. */
  75. public function todoEvent(BikeFilter $bikeFilter, OrderFilter $orderFilter, OrderRentFilter $orderRentFilter, WorkOrderFilter $workOrderFilter)
  76. {
  77. $data = [];
  78. $data['low_battery_num'] = Bike::query()->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
  79. $data['long_time_no_ridding'] = Bike::query()->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
  80. $data['long_time_no_return_ridding'] = Order::query()->filter($orderFilter)->whereIn('area_id', $this->areaIds);
  81. $long_time_no_return_ridding_order_rent = OrderRent::query()->filter($orderRentFilter)->whereIn('area_id', $this->areaIds);
  82. $data['trouble_num'] = Bike::query()->filter($bikeFilter)->whereIn('put_area_id', $this->areaIds);
  83. $data['warning_num'] = WorkOrder::query()->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter)->whereIn('area_id', $this->areaIds);
  84. $admin_id = 1;
  85. if (!Admin::isAdministrator()) {
  86. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  87. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->pluck('area_id')->toArray();
  88. $area_ids = array_merge($area_ids, $area_id);
  89. $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids);
  90. $data['long_time_no_ridding'] = $data['long_time_no_ridding']->whereIn('put_area_id', $area_ids);
  91. $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->whereIn('area_id', $area_ids);
  92. $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->whereIn('area_id', $area_ids);
  93. $data['trouble_num'] = $data['trouble_num']->whereIn('put_area_id', $area_ids);
  94. $data['warning_num'] = $data['warning_num']->whereIn('area_id', $area_ids);
  95. // if (count($area_ids) !== 0) {
  96. // $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids);
  97. // $data['long_time_no_ridding'] = $data['long_time_no_ridding']->whereIn('put_area_id', $area_ids);
  98. // $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->whereIn('area_id', $area_ids);
  99. // $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->whereIn('area_id', $area_ids);
  100. // $data['trouble_num'] = $data['trouble_num']->whereIn('put_area_id', $area_ids);
  101. // $data['warning_num'] = $data['warning_num']->whereIn('area_id', $area_ids);
  102. // } else {
  103. // $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  104. // $area_id = $area_id ?? 0;
  105. // $data['low_battery_num'] = $data['low_battery_num']->where('area_id', $area_id);
  106. // $data['long_time_no_ridding'] = $data['long_time_no_ridding']->where('area_id', $area_id);
  107. // $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->where('area_id', $area_id);
  108. // $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->where('area_id', $area_id);
  109. // $data['trouble_num'] = $data['trouble_num']->where('area_id', $area_id);
  110. // $data['warning_num'] = $data['warning_num']->where('area_id', $area_id);
  111. // }
  112. }
  113. // 低电量
  114. $data['low_battery_num'] = $data['low_battery_num']
  115. ->where('is_low_battery_power', Bike::BATTERY_POWER_LOW)
  116. ->count('id');
  117. // 24小时未骑车辆
  118. $data['long_time_no_ridding'] = $data['long_time_no_ridding']
  119. ->where('last_use_bike_end_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
  120. ->count('id');
  121. // 24小时未还车 此处查询订单
  122. $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']
  123. ->where(function ($q) {
  124. $q->where('status', Order::STATUS_PAUSE_BIKE)
  125. ->orWhere('status', Order::STATUS_RIDE_BIKE);
  126. })
  127. ->where('start_use_bike_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
  128. ->count('id');
  129. $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent
  130. ->where(function ($q) {
  131. $q->where('status', OrderRent::STATUS_RENT_BIKE);
  132. })
  133. ->where('start_use_bike_time', '<', date('Y-m-d H:i:s', strtotime('-1 days', time())))
  134. ->count('id');
  135. $data['long_time_no_return_ridding'] += $long_time_no_return_ridding_order_rent;
  136. //故障车辆
  137. $data['trouble_num'] = $data['trouble_num']
  138. ->where('is_trouble', Bike::TROUBLE_YES)
  139. ->count('id');
  140. // 报警信息
  141. $data['warning_num'] = $data['warning_num']
  142. ->where('status', WorkOrder::STATUS_NO)
  143. ->count('id');
  144. // $data['warning_num'] = 0;
  145. return $this->ok($data);
  146. }
  147. /**
  148. * profitPolygonalChart 总收益 折线统计图
  149. *
  150. * @param Request $request
  151. * @param WalletLogFilter $walletLogFilter
  152. * @return \Illuminate\Http\JsonResponse
  153. * @author Fx
  154. *
  155. */
  156. public function profitPolygonalChart(Request $request, WalletLogFilter $walletLogFilter)
  157. {
  158. $days = $request->get('days') ?? '';
  159. if (empty($days)) return $this->error('缺少参数');
  160. $profit = WalletLog::query()
  161. ->filter($walletLogFilter)
  162. ->whereIn('type', WalletLog::$addType);
  163. $admin_id = 1;
  164. if (!Admin::isAdministrator()) {
  165. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  166. if (count($area_ids) !== 0) {
  167. $profit = $profit->whereIn('area_id', $area_ids);
  168. } else {
  169. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  170. $area_id = $area_id ?? 0;
  171. $profit = $profit->where('area_id', $area_id);
  172. }
  173. }
  174. switch ($days) {
  175. case 'today':
  176. $today = Carbon::today();
  177. $profit = $profit->where('created_at', '>', $today)
  178. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,sum(money) as value')
  179. ->groupBy('date')->get();
  180. break;
  181. case 'threeDays':
  182. $threeDaysAgo = Carbon::today()->subDays(3);
  183. $profit = $profit->where('created_at', '>', $threeDaysAgo)
  184. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
  185. ->groupBy('date')->get();
  186. break;
  187. case 'sevenDays':
  188. $sevenDaysAgo = Carbon::today()->subDays(7);
  189. $profit = $profit->where('created_at', '>', $sevenDaysAgo)
  190. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
  191. ->groupBy('date')->get();
  192. break;
  193. case 'fifteenDays':
  194. $fifteenDaysAgo = Carbon::today()->subDays(15);
  195. $profit = $profit->where('created_at', '>', $fifteenDaysAgo)
  196. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,sum(money) as value')
  197. ->groupBy('date')->get();
  198. break;
  199. default:
  200. return $this->error('参数错误');
  201. }
  202. return $this->ok($profit);
  203. }
  204. /**
  205. * newUsersChart 新用户增长统计图
  206. *
  207. * @param Request $request
  208. * @return \Illuminate\Http\JsonResponse
  209. * @author Fx
  210. *
  211. */
  212. public function newUsersChart(Request $request)
  213. {
  214. $days = $request->get('days') ?? '';
  215. if (empty($days)) return $this->error('缺少参数');
  216. $newUsers = User::query()
  217. ->where('is_card_certified', User::CARD_OK);
  218. $admin_id = 1;
  219. if (!Admin::isAdministrator()) {
  220. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  221. if (count($area_ids) !== 0) {
  222. $newUsers = $newUsers->whereIn('register_area_id', $area_ids);
  223. } else {
  224. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  225. $area_id = $area_id ?? 0;
  226. $newUsers = $newUsers->where('register_area_id', $area_id);
  227. }
  228. }
  229. switch ($days) {
  230. case 'today':
  231. $today = Carbon::today();
  232. $newUsers = $newUsers->where('created_at', '>', $today)
  233. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
  234. ->groupBy('date')->get();
  235. break;
  236. case 'threeDays':
  237. $threeDaysAgo = Carbon::today()->subDays(3);
  238. $newUsers = $newUsers->where('created_at', '>', $threeDaysAgo)
  239. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  240. ->groupBy('date')->get();
  241. break;
  242. case 'sevenDays':
  243. $sevenDaysAgo = Carbon::today()->subDays(7);
  244. $newUsers = $newUsers->where('created_at', '>', $sevenDaysAgo)
  245. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  246. ->groupBy('date')->get();
  247. break;
  248. case 'fifteenDays':
  249. $fifteenDaysAgo = Carbon::today()->subDays(15);
  250. $newUsers = $newUsers->where('created_at', '>', $fifteenDaysAgo)
  251. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  252. ->groupBy('date')->get();
  253. break;
  254. default:
  255. return $this->error('参数错误');
  256. }
  257. return $this->ok($newUsers);
  258. }
  259. /**
  260. * newOrderChart 新订单统计图
  261. *
  262. * @param Request $request
  263. * @param OrderFilter $orderFilter
  264. * @return \Illuminate\Http\JsonResponse
  265. * @author Fx
  266. *
  267. */
  268. public function newOrderChart(Request $request, OrderFilter $orderFilter)
  269. {
  270. $days = $request->get('days') ?? '';
  271. if (empty($days)) return $this->error('缺少参数');
  272. $newOrders = Order::query()
  273. ->filter($orderFilter)
  274. ->where('status', Order::STATUS_COMPLETE_ORDER);
  275. $admin_id = 1;
  276. if (!Admin::isAdministrator()) {
  277. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  278. if (count($area_ids) !== 0) {
  279. $newOrders = $newOrders->whereIn('area_id', $area_ids);
  280. } else {
  281. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  282. $area_id = $area_id ?? 0;
  283. $newOrders = $newOrders->where('area_id', $area_id);
  284. }
  285. }
  286. switch ($days) {
  287. case 'today':
  288. $today = Carbon::today();
  289. $newOrders = $newOrders->where('created_at', '>', $today)
  290. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
  291. ->groupBy('date')->get();
  292. break;
  293. case 'yesterday':
  294. $yesterday = Carbon::yesterday();
  295. $newOrders = $newOrders->where('created_at', '>', $yesterday)
  296. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
  297. ->groupBy('date')->get();
  298. break;
  299. case 'threeDays':
  300. $threeDaysAgo = Carbon::today()->subDays(3);
  301. $newOrders = $newOrders->where('created_at', '>', $threeDaysAgo)
  302. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  303. ->groupBy('date')->get();
  304. break;
  305. case 'sevenDays':
  306. $sevenDaysAgo = Carbon::today()->subDays(7);
  307. $newOrders = $newOrders->where('created_at', '>', $sevenDaysAgo)
  308. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  309. ->groupBy('date')->get();
  310. break;
  311. case 'fifteenDays':
  312. $fifteenDaysAgo = Carbon::today()->subDays(15);
  313. $newOrders = $newOrders->where('created_at', '>', $fifteenDaysAgo)
  314. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  315. ->groupBy('date')->get();
  316. break;
  317. default:
  318. return $this->error('参数错误');
  319. }
  320. return $this->ok($newOrders);
  321. }
  322. /**
  323. * newDayRentOrderChart 日租新订单统计图
  324. *
  325. * @param Request $request
  326. * @return \Illuminate\Http\JsonResponse
  327. * @author Fx
  328. *
  329. */
  330. public function newDayRentOrderChart(Request $request)
  331. {
  332. $days = $request->get('days') ?? '';
  333. if (empty($days)) return $this->error('缺少参数');
  334. $newOrders = OrderRent::query()
  335. ->where('status', OrderRent::STATUS_COMPLETE_ORDER);
  336. $admin_id = 1;
  337. if (!Admin::isAdministrator()) {
  338. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  339. if (count($area_ids) !== 0) {
  340. $newOrders = $newOrders->whereIn('area_id', $area_ids);
  341. } else {
  342. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  343. $area_id = $area_id ?? 0;
  344. $newOrders = $newOrders->where('area_id', $area_id);
  345. }
  346. }
  347. switch ($days) {
  348. case 'today':
  349. $today = Carbon::today();
  350. $newOrders = $newOrders->where('pay_time', '>', $today)
  351. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d/%H") as date,count(id) as value')
  352. ->groupBy('date')->get();
  353. break;
  354. case 'threeDays':
  355. $threeDaysAgo = Carbon::today()->subDays(3);
  356. $newOrders = $newOrders->where('pay_time', '>', $threeDaysAgo)
  357. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  358. ->groupBy('date')->get();
  359. break;
  360. case 'sevenDays':
  361. $sevenDaysAgo = Carbon::today()->subDays(7);
  362. $newOrders = $newOrders->where('pay_time', '>', $sevenDaysAgo)
  363. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  364. ->groupBy('date')->get();
  365. break;
  366. case 'fifteenDays':
  367. $fifteenDaysAgo = Carbon::today()->subDays(15);
  368. $newOrders = $newOrders->where('pay_time', '>', $fifteenDaysAgo)
  369. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  370. ->groupBy('date')->get();
  371. break;
  372. default:
  373. return $this->error('参数错误');
  374. }
  375. return $this->ok($newOrders);
  376. }
  377. /**
  378. * riddingRanking 普通订单骑行排行榜
  379. *
  380. * @param Request $request
  381. * @return \Illuminate\Http\JsonResponse
  382. * @author Fx
  383. *
  384. */
  385. public function riddingRanking(Request $request)
  386. {
  387. $days = $request->get('days') ?? '';
  388. if (empty($days)) return $this->error('缺少参数');
  389. $order = Order::query()
  390. ->where('status', Order::STATUS_COMPLETE_ORDER)
  391. ->with(['users']);
  392. $admin_id = 1;
  393. if (!Admin::isAdministrator()) {
  394. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  395. if (count($area_ids) !== 0) {
  396. $order = $order->whereIn('area_id', $area_ids);
  397. } else {
  398. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  399. $area_id = $area_id ?? 0;
  400. $order = $order->where('area_id', $area_id);
  401. }
  402. }
  403. switch ($days) {
  404. case 'today':
  405. $today = Carbon::today();
  406. $order = $order->where('created_at', '>', $today);
  407. break;
  408. case 'sevenDays':
  409. $time = Carbon::today()->subDays(7);
  410. $order = $order->where('created_at', '>', $time);
  411. break;
  412. case 'oneMonth':
  413. $time = Carbon::today()->subMonth();
  414. $order = $order->where('created_at', '>', $time);
  415. break;
  416. case 'sixMonth':
  417. $time = Carbon::today()->subMonths(6);
  418. $order = $order->where('created_at', '>', $time);
  419. break;
  420. default:
  421. return $this->error('参数错误');
  422. }
  423. $order = $order
  424. ->groupBy(['user_id'])
  425. ->select('user_id', DB::raw('count(id) as total_num'))
  426. ->orderByDesc('total_num')
  427. ->get()
  428. ->take(10);
  429. // ->take(10);
  430. // Log::info($order);
  431. $i = 0;
  432. foreach ($order as &$v) {
  433. $v['username'] = $v->users->nickname ?? '';
  434. $v['phone'] = $v->users->mobile ?? '';
  435. $v['ranking'] = ++$i;
  436. unset($v);
  437. }
  438. return $this->ok($order);
  439. }
  440. /**
  441. * riddingRankingByDayRentOrder 日租订单骑行排行榜
  442. *
  443. * @param Request $request
  444. * @return \Illuminate\Http\JsonResponse
  445. * @author Fx
  446. *
  447. */
  448. public function riddingRankingByDayRentOrder(Request $request)
  449. {
  450. $days = $request->get('days') ?? '';
  451. if (empty($days)) return $this->error('缺少参数');
  452. $order = OrderRent::query()
  453. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  454. ->with(['users']);
  455. $admin_id = 1;
  456. if (!Admin::isAdministrator()) {
  457. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  458. if (count($area_ids) !== 0) {
  459. $order = $order->whereIn('area_id', $area_ids);
  460. } else {
  461. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  462. $area_id = $area_id ?? 0;
  463. $order = $order->where('area_id', $area_id);
  464. }
  465. }
  466. switch ($days) {
  467. case 'today':
  468. $today = Carbon::today();
  469. $order = $order->where('pay_time', '>', $today);
  470. break;
  471. case 'sevenDays':
  472. $time = Carbon::today()->subDays(7);
  473. $order = $order->where('pay_time', '>', $time);
  474. break;
  475. case 'oneMonth':
  476. $time = Carbon::today()->subMonth();
  477. $order = $order->where('pay_time', '>', $time);
  478. break;
  479. case 'sixMonth':
  480. $time = Carbon::today()->subMonths(6);
  481. $order = $order->where('pay_time', '>', $time);
  482. break;
  483. default:
  484. return $this->error('参数错误');
  485. }
  486. $order = $order
  487. ->groupBy(['user_id'])
  488. ->select('user_id', DB::raw('count(id) as total_num'))
  489. ->orderByDesc('total_num')
  490. ->get()
  491. ->take(10);
  492. // ->take(10);
  493. // Log::info($order);
  494. if (count($order) == 0) return $this->ok([]);
  495. $i = 0;
  496. foreach ($order as &$v) {
  497. $v['username'] = $v->users->nickname ?? '';
  498. $v['phone'] = $v->users->mobile ?? '';
  499. $v['ranking'] = ++$i;
  500. unset($v);
  501. }
  502. return $this->ok($order);
  503. }
  504. /**
  505. * bikeProfitRanking 车辆收益统计排行榜
  506. *
  507. * @return \Illuminate\Http\JsonResponse
  508. * @author Fx
  509. *
  510. */
  511. public function bikeProfitRanking()
  512. {
  513. $bikes = Bike::query();
  514. $admin_id = 1;
  515. if (!Admin::isAdministrator()) {
  516. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  517. if (count($area_ids) !== 0) {
  518. $bikes = $bikes->whereIn('put_area_id', $area_ids);
  519. } else {
  520. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  521. $area_id = $area_id ?? 0;
  522. $bikes = $bikes->where('put_area_id', $area_id);
  523. }
  524. }
  525. $bikes = $bikes->get();
  526. $data = [];
  527. if (count($bikes) === 0) return $this->ok($data);
  528. foreach ($bikes as $k => $v) {
  529. $bike_insert_time = $v->created_at ? date('Y-m-d H:i:s', strtotime($v->created_at)) : '';
  530. $days = Carbon::today()->diffInDays($bike_insert_time);
  531. $per_money = 0;
  532. if ($days != 0) {
  533. $per_money = round($v->total_money / $days, 2);
  534. }
  535. // $v['phone'] = $v->users->mobile ?? '';
  536. $data[] = [
  537. 'bike_no' => $v->bike_no ?? '',
  538. 'put_days' => $days,
  539. 'total_money' => $v->total_money,
  540. 'per_money' => $per_money
  541. ];
  542. $volume[$k] = $per_money; // 排序依据
  543. $edition[$k] = $v->bike_no ?? ''; // 排序人
  544. // $v['ranking'] = ++$i;
  545. unset($v);
  546. }
  547. array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
  548. if (count($data) > 10) {
  549. $res = array_slice($data, 0, 10);
  550. } else {
  551. $res = $data;
  552. }
  553. return $this->ok($res);
  554. }
  555. /**
  556. * totalUser 总用户数量统计
  557. *
  558. * @param string $area_id
  559. * @return array
  560. * @author Fx
  561. *
  562. */
  563. protected function totalUser($area_id = '')
  564. {
  565. $totalUser = [];
  566. $yesterday = Carbon::yesterday();
  567. $today = Carbon::today();
  568. $yesterdayNewUser = User::query();
  569. $todayNewUser = User::query();
  570. $total = User::query();
  571. if (!empty($area_id)) {
  572. $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
  573. $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
  574. $total = $total->where('register_area_id', $area_id);
  575. }
  576. $admin_id = 1;
  577. if (!Admin::isAdministrator()) {
  578. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  579. if (count($area_ids) !== 0) {
  580. $yesterdayNewUser = $yesterdayNewUser->whereIn('register_area_id', $area_ids);
  581. $todayNewUser = $todayNewUser->whereIn('register_area_id', $area_ids);
  582. $total = $total->whereIn('register_area_id', $area_ids);
  583. } else {
  584. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  585. $area_id = $area_id ?? 0;
  586. $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
  587. $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
  588. $total = $total->where('register_area_id', $area_id);
  589. }
  590. }
  591. //昨日新增用户
  592. $yesterdayNewUser = $yesterdayNewUser
  593. ->where('created_at', '>', $yesterday)
  594. ->where('created_at', '<', $today)
  595. ->count('id');
  596. //今日新增用户数
  597. $todayNewUser = $todayNewUser
  598. ->where('created_at', '>', $today)
  599. ->count('id');
  600. $total = $total->count('id');
  601. $userDifference = (int)$todayNewUser - (int)$yesterdayNewUser;
  602. $totalUser['total_num'] = $total;
  603. if ($userDifference < 0) {
  604. $totalUser['diff'] = '1'; // 表示下降
  605. } elseif ($userDifference === 0) {
  606. $totalUser['diff'] = '2'; // 表示无变化
  607. } else {
  608. $totalUser['diff'] = '3'; // 表示上升
  609. }
  610. $totalUser['difference'] = abs($userDifference);
  611. return $totalUser;
  612. }
  613. /**
  614. * totalOrder 总订单数量统计
  615. *
  616. * @param string $area_id
  617. * @return array
  618. * @author Fx
  619. *
  620. */
  621. protected function totalOrder($area_id = '')
  622. {
  623. $totalOrder = $this->orderStistics($area_id);
  624. unset($totalOrder['new_num']); // 删除多余得本日新增订单数
  625. return $totalOrder;
  626. }
  627. /**
  628. * newOrder 新订单统计
  629. *
  630. * @param string $area_id
  631. * @return array
  632. * @author Fx
  633. *
  634. */
  635. protected function newOrder($area_id = '')
  636. {
  637. $newOrder = $this->orderStistics($area_id);
  638. unset($newOrder['total_num']); // 删除多余得总订单数
  639. return $newOrder;
  640. }
  641. /**
  642. * orderStistics 订单数量统计
  643. *
  644. * @param string $area_id
  645. * @return array
  646. * @author Fx
  647. *
  648. */
  649. protected function orderStistics($area_id = '')
  650. {
  651. $totalOrder = [];
  652. $yesterday = Carbon::yesterday();
  653. $today = Carbon::today();
  654. $yesterdayOrderNum = Order::query();
  655. $todayOrderNum = Order::query();
  656. $total = Order::query();
  657. $yesterdayOrderRentNum = OrderRent::query();
  658. $todayOrderRentNum = OrderRent::query();
  659. $totalOrderRent = OrderRent::query();
  660. if ($area_id != '') {
  661. // Log::info($area_id);
  662. $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
  663. $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
  664. $total = $total->where('area_id', $area_id);
  665. $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
  666. }
  667. $admin_id = 1;
  668. if (!Admin::isAdministrator()) {
  669. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  670. if (count($area_ids) !== 0) {
  671. $yesterdayOrderNum = $yesterdayOrderNum->whereIn('area_id', $area_ids);
  672. $todayOrderNum = $todayOrderNum->whereIn('area_id', $area_ids);
  673. $total = $total->whereIn('area_id', $area_ids);
  674. $yesterdayOrderRentNum = $yesterdayOrderRentNum->whereIn('area_id', $area_ids);
  675. $todayOrderRentNum = $todayOrderRentNum->whereIn('area_id', $area_ids);
  676. $totalOrderRent = $totalOrderRent->whereIn('area_id', $area_ids);
  677. } else {
  678. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  679. $area_id = $area_id ?? 0;
  680. $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
  681. $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
  682. $total = $total->where('area_id', $area_id);
  683. $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id);
  684. $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id);
  685. $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
  686. }
  687. }
  688. // 昨日新订单数
  689. $yesterdayOrderNum = $yesterdayOrderNum
  690. ->where('pay_time', '>', $yesterday)
  691. ->where('pay_time', '<', $today)
  692. ->where('status', Order::STATUS_COMPLETE_ORDER)
  693. ->count('id');
  694. $yesterdayOrderRentNum = $yesterdayOrderRentNum
  695. ->where('pay_time', '>', $yesterday)
  696. ->where('pay_time', '<', $today)
  697. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  698. ->count('id');
  699. // 今日新订单数
  700. $todayOrderNum = $todayOrderNum
  701. ->where('pay_time', '>', $today)
  702. ->where('status', Order::STATUS_COMPLETE_ORDER)
  703. ->count('id');
  704. $todayOrderRentNum = $todayOrderRentNum
  705. ->where('pay_time', '>', $today)
  706. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  707. ->count('id');
  708. // 总订单数
  709. $total = $total
  710. ->where('status', Order::STATUS_COMPLETE_ORDER)
  711. ->count('id');
  712. $totalOrderRent = $totalOrderRent
  713. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  714. ->count('id');
  715. $orderDifference = (int)$todayOrderNum - (int)$yesterdayOrderNum;
  716. $orderRentDifference = (int)$todayOrderRentNum - (int)$yesterdayOrderRentNum;
  717. $orderDifference += $orderRentDifference;
  718. $totalOrder['new_num'] = $todayOrderNum + $todayOrderRentNum;
  719. $totalOrder['total_num'] = $total + $totalOrderRent;
  720. // Log::info($total);
  721. // Log::info($totalOrderRent);
  722. if ($orderDifference < 0) {
  723. $totalOrder['diff'] = '1'; // 表示下降
  724. } elseif ($orderDifference === 0) {
  725. $totalOrder['diff'] = '2'; // 表示无变化
  726. } else {
  727. $totalOrder['diff'] = '3'; // 表示上升
  728. }
  729. $totalOrder['difference'] = abs($orderDifference);
  730. return $totalOrder;
  731. }
  732. /**
  733. * totalProfit 总收益数据统计
  734. *
  735. * @param string $area_id
  736. * @return array
  737. * @author Fx
  738. *
  739. */
  740. protected function totalProfit($area_id = '')
  741. {
  742. $totalProfit = [];
  743. $yesterday = Carbon::yesterday();
  744. $today = Carbon::today();
  745. $yesterdayProfit = WalletLog::query();
  746. $todayProfit = WalletLog::query();
  747. $total = WalletLog::query();
  748. if (!empty($area_id)) {
  749. $yesterdayProfit = $yesterdayProfit->where('area_id', $area_id);
  750. $todayProfit = $todayProfit->where('area_id', $area_id);
  751. $total = $total->where('area_id', $area_id);
  752. }
  753. $admin_id = 1;
  754. if (!Admin::isAdministrator()) {
  755. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  756. if (count($area_ids) !== 0) {
  757. $yesterdayProfit = $yesterdayProfit->whereIn('area_id', $area_ids);
  758. $todayProfit = $todayProfit->whereIn('area_id', $area_ids);
  759. $total = $total->whereIn('area_id', $area_ids);
  760. } else {
  761. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  762. $area_id = $area_id ?? 0;
  763. $yesterdayProfit = $yesterdayProfit->where('area_id', $area_id);
  764. $todayProfit = $todayProfit->where('area_id', $area_id);
  765. $total = $total->where('area_id', $area_id);
  766. }
  767. }
  768. // 昨日日收益
  769. $yesterdayProfit = $yesterdayProfit
  770. ->where('created_at', '>', $yesterday)
  771. ->where('created_at', '<', $today)
  772. ->whereIn('type', WalletLog::$addType)
  773. ->sum('money');
  774. // 今日收益
  775. $todayProfit = $todayProfit
  776. ->where('created_at', '>', $today)
  777. ->whereIn('type', WalletLog::$addType)
  778. ->sum('money');
  779. //总收益
  780. $total = $total
  781. ->whereIn('type', WalletLog::$addType)
  782. ->sum('money');
  783. $profitDifference = bcsub($todayProfit, $yesterdayProfit, 2);
  784. $totalProfit['total_num'] = $total;
  785. $totalProfit['today_num'] = (float)$todayProfit;
  786. if ($profitDifference < 0) {
  787. $totalProfit['diff'] = '1'; // 下降
  788. } elseif ($profitDifference > 0) {
  789. $totalProfit['diff'] = '3'; // 上升
  790. } else {
  791. $totalProfit['diff'] = '2'; // 上升
  792. }
  793. $totalProfit['difference'] = abs($profitDifference);
  794. return $totalProfit;
  795. }
  796. /**
  797. * heatMap 热力图
  798. *
  799. * @param OrderFilter $orderFilter
  800. * @return \Illuminate\Http\JsonResponse
  801. * @author Fx
  802. *
  803. */
  804. public function heatMap(OrderFilter $orderFilter)
  805. {
  806. $today = Carbon::today()->subMonth();
  807. $order = Order::query()->whereIn('area_id', $this->areaIds)->filter($orderFilter)->where('created_at', '>', $today)->get();
  808. $data1 = [];
  809. $data2 = [];
  810. if (!empty($order)) {
  811. foreach ($order as $v) {
  812. $location = json_decode($v->start_use_bike_location);
  813. $location2 = json_decode($v->end_use_bike_location);
  814. $data1[] = ['lat' => $location->latitude, 'lng' => $location->longitude, 'count' => 3];
  815. if (!empty($location2)) {
  816. $data2[] = ['lat' => $location2->latitude, 'lng' => $location2->longitude, 'count' => 3];
  817. }
  818. }
  819. }
  820. $data = [
  821. 'start' => $data1,
  822. 'end' => $data2
  823. ];
  824. return $this->ok($data);
  825. }
  826. /**
  827. * indexOpen 地图区域
  828. *
  829. * @param Request $request
  830. * @param AreaFilter $filter
  831. * @return \Illuminate\Http\JsonResponse
  832. * @author Fx
  833. *
  834. */
  835. public function indexOpen(Request $request, AreaFilter $filter)
  836. {
  837. //
  838. $area = Area::query()
  839. ->filter($filter);
  840. //->orderByDesc('id');
  841. if (!Admin::isAdministrator()) {
  842. $admin_id = Admin::user()->id;
  843. $ids = AdminUser::getAreaIdsByAdminId($admin_id);
  844. $area = $area->whereIn('id', $ids);
  845. }
  846. $area = $request->get('all') ? $area->get() : $area->paginate();
  847. return $this->ok(AreaResource::collection($area));
  848. }
  849. /**
  850. * mapsOpen 地图车辆
  851. *
  852. * @param Request $request
  853. * @param BikeFilter $filter
  854. * @return \Illuminate\Http\JsonResponse
  855. * @author Fx
  856. *
  857. */
  858. public function mapsOpen(Request $request, BikeFilter $filter)
  859. {
  860. //
  861. $admin_id = Admin::user()->id;
  862. $bike = Bike::query()->filter($filter)->orderByDesc('id');
  863. if (!Admin::isAdministrator()) {
  864. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  865. if (count($area_ids) !== 0) {
  866. $bike = $bike->whereIn('put_area_id', $area_ids);
  867. } else {
  868. $area = AdminUserArea::query()->where('admin_id', $admin_id)->first();
  869. $area_id = $area->area_id ?? 0;
  870. $bike = $bike->where('put_area_id', $area_id);
  871. }
  872. }
  873. $bike = $bike->get();
  874. $data = [];
  875. foreach ($bike as $v) {
  876. $style = 1;
  877. if ($v->is_low_battery_power == Bike::BATTERY_POWER_LOW) {
  878. $style = 0;
  879. } elseif ($v->is_riding == Bike::RIDING_YES) {
  880. $style = 2;
  881. }
  882. $data[] = [
  883. 'lnglat' => $v->last_location ? [json_decode($v->last_location)->lng, json_decode($v->last_location)->lat] : [116.397546, 39.909153],
  884. 'name' => $v->bike_no,
  885. 'id' => $v->id,
  886. 'style' => $style
  887. ];
  888. }
  889. return $this->ok($data);
  890. // return $this->ok(BikeResource::collection($bike));
  891. }
  892. /**
  893. * statistics 简要统计信息
  894. *
  895. * @param BikeFilter $filter
  896. * @return \Illuminate\Http\JsonResponse
  897. * @author Fx
  898. *
  899. */
  900. public function statisticsOpen(BikeFilter $filter)
  901. {
  902. $riding_yes_num = Bike::query()->filter($filter)->where('is_riding', Bike::RIDING_YES); //使用中的数量
  903. $riding_no_num = Bike::query()->filter($filter)->where('is_riding', Bike::RIDING_NO); //未使用的数量
  904. $low_power_num = Bike::query()->filter($filter)->where('is_low_battery_power', Bike::BATTERY_POWER_LOW); //低电量的数量
  905. $admin_id = Admin::user()->id;
  906. if (!Admin::isAdministrator()) {
  907. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  908. if (count($area_ids) !== 0) {
  909. $riding_yes_num = $riding_yes_num->whereIn('put_area_id', $area_ids);
  910. $riding_no_num = $riding_no_num->whereIn('put_area_id', $area_ids);
  911. $low_power_num = $low_power_num->whereIn('put_area_id', $area_ids);
  912. } else {
  913. $area = AdminUserArea::query()->where('admin_id', $admin_id)->first();
  914. $area_id = $area->area_id ?? 0;
  915. $riding_yes_num = $riding_yes_num->where('put_area_id', $area_id);
  916. $riding_no_num = $riding_no_num->where('put_area_id', $area_id);
  917. $low_power_num = $low_power_num->where('put_area_id', $area_id);
  918. }
  919. }
  920. $riding_yes_num = $riding_yes_num->count('id');
  921. $riding_no_num = $riding_no_num->count('id');
  922. $low_power_num = $low_power_num->count('id');
  923. $worker_riding_num = app()->redis->hkeys(BikeStatusInfoSyncHandler::REDIS_RIDE_BIKE_WORKER_ORDERS_TAG);
  924. $data = [
  925. 'riding_yes_num' => $riding_yes_num,
  926. 'riding_no_num' => $riding_no_num,
  927. 'low_power_num' => $low_power_num,
  928. 'worker_riding_num' => Bike::query()->filter($filter)->whereIn('bike_no', $worker_riding_num)->count('id')
  929. ];
  930. return $this->ok($data);
  931. }
  932. /**
  933. * acticveWxUserSattistics 小程序昨日活跃用户年龄统计
  934. *
  935. * @return \Illuminate\Http\JsonResponse
  936. * @author Fx
  937. *
  938. */
  939. public function acticveWxUserSattistics()
  940. {
  941. $yesterday = Carbon::yesterday()->format('Ymd');
  942. $last_month_yseterday = Carbon::yesterday()->subDays(29)->format('Ymd');
  943. $app = app('wechat.mini_program');
  944. $data = $app->data_cube->userPortrait($last_month_yseterday, $yesterday);
  945. $ages = $data['visit_uv']['ages'];
  946. $genders = $data['visit_uv']['genders'];
  947. return $this->ok(['ages' => $ages, 'genders' => $genders]);
  948. }
  949. /**
  950. * 前七天小时订单统计
  951. * @return \Illuminate\Http\JsonResponse
  952. * User: Mead
  953. */
  954. public function hourOrderNumber(Request $request, OrderFilter $filter)
  955. {
  956. $day = [
  957. ["num" => 0, "hour" => 0],
  958. ["num" => 0, "hour" => 1],
  959. ["num" => 0, "hour" => 2],
  960. ["num" => 0, "hour" => 3],
  961. ["num" => 0, "hour" => 4],
  962. ["num" => 0, "hour" => 5],
  963. ["num" => 0, "hour" => 6],
  964. ["num" => 0, "hour" => 7],
  965. ["num" => 0, "hour" => 8],
  966. ["num" => 0, "hour" => 9],
  967. ["num" => 0, "hour" => 10],
  968. ["num" => 0, "hour" => 11],
  969. ["num" => 0, "hour" => 12],
  970. ["num" => 0, "hour" => 13],
  971. ["num" => 0, "hour" => 14],
  972. ["num" => 0, "hour" => 15],
  973. ["num" => 0, "hour" => 16],
  974. ["num" => 0, "hour" => 17],
  975. ["num" => 0, "hour" => 18],
  976. ["num" => 0, "hour" => 19],
  977. ["num" => 0, "hour" => 20],
  978. ["num" => 0, "hour" => 21],
  979. ["num" => 0, "hour" => 22],
  980. ["num" => 0, "hour" => 23]
  981. ];
  982. $weeks = [];
  983. for ($i = 1, $c = 7; $i < 7; $i++, $c--) {
  984. $now = Carbon::parse("-{$i}day");
  985. $date = $now->toDateString();
  986. $key = "{$date}-hour-order-num";
  987. $area_id = $request->get('area_id') ?? '';
  988. if (!empty($area_id)) {
  989. $key = $key . '-area_id:' . $area_id;
  990. }
  991. $weeks["{$date}"] = Cache::remember($key, Carbon::parse("+{$c}day")->diffInMinutes(Carbon::now()), function () use ($date, $day, $filter) {
  992. return array_replace($day, Order::query()->filter($filter)->whereDate("created_at", $date)->whereIn('area_id', $this->areaIds)->select(DB::raw("count(*) as num,DATE_FORMAT(created_at,'%H') as hour"))->groupBy("hour")->get()->mapWithKeys(function ($item) {
  993. $arr = [
  994. 'num' => (integer)$item->num,
  995. 'hour' => (integer)$item->hour,
  996. ];
  997. return [(integer)$item->hour => $arr];
  998. })->toArray());
  999. });
  1000. }
  1001. $data = [
  1002. 'date' => [],
  1003. 'data' => []
  1004. ];
  1005. foreach ($weeks as $k => $v) {
  1006. $data['date'][] = $k;
  1007. $data['data'][$k] = [];
  1008. foreach ($v as $value) {
  1009. array_push($data['data'][$k], $value['num']);
  1010. }
  1011. }
  1012. // dd($data);
  1013. return $this->ok($data);
  1014. }
  1015. /**
  1016. * recentMonthOrderProfit 近月新增订单收益
  1017. *
  1018. * @param OrderFilter $orderFilter
  1019. * @return \Illuminate\Http\JsonResponse
  1020. * @author Fx
  1021. *
  1022. */
  1023. public function recentMonthOrderProfit(OrderFilter $orderFilter)
  1024. {
  1025. $recentMonth = Carbon::now()->subMonth();
  1026. $order = Order::query()
  1027. ->whereIn('area_id', $this->areaIds)
  1028. ->filter($orderFilter)
  1029. ->where('created_at', '>', $recentMonth)
  1030. ->selectRaw('DATE_FORMAT(created_at,"%Y-%m-%d") as dateWeek,sum(pay_money) as value')
  1031. ->groupBy('dateWeek')->get();
  1032. //dd($order);
  1033. return $this->ok($order);
  1034. }
  1035. /**
  1036. * recentMonthAddUser 近月新增用户
  1037. *
  1038. * @param UserFilter $userFilter
  1039. * @return \Illuminate\Http\JsonResponse
  1040. * @author Fx
  1041. *
  1042. */
  1043. public function recentMonthAddUser(UserFilter $userFilter)
  1044. {
  1045. $recentMonth = Carbon::now()->subMonth();
  1046. $order = User::query()
  1047. ->whereIn('register_area_id', $this->areaIds)
  1048. ->filter($userFilter)
  1049. ->where('created_at', '>', $recentMonth)
  1050. ->selectRaw('DATE_FORMAT(created_at,"%Y-%m-%d") as dateWeek,count(id) as value')
  1051. ->groupBy('dateWeek')->get();
  1052. //dd($order);
  1053. return $this->ok($order);
  1054. }
  1055. }