LtvLogic.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. /**
  3. * LtvLogic.php UTF-8
  4. * LTV 数据逻辑处理
  5. *
  6. * @date : 2019/5/27 14:53
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : chenbingling <cbl@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace ltv;
  13. use DateTime;
  14. use huolib\constant\CommonConst;
  15. use huolib\constant\DataConst;
  16. use huolib\tool\Math;
  17. use think\Model;
  18. class LtvLogic extends Model {
  19. private $base_field
  20. = [
  21. 'date' => 'date', /* 日期 */
  22. 'sum(reg_cnt)' => 'reg_cnt', /* 注册玩家数 */
  23. 'sum(reg_device_cnt)' => 'reg_device_cnt', /* 新增设备 */
  24. 'sum(sum_money)' => 'sum_money', /* 注册玩家数 */
  25. ];
  26. protected $day_field
  27. = [
  28. 'sum(day1)' => 'day1', //1日
  29. 'sum(day2)' => 'day2', //2日
  30. 'sum(day3)' => 'day3', //3日
  31. 'sum(day4)' => 'day4', //4日
  32. 'sum(day5)' => 'day5', //5日
  33. 'sum(day6)' => 'day6', //6日
  34. 'sum(day7)' => 'day7', //7日
  35. 'sum(day8)' => 'day8', //8日
  36. 'sum(day9)' => 'day9', //9日
  37. 'sum(day10)' => 'day10', //10日
  38. 'sum(day11)' => 'day11', //11日
  39. 'sum(day12)' => 'day12', //12日
  40. 'sum(day13)' => 'day13', //13日
  41. 'sum(day14)' => 'day14', //14日
  42. 'sum(day15)' => 'day15', //15日
  43. 'sum(day30)' => 'day30', //30日
  44. 'sum(day60)' => 'day60', //60日
  45. 'sum(day90)' => 'day90', //90日
  46. //'sum(day120)' => 'day120', //120日
  47. 'sum(day180)' => 'day180', //180日
  48. // 'sum(day270)' => 'day270', //270日
  49. // 'sum(day360)' => 'day360', //360日
  50. ];
  51. /**
  52. * 获取字段
  53. *
  54. * @param $where
  55. *
  56. * @return array
  57. */
  58. public function getField($where) {
  59. $_field = array_merge($this->base_field, $this->day_field);
  60. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  61. $_field['agent_id'] = 'agent_id';
  62. $_field['app_id'] = 'app_id';
  63. } elseif (!empty($where['agent_id'])) {
  64. $_field['agent_id'] = 'agent_id';
  65. } elseif (!empty($where['app_id'])) {
  66. $_field['app_id'] = 'app_id';
  67. }
  68. return $_field;
  69. }
  70. /**
  71. * 获取组条件
  72. *
  73. * @param array $param
  74. *
  75. * @return string
  76. */
  77. public function getGroup($param) {
  78. if (!empty($param['data_summary']) && DataConst::DATA_SUMMARY_YES == $param['data_summary']) {
  79. $_group = 'date';
  80. return $_group;
  81. }
  82. $_group = 'date';
  83. if (!empty($param['app_id']) && !empty($param['agent_id'])) {
  84. $_group = 'date,app_id,agent_id';
  85. } elseif (!empty($param['app_id'])) {
  86. $_group = 'date,app_id';
  87. } elseif (!empty($param['agent_id'])) {
  88. $_group = 'date,agent_id';
  89. }
  90. return $_group;
  91. }
  92. /***
  93. * 获取查询条件
  94. *
  95. * @param array $param
  96. *
  97. * @return array
  98. */
  99. protected function getWhere($param = []) {
  100. $_map = [];
  101. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  102. $_map['date'] = ['between', [$param['start_time'], $param['end_time']]];
  103. } elseif (!empty($param['start_time'])) {
  104. $_map['date'] = ['egt', $param['start_time']];
  105. } elseif (!empty($param['end_time'])) {
  106. $_map['date'] = ['elt', $param['end_time']];
  107. }
  108. if (!empty($param['agent_id'])) {
  109. $_map['agent_id'] = $param['agent_id'];
  110. if (-1 == $_map['agent_id']) {
  111. $_map['agent_id'] = ['in', [$_map['agent_id'], CommonConst::CONST_ZERO]];
  112. } elseif (is_array($param['agent_id']) && !in_array('in', $param['agent_id'])) {
  113. $_map['agent_id'] = ['in', $param['agent_id']];
  114. }
  115. }
  116. if (!empty($param['app_id'])) {
  117. $_map['app_id'] = $param['app_id'];
  118. }
  119. return $_map;
  120. }
  121. /**
  122. * 获取关联
  123. *
  124. * @param $param
  125. *
  126. * @return LtvModel
  127. */
  128. public function getWith($param) {
  129. $_model = new LtvModel();
  130. if (!empty($param['app_id']) && !empty($param['agent_id'])) {
  131. $_model = $_model->with('ch,game');
  132. } elseif (!empty($param['app_id'])) {
  133. $_model = $_model->with('game');
  134. } elseif (!empty($param['agent_id'])) {
  135. $_model = $_model->with('ch');
  136. }
  137. return $_model;
  138. }
  139. /***
  140. * 获取LTV 列表
  141. *
  142. * @param array $param
  143. *
  144. * @param string $page
  145. *
  146. * @param string $order
  147. *
  148. * @return array|bool
  149. */
  150. public function getList($param, $page = '1,10', $order = 'date desc') {
  151. $_rdata = ['count' => CommonConst::CONST_ZERO, 'list' => []];
  152. $_map = $this->getWhere($param);
  153. $_group = $this->getGroup($param);
  154. $_count = (new LtvModel())->where($_map)->group($_group)->count();
  155. if (empty($_count)) {
  156. return $_rdata;
  157. }
  158. $_field = $this->getField($param);
  159. $_item = $this->getWith($param)
  160. ->where($_map)
  161. ->field($_field)
  162. ->order($order)
  163. ->group($_group)
  164. ->page($page)
  165. ->select();
  166. if (is_object($_item)) {
  167. $_item = $_item->toArray();
  168. }
  169. if (empty($_item)) {
  170. return $_rdata;
  171. }
  172. $_list = [];
  173. $_date = date('Y-m-d');
  174. $_date_end = new DateTime($_date);
  175. foreach ($_item as $_k => $_v) {
  176. $_data = [];
  177. $_data['reg_cnt'] = $_v['reg_cnt'];
  178. $_data['date'] = $_v['date'];
  179. $_data['sum_money'] = $_v['sum_money'];
  180. $_data['now_ltv'] = 0.00;
  181. if (!empty($_v['reg_cnt'])) {
  182. $_data['now_ltv'] = Math::divNum($_v['sum_money'], $_v['reg_cnt'], 2);
  183. }
  184. $_date_start = new DateTime($_v['date']);
  185. $_days = $_date_start->diff($_date_end)->days; //记录至今相差天数
  186. foreach ($this->day_field as $_day) {
  187. $_day_num = substr($_day, 3);
  188. if ($_days < $_day_num) {
  189. $_data[$_day] = '--';
  190. continue;
  191. }
  192. if (empty($_v['reg_cnt'])) {
  193. $_data[$_day] = CommonConst::CONST_ZERO;
  194. continue;
  195. }
  196. $_data[$_day] = Math::divNum($_v[$_day], $_v['reg_cnt'], 2);
  197. }
  198. if (isset($_v['game'])) {
  199. $_data['game_name'] = $_v['game']['name'];
  200. }
  201. if (isset($_v['ch'])) {
  202. $_data['channel_name'] = $_v['ch']['user_login'];
  203. }
  204. if (isset($_v['agent_id'])) {
  205. $_data['agent_id'] = $_v['agent_id'];
  206. }
  207. $_list[] = $_data;
  208. }
  209. $_rdata['count'] = $_count;
  210. $_rdata['list'] = $_list;
  211. return $_rdata;
  212. }
  213. /**
  214. * @param array $day_field
  215. */
  216. public function setDayField($day_field) {
  217. $this->day_field = $day_field;
  218. }
  219. }