UserController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. <?php
  2. namespace App\Http\Controllers\App;
  3. use App\Filters\OrderFilter;
  4. use App\Filters\QuestionFilter;
  5. use App\Filters\UserFilter;
  6. use App\Filters\UserRepairedFilter;
  7. use App\Http\Requests\RemarkRequest;
  8. use App\Http\Resources\App\OrderRentResource;
  9. use App\Http\Resources\App\UserResource;
  10. use App\Http\Resources\App\OrderResource;
  11. use App\Http\Resources\QuestionResource;
  12. use App\Http\Resources\UserRepairedResource;
  13. use App\Models\AdminMerchant;
  14. use App\Models\AdminUser;
  15. use App\Models\AdminUserArea;
  16. use App\Models\Order;
  17. use App\Models\OrderRent;
  18. use App\Models\Questions;
  19. use App\Models\Trouble;
  20. use App\Models\Upload;
  21. use App\Models\User;
  22. use App\Utils\Admin;
  23. use Carbon\Carbon;
  24. use Illuminate\Http\Request;
  25. use App\Http\Controllers\Controller;
  26. use Illuminate\Support\Facades\Log;
  27. class UserController extends AppBaseController
  28. {
  29. /**
  30. * userList 用户列表
  31. *
  32. * @param UserFilter $filter
  33. * @return \Illuminate\Http\JsonResponse
  34. * @author Fx
  35. *
  36. */
  37. public function userList(UserFilter $filter)
  38. {
  39. $area_ids = self::$areaIds;
  40. $user = User::query()
  41. ->where(AdminMerchant::getMerchantWhere())
  42. ->whereIn('register_area_id', $area_ids)
  43. ->where('is_bind_mobile', User::BIND_MOBILE_OK)
  44. ->filter($filter)
  45. ->orderByDesc('id')
  46. ->paginate();
  47. return $this->ok(UserResource::collection($user));
  48. }
  49. /**
  50. * userDetail 用户详情
  51. *
  52. * @param Request $request
  53. * @return \Illuminate\Http\JsonResponse
  54. * @author Fx
  55. *
  56. */
  57. public function userDetail(Request $request)
  58. {
  59. $user_id = $request->get('user_id') ?? '';
  60. if (empty($user_id)) return $this->error('参数错误');
  61. $userDetail = User::query()->where(AdminMerchant::getMerchantWhere())->where('id', $user_id)->first();
  62. if (empty($userDetail)) return $this->error('找不到该用户,参数错误');
  63. $data = [
  64. 'username' => $userDetail->nickname . ($userDetail->truename ? '(' . $userDetail->truename . ')' : ''),
  65. 'mobile' => $userDetail->mobile ?? '',
  66. 'area' => $userDetail->areas->name ?? '',
  67. 'deposit' => $userDetail->deposit_money ?? 0,
  68. 'wallet_money' => $userDetail->wallet_money ?? 0,
  69. 'remark' => $userDetail->remark ?? '',
  70. ];
  71. return $this->ok($data);
  72. }
  73. public function updateRemark(RemarkRequest $request, $id)
  74. {
  75. //
  76. $user = User::query()->where(AdminMerchant::getMerchantWhere())->where('id', $id)->first();
  77. $inputs = $request->validated();
  78. // Log::info($id);
  79. $user->update($inputs);
  80. return $this->ok('修改成功');
  81. }
  82. /**
  83. * historicalOrder 历史订单
  84. *
  85. * @param Request $request
  86. * @return \Illuminate\Http\JsonResponse
  87. * @author Fx
  88. *
  89. */
  90. public function historicalOrder(Request $request)
  91. {
  92. $user_id = $request->get('user_id') ?? '';
  93. if (empty($user_id)) return $this->error('参数错误');
  94. $order = Order::query()
  95. ->where(AdminMerchant::getMerchantWhere())
  96. ->where('user_id', $user_id)
  97. // ->where('status',Order::STATUS_COMPLETE_ORDER)
  98. ->orderByDesc('id')
  99. ->paginate();
  100. return $this->ok(OrderResource::collection($order));
  101. }
  102. /**
  103. * historicalOrderRent 历史日租订单
  104. *
  105. * @param Request $request
  106. * @return \Illuminate\Http\JsonResponse
  107. * @author Fx
  108. *
  109. */
  110. public function historicalOrderRent(Request $request)
  111. {
  112. $user_id = $request->get('user_id') ?? '';
  113. if (empty($user_id)) return $this->error('参数错误');
  114. $order = OrderRent::query()
  115. ->where(AdminMerchant::getMerchantWhere())
  116. ->where('user_id', $user_id)
  117. // ->where('status',Order::STATUS_COMPLETE_ORDER)
  118. ->orderByDesc('id')
  119. ->paginate();
  120. return $this->ok(OrderRentResource::collection($order));
  121. }
  122. /**
  123. * userStatistics 用户统计
  124. *
  125. * @param UserFilter $filter
  126. * @param OrderFilter $orderFilter
  127. * @return \Illuminate\Http\JsonResponse
  128. * @author Fx
  129. *
  130. */
  131. public function userStatistics(UserFilter $filter, OrderFilter $orderFilter)
  132. {
  133. $area_ids = self::$areaIds;
  134. // 总用户
  135. $totalUser = User::query()
  136. ->where(AdminMerchant::getMerchantWhere())
  137. ->whereIn('register_area_id', $area_ids)
  138. ->filter($filter)
  139. ->count('id');
  140. // 押金用户
  141. $depositUser = User::query()
  142. ->where(AdminMerchant::getMerchantWhere())
  143. ->whereIn('register_area_id', $area_ids)
  144. ->where('is_deposit', User::DEPOSIT_OK)
  145. ->filter($filter)
  146. ->count('id');
  147. //有效用户
  148. $cardUser = User::query()
  149. ->where(AdminMerchant::getMerchantWhere())
  150. ->whereIn('register_area_id', $area_ids)
  151. ->where('is_bind_mobile', User::BIND_MOBILE_OK)
  152. ->filter($filter)
  153. ->count('id');
  154. //今日新增
  155. $todayAddUser = User::query()
  156. ->where(AdminMerchant::getMerchantWhere())
  157. ->whereIn('register_area_id', $area_ids)
  158. ->where('is_bind_mobile', User::BIND_MOBILE_OK)
  159. ->where('created_at', '>=', Carbon::today())
  160. ->filter($filter)
  161. ->count('id');
  162. // 今日活跃
  163. $todayActiveOrder = Order::query()
  164. ->where(AdminMerchant::getMerchantWhere())
  165. ->whereIn('area_id', $area_ids)
  166. ->where('created_at', '>=', Carbon::today())
  167. ->filter($orderFilter)
  168. ->get(['user_id'])
  169. ->toArray();
  170. $todayActiveUserArr = [];
  171. foreach ($todayActiveOrder as $v) {
  172. $todayActiveUserArr[] = $v['user_id'];
  173. }
  174. $todayActiveUser = count(array_unique($todayActiveUserArr)); //去重复后计算总数
  175. $data = [
  176. 'totalUser' => $totalUser ?? 0,
  177. 'depositUser' => $depositUser ?? 0,
  178. 'cardUser' => $cardUser ?? 0,
  179. 'todayAddUser' => $todayAddUser ?? 0,
  180. 'todayActiveUser' => $todayActiveUser ?? 0
  181. ];
  182. return $this->ok($data);
  183. }
  184. /**
  185. * newUsersChart 新用户增长统计图
  186. *
  187. * @param Request $request
  188. * @return \Illuminate\Http\JsonResponse
  189. * @author Fx
  190. *
  191. */
  192. public function newUsersChart(Request $request, UserFilter $userFilter)
  193. {
  194. $days = $request->get('days') ?? '';
  195. if (empty($days)) return $this->error('缺少参数');
  196. $newUsers = User::query()
  197. // ->where(AdminMerchant::getMerchantWhere())
  198. ->filter($userFilter)
  199. // ->where('is_card_certified', User::CARD_OK);
  200. ->where('is_bind_mobile', User::BIND_MOBILE_OK); // 去掉是否实名认证过滤条件,只要绑定手机号就算新增用户
  201. // $admin_id = Admin::user()->id;
  202. // if (!Admin::isAdministrator()) {
  203. // $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  204. // if (count($area_ids) !== 0) {
  205. // $newUsers = $newUsers->whereIn('register_area_id', $area_ids);
  206. // } else {
  207. // $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  208. // $area_id = $area_id ?? 0;
  209. // $newUsers = $newUsers->where('register_area_id', $area_id);
  210. // }
  211. // }
  212. $newOrders = $newUsers;
  213. switch ($days) {
  214. case 'today':
  215. $today = Carbon::today();
  216. $newOrders = $newOrders->where('created_at', '>=', $today)
  217. ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
  218. ->groupBy('date')->get()->toArray();
  219. // 有数据得数组
  220. $newOrdersKeyVal = [];
  221. if (!empty($newOrders)) {
  222. foreach ($newOrders as $v) {
  223. $newOrdersKeyVal[$v['date']] = $v['value'];
  224. }
  225. }
  226. // 为0得数组
  227. $i = Carbon::now()->format('H');
  228. $arr = [];
  229. for ($i; $i >= 0; $i--) {
  230. $str = Carbon::now()->subHours($i)->format('m-d H:00');
  231. $arr[$str] = 0;
  232. }
  233. //合并
  234. $merge = array_merge($arr, $newOrdersKeyVal);
  235. $data = [];
  236. foreach ($merge as $key => $value) {
  237. $data[] = ['date' => $key, 'value' => $value];
  238. }
  239. break;
  240. case 'threeDays':
  241. $i = 2;
  242. break;
  243. case 'sevenDays':
  244. $i = 6;
  245. break;
  246. case 'fifteenDays':
  247. $i = 14;
  248. break;
  249. case 'thirtyDays':
  250. $i = 29;
  251. break;
  252. default:
  253. return $this->error('参数错误');
  254. }
  255. if ($days !== 'today') {
  256. $paramDays = Carbon::today()->subDays($i);
  257. // 赋值一个值为0得数组
  258. $arr = [];
  259. for ($i; $i >= 0; $i--) {
  260. $str = Carbon::today()->subDays($i)->format('Y/m/d');
  261. $arr[$str] = 0;
  262. }
  263. // 有数据得数组
  264. $newOrders = $newOrders->where('created_at', '>', $paramDays)
  265. ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
  266. ->groupBy('date')->get()->toArray();
  267. $newOrdersKeyVal = [];
  268. if (!empty($newOrders)) {
  269. foreach ($newOrders as $v) {
  270. $newOrdersKeyVal[$v['date']] = $v['value'];
  271. }
  272. }
  273. // 合并覆盖0
  274. $merge = array_merge($arr, $newOrdersKeyVal);
  275. // 重组结构
  276. $data = [];
  277. foreach ($merge as $ks => $vs) {
  278. $data[] = ['date' => $ks, 'value' => $vs];
  279. }
  280. }
  281. return $this->ok($data);
  282. }
  283. /**
  284. * userRepaired 保修列表
  285. *
  286. * @param Request $request
  287. * @param UserRepairedFilter $userRepairedFilter
  288. * @return \Illuminate\Http\JsonResponse
  289. * @author Fx
  290. *
  291. */
  292. public function userRepaired(Request $request, UserRepairedFilter $userRepairedFilter)
  293. {
  294. $area_ids = self::$areaIds;
  295. $repaired = Trouble::query()
  296. ->where(AdminMerchant::getMerchantWhere())
  297. ->filter($userRepairedFilter)
  298. ->with(['users'])
  299. ->whereIn('area_id', $area_ids)
  300. ->orderByDesc('id')
  301. ->paginate();
  302. return $this->ok(UserRepairedResource::collection($repaired));
  303. }
  304. /**
  305. * updateUserRepairedStatus 更新为已读
  306. *
  307. * @param Request $request
  308. * @return \Illuminate\Http\JsonResponse
  309. * @author Fx
  310. *
  311. */
  312. public function updateUserRepairedStatus(Request $request)
  313. {
  314. $id = $request->get('id') ?? '';
  315. if (empty($id)) return $this->error('参数错误');
  316. $repaired = Trouble::query()->where('id',$id)->where(AdminMerchant::getMerchantWhere())->first();
  317. if (empty($repaired)) return $this->error('参数错误,找不到该报修');
  318. $repaired->status = 1;
  319. $repaired->save();
  320. return $this->ok('修改成功');
  321. }
  322. /**
  323. * getRepairedImg 获取报修图片
  324. *
  325. * @param Request $request
  326. * @return \Illuminate\Http\JsonResponse *@author Fx
  327. *
  328. */
  329. public function getRepairedImg(Request $request)
  330. {
  331. $imgIds = $request->get('imgIds') ?? [];
  332. if (empty($imgIds)) return $this->error('参数错误');
  333. $images = Upload::query()->whereIn('id', $imgIds)->where(AdminMerchant::getMerchantWhere())->get(['url'])->toArray();
  334. return $this->ok($images);
  335. }
  336. /**
  337. * index 问题反馈
  338. *
  339. * @param Request $request
  340. * @param QuestionFilter $filter
  341. * @return \Illuminate\Http\JsonResponse
  342. * @author Fx
  343. *
  344. */
  345. public function feedback(Request $request, QuestionFilter $filter)
  346. {
  347. $area_ids = self::$areaIds;
  348. // dd($area_ids);
  349. $question = Questions::query()
  350. ->where(AdminMerchant::getMerchantWhere())
  351. ->filter($filter)
  352. ->orderByDesc('id')
  353. ->whereIn('area_id', $area_ids)
  354. ->paginate();
  355. return $this->ok(QuestionResource::collection($question));
  356. }
  357. /**
  358. * isReadChange 改为已读
  359. *
  360. * @param Request $request
  361. * @return \Illuminate\Http\JsonResponse
  362. * @author Fx
  363. *
  364. */
  365. public function isReadChange(Request $request)
  366. {
  367. $id = $request->get('id') ?? 0;
  368. $question = Questions::query()->where('id',$id)->where(AdminMerchant::getMerchantWhere())->first();
  369. if (empty($question)) {
  370. return $this->error('参数错误');
  371. }
  372. $question->is_read = Questions::READ_YES;
  373. $bool = $question->save();
  374. if ($bool) {
  375. return $this->ok('修改成功');
  376. } else {
  377. return $this->error('发生错误,请联系管理员');
  378. }
  379. }
  380. }