update([
'circle_name' => $data['circle_name'],
'circle_introduce' => $data['circle_introduce'],
'head_portrait' => $data['head_portrait'],
'background_maps' => $data['background_maps'],
'plate_id' => $data['plate_id'],
'circle_state' => $circle_state
]);
return $data['id'];
} else {
global $__MINI_GLOBAL_CURRENT_USER_ID__;
if(_empty_($data['uid'])){
$data['uid'] = $__MINI_GLOBAL_CURRENT_USER_ID__;
}
$model->circle_name = $data['circle_name'];
$model->circle_introduce = $data['circle_introduce'];
$model->head_portrait = $data['head_portrait'];
$model->background_maps = $data['background_maps'];
$model->plate_id = $data['plate_id'];
$model->user_id = $data['uid'];
$model->circle_state = $circle_state;
if($__MINI_GLOBAL_TENANT_ID__ > 0){
$model->tenant_id = $__MINI_GLOBAL_TENANT_ID__;
$model->tenant_show = $__MINI_GLOBAL_TENANT_ID__;
}
$r = $model->save();
// (0审核中,1正常,2驳回)
if($r){
if($circle_state == 1){
UserUtils::add_user_notice(5001, $data['uid'], env('circle_call', '圈子').'审核通知', '您的创建的'.env('circle_call', '圈子').'已经审核通过啦', 100);
}else{
UserUtils::assistant_notice('admin', '有新的'.env('circle_call', '圈子').'创建申请待审核');
}
}
return $model->id;
}
}
/**
* -1:最火;0:最新
* @param $plateId
* @return mixed
*/
public static function circleByPlateId($plateId, $uid = 0)
{
global $__MINI_GLOBAL_TENANT_ID__;
$data = null;
if ($plateId == 0) {
$query = (new Model())->where('circle_state', 1);
// $query->where('tenant_id', $__MINI_GLOBAL_TENANT_ID__);
$query = $query->where(function ($query) {
global $__MINI_GLOBAL_TENANT_ID__;
$query->where('tenant_show', -1)
->orWhere('tenant_show', $__MINI_GLOBAL_TENANT_ID__);
});
$data = $query->withCount('wxPosts as posts_count')
->orderBy('created_at', 'DESC')
->limit(20)
->get();
} elseif ($plateId == -1) {
$query = (new Model())->where('circle_state', 1);
$query = $query->where(function ($query) {
global $__MINI_GLOBAL_TENANT_ID__;
$query->where('tenant_show', -1)
->orWhere('tenant_show', $__MINI_GLOBAL_TENANT_ID__);
});
// $query->where('tenant_id', $__MINI_GLOBAL_TENANT_ID__);
$data = $query->withCount('wxPosts as posts_count')
->orderBy('sort', 'desc')
->limit(20)
->get();
} elseif ($plateId == -2) {
// 常用
$object_ids = WxUserVisit::where([['user_id','=', $uid],['type', '=', 2]])->orderBy('updated_at', 'desc')->limit(100)->pluck('object_id');
if($object_ids) {
$query = (new Model())->whereIn('id', $object_ids);
$query = $query->where(function ($query) {
global $__MINI_GLOBAL_TENANT_ID__;
$query->where('tenant_show', -1)
->orWhere('tenant_show', $__MINI_GLOBAL_TENANT_ID__);
});
$query = $query->orderBy(DB::raw('FIND_IN_SET(id, "' . implode(",", $object_ids->toArray()) . '"' . ")"));
$data = $query->withCount('wxPosts as posts_count')
->orderBy('sort', 'desc')
->limit(20)
->get();
}else{
$data = [];
}
}else{
$query = (new Model())
->where('plate_id', $plateId)
->where('circle_state', 1);
$query = $query->where(function ($query) {
global $__MINI_GLOBAL_TENANT_ID__;
$query->where('tenant_show', -1)
->orWhere('tenant_show', $__MINI_GLOBAL_TENANT_ID__);
});
$data = $query->withCount('wxPosts as posts_count')
->orderBy('sort', 'desc')
->get();
}
if($data){
$data->map(function ($v) use ($uid){
$v->is_follow_circle = self::isFollowCircle($uid, $v->id);
$v->can_i_visit = CircleUtils::can_i_visit($v, $uid);
$v->user_circle_count = CircleUtils::circleFollowCount($v->id);
return $v;
});
return $data;
}
return null;
}
/**
* 搜索
* @param $keyword
* @return mixed
*/
public static function searchCircle($keyword, $uid = 0, $limit = 10, $is_tenant = false)
{
global $__MINI_GLOBAL_TENANT_ID__;
$query = (new Model())
->where('circle_state', 1);
if($is_tenant){
$query = $query->where(function ($query) {
global $__MINI_GLOBAL_TENANT_ID__;
$query->where('tenant_show', -1)
->orWhere('tenant_show', $__MINI_GLOBAL_TENANT_ID__);
});
// $query = $query->where('tenant_id', $__MINI_GLOBAL_TENANT_ID__);
}
$data = $query->where(function ($query) use ($keyword) {
$query->orWhere('circle_name', 'like', '%' . $keyword . '%')
->orWhere('circle_introduce', 'like', '%' . $keyword . '%')
->orWhere('id', $keyword);
})
->withCount('wxPosts as posts_count')
->simplePaginate($limit);
if($data){
$data->map(function ($item) use ($uid) {
$item->is_follow = (new WxUserCircle())->isFollowCircle($uid, $item->id);
$item->user_circle_count = CircleUtils::circleFollowCount($item->id);
});
return $data;
}
return null;
}
/**
* 推荐
* @return mixed
*/
public static function recommendCircle()
{
return (new Model())->where('circle_state', 1)->where('is_top_recommend', 1)->withCount('wxPosts as posts_count')->orderBy('sort', 'desc')->limit(4)->get();
}
/**
* 热门
* @return mixed
*/
public static function hotCircle()
{
return (new Model())->where('circle_state', 1)->where('is_hot', 1)->orderBy('sort', 'desc')->limit(12)->get();
}
/**
* 最新
* @return mixed
*/
public static function newCircle()
{
return (new Model())->where('circle_state', 1)->where('circle_state', 0)->limit(12)->orderBy('id', 'desc')->get();
}
/**
* 全部
* @param $page
* @return mixed
*/
public static function listAll()
{
return (new Model())->where('circle_state', 1)->orderBy('id', 'desc')->get(['id','circle_name']);
// return (new Model())->where('circle_state', 1)->where('circle_state', 0)->orderBy('id', 'desc')->get(['id','circle_name']);
}
/**
* 全部
* @param $page
* @return mixed
*/
public static function list($page)
{
return (new Model())->where('circle_state', 1)->where('circle_state', 0)->orderBy('id', 'desc')->paginate($page);
}
/**
* 圈子文章组合(有的问题with limit)
* @param $page
* @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
*/
public static function circleAndPost($limit = 10)
{
$data = (new Model())->where('circle_state', 1)
->withCount(['wxPosts as posts_count' => function ($query) {
$query->where('is_examine', 1);
}])
->orderBy('sort', 'desc')
->simplePaginate($limit);
if($data){
$data->map(function ($v, $k) {
$data = WxPost::where('is_examine', 1)
->where('posts_state', 0)
->where('circle_id', $v->id)
->orderBy('id', 'desc')
->with(["user" => function ($query) {
$query->select(['id', 'user_avatar']);
}])->limit(3)
->get(['id', 'posts_content', 'user_id', 'circle_id']);
$data->map(function ($v) {
$v->commment_count = WxCommentRepositores::commentCount($v->id);
// 这里可以直接截取
$v->posts_content_raw = mb_substr(preg_replace("/<(img|video).*?src[^\'\"]+[\'\"]([^\"\']+)[^>]+>/is", '',$v->posts_content), 0, 30);
});
$v->wx_posts = $data;
});
return $data;
}
return null;
}
/**
* 用户关注圈子
* @param $user_id
* @param $circle_id
* @param null $payment_duration 日期时间字符串
* @return bool
*/
public static function userFollowCircle($user_id, $circle_id, $payment_duration = null)
{
$flag = 0;
$model_obj = WxUserCircle::where('user_id', $user_id)->where('circle_id', $circle_id)->first();
if($model_obj){
if($model_obj->user_circle_state == 1){
if($payment_duration){
$flag = WxUserCircle::where('user_id', $user_id)->where('circle_id', $circle_id)->update( [ 'user_circle_state' => 0, 'payment_duration' => $payment_duration ]);
}else{
$flag = WxUserCircle::where('user_id', $user_id)->where('circle_id', $circle_id)->update( [ 'user_circle_state' => 0 ]);
}
}else{
if($payment_duration){
$flag = WxUserCircle::where('user_id', $user_id)->where('circle_id', $circle_id)->update( [ 'user_circle_state' => 0, 'payment_duration' => $payment_duration ]);
}else{
$flag = WxUserCircle::where('user_id', $user_id)->where('circle_id', $circle_id)->update( [ 'user_circle_state' => 1 ]);
}
}
Cache::forget('circle:followCount:'.$circle_id);
Cache::forget('circle:follow:users:'.$circle_id);
UpdateCircleCountJob::dispatch($circle_id)->delay(now()->addSeconds(2));
update_user_visit($user_id, 2, $circle_id);
Cache::forget('user_circle_unread_count:'.$user_id);
return $flag;
}else{
DB::beginTransaction();
try {
$model = new WxUserCircle();
$model->user_id = $user_id;
$model->circle_id = $circle_id;
if($payment_duration){
$model->payment_duration = $payment_duration;
}
$r = $model->save();
if($r){
$user = WxUser::where('id', $user_id)->first(FieldUtils::userInfoColums());
$circle = WxCircle::where('id', $circle_id)->first(['id','user_id', 'circle_name']);
Redis::sadd('realtime:others:set', json_encode([$circle['user_id'], 4, 1]));
Redis::sadd('realtime:others:set', json_encode([$circle_id, 2, 1]));
if($circle['user_id'] > 0){
UserUtils::add_user_notice(5002, $circle['user_id'], '创建的'.env('circle_call', '圈子').'收获粉丝', '「'.$user['user_name'].'」' . '关注了你创建的「' . ''.$circle['circle_name'].'' . '」圈子。', 100);
}
UserUtils::add_user_experience($user_id, 6);
update_user_visit($user_id, 2, $circle_id);
DB::commit();
Cache::forget('circle:followCount:'.$circle_id);
Cache::forget('circle:follow:users:'.$circle_id);
UpdateCircleCountJob::dispatch($circle_id)->delay(now()->addSeconds(2));
Cache::forget('user_circle_unread_count:'.$user_id);
return true;
}
DB::rollBack();
return false;
} catch (\Exception $e) {
DB::rollBack();
_logger_(__file__, __line__, $e->getMessage());
return false;
}
}
}
/**
* 用户关注的圈子文章组合列表
* @param int $limit
* @return \Illuminate\Contracts\Pagination\Paginator
*/
public static function userFollowCircleList($uid, $limit = 10)
{
$userFollowCircle = WxUserCircle::where('user_id', $uid)->get();
if($userFollowCircle){
$circle_id_arr = [];
foreach ($userFollowCircle as $k => $v) {
$circle_id_arr[] = $v['circle_id'];
}
$data = (new Model())->where('circle_state', 1)
->whereIn('id', $circle_id_arr)
->withCount(['wxPosts as posts_count' => function ($query) {
$query->where('is_examine', 1);
}])
->orderBy('sort', 'desc')
->simplePaginate($limit);
$data->map(function ($v, $k) {
$data = WxPost::where('is_examine', 1)
->where('posts_state', 0)
->where('circle_id', $v->id)
->orderBy('id', 'desc')
->with(["user" => function ($query) {
$query->select(['id', 'user_avatar']);
}])->limit(3)
->get(['id', 'posts_content', 'user_id', 'circle_id']);
$data->map(function ($v) {
$v->commment_count = WxCommentRepositores::commentCount($v->id);
});
$v->wx_posts = $data;
});
return $data;
}
return null;
}
/**
* 获取圈子详细信息
* @param $circle_id
* @return mixed
*/
public static function CircleInfo($circle_id)
{
$data = WxCircle::where('id', $circle_id)->first();
if($data){
if($data->circle_user_division > 0){
$data->circle_user_division = $data->circle_user_division * 100;
}
if($data->circle_user_paycontent_division > 0){
$data->circle_user_paycontent_division = $data->circle_user_paycontent_division * 100;
}
if($data){
$data->append(['circle_user', 'circle_follow_count', 'circle_posts_count']);
return $data;
}
}
return null;
}
/**
* 判断是否关注了该圈子
*/
public static function isFollowCircle($uid, $circle_id = 0)
{
return WxUserCircle::where('user_id', $uid)
->where('circle_id', $circle_id)->where('user_circle_state', 0)->exists();
}
/**
* 关注圈子
* @param $uid
* @param $circle_id
* @return bool
*/
public static function followCircle($uid, $circle_id)
{
$UserCircleModel = (new WxUserCircle());
$UserCircleModel->user_id = $uid;
$UserCircleModel->circle_id = $circle_id;
return $UserCircleModel->save();
}
}