Member.php 14 KB

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