Member.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. /**
  3. * 会员服务
  4. */
  5. namespace app\weixin\service;
  6. use app\weixin\model\AccountLog;
  7. use app\weixin\model\AuthLog;
  8. use app\weixin\model\Complain;
  9. use app\weixin\model\UserBalanceLog;
  10. use app\weixin\model\UserProfile;
  11. use app\weixin\model\Member as MemberModel;
  12. use app\weixin\model\Wechat;
  13. use think\Db;
  14. class Member
  15. {
  16. /**
  17. * 会员信息认证审核
  18. * @param $userId 用户ID
  19. * @param $status 审核状态:2-成功,3-失败
  20. * @param string $scene 审核类型:idcard-身份证,education-学历,position-职业/工作
  21. * @param string $failRemark 审核失败原因
  22. * @return array|int
  23. */
  24. public static function checkAuth($userId, $status, $scene='idcard', $failRemark=''){
  25. try {
  26. // 验证认证信息是否存在
  27. $field = 'id,userid,idcard,idcard_check,education_check,position_check';
  28. $info = UserProfile::getInfo(['userid'=> $userId],$field);
  29. if(empty($info)){
  30. return 2122;
  31. }
  32. if(!in_array($status, [2,3])){
  33. return 2127;
  34. }
  35. //var_dump($info);
  36. // 审核处理
  37. $sceneNames = ['idcard'=>'身份证','education'=> '学历','position'=> '工作'];
  38. switch($scene){
  39. case 'idcard': // 身份认证审核
  40. // 验证状态
  41. $idcardCheck = isset($info['idcard_check'])? intval($info['idcard_check']) : 0;
  42. if($idcardCheck != 0 && $idcardCheck != 1 && $status == 2){
  43. return 2123;
  44. }
  45. $data = [
  46. 'idcard_check'=> $status,
  47. 'idcard_online_check'=> $status==3? 0 : 1,
  48. 'idcard_fail'=> $failRemark? trim($failRemark) : '',
  49. ];
  50. break;
  51. case 'education': // 学历认证审核
  52. // 验证状态
  53. $educationCheck = isset($info['education_check'])? intval($info['education_check']) : 0;
  54. if($educationCheck != 0 && $educationCheck != 1 && $status == 2){
  55. return 2123;
  56. }
  57. $data = [
  58. 'education_check'=> $status,
  59. 'education_fail'=> $failRemark? trim($failRemark) : '',
  60. ];
  61. break;
  62. case 'position': // 工作认证审核
  63. // 验证状态
  64. $positionCheck = isset($info['position_check'])? intval($info['position_check']) : 0;
  65. if($positionCheck != 0 && $positionCheck != 1 && $status == 2){
  66. return 2123;
  67. }
  68. $data = [
  69. 'position_check'=> $status,
  70. 'position_fail'=> $failRemark? trim($failRemark) : '',
  71. ];
  72. break;
  73. default:
  74. return 2126;
  75. break;
  76. }
  77. // 更新数据处理
  78. Db::startTrans();
  79. if(!UserProfile::saveData(['userid'=> $userId], $data)){
  80. Db::rollback();
  81. return 2125;
  82. }
  83. // 审核通过奖励处理
  84. $remark = '';
  85. $sceneName = isset($sceneNames[$scene])? $sceneNames[$scene] : '信息';
  86. $field = 'id,openid,user_nickname,real_name,redheart';
  87. $memberInfo = MemberModel::getInfo(['id'=> $userId], $field);
  88. if($status == 2){
  89. // 身份认证更新生日
  90. $idcard = isset($info['idcard'])? trim($info['idcard']) : '';
  91. if($scene == 'idcard' && $idcard){
  92. $birthday = substr($idcard, 6,8);
  93. $birthday = substr($birthday,0,4).'-'.substr($birthday,4,2).'-'.substr($birthday,6,2);
  94. $birthday = $birthday? strtotime($birthday) : 0;
  95. if($birthday){
  96. MemberModel::saveData(['id'=> $userId], ['birthday'=> $birthday]);
  97. }
  98. }
  99. $siteInfo = cmf_get_site_info();
  100. $awardNum = isset($siteInfo[$scene.'_award_redheart'])? intval($siteInfo[$scene.'_award_redheart']) : 0;
  101. if($awardNum){
  102. $redheart = isset($memberInfo['redheart'])? intval($memberInfo['redheart']) : 0;
  103. if(!MemberModel::saveData(['id'=> $userId], ['redheart'=> intval($redheart + $awardNum)])){
  104. Db::rollback();
  105. return 2125;
  106. }
  107. // 账户明细
  108. $remark = "{$sceneName}认证成功奖励{$awardNum}个爱心";
  109. $accountData = [
  110. 'type' => 4,
  111. 'account_type' => 1,
  112. 'change_type' => 1,
  113. 'user_id' => $userId,
  114. 'money' => $awardNum,
  115. 'balance' => $redheart,
  116. 'created_at' => date('Y-m-d H:i:s'),
  117. 'remark' => "{$sceneName}认证成功奖励{$awardNum}个爱心",
  118. ];
  119. AccountLog::insertGetId($accountData);
  120. }
  121. }
  122. Db::commit();
  123. // 推送审核信息
  124. $openid = isset($memberInfo['openid'])? $memberInfo['openid'] : '';
  125. if ($openid) {
  126. $realname = isset($memberInfo['real_name']) ? $memberInfo['real_name'] : '';
  127. $checkTime = date('Y.m.d H:i');
  128. $remark = $status==2? "感谢您的使用,点击进入公众号,遇见一段爱情!" : '请修改后重新提交';
  129. $params = [
  130. 'title' => $status==2? "恭喜!您的{$sceneName}认证已经通过审核!\n\n审核时间:\t{$checkTime}" : $failRemark."\n\n审核时间:\t{$checkTime}",
  131. 'remark' => $remark,
  132. 'type' => 'auth',
  133. 'keywords' => [
  134. /*'keyword1' => [
  135. 'value' => $realname,
  136. 'color' => '#173177',
  137. ],*/
  138. 'keyword1' => [
  139. 'value' => "{$sceneName}认证",
  140. 'color' => '#173177',
  141. ],
  142. 'keyword2' => [
  143. 'value' => $status==2? '审核通过' : '认证失败',
  144. 'color' => '#173177',
  145. ],
  146. ],
  147. 'url' => $status==2? url('/weixin/match/index', '', '', true) : url('/weixin/auth/' . $scene, '', '', true),
  148. ];
  149. PRedis::set('auths:message:u_'.$userId, ['result' => $memberInfo, 'params' => $params], 600);
  150. Wechat::sendTplMsg($openid, $params);
  151. }
  152. // 认证分销收益结算
  153. $inviteInfo = MemberModel::getInviteInfo($userId);
  154. $inviteId = isset($inviteInfo['invite_id'])? $inviteInfo['invite_id'] : 0;
  155. if($inviteInfo && $inviteId>0 && $status == 2){
  156. PRedis::set('markets:auth:entry:' . $scene.'_'.$userId, ['inviteInfo'=> $inviteInfo, 'memberInfo' => $memberInfo], 7200);
  157. $types = ['idcard'=> 5, 'education'=> 6, 'position'=> 7];
  158. $type = isset($types[$scene])? $types[$scene] : 0;
  159. if($type && !UserBalanceLog::checkHasMarket($inviteId, $userId, $type)){
  160. Award::marketAward($inviteId, $userId, $type);
  161. }
  162. }
  163. return ['id'=> $userId];
  164. } catch (\Exception $exception){
  165. // var_dump($exception);
  166. return 1015;
  167. }
  168. }
  169. /**
  170. * 投诉用户审核奖励
  171. * @param $userId 举报用户ID
  172. * @param array $info 举报数据:至少含举报用户、被举报用户、举报类型、举报内容、举报时间
  173. * @return array|false
  174. * @throws \think\Exception
  175. * @throws \think\db\exception\DataNotFoundException
  176. * @throws \think\db\exception\ModelNotFoundException
  177. * @throws \think\exception\DbException
  178. * @throws \think\exception\PDOException
  179. */
  180. public static function checkComplain($userId, $info = [])
  181. {
  182. $cid = isset($info['id'])? $info['id'] : 0;
  183. if(empty($cid) || Complain::where(['id'=> $cid])->value('status') != 1){
  184. return false;
  185. }
  186. $userInfo = MemberModel::where(['id' => $userId, 'user_status' => 1])
  187. ->field('id,user_login,user_nickname,openid,redheart')
  188. ->find();
  189. $nickname = isset($userInfo['user_nickname']) ? $userInfo['user_nickname'] : '';
  190. $redheart = isset($userInfo['redheart']) ? floatval($userInfo['redheart']) : 0;
  191. if (empty($userInfo)) {
  192. return false;
  193. }
  194. $siteInfo = cmf_get_site_info();
  195. $awardNum = isset($siteInfo['complain_award_redheart']) ? intval($siteInfo['complain_award_redheart']) : 0;
  196. if ($awardNum > 0) {
  197. $cuid = isset($info['c_uid'])? $info['c_uid'] : 0;
  198. $cUserInfo = MemberModel::alias('u')
  199. ->leftJoin('sg_user_profile sp','sp.userid=u.id')
  200. ->where(['u.id' => $cuid, 'u.user_status' => 1])
  201. ->field('u.id,u.openid,u.user_login,u.user_nickname,u.openid,u.redheart,sp.wechat_code')
  202. ->find();
  203. if (empty($cUserInfo)){
  204. return false;
  205. }
  206. // 更新状态
  207. //Complain::where(['id'=> $cid])->update(['status'=> 2]);
  208. //Db::startTrans();
  209. // 冻结被举报用户,2021,加多一个字段,顺便放入冻结选项
  210. $freezing = isset($info['remark'])? $info['remark'] : '被人举报';
  211. $result1=MemberModel::where(['id'=> $cuid,'user_type'=> 2])->update(['user_status'=> 0,'freezing'=> $freezing,'freezing_choose'=>$info['freezing_choose']]);
  212. // 奖励入账
  213. $result2= MemberModel::where(['id' => $userId])->update(['redheart' => moneyFormat($redheart + $awardNum), 'updated_at' => date('Y-m-d H:i:s')]);
  214. // echo $cuid.'::'.$userId;die();
  215. // 账户明细
  216. $dateTime = date('Y-m-d H:i:s');
  217. $cNickname = isset($cUserInfo['user_nickname']) ? $cUserInfo['user_nickname'] : '';
  218. $logData = [
  219. 'user_id' => $userId,
  220. 'type' => 4,
  221. 'account_type' => 1,
  222. 'change_type' => 1,
  223. 'money' => $awardNum,
  224. 'balance' => $redheart,
  225. 'remark' => "举报用户[ID:$cuid],昵称[{$cNickname}]审核通过奖励",
  226. 'created_at' => $dateTime,
  227. ];
  228. $result3=db('account_log')->insertGetId($logData);
  229. //if($result1 && $result2 && $result3){Db::commit();}else{Db::rollback();}
  230. // 发送模板消息给举报用户
  231. $openid = isset($userInfo['openid'])? $userInfo['openid'] : '';
  232. if($openid){
  233. $wechatCode = isset($cUserInfo['wechat_code'])? $cUserInfo['wechat_code'] : '暂无';
  234. $params = [
  235. 'title' => "尊敬的{$nickname}用户,您举报的用户经平台核实已审核通过,请谨慎与该用户联系\n\n被举报用户:\t{$cNickname}(昵称)\n\n对方微信号: \t{$wechatCode}\n\n申请时间:\t{$dateTime}",
  236. 'remark' => "脱单需主动,交友需谨慎!",
  237. 'type' => 'confirm',
  238. 'keywords' => [
  239. 'keyword1' => [
  240. 'value' => '举报用户',
  241. 'color' => '#173177',
  242. ],
  243. 'keyword2' => [
  244. 'value' => '已审核',
  245. 'color' => '#173177',
  246. ],
  247. ],
  248. ];
  249. Wechat::sendTplMsg($openid, $params);
  250. }
  251. // 被举报用户通知
  252. $cOpenid = isset($cUserInfo['openid'])? $cUserInfo['openid'] : '';
  253. $cnickname = isset($cUserInfo['user_nickname'])? $cUserInfo['user_nickname'] : '';
  254. if($cOpenid){
  255. $params = [
  256. 'title' => "尊敬的{$cnickname}用户,由于您的账号被多人举报经平台已经将您的账号冻结,若有疑问请联系平台客服\n\n举报原因:\t{$freezing}",
  257. 'remark' => "脱单需主动,交友需真诚!",
  258. 'type' => 'confirm',
  259. 'keywords' => [
  260. 'keyword1' => [
  261. 'value' => '举报反馈',
  262. 'color' => '#173177',
  263. ],
  264. 'keyword2' => [
  265. 'value' => '已审核',
  266. 'color' => '#173177',
  267. ],
  268. ],
  269. ];
  270. Wechat::sendTplMsg($cOpenid, $params);
  271. }
  272. return true;
  273. }
  274. return false;
  275. }
  276. /**
  277. * 获取认证记录
  278. * @return \think\db\Query|null
  279. * @throws \think\Exception\DbException
  280. */
  281. public static function getAuthNotices(){
  282. return AuthLog::alias('a')
  283. ->leftJoin('user u','u.id=a.user_id')
  284. ->where(['u.user_type'=> 2,'u.user_status'=> 1, 'a.status'=> 1])
  285. ->where('u.id','>', 0)
  286. ->where('a.created_at','>=', date('Y-m-d'))
  287. ->field('a.user_id,a.type,a.created_at,u.avatar,u.user_nickname as nickname')
  288. ->order('a.created_at','desc')
  289. ->limit(0,10)
  290. ->all()
  291. ->each(function($item, $k){
  292. $item['avatar'] = $item['avatar']? cmf_get_image_preview_url($item['avatar']) : '';
  293. $item['nickname'] = $item['nickname']? formatName($item['nickname']) : '';
  294. });
  295. }
  296. }