AdminUsersHelper.php 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. <?php
  2. /*
  3. * @Description: 用户表
  4. * @Version: *
  5. * @Autor: lexuan
  6. * @Date: 2024-11-23 16:33:47
  7. * @LastEditors: lexuan
  8. * @LastEditTime: 2024-11-23 16:33:47
  9. */
  10. namespace App\DataApiNew\Helper;
  11. use App\DataApiNew\Models\AdminUsers;
  12. use App\Models\Pages;
  13. use App\Models\SpoutExport;
  14. use App\Models\SpoutImport;
  15. use App\DataApiNew\Models\AdminUserLevel;
  16. use App\DataApiNew\Models\AdminUsersMemberLevel;
  17. use App\DataApiNew\Models\BlackList;
  18. use App\DataApiNew\Models\Orders;
  19. use App\DataApiNew\Models\SystemSetting;
  20. use App\DataApiNew\Models\UserYjrecord;
  21. use Carbon\Carbon;
  22. use Illuminate\Http\Request;
  23. use Illuminate\Support\Facades\DB;
  24. use Illuminate\Support\Facades\Log;
  25. use Illuminate\Support\Facades\Token;
  26. class AdminUsersHelper
  27. {
  28. // 查询条件
  29. public function whens($query, $request)
  30. {
  31. return $query
  32. ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
  33. ->when($request->filled('mobile'), fn ($q) => $q->where('mobile', $request->mobile))
  34. ->when($request->filled('username'), fn ($q) => $q->where('username','like', "%$request->username%"));
  35. }
  36. // 查询列表
  37. public function select(Request $request)
  38. {
  39. $user_id = $request->user()->id;
  40. $page = new Pages($request, AdminUsers::query());
  41. $page->withRelations(['member_level']);
  42. $page->before(function ($query) use ($request, $user_id) {
  43. if (!AdminUsers::isAdmin($user_id)) {
  44. $directChildrens = AdminUsers::getDirectChildrens($user_id); // 获取全部下级,不包括自己
  45. $query->whereIn('id', $directChildrens);
  46. }
  47. $query->select(AdminUsers::$selectFields);
  48. return $this->whens($query, $request);
  49. });
  50. $page->after(function ($data) use ($user_id) {
  51. if (!AdminUsers::isAdmin($user_id)) {
  52. $data->makeHidden(['id']);
  53. }
  54. });
  55. $result = $page->paginate();
  56. return $result;
  57. }
  58. // 导出
  59. public function export(Request $request)
  60. {
  61. $request->validate([
  62. 'created_at_start' => 'required',
  63. 'created_at_end' => 'required',
  64. ]);
  65. $header = [
  66. '用户编码' => 'user_id',
  67. '用户名' => 'username',
  68. '头衔' => 'member_level_id',
  69. '手机号码' => 'mobile',
  70. '地址' => 'address',
  71. '剩余佣金' => 'yj',
  72. '邀请码' => 'share_code',
  73. '联系电话' => 'contact_number',
  74. '号卡抽成类型' => 'yj_type',
  75. '号卡抽成比例' => 'yj_p',
  76. '号卡抽成金额' => 'yj_a',
  77. '宽带抽成类型' => 'kd_yj_type',
  78. '宽带抽成比例' => 'kd_yj_p',
  79. '宽带抽成金额' => 'kd_yj_a',
  80. '设备抽成类型' => 'iot_yj_type',
  81. '设备抽成比例' => 'iot_yj_p',
  82. '号卡默认抽成类型' => 'default_yj_type',
  83. '号卡默认抽成比例' => 'default_yj_p',
  84. '号卡默认抽成金额' => 'default_yj_a',
  85. '宽带默认抽成类型' => 'default_kd_yj_type',
  86. '宽带默认抽成比例' => 'default_kd_yj_p',
  87. '宽带默认抽成金额' => 'default_kd_yj_a',
  88. '设备默认抽成类型' => 'default_iot_yj_type',
  89. '设备默认抽成比例' => 'default_iot_yj_p',
  90. ];
  91. sys_log($request, '用户导出', '用户管理');
  92. $user_id = $request->user()->id;
  93. $query = AdminUsers::select(array_values($header));
  94. if (!AdminUsers::isAdmin($user_id)) {
  95. $directChildrens = AdminUsers::getDirectChildrens($user_id); // 获取全部下级,不包括自己
  96. $query->whereIn('id', $directChildrens);
  97. }
  98. $query = $this->whens($query, $request);
  99. $query->orderBy('created_at', 'desc');
  100. $getEnValue = $this->getEnValue();
  101. $excel = new SpoutExport($header);
  102. $excel->setQuery($query);
  103. $result = $excel->setEnum($getEnValue)
  104. ->setProcessStyle()
  105. // ->setDownload()
  106. ->spoutToExcel('团队列表');
  107. // return $result;
  108. return $result ? success($result['url']) : error();
  109. }
  110. // 导入
  111. public function import(Request $request)
  112. {
  113. $header = [
  114. '用户名' => 'username',
  115. '密码' => 'password',
  116. '名称' => 'name',
  117. '头像' => 'avatar',
  118. '真实密码' => 'real_password',
  119. '联系电话' => 'mobile',
  120. '地址' => 'address',
  121. '剩余佣金' => 'yj',
  122. '佣金比例' => 'yj_p',
  123. '已提现佣金' => 'al_yj',
  124. '是否是代理' => 'is_agent',
  125. '邀请码' => 'share_code',
  126. '角色' => 'role_ids',
  127. '代理等级:0合伙人 1代理' => 'agent_level',
  128. '上级id' => 'pid',
  129. '客服类型 1:链接 2:图片' => 'kefu_type',
  130. '客服链接' => 'kefu_url',
  131. '客服图片' => 'kefu_image',
  132. '小店头像图片' => 'small_shop_image',
  133. '联系电话' => 'contact_number',
  134. '联系二维码' => 'contact_qrcode',
  135. '集客仓用户id' => 'jkc_user_id',
  136. '分成类型 1:比例 2:金额' => 'yj_type',
  137. '合伙人默认抽成比例' => 'default_yj_p',
  138. '备注' => 'remark',
  139. '删除时间' => 'deleted_at',
  140. '下级分销是否强制关注' => 'is_follow',
  141. '是否发送套餐短信' => 'is_package_sms',
  142. '是否实名' => 'is_real',
  143. '身份证姓名' => 'id_name',
  144. '身份证号码' => 'id_card',
  145. '身份证家庭地址' => 'id_card_address',
  146. '身份证正面' => 'id_card_front',
  147. '身份证反面' => 'id_card_back',
  148. '合伙人运营' => 'agent_operate',
  149. '合伙人客服' => 'agent_kefu',
  150. '合伙人主播' => 'agent_anchor',
  151. '公众号open_id' => 'gzh_open_id',
  152. '小程序open_id' => 'xcx_open_id',
  153. 'unionid' => 'unionid',
  154. '是否接口提单' => 'is_api',
  155. '状态' => 'status',
  156. '合伙人默认抽成类型 0不启用 1比例 2金额' => 'default_yj_type',
  157. '套餐分成开关 0关 1开(默认)' => 'package_yj_status',
  158. '显示首冲信息开关' => 'show_first_charge',
  159. '会员等级id' => 'member_level_id',
  160. '是否允许下单 0禁止下单 1可以下单' => 'is_put_order',
  161. '设备抽成类型 1比例 2金额' => 'iot_yj_type',
  162. '设备抽成比例' => 'iot_yj_p',
  163. '默认设备抽成类型 1比例 2金额' => 'default_iot_yj_type',
  164. '默认设备抽成比例' => 'default_iot_yj_p',
  165. '宽带抽成类型 1比例 2金额' => 'kd_yj_type',
  166. '宽带抽成比例' => 'kd_yj_p',
  167. '默认宽带抽成类型 1比例 2金额' => 'default_kd_yj_type',
  168. '默认宽带抽成比例' => 'default_kd_yj_p',
  169. '是否快照授权 0否 1是' => 'is_snapshotuser',
  170. ];
  171. $getEnValue = $this->getEnValue();
  172. $SpoutImport = new SpoutImport($header);
  173. $dataList = $SpoutImport->setRequest($request)->getExcelData();
  174. return $dataList;
  175. }
  176. // 获取枚举值
  177. public function getEnValue()
  178. {
  179. $data = [
  180. 'yj_type' => SystemSetting::$drawType,
  181. 'kd_yj_type' => SystemSetting::$drawType,
  182. 'iot_yj_type' => SystemSetting::$drawType,
  183. 'default_yj_type' => SystemSetting::$drawType,
  184. 'default_kd_yj_type' => SystemSetting::$drawType,
  185. 'default_iot_yj_type' => SystemSetting::$drawType,
  186. 'member_level_id' => AdminUsersMemberLevel::pluck('name', 'id')
  187. ];
  188. return $data;
  189. }
  190. // 查询一条
  191. public function find(Request $request)
  192. {
  193. $request->validate([
  194. 'id' => 'required|integer',
  195. ]);
  196. $result = AdminUsers::where(['id' => $request->id])->select(AdminUsers::$selectFields)->first();
  197. return success($result);
  198. }
  199. // 添加
  200. public function insert(Request $request)
  201. {
  202. sys_log($request, '用户添加', '用户日志');
  203. $request->validate([
  204. 'name' => 'required',
  205. ]);
  206. $result = AdminUsers::create($request->all());
  207. if ($result) {
  208. return success();
  209. } else {
  210. return error();
  211. }
  212. }
  213. // 修改
  214. public function update(Request $request)
  215. {
  216. sys_log($request, '用户修改', '用户日志');
  217. $request->validate([
  218. 'id' => 'required|integer',
  219. ]);
  220. $result = AdminUsers::where(['id' => $request->id])->update($request->all());
  221. if ($result) {
  222. return success();
  223. } else {
  224. return error();
  225. }
  226. }
  227. // 删除
  228. public function delete(Request $request)
  229. {
  230. $request->validate([
  231. 'ids' => 'required',
  232. ]);
  233. sys_log($request, '用户删除', '用户日志');
  234. $id_str = $request->ids;
  235. $arr = explode(",", $id_str);
  236. // 查询是否存在子数据
  237. // $count = Shop::whereIn('tm_id',$arr)->count();
  238. // if($count > 0){
  239. // return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
  240. // }
  241. $result = AdminUsers::whereIn('id', $arr)->delete();
  242. if ($result) {
  243. return success();
  244. } else {
  245. return error();
  246. }
  247. }
  248. // 密码登录
  249. public function userLogin(Request $request)
  250. {
  251. $request->validate([
  252. 'mobile' => 'required',
  253. 'password' => 'required',
  254. 'login_type' => 'required',
  255. ], [
  256. 'mobile.required' => '手机号码不能为空',
  257. 'password.required' => '密码不能为空',
  258. 'login_type.required' => '登录类型不能为空',
  259. ]);
  260. sys_log($request, '用户登录', '用户日志');
  261. // 检查黑名单
  262. if (BlackList::checkUser(null, $request->mobile)) {
  263. return error("账号异常");
  264. }
  265. $password = md5($request->password);
  266. $user = AdminUsers::where(['mobile' => $request->mobile, 'password' => $password])->select('id', 'username', 'user_id', 'mobile', 'password', 'share_code', 'member_level_id')->first();
  267. if ($user) {
  268. $data = $user->only([
  269. 'id',
  270. 'user_id',
  271. 'username',
  272. 'mobile',
  273. 'share_code',
  274. 'member_level_id',
  275. ]);
  276. $data['token'] = $user->createToken('BackSaler')->plainTextToken;
  277. return success($data,'登录成功');
  278. } else {
  279. return error("密码错误");
  280. }
  281. }
  282. // 获取登录用户信息
  283. public function getUserLoginInfo(Request $request)
  284. {
  285. $user_id = $request->user()->id;
  286. $user = AdminUsers::where(['id' => $user_id])->select('username', 'user_id', 'mobile', 'share_code', 'member_level_id', 'yj as balance')->first();
  287. if ($user) {
  288. $data = $user->only([
  289. 'user_id',
  290. 'username',
  291. 'mobile',
  292. 'share_code',
  293. 'member_level_id',
  294. 'balance',
  295. ]);
  296. return success($data);
  297. }
  298. return error();
  299. }
  300. // 验证码登录
  301. public function userLoginByCode(Request $request)
  302. {
  303. $request->validate([
  304. 'mobile' => 'required',
  305. 'sms_code' => 'required',
  306. 'login_type' => 'required',
  307. ], [
  308. 'mobile.required' => '手机号码不能为空',
  309. 'sms_code.required' => '验证码不能为空',
  310. 'login_type.required' => '登录类型不能为空',
  311. ]);
  312. sys_log($request, '用户验证码登录', '用户日志');
  313. // 检查黑名单
  314. if (BlackList::checkUser(null, $request->mobile)) {
  315. return error("账号异常");
  316. }
  317. $notSmsMobile = AdminUsers::$notSmsMobile;
  318. if (!in_array($request->mobile, $notSmsMobile)) {
  319. $smsCodeHelper = new TencentSmsHelper();
  320. $res = $smsCodeHelper->validSmsCode($request);
  321. if ($res['code'] == 0) return $res;
  322. }
  323. $user = AdminUsers::where(['mobile' => $request->mobile])->select('id', 'username', 'user_id', 'mobile', 'password', 'share_code', 'member_level_id')->first();
  324. if ($user) {
  325. $data = $user->only([
  326. 'id',
  327. 'user_id',
  328. 'username',
  329. 'mobile',
  330. 'share_code',
  331. 'member_level_id',
  332. ]);
  333. $data['token'] = $user->createToken('BackSaler')->plainTextToken;
  334. return success($data,'登录成功');
  335. } else {
  336. return error("账号未注册");
  337. }
  338. }
  339. // 退出登录
  340. public function userLogout(Request $request)
  341. {
  342. sys_log($request, '用户退出', '用户日志');
  343. $user = $request->user();
  344. if ($user) {
  345. $request->user()->currentAccessToken()->delete(); // 删除当前token
  346. // $user->tokens()->delete();// 撤销所有token
  347. return success();
  348. } else {
  349. return error();
  350. }
  351. }
  352. // 生成邀请码 验证用户唯一
  353. public function setUserShareCode(Request $request)
  354. {
  355. sys_log($request, '生成邀请码', '用户日志');
  356. // $user_id = $request->input('user_id', auth()->id());
  357. // $share_code = $request->input('share_code', (new UtilsHelper)->generateNextCode());
  358. $user_id = auth()->id();
  359. $share_code = (new UtilsHelper)->generateNextCode();
  360. $share_code_status = AdminUsers::where('share_code', $share_code)->exists();
  361. if ($share_code_status) {
  362. return error("邀请码已被使用");
  363. }
  364. $info = AdminUsers::where('user_id', $user_id)->first();
  365. if (!$info || !empty($info->share_code)) {
  366. return error("邀请码已存在");
  367. }
  368. $result = $info->update(['share_code' => $share_code]);
  369. if ($result) {
  370. return success([],'修改邀请码成功');
  371. } else {
  372. return error('修改邀请码失败');
  373. }
  374. }
  375. // 自定义邀请码
  376. public function setUserShareCodeCustomization(Request $request)
  377. {
  378. $request->validate([
  379. 'user_id' => 'required',
  380. 'share_code' => 'required',
  381. ]);
  382. sys_log($request, '自定义邀请码', '用户日志');
  383. if (!AdminUsers::isAdmin($request->user()->id)) {
  384. return error('权限不足');
  385. }
  386. $share_code = $request->input('share_code', (new UtilsHelper)->generateNextCode());
  387. $share_code_status = AdminUsers::Where('share_code', $share_code)->exists();
  388. if ($share_code_status) {
  389. return error('邀请码被使用');
  390. }
  391. $result = AdminUsers::where('id', $request->user_id)->update(['share_code' => $share_code]);
  392. if ($result) {
  393. return success([],'修改邀请码成功');
  394. } else {
  395. return error('修改邀请码失败');
  396. }
  397. }
  398. // 海报秘钥获取邀请码
  399. public function getPosterShareCode(Request $request)
  400. {
  401. $request->validate([
  402. 'poster_key' => 'required',
  403. ]);
  404. $poster_key = decrypt($request->poster_key);
  405. parse_str($poster_key, $poster_key_arr);
  406. return success($poster_key_arr['share_code']);
  407. }
  408. // 邀请码注册
  409. public function userRegister(Request $request)
  410. {
  411. $request->validate([
  412. 'mobile' => 'required',
  413. 'password' => 'required',
  414. 'sms_code' => 'required',
  415. ]);
  416. sys_log($request, '用户注册', '用户日志');
  417. if ($request->has('share_code')){
  418. $share_code = $request->share_code;
  419. $notSmsMobile = AdminUsers::$notSmsMobile;
  420. if (!in_array($request->mobile, $notSmsMobile)) {
  421. $smsCodeHelper = new TencentSmsHelper();
  422. $res = $smsCodeHelper->validSmsCode($request);
  423. if ($res['code'] == 0) return $res;
  424. }
  425. $user = AdminUsers::where('mobile', $request->mobile)->exists();
  426. if ($user) {
  427. return error('该手机号已注册');
  428. }
  429. $parent_user = AdminUsers::where('share_code', $share_code)->first();
  430. if ($parent_user) {
  431. $yj_type = $parent_user['default_yj_type'];
  432. $yj_a = $parent_user['default_yj_a'];
  433. $yj_p = $parent_user['default_yj_p'];
  434. $iot_yj_type = $parent_user['default_iot_yj_type'];
  435. $iot_yj_p = $parent_user['default_iot_yj_p'];
  436. $kd_yj_type = $parent_user['default_kd_yj_type'];
  437. $kd_yj_p = $parent_user['default_kd_yj_p'];
  438. $kd_yj_a = $parent_user['default_kd_yj_a'];
  439. } else {
  440. $parent_user = AdminUsers::where('id', AdminUsers::ADMINID)->first();
  441. $defaultYjConfig = AdminUsers::$defaultYjConfig;
  442. $yj_type = $defaultYjConfig['default_yj_type'];
  443. $yj_a = $defaultYjConfig['default_yj_a'];
  444. $yj_p = $defaultYjConfig['default_yj_p'];
  445. $iot_yj_type = $defaultYjConfig['default_iot_yj_type'];
  446. $iot_yj_p = $defaultYjConfig['default_iot_yj_p'];
  447. $kd_yj_type = $defaultYjConfig['default_kd_yj_type'];
  448. $kd_yj_p = $defaultYjConfig['default_kd_yj_p'];
  449. $kd_yj_a = $defaultYjConfig['default_kd_yj_a'];
  450. }
  451. } else{
  452. $request->validate([
  453. 'poster_key' => 'required',
  454. ]);
  455. $poster_key = decrypt($request->poster_key);
  456. parse_str($poster_key, $poster_key_arr);
  457. $notSmsMobile = AdminUsers::$notSmsMobile;
  458. if (!in_array($request->mobile, $notSmsMobile)) {
  459. $smsCodeHelper = new TencentSmsHelper();
  460. $res = $smsCodeHelper->validSmsCode($request);
  461. if ($res['code'] == 0) return $res;
  462. }
  463. $user = AdminUsers::where('mobile', $request->mobile)->exists();
  464. if ($user) {
  465. return error('该手机号已注册');
  466. }
  467. $parent_user = AdminUsers::where('share_code', $poster_key_arr['share_code'])->first();
  468. if (!$parent_user) {
  469. return error('邀请码不存在');
  470. }
  471. $defaultYjConfig = AdminUsers::$defaultYjConfig;
  472. if (!isset($poster_key_arr['default_yj_type']) || $poster_key_arr['default_yj_type'] == 0) {
  473. $yj_type = $defaultYjConfig['default_yj_type'];
  474. $yj_a = $defaultYjConfig['default_yj_a'];
  475. $yj_p = $defaultYjConfig['default_yj_p'];
  476. } else {
  477. $yj_type = $poster_key_arr['default_yj_type'];
  478. $yj_a = $poster_key_arr['default_yj_a'];
  479. $yj_p = $poster_key_arr['default_yj_p'];
  480. }
  481. if (!isset($poster_key_arr['default_iot_yj_type']) || $poster_key_arr['default_iot_yj_type'] == 0) {
  482. $iot_yj_type = $defaultYjConfig['default_iot_yj_type'];
  483. $iot_yj_p = $defaultYjConfig['default_iot_yj_p'];
  484. } else {
  485. $iot_yj_type = $poster_key_arr['default_iot_yj_type'];
  486. $iot_yj_p = $poster_key_arr['default_iot_yj_p'];
  487. }
  488. if (!isset($poster_key_arr['default_kd_yj_type']) || $poster_key_arr['default_kd_yj_type'] == 0) {
  489. $kd_yj_type = $defaultYjConfig['default_kd_yj_type'];
  490. $kd_yj_p = $defaultYjConfig['default_kd_yj_p'];
  491. $kd_yj_a = $defaultYjConfig['default_kd_yj_a'];
  492. } else {
  493. $kd_yj_type = $poster_key_arr['default_kd_yj_type'];
  494. $kd_yj_p = $poster_key_arr['default_kd_yj_p'];
  495. $kd_yj_a = $poster_key_arr['default_kd_yj_a'];
  496. }
  497. }
  498. DB::beginTransaction();
  499. try {
  500. $userCreate = AdminUsers::create([
  501. 'user_id' => UtilsHelper::user_id(),
  502. 'mobile' => $request->mobile,
  503. 'username' => "用户" . substr($request->mobile, -4),
  504. 'password' => md5($request->password),
  505. 'real_password' => $request->password,
  506. 'share_code' => (new UtilsHelper)->generateNextCode(),
  507. 'yj_type' => $yj_type, // 分成类型 1:比例 2:金额
  508. 'yj_a' => $yj_a, // 分成金额
  509. 'yj_p' => $yj_p, // 佣金比例
  510. 'iot_yj_type' => $iot_yj_type, // 设备抽成类型 1比例 2金额
  511. 'iot_yj_p' => $iot_yj_p, // 设备抽成比例
  512. 'kd_yj_type' => $kd_yj_type, // 宽带抽成类型 1比例 2金额
  513. 'kd_yj_p' => $kd_yj_p, // 宽带抽成比例
  514. 'kd_yj_a' => $kd_yj_a, // 宽带抽成金额
  515. 'parent_id' => $parent_user->id,
  516. 'agent_level' => $parent_user->agent_level + 1,
  517. ]);
  518. if ($userCreate) {
  519. $up_level_path = $parent_user->level_path;
  520. $level_path = $up_level_path . ',' . "[$userCreate->id]";
  521. $userCreate->update(['level_path' => $level_path]);
  522. DB::commit();
  523. return success([],'注册成功');
  524. } else {
  525. DB::rollBack();
  526. return error('注册失败');
  527. }
  528. } catch (\Throwable $th) {
  529. DB::rollBack();
  530. Log::error("注册失败:" . $th);
  531. return error('注册失败');
  532. }
  533. }
  534. // 用户注销
  535. public function userCancel(Request $request)
  536. {
  537. sys_log($request, '用户注销', '用户日志');
  538. $user_id = auth()->id();
  539. if (!AdminUsers::isAdmin($user_id)) {
  540. return error('注销失败');
  541. }
  542. $userInfo = AdminUsers::where('id', $user_id)->first();
  543. if (empty($userInfo)) {
  544. return error('用户不存在');
  545. }
  546. $request['user_cancel_info'] = $userInfo->toArray();
  547. $result = $userInfo->update([
  548. 'mobile' => null,
  549. 'id_name' => null, //身份证姓名
  550. 'id_card' => null, //身份证号码
  551. 'status' => 1, // 注销
  552. ]);
  553. if ($result) {
  554. $userInfo->tokens()->delete();
  555. return success([],'注销成功');
  556. } else {
  557. return error('注销失败');
  558. }
  559. }
  560. // 修改密码
  561. public function updatePassword(Request $request)
  562. {
  563. $request->validate([
  564. 'old_password' => 'required',
  565. 'new_password' => 'required|min:6',
  566. 're_password' => 'required|same:new_password',
  567. ]);
  568. sys_log($request, '修改密码', '用户日志');
  569. $user_id = auth()->id();
  570. $userInfo = AdminUsers::where('id', $user_id)->first();
  571. if (empty($userInfo)) {
  572. return error('用户不存在');
  573. }
  574. if (md5($request->old_password) != $userInfo['password']) {
  575. return error('原密码错误');
  576. }
  577. $result = $userInfo->update([
  578. 'password' => md5($request->new_password),
  579. 'real_password' => $request->new_password,
  580. ]);
  581. if ($result) {
  582. $userInfo->tokens()->delete();
  583. return success([],'修改成功');
  584. } else {
  585. return error('修改失败');
  586. }
  587. }
  588. // 重置密码
  589. public function resetPassword(Request $request)
  590. {
  591. $request->validate([
  592. 'new_password' => 'required|min:6',
  593. 'user_id' => 'required',
  594. ]);
  595. sys_log($request, '重置密码', '用户日志');
  596. if (!AdminUsers::isAdmin(auth()->id())) {
  597. return error("无权操作");
  598. }
  599. $user_id = $request->user_id;
  600. $userInfo = AdminUsers::where('id', $user_id)->first();
  601. if (empty($userInfo)) {
  602. return error("用户不存在");
  603. }
  604. $result = $userInfo->update([
  605. 'password' => md5($request->new_password),
  606. 'real_password' => $request->new_password,
  607. ]);
  608. if ($result) {
  609. $userInfo->tokens()->delete();
  610. return success($request->new_password,'重置成功');
  611. } else {
  612. return error('重置失败');
  613. }
  614. }
  615. // 忘记密码
  616. public function forgetPassword(Request $request)
  617. {
  618. $request->validate([
  619. 'mobile' => 'required|min:11',
  620. 'sms_code' => 'required',
  621. 'new_password' => 'required'
  622. ]);
  623. $smsCodeHelper = new TencentSmsHelper();
  624. $res = $smsCodeHelper->validSmsCode($request);
  625. if ($res['code'] == 0) return $res;
  626. $userInfo = AdminUsers::where('mobile', $request->mobile)->first();
  627. if (empty($userInfo)) {
  628. return error("手机号不存在");
  629. }
  630. $result = $userInfo->update([
  631. 'password' => md5($request->new_password),
  632. 'real_password' => $request->new_password,
  633. ]);
  634. if ($result) {
  635. $userInfo->tokens()->delete();
  636. return success([],'重置成功');
  637. } else {
  638. return error('重置失败');
  639. }
  640. }
  641. // 设置下级用户抽成
  642. public function setUserYjType(Request $request)
  643. {
  644. $request->validate([
  645. 'user_id' => 'required|integer',
  646. 'yj_type' => 'in:1,2',
  647. 'yj_a' => 'numeric',
  648. 'yj_p' => 'integer',
  649. 'iot_yj_type' => 'in:1,2',
  650. 'iot_yj_p' => 'integer',
  651. 'kd_yj_type' => 'in:1,2',
  652. 'kd_yj_p' => 'integer',
  653. 'kd_yj_a' => 'numeric',
  654. ]);
  655. $op_user_id = auth()->id();
  656. sys_log($request, '设置下级用户抽成', '用户日志');
  657. $parent_id = AdminUsers::where('id', $request->user_id)->value('parent_id');
  658. if (!(AdminUsers::isAdmin($op_user_id) || $parent_id == $op_user_id)) {
  659. return ['code' => 0, 'msg' => "设置失败"];
  660. }
  661. $data = $request->only([
  662. 'yj_type',
  663. 'yj_a',
  664. 'yj_p',
  665. 'iot_yj_type',
  666. 'iot_yj_p',
  667. 'kd_yj_type',
  668. 'kd_yj_p',
  669. 'kd_yj_a',
  670. ]);
  671. $result = AdminUsers::where('id', $request->user_id)->update($data);
  672. return $result ? ['code' => 1, 'msg' => "设置成功"] : ['code' => 0, 'msg' => "设置失败"];
  673. }
  674. // 批量设置下级用户抽成
  675. public function batchSetUserYjType(Request $request)
  676. {
  677. $request->validate([
  678. 'user_ids' => 'required|String',
  679. 'yj_type' => 'in:1,2',
  680. 'yj_a' => 'numeric',
  681. 'yj_p' => 'integer',
  682. 'iot_yj_type' => 'in:1,2',
  683. 'iot_yj_p' => 'integer',
  684. 'kd_yj_type' => 'in:1,2',
  685. 'kd_yj_p' => 'integer',
  686. 'kd_yj_a' => 'numeric',
  687. ]);
  688. sys_log($request, '批量设置下级用户抽成', '用户日志');
  689. $op_user_id = auth()->id();
  690. $user_ids = explode(',', $request->user_ids);
  691. $parent_id = AdminUsers::whereIn('id', $user_ids)->pluck('parent_id')->toArray();
  692. if (!((in_array($op_user_id, array_unique($parent_id)) && reset($parent_id) === $op_user_id) || AdminUsers::isAdmin($op_user_id))) {
  693. return ['code' => 0, 'msg' => "设置失败"];
  694. }
  695. $data = $request->only([
  696. 'yj_type',
  697. 'yj_a',
  698. 'yj_p',
  699. 'iot_yj_type',
  700. 'iot_yj_p',
  701. 'kd_yj_type',
  702. 'kd_yj_p',
  703. 'kd_yj_a',
  704. ]);
  705. $result = AdminUsers::whereIn('id', $user_ids)->update($data);
  706. return $result ? ['code' => 1, 'msg' => "设置成功"] : ['code' => 0, 'msg' => "设置失败"];
  707. }
  708. // 用户设置默认抽成
  709. public function setDefaultYjType(Request $request)
  710. {
  711. $request->validate([
  712. 'default_yj_type' => 'in:1,2',
  713. 'default_yj_a' => 'numeric',
  714. 'default_yj_p' => 'integer',
  715. 'default_iot_yj_type' => 'in:1,2',
  716. 'default_iot_yj_p' => 'integer',
  717. 'default_kd_yj_type' => 'in:1,2',
  718. 'default_kd_yj_p' => 'integer',
  719. 'default_kd_yj_a' => 'numeric',
  720. ]);
  721. sys_log($request, '用户设置默认抽成', '用户日志');
  722. $result = AdminUsers::where('id', auth()->id())->update($request->only([
  723. 'default_yj_type',
  724. 'default_yj_a',
  725. 'default_yj_p',
  726. 'default_iot_yj_type',
  727. 'default_iot_yj_p',
  728. 'default_kd_yj_type',
  729. 'default_kd_yj_p',
  730. 'default_kd_yj_a',
  731. ]));
  732. return $result ? ['code' => 1, 'msg' => "设置成功"] : ['code' => 0, 'msg' => "设置失败"];
  733. }
  734. // 用户充值或扣除余额
  735. public function userChangeBalance(Request $request)
  736. {
  737. $request->validate([
  738. 'user_id' => 'required',
  739. 'status' => 'required|in:0,1',
  740. 'money' => 'required|numeric',
  741. 'type' => 'required|in:' . implode(',', array_keys(UserYjrecord::$type)),
  742. ]);
  743. sys_log($request, '用户充值或扣除余额', '用户日志');
  744. $user_id = $request->user_id;
  745. $status = $request->status;
  746. $money = $request->money;
  747. $type = $request->type;
  748. $remark = $request->input('remark', null);
  749. if (!AdminUsers::isAdmin($request->user()->id)) {
  750. return ['code' => 0, 'msg' => "操作失败"];
  751. }
  752. list($status, $msg, $data) = (new UserYjrecord())->recharge([
  753. 'user_id' => $user_id,
  754. 'status' => $status,
  755. 'yj' => $money,
  756. 'remark' => $remark,
  757. 'type' => $type,
  758. 'source' => '用户充值或扣除余额',
  759. ]);
  760. return $status ? ['code' => 1, 'msg' => "操作成功"] : ['code' => 0, 'msg' => $msg];
  761. }
  762. // 实名认证
  763. public function realNameAuth(Request $request)
  764. {
  765. $request->validate([
  766. 'id_card_front' => 'required|string',
  767. 'id_card_back' => 'required|string',
  768. ]);
  769. sys_log($request, '实名认证', '用户日志');
  770. $user_id = auth()->id();
  771. $user = AdminUsers::where('id', $user_id)->first();
  772. if ($user->is_real == 1) {
  773. return ['code' => 0, 'msg' => "已认证"];
  774. }
  775. $id_card_front = (new TencentOcrHelper)->idCardCheck($request->id_card_front, 1);
  776. if (!$id_card_front) {
  777. return ['code' => 0, 'msg' => "身份证正面识别失败"];
  778. }
  779. $id_card_front = json_decode($id_card_front, true);
  780. $id_card_back = (new TencentOcrHelper)->idCardCheck($request->id_card_back, 2);
  781. if (!$id_card_back) {
  782. return ['code' => 0, 'msg' => "身份证反面识别失败"];
  783. }
  784. $id_card_back = json_decode($id_card_back, true);
  785. $exists = AdminUsers::where('id_card', $id_card_front['IdNum'])->where('is_real', AdminUsers::IS_REAL_YES)->where('id', "!=", $user_id)->exists();
  786. if ($exists) {
  787. return ['code' => 0, 'msg' => "信息已被使用"];
  788. }
  789. $dbData = [
  790. 'is_real' => 1,
  791. 'id_name' => $id_card_front['Name'],
  792. 'id_card' => $id_card_front['IdNum'],
  793. 'id_card_address' => $id_card_front['Address'],
  794. 'id_card_front' => $request->id_card_front,
  795. 'id_card_back' => $request->id_card_back,
  796. ];
  797. $result = $user->update($dbData);
  798. return $result ? success() : error();
  799. }
  800. // 用户加入黑名单
  801. public function joinBlackList(Request $request)
  802. {
  803. $request->validate([
  804. 'user_id' => 'required|integer',
  805. ]);
  806. sys_log($request, '用户加入黑名单', '用户日志');
  807. $user = AdminUsers::select([
  808. 'id',
  809. 'mobile',
  810. ])->where('id', $request->user_id)->first();
  811. if (!$user) {
  812. return error("用户不存在");
  813. }
  814. $blacklist = BlackList::where('user_id', $request->user_id)->first();
  815. if ($blacklist) {
  816. return ['code' => 0, 'msg' => "已加入黑名单"];
  817. } else {
  818. $result = BlackList::create([
  819. 'user_id' => $request->user_id,
  820. 'phone' => $user->mobile,
  821. 'remark' => $request->input('remark', null),
  822. ]);
  823. }
  824. return $result ? success() : error();
  825. }
  826. // 用户移除黑名单
  827. public function removeBlackList(Request $request)
  828. {
  829. $request->validate([
  830. 'user_id' => 'required|integer',
  831. ]);
  832. sys_log($request, '用户移除黑名单', '用户日志');
  833. $result = BlackList::where('user_id', $request->user_id)->delete();
  834. return $result ? success() : error();
  835. }
  836. // 头衔晋升
  837. public function titlePromotion()
  838. {
  839. // 获取上个月的开始结束时间
  840. $startOfLastMonth = Carbon::now()->subMonth()->startOfMonth();
  841. $endOfLastMonth = Carbon::now()->subMonth()->endOfMonth();
  842. // 获取所有会员等级信息
  843. $memberLevel = AdminUsersMemberLevel::orderBy('level', 'asc')->get();
  844. $userList = AdminUsers::select(['id', 'member_level_id'])->whereNotIn('id', [1])->get();
  845. foreach ($userList as $user) {
  846. Log::info('头衔校验用户', ['user_id' => $user->id]);
  847. $finallyLevelId = null; // 最终等级id
  848. foreach ($memberLevel as $level) {
  849. $orderCount = 0; // 满足条件单数
  850. $userList = AdminUsers::getChildrens($user->id);
  851. // 校验提单数
  852. if ($level->check_type == AdminUsersMemberLevel::check_type_put) {
  853. $orderCount = Orders::whereIn('user_id', $userList)->whereBetween('created_at', [$startOfLastMonth, $endOfLastMonth])->count();
  854. Log::info('校验提单数', ['user_id' => $user->id, 'user_list' => $userList, 'order_count' => $orderCount]);
  855. }
  856. // 校验激活数
  857. if ($level->check_type == AdminUsersMemberLevel::check_type_active) {
  858. $orderCount = Orders::whereIn('user_id', $userList)->where('active_status', Orders::ACTIVE_STATUS_SUCCESS)->whereBetween('created_at', [$startOfLastMonth, $endOfLastMonth])->count();
  859. Log::info('校验激活数', ['user_id' => $user->id, 'user_list' => $userList, 'order_count' => $orderCount]);
  860. }
  861. if ($orderCount >= $level->check_ordernum && $level->is_promotion) {
  862. $finallyLevelId = $level->id;
  863. Log::info('获取最终等级id', ['user_id' => $user->id, 'finallyLevelId' => $finallyLevelId]);
  864. }
  865. }
  866. if ($finallyLevelId) {
  867. $result = $user->update(['member_level_id' => $finallyLevelId]);
  868. Log::info('更新用户等级', ['user_id' => $user->id, 'finallyLevelId' => $finallyLevelId, 'result' => $result ? '成功' : '失败']);
  869. }
  870. }
  871. }
  872. }