IndexController.php 42 KB

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