Member.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/2
  6. * Time: 下午1:55
  7. */
  8. namespace app\backend\modules\member\models;
  9. use app\backend\modules\member\observers\MemberObserver;
  10. use app\backend\modules\order\models\Order;
  11. use app\common\facades\Setting;
  12. use app\common\models\member\MemberDel;
  13. use app\common\traits\MemberTreeTrait;
  14. use Illuminate\Database\Eloquent\Builder;
  15. use Illuminate\Support\Facades\DB;
  16. use function foo\func;
  17. class Member extends \app\common\models\Member
  18. {
  19. use MemberTreeTrait;
  20. public $widgets = [];
  21. static protected $needLog = true;
  22. /**
  23. * 在boot()方法里注册下模型观察类
  24. * boot()和observe()方法都是从Model类继承来的
  25. * 主要是observe()来注册模型观察类,可以用TestMember::observe(new TestMemberObserve())
  26. * 并放在代码逻辑其他地方如路由都行,这里放在这个TestMember Model的boot()方法里自启动。
  27. */
  28. public static function boot()
  29. {
  30. parent::boot();
  31. //注册观察者
  32. static::observe(new MemberObserver);
  33. //
  34. // static::addGlobalScope(function (Builder $builder) {
  35. // $builder->isPlugin();
  36. // });
  37. }
  38. /**
  39. * 删除会员信息
  40. *
  41. * @param $id
  42. */
  43. public static function deleteMemberInfoById($id)
  44. {
  45. return self::uniacid()
  46. ->where('uid', $id)
  47. ->delete();
  48. }
  49. /**
  50. * 更新删除会员信息
  51. *
  52. * @param $id
  53. */
  54. public static function UpdateDeleteMemberInfoById($id)
  55. {
  56. $member_model = Member::find($id);
  57. MemberDel::insertData($member_model);
  58. $member_model->email = '';
  59. $member_model->nickname = '';
  60. $member_model->mobile = '';
  61. $member_model->email = '';
  62. $member_model->gender = 0;
  63. $member_model->nationality = '';
  64. $member_model->resideprovince = '';
  65. $member_model->residecity = '';
  66. $member_model->salt = '';
  67. $member_model->password = '';
  68. //todo 由于关系链下列参数不能清空
  69. /*$member_model->createtime = 0;
  70. $member_model->avatar = '';
  71. $member_model->credit1 = 0;
  72. $member_model->credit2 = 0;
  73. $member_model->credit3 = 0;
  74. $member_model->credit4 = 0;
  75. $member_model->credit5 = 0;
  76. $member_model->credit6 = 0;*/
  77. if ($member_model->save()) {
  78. return $member_model->uid;
  79. } else {
  80. return false;
  81. }
  82. }
  83. public function address()
  84. {
  85. return $this->hasMany('app\backend\modules\member\models\MemberAddress', 'uid', 'uid');
  86. }
  87. /**
  88. * @param $keyWord
  89. *
  90. */
  91. public static function getMemberByName($keyWord)
  92. {
  93. return self::uniacid()
  94. ->searchLike($keyWord)
  95. ->whereHas('yzMember', function ($query) {
  96. $query->whereNull('deleted_at');
  97. })
  98. ->with('yzMember')
  99. ->with('hasOneFans')
  100. ->with('hasOneMiniApp')
  101. ->get();
  102. }
  103. public static function getMemberJsonByName($keyWord)
  104. {
  105. return self::uniacid()
  106. ->searchLike($keyWord)
  107. ->select('uid', 'nickname', 'avatar', 'mobile')
  108. ->whereHas('yzMember', function ($query) {
  109. $query->whereNull('deleted_at');
  110. })
  111. ->with(['hasOneFans' => function ($q) {
  112. return $q->select('openid', 'uid');
  113. }])
  114. ->get();
  115. }
  116. /**
  117. * 获取会员列表
  118. *
  119. * @return mixed
  120. */
  121. public static function getMembers()
  122. {
  123. return self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  124. 'credit1', 'credit2'])
  125. ->uniacid()
  126. ->whereHas('yzMember', function ($query) {
  127. $query->whereNull('deleted_at');
  128. })
  129. ->with(['yzMember' => function ($query) {
  130. return $query->select(['member_id', 'parent_id', 'is_agent', 'group_id', 'level_id', 'is_black'])->uniacid()
  131. ->with(['group' => function ($query1) {
  132. return $query1->select(['id', 'group_name'])->uniacid();
  133. }, 'level' => function ($query2) {
  134. return $query2->select(['id', 'level', 'level_name'])->uniacid();
  135. }, 'agent' => function ($query3) {
  136. return $query3->select(['uid', 'avatar', 'nickname'])->uniacid();
  137. }]);
  138. }, 'hasOneFans' => function ($query4) {
  139. return $query4->select(['uid', 'openid', 'follow as followed'])->uniacid();
  140. }, 'hasOneOrder' => function ($query5) {
  141. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  142. ->uniacid()
  143. ->where('status', 3)
  144. ->groupBy('uid');
  145. }])
  146. ->orderBy('uid', 'desc');
  147. }
  148. /**
  149. * 获取会员信息
  150. *
  151. * @param $id
  152. * @return mixed
  153. */
  154. public static function getMemberInfoById($id)
  155. {
  156. return self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  157. 'credit1', 'credit2'])
  158. ->uniacid()
  159. ->where('uid', $id)
  160. ->whereHas('yzMember', function ($query) {
  161. $query->whereNull('deleted_at');
  162. })
  163. ->with(['yzMember' => function ($query) {
  164. return $query->select(['member_id', 'parent_id', 'is_agent', 'group_id', 'level_id', 'is_black', 'alipayname', 'alipay', 'content', 'status', 'custom_value', 'validity', 'member_form', 'withdraw_mobile', 'wechat'])->where('is_black', 0)
  165. ->with(['group' => function ($query1) {
  166. return $query1->select(['id', 'group_name']);
  167. }, 'level' => function ($query2) {
  168. return $query2->select(['id', 'level', 'level_name']);
  169. }, 'agent' => function ($query3) {
  170. return $query3->select(['uid', 'avatar', 'nickname']);
  171. }]);
  172. }, 'hasOneFans' => function ($query2) {
  173. return $query2->select(['uid', 'follow as followed']);
  174. }, 'hasOneOrder' => function ($query5) {
  175. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  176. ->uniacid()
  177. ->where('status', 3)
  178. ->groupBy('uid');
  179. }
  180. ])
  181. ->first();
  182. }
  183. /**
  184. * 获取会员信息(不判断黑名单)
  185. * @param $id
  186. * @return mixed
  187. */
  188. public static function getMemberInfoBlackById($id)
  189. {
  190. return self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  191. 'credit1', 'credit2'])
  192. ->uniacid()
  193. ->where('uid', $id)
  194. ->whereHas('yzMember', function ($query) {
  195. $query->whereNull('deleted_at');
  196. })
  197. ->with(['yzMember' => function ($query) {
  198. return $query->select(['member_id', 'parent_id', 'is_agent', 'group_id', 'level_id', 'is_black', 'alipayname', 'alipay', 'content', 'status', 'custom_value', 'validity', 'member_form', 'withdraw_mobile', 'wechat', 'invite_code'])
  199. ->with(['group' => function ($query1) {
  200. return $query1->select(['id', 'group_name']);
  201. }, 'level' => function ($query2) {
  202. return $query2->select(['id', 'level', 'level_name']);
  203. }, 'agent' => function ($query3) {
  204. return $query3->select(['uid', 'avatar', 'nickname']);
  205. }]);
  206. }, 'hasOneFans' => function ($query2) {
  207. return $query2->select(['uid', 'follow as followed']);
  208. }, 'hasOneOrder' => function ($query5) {
  209. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  210. ->uniacid()
  211. ->where('status', 3)
  212. ->groupBy('uid');
  213. }
  214. ])
  215. ->first();
  216. }
  217. /**
  218. * 获取会员基本信息
  219. *
  220. * @param $id
  221. * @return mixed
  222. */
  223. public static function getMemberBaseInfoById($id)
  224. {
  225. return self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  226. 'credit1', 'credit2'])
  227. ->uniacid()
  228. ->where('uid', $id)
  229. ->whereHas('yzMember', function ($query) {
  230. $query->whereNull('deleted_at');
  231. })
  232. ->with(['yzMember' => function ($query) {
  233. return $query->select(['member_id', 'parent_id', 'is_agent', 'group_id', 'level_id', 'is_black', 'alipayname', 'alipay', 'content', 'status', 'custom_value', 'validity', 'member_form', 'withdraw_mobile', 'wechat'])->where('is_black', 0)
  234. ->with(['group' => function ($query1) {
  235. return $query1->select(['id', 'group_name']);
  236. }, 'level' => function ($query2) {
  237. return $query2->select(['id', 'level', 'level_name']);
  238. }, 'agent' => function ($query3) {
  239. return $query3->select(['uid', 'avatar', 'nickname']);
  240. }]);
  241. }, 'hasOneFans' => function ($query2) {
  242. return $query2->select(['uid', 'follow as followed', 'unionid']);
  243. }
  244. ])
  245. ->first();
  246. }
  247. /**
  248. * 更新会员信息
  249. *
  250. * @param $data
  251. * @param $id
  252. * @return mixed
  253. */
  254. public static function updateMemberInfoById($data, $id)
  255. {
  256. return self::uniacid()
  257. ->where('uid', $id)
  258. ->update($data);
  259. }
  260. /**
  261. * 检索会员信息
  262. *
  263. * @param $parame
  264. * @return mixed
  265. */
  266. public static function searchMembers($parame, $credit = null)
  267. {
  268. if (!isset($credit)) {
  269. $credit = 'credit2';
  270. }
  271. $result = self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  272. 'credit1', 'credit2', 'is_old', 'mark_member_id'])
  273. ->uniacid()->leftJoin('yz_member_del_log', 'mc_members.uid', '=', 'yz_member_del_log.member_id')
  274. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id');
  275. if (!empty($parame['search']['mid'])) {
  276. $result = $result->where('uid', $parame['search']['mid']);
  277. }
  278. if (isset($parame['search']['searchtime']) && $parame['search']['searchtime'] == 1) {
  279. if ($parame['search']['times']['start'] != '请选择' && $parame['search']['times']['end'] != '请选择') {
  280. $range = [strtotime($parame['search']['times']['start']), strtotime($parame['search']['times']['end'])];
  281. $result = $result->whereBetween('createtime', $range);
  282. }
  283. }
  284. if (!empty($parame['search']['realname'])) {
  285. $result->where(function ($query) use ($parame) {
  286. switch ($parame['search']['name_type']) {
  287. case 1 :
  288. $query->where('realname', 'like', '%' . $parame['search']['realname'] . '%');
  289. break;
  290. case 2 :
  291. $query->where('mobile', 'like', '%' . $parame['search']['realname'] . '%');
  292. break;
  293. default :
  294. $query->searchLike($parame['search']['realname']);
  295. break;
  296. }
  297. });
  298. }
  299. if ($parame['search']['custom_value']) {
  300. $result->where('yz_member.custom_value', 'like', '%' . $parame['search']['custom_value'] . '%');
  301. }
  302. if (!empty($parame['search']['groupid'])) {
  303. $result->where('yz_member.group_id', $parame['search']['groupid']);
  304. }
  305. if (is_numeric($parame['search']['level'])) {
  306. $result->where('yz_member.level_id', $parame['search']['level']);
  307. }
  308. if ($parame['search']['isblack'] != '') {
  309. $result->where('yz_member.is_black', $parame['search']['isblack']);
  310. }
  311. if ($parame['search']['isagent'] != '') {
  312. $result->where('yz_member.is_agent', $parame['search']['isagent']);
  313. }
  314. //余额区间搜索
  315. if ($parame['search']['min_credit2']) {
  316. $result = $result->where($credit, '>', $parame['search']['min_credit2']);
  317. }
  318. if ($parame['search']['max_credit2']) {
  319. $result = $result->where($credit, '<', $parame['search']['max_credit2']);
  320. }
  321. if ($parame['search']['followed'] != '') {
  322. $result = $result->whereHas('hasOneFans', function ($q2) use ($parame) {
  323. $q2->where('follow', $parame['search']['followed']);
  324. });
  325. }
  326. $result = $result->with(['yzMember' => function ($query) {
  327. return $query->select(['member_id', 'parent_id', 'inviter', 'is_agent', 'group_id', 'level_id', 'is_black', 'withdraw_mobile', 'is_old'])
  328. ->with(['group' => function ($query1) {
  329. return $query1->select(['id', 'group_name'])->uniacid();
  330. }, 'level' => function ($query2) {
  331. return $query2->select(['id', 'level_name'])->uniacid();
  332. }, 'agent' => function ($query3) {
  333. return $query3->select(['uid', 'avatar', 'nickname', 'mobile'])->uniacid();
  334. }]);
  335. }, 'hasOneFans' => function ($query4) {
  336. return $query4->select(['uid', 'follow as followed'])->uniacid();
  337. }, 'hasOneOrder' => function ($query5) {
  338. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  339. ->uniacid()
  340. ->where('status', Order::COMPLETE)
  341. ->groupBy('uid');
  342. }, 'hasOneMiniApp', 'hasOneUnique', 'hasOneWechat', 'hasOneDouyin', 'yzMember.agent']);
  343. //判断支付宝插件
  344. if (file_exists(base_path('plugins/alipay-onekey-login'))) {
  345. $result->with('hasOneAlipay');
  346. }
  347. //判断会员标签插件
  348. $set = array_pluck(Setting::getAllByGroup('member-tags')->toArray(), 'value', 'key');
  349. if (app('plugins')->isEnabled('member-tags') && $set['is_open']) {
  350. if ($parame['tag_id']) {
  351. $result->whereHas('hasManyTag', function ($query) use ($parame) {
  352. $query->where('tag_id', $parame['tag_id']);
  353. });
  354. }
  355. $result->with(['hasManyTag' => function ($query) {
  356. $query->with('tag');
  357. }]);
  358. }
  359. if (app('plugins')->isEnabled('wechat-customers') && app('plugins')->isEnabled('work-wechat-platform')) {
  360. $result->with('hasOneCustomers');
  361. }
  362. $result->whereNull('yz_member_del_log.member_id')
  363. ->whereNull('yz_member.deleted_at')
  364. ->orderBy('yz_member.member_id', 'desc');
  365. return $result;
  366. }
  367. public function getTagsList()
  368. {
  369. return MemberTagsModel::select('id', 'title')->where('type', 1)->get()->toArray();
  370. }
  371. /**
  372. * 检索会员信息(财务--会员余额页面使用)
  373. *
  374. * @param $parame
  375. * @return mixed
  376. */
  377. public static function searchMembersBlance($parame, $credit = null)
  378. {
  379. if (!isset($credit)) {
  380. $credit = 'credit2';
  381. }
  382. $result = self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  383. 'credit1', 'credit2', 'is_old', 'mark_member_id'])
  384. ->uniacid()->leftJoin('yz_member_del_log', 'mc_members.uid', '=', 'yz_member_del_log.member_id')
  385. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id');
  386. if (!empty($parame['search']['mid'])) {
  387. $result = $result->where('uid', $parame['search']['mid']);
  388. }
  389. if (isset($parame['search']['searchtime']) && $parame['search']['searchtime'] == 1) {
  390. if ($parame['search']['times']['start'] != '请选择' && $parame['search']['times']['end'] != '请选择') {
  391. $range = [strtotime($parame['search']['times']['start']), strtotime($parame['search']['times']['end'])];
  392. $result = $result->whereBetween('createtime', $range);
  393. }
  394. }
  395. if (!empty($parame['search']['realname'])) {
  396. $result = $result->where(function ($query) use ($parame) {
  397. $query->where('realname', 'like', '%' . $parame['search']['realname'] . '%')
  398. ->orWhere('mobile', 'like', '%' . $parame['search']['realname'] . '%')
  399. ->orWhere('nickname', 'like', '%' . $parame['search']['realname'] . '%');
  400. });
  401. }
  402. if ($parame['search']['custom_value']) {
  403. $result->where('yz_member.custom_value', 'like', '%' . $parame['search']['custom_value'] . '%');
  404. }
  405. if (!empty($parame['search']['groupid'])) {
  406. $result->where('yz_member.group_id', $parame['search']['groupid']);
  407. }
  408. if (!empty($parame['search']['level'])) {
  409. $result->where('yz_member.level_id', $parame['search']['level']);
  410. }
  411. if ($parame['search']['isblack'] != '') {
  412. $result->where('yz_member.is_black', $parame['search']['isblack']);
  413. }
  414. if ($parame['search']['isagent'] != '') {
  415. $result->where('yz_member.is_agent', $parame['search']['isagent']);
  416. }
  417. //余额区间搜索
  418. if ($parame['search']['min_credit2']) {
  419. $result = $result->where($credit, '>', $parame['search']['min_credit2']);
  420. }
  421. if ($parame['search']['max_credit2']) {
  422. $result = $result->where($credit, '<', $parame['search']['max_credit2']);
  423. }
  424. if ($parame['search']['followed'] != '') {
  425. $result = $result->whereHas('hasOneFans', function ($q2) use ($parame) {
  426. $q2->where('follow', $parame['search']['followed']);
  427. });
  428. }
  429. $result = $result->with(['yzMember' => function ($query) {
  430. return $query->select(['member_id', 'parent_id', 'inviter', 'is_agent', 'group_id', 'level_id', 'is_black', 'withdraw_mobile', 'is_old'])
  431. ->with(['group' => function ($query1) {
  432. return $query1->select(['id', 'group_name'])->uniacid();
  433. }, 'level' => function ($query2) {
  434. return $query2->select(['id', 'level_name'])->uniacid();
  435. }, 'agent' => function ($query3) {
  436. return $query3->select(['uid', 'avatar', 'nickname', 'mobile'])->uniacid();
  437. }]);
  438. }, 'hasOneFans' => function ($query4) {
  439. return $query4->select(['uid', 'follow as followed'])->uniacid();
  440. }, 'hasOneOrder' => function ($query5) {
  441. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  442. ->uniacid()
  443. ->where('status', Order::COMPLETE)
  444. ->groupBy('uid');
  445. }, 'hasOneMiniApp', 'hasOneUnique', 'hasOneWechat', 'hasOneDouyin', 'yzMember.agent']);
  446. //判断支付宝插件
  447. if (file_exists(base_path('plugins/alipay-onekey-login'))) {
  448. $result->with('hasOneAlipay');
  449. }
  450. $result->whereNull('yz_member_del_log.member_id')
  451. ->whereNull('yz_member.deleted_at')
  452. ->orderBy('yz_member.member_id', 'desc');
  453. return $result;
  454. }
  455. /**
  456. * 获取会员关系链资料申请
  457. *
  458. * @return mixed
  459. */
  460. public static function getMembersToApply($filters)
  461. {
  462. $filters['referee_id'] = [];
  463. if ($filters['referee'] == '1' && $filters['referee_info']) {
  464. $query = self::select(['uid'])
  465. ->uniacid()
  466. ->searchLike($filters['referee_info'])
  467. ->get();
  468. if (!empty($query)) {
  469. $data = $query->toArray();
  470. foreach ($data as $item) {
  471. $filters['referee_id'][] = $item['uid'];
  472. }
  473. }
  474. }
  475. $query = self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile']);
  476. $query->uniacid();
  477. if (!empty($filters['uid'])) {
  478. $query->where('uid', $filters['uid']);
  479. }
  480. if (!empty($filters['member'])) {
  481. $query->searchLike($filters['member']);
  482. }
  483. $query->whereHas('yzMember', function ($query) use ($filters) {
  484. if (!empty($filters) && !empty($filters['times']['start']) && !empty($filters['times']['end'])) {
  485. $query->whereBetween('apply_time', [$filters['times']['start'], $filters['times']['end']]);
  486. }
  487. if ($filters['referee'] == '0') {
  488. $query->where('parent_id', $filters['referee']);
  489. } elseif ($filters['referee'] == '1' && !empty($filters['referee_id'])) {
  490. $query->whereIn('parent_id', $filters['referee_id']);
  491. }
  492. $query->where('status', 1);
  493. });
  494. $query->with([
  495. 'yzMember' => function ($query) {
  496. return $query->select(['member_id', 'parent_id', 'apply_time', 'is_agent'])
  497. ->with(['agent' => function ($query3) {
  498. return $query3->select(['uid', 'avatar', 'nickname']);
  499. }]);
  500. },
  501. 'hasOneFans' => function ($q) {
  502. $q->select(['uid', 'openid']);
  503. },
  504. 'hasOneMiniApp' => function ($query) {
  505. return $query->select(['mini_app_id', 'member_id', 'openid'])->uniacid();
  506. },
  507. 'hasOneUnique' => function ($query) {
  508. return $query->select(['unique_id', 'member_id', 'unionid'])->uniacid();
  509. },
  510. ])
  511. ->orderBy('uid', 'desc');
  512. return $query;
  513. }
  514. /**
  515. * 推广下线
  516. *
  517. * @param $request
  518. * @return mixed
  519. */
  520. public static function getAgentInfoByMemberId($request)
  521. {
  522. $query = self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  523. 'credit1', 'credit2'])
  524. ->uniacid();
  525. if ($request->keyword) {
  526. $query->searchLike($request->keyword);
  527. }
  528. $query->whereHas('yzMember', function ($query) use ($request) {
  529. $query->select(['member_id', 'parent_id', 'is_agent', 'status', 'inviter'])->where('parent_id', $request->id);
  530. if ($request->aid) {
  531. $query->where('member_id', $request->aid);
  532. }
  533. if ($request->status != '') {
  534. $query->where('status', $request->status);
  535. }
  536. if ($request->isblack != '') {
  537. $query->where('is_black', $request->isblack);
  538. }
  539. });
  540. if ($request->followed != '') {
  541. if ($request->followed == '2') {
  542. $query->doesntHave('hasOneFans');
  543. }
  544. if ($request->followed == '0' || $request->followed == '1') {
  545. $query->whereHas('hasOneFans', function ($q) use ($request) {
  546. $q->select(['uid', 'follow'])->where('follow', $request->followed);
  547. });
  548. }
  549. }
  550. $query->with([
  551. 'yzMember' => function ($query) {
  552. return $query->select(['member_id', 'parent_id', 'is_agent', 'group_id', 'level_id', 'is_black', 'status', 'inviter'])
  553. ->with(['agent' => function ($query) {
  554. return $query->select(['uid', 'avatar', 'nickname']);
  555. }]);
  556. },
  557. 'hasOneFans' => function ($query) {
  558. return $query->select(['uid', 'follow as followed', 'openid']);
  559. },
  560. 'hasOneMiniApp' => function ($query6) {
  561. return $query6->select(['mini_app_id', 'member_id', 'openid'])->uniacid();
  562. },
  563. 'hasOneUnique' => function ($query7) {
  564. return $query7->select(['unique_id', 'member_id', 'unionid'])->uniacid();
  565. },
  566. ])
  567. ->orderBy('uid', 'desc');
  568. return $query;
  569. }
  570. public static function getQueueAllMembersInfo($uniacid, $limit = 0, $offset = 0)
  571. {
  572. $result = self::select(['mc_members.uid', 'mc_mapping_fans.openid', 'mc_members.uniacid'])
  573. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  574. ->join('mc_mapping_fans', 'mc_members.uid', '=', 'mc_mapping_fans.uid')
  575. ->whereDoesntHave('hasOneMemberUnique')
  576. ->where('mc_members.uniacid', $uniacid);
  577. if ($limit > 0) {
  578. $result = $result->offset($offset)->limit($limit)->orderBy('mc_members.uid', 'desc');
  579. }
  580. return $result;
  581. }
  582. public static function getAllMembersInfosByQueue($uniacid, $limit = 0, $offset = 0)
  583. {
  584. $result = self::select(['yz_member.member_id', 'yz_member.parent_id'])
  585. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id')
  586. ->where('mc_members.uniacid', $uniacid)
  587. ->whereNull('yz_member.deleted_at');
  588. if ($limit > 0) {
  589. $result = $result->offset($offset)->limit($limit)->orderBy('yz_member.member_id', 'asc');
  590. }
  591. return $result;
  592. }
  593. public function chkRelationByMemberIdAndParentId()
  594. {
  595. return self::select(['member_id', 'parent_id'])
  596. ->uniacid()
  597. ->join('yz_member', function ($join) {
  598. $join->on('member_id', '=', 'uid')
  599. ->on('member_id', '=', 'parent_id')
  600. ->whereNull('deleted_at');
  601. })
  602. ->distinct()
  603. ->get();
  604. }
  605. /**
  606. * 获取待处理的原始节点数据
  607. *
  608. * 必须实现
  609. *
  610. * return \Illuminate\Support\Collection
  611. */
  612. public function getTreeAllNodes($uniacid)
  613. {
  614. return self::select(['member_id', 'parent_id'])
  615. ->join('yz_member', function ($join) {
  616. $join->on('uid', '=', 'member_id')
  617. ->whereNull('deleted_at');
  618. })
  619. ->where('mc_members.uniacid', $uniacid)
  620. ->distinct()
  621. ->get();
  622. }
  623. public function chkRelationData()
  624. {
  625. $uniacid = \YunShop::app()->uniacid;
  626. $this->_allNodes = collect([]);
  627. $error = [];
  628. $m_relation = $this->chkRelationByMemberIdAndParentId();
  629. if (!is_null($m_relation)) {
  630. foreach ($m_relation as $m) {
  631. $error[] = $m->parent_id;
  632. }
  633. }
  634. if (!empty($error)) {
  635. dd($error);
  636. }
  637. $memberInfo = $this->getTreeAllNodes($uniacid);
  638. if ($memberInfo->isEmpty()) {
  639. \Log::debug('----is empty-----');
  640. return;
  641. }
  642. foreach ($memberInfo as $item) {
  643. $this->_allNodes->put($item->member_id, $item);
  644. }
  645. \Log::debug('--------queue synRun -----');
  646. foreach ($memberInfo as $key => $val) {
  647. $this->filter = [];
  648. \Log::debug('--------foreach start------', $val->member_id);
  649. $this->chkNodeParents($uniacid, $val->member_id);
  650. }
  651. if (file_exists(storage_path("logs/parenterror.log"))) {
  652. $error = file_get_contents(storage_path("logs/parenterror.log"));
  653. $error = array_unique(explode(',', $error));
  654. foreach ($error as $val) {
  655. if (!empty($val)) {
  656. echo $val;
  657. }
  658. }
  659. }
  660. }
  661. /**
  662. * 后台查看会员详情(不判断黑名单)
  663. * @param $id
  664. * @return mixed
  665. */
  666. public static function getMemberDetailBlackById($id)
  667. {
  668. return self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime', 'gender',
  669. 'birthyear', 'birthmonth', 'birthday', 'credit1', 'credit2'])
  670. ->uniacid()
  671. ->where('uid', $id)
  672. ->whereHas('yzMember', function ($query) {
  673. $query->whereNull('deleted_at');
  674. })
  675. ->with(['yzMember' => function ($query) {
  676. return $query->select(['member_id', 'parent_id', 'is_agent', 'group_id', 'level_id', 'is_black', 'alipayname', 'alipay', 'content',
  677. 'status', 'custom_value', 'validity', 'member_form', 'withdraw_mobile', 'wechat', 'invite_code',
  678. 'province_name', 'city_name', 'area_name', 'address'])
  679. ->with(['agent' => function ($query3) {
  680. return $query3->select(['uid', 'avatar', 'nickname']);
  681. }]);
  682. }, 'hasOneFans' => function ($query2) {
  683. return $query2->where('uniacid', \YunShop::app()->uniacid)->select(['uid', 'openid', 'follow AS followed']);
  684. }, 'hasOneOrder' => function ($query5) {
  685. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  686. ->uniacid()
  687. ->where('status', 3)
  688. ->groupBy('uid');
  689. }, 'hasOneMiniApp' => function ($query6) {
  690. return $query6->where('uniacid', \YunShop::app()->uniacid)->select(['member_id', 'openid']);
  691. }])
  692. ->first();
  693. }
  694. /**
  695. * 新版会员中心搜索
  696. * @param $parame
  697. * @param null $credit
  698. * @return mixed
  699. */
  700. public static function searchNewMembers($parame, $credit = null)
  701. {
  702. if (!isset($credit)) {
  703. $credit = 'credit2';
  704. }
  705. $result = self::select(['uid', 'avatar', 'nickname', 'realname', 'mobile', 'createtime',
  706. 'credit1', 'credit2', 'is_old', 'mark_member_id'])
  707. ->uniacid()->leftJoin('yz_member_del_log', 'mc_members.uid', '=', 'yz_member_del_log.member_id')
  708. ->join('yz_member', 'mc_members.uid', '=', 'yz_member.member_id');
  709. if (!empty($parame['search']['mid'])) {
  710. $result = $result->where('uid', $parame['search']['mid']);
  711. }
  712. if (!empty($parame['search']['times']['start']) && !empty($parame['search']['times']['end'])) {
  713. $range = [$parame['search']['times']['start'], $parame['search']['times']['end']];
  714. $result = $result->whereBetween('createtime', $range);
  715. }
  716. if (!empty($parame['search']['realname'])) {
  717. $result->where(function ($query) use ($parame) {
  718. switch ($parame['search']['name_type']) {
  719. case 1 :
  720. $query->where('realname', 'like', '%' . $parame['search']['realname'] . '%');
  721. break;
  722. case 2 :
  723. $query->where('mobile', 'like', '%' . $parame['search']['realname'] . '%');
  724. break;
  725. default :
  726. $query->searchLike($parame['search']['realname']);
  727. break;
  728. }
  729. });
  730. }
  731. if ($parame['search']['custom_value']) {
  732. $result->where('yz_member.custom_value', 'like', '%' . $parame['search']['custom_value'] . '%');
  733. }
  734. if (!empty($parame['search']['groupid'])) {
  735. $result->where('yz_member.group_id', $parame['search']['groupid']);
  736. }
  737. if (is_numeric($parame['search']['level'])) {
  738. $result->where('yz_member.level_id', $parame['search']['level']);
  739. }
  740. if ($parame['search']['isblack'] != '') {
  741. $result->where('yz_member.is_black', $parame['search']['isblack']);
  742. }
  743. if ($parame['search']['isagent'] != '') {
  744. $result->where('yz_member.is_agent', $parame['search']['isagent']);
  745. }
  746. if (isset($parame['search']['parent_id'])) {
  747. $result->where('yz_member.parent_id', (int)$parame['search']['parent_id']);
  748. }
  749. //余额区间搜索
  750. if ($parame['search']['min_credit2']) {
  751. $result = $result->where($credit, '>', $parame['search']['min_credit2']);
  752. }
  753. if ($parame['search']['max_credit2']) {
  754. $result = $result->where($credit, '<', $parame['search']['max_credit2']);
  755. }
  756. if ($parame['search']['followed'] != '') {
  757. $result = $result->whereHas('hasOneFans', function ($q2) use ($parame) {
  758. $q2->where('follow', $parame['search']['followed']);
  759. });
  760. }
  761. $result = $result->with(['yzMember' => function ($query) {
  762. return $query->select(['member_id', 'parent_id', 'inviter', 'is_agent', 'group_id', 'level_id', 'is_black', 'withdraw_mobile', 'is_old'])
  763. ->with(['group' => function ($query1) {
  764. return $query1->select(['id', 'group_name'])->uniacid();
  765. }, 'level' => function ($query2) {
  766. return $query2->select(['id', 'level_name'])->uniacid();
  767. }, 'agent' => function ($query3) {
  768. return $query3->select(['uid', 'avatar', 'nickname', 'mobile'])->uniacid();
  769. }]);
  770. },
  771. 'hasOneFans' => function ($query4) {
  772. return $query4->select(['uid', 'follow as followed', 'openid'])->uniacid();
  773. },
  774. 'hasOneOrder' => function ($query5) {
  775. return $query5->selectRaw('uid, count(uid) as total, sum(price) as sum')
  776. ->uniacid()
  777. ->where('status', Order::COMPLETE)
  778. ->groupBy('uid');
  779. },
  780. 'hasOneMiniApp' => function ($query6) {
  781. return $query6->select(['mini_app_id', 'member_id', 'openid'])->uniacid();
  782. },
  783. 'hasOneUnique' => function ($query7) {
  784. return $query7->select(['unique_id', 'member_id', 'unionid'])->uniacid();
  785. },
  786. 'hasOneWechat' => function ($query8) {
  787. return $query8->select(['wechat_id', 'member_id'])->uniacid();
  788. },
  789. 'hasOneDouyin' => function ($query9) {
  790. return $query9->select(['douyin_id', 'member_id'])->uniacid();
  791. },
  792. 'yzMember.agent',
  793. ]);
  794. if (app('plugins')->isEnabled('aggregation-cps')) {
  795. $result->with([
  796. 'hasOneAggregationCpsMember' => function ($query) {
  797. return $query->select(['id', 'member_id'])->uniacid();
  798. }
  799. ]);
  800. }
  801. //判断支付宝插件
  802. if (file_exists(base_path('plugins/alipay-onekey-login'))) {
  803. $result->with('hasOneAlipay');
  804. }
  805. //判断会员标签插件
  806. $set = array_pluck(Setting::getAllByGroup('member-tags')->toArray(), 'value', 'key');
  807. if (app('plugins')->isEnabled('member-tags') && $set['is_open']) {
  808. if ($parame['tag_id']) {
  809. $result->whereHas('hasManyTag', function ($query) use ($parame) {
  810. $query->where('tag_id', $parame['tag_id']);
  811. });
  812. }
  813. if ($parame['search']['label_id']) {
  814. $result->whereHas('hasManyTag', function ($query) use ($parame) {
  815. $query->where('tag_id', $parame['search']['label_id']);
  816. });
  817. }
  818. $result->with(['hasManyTag' => function ($query) {
  819. $query->with('tag');
  820. }]);
  821. }
  822. if (app('plugins')->isEnabled('wechat-customers') && app('plugins')->isEnabled('work-wechat-platform')) {
  823. $result->with('hasOneCustomers');
  824. }
  825. $result->whereNull('yz_member_del_log.member_id')
  826. ->whereNull('yz_member.deleted_at')
  827. ->orderBy('yz_member.member_id', 'desc');
  828. return $result;
  829. }
  830. }