IndexOpenController.php 44 KB

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