Ltv.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. /**
  3. * Ltv.php UTF-8
  4. * LTV计算
  5. *
  6. * @date : 2018/3/26 13:47
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huolib\ads;
  13. use huo\model\ads\LtvModel;
  14. class Ltv {
  15. private $ltv_model;
  16. public function __construct() {
  17. $this->ltv_model = new LtvModel();
  18. }
  19. /**
  20. * 注册
  21. *
  22. * @param int $reg_app_id
  23. * @param int $reg_agent_id
  24. * @param int $reg_time
  25. * @param bool $new_device
  26. * @param int $mem_cnt 注册人数
  27. */
  28. public function reg($reg_app_id, $reg_agent_id, $reg_time = 0, $new_device = true, $mem_cnt = 1) {
  29. $_reg_time = $reg_time;
  30. if (empty($reg_time)) {
  31. $_reg_time = time();
  32. }
  33. $_date = date('Y-m-d', $_reg_time);
  34. $_data = $this->ltv_model->readData($_date, $reg_app_id, $reg_agent_id);
  35. $_is_new = false;
  36. if (empty($_data)) {
  37. $_is_new = true;
  38. $_data['reg_cnt'] = $mem_cnt;
  39. if (true == $new_device) {
  40. $_data['reg_device_cnt'] = $mem_cnt;
  41. }
  42. } else {
  43. $_data['reg_cnt'] += 1;
  44. if (true == $new_device) {
  45. $_data['reg_device_cnt'] += $mem_cnt;
  46. }
  47. }
  48. $_data['date'] = $_date;
  49. $_data['app_id'] = $reg_app_id;
  50. $_data['agent_id'] = $reg_agent_id;
  51. $_re = $this->ltv_model->saveData($_date, $reg_app_id, $reg_agent_id, $_data, $_is_new);
  52. if ($_re) {
  53. }
  54. }
  55. /**
  56. * 充值插入
  57. *
  58. * @param int $reg_app_id 注册游戏ID
  59. * @param int $reg_agent_id 注册渠道ID
  60. * @param int $pay_app_id 充值游戏ID
  61. * @param double $money 充值金额
  62. * @param int $pay_time 充值时间
  63. * @param int $reg_time 注册时间
  64. *
  65. * @return bool
  66. */
  67. public function charge($reg_app_id, $reg_agent_id, $pay_app_id, $money, $pay_time = 0, $reg_time = 0) {
  68. if ($money < 0.01) {
  69. return false;
  70. }
  71. if ($reg_app_id != $pay_app_id) {
  72. // TODO: wuyonghong 2018/3/26 不计算其他游戏收益
  73. // return true;
  74. $reg_app_id=$pay_app_id;
  75. }
  76. $_reg_time = $reg_time;
  77. if (empty($reg_time)) {
  78. $_reg_time = time();
  79. }
  80. $_reg_date = date('Y-m-d', $_reg_time);
  81. $_data = $this->ltv_model->readData($_reg_date, $reg_app_id, $reg_agent_id);
  82. if (empty($_data)) {
  83. /* 查询 $_reg_date 注册人数 */
  84. $_start_time = strtotime($_reg_date);
  85. $_end_time = $_start_time;
  86. $_map['create_time'] = ['egt', $_start_time];
  87. $_map['create_time'] = ['lt', $_end_time];
  88. $_map['agent_id'] = $reg_agent_id;
  89. $_map['app_id'] = $reg_app_id;
  90. $_history_mem_cnt = (new \huo\model\member\MemberModel())->total($_map);//\think\Db::name('members')->where($_map)->count();
  91. $this->reg($reg_app_id, $reg_agent_id, $_reg_time, true, $_history_mem_cnt);
  92. /* 查询充值数据 */
  93. $_pay_map['create_time'] = ['egt', $_start_time];
  94. $_pay_map['create_time'] = ['lt', $_end_time];
  95. $_pay_map['status'] = 2;
  96. $_pay_map['agent_id'] = $reg_agent_id;
  97. $_pay_map['app_id'] = $reg_app_id;
  98. $_history_money = (new \huo\model\order\OrderModel())->totalMoney($_pay_map);
  99. $money = $_history_money;
  100. $_data = $this->ltv_model->readData($_reg_date, $reg_app_id, $reg_agent_id);
  101. }
  102. $_diff_day = $this->time_diff(strtotime($_reg_date), $pay_time);
  103. $_data['sum_money'] += $money;
  104. if ($_diff_day <= 360) {
  105. $_data['day360'] += $money;
  106. }
  107. if ($_diff_day <= 270) {
  108. $_data['day270'] += $money;
  109. }
  110. if ($_diff_day <= 180) {
  111. $_data['day180'] += $money;
  112. }
  113. if ($_diff_day <= 90) {
  114. $_data['day90'] += $money;
  115. }
  116. for ($_i = 60; $_i > 0; $_i--) {
  117. /* 记录60天以下 */
  118. if ($_diff_day > $_i) {
  119. break;
  120. }
  121. $_day_key = 'day'.$_i;
  122. $_data[$_day_key] += $money;
  123. }
  124. return $this->ltv_model->saveData($_reg_date, $reg_app_id, $reg_agent_id, $_data);
  125. }
  126. /**
  127. * 更新花费
  128. *
  129. * @param string $date 更新日期
  130. * @param int $app_id 游戏ID
  131. * @param int $agent_id 推广ID
  132. * @param float $costs 花费
  133. *
  134. * @return bool
  135. */
  136. public function updateCosts($date = '', $app_id = 0, $agent_id = 0, $costs = 0.00) {
  137. if ($costs < 0.01) {
  138. return false;
  139. }
  140. $_data['costs'] = $costs;
  141. return $this->ltv_model->saveData($date, $app_id, $agent_id, $_data);
  142. }
  143. /**
  144. * 计算时间差
  145. *
  146. * @param int $reg_time
  147. * @param int $pay_time
  148. *
  149. * @return int
  150. */
  151. public function time_diff($reg_time, $pay_time) {
  152. return ceil(($pay_time - $reg_time) / 86400);
  153. }
  154. /**
  155. * 获取LTV列表
  156. *
  157. * @param array $field
  158. * @param $where
  159. * @param string $order
  160. * @param string $limit
  161. *
  162. * @return bool|false|\PDOStatement|string|\think\Collection
  163. */
  164. public function getList($field = array(), $where, $order = 'id desc', $limit = '1,10') {
  165. $_map = array();
  166. if (isset($where['date']) && !empty($where['date'])) {
  167. $_map['date'] = $where['date'];
  168. }
  169. if (isset($where['app_id']) && !empty($where['app_id'])) {
  170. $_map['app_id'] = $where['app_id'];
  171. }
  172. if (isset($where['agent_id']) && !empty($where['agent_id'])) {
  173. $_map['agent_id'] = $where['agent_id'];
  174. }
  175. return $this->ltv_model->getList($field, $_map, $order, $limit);
  176. }
  177. }