$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,avatar_confirm_status,user_type,agent_type,sign_day,sign_at,agent_status,avatar,user_login,collect_expire,lat,lng,address,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.avatar_confirm_status,m.mobile,m.sex,m.birthday,m.is_heart,m.real_name,m.agent_type,m.agent_status,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.avatar_confirm_status,m.is_reg_profile,m.user_status,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.front_idcard,up.education_type,up.position_type,up.position_check,up.idcard_check,up.idcard_type,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';
}
if ($type == 6) {
unset($where['m.user_status']);
}
$field = $field ? $field : $defaultField;
$info = Member::alias('m')
->join('user_profile up', 'up.userid=m.id', 'left')
->field($field)
->where($where)
->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) : '';
$year = $birthday ? date('Y', $birthday) : 0;
if ($year) {
$info['age'] = date('Y') - $year;
$info['year'] = $year;
}
$month = date('m-d', $birthday);
$info['start'] = getStart($month);
}
$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 ($type == 1) {
$accountConfig = $siteInfo = cmf_get_option('account_config');
$logoutPay = isset($accountConfig['logout_pay']) ? floatval($accountConfig['logout_pay']) : 0;
$info['logout_pay'] = $logoutPay > 0 ? $logoutPay : 1;
}
// 个性标签
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
* @param $accessUid
* @return false|int|string
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
* @throws \think\exception\PDOException
*/
public static function makeUserAccess($userId, $accessUid)
{
if (($userId == $accessUid) || empty($userId) || empty($accessUid)) {
return false;
}
$lockCacheKey = "caches:access:{$userId}_{$accessUid}";
if (PRedis::get($lockCacheKey)) {
return false;
}
$checkData = UserAccess::where(['user_id' => $userId, 'access_uid' => $accessUid, 'status' => 1])
->field('id,created_at,status')
->find();
$checkData = $checkData ? $checkData->toArray() : [];
$timeAt = isset($checkData['created_at']) ? $checkData['created_at'] : '';
if ($checkData && $timeAt && $timeAt >= date('Y-m-d H:i:s', time() - rand(10, 20))) {
PRedis::set($lockCacheKey, $checkData, rand(10, 20));
return false;
}
$data = ['user_id' => $userId, 'access_uid' => $accessUid, 'created_at' => date('Y-m-d H:i:s')];
if (empty($checkData)) {
return UserAccess::insertGetId($data);
} else {
return UserAccess::where(['user_id' => $userId, 'access_uid' => $accessUid])->update(['created_at' => date('Y-m-d H:i:s')]);
}
}
/**
* 获取用户访问记录
* @param $userId 被访问用户
* @param $pageSize
* @return array
*/
public static function getUserAccess($userId, $pageSize)
{
$dataList = UserAccess::alias('ua')
->join('user u', 'u.id=ua.user_id', 'left')
->join('user au', 'au.id=ua.access_uid', 'left')
->join('user_profile up', 'up.userid=ua.access_uid', 'left')
->field('ua.id,ua.user_id,ua.access_uid,ua.created_at,ua.is_lock,ua.status,au.avatar,au.user_nickname,au.user_login,au.birthday,u.birthday as my_birthday,au.sex,up.city')
->where(['ua.user_id' => $userId, 'ua.status' => 1, 'au.user_status' => 1])
->order('ua.created_at desc,ua.id desc')
->paginate($pageSize)
->each(function ($item, $key) {
$birthday = $item['birthday'];
$myBirthday = $item['my_birthday'];
$month = date('m-d', $birthday);
$myMonth = date('m-d', $myBirthday);
$start = getStart($month);
$mstart = getStart($myMonth);
$item['birtyday'] = $month;
$item['my_birtyday'] = $myMonth;
$item['start'] = $start == $mstart ? '同是' . $start : $start;
$item['mstart'] = $mstart;
$year = date('y年', $birthday);
$item['year'] = $year;
$item['city'] = str_replace('市', '', $item['city']);
$item['created_at_text'] = format_time(strtotime($item['created_at']));
$nickname = $item['user_nickname'] ? $item['user_nickname'] : $item['user_login'];
$item['user_nickname'] = $item['is_lock'] ? formatName($nickname) : $nickname;
if (isset($item['avatar'])) {
$item['avatar'] = cmf_get_image_preview_url($item['avatar']);
}
});
$dataList = $dataList ? $dataList->toArray() : ['data' => []];
// 获取今日访问
$dataList['todayCount'] = UserAccess::where(['user_id' => $userId, 'status' => 1])
->where('created_at', 'like', "%" . date('Y-m-d') . "%")
->count('id');
return $dataList;
}
/**
* 获取访问用户数
* @param $userId
* @return float|int|string
*/
public static function getAccessCount($userId)
{
return UserAccess::where(['user_id' => $userId, 'status' => 1])
->count('id');
}
/**
* 获取推荐会员数量
* @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,give_num,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.lat,m.lng,m.address,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';
// 距离
$info = Member::where(['id' => $userId])->field('lat,lng')->find();
$lat = isset($params['lat']) ? $params['lat'] : 0.00;
$lng = isset($params['lng']) ? $params['lng'] : 0.00;
$lat = $lat ? $lat : (isset($info['lat']) ? $info['lat'] : 0);
$lng = $lng ? $lng : (isset($info['lng']) ? $info['lng'] : 0);
if ($lat && $lng) {
$field .= ",ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
{$lat} * PI() / 180 - m.`lat` * PI() / 180
) / 2
),
2
) + COS({$lat} * PI() / 180) * COS(m.`lat` * PI() / 180) * POW(
SIN(
(
{$lng} * PI() / 180 - m.`lng` * PI() / 180
) / 2
),
2
)
)
) * 1000
) AS distance";
}
$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);
// 坐标距离
$item['distance'] = isset($item['distance']) ? $item['distance'] : '';
if ($item['lat'] <= 0 || $item['lng'] <= 0) {
$item['distance'] = '';
} else {
$item['distance'] = $item['distance'] >= 1000 ? round($item['distance'] / 1000, 2) . 'km' : ($item['distance'] ? $item['distance'] . 'm' : '');
}
// 地址
$address = isset($item['address']) ? $item['address'] : '';
$addressData = $address ? explode(',', $address) : [];
$item['district'] = isset($addressData[2]) ? $addressData[2] : '';
return $item;
});
$dataList = $dataList ? $dataList->toArray() : [];
//PRedis::set('recommends:query:' . $userId, Db::name('user')->getLastSql(), 600);
PRedis::set($cacheKey, $dataList, 10);
return $dataList;
}
/**
* 获取首页推荐列表
* @param $params
* @param $pageSize
* @param string $field
* @return array|bool
* @throws \think\exception\DbException
*/
public static function getTopList($params, $pageSize, $field = '')
{
$page = input('page', 1);
$cacheKey = "cache:topList:index_" . $page . '_:' . md5(json_encode($params) . $pageSize . $field);
$dataList = PRedis::get($cacheKey);
if ($dataList) {
return $dataList;
}
$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.address,m.birthday,m.avatar,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,m.is_top,m.top_expire';
$where = ['m.is_top' => 1, 'm.is_heart' => 1, 'm.is_reg_profile' => 1, 'm.user_status' => 1, 'm.user_type' => 2];
$dataList = Member::alias('m')
->join('user_profile up', 'up.userid=m.id', 'left')
->field($field)
->where($where)
// ->where('m.sex', 'in', [0, $sex])
->where('m.top_expire', '>=', date('Y-m-d H:i:s'))
->where('m.id', '>', 0)
// ->where('m.id', 'not in', $userId)
->order('m.top_expire 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) : '';
return $item;
});
$dataList = $dataList ? $dataList->toArray() : [];
PRedis::set($cacheKey, $dataList, rand(3, 5));
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, ['where' => $where, 'ids' => $ids, 'query' => Member::getLastSql()], 24 * 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;
if ($recommendIds) {
PRedis::set($cacheKey, $recommendIds, $expire * 3600);
}
}
// 获取数据
if ($recommendIds) {
$field = $field ? $field : 'm.id,m.user_nickname,m.real_name,m.birthday,m.lat,m.lng,m.address,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';
// 距离
$info = Member::where(['id' => $userId])->field('lat,lng')->find();
$lat = input('lat', 0.00);
$lng = input('lng', 0.00);
$lat = $lat ? $lat : (isset($info['lat']) ? $info['lat'] : 0);
$lng = $lng ? $lng : (isset($info['lng']) ? $info['lng'] : 0);
if ($lat && $lng) {
$field .= ",ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
{$lat} * PI() / 180 - m.`lat` * PI() / 180
) / 2
),
2
) + COS({$lat} * PI() / 180) * COS(m.`lat` * PI() / 180) * POW(
SIN(
(
{$lng} * PI() / 180 - m.`lng` * PI() / 180
) / 2
),
2
)
)
) * 1000
) AS distance";
}
$dataList = Member::alias('m')
->join('user_profile up', 'up.userid=m.id', 'left')
->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);
// 坐标距离
$item['distance'] = isset($item['distance']) ? $item['distance'] : '';
if ($item['lat'] <= 0 || $item['lng'] <= 0) {
$item['distance'] = '';
} else {
$item['distance'] = $item['distance'] >= 1000 ? round($item['distance'] / 1000, 2) . 'km' : ($item['distance'] ? $item['distance'] . 'm' : '');
}
// 地址
$address = isset($item['address']) ? $item['address'] : '';
$addressData = $address ? explode(',', $address) : [];
$item['district'] = isset($addressData[2]) ? $addressData[2] : '';
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 && $checkStatus != 5) {
return 2120;
}
if (empty($contactUid)) {
return 2111;
}
// 撤回操作
if ($checkStatus == 5) {
UserContactLog::where(['id' => $cid])->update(['status' => 1, 'updated_at' => date('Y-m-d H:i:s')]);
return 2139;
}
// 更新记录数据
Db::startTrans();
$updateData = ['status' => $checkStatus, 'updated_at' => date('Y-m-d H:i:s')];
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'] : '';
if (empty($memberInfo)) {
Db::rollback();
return 1011;
}
$field = 'm.redheart,m.user_nickname,m.real_name,m.openid,up.wechat_code,up.qq';
$contactUserInfo = Member::getHomeInfo($contactUid, $field, 6);
$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;
if (empty($contactUserInfo)) {
Db::rollback();
return 1017;
}
// 已读或拒绝退款扣除的爱心
$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}-ID:{$userId}】" . ($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 : '无';
$read = $isRead ? '已查看' : ' 未查看';
$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}\n查看状态:\t{$read}",
'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}\n查看状态:\t{$read}",
'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.wechat_code,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'] = '过期自动处理';
}
}
$info['show_wechat'] = true;
$rtime = $info['created_at'] ? strtotime($info['created_at']) : 0;
$info['rtime'] = $rtime;
if ($rtime <= time() - 7 * 24 * 3600) {
$info['show_wechat'] = false;
}
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 = 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);
}
})
->where('b.status', '=', 1)
->order("b.create_time desc")
->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);
}
/**
* 投诉拉黑用户列表
* @param int $type 类型
* @param int $pageSize 分页大小
* @return array|bool|\think\Paginator
* @throws \think\exception\DbException
*/
public static function getComplainList($type, $pageSize = 30)
{
$page = input('page', 1);
$cacheKey = "cache:complainList:p_{$type}_{$page}_{$pageSize}";
$dataList = PRedis::get($cacheKey);
if ($dataList) {
return $dataList;
}
$complainTypes = config('weixin.complainTypes');
$dataList = Complain::alias('c')
->leftJoin('user u', 'u.id=c.c_uid')
->field('c.id,u.id as uid,u.real_name,u.user_nickname,u.avatar,u.mobile,c.type,c.remark,c.status')
->where(['c.status' => 2])
->where('u.id', '>', 0)
->where(function ($query) use ($type) {
if ($type == 2) {
$query->where('c.created_time', '>=', time() - 3 * 24 * 3600);
}
})
->order('c.created_time desc')
->paginate($pageSize)
->each(function ($item, $k) use ($complainTypes) {
$item['wechat_code'] = UserProfile::where(['userid' => $item['uid']])->value('wechat_code');
$item['wechat_code'] = $item['wechat_code'] ? formatName($item['wechat_code']) : '';
$item['avatar'] = $item['avatar'] ? cmf_get_image_preview_url($item['avatar']) : '';
$type = isset($item['type']) ? $item['type'] : 8;
$item['type_name'] = isset($complainTypes[$type]) ? $complainTypes[$type] : '其他';
$item['remark_count'] = $item['remark'] ? mb_strlen($item['remark'], 'utf-8') : 0;
$item['remark_sub'] = $item['remark_count'] > 30 ? substr($item['remark'], 0, 30) : $item['remark'];
});
if ($dataList) {
PRedis::set($cacheKey, $dataList, 10);
}
return $dataList;
}
/**
* 解锁用户访问信息
* @param $uid 当前用户
* @param $cuid 被解锁用户
* @return array|int
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
* @throws \think\exception\PDOException
*/
public static function catchUnlock($uid, $cuid)
{
// 验证用户信息
$memberInfo = Member::where(['id' => $uid, 'user_status' => 1])->field('id,user_nickname,redheart,vip_auth,vip_expire,openid')->find();
$memberInfo = $memberInfo ? $memberInfo->toArray() : [];
if (!$memberInfo) {
return 2102;
}
$accessMemberInfo = Member::where(['id' => $cuid, 'user_status' => 1])->field('id,user_nickname,redheart,openid')->find();
if (!$accessMemberInfo) {
return 8305;
}
// 验证访问信息
$accessInfo = UserAccess::where(['user_id' => $uid, 'access_uid' => $cuid, 'status' => 1])->find();
if (!$accessInfo) {
return 1003;
}
if ($accessInfo->is_lock == 1) {
return 8304;
}
// 验证账户
$accountConfig = cmf_get_option('account_config');
$lockAccessPay = isset($accountConfig['lock_access_pay']) ? intval($accountConfig['lock_access_pay']) : 0;
// 会员
$vipAuth = isset($memberInfo['vip_auth']) ? intval($memberInfo['vip_auth']) : 0;
$vipExpire = isset($memberInfo['vip_expire']) ? intval($memberInfo['vip_expire']) : 0;
$lockAccessPay = $vipAuth && $vipExpire >= time() ? 0 : $lockAccessPay;
if ($lockAccessPay <= 0) {
UserAccess::where(['user_id' => $uid, 'access_uid' => $cuid, 'status' => 1])->update(['is_lock' => 1]);
return ['id' => $accessInfo->id];
}
// 付费解锁
$redheart = isset($memberInfo['redheart']) ? $memberInfo['redheart'] : 0;
if ($redheart < $lockAccessPay) {
return 2137;
}
// 更新
Db::startTrans();
if (!UserAccess::where(['user_id' => $uid, 'access_uid' => $cuid, 'status' => 1])->update(['is_lock' => 1])) {
Db::rollback();
return 2032;
}
// 扣除账户
if (!Member::where(['id' => $uid, 'user_status' => 1])->setDec('redheart', $lockAccessPay)) {
Db::rollback();
return 2031;
}
// 账户明细
$data = [
'user_id' => $uid,
'type' => 2,
'account_type' => 1,
'change_type' => 2,
'money' => $lockAccessPay,
'balance' => $redheart,
'remark' => '解锁用户【' . $accessMemberInfo->user_nickname . '】访问信息支付' . $lockAccessPay . '颗爱心',
'created_at' => date('Y-m-d H:i:s'),
'status' => 2
];
if (!AccountLog::insertGetId($data)) {
Db::rollback();
return 8306;
}
Db::commit();
return ['id' => $accessInfo->id];
}
/**
* 更新身份认证信息
* @param $userId
* @param $realname
* @param $idcard
* @return bool
*/
public static function updateAuth($userId, $realname, $idcard)
{
Db::startTrans();
if (!Member::saveData(['id' => $userId], ['real_name' => $realname])) {
Db::rollback();
return false;
}
// 在线验证是否通过
$profileData = [
'idcard' => $idcard,
'idcard_online_check' => 1,
'idcard_type' => 1,
'idcard_check' => 1,
];
if (UserProfile::checkProfile($userId)) {
$profileData['updated_at'] = date('Y-m-d H:i:s');
$res = UserProfile::saveData(['userid' => $userId], $profileData);
} else {
$res = UserProfile::insertGetId($profileData);
}
if (!$res) {
Db::rollback();
return false;
}
// 操作日志
UserLog::saveLog(['user_id' => $userId, 'type' => 1, 'content' => '提交身份证认证']);
Db::commit();
return true;
}
/**
* 统计清除爱心
* @param $userId
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function getSignReadheart($userId){
$siteInfo = cmf_get_option('site_info');
$signClearDay = isset($siteInfo['sign_clear_day'])? intval($siteInfo['sign_clear_day']) : 0;
$signClearDay = $signClearDay? min($signClearDay, 28) : 1;
$signClearDay = $signClearDay<10? '0'.$signClearDay : $signClearDay;
$datas = [
'clear_day'=> date('m月'.$signClearDay.'号'),
'clear_month'=>date('m月', strtotime(date('Y-m-01')) - 86400),
'sign_total'=> 0,
'sign_clear'=> 0,
'show_clear'=> 1,
];
// 最早
$month = date('Y-m-01', strtotime(date('Y-m-01')) - 86400);
$firstSign = AccountLog::where(['user_id'=> $userId,'type'=> 12,'status'=> 2])
->where('created_at','>=', $month)
->order('created_at','asc')
->find();
$time = isset($firstSign['created_at'])? $firstSign['created_at'] : '';
$check = AccountLog::where(['user_id' => $userId, 'type'=> 13, 'status' => 2])
->where('created_at', '>=', $time)
->find();
if(empty($check) && date('Y-m-d') > date('Y-m-'.$signClearDay)){
$check = true;
}
if($firstSign && $time) {
if($check){
$datas['clear_day'] = date('m月'.$signClearDay.'号', strtotime('next month'));
$datas['clear_month'] = date('m月');
// 签到后清除月份总消费
$totalCost = AccountLog::where(['user_id' => $userId, 'status' => 2, 'account_type' => 1, 'change_type' => 2])
->where('created_at', '>', date('Y-m-01 01:00:00'))
->sum('money');
$totalClearSign = AccountLog::where(['user_id' => $userId, 'type' => 12, 'status' => 2])
->where('created_at', '>', date('Y-m-01 01:00:00'))
->sum('money');
}else{
// 签到后清除月份总消费
$totalCost = AccountLog::where(['user_id' => $userId, 'status' => 2, 'account_type' => 1, 'change_type' => 2])
->where('created_at', '>=', $time)
->where('created_at', '<=', date('Y-m-01 01:00:00'))
->sum('money');
$totalClearSign = AccountLog::where(['user_id' => $userId, 'type' => 12, 'status' => 2])
->where('created_at', '>=', $time)
->where('created_at', '<=', date('Y-m-01 01:00:00'))
->sum('money');
}
$clearRedheart = ($totalClearSign - $totalCost);
$datas['sign_clear'] = $clearRedheart;
}
if($check){
$totalSign = AccountLog::where(['user_id' => $userId, 'type' => 12, 'status' => 2])
->where('created_at', '>', date('Y-m-01 01:00:00'))
->sum('money');
$cost = AccountLog::where(['user_id' => $userId, 'account_type' => 1, 'change_type' => 2, 'status' => 2])
->where('created_at', '>', date('Y-m-01 01:00:00'))
->sum('money');
}else{
$totalSign = AccountLog::where(['user_id' => $userId, 'type' => 12, 'status' => 2])
->where('created_at', '>=', $time)
->sum('money');
$cost = AccountLog::where(['user_id' => $userId, 'account_type' => 1, 'change_type' => 2, 'status' => 2])
->where('created_at', '>=', $time)
->sum('money');
}
$datas['sign_total'] = $totalSign>$cost? $totalSign-$cost : 0;
if($datas['sign_total'] <= 0){
$datas['sign_clear'] = 0;
}
return $datas;
}
}