CircleController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Jobs\Circle\UpdateCircleCountJob;
  4. use App\Models\Posts\WxComment;
  5. use App\Models\Posts\WxPost;
  6. use App\Models\User\WxUserFollow;
  7. use App\Models\User\WxUserOnline;
  8. use App\Models\WxPlate;
  9. use App\Models\User\WxUserVisit;
  10. use App\Models\WxTenant;
  11. use App\Wen\Utils\CircleUtils;
  12. use App\Wen\Utils\Settings;
  13. use App\Wen\Utils\UserUtils;
  14. use App\Wen\Utils\Utils;
  15. use App\Http\Controllers\Api\Repositories\WxCircleRepositores;
  16. use App\Models\Circle\WxCircle;
  17. use Carbon\Carbon;
  18. use Illuminate\Http\Request;
  19. use App\Models\Posts\WxUserCircle;
  20. use App\Models\User\WxUser;
  21. use Illuminate\Support\Facades\DB;
  22. class CircleController extends BaseController
  23. {
  24. /**
  25. * 推荐
  26. * @return \Illuminate\Http\JsonResponse
  27. */
  28. public function recommendCircle()
  29. {
  30. return $this->success(WxCircleRepositores::recommendCircle());
  31. }
  32. /**
  33. * 热门
  34. * @return \Illuminate\Http\JsonResponse
  35. */
  36. public function hotCircle()
  37. {
  38. return $this->success(WxCircleRepositores::hotCircle());
  39. }
  40. /**
  41. * 最新
  42. * @return \Illuminate\Http\JsonResponse
  43. */
  44. public function newCircle()
  45. {
  46. return $this->success(WxCircleRepositores::newCircle());
  47. }
  48. public function listAll()
  49. {
  50. return $this->success(WxCircleRepositores::listAll());
  51. }
  52. /**
  53. * 获取全部
  54. * @param Request $request
  55. * @return \Illuminate\Http\JsonResponse
  56. */
  57. public function list(Request $request)
  58. {
  59. $page = $request->page;
  60. return $this->success(WxCircleRepositores::list($page));
  61. }
  62. /**
  63. * 获取圈子组合列表
  64. * @param Request $request
  65. * @return \Illuminate\Http\JsonResponse
  66. */
  67. public function circleAndPosts(Request $request)
  68. {
  69. $limit = $request->input('limit', 10);
  70. return $this->success(WxCircleRepositores::circleAndPost($limit));
  71. }
  72. /**
  73. * 用户关注圈子
  74. * @param Request $request
  75. * @return \Illuminate\Http\JsonResponse
  76. */
  77. public function followCircle(Request $request)
  78. {
  79. $uid = $request->uid;
  80. _limit_user('follow:circle', $uid, 20);
  81. $circle_id = $request->circle_id;
  82. $payment_duration = null;
  83. $circle = WxCircle::find($circle_id);
  84. if(_empty_($circle)){
  85. return $this->fail(200003);
  86. }
  87. $can_i_visit = CircleUtils::can_i_visit($circle, $uid);
  88. if($can_i_visit == 2){
  89. if($circle->is_follow_pay == 1){
  90. if($circle->follow_pay_credit == 1){
  91. // 余额支付
  92. return (new OrderController())->balance_pay($request);
  93. }else{
  94. // 金币支付
  95. DB::beginTransaction();
  96. try {
  97. // todo:
  98. // 金币直接结清
  99. $platform_division = _between_(Settings::get('app_circle_follow_pay_division', 0), 0, 100);
  100. $platform_reward = round($platform_division * $circle->follow_pay_num / 100, 2);
  101. $circle_user_reward = round($circle->follow_pay_num - $platform_reward, 2);
  102. $pay_res2 = UserUtils::update_user_coins($uid, 20, -$circle->follow_pay_num, '付费加入了「'.$circle->circle_name.'」'.env('circle_call', '圈子').',-'.$circle->follow_pay_num.Settings::get('app_coin_name', '硬币'));
  103. if($pay_res2){
  104. $r = WxCircleRepositores::userFollowCircle($uid, $circle->id, Carbon::now()->addDays((int)$circle->follow_pay_duration)->toDateTimeString());
  105. if($r){
  106. if($circle_user_reward >= 0.01){
  107. $pay_res_ = UserUtils::update_user_coins($circle->user_id, 21, $circle_user_reward, '有新的用户(id: '.$uid.')加入您的付费'.env('circle_call', '圈子').',扣掉平台分成'.$platform_division.'%,您'.Settings::get('app_coin_name', '硬币').'+'.$circle_user_reward.'。');
  108. }
  109. }else{
  110. DB::rollBack();
  111. return $this->fail(200011, [], Settings::get('app_coin_name', '硬币').'不足');
  112. }
  113. }else{
  114. DB::rollBack();
  115. return $this->fail(200011, [], Settings::get('app_coin_name', '硬币').'不足');
  116. }
  117. DB::commit();
  118. return $this->success(WxCircleRepositores::userFollowCircle($uid, $circle_id));
  119. } catch (\Exception $e) {
  120. DB::rollBack();
  121. _logger_(__file__, __line__, $e->getMessage());
  122. return $this->fail(200011);
  123. }
  124. }
  125. }else{
  126. _logger_(__file__, __line__, '逻辑出现问题,为什么会走到这里?');
  127. }
  128. }else{
  129. return $this->success(WxCircleRepositores::userFollowCircle($uid, $circle_id));
  130. }
  131. }
  132. /**
  133. * 用户关注圈子文章组合列表
  134. * @param Request $request
  135. * @return \Illuminate\Http\JsonResponse
  136. */
  137. public function userFollowCircleList(Request $request)
  138. {
  139. $uid = $request->uid;
  140. $limit = $request->input('limit', 10);
  141. return $this->success(WxCircleRepositores::userFollowCircleList($uid, $limit));
  142. }
  143. /**
  144. * 获取圈子详细
  145. * @param Request $request
  146. * @return \Illuminate\Http\JsonResponse
  147. */
  148. public function getCircleInfoById(Request $request)
  149. {
  150. $circle_id = $request->circle_id;
  151. $uid = $request->uid;
  152. $is_tenant = _empty_default_($request->isTenant, false);
  153. if(_empty_($is_tenant)){
  154. $is_tenant = false;
  155. }else{
  156. $is_tenant = true;
  157. }
  158. if(_empty_($circle_id)){
  159. return $this->fail(200001);
  160. }
  161. $data = WxCircleRepositores::CircleInfo($circle_id);
  162. if(_empty_($data)){
  163. return $this->fail(200003);
  164. }
  165. $data->is_follow_circle = WxCircleRepositores::isFollowCircle($uid, $circle_id);
  166. $data->plate = WxPlate::where('id', $data->plate_id)->first(['id', 'plate_name', 'plate_introduce']);
  167. if($uid > 0){
  168. update_user_visit($uid, 2, $circle_id);
  169. }
  170. $data->circle_tags = CircleUtils::circle_tags($data->id);
  171. $data->circle_notice = CircleUtils::sticky_notice_list($data->id);
  172. $data->circle_sqare = CircleUtils::circle_square_list($data);
  173. $data->pay_content_count = WxPost::where('circle_id', $circle_id)->where('pay_content_id', '>', 0)->where('is_examine', 1)
  174. ->where('posts_state', 0)->count();
  175. if($data->pay_content_count != $data->count_pay_content){
  176. UpdateCircleCountJob::dispatch($circle_id);
  177. }
  178. $data->comment_count = WxComment::where('posts_circle_id', $circle_id)->where('comment_state', 1)->count();
  179. if($data->comment_count != $data->count_comment){
  180. UpdateCircleCountJob::dispatch($circle_id);
  181. }
  182. $data->can_i_visit = CircleUtils::can_i_visit($data, $uid);
  183. if($data->can_i_visit == 2){
  184. if($data->follow_pay_num > 0 && $data->follow_pay_duration != 0){
  185. $data->follow_pay_day_tip = '低至 '.round($data->follow_pay_num / $data->follow_pay_duration, 2).($data->follow_pay_credit == 1 ? '余额' : Settings::get('app_coin_name', '硬币')).'/天';
  186. }
  187. }else if($data->can_i_visit == 1){
  188. $data->follow_payment_duration = WxUserCircle::where('user_id', $uid)->where('circle_id', $data->id)->value('payment_duration');
  189. }
  190. if($data->tenant_show != -1){
  191. $data->tenant_show_obj = WxTenant::find($data->tenant_show);
  192. }
  193. $data->format_time = format_datetime($data->created_at); // 发帖时间
  194. if($uid > 0){
  195. $data->continuous_to_circle = _empty_default_(get_user_meta($uid, 'continuous_to_circle:'.$data->id, 'j'), [
  196. 'days' => 1,
  197. 'updated_at' => ''
  198. ]);
  199. }else{
  200. $data->continuous_to_circle = null;
  201. }
  202. return $this->success($data);
  203. }
  204. public function getCircleUserList(Request $request)
  205. {
  206. $uid = $request->uid;
  207. $circle_id = $request->circle_id;
  208. if(_empty_($circle_id)){
  209. return $this->fail(200001);
  210. }
  211. $circle_user_id = WxCircle::where('id', $circle_id)->value('user_id');
  212. if(_empty_($circle_user_id)){
  213. $circle_user_id = 0;
  214. }
  215. $circleUserList = WxUserCircle::where([['circle_id','=', $circle_id],['user_id', '<>', $circle_user_id]])->orderBy('id', 'desc')->limit(9)->get();
  216. $user_id_arr = [];
  217. if($circle_user_id){
  218. $user_id_arr[] = $circle_user_id;
  219. }
  220. foreach ($circleUserList as $k => $v) {
  221. $user_id_arr[] = $v['user_id'];
  222. }
  223. $data = WxUser::whereIn('id', $user_id_arr)->orderBy(DB::raw('FIND_IN_SET(id, "' . implode(",", $user_id_arr) . '"' . ")"))
  224. ->get(['user_avatar', 'user_name', 'id', 'user_introduce']);
  225. if($data){
  226. $data->map(function ($v) use ($uid){
  227. $online_item = WxUserOnline::where('user_id', $v->id)->first(['online', 'device']);
  228. if($online_item){
  229. $v->online_time = format_datetime($online_item->online);
  230. $v->device = $online_item->device;
  231. }else{
  232. $v->online_time = '暂时未知';
  233. $v->device = '';
  234. }
  235. $v->is_follow_user = (new WxUserFollow())->isFollowUser($uid, $v->id);
  236. return $v;
  237. });
  238. }
  239. return $this->success($data);
  240. }
  241. public function poster(Request $request){
  242. $circleId = $request->id;
  243. $uid = $request->uid;
  244. if(_empty_($circleId)){
  245. return $this->fail(200001);
  246. }
  247. $circle = WxCircle::find($circleId);
  248. if(_empty_($circle)){
  249. return $this->fail(200003);
  250. }
  251. $mini_code = Utils::getMiniCode('pages/circle/list', 'id='.$circle->id, $uid);
  252. $h5 = Settings::get('app_h5_home', '');
  253. $url = env('APP_URL').'/circle/' . $circle->id;
  254. if(!_empty_($h5)){
  255. $url = $h5 . '#/pages/circle/list?id='.$circle->id;
  256. }
  257. if($mini_code){
  258. $data = [
  259. 'url' => $url,
  260. 'name' => $circle->circle_name,
  261. 'desc' => $circle->circle_introduce,
  262. 'avatar' => $circle->head_portrait,
  263. 'bg' => $circle->background_maps,
  264. 'code' => $mini_code
  265. ];
  266. return $this->success($data);
  267. }else{
  268. return $this->fail(300001);
  269. }
  270. }
  271. public function nearlyAndfollow(Request $request){
  272. $uid = $request->uid;
  273. $result = [
  274. 'nearly' => [],
  275. 'follow' => []
  276. ];
  277. global $__MINI_GLOBAL_TENANT_ID__;
  278. if($uid > 0){
  279. $object_ids = WxUserVisit::where([['user_id','=', $uid],['type', '=', 2]])->orderBy('updated_at', 'desc')->limit(20)->pluck('object_id');
  280. if($object_ids){
  281. $query = WxCircle::whereIn('id', $object_ids)->orderBy(DB::raw('FIND_IN_SET(id, "' . implode(",", $object_ids->toArray()) . '"' . ")"));
  282. $query = $query->where('tenant_id', $__MINI_GLOBAL_TENANT_ID__);
  283. $nearly_circles = $query->get(['id','circle_name', 'head_portrait'])->map(function ($v){
  284. $v->name = $v->circle_name;
  285. $v->img = $v->head_portrait;
  286. $v->type = 2;
  287. $v->target = $v->id;
  288. return $v;
  289. });
  290. $result['nearly'] = $nearly_circles;
  291. }
  292. $follow_ids = WxUserCircle::where([['user_id', '=', $uid], ['user_circle_state', '=', 0]])->orderBy('updated_at', 'desc')->pluck('circle_id');
  293. if($follow_ids){
  294. $follow_query = WxCircle::whereIn('id', $follow_ids);
  295. $follow_query = $follow_query->where('tenant_id', $__MINI_GLOBAL_TENANT_ID__);
  296. $follow_circle = $follow_query->orderBy(DB::raw('FIND_IN_SET(id, "' . implode(",", $follow_ids->toArray()) . '"' . ")"))->get()->map(function ($v) use ($uid){
  297. $v->is_dot = !UserUtils::is_user_readed_circle($uid, $v->id);
  298. return $v;
  299. });
  300. if($follow_circle){
  301. $follow_circle->append(['circle_user', 'circle_follow_count', 'circle_posts_count']);
  302. }
  303. $result['follow'] = $follow_circle;
  304. }
  305. }
  306. return $this->success($result);
  307. }
  308. }