CscAppeal.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2018/10/31
  6. * Time: 16:56
  7. */
  8. namespace app\common\model;
  9. use think\Db;
  10. use think\Env;
  11. use think\Model;
  12. class CscAppeal extends Model
  13. {
  14. protected $table = 'cy_csc_appeal';
  15. // private $_AUTH_KEY = 'CWF8CKN1u4LDnxXZKvc30nMKqftziD8nSlbDeddre_ddsdd@ao@aoyousdk@2020';
  16. /*
  17. *获取申诉列表
  18. */
  19. public function getList($condition = [],$score = 0)
  20. {
  21. return $this->where('reason = 1 or (reason = 2 and score< :score)',['score'=>$score])
  22. ->where($condition)->field('id,username,mobile,mail,code,status,reason,score,create_time,notice_time')
  23. ->order('status asc,create_time desc')
  24. ->paginate();
  25. }
  26. /*
  27. * 获取用户申诉信息
  28. */
  29. public function getAppealResult($where)
  30. {
  31. $data = $this->where($where)->find(); //申诉信息
  32. $crTime = strtotime($data['create_time']); // 申诉时间
  33. $condition['username'] = $data['username'];
  34. $member = model('Members')->where($condition)->find(); //用户注册信息
  35. if (empty($member)) {
  36. return false;
  37. }
  38. $member['reggamename'] = $this->getGameName($member['gameid']);
  39. $member['channelname'] = $this->getChannelName($member['channel_id']);
  40. $user_id = $member['id'];
  41. //实例化用户历史数据表
  42. $historyModel = model('MemberHistory');
  43. $historyinfo = $historyModel->where(['userid'=>$user_id,'create_time'=> ['elt',$crTime] ])->select(); //历史信息
  44. $reginfo = $historyModel->where(['userid'=>$user_id,'create_time'=> ['elt',$crTime] ])->order('create_time asc')->field('mobile,email')->find(); //历史信息
  45. $bond = model('MemberChannelGame')->where('member_id',$user_id)->select(); //绑定游戏
  46. $member['reg_time'] = date("Y-m-d",$member['reg_time']);
  47. $data = $this->getArr($data);//反序列化得到申诉信息
  48. // 实例化pay模型
  49. $payModel = model('Pay');
  50. $payhistory = $payModel->where(['userid'=>$user_id,'create_time'=> ['elt',$crTime] ])->field('amount,create_time')->select();
  51. $totalpay = $payModel->where(['userid'=>$user_id,'status'=>1,'pay_time'=> ['elt',$crTime]])->sum('amount');
  52. $infos = $this->getInfos($bond,$historyinfo,$payhistory); //用户信息
  53. $config = $this->getConfig(); //配置值
  54. $firstrechargegameid = $payModel->where('userid',$user_id)->order('create_time asc')->value('gameid');
  55. $firstrechargegamename = $this->getGameName($firstrechargegameid);
  56. $recharge = $this->getRecharge($data);
  57. //ip转换地址
  58. $member['addr'] = $this->GetIpLookup($member['ip']);
  59. //判断/审核
  60. $result = $this->getResult($data, $member, $firstrechargegameid, $infos, $totalpay, $recharge,$reginfo,$user_id);
  61. //系统得分
  62. $score = $this->getScore($result,$infos,$config);
  63. $sum = array_sum($score);
  64. $array = [
  65. 'recharge' => $recharge,
  66. 'score' => $score,
  67. 'sum' => $sum,
  68. 'totalpay' => $totalpay,
  69. 'gamename' => $firstrechargegamename,
  70. 'infos' => $infos,
  71. 'data' => $data,
  72. 'member' => $member,
  73. 'result' => $result,
  74. 'reginfo' => $reginfo,
  75. 'config' => $config,
  76. ];
  77. return $array;
  78. }
  79. /**
  80. * 获取用户申诉总得分
  81. * @param [array] $data 申诉详情
  82. * @return [int] 总得分
  83. */
  84. public function getAppealScore($data)
  85. {
  86. $sum = 0;
  87. $condition['username'] = $data['username'];
  88. $member = model('Members')->where($condition)->field('id,reg_time,ip,imeil,gameid,channel_id')->find(); //用户注册信息
  89. if (empty($member)) {
  90. return $sum;
  91. }
  92. $user_id = $member['id'];
  93. $crTime = strtotime($data['create_time']); // 申诉时间
  94. //实例化用户历史数据表
  95. $historyModel = model('MemberHistory');
  96. $historyinfo = $historyModel->where(['userid'=>$user_id,'create_time'=> ['elt',$crTime] ])->select(); //历史信息
  97. $reginfo = $historyModel->where(['userid'=>$user_id,'create_time'=> ['elt',$crTime] ])->order('create_time asc')->field('mobile,email')->find(); //历史信息
  98. $bond = model('MemberChannelGame')->where('member_id',$user_id)->select(); //绑定游戏
  99. $member['reg_time'] = date("Y-m-d",$member['reg_time']);
  100. $data = $this->getArr($data);//反序列化得到申诉信息
  101. // 实例化pay模型
  102. $payModel = model('Pay');
  103. $payhistory = $payModel->where(['userid'=>$user_id,'create_time'=> ['elt',$crTime] ])->field('amount,create_time')->select();
  104. $totalpay = $payModel->where(['userid'=>$user_id,'status'=>1,'pay_time'=> ['elt',$crTime]])->sum('amount');
  105. $infos = $this->getInfos($bond,$historyinfo,$payhistory); //用户信息
  106. $config = $this->getConfig(); //配置值
  107. $firstrechargegameid = $payModel->where('userid',$user_id)->order('create_time asc')->value('gameid');
  108. //ip转换地址
  109. $member['addr'] = $this->GetIpLookup($member['ip']);
  110. $recharge = $this->getRecharge($data);
  111. //判断/审核
  112. $result = $this->getResult($data, $member, $firstrechargegameid, $infos, $totalpay, $recharge,$reginfo,$user_id);
  113. //系统得分
  114. $score = $this->getScore($result,$infos,$config);
  115. $sum = array_sum($score);
  116. return $sum;
  117. }
  118. //新浪ip转换地址
  119. function GetIpLookup($ip = ''){
  120. if(empty($ip)){
  121. return '请输入IP地址';
  122. }
  123. $res = @file_get_contents('http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip);
  124. if(empty($res)){
  125. return false;
  126. }
  127. $jsonMatches = array();
  128. preg_match('#\{.+?\}#', $res, $jsonMatches);
  129. // 经过上面的过滤步骤,会丢失 } ,故补上
  130. $jsonMatches[0] = $jsonMatches[0].'}';
  131. if(!isset($jsonMatches[0])){
  132. return false;
  133. }
  134. $json = json_decode($jsonMatches[0], true);
  135. if(isset($json['code']) && $json['code'] == 0){
  136. $json['data']['ip'] = $ip;
  137. unset($json['code']);
  138. }else{
  139. return false;
  140. }
  141. return $json['data']['country'].$json['data']['region'].$json['data']['city'];
  142. }
  143. /*
  144. * 获取游戏昵称
  145. */
  146. public function getGameName($gameid)
  147. {
  148. $gameName = model('game')->where('id',$gameid)->value('nickname');
  149. return $gameName;
  150. }
  151. /*
  152. * 获取用户注册渠道
  153. */
  154. public function getChannelName($channel_id)
  155. {
  156. $ChannelName = model('Channel')->where('id',$channel_id)->value('name');
  157. return $ChannelName;
  158. }
  159. /*
  160. * 配置分数的键值对
  161. */
  162. public function getConfig()
  163. {
  164. $list = model('CscSetting')->column('value','name');
  165. return $list;
  166. }
  167. /*
  168. * 判断正确
  169. */
  170. public function getResult($data, $member, $firstrechargegameid, $infos, $totalpay, $recharge,$reginfo,$id)
  171. {
  172. $time = strtotime($data['regtime']) - strtotime($member['reg_time']);
  173. $registed_time = time() - strtotime($member['reg_time']);
  174. if($registed_time <= 90 * 86400){ //注册时间
  175. $result['regtime'] = abs($time) <= 15 * 86400 ? 1 : 0;
  176. }
  177. if($registed_time > 90 * 86400){ //注册时间
  178. $result['regtime'] = abs($time) <= 30 * 86400 ? 1 : 0;
  179. }
  180. $result['regmobile'] = $data['regmobile'] === $reginfo['mobile'] ? 1 : 0;
  181. if($data['imei'] === $member['imeil']){ //注册imei
  182. $result['imei'] = 1;
  183. }
  184. if(empty($data['imei']) && empty($member['imeil'])){
  185. $result['imei'] = 1;
  186. }
  187. $result['imei'] = isset($result['imei']) ? 1 : 0;
  188. $result['addr'] = $data['addr'] === $member['addr'] ? 1 : 0; //注册地址
  189. $result['reggameid'] = $data['reggameid'] == $member['gameid'] ? 1 : 0; //注册来源游戏
  190. if (!$result['reggameid']){
  191. $reggame_1 = $this->getGameName($member['gameid']);
  192. if ($reggame_1 == $data['reggamename']){
  193. $result['reggameid'] = 1;
  194. }
  195. }
  196. $result['firstrechargegameid'] = $data['firstrechargegameid'] == $firstrechargegameid ? 1 : 0; //首次充值游戏
  197. if (!$result['firstrechargegameid']){
  198. $firstrechargegame_1 = $this->getGameName($firstrechargegameid);
  199. if ($firstrechargegame_1 == $data['firstrechargegamename']){
  200. $result['firstrechargegameid'] = 1;
  201. }
  202. }
  203. if(intval($data['totalrecharge']) >= intval($totalpay)*0.9 && intval($data['totalrecharge']) <= intval($totalpay)*1.1){ //累计充值金额
  204. $result['totalrecharge'] = 1;
  205. }else{
  206. $result['totalrecharge'] = 0;
  207. }
  208. $result['regchannelid'] = $data['regchannelid'] === $member['channel_id'] ? 1 : 0; //注册渠道id
  209. foreach ($data['oldpwd'] as $oldpwd){ //历史密码
  210. if(in_array($oldpwd,$infos['oldpwd'])){
  211. $result['oldpwd'][] = 1;
  212. }else{
  213. $result['oldpwd'][] = 0;
  214. }
  215. }
  216. foreach ($data['oldmail'] as $oldmail){ //历史邮箱
  217. if(in_array($oldmail,$infos['oldmail'])){
  218. $result['oldmail'][] = 1;
  219. }else{
  220. $result['oldmail'][] = 0;
  221. }
  222. }
  223. foreach ($data['oldmobile'] as $oldmobile){ //历史手机
  224. if(in_array($oldmobile,$infos['oldmobile'])){
  225. $result['oldmobile'][] = 1;
  226. }else{
  227. $result['oldmobile'][] = 0;
  228. }
  229. }
  230. foreach ($data['boundgameid'] as $boundgameid){ //绑定过的游戏
  231. $boundgame = $this->getGameName($boundgameid);
  232. if(in_array($boundgame,$infos['boundgameid'])){
  233. $result['boundgameid'][] = 1;
  234. }else{
  235. $result['boundgameid'][] = 0;
  236. }
  237. }
  238. // 历史充值记录判断,已经参与判断正确的历史记录,不再参与后续的判断,避免重复判断
  239. $arr = [];
  240. foreach($recharge as $key => $pay){
  241. $condition['amount'] = $pay['rechargeamount'];
  242. $condition['userid'] = $id;
  243. $times = model('Pay')->where($condition)->field('create_time,id')->select();
  244. foreach ($times as $time){
  245. $first_time = strtotime($time['create_time']) - 3600;
  246. $last_time = strtotime($time['create_time']) + 3600;
  247. if(!in_array($time['id'],$arr) && strtotime($pay['rechargetime']) > $first_time && strtotime($pay['rechargetime']) < $last_time){
  248. $result['recharge'][$key] = 1;
  249. $arr[] = $time['id'];
  250. break;
  251. }else{
  252. $result['recharge'][$key] = 0;
  253. }
  254. }
  255. /*if( isset($result['recharge'][$key]) && $result['recharge'][$key] == 1){ //由于当前正确一个就给全部分数,为节省资源,出现正确就跳出循环
  256. break;
  257. }*/
  258. }
  259. return $result;
  260. }
  261. //获取申诉各项信息得分情况
  262. public function getScore($result,$infos,$config){
  263. $count['result']['oldpwd'] = isset($result['oldpwd']) ? ( in_array(1,$result['oldpwd']) ? count($result['oldpwd']) : 0 ) : 0;
  264. $count['result']['oldmail'] = isset($result['oldmail']) ? (in_array(1,$result['oldmail']) ? count($result['oldmail']) : 0 ) : 0;
  265. $count['result']['oldmobile'] = isset($result['oldmobile']) ? (in_array(1,$result['oldmobile']) ? count($result['oldmobile']) : 0 ) : 0;
  266. $count['result']['boundgameid'] = isset($result['boundgameid']) ? (in_array(1,$result['boundgameid']) ? count($result['boundgameid']) : 0 ) : 0;
  267. $count['result']['recharge'] = isset($result['recharge']) ? (in_array(1,$result['recharge']) ? count($result['recharge']) : 0 ) : $result['recharge']=[];
  268. $count['infos']['pay'] = isset($infos['pay']) ? count($infos['pay']) : 0;
  269. $count['infos']['oldpwd'] = isset($infos['oldpwd']) ? count($infos['oldpwd']) : 0;
  270. $count['infos']['oldmail'] = isset($infos['oldmail']) ? count($infos['oldmail']) : 0;
  271. $count['infos']['oldmobile'] = isset($infos['oldmobile']) ? count($infos['oldmobile']) : 0;
  272. $count['infos']['boundgameid'] = isset($infos['boundgameid']) ? count($infos['boundgameid']) : 0;
  273. //单选分数
  274. $score['regmobile'] = isset($result['regmobile']) ? ($result['regmobile'] * $config['MARK_REGISTERED_MOBILE_PHONE']) : 0;
  275. $score['addr'] = isset($result['addr']) ? ($result['addr'] * $config['MARK_REGISTRATION_ADDRESS']) : 0;
  276. $score['regtime'] = isset($result['regtime']) ? ($result['regtime'] * $config['MARK_REGISTRATION_TIME']) : 0;
  277. $score['imei'] = isset($result['imei']) ? ($result['imei'] * $config['MARK_REGISTRATION_IEMI']) : 0;
  278. $score['reggameid'] = isset($result['reggameid']) ? ($result['reggameid'] * $config['MARK_SOURCE_OF_REGISTRATION']) : 0;
  279. $score['firstrechargegameid'] = isset($result['firstrechargegameid']) ? ($result['firstrechargegameid'] * $config['MARK_FIRST_CHARGE']) : 0;
  280. $score['totalrecharge'] = isset($result['totalrecharge']) ? ($result['totalrecharge'] * $config['MARK_ACCUMULATED_AMOUNT'] ) : 0;
  281. $score['regchannelid'] = isset($result['regchannelid']) ? ($result['regchannelid'] * $config['MARK_REGISTRATION_CHANNE']) : 0;
  282. //多选分数(对一个就满分)
  283. $score['oldpwd'] = empty($count['result']['oldpwd']) ? 0 : $config['MARK_HISTORY_PASSWORD'];
  284. $score['oldmail'] = empty($count['result']['oldmail']) ? 0 : ($config['MARK_HISTORY_MAILBOX']);
  285. $score['oldmobile'] = empty($count['result']['oldmobile']) ? 0 : ($config['MARK_HISTORY_MOBILE_PHONE']);
  286. $score['boundgameid'] = empty($count['result']['boundgameid']) ? 0 : ($config['MARK_BINDING_GAME']);
  287. // 充值记录(对几个,得几分)
  288. $num = 0;
  289. foreach ($result['recharge'] as $v){
  290. if ($v == 1) $num++;
  291. }
  292. $score['recharge'] = empty($count['result']['recharge']) ? 0 : ($config['MARK_RECHARGE_RECORD'] * $num);
  293. return $score;
  294. }
  295. //获取用户申诉数据
  296. public function getArr($data){
  297. $data['oldpwd'] = unserialize($data['oldpwd']);
  298. foreach ($data['oldpwd'] as $password){
  299. $pwd[] = auth_code($password,"ENCODE", Env::get('auth_key'));
  300. }
  301. $data['reggamename'] = $this->getGameName($data['reggameid']);
  302. $data['firstrechargegamename'] = $this->getGameName($data['firstrechargegameid']);
  303. $data['channelname'] = $this->getChannelName($data['regchannelid']);
  304. $data['oldpwd'] = $pwd;
  305. $data['oldmail'] = unserialize($data['oldmail']);
  306. $data['oldmobile'] = unserialize($data['oldmobile']);
  307. $data['boundgameid'] = unserialize($data['boundgameid']);
  308. $data['regtime'] = date("Y-m-d",$data['regtime']);
  309. $data['rechargetime'] = unserialize($data['rechargetime']);
  310. $data['rechargeamount'] = unserialize($data['rechargeamount']);
  311. return $data;
  312. }
  313. //获取用户系统保留数据
  314. public function getInfos($bond,$historyinfo,$payhistory){
  315. $boundgame = $pwd = $mail = $mobile = $pay = [];
  316. foreach ($bond as $bondinfo){
  317. $boundgame[] = $this->getGameName($bondinfo['game_id']);
  318. }
  319. foreach($historyinfo as $history){
  320. $pwd[] = $history['password'];
  321. $mail[] = $history['email'];
  322. $mobile[] = $history['mobile'];
  323. }
  324. foreach ($payhistory as $value) {
  325. $pay[] = $value['create_time'].'充值'.$value['amount'];
  326. }
  327. $infos = array();
  328. $infos['oldpwd'] = array_flip(array_flip(array_filter($pwd)));
  329. $infos['oldmail'] = array_flip(array_flip(array_filter($mail)));
  330. $infos['oldmobile'] = array_flip(array_flip(array_filter($mobile)));
  331. $infos['boundgameid'] = array_flip(array_flip(array_filter($boundgame)));
  332. $infos['payhistory'] = array_flip(array_flip(array_filter($pay)));
  333. return $infos;
  334. }
  335. //获取历史充值数据结果
  336. public function getRecharge($data){
  337. $recharge = [];
  338. if(is_array($data['rechargetime'])){
  339. foreach ($data['rechargetime'] as $key => $rechargeinfo){
  340. $recharge[$key] = array(
  341. 'rechargetime' => $rechargeinfo,
  342. 'rechargeamount' => isset($data['rechargeamount'][$key]) ? $data['rechargeamount'][$key] : '',
  343. 'result' => 0,
  344. );
  345. }
  346. }
  347. return $recharge;
  348. }
  349. /**
  350. * @param $id id
  351. * @param $data 数据
  352. * @return false|int
  353. */
  354. public function updateAppeal($data, $id = 0)
  355. {
  356. return $this->save($data, ['id'=>$id]);
  357. }
  358. }