WxUserRepositores.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <?php
  2. namespace App\Http\Controllers\Api\Repositories;
  3. use App\Models\User\WxUser;
  4. use App\Wen\Utils\FieldUtils;
  5. use App\Wen\Utils\GatewayUtils;
  6. use App\Wen\Utils\Settings;
  7. use App\Models\WxSyncRelation;
  8. use App\Models\User\WxUser as Model;
  9. use App\Models\User\WxUserFollow;
  10. use App\Models\User\WxUserTemp;
  11. use App\Wen\Utils\UserUtils;
  12. use Illuminate\Support\Facades\Cache;
  13. class WxUserRepositores
  14. {
  15. /**
  16. * Model.
  17. *
  18. * @var string
  19. */
  20. protected $eloquentClass = Model::class;
  21. /**
  22. * @return mixed
  23. */
  24. public function info($uid)
  25. {
  26. return (new $this->eloquentClass())->where('id', $uid)->where('user_state', '<>', 1)->first(FieldUtils::userInfoColums());
  27. }
  28. private static function _update_openid($user, $open_id, $mp_openid, $web_openid, $app_openid, $shop_openid, $union_id = null){
  29. if($open_id || $mp_openid || $web_openid || $app_openid || $shop_openid){
  30. $updates = [];
  31. if($open_id){
  32. $updates['weixin_openid'] = $open_id;
  33. }
  34. if($mp_openid){
  35. $updates['weixin_mp_openid'] = $mp_openid;
  36. }
  37. if($web_openid){
  38. $updates['weixin_web_openid'] = $web_openid;
  39. }
  40. if($app_openid){
  41. $updates['weixin_app_openid'] = $app_openid;
  42. }
  43. if($shop_openid){
  44. $updates['weixin_shop_openid'] = $shop_openid;
  45. }
  46. if($union_id){
  47. $updates['weixin_unionid'] = $union_id;
  48. }
  49. WxUser::where('id', $user['id'])->update($updates);
  50. }
  51. }
  52. /** collectUserData()
  53. * @param $data [ mp_openId,web_openId,app_openId,unionId,nickName,user_background_maps,avatarUrl,gender,id=>external_id,date ]
  54. * @return bool
  55. */
  56. public static function registerUser($data)
  57. {
  58. $uid = WxSyncRelationRepositories::wx_uid($data['domain'], $data['external_id']);
  59. if($uid){
  60. return $uid;
  61. }
  62. $mp_openId = $data['mp_openId'];
  63. if(_empty_($mp_openId)){
  64. $mp_openId = null;
  65. }
  66. $web_openId = $data['web_openId'] ?: null;
  67. if(_empty_($web_openId)){
  68. $web_openId = null;
  69. }
  70. $app_openId = $data['app_openId'] ?: null;
  71. if(_empty_($app_openId)){
  72. $app_openId = null;
  73. }
  74. $unionId = $data['unionId'] ?: null;
  75. if(_empty_($unionId)){
  76. $unionId = null;
  77. }
  78. if($unionId){
  79. // 判断是否已经注册过
  80. $uid_user = WxUser::where('weixin_unionid',$unionId)->first();
  81. if($uid_user){
  82. self::_update_openid($uid_user, null, $mp_openId, $web_openId, $app_openId, null);
  83. return $uid_user->id;
  84. }
  85. }else{
  86. // 判断是否已经注册过
  87. if($mp_openId || $web_openId || $app_openId){
  88. if($mp_openId){
  89. $openid_user = WxUser::where('weixin_mp_openid',$mp_openId)->first();
  90. if($openid_user){
  91. self::_update_openid($openid_user, null, null, $web_openId, $app_openId, null, $unionId);
  92. return $openid_user->id;
  93. }
  94. }else if($web_openId){
  95. $openid_user = WxUser::where('weixin_web_openid',$web_openId)->first();
  96. if($openid_user){
  97. self::_update_openid($openid_user, null, $mp_openId, null, $app_openId, null, $unionId);
  98. return $openid_user->id;
  99. }
  100. }else if($app_openId){
  101. $openid_user = WxUser::where('weixin_app_openid',$app_openId)->first();
  102. if($openid_user){
  103. self::_update_openid($openid_user, null, $mp_openId, $web_openId, null, null, $unionId);
  104. return $openid_user->id;
  105. }
  106. }
  107. }
  108. }
  109. while (Model::where('user_name',$data['nickName'])->exists()){
  110. $data['nickName'] .= '_'.mt_rand(1, 100);
  111. }
  112. // $maxId = WxUser::max('id');
  113. $user = new Model();
  114. $user->weixin_openid = null;
  115. $user->weixin_app_openid=$app_openId;
  116. $user->weixin_mp_openid=$mp_openId;
  117. $user->weixin_web_openid=$web_openId;
  118. $user->weixin_shop_openid=null;
  119. $user->weixin_unionid=$unionId;
  120. $user->user_name=$data['nickName'];
  121. $user->weixin_name=$data['nickName'];
  122. $user->user_background_maps = _array_key($data, 'user_background_maps', Settings::get('user_background_maps'));
  123. $user->user_avatar= _array_key($data, 'avatarUrl', Settings::get('img_default'));
  124. $user->country=$data['country'] ?? '';
  125. $user->province=$data['province'] ?? '';
  126. $user->city=$data['city'] ?? '';
  127. // [0 => '未知',1 => '男',2 => '女']
  128. $user->gender=$data['gender'] ?? 0;
  129. if($data['date']){
  130. $user->updated_at = strtotime($data['date']);
  131. $user->created_at = strtotime($data['date']);
  132. }
  133. $user->save();
  134. $uid = $user->id;
  135. if($data['external_id'] && $data['domain']){
  136. $sync = new WxSyncRelation();
  137. $sync->domain = $data['domain'];
  138. $sync->type = 'user';
  139. $sync->inner_id = $uid;
  140. $sync->external_id = $data['external_id'];
  141. $sync->status = 1;
  142. $sync->save();
  143. }
  144. return $user->id;
  145. }
  146. /**
  147. * 更新
  148. * @param $uid
  149. * @param $data
  150. * @return mixed
  151. */
  152. public static function update($uid, $data, $need_manual_review)
  153. {
  154. $data['user_name'] = str_replace([' 🤖', '🤖',' 💙🤖', ' 💗🤖', '💙🤖', '💗🤖'], '', trim(_array_key($data, 'user_name', '')));
  155. while ( WxUser::where([['user_name','=',$data['user_name']], ['id', '<>', $uid] ])->exists() ){
  156. $data['user_name'] .= '_'.mt_rand(1, 100);
  157. }
  158. // 先更新标签
  159. if(_array_key($data, 'user_labels', [])){
  160. if(_array_key($data, 'user_labels', []) == -1){
  161. update_user_meta($uid, 'user_labels', null, 'j');
  162. }else{
  163. update_user_meta($uid, 'user_labels', _array_key($data, 'user_labels', []), 'j');
  164. }
  165. }
  166. // 判断是否需要审核用户的资料
  167. if (!$need_manual_review) {
  168. $update_arr = [];
  169. if(!_empty_(_array_key($data, 'user_avatar', ''))){
  170. $update_arr['user_avatar'] = _array_key($data, 'user_avatar', '');
  171. }
  172. if(!_empty_(_array_key($data, 'user_name', ''))){
  173. $update_arr['user_name'] = _array_key($data, 'user_name', '');
  174. }
  175. if(!_empty_(_array_key($data, 'user_introduce', ''))){
  176. $update_arr['user_introduce'] = _array_key($data, 'user_introduce', '');
  177. }
  178. if(!_empty_(_array_key($data, 'user_birthday', ''))){
  179. $update_arr['user_birthday'] = _array_key($data, 'user_birthday', '');
  180. }
  181. if(!_empty_(_array_key($data, 'user_background_maps', ''))){
  182. $update_arr['user_background_maps'] = _array_key($data, 'user_background_maps', '');
  183. }
  184. if(!_empty_(_array_key($data, 'wechat_account', ''))){
  185. $update_arr['wechat_account'] = _array_key($data, 'wechat_account', '');
  186. }
  187. if(!_empty_(_array_key($data, 'gender', 0), true)){
  188. $update_arr['gender'] = _array_key($data, 'gender', 0);
  189. }
  190. if(isset($data['is_online_status'])) {
  191. $update_arr['is_online_status'] = $data['is_online_status'];
  192. }
  193. $r = WxUser::where('id', $uid)->update($update_arr);
  194. if($update_arr){
  195. if($r && !$need_manual_review){
  196. UserUtils::assistant_notice($uid, '您提交的资料审核通过,已经为您更新。');
  197. GatewayUtils::success(GatewayUtils::uid2client_id($uid), 12);
  198. }
  199. return $r;
  200. }
  201. return false;
  202. } else {
  203. if(!_empty_(_array_key($data, 'wechat_account', ''))){
  204. WxUser::where('id', $uid)->update(['wechat_account'=>_array_key($data, 'wechat_account', '')]);
  205. }
  206. if(WxUserTemp::where([['user_id', '=', $uid], ['user_state', '=', 0]])->exists()){
  207. $update_arr = [];
  208. if(!_empty_(_array_key($data, 'user_avatar', ''))){
  209. $update_arr['user_avatar'] = _array_key($data, 'user_avatar', '');
  210. }
  211. if(!_empty_(_array_key($data, 'user_name', ''))){
  212. $update_arr['user_name'] = _array_key($data, 'user_name', '');
  213. }
  214. if(!_empty_(_array_key($data, 'user_introduce', ''))){
  215. $update_arr['user_introduce'] = _array_key($data, 'user_introduce', '');
  216. }
  217. if(!_empty_(_array_key($data, 'user_birthday', ''))){
  218. $update_arr['user_birthday'] = _array_key($data, 'user_birthday', '');
  219. }
  220. if(!_empty_(_array_key($data, 'user_background_maps', ''))){
  221. $update_arr['user_background_maps'] = _array_key($data, 'user_background_maps', '');
  222. }
  223. if(!_empty_(_array_key($data, 'gender', 0), true)){
  224. $update_arr['gender'] = _array_key($data, 'gender', 0);
  225. }
  226. if($update_arr){
  227. $r = WxUserTemp::where('user_id', $uid)->update($update_arr);
  228. return $r;
  229. }
  230. return false;
  231. }else{
  232. // 先驳回之前的资料申请
  233. if(WxUserTemp::where( [ ['user_id','=', $uid], ['user_state', '=', 0] ] )->exists()){
  234. WxUserTemp::where( [ ['user_id','=', $uid], ['user_state', '=', 0] ] )->update(['user_state'=>2]);
  235. }
  236. $UserTempModel = new WxUserTemp();
  237. $UserTempModel->user_id = $uid;
  238. $UserTempModel->user_avatar = _array_key($data, 'user_avatar', '');
  239. $UserTempModel->user_name = _array_key($data, 'user_name', '');
  240. $UserTempModel->user_introduce = _array_key($data, 'user_introduce', '');
  241. $UserTempModel->user_birthday = _array_key($data, 'user_birthday', '');
  242. $UserTempModel->user_background_maps = _array_key($data, 'user_background_maps', '');
  243. $UserTempModel->gender = _array_key($data, 'gender', 0);
  244. return $UserTempModel->save();
  245. }
  246. }
  247. }
  248. /**
  249. * @param $keyword
  250. * @param int $uid
  251. * @param int $limit
  252. */
  253. public static function searchUser($keyword, $uid = 0, $limit = 10, $is_record = true, $is_tenant = false)
  254. {
  255. if($is_record){
  256. WxSearchRepositores::record($uid, $keyword);
  257. }
  258. global $__MINI_GLOBAL_TENANT_ID__;
  259. $query = (new Model())->where(function ($q) use ($keyword) {
  260. // $keyword = base64_encode($keyword);
  261. $q->where('user_name', 'like', '%' . $keyword . '%')->orWhere('id', $keyword);
  262. });
  263. if($is_tenant){
  264. $query = $query->where('tenant_id', $__MINI_GLOBAL_TENANT_ID__);
  265. }
  266. $data = $query->simplePaginate($limit, FieldUtils::userInfoColums());
  267. $data->map(function ($v) use ($uid) {
  268. $v->is_follow_user = (new WxUserFollow())->isFollowUser($uid, $v->id);
  269. });
  270. return $data;
  271. }
  272. /**
  273. * 订单状态
  274. * @param $type
  275. */
  276. public static function orderType($type)
  277. {
  278. $data = [];
  279. switch ($type) {
  280. case 1:
  281. $data['title'] = '会员订单';
  282. $data['details'] = '开通'.Settings::get('app_title').'大会员';
  283. break;
  284. case 2:
  285. $data['title'] = '充电订单';
  286. $data['details'] = '充电了一篇你感兴趣的笔记';
  287. break;
  288. case 3:
  289. $data['title'] = '充值订单';
  290. $data['details'] = '您进行了余额充值';
  291. break;
  292. case 4:
  293. $data['title'] = '购买付费贴';
  294. $data['details'] = '';
  295. break;
  296. case 6:
  297. $data['title'] = '笔记推广';
  298. $data['details'] = '';
  299. break;
  300. case 7:
  301. $data['title'] = '加入付费圈子';
  302. $data['details'] = '';
  303. break;
  304. case 8:
  305. $data['title'] = '保证金充值';
  306. $data['details'] = '';
  307. break;
  308. case 9:
  309. $data['title'] = '购买迷你模块';
  310. $data['details'] = '';
  311. break;
  312. case 10:
  313. $data['title'] = '解除账号限制';
  314. $data['details'] = '';
  315. break;
  316. case 11:
  317. $data['title'] = '付费获取Ta人联系方式';
  318. $data['details'] = '';
  319. break;
  320. }
  321. return $data;
  322. }
  323. /**
  324. * 提现记录状态
  325. * @param $type
  326. */
  327. public static function withdrawalType($type)
  328. {
  329. $title = '';
  330. switch ($type) {
  331. case 0:
  332. $title = '受理中';
  333. break;
  334. case 1:
  335. $title = '已到账';
  336. break;
  337. case 2:
  338. $title = '提现异常,请联系客服处理';
  339. break;
  340. case 3:
  341. $title = '微信打款中';
  342. break;
  343. case 4:
  344. $title = '支付宝打款中';
  345. break;
  346. }
  347. return $title;
  348. }
  349. /**
  350. * [ openId,unionId,nickName,avatarUrl,gender,date ]
  351. * @param $uid
  352. * @return array
  353. */
  354. public static function userData($uid)
  355. {
  356. $user = WxUser::where('id', $uid)->first();
  357. if(_empty_($user)){
  358. return [];
  359. }
  360. // $name, $open_id, $avater, $gender, $date
  361. // [0 => '未知',1 => '男',2 => '女']
  362. return ['nickName'=>$user->user_name, 'mp_openId'=>$user->weixin_mp_openid,'app_openId'=>$user->weixin_app_openid,'web_openId'=>$user->weixin_web_openid,
  363. 'unionId'=>$user->weixin_unionid ?: '', 'avatarUrl'=>$user->user_avatar, 'gender'=>$user->gender, 'date'=>$user->created_at->toDateTimeString()];
  364. }
  365. public static function isOfficial($uid){
  366. return WxUser::where('id', $uid)->value('is_official');
  367. }
  368. /**
  369. * 开通会员
  370. * @param $uid
  371. */
  372. public static function vip($uid, $days = 1)
  373. {
  374. $is_renew = false;
  375. $member_time = _get_origin_attribute('wx_user', [['id', '=', $uid]], 'is_member');
  376. if($member_time){
  377. $member_time = (int)$member_time;
  378. if($member_time <= time()){
  379. // 过期了
  380. $member_time = time();
  381. }else{
  382. $is_renew = true;
  383. }
  384. }else{
  385. $member_time = time();
  386. }
  387. // 增加天数
  388. $member_time += 3600 * 24 * $days;
  389. WxUser::where('id', $uid)->update(['is_member' => (string)$member_time ]);
  390. if($is_renew){
  391. UserUtils::add_user_notice(4002, $uid, '续费会员', '您已成功续费'.$days.'天会员服务', 100);
  392. }else{
  393. UserUtils::add_user_notice(4003, $uid, '开通会员', '您已成功开通'.$days.'天会员服务', 100);
  394. }
  395. Cache::forget('get:cached:user:'.$uid);
  396. }
  397. }