UserGrade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <?php
  2. /*
  3. * 用户等级接口
  4. * 时间2018-09-07
  5. * */
  6. namespace App\Api\Controller;
  7. use Biz\Account\AccountManager;
  8. //ini_set('display_errors', 1);
  9. //error_reporting(E_ALL);
  10. class UserGrade extends BaseController {
  11. //获取用户下一级流水以及
  12. public function nextVip(){
  13. $account = new AccountManager();
  14. $userinfo = $account->getCurrentUser ();
  15. $userinfo = $userinfo ? $userinfo->toarray () : [];
  16. if(empty($userinfo))Render("",-5007);
  17. $userid = $userinfo["account_identity"];
  18. if($userinfo["grade"] ==0 || $userinfo["grade"] ==-1){
  19. $nextgarade = -2;
  20. }else{
  21. $nextgarade = $userinfo["grade"]+1;
  22. }
  23. if($nextgarade==-1)$nextgarade=1;
  24. $gradeinfo = lm ('UserGrade', 'Api')->orderby("grade","asc")->get(["grade","name","rule_details"]);
  25. $gradeinfo = $gradeinfo?$gradeinfo->toarray():[];
  26. $_flow_next = 0;
  27. $_recharge_next = 0;
  28. $newuserinfo["grade_name_next"] = "";
  29. if(count($gradeinfo)<1)Render("",-5007);
  30. $newuserinfo["name"] = $userinfo["account"];
  31. $newuserinfo["cash"] = $userinfo["cash"];
  32. $newuserinfo["open_invitation"] = $userinfo["open_invitation"];
  33. $newuserinfo["grade"] = $userinfo["grade"];
  34. foreach ($gradeinfo as $v) {
  35. if ($v["grade"] == $userinfo["grade"])
  36. $newuserinfo["grade_name"] = $v["name"];
  37. if ($v["grade"] == $nextgarade) {
  38. $newuserinfo["grade_name_next"] = $v["name"];
  39. $_recharge_next = isset($v["rule_details"]) ? explode(",", $v["rule_details"])[1] : 0;
  40. $_flow_next = isset($v["rule_details"]) ? explode(",", $v["rule_details"])[2] : 0;
  41. }
  42. }
  43. //查询等级规则
  44. $nextgradeinfo = lm('UserGrade', 'Api')->select('name', 'rule', 'rule_details')->where('grade', '=', 0)->first();
  45. if (empty($nextgradeinfo)) {
  46. //Render($nextgradeinfo, "-5002", '条件不满足');
  47. return '-5002';
  48. }
  49. //升级时间
  50. $update_grade_date = self::getUserGradeUpdate($userinfo["account_identity"]);
  51. //申请通过时间
  52. $viptime = self::getUserComeVipTime($userinfo["account_identity"])['audittime'];
  53. $save = lm("MoneyRecharge","Api")->getPromotionAmount(["account_identity"=>$userid]);
  54. //查询统计数据 进行数据累加计算
  55. $flow = lm('MoneyFlowCount', 'Api')->where("account_identity", $userid)->orderBy('id', 'desc')->first();
  56. $flow = $flow ? $flow->toarray() : [];
  57. $last_time = $flow ? $flow['updated_at'] : '';
  58. $endtime = date('Y-m-d H:i:s', time()-3*24*3600);
  59. $startime = $last_time? date('Y-m-d H:i:s',strtotime($last_time)-3*24*3600):'2018-01-01 00:00:00';
  60. //每3天更新一次数据
  61. if(time()-strtotime($last_time)>=3*24*3600){
  62. $zheren = (new Nologin())->totalUserStatistics($userid,$startime,$endtime);
  63. $zheren_update = $zheren>0?$this->updateMoneyFlowCount($userid,2,$zheren):0;
  64. $bet = lm("MoneyBuy","Api")->getstreamAmount(["account_identity"=>$userid],$startime,$endtime);
  65. $sixbet = lm("SixmoneyBuy","Api")->getsixstreamAmount(["account_identity"=>$userid],$startime,$endtime);
  66. $total_pc = $bet + $sixbet;
  67. $total_pc_update = $total_pc>0?$this->updateMoneyFlowCount($userid,1,$total_pc):0;
  68. }
  69. $zheren = (new Nologin())->totalUserStatistics($userid,$endtime);
  70. $bet = lm("MoneyBuy","Api")->getstreamAmount(["account_identity"=>$userid],$endtime);
  71. $sixbet = lm("SixmoneyBuy","Api")->getsixstreamAmount(["account_identity"=>$userid],$endtime);
  72. $total_pc = $bet + $sixbet +$zheren;
  73. $total= lm('MoneyFlowCount','Api')->where(['account_identity'=>$userid,'cycle'=>'alldays'])->sum('total')+$total_pc;
  74. $newuserinfo["flow"] = $total;
  75. $newuserinfo["charge"] = $save;
  76. //距下次升级 还需流水
  77. $flow_dif = $_flow_next-$total;
  78. $newuserinfo["flow_dif_next"] = $total >= $_flow_next&&$_flow_next>0?0:($flow_dif>0?$flow_dif:0);//小于0则等级达到最大值
  79. //距下一级充值 还需要 充值
  80. $recharge_dif = $_recharge_next-$save;
  81. $newuserinfo["recharge_dif_next"] = $save >= $_recharge_next&&$_recharge_next>0?0:($recharge_dif>0?$recharge_dif:0);//小于0则等级达到最大值
  82. //最高可得彩金
  83. $lotter = lm ('lottery_money', 'Api')->where ('type', "upgrade")->first ();
  84. $lotter = $lotter?$lotter->toarray():[];
  85. $lotter_money = $lotter?json_decode($lotter["conent"],1):[];
  86. $max_lotter_money = isset($lotter_money["grade"][$nextgarade])?$lotter_money["grade"][$nextgarade]:0;
  87. $newuserinfo["lotter_money_next"] = $max_lotter_money;
  88. $newuserinfo["lotter_money_id"] = isset($lotter["id"])?$lotter["id"]:0;
  89. //条件
  90. $date = ["all"=>"","year"=>"年","mouth"=>"月","week"=>"周",];
  91. foreach ($gradeinfo as $v){
  92. if($v["grade"]<1) continue;
  93. $row["grade"] = $v["name"];
  94. $row["lotter_money"] = isset($lotter_money["grade"][$v["grade"]])?$lotter_money["grade"][$v["grade"]]:0;
  95. $rule = explode(",",$v["rule_details"]);
  96. $rule[0] = isset($date[$rule[0]])?$date[$rule[0]]:"";
  97. $row["condition"] = $rule;
  98. $newuserinfo["show_list"][]=$row;
  99. }
  100. //彩金id
  101. $newuserinfo["grade_time"] = isset($update_grade_date["create_time"])?$update_grade_date["create_time"]:($viptime?$viptime:$userinfo['register_time']);
  102. $_data = ['account_identity'=>$userinfo["account_identity"],'grade'=>$userinfo["grade"],'lottery_money_type'=>'upgrade'];
  103. $status = lm("Lottery_money_log","Api")->where($_data)->first();
  104. $status = $status?$status->toarray():[];
  105. $newuserinfo["status"] = isset($status['status'])?$status['status']:-1;
  106. //自动升级
  107. lm ('UserGrade', 'Api')->upgrade ($userinfo,$total);
  108. return $newuserinfo;
  109. }
  110. /**
  111. * 更新流水统计记录
  112. * @param $uuid
  113. * @param $lasttime
  114. * @param $type
  115. * @param $flow
  116. */
  117. private function updateMoneyFlowCount($uuid,$type,$flow){
  118. $update_flow = lm('MoneyFlowCount','Api');
  119. $info= $update_flow->where(["account_identity"=>$uuid,'money_type'=>$type])->first();
  120. $info = $info?$info->toarray():[];
  121. $update_data = [
  122. "account_identity"=>$uuid,
  123. 'updated_at'=>date('Y-m-d H:i:s'),
  124. 'created_at'=>isset($info['created_at'])?$info['created_at']:date('Y-m-d H:i:s'),
  125. 'total'=>isset($info['total'])?$flow+$info['total']:$flow,
  126. 'cycle'=>'alldays',
  127. 'money_type'=>$type
  128. ];
  129. $ret = $info?$update_flow->where(["account_identity"=>$uuid,'money_type'=>$type,'cycle'=>'alldays'])->update($update_data):$update_flow->insert($update_data);
  130. return $ret;
  131. }
  132. private function getLotteryInfo($typeOrid){
  133. $info = lm("LotterMoney","Api")->where('type',$typeOrid)->whereOr('id',$typeOrid)->first();
  134. return $info?$info->toarray():[];
  135. }
  136. public function upGradeStatus(array $data){
  137. $actvie = new Active();
  138. return $actvie->getStatus($data);
  139. }
  140. /**
  141. * 获取vip申请通过时间
  142. */
  143. private function getUserComeVipTime($userid){
  144. $res = lm("user_vip","Api")
  145. ->where(["account_identity"=>$userid,"status"=>2])
  146. ->get(['audittime'])
  147. ->first();
  148. return $res?$res->toarray():['audittime'=>''];
  149. }
  150. /**
  151. * 获取用户最新晋级信息
  152. * @param $userid 用户唯一id
  153. */
  154. private function getUserGradeUpdate($userid){
  155. $res = lm("user_log_record","Api")
  156. ->where(["account_identity"=>$userid,"type"=>"promotion"])
  157. ->orderby("id","desc")
  158. ->first();
  159. return $res?$res->toarray():[];
  160. }
  161. /**
  162. * 等级升级申请
  163. * @return [type] [description]
  164. */
  165. public function UserUpgrade(){
  166. $uinfo = $_SESSION['uinfo'];
  167. if (empty($uinfo)) {
  168. //Render(null, '-5009','条件不满足');
  169. Render("", "-5009", '');
  170. }
  171. //查询等级规则
  172. $gradelist = lm ('UserGrade', 'Api')->select ('name', 'rule', 'rule_details')->where ('grade','>',0)->get();
  173. $nextgradeinfo = lm ('UserGrade', 'Api')->select ('name', 'rule', 'rule_details')->where ('grade','=',0)->first ();
  174. if (empty($nextgradeinfo)) {
  175. //Render($nextgradeinfo, "-5002", '条件不满足');
  176. Render("", "-5002", '');
  177. }
  178. if (empty($gradelist)) {
  179. //Render($nextgradeinfo, "-5002", '条件不满足');
  180. Render("", "-5002", '');
  181. }
  182. $gradelist = $gradelist ->toArray ();
  183. $nextgradeinfo = $nextgradeinfo->toArray ();
  184. $nextgradeinfo['rule_details'] = explode (',', $nextgradeinfo['rule_details']);
  185. //查询统计数据
  186. $save = lm ('MoneyRecharge', 'Api')->where('account_identity', $uinfo['account_identity'])->where('status',1)->where('recharge_type','汇款')->where('recharge_type','后台充值')->where('recharge_type','在线充值');
  187. $bet = lm ('MoneyBuy', 'Api')->where('account_identity', $uinfo['account_identity'])->where('status','<', 4);
  188. $sixbet = lm ('SixmoneyBuy', 'Api')->where ('account_identity', $uinfo['account_identity'])->where('status','<', 4);
  189. //时间类型条件判断
  190. if ($nextgradeinfo['rule_details'][0] == 'year') {
  191. $startime = date ('Y-01-01', time ()) . ' 00:00:00';
  192. $endtime = date ('Y-12-31', time ()) . ' 23:59:59';
  193. $save = $save->where ('complete_time', '>=', $startime)->where ('complete_time', '<=', $endtime);
  194. $bet = $bet->where ('money_time', '>=', $startime)->where ('money_time', '<=', $endtime);
  195. $sixbet = $sixbet->where ('money_time', '>=', $startime)->where ('money_time', '<=', $endtime);
  196. } elseif ($nextgradeinfo['rule_details'][0] == 'month') {
  197. $startime = date ('Y-m-01', strtotime (date ('Y', time ()) . '-' . (date ('m', time ()) - 1) . '-01')) . ' 00:00:00';
  198. $endtime = date ('Y-m-d', strtotime ("$startime +1 month -1 day")) . ' 23:59:59';
  199. $save = $save->where ('complete_time', '>=', $startime)->where ('complete_time', '<=', $endtime);
  200. $bet = $bet->where ('money_time', '>=', $startime)->where ('money_time', '<=', $endtime);
  201. $sixbet = $sixbet->where ('money_time', '>=', $startime)->where ('money_time', '<=', $endtime);
  202. } elseif ($nextgradeinfo['rule_details'][0] == 'week') {
  203. $now_day = date ('w', time ()) - 1;
  204. $sunday_str = time () - $now_day * 60 * 60 * 24;
  205. $sunday = date ('Y-m-d 00:00:00', $sunday_str);
  206. $strday_str = time () + (6 - $now_day) * 60 * 60 * 24;
  207. $strday = date ('Y-m-d 23:59:59', $strday_str);
  208. $save = $save->where ('complete_time', '>=', $sunday)->where ('complete_time', '<=', $strday);
  209. $bet = $bet->where ('money_time', '>=', $sunday)->where ('money_time', '<=', $strday);
  210. $sixbet = $sixbet->where ('money_time', '>=', $sunday)->where ('money_time', '<=', $strday);
  211. } elseif ($nextgradeinfo['rule_details'][0] == 'day') {
  212. $firstday = date ('Y-m-d 00:00:00', strtotime ("-" . $nextgradeinfo['rule_details'][3] . " day"));
  213. $save = $save->where ('complete_time', '>=', $firstday)->where ('complete_time', '<=', date ('Y-m-d 23:59:59', strtotime ('-1 day')));
  214. $bet = $bet->where ('money_time', '>=', $firstday)->where ('money_time', '<=', date ('Y-m-d 23:59:59', strtotime ('-1 day')));
  215. $sixbet = $sixbet->where ('money_time', '>=', $firstday)->where ('money_time', '<=', date ('Y-m-d 23:59:59', strtotime ('-1 day')));
  216. }elseif($nextgradeinfo['rule_details'][0] == 'ymd'){
  217. $firstday = $nextgradeinfo['rule_details'][3].' 00:00:00';
  218. $save = $save->where ('complete_time', '>=', $firstday);
  219. $bet = $bet->where ('money_time', '>=', $firstday);
  220. $sixbet = $sixbet->where ('money_time', '>=', $firstday);
  221. }
  222. $save = $save->sum ('money');
  223. $bet = $bet->sum ('money');
  224. $sixbet = $sixbet->sum ('money');
  225. $total = $bet+$sixbet;
  226. $newgrade = 0;
  227. foreach($gradelist as $key =>$value){
  228. $rule_details = explode(',',$value['rule_details']);
  229. if($save >= $rule_details[1] && $total >= $rule_details[2]){
  230. $newgrade = $key;
  231. }
  232. }
  233. if ($newgrade > 0 && $newgrade > $uinfo['grade']) {
  234. $res = lm ('AccountDetail', 'Api')->where ('account_identity', $uinfo['account_identity'])->update (['grade' => $newgrade]);
  235. if ($res) {
  236. $remark['original_grade'] = $uinfo['grade'];
  237. $remark['present_grade'] = $newgrade;
  238. $remark['type'] = $nextgradeinfo['rule_details'][0];
  239. $remark['save'] = $save;
  240. $remark['bet'] = $bet + $sixbet;
  241. $data['account_identity'] = $uinfo['account_identity'];
  242. $data['remark'] = json_encode ($remark);
  243. $data['account_name'] = $uinfo['account'];
  244. $data['type'] = 'promotion';
  245. $data['create_time'] = date ('Y-m-d H:i:s');
  246. lm ('User_log_record', 'Api')->insert ($data);
  247. Render($res, "1", '');
  248. } else {
  249. Render($res, "-5007", '');
  250. }
  251. } else {
  252. Render("", "-5003", '');
  253. }
  254. }
  255. }