$mobile])->value('id')) { return 2001; } $userName = $mobile ? $mobile : makeUserName(); $userPass = $userPass ? cmf_password($userPass) : cmf_password('123456'); $payPass = $payPass ? cmf_password($payPass) : $userPass; $wxInfo = isset($params['wxInfo']) ? $params['wxInfo'] : []; $openid = isset($wxInfo['openid']) ? trim($wxInfo['openid']) : ''; $headimgurl = isset($wxInfo['headimgurl']) ? trim($wxInfo['headimgurl']) : ''; $nickname = isset($wxInfo['nickname']) ? trim($wxInfo['nickname']) : $userName; if (empty($openid)) { return false; } $data = [ 'user_type' => 2, 'sex' => isset($params['sex']) ? intval($params['sex']) : 0, 'openid' => $openid, 'parent_id' => isset($params['parent_id']) ? intval($params['parent_id']) : 0, 'user_nickname' => isset($params['user_nickname']) ? trim($params['user_nickname']) : $nickname, 'avatar' => isset($params['avatar']) ? trim($params['avatar']) : $headimgurl, 'user_login' => $userName, 'user_pass' => $userPass, 'pay_password' => $payPass, 'is_follow' => isset($wxInfo['subscribe']) ? intval($wxInfo['subscribe']) : 0, 'last_login_ip' => get_client_ip(), 'last_login_time' => time(), 'create_time' => time(), ]; if ($mobile) { $data['mobile'] = $mobile; } $userId = Member::where(['openid' => $openid]) ->where('user_status','>=', 0) ->value('id'); PRedis::set('test:'.$openid, $data, 600); if (!$userId) { $userId = Member::insertGetId($data); return ['userId' => $userId, 'type' => 2]; } else { $data = [ 'last_login_ip' => get_client_ip(), 'updated_at' => date('Y-m-d H:i:s'), ]; Member::where(['openid' => $openid]) ->where('user_status','>=', 0) ->update($data); return false; } } /** * 用户登录 * @param $params * @return array|int|null|\PDOStatement|string|Model * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @throws \think\exception\PDOException */ public static function login($params) { $userName = isset($params['mobile']) ? trim($params['mobile']) : ''; $password = isset($params['password']) ? trim($params['password']) : ''; $field = 'id,user_login,sex,user_nickname,avatar,openid,user_pass,user_type,score,balance,user_status'; $userInfo = Member::where(['user_login' => $userName])->field($field)->find(); $userPass = isset($userInfo['user_pass']) ? $userInfo['user_pass'] : ''; $userStatus = isset($userInfo['user_status']) ? intval($userInfo['user_status']) : 0; if (empty($userInfo)) { return 2100; } $userInfo = $userInfo->toArray(); if (!cmf_compare_password($password, $userPass)) { return 2101; } if ($userStatus != 1) { return 2102; } // 更新登录数据 $updateData = [ 'updated_at' => date('Y-m-d H:i:s'), 'last_login_ip' => get_client_ip(), 'last_login_time' => time(), ]; $curOpenId = session('openid'); $openid = isset($userInfo['openid']) ? trim($userInfo['openid']) : ''; if ($curOpenId) { $checkId = Member::where(['openid' => $curOpenId])->value('id'); if ((empty($checkId) && empty($openid)) || ($checkId && $checkId == $userInfo['id'])) { $wxInfo = session('wxInfo'); $headimgurl = isset($wxInfo['headimgurl']) ? trim($wxInfo['headimgurl']) : ''; $nickname = isset($wxInfo['nickname']) ? trim($wxInfo['nickname']) : $userName; $sex = isset($wxInfo['sex']) ? intval($wxInfo['sex']) : 0; if (empty($openid)) { $updateData['openid'] = $curOpenId; } if ($headimgurl && $userInfo['avatar'] != $headimgurl) { $updateData['avatar'] = $headimgurl; } if ($nickname && $userInfo['user_nickname'] != $nickname) { $updateData['user_nickname'] = $nickname; } if ($sex && $userInfo['sex'] != $sex) { $updateData['sex'] = $sex; } } } Member::where(['user_login' => $userName])->update($updateData); unset($userInfo['user_pass']); $userInfo = array_merge($userInfo, $updateData); session('userInfo', $userInfo); return $userInfo; } /** * 获取会员信息 * @param $where 条件 * @param string $field 字段 * @return array|false|\PDOStatement|string|Model */ public static function getInfo($where, $field = "") { $field = $field ? $field : 'id,openid,user_nickname,user_type,agent_type,agent_status,avatar,user_login,collect_expire,real_name,redheart,is_reg_profile,mobile,balance,user_status,wechat_account as wechat_code,is_heart,vip_auth,vip_expire,is_follow,freezing_choose'; $info = self::where($where)->field($field)->order('user_status desc,id desc')->find(); return $info ? $info->toArray() : []; } /** * 获取用户主页信息 * @param $userId 用户ID * @param string $field 字段 * @return array */ public static function getHomeInfo($userId, $field = '', $type = 0) { $where = ['m.id' => $userId, 'm.user_status' => 1, 'm.user_type' => 2]; $defaultField = 'm.id,m.user_nickname,m.avatar,m.mobile,m.sex,m.birthday,m.is_heart,m.real_name,up.age,up.height,up.weight,up.company,up.occupation,up.property,up.graduate,up.education,up.province,up.salary,up.city,up.district,up.home_province,up.home_city,up.home_district,up.introduce,up.family,up.hobby,up.purpose,up.cause,up.expect,up.show_company,up.show_graduate,up.married,up.tags,up.isinfo,up.photolist'; if ($type == 3 || $type == 4) { $defaultField = 'm.id,m.user_nickname,m.avatar,m.mobile,m.sex,m.is_heart,m.birthday,m.real_name,up.age,up.height,up.weight,up.company,up.occupation,up.property,up.graduate,up.education,up.photolist,up.salary,up.province,up.city,up.district,up.home_province,up.home_city,up.home_district,up.introduce,up.brief,up.family,up.hobby,up.purpose,up.cause,up.expect,up.show_company,up.show_graduate,up.married,up.isinfo,m.vip_auth,m.vip_expire,up.education_check,up.position_check,up.idcard_check,up.introduce_img,up.family_img,up.hobby_img,up.purpose_img,up.tags,up.cause_img,up.expect_img'; } else if ($type == 2) { $defaultField = 'm.id,m.user_nickname,m.wechat_account,m.mobile,m.sex,m.birthday,m.real_name,up.age,up.height,up.weight,up.company,up.occupation,up.property,up.graduate,m.is_heart,up.education,up.province,up.salary,up.city,up.district,up.home_province,up.home_city,up.home_district,up.married,up.wechat_code,up.qq,up.education_check,up.position_check,up.idcard_check'; } $field = $field ? $field : $defaultField; $info = Member::alias('m') ->join('user_profile up', 'up.userid=m.id', 'left') ->field($field) ->where($where) ->where('user_status','>=',0) ->find(); if ($info) { if (isset($info['avatar'])) { $info['avatar'] = cmf_get_image_preview_url($info['avatar']); } if (isset($info['brief'])) { $info['brief'] = htmlspecialchars_decode($info['brief']); } if (isset($info['sex'])) { $sexs = ['', '男', '女']; $sex = isset($info['sex']) ? $info['sex'] : 0; $info['sex_txt'] = isset($sexs[$sex]) ? $sexs[$sex] : ''; } $info['albums'] = []; $photolist = isset($info['photolist']) ? $info['photolist'] : ''; $photolist = $photolist ? explode(',', $photolist) : []; if ($photolist) { $albums = []; foreach ($photolist as $k => $val) { $albums[] = cmf_get_image_preview_url($val); } $info['albums'] = $albums; } if (isset($info['birthday'])) { $birthday = isset($info['birthday']) ? $info['birthday'] : 0; $info['birthday_txt'] = $birthday ? date('Y年m月d日', $birthday) : ''; $info['birthday_code'] = $birthday ? date('Y-m-d', $birthday) : ''; $info['birthday_day'] = $birthday ? date('y年', $birthday) : ''; } $info['height_txt'] = ''; if (isset($info['height'])) { $height = isset($info['height']) ? intval($info['height']) : 0; $info['height'] = intval($height); $info['height_txt'] = $height ? intval($info['height']) . 'CM' : '无'; } $info['weight_txt'] = ''; if (isset($info['weight'])) { $weight = isset($info['weight']) ? intval($info['weight']) : 0; $info['weight'] = intval($weight); $info['weight_txt'] = $weight ? intval($info['weight']) . 'KG' : '无'; } // 学历 $info['education_txt'] = ''; if (isset($info['education'])) { $educations = config('weixin.educations'); $edu = isset($info['education']) ? $info['education'] : 0; $info['education_txt'] = isset($educations[$edu]) ? $educations[$edu] : '无'; } // 资产 $info['property_txt'] = '暂无'; $property = isset($info['property']) ? $info['property'] : 0; if (isset($info['property'])) { $propertys = config('weixin.propertys'); $info['property'] = $property; $info['property_txt'] = $property && isset($propertys[$property]) ? $propertys[$property] : '暂无'; } // 地址 $item['now_address'] = ''; if (isset($info['province'])) { $province = isset($info['province']) ? trim($info['province']) : ''; $city = isset($info['city']) ? trim($info['city']) : ''; $info['now_address'] = trim($province . ' ' . $city); if ($type == 2) { $district = isset($info['district']) ? trim($info['district']) : ''; $info['now_address'] = $info['now_address'] . ' ' . $district; } } $item['home_address'] = ''; if (isset($info['home_province'])) { $homeProvince = isset($info['home_province']) ? trim($info['home_province']) : ''; $homeCity = isset($info['home_city']) ? trim($info['home_city']) : ''; $info['home_address'] = trim($homeProvince . ' ' . $homeCity); if ($type == 2) { $homeDistrict = isset($info['home_district']) ? trim($info['home_district']) : ''; $info['home_address'] = $info['home_address'] . ' ' . $homeDistrict; } } // 格式化婚姻状况 $item['married_txt'] = ''; if (isset($info['married'])) { $marrieds = config('weixin.marrieds'); $married = $info['married'] ? intval($info['married']) : 0; $info['married_txt'] = $married > 0 && isset($marrieds[$married - 1]) ? $marrieds[$married - 1] : '无'; } // 隐藏手机号 if ($type > 0 && isset($info['mobile'])) { /*if($type==2){ $info['mobile_txt'] = $info['mobile']; }*/ $info['mobile'] = $info['mobile'] ? formatStr($info['mobile']) : ''; } if ($type == 4) { $info['introduce'] = isset($info['introduce']) ? str_replace("\n", "
", $info['introduce']) : ''; $info['family'] = isset($info['family']) ? str_replace(["\n", "\s"], ["
", " "], $info['family']) : ''; $info['hobby'] = isset($info['hobby']) ? str_replace(["\n", "\s"], ["
", " "], $info['hobby']) : ''; $info['purpose'] = isset($info['purpose']) ? str_replace(["\n", "\s"], ["
", " "], $info['purpose']) : ''; $info['cause'] = isset($info['cause']) ? str_replace(["\n", "\s"], ["
", " "], $info['cause']) : ''; $info['expect'] = isset($info['expect']) ? str_replace(["\n", "\s"], ["
", " "], $info['expect']) : ''; // VIP $vipAuth = isset($info['vip_auth']) ? intval($info['vip_auth']) : 0; $vipExpire = isset($info['vip_expire']) ? intval($info['vip_expire']) : 0; if($vipAuth && $vipExpire >= time()){ $info['vip_auth'] = 1; $info['vip_expire'] = date('Y-m-d', $info['vip_expire']); }else{ $info['vip_auth'] = 0; $info['vip_expire'] = ''; } } // 个性标签 if(isset($info['tags'])){ $info['tags'] = $info['tags']? explode(',', $info['tags']) : []; } if ($type == 3 || $type == 4) { if (isset($info['introduce_img'])) { $info['introduce_img_preview'] = $info['introduce_img'] ? cmf_get_image_preview_url($info['introduce_img']) : ''; } if (isset($info['family_img'])) { $info['family_img_preview'] = $info['family_img'] ? cmf_get_image_preview_url($info['family_img']) : ''; } if (isset($info['hobby_img'])) { $info['hobby_img_preview'] = $info['hobby_img'] ? cmf_get_image_preview_url($info['hobby_img']) : ''; } if (isset($info['purpose_img'])) { $info['purpose_img_preview'] = $info['purpose_img'] ? cmf_get_image_preview_url($info['purpose_img']) : ''; } if (isset($info['cause_img'])) { $info['cause_img_preview'] = $info['cause_img'] ? cmf_get_image_preview_url($info['cause_img']) : ''; } if (isset($info['expect_img'])) { $info['expect_img_preview'] = $info['expect_img'] ? cmf_get_image_preview_url($info['expect_img']) : ''; } } } return $info ? $info->toArray() : []; } /** * 获取推荐会员数量 * @param $userId * @return float|string */ public static function getInviteCount($userId) { return Member::where(['parent_id' => $userId, 'user_type' => 2, 'user_status' => 1])->count('id'); } /** * 验证获取验证用户信息 * @param $account * @return array|bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public static function checkUserInfo($account){ $cacheKey = "cache:users:check_{$account}"; $info = PRedis::get($cacheKey); if($info){ return $info; } $field = 'id,openid,user_type,agent_type,agent_status,user_status,freezing_choose,is_reg_profile'; $info = self::where(['openid|id'=> $account, 'user_type'=> 2])->field($field)->order('user_status desc,id desc')->find(); $info = $info ? $info->toArray() : []; if($info){ PRedis::set($cacheKey, $info,5); } return $info; } /** * 获取邀请的分销用户信息 * @param $userId 当前用户ID * @param string $field 返回字段,连表u-当前用户,uu连表用户 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public static function getInviteInfo($userId, $field=''){ $field = $field? $field : 'u.id,uu.id as invite_id,uu.openid,uu.parent_id'; $info = Member::alias('u') ->leftJoin('user uu','uu.id=u.parent_id') ->where(['u.id'=> $userId,'uu.user_type'=> 2,'uu.agent_type'=> 1,'uu.agent_status'=> 1]) ->field($field) ->find(); return $info? $info->toArray() : []; } /** * 充值记录 * @param $params * @param int $pageSize * @return mixed */ public static function getRechargeLog($params, $pageSize = 15) { $where = []; $userId = isset($params['user_id']) ? $params['user_id'] : 0; if ($userId) { $where['user_id'] = $userId; } $cwhere = $where; $cwhere['is_read'] = 2; $count = db('user_recharge_log') ->where($cwhere) ->where('status', 'gt', 0) ->count('id'); if ($count) { db('user_recharge_log') ->where($cwhere) ->where('status', 'gt', 0) ->update(['is_read' => 1, 'updated_at' => date('Y-m-d H:i:s')]); } $dataList = db('user_recharge_log') ->where($where) ->field('id,type,order_sn,pay_type,money,pay_money,balance,remark,created_at,status') ->where('status', 'gt', 0) ->order("created_at desc") ->paginate($pageSize) ->each(function ($item, $k) { $item['format_time'] = date('Y年m月d日 H点i分', strtotime($item['created_at'])); $item['money'] = in_array($item['type'], [1, 4, 5]) ? intval($item['money']) : $item['money']; return $item; }); return $dataList ? $dataList->toArray() : []; } /** * 充值记录数 * @param $userId * @param int $type * @return mixed */ public static function getRechargeCount($userId, $type = 0) { $where = ['user_id' => $userId, 'is_read' => 2]; if ($type) { $where['type'] = $type; } return db('user_recharge_log') ->where($where) ->where('status', 'gt', 0) ->count('id'); } /** * 推荐用户 * @param $params 参数 * @param $page 分页 * @param $pageSize 分页大小 * @param string $field 字段 * @return array|null|\PDOStatement|string|Model */ public static function getRecommendList($params, $pageSize, $field = '') { $page = input('page', 1); $cacheKey = "cache:recommends:index_".$page.'_:'.md5(json_encode($params).$pageSize.$field); $dataList = PRedis::get($cacheKey); if($dataList){ return $dataList; } $where = ['m.is_tuijian' => 1,'is_heart'=> 1, 'm.is_reg_profile' => 1, 'm.user_status' => 1, 'm.user_type' => 2]; // 匹配当前用户信息:性别 $sex = 0; $userId = isset($params['user_id']) ? intval($params['user_id']) : 0; if ($userId) { $sex = Member::where(['id' => $userId])->value('sex'); if ($sex > 0) { $sex = $sex == 1 ? 2 : 1; } } $field = $field ? $field : 'm.id,m.user_nickname,m.real_name,m.birthday,m.avatar,m.create_time,m.sex,up.graduate,up.education,up.height,up.weight,up.company,up.occupation,up.province,up.city,up.show_graduate,m.vip_auth,m.is_heart,m.vip_expire,up.show_company,up.idcard_check,up.education_check,up.position_check,up.province,up.home_city,up.photolist,up.introduce'; $dataList = Member::alias('m') ->join('user_profile up', 'up.userid=m.id', 'left') ->field($field) ->where($where) ->where(function ($query) use ($sex, $params) { // 性别 if ($sex > 0) { $query->where('m.sex', 'in', [0, $sex]); } // 年龄 $age = isset($params['age'])? trim($params['age']) : ''; if($age){ $ages = explode('~', $age); $age1 = isset($ages[0])? intval($ages[0]) : 0; $age2 = isset($ages[1])? intval($ages[1]) : 0; if($age2){ $query->where('up.age','>=', $age1)->where('up.age','<=', $age2); }else if($age1){ $query->where('up.age','>=', $age1); } } // 身高 $height = isset($params['height'])? trim($params['height']) : ''; if($height){ $heights = explode('~', $height); $height1 = isset($heights[0])? intval($heights[0]) : 0; $height2 = isset($heights[1])? intval($heights[1]) : 0; if($height2){ $query->where('up.height','>=', $height1)->where('up.height','<=', $height2); }else if($height1){ $query->where('up.height','>=', $height1); } } // 学历 $education = isset($params['education'])? intval($params['education']) : 0; if($education>0){ $op = $education==3? '>=' : '='; $query->where('up.education',$op, $education); } // 婚姻状况 $married = isset($params['married'])? intval($params['married']) : 0; if($married>0){ $query->where('up.married','=', $married); } return $query; }) ->where('m.id', '>', 0) ->where('m.id', 'not in', $userId) ->order('m.tuijian_time desc,m.id') ->paginate($pageSize) ->each(function ($item, $k) { $item['avatar'] = isset($item['avatar']) ? cmf_get_image_preview_url($item['avatar']) : ''; $birthday = isset($item['birthday']) ? $item['birthday'] : 0; $item['birthday_txt'] = $birthday ? date('Y年m月d日', $birthday) : ''; $item['birthday_day'] = $birthday ? date('y年', $birthday) : ''; $height = isset($item['height']) ? intval($item['height']) : 0; $item['height_txt'] = $height ? intval($item['height']) . 'CM' : ''; $weight = isset($item['weight']) ? intval($item['weight']) : 0; $item['weight_txt'] = $weight ? intval($item['weight']) . 'KG' : ''; // VIP $vipAuth = isset($item['vip_auth']) ? intval($item['vip_auth']) : 0; $vipExpire = isset($item['vip_expire']) ? intval($item['vip_expire']) : 0; if($vipAuth && $vipExpire >= time()){ $item['vip_auth'] = 1; $item['vip_expire'] = date('Y-m-d', $item['vip_expire']); }else{ $item['vip_auth'] = 0; $item['vip_expire'] = ''; } // 学历 $educations = config('weixin.educations'); $edu = isset($item['education']) ? $item['education'] : 0; $item['education_txt'] = $edu && isset($educations[$edu]) ? $educations[$edu] : ''; // 地址 $province = isset($item['province']) ? trim($item['province']) : ''; $city = isset($item['city']) ? trim($item['city']) : ''; $homeProvince = isset($item['home_province']) ? trim($item['home_province']) : ''; $homeCity = isset($item['home_city']) ? trim($item['home_city']) : ''; $item['now_address'] = trim($province . ' ' . $city); $item['home_address'] = trim($homeProvince . ' ' . $homeCity); $albums = []; $photolist = isset($item['photolist']) ? $item['photolist'] : ''; $photolist = $photolist ? explode(',', $photolist) : []; if ($photolist) { foreach ($photolist as $k => $val) { $albums[] = cmf_get_image_preview_url($val); } } $item['pic_count'] = count($albums); return $item; }); $dataList = $dataList ? $dataList->toArray() : []; //PRedis::set('recommends:query:' . $userId, Db::name('user')->getLastSql(), 600); PRedis::set($cacheKey, $dataList, 10); return $dataList; } /** * 怦然心动推荐用户 * @param $userId 当前用户 * @param string $field 字段 * @return array|null|\PDOStatement|string|Model */ public static function getHeartList($userId, $field = '', $refresh = false) { // 获取已经推荐的有效数据 $updated = false; $dataList = []; $cacheKey = "hearts:recommend:" . $userId; $recommendIds = PRedis::get($cacheKey); $where = ['m.is_heart' => 1, 'm.is_reg_profile' => 1, 'm.user_status' => 1, 'm.user_type' => 2]; $heartAt = Member::where(['id' => $userId])->value('heart_recommend_at'); $heartAt = $heartAt ? date('Y-m-d', strtotime($heartAt)) : ''; $ids = []; if (!PRedis::exists($cacheKey) || $refresh) { // 验证今天是否推荐过 /*$heartAt = Member::where(['id' => $userId])->value('heart_recommend_at'); $heartAt = $heartAt ? date('Y-m-d', strtotime($heartAt)) : ''; if ($heartAt == date('Y-m-d')) { return true; }*/ // 获取推荐的人数设置 $updated = true; $siteInfo = $siteInfo = cmf_get_site_info(); $ageGap = isset($siteInfo['age_gap']) ? intval($siteInfo['age_gap']) : 0; $ageGap = $ageGap ? $ageGap : 0; $recommendNum = isset($siteInfo['recommend_num']) ? intval($siteInfo['recommend_num']) : 0; $recommendNum = $recommendNum ? $recommendNum : 1; // 用户性别 $memberInfo = Member::getHomeInfo($userId, 'm.sex,up.age,up.city,m.vip_auth,m.vip_expire,up.home_province'); $sex = isset($memberInfo['sex']) ? intval($memberInfo['sex']) : 0; if ($sex > 0) { $sex = $sex == 1 ? 2 : 1; } // 调整VIP推荐人数 $isVip = false; $vipRecommendNum = isset($siteInfo['vip_recommend_num']) ? intval($siteInfo['vip_recommend_num']) : 0; $vipAuth = isset($memberInfo['vip_auth']) ? intval($memberInfo['vip_auth']) : 0; $vipExpire = isset($memberInfo['vip_expire']) ? intval($memberInfo['vip_expire']) : 0; if($vipAuth && $vipExpire >= time() && $vipRecommendNum > 0){ $isVip = true; $recommendNum = $vipRecommendNum; } $conditions = Member::getMemberConditions($userId); //var_dump($conditions); $hasMatchData = Predis::get("hearts:hasMeatch:{$userId}"); $ids = isset($hasMatchData['ids'])? $hasMatchData['ids'] : ''; $ids = $ids? explode(',', $ids) : []; $hasExpire = isset($hasMatchData['expire'])? $hasMatchData['expire'] : 0; if(time() > $hasExpire || !$isVip){ $ids = []; } // vip会员只推荐身份认证的 if($isVip){ $where['up.idcard_check'] = 2; } $recommendIds = Member::alias('m') ->join('user_profile up', 'up.userid=m.id', 'left') ->where($where) ->where(function ($query) use ($sex) { return $query->where('m.sex', 'in', [0, $sex]); }) ->where(function ($query) use ($ids) { // 过滤一星期内已经推荐过的 if($ids){ return $query->where('m.id', 'not in', $ids); }else{ return $query->where('m.id', '>', 0); } }) ->where(function ($query) use ($conditions, $memberInfo, $ageGap) { $querys = $query; // 年龄 $year = isset($conditions['year']) ? trim($conditions['year']) : ''; if ($year) { $year = explode('~', $year); $data1 = isset($year[0]) ? intval($year[0]) : 0; $data2 = isset($year[1]) ? intval($year[1]) : 0; if ($data2) { $data1 = $data1 ? strtotime($data1 . '-01-01') : 0; $data2 = $data2 ? strtotime(($data2 + 1) . '-01-01') : 0; $querys = $querys->where('m.birthday', '>=', $data1 . '')->where('m.birthday', '<=', $data2); } else if ($data1) { $data1 = $data1 ? strtotime($data1 . '-01-01') : 0; $querys = $querys->where('m.birthday', '>=', $data1); } } // 身高 $height = isset($conditions['height']) ? trim($conditions['height']) : ''; if ($height) { $height = explode('~', $height); $data1 = isset($height[0]) ? intval($height[0]) : 0; $data2 = isset($height[1]) ? intval($height[1]) : 0; if ($data2) { $querys = $querys->where('up.height', '>=', $data1)->where('up.height', '<=', $data2); } else if ($data1) { $querys = $querys->where('up.height', '>=', $data1); } } // 体重 $weight = isset($conditions['weight']) ? intval($conditions['weight']) : 0; if ($weight) { $dataArr = config('weixin.weights'); $datas = isset($dataArr[$weight]) ? $dataArr[$weight] : []; $data1 = isset($datas['value1']) ? $datas['value1'] : 0; $data2 = isset($datas['value2']) ? $datas['value2'] : 0; if ($data2) { $querys = $querys->where('up.weight', '>=', $data1)->where('up.weight', '<=', $data2); } else if ($data1) { $querys = $querys->where('up.weight', '>=', $data1); } } // 收入 $salary = isset($conditions['salary']) ? intval($conditions['salary']) : 0; if ($salary) { $dataArr = config('weixin.salarys'); $datas = isset($dataArr[$salary]) ? $dataArr[$salary] : []; $data1 = isset($datas['value']) ? $datas['value'] : 0; $data2 = isset($datas['value2']) ? $datas['value2'] : 0; if ($data2) { $querys = $querys->where('up.salary', '>=', $data1)->where('up.salary', '<=', $data2); } else if ($data1) { $querys = $querys->where('up.salary', '=', $data1); } } // 所在城市 $city = isset($memberInfo['city']) ? trim($memberInfo['city']) : ''; $cityValue = isset($conditions['city']) ? trim($conditions['city']) : ''; if ($cityValue > 0 && $city) { $querys = $querys->where('up.city', '=', $city); } // 家乡省市:是否同省 $homeProvince = isset($memberInfo['home_province']) ? trim($memberInfo['home_province']) : ''; $homeProvinceValue = isset($conditions['home_province']) ? trim($conditions['home_province']) : ''; if ($homeProvinceValue > 0 && $homeProvince) { $querys = $querys->where('up.home_province', '=', $homeProvince); } // 学历 $education = isset($conditions['education']) ? intval($conditions['education']) : 0; if ($education > 0) { // 硕士及以上或按学历匹配 $op = $education == 3 ? '>=' : '='; $querys = $querys->where('up.education', $op, $education); } // 婚姻状态 $married = isset($conditions['married']) ? intval($conditions['married']) : 0; if ($married > 0) { $querys = $querys->where('up.married', '>=', $married); } return $querys; }) ->orderRaw('rand()') ->limit($recommendNum) ->column('m.id'); PRedis::set('hearts:query:' . $userId, Member::getLastSql(), 6 * 3600); if(empty($recommendIds)){ $recommendIds = Member::alias('m') ->join('user_profile up', 'up.userid=m.id', 'left') ->where($where) ->where(function ($query) use ($sex) { return $query->where('m.sex', 'in', [0, $sex]); }) ->where(function ($query) use ($ids) { // 过滤一星期内已经推荐过的 if($ids){ return $query->where('m.id', 'not in', $ids); }else{ return $query->where('m.id', '>', 0); } }) ->where(function ($query) use ($conditions, $memberInfo, $ageGap) { $querys = $query; // 年龄 $year = isset($conditions['year']) ? trim($conditions['year']) : ''; if ($year) { $year = explode('~', $year); $data1 = isset($year[0]) ? intval($year[0]) : 0; $data2 = isset($year[1]) ? intval($year[1]) : 0; if ($data2) { $data1 = $data1 ? strtotime($data1 . '-01-01') : 0; $data2 = $data2 ? strtotime(($data2 + 1) . '-01-01') : 0; $querys = $querys->where('m.birthday', '>=', $data1 . '')->where('m.birthday', '<=', $data2); } else if ($data1) { $data1 = $data1 ? strtotime($data1 . '-01-01') : 0; $querys = $querys->where('m.birthday', '>=', $data1); } } // 身高 $height = isset($conditions['height']) ? trim($conditions['height']) : ''; if ($height) { $height = explode('~', $height); $data1 = isset($height[0]) ? intval($height[0]) : 0; $data2 = isset($height[1]) ? intval($height[1]) : 0; if ($data2) { $querys = $querys->where('up.height', '>=', $data1)->where('up.height', '<=', $data2); } else if ($data1) { $querys = $querys->where('up.height', '>=', $data1); } } // 收入 $salary = isset($conditions['salary']) ? intval($conditions['salary']) : 0; if ($height<=0 && $salary) { $dataArr = config('weixin.salarys'); $datas = isset($dataArr[$salary]) ? $dataArr[$salary] : []; $data1 = isset($datas['value']) ? $datas['value'] : 0; $data2 = isset($datas['value2']) ? $datas['value2'] : 0; if ($data2) { $querys = $querys->where('up.salary', '>=', $data1)->where('up.salary', '<=', $data2); } else if ($data1) { $querys = $querys->where('up.salary', '=', $data1); } } // 所在城市 $city = isset($memberInfo['city']) ? trim($memberInfo['city']) : ''; $cityValue = isset($conditions['city']) ? trim($conditions['city']) : ''; if ($cityValue > 0 && $city) { $querys = $querys->where('up.city', '=', $city); } // 婚姻状态 $married = isset($conditions['married']) ? intval($conditions['married']) : 0; if ($married > 0) { $querys = $querys->where('up.married', '>=', $married); } // 学历 $education = isset($conditions['education']) ? intval($conditions['education']) : 0; if ($education > 0) { if($married >0 && $education==3){ $querys = $querys->where('up.education', '>=', 1); }else if($married <=0){ // 硕士及以上或按学历匹配 $op = $education == 3 ? '>=' : '='; $querys = $querys->where('up.education', $op, $education); } } return $querys; }) ->orderRaw('rand()') ->limit($recommendNum) ->column('m.id'); } if ($recommendIds) { // 更新推荐日期 Member::where(['id' => $userId])->update(['heart_recommend_at' => date('Y-m-d H:i:s')]); } $expire = isset($siteInfo['recommend_expire']) ? intval($siteInfo['recommend_expire']) : 0; $expire = $expire ? $expire : 24; PRedis::set($cacheKey, $recommendIds, $expire * 3600); } // 获取数据 if ($recommendIds) { $field = $field ? $field : 'm.id,m.user_nickname,m.real_name,m.birthday,m.avatar,m.create_time,m.sex,m.vip_auth,m.vip_expire,up.graduate,up.education,up.height,up.weight,up.company,up.occupation,up.province,up.city,up.show_graduate,up.show_company,up.home_province,up.home_city,up.photolist,up.introduce,up.idcard_check,up.education_check,up.position_check,up.introduce'; $dataList = Member::alias('m') ->join('user_profile up', 'up.userid=m.id', 'left') // ->where($where) ->where('m.id', 'in', implode(',', $recommendIds)) ->where(['m.is_heart' => 1, 'm.user_type' => 2, 'm.user_status' => 1]) ->field($field) ->orderField('m.id', $recommendIds) ->paginate(count($recommendIds)) ->each(function ($item, $k) { $item['avatar'] = isset($item['avatar']) ? cmf_get_image_preview_url($item['avatar']) : ''; $birthday = isset($item['birthday']) ? $item['birthday'] : 0; $item['birthday_txt'] = $birthday ? date('Y年m月d日', $birthday) : ''; $item['birthday_day'] = $birthday ? date('y年', $birthday) : ''; $height = isset($item['height']) ? intval($item['height']) : 0; $item['height_txt'] = $height ? intval($item['height']) . 'CM' : ''; $weight = isset($item['weight']) ? intval($item['weight']) : 0; $item['weight_txt'] = $weight ? intval($item['weight']) . 'KG' : ''; // VIP $vipAuth = isset($item['vip_auth']) ? intval($item['vip_auth']) : 0; $vipExpire = isset($item['vip_expire']) ? intval($item['vip_expire']) : 0; if($vipAuth && $vipExpire >= time()){ $item['vip_auth'] = 1; $item['vip_expire'] = date('Y-m-d', $item['vip_expire']); }else{ $item['vip_auth'] = 0; $item['vip_expire'] = ''; } // 学历 $educations = config('weixin.educations'); $edu = isset($item['education']) ? $item['education'] : 0; $item['education_txt'] = $edu && isset($educations[$edu]) ? $educations[$edu] : ''; // 地址 $province = isset($item['province']) ? trim($item['province']) : ''; $city = isset($item['city']) ? trim($item['city']) : ''; $homeProvince = isset($item['home_province']) ? trim($item['home_province']) : ''; $homeCity = isset($item['home_city']) ? trim($item['home_city']) : ''; $item['now_address'] = trim($province . ' ' . $city); $item['home_address'] = trim($homeProvince . ' ' . $homeCity); $albums = []; $photolist = isset($item['photolist']) ? $item['photolist'] : ''; $photolist = $photolist ? explode(',', $photolist) : []; if ($photolist) { foreach ($photolist as $k => $val) { $albums[] = cmf_get_image_preview_url($val); } } $item['pic_count'] = count($albums); return $item; }); // 过滤重复 if($updated && $recommendIds){ if($ids){ $newIds = array_merge($ids, $recommendIds); Predis::set("hearts:hasMeatch:{$userId}", ['ids'=>implode(',', $newIds), 'expire'=> $hasExpire], 3*24*3600); }else{ Predis::set("hearts:hasMeatch:{$userId}", ['ids'=>implode(',', $recommendIds), 'expire'=> time()+3*24*3600], 3*24*3600); } } PRedis::set('hearts:results:' . $userId . '_' . date('Ymd'), ['datalist' => $dataList, 'sql' => Member::getLastSql()], 3 * 3600 * 24); $dataList = $dataList ? $dataList->toArray() : []; } return $dataList; } /** * 获取用户匹配条件 * @param $userId 当前用户 * @return array|mixed */ public static function getMemberConditions($userId) { $conditions = db('user_conditions')->where(['user_id' => $userId])->value('conditions'); $conditions = $conditions ? json_decode($conditions, true) : []; return $conditions; } /** * 设置用户推荐条件,怦然心动条件 * @param $userId 当前用户ID * @param $params 条件参数:age、height、weight、city、home_province、education、salary * @return int|string */ public static function setMemberConditions($userId, $params) { // 条件数据 $condition = [ 'age' => isset($params['age']) ? intval($params['age']) : 0, 'height' => isset($params['height']) ? trim($params['height']) : '', 'weight' => isset($params['weight']) ? intval($params['weight']) : 0, 'city' => isset($params['city']) ? intval($params['city']) : 0, // 'home_province' => isset($params['home_province']) ? intval($params['home_province']) : 0, 'education' => isset($params['education']) ? intval($params['education']) : 0, 'salary' => isset($params['salary']) ? intval($params['salary']) : 0, 'married' => isset($params['married']) ? intval($params['married']) : 0, 'year' => isset($params['year']) ? trim($params['year']) : '', ]; $data = [ 'user_id' => $userId, 'conditions' => json_encode($condition, 256), 'updated_at' => date('Y-m-d H:i:s'), 'status' => 1, ]; // 验证并添加或保存 $check = db('user_conditions')->where(['user_id' => $userId])->value('id'); if ($check) { $res = db('user_conditions')->where(['user_id' => $userId])->update($data); } else { $res = db('user_conditions')->insertGetId($data); } return $res; } /** * 用户关注 * @param $userId 当前用户 * @param $collectUid 关注的用户 * @param int $opType * @return int */ public static function collect($userId, $collectUid, $opType = 1) { if ($userId == $collectUid) { return 2114; } if (!Member::where(['id' => $collectUid])->value('id')) { return 2104; } // 验证性别 $contactSex = Member::where(['id' => $collectUid])->value('sex'); $sex = Member::where(['id' => $userId])->value('sex'); if (!$sex || ($sex == $contactSex)) { return 2135; } // 验证数据 $collectData = UserCollect::where(['user_id' => $userId, 'source_id' => $collectUid, 'type' => 1]) ->field('id,status') ->find(); // 关注 $collectId = isset($collectData['id']) ? $collectData['id'] : 0; $status = isset($collectData['status']) ? $collectData['status'] : 0; if ($opType == 1) { if ($collectId && $status == 1) { return 2105; } // 若收藏时间已失效更新时间 $collectExpire = Member::where(['id' => $userId])->value('collect_expire'); if ($collectExpire - time() <= 0) { $siteInfo = $siteInfo = cmf_get_site_info(); $collectTime = isset($siteInfo['collect_time']) ? intval($siteInfo['collect_time']) : 0; $collectTime = $collectTime ? $collectTime : 6; Member::saveData(['id' => $userId], ['collect_expire' => time() + $collectTime * 3600]); $memberInfo = Member::where(['id'=> $userId])->field('collect_expire,vip_auth,vip_expire')->find(); $vipAuth = isset($memberInfo['vip_auth']) ? intval($memberInfo['vip_auth']) : 0; $vipExpire = isset($memberInfo['vip_expire']) ? $memberInfo['vip_expire'] : 0; if(!$vipAuth || $vipExpire < time()){ UserCollect::where(['user_id' => $userId]) ->update(['status' => 2, 'updated_at' => date('Y-m-d H:i:s')]); } } $data = [ 'user_id' => $userId, 'source_id' => $collectUid, 'type' => 1, 'created_at' => date('Y-m-d H:i:s'), 'status' => 1, ]; if ($collectId) { if (!UserCollect::where(['user_id' => $userId, 'id' => $collectId]) ->update(['status' => 1, 'updated_at' => date('Y-m-d H:i:s')])) { return 2107; } } else { if (!UserCollect::insertGetId($data)) { return 2107; } } // 操作日志 UserLog::saveLog(['user_id' => $userId, 'type' => 4, 'content' => "收藏用户:{$collectUid}"]); // 通知 $openid = Member::where(['id' => $collectUid])->value('openid'); $memberInfo = Member::where(['id' => $userId])->field('openid,sex,user_nickname')->find(); $nickname = isset($memberInfo['user_nickname'])? $memberInfo['user_nickname'] : '未公开'; $sex = isset($memberInfo['sex'])? $memberInfo['sex'] : 0; $sex = $sex == 1 ? '帅哥' : '美女'; $dateTime = date('Y.m.d H:i'); if ($openid) { $params = [ 'title' => "有个{$sex}查看了你的名片并且关注了你\n\n关注时间:\t{$dateTime}", // 'title' => "有一位{$sex}申请加您的微信并给您留言了!\n\n申请时间:\t{$dateTime}\n\n收到留言:\t{$remark}", 'remark' => "点击查看(如果不想再收到该类型消息,可本公众号回复“隐身设置”进入链接设置为隐身)", 'type' => 'contact', 'keywords' => [ 'keyword1' => [ 'value' => $nickname . '(昵称)', 'color' => '#173177', ], 'keyword2' => [ 'value' => '隐私信息不显示', 'color' => '#173177', ], 'keyword3' => [ 'value' => '消息提醒', 'color' => '#173177', ], ], 'url' => url("/weixin/member/collect?type=2", [], '', true), ]; PRedis::set('messages:collect:' .$userId.'_'.$collectUid.'_'. $openid, ['data' => $data, 'params' => $params], 600); Wechat::sendTplMsg($openid, $params, false); } return true; } // 取消关注 else if ($opType == 2) { if (!$collectId) { return 1003; } if ($status != 1) { return 2115; } if (!UserCollect::where(['user_id' => $userId, 'source_id' => $collectUid, 'type' => 1]) ->update(['status' => 2, 'updated_at' => date('Y-m-d H:i:s')])) { return 2109; } // 操作日志 UserLog::saveLog(['user_id' => $userId, 'type' => 4, 'content' => "取消收藏用户:{$collectUid}"]); return true; } return 1009; } /** * 保存信息 * @param $where * @param $data * @return int|string */ public static function saveData($where, $data) { $data['updated_at'] = date('Y-m-d H:i:s'); return Member::where($where)->update($data); } /** * 想认识处理 * @param $userId 用户ID * @param $contactUid 认识用户ID * @return array|int */ public static function contactUser($userId, $contactUid, $remark = '') { if ($userId == $contactUid) { return 2133; } $contactInfo = Member::where(['id' => $contactUid, 'user_type' => 2, 'user_status' => 1]) ->field('id,openid,user_nickname,sex,real_name,is_reg_profile') ->find(); $memberInfo = Member::where(['id' => $userId, 'user_type' => 2, 'user_status' => 1]) ->field('id,openid,user_nickname,real_name,sex,is_reg_profile,redheart,vip_auth,vip_expire') ->find(); if (empty($contactInfo) || empty($memberInfo)) { return false; } // 性别验证 $contactSex = isset($contactInfo['sex']) ? intval($contactInfo['sex']) : 0; $sex = isset($memberInfo['sex']) ? intval($memberInfo['sex']) : 0; if (!$sex || ($sex == $contactSex)) { return 2134; } // 完善资料 $isRegProfile = isset($memberInfo['is_reg_profile']) ? $memberInfo['is_reg_profile'] : 0; if ($isRegProfile != 1) { return 2103; } // 验证是否已认识 $contactData = UserContactLog::where(['user_id' => $userId, 'contact_uid' => $contactUid]) ->where('status', 'in', [1, 2, 3]) ->field('id,status') ->find(); $checkId = isset($contactData['id']) ? $contactData['id'] : 0; $status = isset($contactData['status']) ? $contactData['status'] : 0; if ($checkId && $status != 4) { return $status == 1 ? 2117 : 2118; } // Db::startTrans(); // 扣除爱心账户 $accountConfig = cmf_get_option('account_config'); $contactPay = isset($accountConfig['contact_pay']) ? intval($accountConfig['contact_pay']) : 0; $contactPay = $contactPay ? $contactPay : 1; // 会员不需要收录费 $vipAuth = isset($memberInfo['vip_auth']) ? intval($memberInfo['vip_auth']) : 0; $vipExpire = isset($memberInfo['vip_expire']) ? intval($memberInfo['vip_expire']) : 0; $contactPay = $vipAuth && $vipExpire >= time() ? 0 : $contactPay; if ($contactPay > 0) { $redheart = isset($memberInfo['redheart']) ? intval($memberInfo['redheart']) : 0; if ($redheart < $contactPay) { Db::rollback(); return 2121; } $newRedheart = max(0, ($redheart - $contactPay)); $memberData = ['redheart' => $newRedheart, 'updated_at' => date('Y-m-d H:i:s')]; if (!Member::where(['id' => $userId])->update($memberData)) { Db::rollback(); return false; } // 账户明细 $cNickname = isset($contactInfo['user_nickname']) ? $contactInfo['user_nickname'] : ''; $accountData = [ 'user_id' => $userId, 'type' => 2, 'account_type' => 1, 'change_type' => 2, 'money' => $contactPay, 'balance' => $redheart, 'remark' => "认识【{$cNickname}】请求成功,扣除{$contactPay}个爱心", 'created_at' => date('Y-m-d H:i:s'), 'status' => 2, ]; PRedis::set('accounts:contact:' . $contactUid . '_' . $userId, $accountData, 600); if (!AccountLog::insertGetId($accountData)) { Db::rollback(); return false; } } $data = [ 'user_id' => $userId, 'contact_uid' => $contactUid, 'cost_redheart' => $contactPay, 'remark' => $remark, 'created_at' => date('Y-m-d H:i:s'), 'status' => 1, ]; $cid = UserContactLog::insertGetId($data); if (!$cid) { Db::rollback(); return false; } Db::commit(); if ($cid) { // 模板消息 $openid = isset($contactInfo['openid']) ? $contactInfo['openid'] : ''; $nickname = isset($memberInfo['user_nickname']) ? $memberInfo['user_nickname'] : ''; $cNickname = isset($contactInfo['user_nickname']) ? $contactInfo['user_nickname'] : ''; $sex = isset($memberInfo['sex']) ? $memberInfo['sex'] : 1; $sex = $sex == 1 ? '男生' : '女生'; $dateTime = date('Y.m.d H:i'); if ($openid) { $remark = $remark ? $remark : '无'; $params = [ 'title' => "对方留言:{$remark}", // 'title' => "有一位{$sex}申请加您的微信并给您留言了!\n\n申请时间:\t{$dateTime}\n\n收到留言:\t{$remark}", 'remark' => "点击查看(如果不想再收到该类型消息,可本公众号回复“隐身设置”进入链接设置为隐身)", 'type' => 'contact', 'keywords' => [ 'keyword1' => [ 'value' => $nickname . '(昵称)', 'color' => '#173177', ], 'keyword2' => [ 'value' => '隐私信息不显示', 'color' => '#173177', ], 'keyword3' => [ 'value' => '待处理', 'color' => '#173177', ], ], 'url' => url("/weixin/member/home?id={$userId}&cid={$cid}", [], '', true), ]; PRedis::set('messages:contact:' . $openid, ['data' => $data, 'params' => $params], 600); Wechat::sendTplMsg($openid, $params, false); } // 操作日志 UserLog::saveLog(['user_id' => $userId, 'type' => 4, 'content' => "申请用户{$cNickname}微信"]); return ['id' => $cid]; } else { return 2119; } } /** * @param $userId * @param $cid * @return bool|int */ public static function contactConfirm($userId, $cid, $checkStatus) { // 验证是否 $contactData = UserContactLog::where(['id' => $cid, 'contact_uid' => $userId]) ->field('id,user_id,cost_redheart,is_read,status') ->find(); $checkId = isset($contactData['id']) ? $contactData['id'] : 0; $status = isset($contactData['status']) ? $contactData['status'] : 0; $contactUid = isset($contactData['user_id']) ? $contactData['user_id'] : 0; $isRead = isset($contactData['is_read']) ? $contactData['is_read'] : 0; // 是否已读 if ($checkId && $status != 1) { return 2120; } if (empty($contactUid)) { return 2111; } // 更新记录数据 $updateData = ['status' => $checkStatus, 'updated_at' => date('Y-m-d H:i:s')]; Db::startTrans(); if (!UserContactLog::where(['id' => $cid])->update($updateData)) { Db::rollback(); return 2032; } // 当前用户信息 $field = 'm.user_nickname,m.real_name,m.openid,up.wechat_code,up.qq'; $memberInfo = Member::getHomeInfo($userId, $field); $nickname = isset($memberInfo['user_nickname']) ? $memberInfo['user_nickname'] : ''; $field = 'm.redheart,m.user_nickname,m.real_name,m.openid,up.wechat_code,up.qq'; $contactUserInfo = Member::getHomeInfo($contactUid, $field); $cOpenid = isset($contactUserInfo['openid']) ? $contactUserInfo['openid'] : ''; $cNickname = isset($contactUserInfo['user_nickname']) ? $contactUserInfo['user_nickname'] : ''; $redheart = isset($contactUserInfo['redheart']) ? intval($contactUserInfo['redheart']) : 0; $contactPay = isset($contactData['cost_redheart']) ? intval($contactData['cost_redheart']) : 0; // 已读或拒绝退款扣除的爱心 $accountConfig = cmf_get_option('account_config'); $applyRefundPay = isset($accountConfig['apply_refund_pay']) ? intval($accountConfig['apply_refund_pay']) : 0; if($isRead || $checkStatus==3){ $applyRefundPay = $applyRefundPay ? $applyRefundPay : 0; $refundHeart = $contactPay>$applyRefundPay? intval($contactPay-$applyRefundPay) : 0; }else{ $refundHeart = $contactPay; $applyRefundPay = 0; } // 审核失败退还扣除的爱心 if ($contactPay > 0 && ($checkStatus == 3 || $checkStatus == 4)) { $newRedheart = max(0, ($redheart + $refundHeart)); $memberData = ['redheart' => $newRedheart, 'updated_at' => date('Y-m-d H:i:s')]; if (!Member::where(['id' => $contactUid])->update($memberData)) { Db::rollback(); return 2031; } // 账户明细 $accountData = [ 'user_id' => $contactUid, 'type' => 3, 'account_type' => 1, 'change_type' => 1, 'money' => $refundHeart, 'balance' => $redheart, 'remark' => "认识【{$nickname}】" . ($checkStatus == 3 ? '审核失败' : '审核超时') . ",退还{$refundHeart}个爱心,扣除{$applyRefundPay}个爱心", 'created_at' => date('Y-m-d H:i:s'), 'status' => 2, ]; PRedis::set('accounts:contact:' . $contactUid . '_' . $userId, $accountData, 600); if (!AccountLog::insertGetId($accountData)) { Db::rollback(); return false; } } Db::commit(); // 发送模板信息 /*if($openid){ $cWechatCode = isset($contactUserInfo['wechat_code'])? trim($contactUserInfo['wechat_code']) : ''; $cqq = isset($contactUserInfo['qq'])? trim($contactUserInfo['qq']) : ''; $cWechatCode = $cWechatCode? $cWechatCode : '无'; $cqq = $cqq? $cqq : '无'; $params = [ 'title' => "【{$cRealname}】想认识您的请求已确认\n\n对方微信号:\t{$cWechatCode}\n\n对方QQ:\t{$cqq}", 'remark' => "感谢您的使用,点击详情查看对方信息", 'type' => 'contact', 'keywords' => [ 'keyword1' => [ 'value' => '已确认', 'color' => '#173177', ], 'keyword2' => [ 'value' => date('Y年m月d日 H点i分s秒'), 'color' => '#173177', ], 'keyword3' => [ 'value' => "来自【{$cNickname}】,姓名:【{$cRealname}】的认识申请已经确认通过,请及时添加对方联系方式", 'color' => '#173177', ], ], 'url' => url("/weixin/member/home?id={$contactUid}&cid=$cid", '', '', true), ]; PRedis::set('messages:contactConfirm_' . $userId.'_'.$contactUid, ['data' => $contactData, 'params' => $params], 600); Wechat::sendTplMsg($openid, $params); }*/ // 通知对方模板信息 if ($cOpenid) { $wechatCode = isset($memberInfo['wechat_code']) ? trim($memberInfo['wechat_code']) : ''; $qq = isset($memberInfo['qq']) ? trim($memberInfo['qq']) : ''; $wechatCode = $wechatCode ? $wechatCode : '无'; $qq = $qq ? $qq : '无'; $dateTime = date('Y.m.d H:i'); if ($checkStatus == 2) { $params = [ 'title' => "你喜欢的人也喜欢你啦\n\n对方姓名:\t{$nickname}(昵称)\n\n对方微信号: \t{$wechatCode}\n\n申请时间:\t{$dateTime}", 'remark' => "脱单需主动,交友需谨慎!", 'type' => 'contact_confirm', 'keywords' => [ 'keyword1' => [ 'value' => '状态通知', 'color' => '#173177', ], 'keyword2' => [ 'value' => '已接受', 'color' => '#173177', ], ], 'url' => url("/weixin/member/home?id={$userId}&cid={$cid}", '', '', true), ]; } else if ($checkStatus == 3) { // 是否扣除爱心 $remark = $applyRefundPay? "扣除{$applyRefundPay}颗后已经原路退回" : "已经全部原路退回"; $params = [ 'title' => "Soory!亲亲!{$nickname}拒绝了您的加微信申请,您支付的爱心{$remark}。别灰心哦,您一定会遇到更好的另一半~\n\n申请时间:\t{$dateTime}", 'remark' => "天涯何处无芳草,去看看其他的异性吧!", 'type' => 'contact_confirm', 'keywords' => [ 'keyword1' => [ 'value' => '状态通知', 'color' => '#173177', ], 'keyword2' => [ 'value' => '已拒绝', 'color' => '#173177', ], ], 'url' => url("/weixin/match/index", '', '', true), ]; } else { // 是否已读 $remark = $isRead && $applyRefundPay? "扣除{$applyRefundPay}颗后已经原路退回" : "已经全部原路退回"; $params = [ 'title' => "您好亲亲,非常抱歉{$nickname}未及时反馈而导致申请超时,您被扣除的爱心{$remark}。您还可以请客服帮您牵线增加成功率哦~\n\n申请时间:\t{$dateTime}", 'remark' => "当你有勇气主动时,其实已经打败了那些看似优秀的人,遇见不易让客服牵线试试吧!", 'type' => 'contact_confirm', 'keywords' => [ 'keyword1' => [ 'value' => '状态通知', 'color' => '#173177', ], 'keyword2' => [ 'value' => '过期失效', 'color' => '#173177', ], ], 'url' => url("/weixin/match/index", '', '', true), ]; } // 操作日志 if ($checkStatus == 2 || $checkStatus == 3) { $content = $checkStatus == 2 ? "通过用户{$cNickname}微信申请" : "拒绝用户{$cNickname}微信申请"; UserLog::saveLog(['user_id' => $userId, 'type' => 4, 'content' => $content]); } PRedis::set('messages:contactConfirm:' . $contactUid . '_' . $userId, ['openid' => $cOpenid, 'data' => $contactData, 'params' => $params], 600); Wechat::sendTplMsg($cOpenid, $params); } return ['id' => $cid]; } /** * 用户页面访问统计 * @param $userId 访问用户 * @param string $type 访问类型 * @param int $targetUid 目标用户 */ public static function visitCount($userId, $type = 'login', $targetUid = 0, $expire = 1) { $cacheKey = 'counts:users:' . date('Ymd') . '_' . $type; $cacheTempKey = 'counts:usersTemp:' . $userId . '_' . $type . '_' . date('Ymd'); $checkUser = Member::where(['user_type' => 2, 'id' => $userId]) ->value('id'); if ($checkUser && $userId && !PRedis::get($cacheTempKey)) { PRedis::set($cacheTempKey, ['userId' => $userId, 'type' => $type, 'target' => $targetUid], $expire * 3600); $types = ['login' => '登录', 'match' => '访问单身推荐', 'heart' => '访问怦然心动', 'center' => '访问用户中心', 'home' => "访问用户[{$targetUid}]信息", 'activity' => '浏览活动列表', 'book' => '想要报名']; $title = isset($types[$type]) ? $types[$type] : '访问平台'; if ($type != 'profile') { UserLog::saveLog(['user_id' => $userId, 'type' => 4, 'content' => "【{$userId}】用户{$title}"]); } if (!PRedis::get($cacheKey)) { PRedis::set($cacheKey, 1, 2 * 24 * 3600); } else { PRedis::inc($cacheKey, 1); } } } /** * 获取匹配用户数据列表 * @param $matchUids * @return array|bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public static function getMatchList($matchUids, $activityId=0){ if(empty($matchUids)){ return false; } $field = 'm.id,m.user_nickname,m.avatar,m.mobile,m.sex,m.birthday,m.is_heart,m.real_name,up.age,up.height,up.weight,up.company,up.occupation,up.property,up.graduate,up.education,up.province,up.salary,up.city,up.district,up.home_province,up.home_city,up.home_district,up.introduce,up.family,up.hobby,up.purpose,up.cause,up.expect,up.show_company,up.show_graduate,up.married,up.tags,up.isinfo,m.vip_auth,m.vip_expire,up.education_check,up.position_check,up.idcard_check'; $dataList = Member::alias('m') ->leftJoin('user_profile up','up.userid=m.id') ->where('m.id', 'in', $matchUids) ->field($field) ->select() ->each(function($item) use($activityId){ if($activityId){ $item['book_no'] = Books::where(['uid'=> $item['id'],'aid'=> $activityId, 'status'=> 3])->value('book_num'); } Member::formatUser($item); }); return $dataList? $dataList->toArray() : []; } /** * 格式化用户信息 * @param $item 数据 * @param $type */ private static function formatUser(&$item, $type = 0){ if (isset($item['avatar'])) { $item['avatar'] = cmf_get_image_preview_url($item['avatar']); } if (isset($item['brief'])) { $item['brief'] = htmlspecialchars_decode($item['brief']); } if (isset($item['sex'])) { $sexs = ['', '男', '女']; $sex = isset($item['sex']) ? $item['sex'] : 0; $item['sex_txt'] = isset($sexs[$sex]) ? $sexs[$sex] : ''; } $item['albums'] = []; $photolist = isset($item['photolist']) ? $item['photolist'] : ''; $photolist = $photolist ? explode(',', $photolist) : []; if ($photolist) { $albums = []; foreach ($photolist as $k => $val) { $albums[] = cmf_get_image_preview_url($val); } $item['albums'] = $albums; } if (isset($item['birthday'])) { $birthday = isset($item['birthday']) ? $item['birthday'] : 0; $item['birthday_txt'] = $birthday ? date('Y年m月d日', $birthday) : ''; $item['birthday_code'] = $birthday ? date('Y-m-d', $birthday) : ''; $item['birthday_day'] = $birthday ? date('y年', $birthday) : ''; } $item['height_txt'] = ''; if (isset($item['height'])) { $height = isset($item['height']) ? intval($item['height']) : 0; $item['height'] = intval($height); $item['height_txt'] = $height ? intval($item['height']) . 'CM' : '无'; } $item['weight_txt'] = ''; if (isset($item['weight'])) { $weight = isset($item['weight']) ? intval($item['weight']) : 0; $item['weight'] = intval($weight); $item['weight_txt'] = $weight ? intval($item['weight']) . 'KG' : '无'; } // 学历 $item['education_txt'] = ''; if (isset($item['education'])) { $educations = config('weixin.educations'); $edu = isset($item['education']) ? $item['education'] : 0; $item['education_txt'] = isset($educations[$edu]) ? $educations[$edu] : '无'; } // 资产 $item['property_txt'] = '暂无'; $property = isset($item['property']) ? $item['property'] : 0; if (isset($item['property'])) { $propertys = config('weixin.propertys'); $item['property'] = $property; $item['property_txt'] = $property && isset($propertys[$property]) ? $propertys[$property] : '暂无'; } // 地址 $item['now_address'] = ''; if (isset($item['province'])) { $province = isset($item['province']) ? trim($item['province']) : ''; $city = isset($item['city']) ? trim($item['city']) : ''; $item['now_address'] = trim($province . ' ' . $city); } $item['home_address'] = ''; if (isset($item['home_province'])) { $homeProvince = isset($item['home_province']) ? trim($item['home_province']) : ''; $homeCity = isset($item['home_city']) ? trim($item['home_city']) : ''; $item['home_address'] = trim($homeProvince . ' ' . $homeCity); } // 格式化婚姻状况 $item['married_txt'] = ''; if (isset($item['married'])) { $marrieds = config('weixin.marrieds'); $married = $item['married'] ? intval($item['married']) : 0; $item['married_txt'] = $married > 0 && isset($marrieds[$married - 1]) ? $marrieds[$married - 1] : '无'; } } /** * 获取收到或发出消息数量 * @param $userId * @param array $params * @return float|int|string */ public static function getMessageTotal($userId, $params=[]){ $type = isset($params['type'])? intval($params['type']) : 1; // 我收到的 if($type == 1){ $where = ['uc.contact_uid'=> $userId]; $joinWhere = 'u.id=uc.user_id'; }else{ $where = ['uc.user_id'=> $userId]; $joinWhere = 'u.id=uc.contact_uid'; } $status = isset($params['status'])? intval($params['status']) : 1; return UserContactLog::alias('uc') ->join('user u',$joinWhere,'left') ->where($where) ->where('u.id','>',0) ->where(function($query) use ($status){ if($status == 1){ $query->where('uc.status','>', 1); }else{ $query->where('uc.status',1); } }) ->count('uc.id'); } /** * 获取用户申请消息列表 * @param $params * @param $pageSize * @param string $field * @return $this */ public static function getMessageList($userId, $params=[], $pageSize=20, $field=''){ // 验证有效时间,会员不限制 $type = isset($params['type'])? intval($params['type']) : 1; // 我收到的 if($type == 1){ $where = ['uc.contact_uid'=> $userId]; $joinWhere = 'u.id=uc.user_id'; }else{ $where = ['uc.user_id'=> $userId]; $joinWhere = 'u.id=uc.contact_uid'; } $status = isset($params['status'])? intval($params['status']) : 1; $siteInfo = cmf_get_site_info(); $expire = isset($siteInfo['contact_time']) ? intval($siteInfo['contact_time']) : 0; $expire = $expire ? $expire : 1; $field = $field? $field : 'uc.id,uc.user_id,uc.contact_uid,uc.created_at,uc.remark,uc.updated_at,uc.is_read,uc.status,u.id as uid,u.user_login,u.real_name,u.user_nickname,u.avatar,u.sex,u.birthday,mp.graduate,mp.education,mp.height,mp.weight,mp.show_graduate,mp.show_company,mp.company,mp.occupation,mp.province,mp.city,mp.home_province,mp.home_city'; $dataList = UserContactLog::alias('uc') ->join('user u',$joinWhere,'left') ->join('user_profile mp', 'mp.userid=u.id', 'left') ->where($where) ->where('u.id','>',0) ->where(function($query) use ($status){ if($status == 1){ $query->where('uc.status', 1); }else{ $query->where('uc.status', '>',1); } }) ->field($field) ->order('uc.status asc,uc.created_at desc') ->paginate($pageSize) ->each(function($item, $k) use ($expire){ $expire = $expire? $expire*86400 : 0; $status = isset($item['status'])? intval($item['status']) : 0; $item['avatar'] = isset($item['avatar']) ? cmf_get_image_preview_url($item['avatar']) : ''; $rtime = $item['created_at']? strtotime($item['created_at']) : 0; $rtime = $rtime>time()-$expire? $rtime-(time()-$expire) : 0; $item['rtime'] = $rtime; $rtime = $rtime>23*3600? ceil($rtime/86400).'天' : ($rtime>3600? ceil($rtime/3600).'小时' : ($rtime>60? ceil($rtime/60).'分钟' : '')); if($status == 1){ if($rtime){ $item['time'] = ''.$rtime.'后 自动拒绝'; }else{ $item['time'] = '待处理'; } }else{ $item['time'] = $status == 2? '已通过':($status == 3? '已拒绝' : '待处理'); if($status == 4){ $info['time'] = '过期自动处理'; } } Member::formatUser($item); return $item; }); $dataList = $dataList? $dataList->toArray() : ['total'=> 0]; $dataList['total1'] = Member::getMessageTotal($userId, $params); return $dataList; } /** * 获取用户申请消息列表 * @param $params * @param $pageSize * @param string $field * @return $this */ public static function getMessageInfo($id, $userId=0, $field=''){ $siteInfo = cmf_get_site_info(); $expire = isset($siteInfo['contact_time']) ? intval($siteInfo['contact_time']) : 0; $expire = $expire ? $expire : 1; $type = 1; $joinWhere = 'u.id=uc.user_id'; $data = UserContactLog::where(['id'=> $id])->field('user_id,contact_uid')->find(); if($userId && isset($data['user_id']) && $data['user_id'] == $userId){ $joinWhere = 'u.id=uc.contact_uid'; $type = 2; } $field = $field? $field : 'uc.id,uc.user_id,uc.contact_uid,uc.created_at,uc.remark,uc.updated_at,uc.is_read,uc.status,u.id as uid,u.user_login,u.real_name,u.user_nickname,u.avatar,u.sex,u.birthday,mp.graduate,mp.education,mp.height,mp.weight,mp.show_graduate,mp.show_company,mp.company,mp.occupation,mp.province,mp.city,mp.home_province,mp.home_city,mp.education_check,mp.position_check,mp.idcard_check'; $info = UserContactLog::alias('uc') ->join('user u', $joinWhere,'left') ->join('user_profile mp', 'mp.userid=u.id', 'left') ->where(['uc.id'=> $id]) ->where('u.id','>',0) ->field($field) ->find(); $info = $info? $info->toArray() : []; if($info){ $info['type'] = $type; $expire = $expire? $expire*86400 : 0; $status = isset($info['status'])? intval($info['status']) : 0; $info['avatar'] = isset($info['avatar']) ? cmf_get_image_preview_url($info['avatar']) : ''; $rtime = $info['created_at']? strtotime($info['created_at']) : 0; $rtime = $rtime>time()-$expire? $rtime-(time()-$expire) : 0; $info['rtime'] = $rtime; $rtime = $rtime>23*3600? ceil($rtime/86400).'天' : ($rtime>3600? ceil($rtime/3600).'小时' : ($rtime>60? ceil($rtime/60).'分钟' : '')); if($status == 1){ if($rtime){ $info['time'] = ''.$rtime.'后 自动拒绝'; }else{ $info['time'] = '待处理'; } }else{ $info['time'] = $status == 2? '已通过':($status == 3? '已拒绝' : '待处理'); if($status == 4){ $info['time'] = '过期自动处理'; } } Member::formatUser($info); } return $info; } /** * 余额明细 * @param $params * @param int $pageSize * @return mixed */ public static function getBalanceLog($params, $pageSize = 15) { $where = []; $userId = isset($params['user_id']) ? $params['user_id'] : 0; if ($userId) { $where['b.user_id'] = $userId; } $changeType = isset($params['change_type']) ? $params['change_type'] : 0; if ($changeType) { $where['b.change_type'] = $changeType; } $type = isset($params['type']) ? $params['type'] : 0; $model = db('user_balance_log')->alias('b') ->leftJoin('user u','u.id=b.source_uid') ->where($where) ->where(function($query) use ($type){ if($type == 'income'){ $query->where('b.type', '>', 1); } else if ($type){ $type = is_array($type)? $type : [$type]; $query->whereIn('b.type', $type); } }); $types = config('weixin.incomeTypes'); $dataList = $model->field('b.id,b.type,b.order_sn,b.change as money,b.change_type,b.balance,b.remark,b.description,b.create_time,status,u.user_nickname') ->where('b.status', 'lt', 4) ->order("b.create_time desc") ->paginate($pageSize) ->each(function ($item, $k) use($types){ $item['format_time'] = $item['create_time']? date('Y年m月d日 H点i分', $item['create_time']) : ''; $item['money'] = floatval($item['money']); $type = isset($item['type'])? $item['type'] : 0; $item['typeName'] = isset($types[$type])? $types[$type] : ''; return $item; }); $dataList = $dataList ? $dataList->toArray() : []; if($dataList){ $total = $model->where('b.status',2)->sum('b.change'); $dataList['total_money'] = moneyFormat($total); $total = $model->where('b.status',1)->sum('b.change'); $dataList['nopay_money'] = moneyFormat($total); } return $dataList; } /** * 邀请扽团队成员或会员列表 * @param $params 参数 * @param $type 类型:1-团队成员,2-邀请的会员 * @param int $pageSize * @return mixed */ public static function getInviteList($inviteId, $type = 1, $pageSize = 15) { $where = ['user_type'=> 2, 'user_status'=> 1]; if ($inviteId) { $where['parent_id'] = $inviteId; } if($type == 1){ $where['agent_type'] = 1; $orderBy = "agent_create_time desc"; }else{ $where['agent_type'] = 0; $orderBy = "create_time desc"; } $model = Member::where($where) ->where(function($query) use($type){ if($type == 1){ $query->where('agent_status','<', 4); }else{ $query->whereIn('user_status', [0,1,2]); } }); $field = 'id,openid,user_nickname,sex,user_type,agent_type,agent_status,agent_create_time,create_time,avatar,is_reg_profile,user_status,is_heart,vip_auth,vip_expire,is_follow'; $dataList = $model->field($field) ->order($orderBy) ->paginate($pageSize) ->each(function ($item, $k) use($type, $inviteId){ $item['avatar'] = $item['avatar']? cmf_get_image_preview_url($item['avatar']) : ''; if($type == 1){ $item['format_time'] = $item['agent_create_time']? date('Y-m-d H:i', $item['agent_create_time']) : ''; $item['invite_num'] = Member::getInviteCounts(['parent_id'=> $item['id']], 2); $item['invite_market_num'] = Member::getInviteCounts(['parent_id'=> $item['id']], 1); $item['invite_sum'] = Member::getBalanceCount($inviteId, $item['id']); }else{ // VIP $vipAuth = isset($item['vip_auth']) ? intval($item['vip_auth']) : 0; $vipExpire = isset($item['vip_expire']) ? intval($item['vip_expire']) : 0; if($vipAuth && $vipExpire >= time()){ $item['vip_auth'] = 1; $item['vip_expire'] = date('Y-m-d', $item['vip_expire']); }else{ $item['vip_auth'] = 0; $item['vip_expire'] = ''; } $item['format_time'] = $item['create_time']? date('Y-m-d H:i', $item['create_time']) : ''; $item['invite_sum'] = Member::getBalanceCount($inviteId, $item['id'], 2); } $item['avatar'] = $item['avatar']? cmf_get_image_preview_url($item['avatar']) : ''; return $item; }); $dataList = $dataList ? $dataList->toArray() : []; if($dataList){ $counts = []; if($type == 1){ $counts['invite_num'] = Member::getInviteCounts(['parent_id'=> $inviteId], 1); $total = Member::getBalanceCount($inviteId); $counts['invite_sum'] = moneyFormat($total); }else{ $counts['invite_sex_1'] = Member::getInviteCounts(['parent_id'=> $inviteId,'sex'=> 1], 2); $counts['invite_sex_2'] = Member::getInviteCounts(['parent_id'=> $inviteId,'sex'=> 2], 2); $counts['invite_vip'] = Member::getInviteCounts(['parent_id'=> $inviteId,'vip_auth'=> 1], 2); $total = Member::getBalanceCount($inviteId,0,2); $counts['invite_sum'] = moneyFormat($total); } $dataList['counts'] = $counts; } return $dataList; } /** * 统计邀请的会员或团队成员 * @param $params * @param int $type * @return float|int|string */ public static function getInviteCounts($params, $type=1){ $where = ['user_type'=> 2, 'user_status'=> 1]; $inviteId = isset($params['parent_id'])? $params['parent_id'] : 0; if ($inviteId) { $where['parent_id'] = $inviteId; } if($type == 1){ $where['agent_type'] = 1; }else{ $where['agent_type'] = 0; } $sex = isset($params['sex'])? $params['sex'] : 0; if($sex){ $where['sex'] = $sex; } $sex = isset($params['sex'])? $params['sex'] : 0; if($sex){ $where['sex'] = $sex; } $count = Member::where($where) ->where(function($query) use($type){ if($type == 1){ $query->where('agent_status','<', 4); }else{ $query->whereIn('user_status', [0,1,2]); } }) ->where(function ($query) use($params){ $sex = isset($params['sex'])? $params['sex'] : 0; if($sex){ $query->where('sex','=', $sex); } $vipAuth = isset($params['vip_auth'])? $params['vip_auth'] : 0; if($vipAuth){ $query->where('vip_auth','=', $vipAuth)->where('vip_expire','>=', time()); } }) ->count('id'); return intval($count); } /** * 统计收益金额 * @param $userId 所属用户 * @param int $sourceUid 来源用户 * @param int $type 类型:0-收益分成, * @return float */ public static function getBalanceCount($userId, $sourceUid=0, $userType=1, $profitType = 0){ $where = ['b.user_id'=> $userId,'b.status'=> 2,'u.user_type'=> 2]; if($sourceUid){ $where['b.source_uid'] = $sourceUid; } if($userType==1){ $where['u.agent_type'] = 1; }else{ $where['u.agent_type'] = 0; } if($profitType){ $where['b.type'] = $profitType; } //var_dump($where); $sum = UserBalanceLog::alias('b') ->leftJoin('user u','u.id=b.source_uid') ->where($where) ->where('b.type','>',1) ->where('b.type','<',30) ->sum('b.pay_money'); return moneyFormat($sum); } }