ranklist_helper.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/7/22
  6. * Time: 下午4:33
  7. */
  8. require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
  9. require_once(BASE_ROOT_PATH . '/helper/date_helper.php');
  10. class ranklist_helper
  11. {
  12. const start_date = '2016-08-01';
  13. static private function date_stamp()
  14. {
  15. $num = func_num_args();
  16. if($num == 0) {
  17. $day = new DateTime();
  18. $day->setTimestamp(time());
  19. $day->setTime(0,0,0);
  20. return $day->getTimestamp();
  21. }
  22. else if($num == 1) {
  23. $time = func_get_arg(0);
  24. $day = new DateTime();
  25. $day->setTimestamp($time);
  26. $day->setTime(0,0,0);
  27. return $day->getTimestamp();
  28. }
  29. else if($num == 3) {
  30. $year = func_get_arg(0);
  31. $mon = func_num_arg(1);
  32. $mday = func_get_arg(2);
  33. $day = new DateTime();
  34. $day->setDate($year,$mon,$mday);
  35. $day->setTime(0,0,0);
  36. return $day->getTimestamp();
  37. }
  38. else {
  39. return false;
  40. }
  41. }
  42. static public function make_sn($member_id,$time)
  43. {
  44. $date_time = self::date_stamp($time);
  45. $sn = md5("{$member_id}-{$date_time}");
  46. return $sn;
  47. }
  48. static public function add_money($member_id,$bonus_val)
  49. {
  50. $top_list = ranklist::create_by_date($member_id,self::date_stamp());
  51. if($top_list == false) {
  52. return false;
  53. } else {
  54. $top_list->add_money($bonus_val);
  55. return true;
  56. }
  57. }
  58. static private function interval_days($end_time)
  59. {
  60. $now_date = new DateTime('now');
  61. $dt = new DateTime();
  62. $dt->setTimestamp($end_time);
  63. $dt->setTime(0,0,0);
  64. return $now_date->diff($dt)->days;
  65. }
  66. static private function def_start_time()
  67. {
  68. $param = date_parse(self::start_date);
  69. $dt = new DateTime();
  70. $dt->setDate($param['year'],$param['month'],$param['day']);
  71. $dt->setTime(0,0,0);
  72. return $dt->getTimestamp();
  73. }
  74. public static function list_count($member_id)
  75. {
  76. try
  77. {
  78. $minfo = new member_info($member_id);
  79. $reg_time = $minfo->reg_time();
  80. if($reg_time <= 0) {
  81. return self::interval_days(self::def_start_time());
  82. }
  83. elseif($reg_time <= self::def_start_time()) { // 注册时间,比该功能推出时间早
  84. return self::interval_days(self::def_start_time());
  85. }
  86. else {
  87. return self::interval_days($reg_time);
  88. }
  89. }
  90. catch (Exception $ex) {
  91. return false;
  92. }
  93. }
  94. public static function gen_ranklist($list_sn,&$userid,&$err)
  95. {
  96. $rank = ranklist::create_by_sn($list_sn);
  97. if($rank == false) {
  98. $err = array(errcode::ErrParamter,'该排行榜不存在或者已经过期~');
  99. return false;
  100. }
  101. $friends = $rank->get_friends();
  102. $userid = $rank->member_id();
  103. $mod_rank = Model('bonus_ranklist');
  104. $cond = array('list_date' => $rank->list_date(),'member_id' => array('in',$friends));
  105. $items = $mod_rank->getRanklist($cond,'*','list_value desc');
  106. if(!empty($items)) {
  107. $top = ranklist::create_by_store($items[0]);
  108. $rank->set_top($top->member_id(),$top->money());
  109. }
  110. return $items;
  111. }
  112. public static function calc_top(ranklist &$top)
  113. {
  114. $member_id = $top->member_id();
  115. $list_date = $top->list_date();
  116. if(empty($top->get_friends()))
  117. {
  118. $relation = new \relation\mem_relation($_SESSION['member_id']);
  119. $friends = array_merge($relation->follower(),$relation->subscriber());
  120. array_push($friends,intval($member_id));
  121. $cur_friends = array();
  122. foreach ($friends as $val) {
  123. if(!empty($val) && intval($val) > 0) {
  124. array_push($cur_friends,intval($val));
  125. }
  126. }
  127. $top->set_friends($cur_friends);
  128. } else {
  129. $friends = $top->get_friends();
  130. }
  131. $mod_top = Model('bonus_ranklist');
  132. $items = $mod_top->getRanklist(array('member_id' => array('in',$friends),'list_date' => $list_date),'*','list_value desc');
  133. if(empty($items)) {
  134. $top->set_top($member_id,$top->money());
  135. $top->set_rank(0);
  136. }
  137. else
  138. {
  139. $first = true;
  140. $index = 0;
  141. $finded = false;
  142. foreach ($items as $val)
  143. {
  144. $obj = ranklist::create_by_store($val);
  145. if($first) {
  146. $top->set_top($obj->member_id(),$obj->money());
  147. $first = false;
  148. }
  149. if($obj->member_id() == $top->member_id()) {
  150. $top->set_rank($index);
  151. $finded = true;
  152. }
  153. ++$index;
  154. }
  155. if($finded == false) {
  156. $top->set_rank($index);
  157. }
  158. }
  159. }
  160. public static function ranklists($member_id, $times)
  161. {
  162. $ret_list = array();
  163. foreach ($times as $val) {
  164. $ret_list[$val] = null;
  165. }
  166. $mod_top = Model('bonus_ranklist');
  167. $items = $mod_top->getRanklist(array('member_id' => $member_id,'list_date' => array('in',$times)),'*','list_date desc');
  168. foreach ($items as $item)
  169. {
  170. $top = ranklist::create_by_store($item);
  171. if($top->calculated() == false) {
  172. self::calc_top($top);
  173. }
  174. $ret_list[$top->list_date()] = $top;
  175. }
  176. foreach ($ret_list as $key => $val)
  177. {
  178. if(is_null($val)) {
  179. $top = ranklist::create_by_date($member_id,$key);
  180. if($top->calculated() == false) {
  181. self::calc_top($top);
  182. }
  183. $ret_list[$top->list_date()] = $top;
  184. }
  185. }
  186. return $ret_list;
  187. }
  188. }