AggregateStatisticsController.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  1. <?php
  2. namespace App\Http\Controllers\App;
  3. use App\Filters\BikeFilter;
  4. use App\Filters\CardRidingOrderFilter;
  5. use App\Filters\DepositCardOrderFilter;
  6. use App\Filters\DepositFilter;
  7. use App\Filters\OrderFilter;
  8. use App\Filters\OrderRentFilter;
  9. use App\Filters\RechargeOrderFilter;
  10. use App\Filters\UserFilter;
  11. use App\Filters\WalletLogFilter;
  12. use App\Filters\WorkOrderFilter;
  13. use App\Models\AdminUser;
  14. use App\Models\Bike;
  15. use App\Models\CardRidingOrder;
  16. use App\Models\DepositCardOrder;
  17. use App\Models\DepositOrder;
  18. use App\Models\Order;
  19. use App\Models\OrderRent;
  20. use App\Models\RechargeOrder;
  21. use App\Models\User;
  22. use App\Models\WorkOrder;
  23. use App\Utils\Admin;
  24. use Carbon\Carbon;
  25. use Illuminate\Http\Request;
  26. use App\Http\Controllers\Controller;
  27. use Illuminate\Support\Facades\DB;
  28. use Illuminate\Support\Facades\Log;
  29. class AggregateStatisticsController extends AppBaseController
  30. {
  31. //
  32. /**
  33. * userStatistics 用户统计
  34. *
  35. * @param UserFilter $filter
  36. * @param OrderFilter $orderFilter
  37. * @return array
  38. * @author Fx
  39. *
  40. */
  41. public function userStatistics(UserFilter $filter, OrderFilter $orderFilter)
  42. {
  43. $area_ids = self::$areaIds;
  44. // 总用户
  45. $totalUser = User::query()
  46. ->whereIn('register_area_id', $area_ids)
  47. ->filter($filter)
  48. ->count('id');
  49. // 押金用户
  50. $depositUser = User::query()
  51. ->whereIn('register_area_id', $area_ids)
  52. ->where('is_deposit', User::DEPOSIT_OK)
  53. ->filter($filter)
  54. ->count('id');
  55. //有效用户
  56. $cardUser = User::query()
  57. ->whereIn('register_area_id', $area_ids)
  58. ->where('is_card_certified', User::CARD_OK)
  59. ->filter($filter)
  60. ->count('id');
  61. //今日新增
  62. $todayAddUser = User::query()
  63. ->whereIn('register_area_id', $area_ids)
  64. ->where('is_card_certified', User::CARD_OK)
  65. ->where('created_at', '>', Carbon::today())
  66. ->filter($filter)
  67. ->count('id');
  68. // 今日活跃
  69. $todayActiveOrder = Order::query()
  70. ->whereIn('area_id', $area_ids)
  71. ->where('created_at', '>', Carbon::today())
  72. ->filter($orderFilter)
  73. ->get(['user_id'])
  74. ->toArray();
  75. $todayActiveUserArr = [];
  76. foreach ($todayActiveOrder as $v) {
  77. $todayActiveUserArr[] = $v['user_id'];
  78. }
  79. $todayActiveUser = count(array_unique($todayActiveUserArr)); //去重复后计算总数
  80. $data1 = [
  81. 'totalUser' => $totalUser ?? 0,
  82. 'depositUser' => $depositUser ?? 0,
  83. 'cardUser' => $cardUser ?? 0,
  84. 'todayAddUser' => $todayAddUser ?? 0,
  85. 'todayActiveUser' => $todayActiveUser ?? 0
  86. ];
  87. return $data1;
  88. }
  89. /**
  90. * bikeStatistics 车辆统计
  91. *
  92. * @param BikeFilter $filter
  93. * @return array
  94. * @author Fx
  95. *
  96. */
  97. public function bikeStatistics(BikeFilter $filter)
  98. {
  99. $data = [];
  100. $area_ids = self::$areaIds;
  101. // 总车辆数
  102. $data['total_bikes'] = Bike::query()
  103. ->whereIn('put_area_id', $area_ids)
  104. ->filter($filter)
  105. ->count('id');
  106. // 上线车辆数
  107. $data['put_total_bikes'] = Bike::query()
  108. ->whereIn('put_area_id', $area_ids)
  109. ->filter($filter)
  110. ->where('put_status', Bike::PUT_STATUS_YES)
  111. ->count('id');
  112. // 在线车辆数
  113. $data['line_total_bikes'] = Bike::query()
  114. ->whereIn('put_area_id', $area_ids)
  115. ->filter($filter)
  116. ->where('is_link', Bike::LINK_ONLINE)
  117. ->count('id');
  118. //故障车辆
  119. $data['trouble_total_bikes'] = Bike::query()
  120. ->whereIn('put_area_id', $area_ids)
  121. ->filter($filter)
  122. ->where('is_trouble', Bike::TROUBLE_YES)
  123. ->count('id');
  124. //今日使用
  125. $data['today_use_total_bikes'] = Bike::query()
  126. ->whereIn('put_area_id', $area_ids)
  127. ->filter($filter)
  128. ->where('last_use_bike_end_time', '>', Carbon::today())
  129. ->count('id');
  130. //低电量
  131. $data['low_battery_total_bikes'] = Bike::query()
  132. ->whereIn('put_area_id', $area_ids)
  133. ->filter($filter)
  134. ->where('is_low_battery_power', Bike::BATTERY_POWER_LOW)
  135. ->count('id');
  136. //骑行中
  137. $data['riding_total_bikes'] = Bike::query()
  138. ->whereIn('put_area_id', $area_ids)
  139. ->filter($filter)
  140. ->where('is_riding', Bike::RIDING_YES)
  141. ->count('id');
  142. //未使用
  143. $data['not_riding_total_bikes'] = Bike::query()
  144. ->whereIn('put_area_id', $area_ids)
  145. ->filter($filter)
  146. ->where('is_riding', Bike::RIDING_NO)
  147. ->count('id');
  148. return $data;
  149. }
  150. /**
  151. * orderStatistics 订单统计
  152. *
  153. * @param OrderFilter $filter
  154. * @return array
  155. * @author Fx
  156. *
  157. */
  158. public function orderStatistics(OrderFilter $filter)
  159. {
  160. $area_ids = self::$areaIds;
  161. // 总订单数
  162. $order_total = Order::query()
  163. ->whereIn('area_id', $area_ids)
  164. ->filter($filter)
  165. ->where('status', Order::STATUS_COMPLETE_ORDER)
  166. ->count('id');
  167. $order_rent_total = OrderRent::query()
  168. ->whereIn('area_id', $area_ids)
  169. ->filter($filter)
  170. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  171. ->count('id');
  172. $order_total += $order_rent_total;
  173. // 今日新增订单数
  174. $today_add_order = Order::query()
  175. ->whereIn('area_id', $area_ids)
  176. ->filter($filter)
  177. ->where('created_at', '>', Carbon::today())
  178. ->where('status', Order::STATUS_COMPLETE_ORDER)
  179. ->count('id');
  180. $today_add_order_rent = OrderRent::query()
  181. ->whereIn('area_id', $area_ids)
  182. ->filter($filter)
  183. ->where('pay_time', '>', Carbon::today())
  184. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  185. ->count('id');
  186. $today_add_order += $today_add_order_rent;
  187. // 骑行中订单数
  188. $riding_status = [
  189. Order::STATUS_RIDE_BIKE,
  190. // Order::STATUS_CLOSE_BIKE, // 待支付
  191. Order::STATUS_PAUSE_BIKE,
  192. ];
  193. $riding_order = Order::query()
  194. ->whereIn('area_id', $area_ids)
  195. ->filter($filter)
  196. ->whereIn('status', $riding_status)
  197. ->count('id');
  198. $riding_order_rent = OrderRent::query()
  199. ->whereIn('area_id', $area_ids)
  200. ->filter($filter)
  201. ->where('status', OrderRent::STATUS_RENT_BIKE)
  202. ->count('id');
  203. $riding_order += $riding_order_rent;
  204. // 待支付
  205. $waiting_pay_order = Order::query()
  206. ->whereIn('area_id', $area_ids)
  207. ->filter($filter)
  208. ->where('status', Order::STATUS_CLOSE_BIKE)
  209. ->count('id');
  210. $waiting_pay_rent = OrderRent::query()
  211. ->whereIn('area_id', $area_ids)
  212. ->filter($filter)
  213. ->where('status', OrderRent::STATUS_CLOSE_RENT_BIKE)
  214. ->count('id');
  215. $waiting_pay_order += $waiting_pay_rent;
  216. // 今日新增收入
  217. $today_add_money = Order::query()
  218. ->whereIn('area_id', $area_ids)
  219. ->filter($filter)
  220. ->where('pay_time', '>', Carbon::today())
  221. ->where('status', Order::STATUS_COMPLETE_ORDER)
  222. ->sum('pay_money');
  223. $today_add_money_rent = OrderRent::query()
  224. ->whereIn('area_id', $area_ids)
  225. ->filter($filter)
  226. ->where('pay_time', '>', Carbon::today())
  227. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  228. ->sum('pay_money');
  229. $today_add_money += $today_add_money_rent;
  230. $order = [
  231. 'order_total' => $order_total ?? 0,
  232. 'today_add_order' => $today_add_order ?? 0,
  233. 'riding_order' => $riding_order ?? 0,
  234. 'today_add_money' => $today_add_money ?? 0,
  235. 'waiting_pay' => $waiting_pay_order ?? 0,
  236. ];
  237. return $order;
  238. }
  239. /**
  240. * workOrderStatistics 工单统计
  241. *
  242. * @param WorkOrderFilter $filter
  243. * @return array
  244. * @author Fx
  245. *
  246. */
  247. public function workOrderStatistics(WorkOrderFilter $filter)
  248. {
  249. $area_ids = self::$areaIds;
  250. $type_num = WorkOrder::query()
  251. ->whereIn('area_id', $area_ids)
  252. ->where('status', WorkOrder::STATUS_NO)
  253. ->filter($filter)
  254. ->groupBy(['type'])
  255. ->select('type', DB::raw('COUNT(id) as type_num'))
  256. ->get()
  257. ->toArray();
  258. $data = [
  259. 'charge_num' => 0,
  260. 'watch_num' => 0,
  261. 'power_failure_num' => 0,
  262. 'alert_num' => 0,
  263. 'steal_num' => 0,
  264. 'headman_num' => 0,
  265. 'trouble_num' => 0,
  266. 'help_num' => 0,
  267. 'other_num' => 0,
  268. 'offline_num' => 0,
  269. 'planned_meet_num' => 0, // 未认领
  270. 'planned_work_num' => 0, // 处理中
  271. 'planned_worked_num' => 0, // 已处理
  272. 'planned_over_num' => 0,// 完结
  273. ];
  274. foreach ($type_num as $v) {
  275. switch ($v['type']) {
  276. case WorkOrder::TYPE_CHARGE:
  277. $data['charge_num'] = $v['type_num'];
  278. break;
  279. case WorkOrder::TYPE_WATCH:
  280. $data['watch_num'] = $v['type_num'];
  281. break;
  282. case WorkOrder::TYPE_POWER_FAILURE:
  283. $data['power_failure_num'] = $v['type_num'];
  284. break;
  285. case WorkOrder::TYPE_ALERT:
  286. $data['alert_num'] = $v['type_num'];
  287. break;
  288. case WorkOrder::TYPE_STEAL:
  289. $data['steal_num'] = $v['type_num'];
  290. break;
  291. case WorkOrder::TYPE_HEADMAN:
  292. $data['headman_num'] = $v['type_num'];
  293. break;
  294. case WorkOrder::TYPE_TROUBLE:
  295. $data['trouble_num'] = $v['type_num'];
  296. break;
  297. case WorkOrder::TYPE_HELP:
  298. $data['help_num'] = $v['type_num'];
  299. break;
  300. case WorkOrder::TYPE_OFFLINE:
  301. $data['offline_num'] = $v['type_num'];
  302. break;
  303. case WorkOrder::TYPE_OTHER:
  304. $data['other_num'] = $v['type_num'];
  305. break;
  306. default;
  307. }
  308. }
  309. $planned_num = WorkOrder::query()
  310. ->filter($filter)
  311. ->groupBy('planned')
  312. ->select('planned', DB::raw('COUNT(id) as planned_num'))
  313. ->get()
  314. ->toArray();
  315. foreach ($planned_num as $v) {
  316. switch ($v['planned']) {
  317. case WorkOrder::PLANNED_STATUS_MEET:
  318. $data['planned_meet_num'] = $v['planned_num'];
  319. break;
  320. case WorkOrder::PLANNED_STATUS_WORK:
  321. $data['planned_work_num'] = $v['planned_num'];
  322. break;
  323. case WorkOrder::PLANNED_STATUS_WORKED:
  324. $data['planned_worked_num'] = $v['planned_num'];
  325. break;
  326. case WorkOrder::PLANNED_STATUS_OVER:
  327. $data['planned_over_num'] = $v['planned_num'];
  328. break;
  329. default;
  330. }
  331. }
  332. return $data;
  333. }
  334. /**
  335. * orderProfitStatistics 订单收益统计
  336. *
  337. * @param WalletLogFilter $walletLogFilter
  338. * @param DepositFilter $depositFilter
  339. * @param OrderFilter $orderFilter
  340. * @param OrderRentFilter $orderRentFilter
  341. * @return array
  342. * @author Fx
  343. *
  344. */
  345. public function orderProfitStatistics(WalletLogFilter $walletLogFilter, DepositFilter $depositFilter, OrderFilter $orderFilter, OrderRentFilter $orderRentFilter, CardRidingOrderFilter $cardRidingOrderFilter, RechargeOrderFilter $rechargeOrderFilter, DepositCardOrderFilter $depositCardOrderFilter)
  346. {
  347. $area_ids = self::$areaIds;
  348. $admin_type = Admin::user()->type;
  349. if ($admin_type == AdminUser::TYPE_WORKER) {
  350. $data = [
  351. 'totalProfit' => $totalProfit ?? 0,
  352. 'depositTotal' => $depositTotal ?? 0,
  353. 'todayProfit' => $todayProfit ?? 0,
  354. 'depositToday' => $depositToday ?? 0,
  355. 'monthProfit' => $monthProfit ?? 0,
  356. ];
  357. return $this->ok($data);
  358. }
  359. // 总收益
  360. // $totalProfit = WalletLog::query()
  361. // ->whereIn('area_id', $area_ids)
  362. // ->filter($walletLogFilter)
  363. // ->whereIn('type', WalletLog::$subType)
  364. // ->sum('money');
  365. $totalOrderProfit = Order::query()
  366. ->whereIn('area_id', $area_ids)
  367. ->filter($orderFilter)
  368. ->where('status', Order::STATUS_COMPLETE_ORDER)
  369. ->sum('pay_money');
  370. $totalOrderRentProfit = OrderRent::query()
  371. ->whereIn('area_id', $area_ids)
  372. ->filter($orderRentFilter)
  373. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  374. ->sum('pay_money');
  375. $totalProfit = bcadd($totalOrderProfit, $totalOrderRentProfit, 0);
  376. // 总押金
  377. $depositTotal = DepositOrder::query()
  378. ->where('pay_status', DepositOrder::PAY_STATUS_OK)
  379. ->where('is_refund', DepositOrder::REFUND_NO)
  380. ->whereIn('area_id', $area_ids)
  381. ->filter($depositFilter)
  382. ->sum('pay_money');
  383. // 今日收益
  384. // $todayProfit = WalletLog::query()
  385. // ->whereIn('area_id', $area_ids)
  386. // ->filter($walletLogFilter)
  387. // ->whereIn('type', WalletLog::$subType)
  388. // ->where('created_at', '>', Carbon::today())
  389. // ->sum('money');
  390. $todayOrderProfit = Order::query()
  391. ->whereIn('area_id', $area_ids)
  392. ->filter($orderFilter)
  393. ->where('status', Order::STATUS_COMPLETE_ORDER)
  394. ->where('pay_time', '>', Carbon::today())
  395. ->sum('pay_money');
  396. $todayOrderRentProfit = OrderRent::query()
  397. ->whereIn('area_id', $area_ids)
  398. ->filter($orderFilter)
  399. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  400. ->where('pay_time', '>', Carbon::today())
  401. ->sum('pay_money');
  402. $todayProfit = bcadd($todayOrderProfit, $todayOrderRentProfit, 0);
  403. // 今日新增押金
  404. $depositToday = DepositOrder::query()
  405. ->where('pay_status', DepositOrder::PAY_STATUS_OK)
  406. ->where('is_refund', DepositOrder::REFUND_NO)
  407. ->whereIn('area_id', $area_ids)
  408. ->filter($depositFilter)
  409. ->where('pay_time', '>', Carbon::today())
  410. ->sum('pay_money');
  411. // 本月收益
  412. // $monthProfit = WalletLog::query()
  413. // ->whereIn('area_id', $area_ids)
  414. // ->filter($walletLogFilter)
  415. // ->whereIn('type', WalletLog::$subType)
  416. // ->where('created_at', '>', Carbon::today()->format('Y-m-01 00:00:00'))
  417. // ->sum('money');
  418. $monthOrderProfit = Order::query()
  419. ->whereIn('area_id', $area_ids)
  420. ->filter($orderFilter)
  421. ->where('status', Order::STATUS_COMPLETE_ORDER)
  422. ->where('pay_time', '>', Carbon::today()->format('Y-m-01 00:00:00'))
  423. ->sum('pay_money');
  424. $monthOrderRentProfit = OrderRent::query()
  425. ->whereIn('area_id', $area_ids)
  426. ->filter($orderFilter)
  427. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  428. ->where('pay_time', '>', Carbon::today()->format('Y-m-01 00:00:00'))
  429. ->sum('pay_money');
  430. $monthProfit = bcadd($monthOrderProfit, $monthOrderRentProfit, 0);
  431. // 骑行卡订单总收益
  432. $riddingCardOrderTotalProfit = CardRidingOrder::query()
  433. ->whereIn('area_id', $area_ids)
  434. ->filter($cardRidingOrderFilter)
  435. ->where('pay_status', CardRidingOrder::PAY_STATUS_OK)
  436. ->sum('pay_money');
  437. // 骑行卡订单今日收益
  438. $riddingCardOrderTodayProfit = CardRidingOrder::query()
  439. ->whereIn('area_id', $area_ids)
  440. ->filter($cardRidingOrderFilter)
  441. ->where('pay_status', CardRidingOrder::PAY_STATUS_OK)
  442. ->where('pay_time', '>', Carbon::today())
  443. ->sum('pay_money');
  444. // 充值总收益
  445. $rechargeOrderTotalProfit = RechargeOrder::query()
  446. ->whereIn('area_id', $area_ids)
  447. ->filter($rechargeOrderFilter)
  448. ->where('pay_status', RechargeOrder::PAY_STATUS_OK)
  449. ->sum('pay_money');
  450. // 充值今日收益
  451. $rechargeOrderTodayProfit = RechargeOrder::query()
  452. ->whereIn('area_id', $area_ids)
  453. ->filter($rechargeOrderFilter)
  454. ->where('pay_status', RechargeOrder::PAY_STATUS_OK)
  455. ->where('pay_time', '>', Carbon::today())
  456. ->sum('pay_money');
  457. // 免押金卡总收益
  458. $depositCardTotalProfit = DepositCardOrder::query()
  459. ->whereIn('area_id', $area_ids)
  460. ->filter($depositCardOrderFilter)
  461. ->where('pay_status', DepositCardOrder::PAY_STATUS_OK)
  462. ->sum('pay_money');
  463. // 免押金卡总收益
  464. $depositCardTodayProfit = DepositCardOrder::query()
  465. ->whereIn('area_id', $area_ids)
  466. ->filter($depositCardOrderFilter)
  467. ->where('pay_status', DepositCardOrder::PAY_STATUS_OK)
  468. ->where('pay_time', '>', Carbon::today())
  469. ->sum('pay_money');
  470. $data = [
  471. 'totalProfit' => floor(abs($totalProfit)) ?? 0, // 总收益
  472. 'depositTotal' => floor($depositTotal) ?? 0, // 总押金
  473. 'todayProfit' => floor($todayProfit) ?? 0, // 今日收益
  474. 'depositToday' => floor($depositToday) ?? 0, // 今日押金
  475. 'monthProfit' => floor($monthProfit) ?? 0, // 本月收益
  476. 'riddingCardOrderTotalProfit' => floor($riddingCardOrderTotalProfit) ?? 0, //骑行卡订单总收益
  477. 'riddingCardOrderTodayProfit' => floor($riddingCardOrderTodayProfit) ?? 0, //骑行卡订单今日收益
  478. 'rechargeOrderTotalProfit' => floor($rechargeOrderTotalProfit) ?? 0, //充值总收益
  479. 'rechargeOrderTodayProfit' => floor($rechargeOrderTodayProfit) ?? 0, //充值今日收益
  480. 'depositCardTotalProfit' => floor($depositCardTotalProfit) ?? 0, //免押金卡总收益
  481. 'depositCardTodayProfit' => floor($depositCardTodayProfit) ?? 0, //免押金卡今日总收益
  482. ];
  483. return $data;
  484. }
  485. public function statistics(Request $request, UserFilter $filter, OrderFilter $orderFilter, BikeFilter $bikeFilter, WorkOrderFilter $workOrderFilter, WalletLogFilter $walletLogFilter, DepositFilter $depositFilter, OrderRentFilter $orderRentFilter, CardRidingOrderFilter $cardRidingOrderFilter, RechargeOrderFilter $rechargeOrderFilter, DepositCardOrderFilter $depositCardOrderFilter)
  486. {
  487. $area_ids = self::$areaIds;
  488. $area_id = $request->get('area_id');
  489. // 总用户
  490. $totalUser = User::query()
  491. ->whereIn('register_area_id', $area_ids)
  492. ->filter($filter)
  493. ->count('id');
  494. // 押金用户
  495. $depositUser = User::query()
  496. ->whereIn('register_area_id', $area_ids)
  497. ->where('is_deposit', User::DEPOSIT_OK)
  498. ->filter($filter)
  499. ->count('id');
  500. //有效用户
  501. $cardUser = User::query()
  502. ->whereIn('register_area_id', $area_ids)
  503. ->where('is_card_certified', User::CARD_OK)
  504. ->filter($filter)
  505. ->count('id');
  506. //今日新增
  507. $todayAddUser = User::query()
  508. ->whereIn('register_area_id', $area_ids)
  509. ->where('is_card_certified', User::CARD_OK)
  510. ->where('created_at', '>', Carbon::today())
  511. ->filter($filter)
  512. ->count('id');
  513. // 今日活跃
  514. $todayActiveOrder = Order::query()
  515. ->whereIn('area_id', $area_ids)
  516. ->where('created_at', '>', Carbon::today())
  517. ->filter($orderFilter)
  518. ->get(['user_id'])
  519. ->toArray();
  520. $todayActiveUserArr = [];
  521. foreach ($todayActiveOrder as $v) {
  522. $todayActiveUserArr[] = $v['user_id'];
  523. }
  524. $todayActiveUser = count(array_unique($todayActiveUserArr)); //去重复后计算总数
  525. $data1 = [
  526. 'totalUser' => $totalUser ?? 0,
  527. 'depositUser' => $depositUser ?? 0,
  528. 'cardUser' => $cardUser ?? 0,
  529. 'todayAddUser' => $todayAddUser ?? 0,
  530. 'todayActiveUser' => $todayActiveUser ?? 0
  531. ];
  532. $data2['total_bikes'] = Bike::query()
  533. ->whereIn('put_area_id', $area_ids)
  534. ->filter($bikeFilter)
  535. ->count('id');
  536. // 上线车辆数
  537. $data2['put_total_bikes'] = Bike::query()
  538. ->whereIn('put_area_id', $area_ids)
  539. ->filter($bikeFilter)
  540. ->where('put_status', Bike::PUT_STATUS_YES)
  541. ->count('id');
  542. // 在线车辆数
  543. $data2['line_total_bikes'] = Bike::query()
  544. ->whereIn('put_area_id', $area_ids)
  545. ->filter($bikeFilter)
  546. ->where('is_link', Bike::LINK_ONLINE)
  547. ->count('id');
  548. //故障车辆
  549. $data2['trouble_total_bikes'] = Bike::query()
  550. ->whereIn('put_area_id', $area_ids)
  551. ->filter($bikeFilter)
  552. ->where('is_trouble', Bike::TROUBLE_YES)
  553. ->count('id');
  554. //今日使用
  555. $data2['today_use_total_bikes'] = Bike::query()
  556. ->whereIn('put_area_id', $area_ids)
  557. ->filter($bikeFilter)
  558. ->where('last_use_bike_end_time', '>', Carbon::today())
  559. ->count('id');
  560. //低电量
  561. $data2['low_battery_total_bikes'] = Bike::query()
  562. ->whereIn('put_area_id', $area_ids)
  563. ->filter($bikeFilter)
  564. ->where('is_low_battery_power', Bike::BATTERY_POWER_LOW)
  565. ->count('id');
  566. //骑行中
  567. $data2['riding_total_bikes'] = Bike::query()
  568. ->whereIn('put_area_id', $area_ids)
  569. ->filter($bikeFilter)
  570. ->where('is_riding', Bike::RIDING_YES)
  571. ->count('id');
  572. //未使用
  573. $data2['not_riding_total_bikes'] = Bike::query()
  574. ->whereIn('put_area_id', $area_ids)
  575. ->filter($bikeFilter)
  576. ->where('is_riding', Bike::RIDING_NO)
  577. ->count('id');
  578. // 总订单数
  579. $order_total = Order::query()
  580. ->whereIn('area_id', $area_ids)
  581. ->filter($orderFilter)
  582. ->where('status', Order::STATUS_COMPLETE_ORDER)
  583. ->count('id');
  584. $order_rent_total = OrderRent::query()
  585. ->whereIn('area_id', $area_ids)
  586. ->filter($orderFilter)
  587. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  588. ->count('id');
  589. $order_total += $order_rent_total;
  590. // 今日新增订单数
  591. $today_add_order = Order::query()
  592. ->whereIn('area_id', $area_ids)
  593. ->filter($orderFilter)
  594. ->where('created_at', '>', Carbon::today())
  595. ->where('status', Order::STATUS_COMPLETE_ORDER)
  596. ->count('id');
  597. $today_add_order_rent = OrderRent::query()
  598. ->whereIn('area_id', $area_ids)
  599. ->filter($orderRentFilter)
  600. ->where('pay_time', '>', Carbon::today())
  601. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  602. ->count('id');
  603. $today_add_order += $today_add_order_rent;
  604. // 骑行中订单数
  605. $riding_status = [
  606. Order::STATUS_RIDE_BIKE,
  607. // Order::STATUS_CLOSE_BIKE, // 待支付
  608. Order::STATUS_PAUSE_BIKE,
  609. ];
  610. $riding_order = Order::query()
  611. ->whereIn('area_id', $area_ids)
  612. ->filter($orderFilter)
  613. ->whereIn('status', $riding_status)
  614. ->count('id');
  615. $riding_order_rent = OrderRent::query()
  616. ->whereIn('area_id', $area_ids)
  617. ->filter($orderRentFilter)
  618. ->where('status', OrderRent::STATUS_RENT_BIKE)
  619. ->count('id');
  620. $riding_order += $riding_order_rent;
  621. // 待支付
  622. $waiting_pay_order = Order::query()
  623. ->whereIn('area_id', $area_ids)
  624. ->filter($orderFilter)
  625. ->where('status', Order::STATUS_CLOSE_BIKE)
  626. ->count('id');
  627. $waiting_pay_rent = OrderRent::query()
  628. ->whereIn('area_id', $area_ids)
  629. ->filter($orderRentFilter)
  630. ->where('status', OrderRent::STATUS_CLOSE_RENT_BIKE)
  631. ->count('id');
  632. $waiting_pay_order += $waiting_pay_rent;
  633. // 今日新增收入
  634. $today_add_money = Order::query()
  635. ->whereIn('area_id', $area_ids)
  636. ->filter($orderFilter)
  637. ->where('pay_time', '>', Carbon::today())
  638. ->where('status', Order::STATUS_COMPLETE_ORDER)
  639. ->sum('pay_money');
  640. $today_add_money_rent = OrderRent::query()
  641. ->whereIn('area_id', $area_ids)
  642. ->filter($orderRentFilter)
  643. ->where('pay_time', '>', Carbon::today())
  644. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  645. ->sum('pay_money');
  646. $today_add_money += $today_add_money_rent;
  647. $order = [
  648. 'order_total' => $order_total ?? 0,
  649. 'today_add_order' => $today_add_order ?? 0,
  650. 'riding_order' => $riding_order ?? 0,
  651. 'today_add_money' => $today_add_money ?? 0,
  652. 'waiting_pay' => $waiting_pay_order ?? 0,
  653. ];
  654. $type_num = WorkOrder::query()
  655. ->whereIn('area_id', $area_ids)
  656. ->where('status', WorkOrder::STATUS_NO)
  657. ->filter($workOrderFilter)
  658. ->groupBy(['type'])
  659. ->select('type', DB::raw('COUNT(id) as type_num'))
  660. ->get()
  661. ->toArray();
  662. $data = [
  663. 'charge_num' => 0,
  664. 'watch_num' => 0,
  665. 'power_failure_num' => 0,
  666. 'alert_num' => 0,
  667. 'steal_num' => 0,
  668. 'headman_num' => 0,
  669. 'trouble_num' => 0,
  670. 'help_num' => 0,
  671. 'other_num' => 0,
  672. 'offline_num' => 0,
  673. 'planned_meet_num' => 0, // 未认领
  674. 'planned_work_num' => 0, // 处理中
  675. 'planned_worked_num' => 0, // 已处理
  676. 'planned_over_num' => 0,// 完结
  677. ];
  678. foreach ($type_num as $v) {
  679. switch ($v['type']) {
  680. case WorkOrder::TYPE_CHARGE:
  681. $data['charge_num'] = $v['type_num'];
  682. break;
  683. case WorkOrder::TYPE_WATCH:
  684. $data['watch_num'] = $v['type_num'];
  685. break;
  686. case WorkOrder::TYPE_POWER_FAILURE:
  687. $data['power_failure_num'] = $v['type_num'];
  688. break;
  689. case WorkOrder::TYPE_ALERT:
  690. $data['alert_num'] = $v['type_num'];
  691. break;
  692. case WorkOrder::TYPE_STEAL:
  693. $data['steal_num'] = $v['type_num'];
  694. break;
  695. case WorkOrder::TYPE_HEADMAN:
  696. $data['headman_num'] = $v['type_num'];
  697. break;
  698. case WorkOrder::TYPE_TROUBLE:
  699. $data['trouble_num'] = $v['type_num'];
  700. break;
  701. case WorkOrder::TYPE_HELP:
  702. $data['help_num'] = $v['type_num'];
  703. break;
  704. case WorkOrder::TYPE_OFFLINE:
  705. $data['offline_num'] = $v['type_num'];
  706. break;
  707. case WorkOrder::TYPE_OTHER:
  708. $data['other_num'] = $v['type_num'];
  709. break;
  710. default;
  711. }
  712. }
  713. $planned_num = WorkOrder::query()
  714. ->filter($workOrderFilter)
  715. ->groupBy('planned')
  716. ->select('planned', DB::raw('COUNT(id) as planned_num'))
  717. ->get()
  718. ->toArray();
  719. foreach ($planned_num as $v) {
  720. switch ($v['planned']) {
  721. case WorkOrder::PLANNED_STATUS_MEET:
  722. $data['planned_meet_num'] = $v['planned_num'];
  723. break;
  724. case WorkOrder::PLANNED_STATUS_WORK:
  725. $data['planned_work_num'] = $v['planned_num'];
  726. break;
  727. case WorkOrder::PLANNED_STATUS_WORKED:
  728. $data['planned_worked_num'] = $v['planned_num'];
  729. break;
  730. case WorkOrder::PLANNED_STATUS_OVER:
  731. $data['planned_over_num'] = $v['planned_num'];
  732. break;
  733. default;
  734. }
  735. }
  736. $admin_type = Admin::user()->type;
  737. if ($admin_type == AdminUser::TYPE_WORKER) {
  738. $data = [
  739. 'userData' => $data1,
  740. 'bikeData' => $data2,
  741. 'orderData' => $order,
  742. 'workOrderData' => $data,
  743. 'profitData' => null,
  744. ];
  745. return $this->ok($data);
  746. }
  747. // 总收益
  748. // $totalProfit = WalletLog::query()
  749. // ->whereIn('area_id', $area_ids)
  750. // ->filter($walletLogFilter)
  751. // ->whereIn('type', WalletLog::$subType)
  752. // ->sum('money');
  753. $totalOrderProfit = Order::query()
  754. ->whereIn('area_id', $area_ids)
  755. ->filter($orderFilter)
  756. ->where('status', Order::STATUS_COMPLETE_ORDER)
  757. ->sum('pay_money');
  758. $totalOrderRentProfit = OrderRent::query()
  759. ->whereIn('area_id', $area_ids)
  760. ->filter($orderRentFilter)
  761. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  762. ->sum('pay_money');
  763. $totalProfit = bcadd($totalOrderProfit, $totalOrderRentProfit, 0);
  764. // 总押金
  765. $depositTotal = DepositOrder::query()
  766. ->where('pay_status', DepositOrder::PAY_STATUS_OK)
  767. ->where('is_refund', DepositOrder::REFUND_NO)
  768. ->whereIn('area_id', $area_ids)
  769. ->filter($depositFilter)
  770. ->sum('pay_money');
  771. // 今日收益
  772. // $todayProfit = WalletLog::query()
  773. // ->whereIn('area_id', $area_ids)
  774. // ->filter($walletLogFilter)
  775. // ->whereIn('type', WalletLog::$subType)
  776. // ->where('created_at', '>', Carbon::today())
  777. // ->sum('money');
  778. $todayOrderProfit = Order::query()
  779. ->whereIn('area_id', $area_ids)
  780. ->filter($orderFilter)
  781. ->where('status', Order::STATUS_COMPLETE_ORDER)
  782. ->where('pay_time', '>', Carbon::today())
  783. ->sum('pay_money');
  784. $todayOrderRentProfit = OrderRent::query()
  785. ->whereIn('area_id', $area_ids)
  786. ->filter($orderRentFilter)
  787. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  788. ->where('pay_time', '>', Carbon::today())
  789. ->sum('pay_money');
  790. $todayProfit = bcadd($todayOrderProfit, $todayOrderRentProfit, 0);
  791. // 今日新增押金
  792. $depositToday = DepositOrder::query()
  793. ->where('pay_status', DepositOrder::PAY_STATUS_OK)
  794. ->where('is_refund', DepositOrder::REFUND_NO)
  795. ->whereIn('area_id', $area_ids)
  796. ->filter($depositFilter)
  797. ->where('created_at', '>', Carbon::today())
  798. ->sum('pay_money');
  799. // 本月收益
  800. // $monthProfit = WalletLog::query()
  801. // ->whereIn('area_id', $area_ids)
  802. // ->filter($walletLogFilter)
  803. // ->whereIn('type', WalletLog::$subType)
  804. // ->where('created_at', '>', Carbon::today()->format('Y-m-01 00:00:00'))
  805. // ->sum('money');
  806. $monthOrderProfit = Order::query()
  807. ->whereIn('area_id', $area_ids)
  808. ->filter($orderFilter)
  809. ->where('status', Order::STATUS_COMPLETE_ORDER)
  810. ->where('created_at', '>', Carbon::today()->format('Y-m-01 00:00:00'))
  811. ->sum('pay_money');
  812. $monthOrderRentProfit = OrderRent::query()
  813. ->whereIn('area_id', $area_ids)
  814. ->filter($orderRentFilter)
  815. ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
  816. ->where('created_at', '>', Carbon::today()->format('Y-m-01 00:00:00'))
  817. ->sum('pay_money');
  818. $monthProfit = bcadd($monthOrderProfit, $monthOrderRentProfit, 0);
  819. // 骑行卡订单总收益
  820. $riddingCardOrderTotalProfit = CardRidingOrder::query()
  821. ->whereIn('area_id', $area_ids)
  822. ->filter($cardRidingOrderFilter)
  823. ->where('pay_status', CardRidingOrder::PAY_STATUS_OK)
  824. ->sum('pay_money');
  825. // 骑行卡订单今日收益
  826. $riddingCardOrderTodayProfit = CardRidingOrder::query()
  827. ->whereIn('area_id', $area_ids)
  828. ->filter($cardRidingOrderFilter)
  829. ->where('pay_status', CardRidingOrder::PAY_STATUS_OK)
  830. ->where('pay_time', '>', Carbon::today())
  831. ->sum('pay_money');
  832. // 充值总收益
  833. // DB::enableQueryLog();
  834. $rechargeOrderTotalProfit = RechargeOrder::query()
  835. ->filter($rechargeOrderFilter)
  836. ->whereIn('area_id', $area_ids)
  837. ->where('pay_status', RechargeOrder::PAY_STATUS_OK)
  838. ->sum('pay_money');
  839. // $logs = DB::getQueryLog();
  840. // Log::info($logs);
  841. // 充值今日收益
  842. $rechargeOrderTodayProfit = RechargeOrder::query()
  843. ->whereIn('area_id', $area_ids)
  844. ->filter($rechargeOrderFilter)
  845. ->where('pay_status', RechargeOrder::PAY_STATUS_OK)
  846. ->where('pay_time', '>', Carbon::today())
  847. ->sum('pay_money');
  848. // 免押金卡总收益
  849. $depositCardTotalProfit = DepositCardOrder::query()
  850. ->whereIn('area_id', $area_ids)
  851. ->filter($depositCardOrderFilter)
  852. ->where('pay_status', DepositCardOrder::PAY_STATUS_OK)
  853. ->sum('pay_money');
  854. // 免押金卡总收益
  855. $depositCardTodayProfit = DepositCardOrder::query()
  856. ->whereIn('area_id', $area_ids)
  857. ->filter($depositCardOrderFilter)
  858. ->where('pay_status', DepositCardOrder::PAY_STATUS_OK)
  859. ->where('pay_time', '>', Carbon::today())
  860. ->sum('pay_money');
  861. $data3 = [
  862. 'totalProfit' => floor(abs($totalProfit)) ?? 0,
  863. 'depositTotal' => floor($depositTotal) ?? 0,
  864. 'todayProfit' => floor($todayProfit) ?? 0,
  865. 'depositToday' => floor($depositToday) ?? 0,
  866. 'monthProfit' => floor($monthProfit) ?? 0,
  867. 'riddingCardOrderTotalProfit' => floor($riddingCardOrderTotalProfit) ?? 0, //骑行卡订单总收益
  868. 'riddingCardOrderTodayProfit' => floor($riddingCardOrderTodayProfit) ?? 0, //骑行卡订单今日收益
  869. 'rechargeOrderTotalProfit' => floor($rechargeOrderTotalProfit) ?? 0, //充值总收益
  870. 'rechargeOrderTodayProfit' => floor($rechargeOrderTodayProfit) ?? 0, //充值今日收益
  871. 'depositCardTotalProfit' => floor($depositCardTotalProfit) ?? 0, //免押金卡总收益
  872. 'depositCardTodayProfit' => floor($depositCardTodayProfit) ?? 0, //免押金卡今日总收益
  873. ];
  874. $res = [
  875. 'userData' => $data1,
  876. 'bikeData' => $data2,
  877. 'orderData' => $order,
  878. 'workOrderData' => $data,
  879. 'profitData' => $data3,
  880. ];
  881. return $this->ok($res);
  882. }
  883. }