AggregateStatisticsController.php 39 KB

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