| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- <?php
- /**
- * 会员服务
- */
- namespace app\weixin\service;
- use app\weixin\model\AccountLog;
- use app\weixin\model\AuthLog;
- use app\weixin\model\Complain;
- use app\weixin\model\UserBalanceLog;
- use app\weixin\model\UserProfile;
- use app\weixin\model\Member as MemberModel;
- use app\weixin\model\Wechat;
- use think\Db;
- class Member
- {
- /**
- * 会员信息认证审核
- * @param $userId 用户ID
- * @param $status 审核状态:2-成功,3-失败
- * @param string $scene 审核类型:idcard-身份证,education-学历,position-职业/工作
- * @param string $failRemark 审核失败原因
- * @return array|int
- */
- public static function checkAuth($userId, $status, $scene='idcard', $failRemark=''){
- try {
- // 验证认证信息是否存在
- $field = 'id,userid,idcard,idcard_check,education_check,position_check';
- $info = UserProfile::getInfo(['userid'=> $userId],$field);
- if(empty($info)){
- return 2122;
- }
- if(!in_array($status, [2,3])){
- return 2127;
- }
- //var_dump($info);
- // 审核处理
- $sceneNames = ['idcard'=>'身份证','education'=> '学历','position'=> '工作'];
- switch($scene){
- case 'idcard': // 身份认证审核
- // 验证状态
- $idcardCheck = isset($info['idcard_check'])? intval($info['idcard_check']) : 0;
- if($idcardCheck != 0 && $idcardCheck != 1 && $status == 2){
- return 2123;
- }
- $data = [
- 'idcard_check'=> $status,
- 'idcard_online_check'=> $status==3? 0 : 1,
- 'idcard_fail'=> $failRemark? trim($failRemark) : '',
- ];
- break;
- case 'education': // 学历认证审核
- // 验证状态
- $educationCheck = isset($info['education_check'])? intval($info['education_check']) : 0;
- if($educationCheck != 0 && $educationCheck != 1 && $status == 2){
- return 2123;
- }
- $data = [
- 'education_check'=> $status,
- 'education_fail'=> $failRemark? trim($failRemark) : '',
- ];
- break;
- case 'position': // 工作认证审核
- // 验证状态
- $positionCheck = isset($info['position_check'])? intval($info['position_check']) : 0;
- if($positionCheck != 0 && $positionCheck != 1 && $status == 2){
- return 2123;
- }
- $data = [
- 'position_check'=> $status,
- 'position_fail'=> $failRemark? trim($failRemark) : '',
- ];
- break;
- default:
- return 2126;
- break;
- }
- // 更新数据处理
- Db::startTrans();
- if(!UserProfile::saveData(['userid'=> $userId], $data)){
- Db::rollback();
- return 2125;
- }
- // 审核通过奖励处理
- $remark = '';
- $sceneName = isset($sceneNames[$scene])? $sceneNames[$scene] : '信息';
- $field = 'id,openid,parent_id,user_nickname,real_name,redheart';
- $memberInfo = MemberModel::getInfo(['id'=> $userId], $field);
- $inviteId = isset($memberInfo['parent_id'])? $memberInfo['parent_id'] : 0;
- $nickname = isset($memberInfo['user_nickname'])? $memberInfo['user_nickname'] : '';
- if($status == 2){
- // 身份认证更新生日
- $idcard = isset($info['idcard'])? trim($info['idcard']) : '';
- if($scene == 'idcard' && $idcard){
- $birthday = substr($idcard, 6,8);
- $birthday = substr($birthday,0,4).'-'.substr($birthday,4,2).'-'.substr($birthday,6,2);
- $birthday = $birthday? strtotime($birthday) : 0;
- if($birthday){
- MemberModel::saveData(['id'=> $userId], ['birthday'=> $birthday]);
- }
- }
- $siteInfo = cmf_get_site_info();
- $awardNum = isset($siteInfo[$scene.'_award_redheart'])? intval($siteInfo[$scene.'_award_redheart']) : 0;
- $inviteAwardNum = isset($siteInfo[$scene.'_invite_award_redheart'])? intval($siteInfo[$scene.'_invite_award_redheart']) : 0;
- if($awardNum){
- $redheart = isset($memberInfo['redheart'])? intval($memberInfo['redheart']) : 0;
- if(!MemberModel::saveData(['id'=> $userId], ['redheart'=> intval($redheart + $awardNum)])){
- Db::rollback();
- return 2125;
- }
- // 账户明细
- $remark = "{$sceneName}认证成功奖励{$awardNum}个爱心";
- $accountData = [
- 'type' => 4,
- 'account_type' => 1,
- 'change_type' => 1,
- 'user_id' => $userId,
- 'money' => $awardNum,
- 'balance' => $redheart,
- 'created_at' => date('Y-m-d H:i:s'),
- 'remark' => "{$sceneName}认证成功奖励{$awardNum}个爱心",
- ];
- AccountLog::insertGetId($accountData);
- }
- // 邀请人奖励
- $field = 'id,openid,parent_id,user_nickname,receive_share_msg,real_name,redheart';
- $inviteInfo = MemberModel::getInfo(['id'=> $inviteId], $field);
- if($inviteAwardNum && $inviteId && $inviteInfo){
- $inviteRedheart = isset($inviteInfo['redheart'])? intval($inviteInfo['redheart']) : 0;
- if(!MemberModel::saveData(['id'=> $inviteId], ['redheart'=> intval($inviteRedheart + $inviteAwardNum)])){
- Db::rollback();
- return 2125;
- }
- // 账户明细
- $accountData = [
- 'type' => 4,
- 'account_type' => 1,
- 'change_type' => 1,
- 'user_id' => $inviteId,
- 'money' => $inviteAwardNum,
- 'balance' => $inviteRedheart,
- 'created_at' => date('Y-m-d H:i:s'),
- 'remark' => "邀请用户{$nickname}完成{$sceneName}认证",
- ];
- AccountLog::insertGetId($accountData);
- }
- }
- Db::commit();
- // 推送审核信息
- $openid = isset($memberInfo['openid'])? $memberInfo['openid'] : '';
- if ($openid) {
- $realname = isset($memberInfo['real_name']) ? $memberInfo['real_name'] : '';
- $checkTime = date('Y.m.d H:i');
- $remark = $status==2? "感谢您的使用,点击进入公众号,遇见一段爱情!" : '请修改后重新提交';
- $params = [
- 'title' => $status==2? "恭喜!您的{$sceneName}认证已经通过审核!\n\n审核时间:\t{$checkTime}" : $failRemark."\n\n审核时间:\t{$checkTime}",
- 'remark' => $remark,
- 'type' => 'auth',
- 'keywords' => [
- /*'keyword1' => [
- 'value' => $realname,
- 'color' => '#173177',
- ],*/
- 'keyword1' => [
- 'value' => "{$sceneName}认证",
- 'color' => '#173177',
- ],
- 'keyword2' => [
- 'value' => $status==2? '审核通过' : '认证失败',
- 'color' => '#173177',
- ],
- ],
- 'url' => $status==2? url('/weixin/match/index', '', '', true) : url('/weixin/auth/' . $scene, '', '', true),
- ];
- PRedis::set('auths:message:u_'.$userId, ['result' => $memberInfo, 'params' => $params], 600);
- Wechat::sendTplMsg($openid, $params);
- }
- // 认证分销收益结算
- $inviteInfo = MemberModel::getInviteInfo($userId);
- $inviteId = isset($inviteInfo['invite_id'])? $inviteInfo['invite_id'] : 0;
- if($inviteInfo && $inviteId>0 && $status == 2){
- PRedis::set('markets:auth:entry:' . $scene.'_'.$userId, ['inviteInfo'=> $inviteInfo, 'memberInfo' => $memberInfo], 7200);
- $types = ['idcard'=> 5, 'education'=> 6, 'position'=> 7];
- $type = isset($types[$scene])? $types[$scene] : 0;
- if($type && !UserBalanceLog::checkHasMarket($inviteId, $userId, $type)){
- Award::marketAward($inviteId, $userId, $type);
- }
- }
- return ['id'=> $userId];
- } catch (\Exception $exception){
- // var_dump($exception);
- return 1015;
- }
- }
- /**
- * 投诉用户审核奖励
- * @param $userId 举报用户ID
- * @param array $info 举报数据:至少含举报用户、被举报用户、举报类型、举报内容、举报时间
- * @return array|false
- * @throws \think\Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- * @throws \think\exception\PDOException
- */
- public static function checkComplain($userId, $info = [])
- {
- $cid = isset($info['id'])? $info['id'] : 0;
- if(empty($cid) || Complain::where(['id'=> $cid])->value('status') != 1){
- return false;
- }
- $userInfo = MemberModel::where(['id' => $userId, 'user_status' => 1])
- ->field('id,user_login,user_nickname,openid,redheart')
- ->find();
- $nickname = isset($userInfo['user_nickname']) ? $userInfo['user_nickname'] : '';
- $redheart = isset($userInfo['redheart']) ? floatval($userInfo['redheart']) : 0;
- if (empty($userInfo)) {
- return false;
- }
- $siteInfo = cmf_get_site_info();
- $awardNum = isset($siteInfo['complain_award_redheart']) ? intval($siteInfo['complain_award_redheart']) : 0;
- if ($awardNum > 0) {
- $cuid = isset($info['c_uid'])? $info['c_uid'] : 0;
- $cUserInfo = MemberModel::alias('u')
- ->leftJoin('sg_user_profile sp','sp.userid=u.id')
- ->where(['u.id' => $cuid, 'u.user_status' => 1])
- ->field('u.id,u.openid,u.user_login,u.user_nickname,u.openid,u.redheart,sp.wechat_code')
- ->find();
- if (empty($cUserInfo)){
- return false;
- }
- // 更新状态
- //Complain::where(['id'=> $cid])->update(['status'=> 2]);
- //Db::startTrans();
- // 冻结被举报用户,2021,加多一个字段,顺便放入冻结选项
- $freezing = isset($info['remark'])? $info['remark'] : '被人举报';
- $result1=MemberModel::where(['id'=> $cuid,'user_type'=> 2])->update(['user_status'=> 0,'freezing'=> $freezing,'freezing_choose'=>$info['freezing_choose']]);
- // 奖励入账
- $result2= MemberModel::where(['id' => $userId])->update(['redheart' => moneyFormat($redheart + $awardNum), 'updated_at' => date('Y-m-d H:i:s')]);
- // echo $cuid.'::'.$userId;die();
- // 账户明细
- $dateTime = date('Y-m-d H:i:s');
- $cNickname = isset($cUserInfo['user_nickname']) ? $cUserInfo['user_nickname'] : '';
- $logData = [
- 'user_id' => $userId,
- 'type' => 4,
- 'account_type' => 1,
- 'change_type' => 1,
- 'money' => $awardNum,
- 'balance' => $redheart,
- 'remark' => "举报用户[ID:$cuid],昵称[{$cNickname}]审核通过奖励",
- 'created_at' => $dateTime,
- ];
- $result3=db('account_log')->insertGetId($logData);
- //if($result1 && $result2 && $result3){Db::commit();}else{Db::rollback();}
- // 发送模板消息给举报用户
- $openid = isset($userInfo['openid'])? $userInfo['openid'] : '';
- if($openid){
- $wechatCode = isset($cUserInfo['wechat_code'])? $cUserInfo['wechat_code'] : '暂无';
- $params = [
- 'title' => "尊敬的{$nickname}用户,您举报的用户经平台核实已审核通过,请谨慎与该用户联系\n\n被举报用户:\t{$cNickname}(昵称)\n\n对方微信号: \t{$wechatCode}\n\n申请时间:\t{$dateTime}",
- 'remark' => "脱单需主动,交友需谨慎!",
- 'type' => 'confirm',
- 'keywords' => [
- 'keyword1' => [
- 'value' => '举报用户',
- 'color' => '#173177',
- ],
- 'keyword2' => [
- 'value' => '已审核',
- 'color' => '#173177',
- ],
- ],
- ];
- Wechat::sendTplMsg($openid, $params);
- }
- // 被举报用户通知
- $cOpenid = isset($cUserInfo['openid'])? $cUserInfo['openid'] : '';
- $cnickname = isset($cUserInfo['user_nickname'])? $cUserInfo['user_nickname'] : '';
- if($cOpenid){
- $params = [
- 'title' => "尊敬的{$cnickname}用户,由于您的账号被多人举报经平台已经将您的账号冻结,若有疑问请联系平台客服\n\n举报原因:\t{$freezing}",
- 'remark' => "脱单需主动,交友需真诚!",
- 'type' => 'confirm',
- 'keywords' => [
- 'keyword1' => [
- 'value' => '举报反馈',
- 'color' => '#173177',
- ],
- 'keyword2' => [
- 'value' => '已审核',
- 'color' => '#173177',
- ],
- ],
- ];
- Wechat::sendTplMsg($cOpenid, $params);
- }
- return true;
- }
- return false;
- }
- /**
- * 获取认证记录
- * @return \think\db\Query|null
- * @throws \think\Exception\DbException
- */
- public static function getAuthNotices(){
- return AuthLog::alias('a')
- ->leftJoin('user u','u.id=a.user_id')
- ->where(['u.user_type'=> 2,'u.user_status'=> 1, 'a.status'=> 1])
- ->where('u.id','>', 0)
- ->where('a.created_at','>=', date('Y-m-d'))
- ->field('a.user_id,a.type,a.created_at,u.avatar,u.user_nickname as nickname')
- ->order('a.created_at','desc')
- ->limit(0,10)
- ->all()
- ->each(function($item, $k){
- $item['avatar'] = $item['avatar']? cmf_get_image_preview_url($item['avatar']) : '';
- $item['nickname'] = $item['nickname']? formatName($item['nickname']) : '';
- });
- }
- /**
- * 到期清除
- * @param $userId
- * @return bool
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public static function clearSignRedHeart($userId){
- $cacheKey = "cache:signs:clear:{$userId}_".date('Ym');
- if(PRedis::get($cacheKey)){
- return false;
- }
- $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;
- if(date('Y-m-d') < date('Y-m-'.$signClearDay)){
- PRedis::set($cacheKey, ['error' =>'未到清除时间','date'=> date('Y-m-d H:i:s'),'day'=> $signClearDay], rand(10, 30));
- return false;
- }
- $month = date('Y-m-01', strtotime(date('Y-m-01')) - 86400);
- $check = AccountLog::where(['user_id' => $userId, 'type'=> 13, 'status' => 2])
- ->where('created_at', '>=', $month)
- ->find();
- if($check){
- PRedis::set($cacheKey, ['error' =>'已清除过','info'=>$check,'date'=> date('Y-m-d H:i:s'),'day'=> $signClearDay], 86400);
- return false;
- }
- $info = MemberModel::where(['id'=> $userId])->field('id,openid,user_nickname,redheart')->find();
- if(empty($info)){
- return false;
- }
- // 最早
- $firstSign = AccountLog::where(['user_id'=> $userId,'type'=> 12,'status'=> 2])
- ->where('created_at','>=', $month)
- ->where('created_at','<=', date('Y-m-01 01:00:00'))
- ->order('created_at','asc')
- ->find();
- $time = isset($firstSign['created_at'])? $firstSign['created_at'] : '';
- if(empty($firstSign) || empty($time)){
- PRedis::set($cacheKey, ['first' => $firstSign,'user'=> $info], rand(10, 30));
- return false;
- }
- // 签到后总消费
- $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');
- // 退还的爱心
- $totalCost1 = AccountLog::where(['user_id'=> $userId,'type'=>3,'status'=> 2,'account_type'=> 1,'change_type'=>1])
- ->where('created_at','>=', $time)
- ->where('created_at','<', date('Y-m-01 01:00:00'))
- ->sum('money');
- $totalSign = 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');
- // 清除还有未消费爱心
- $redheart = isset($info['redheart'])? $info['redheart'] : 0;
- $clearRedheart = ($totalSign+$totalCost1-$totalCost);
- PRedis::set($cacheKey, ['first' => $firstSign,'cost'=> $totalCost,'refund'=>$totalCost1,'sign'=> $totalSign,'user'=> $info,'time'=>$time,'month'=>$month], 120);
- if($clearRedheart>0 && $clearRedheart <= $redheart){
- db()->startTrans();
- if(!db()->name('user')->where(['id' => $userId])->setDec('redheart',$clearRedheart)){
- db()->rollback();
- return 2145;
- }
- $accountData = [
- 'type' => 13,
- 'account_type' => 1,
- 'change_type' => 2,
- 'user_id' => $userId,
- 'money' => $clearRedheart,
- 'balance' => $redheart,
- 'created_at' => date('Y-m-01 00:i:s'),
- 'remark' => "签到爱心过期扣除",
- ];
- PRedis::set("cache:signs:clearLog:{$userId}", ['log' => $accountData,'user'=> $info], 86400);
- db('account_log')->insertGetId($accountData);
- db()->commit();
- PRedis::set($cacheKey, ['log' => $accountData,'first' => $firstSign,'cost'=> $totalCost,'sign'=> $totalSign,'user'=> $info], 7*24*3600);
- return true;
- }
- return false;
- }
- }
|