DayLogic.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. <?php
  2. /**
  3. * DayLogic.php UTF-8
  4. * 每日数据逻辑
  5. *
  6. * @date : 2019/10/22 11:06
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOUNION 8.5
  11. */
  12. namespace huoLtv\logic;
  13. use DateTime;
  14. use huo\model\common\CommonModel;
  15. use huo\model\user\UserModel;
  16. use huolib\constant\AgentConst;
  17. use huoLtv\model\LtvAgentModel;
  18. use huoLtv\model\LtvDayModel;
  19. use huoLtv\model\LtvGameAgentModel;
  20. use huoLtv\model\LtvGameModel;
  21. use think\Model;
  22. class DayLogic extends CommonModel {
  23. private $base_field
  24. = [
  25. 'date' => 'date',
  26. 'reg_cnt' => 'reg_cnt',
  27. 'sum_money' => 'sum_money',
  28. 'day1' => 'day1', //1日
  29. 'day2' => 'day2', //2日
  30. 'day3' => 'day3', //3日
  31. 'day4' => 'day4', //4日
  32. 'day5' => 'day5', //5日
  33. 'day6' => 'day6', //6日
  34. 'day7' => 'day7', //7日
  35. 'day8' => 'day8', //8日
  36. 'day9' => 'day9', //9日
  37. 'day10' => 'day10', //10日
  38. 'day11' => 'day11', //11日
  39. 'day12' => 'day12', //12日
  40. 'day13' => 'day13', //13日
  41. 'day14' => 'day14', //14日
  42. 'day15' => 'day15', //15日
  43. 'day16' => 'day16', //16日
  44. 'day17' => 'day17', //17日
  45. 'day18' => 'day18', //18日
  46. 'day19' => 'day19', //19日
  47. 'day20' => 'day20', //20日
  48. 'day21' => 'day21', //21日
  49. 'day22' => 'day22', //22日
  50. 'day23' => 'day23', //23日
  51. 'day24' => 'day24', //24日
  52. 'day25' => 'day25', //25日
  53. 'day26' => 'day26', //26日
  54. 'day27' => 'day27', //27日
  55. 'day28' => 'day28', //28日
  56. 'day29' => 'day29', //29日
  57. 'day30' => 'day30', //30日
  58. 'day31' => 'day31', //31日
  59. 'day32' => 'day32', //32日
  60. 'day33' => 'day33', //33日
  61. 'day34' => 'day34', //34日
  62. 'day35' => 'day35', //35日
  63. 'day36' => 'day36', //36日
  64. 'day37' => 'day37', //37日
  65. 'day38' => 'day38', //38日
  66. 'day39' => 'day39', //39日
  67. 'day40' => 'day40', //40日
  68. 'day41' => 'day41', //41日
  69. 'day42' => 'day42', //42日
  70. 'day43' => 'day43', //43日
  71. 'day44' => 'day44', //44日
  72. 'day45' => 'day45', //45日
  73. 'day46' => 'day46', //46日
  74. 'day47' => 'day47', //47日
  75. 'day48' => 'day48', //48日
  76. 'day49' => 'day49', //49日
  77. 'day50' => 'day50', //50日
  78. 'day51' => 'day51', //51日
  79. 'day52' => 'day52', //52日
  80. 'day53' => 'day53', //53日
  81. 'day54' => 'day54', //54日
  82. 'day55' => 'day55', //55日
  83. 'day56' => 'day56', //56日
  84. 'day57' => 'day57', //57日
  85. 'day58' => 'day58', //58日
  86. 'day59' => 'day59', //59日
  87. 'day60' => 'day60', //60日
  88. 'day90' => 'day90', //90日
  89. 'day120' => 'day120', //120日
  90. 'day180' => 'day180', //180日
  91. ];
  92. private $sum_base_field
  93. = [
  94. 'date' => 'date',
  95. 'sum(reg_cnt)' => 'reg_cnt',
  96. 'sum(sum_money)' => 'sum_money',
  97. 'sum(day1)' => 'day1', //1日
  98. 'sum(day2)' => 'day2', //2日
  99. 'sum(day3)' => 'day3', //3日
  100. 'sum(day4)' => 'day4', //4日
  101. 'sum(day5)' => 'day5', //5日
  102. 'sum(day6)' => 'day6', //6日
  103. 'sum(day7)' => 'day7', //7日
  104. 'sum(day8)' => 'day8', //8日
  105. 'sum(day9)' => 'day9', //9日
  106. 'sum(day10)' => 'day10', //10日
  107. 'sum(day11)' => 'day11', //11日
  108. 'sum(day12)' => 'day12', //12日
  109. 'sum(day13)' => 'day13', //13日
  110. 'sum(day14)' => 'day14', //14日
  111. 'sum(day15)' => 'day15', //15日
  112. 'sum(day16)' => 'day16', //16日
  113. 'sum(day17)' => 'day17', //17日
  114. 'sum(day18)' => 'day18', //18日
  115. 'sum(day19)' => 'day19', //19日
  116. 'sum(day20)' => 'day20', //20日
  117. 'sum(day21)' => 'day21', //21日
  118. 'sum(day22)' => 'day22', //22日
  119. 'sum(day23)' => 'day23', //23日
  120. 'sum(day24)' => 'day24', //24日
  121. 'sum(day25)' => 'day25', //25日
  122. 'sum(day26)' => 'day26', //26日
  123. 'sum(day27)' => 'day27', //27日
  124. 'sum(day28)' => 'day28', //28日
  125. 'sum(day29)' => 'day29', //29日
  126. 'sum(day30)' => 'day30', //30日
  127. 'sum(day31)' => 'day31', //31日
  128. 'sum(day32)' => 'day32', //32日
  129. 'sum(day33)' => 'day33', //33日
  130. 'sum(day34)' => 'day34', //34日
  131. 'sum(day35)' => 'day35', //35日
  132. 'sum(day36)' => 'day36', //36日
  133. 'sum(day37)' => 'day37', //37日
  134. 'sum(day38)' => 'day38', //38日
  135. 'sum(day39)' => 'day39', //39日
  136. 'sum(day40)' => 'day40', //40日
  137. 'sum(day41)' => 'day41', //41日
  138. 'sum(day42)' => 'day42', //42日
  139. 'sum(day43)' => 'day43', //43日
  140. 'sum(day44)' => 'day44', //44日
  141. 'sum(day45)' => 'day45', //45日
  142. 'sum(day46)' => 'day46', //46日
  143. 'sum(day47)' => 'day47', //47日
  144. 'sum(day48)' => 'day48', //48日
  145. 'sum(day49)' => 'day49', //49日
  146. 'sum(day50)' => 'day50', //50日
  147. 'sum(day51)' => 'day51', //51日
  148. 'sum(day52)' => 'day52', //52日
  149. 'sum(day53)' => 'day53', //53日
  150. 'sum(day54)' => 'day54', //54日
  151. 'sum(day55)' => 'day55', //55日
  152. 'sum(day56)' => 'day56', //56日
  153. 'sum(day57)' => 'day57', //57日
  154. 'sum(day58)' => 'day58', //58日
  155. 'sum(day59)' => 'day59', //59日
  156. 'sum(day60)' => 'day60', //60日
  157. 'sum(day90)' => 'day90', //90日
  158. 'sum(day120)' => 'day120', //120日
  159. 'sum(day180)' => 'day180', //180日
  160. ];
  161. /* 后台显示 */
  162. private $show_field
  163. = [
  164. 'day1' => 'day1', //1日
  165. 'day2' => 'day2', //2日
  166. 'day3' => 'day3', //3日
  167. 'day4' => 'day4', //4日
  168. 'day5' => 'day5', //5日
  169. 'day6' => 'day6', //6日
  170. 'day7' => 'day7', //7日
  171. 'day8' => 'day8', //8日
  172. 'day9' => 'day9', //9日
  173. 'day10' => 'day10', //10日
  174. 'day11' => 'day11', //11日
  175. 'day12' => 'day12', //12日
  176. 'day13' => 'day13', //13日
  177. 'day14' => 'day14', //14日
  178. 'day15' => 'day15', //15日
  179. 'day30' => 'day30', //30日
  180. 'day60' => 'day60', //60日
  181. 'day90' => 'day90', //90日
  182. 'day120' => 'day120', //120日
  183. 'day180' => 'day180', //180日
  184. ];
  185. /**
  186. * @param array $param
  187. *
  188. * @return array
  189. */
  190. protected function getWhere($param = []) {
  191. $_map = [];
  192. /* 时间搜索 */
  193. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  194. $_map['date'] = ['between', [$param['start_time'], $param['end_time']]];
  195. } elseif (!empty($param['start_time'])) {
  196. $_map['date'] = ['egt', $param['start_time']];
  197. } elseif (!empty($param['end_time'])) {
  198. $_map['date'] = ['elt', $param['end_time']];
  199. }
  200. $_agent_model = new UserModel();
  201. if (!empty($param['cp_id'])) {
  202. $_ids = $_agent_model->getIdsByCpId(
  203. $param['cp_id'], ['in', [AgentConst::AGENT_ROLE_MP_AGENT, AgentConst::AGENT_ROLE_MP_AD]]
  204. );
  205. if (empty($_ids)) {
  206. $_ids = [-1];
  207. }
  208. $_map['agent_id'] = ['in', $_ids];
  209. }
  210. if (!empty($param['agent_level_1_id'])) {
  211. $_agent_map = [
  212. 'role_id' => ['in', [AgentConst::AGENT_ROLE_MP_AGENT, AgentConst::AGENT_ROLE_MP_AD]]
  213. ];
  214. $_ids = $_agent_model->getIdsByParentId($param['agent_level_1_id'], $_agent_map);
  215. $_ids[] = $param['agent_level_1_id'];
  216. $_map['agent_id'] = ['in', $_ids];
  217. }
  218. if (!empty($param['agent_level_2_id'])) {
  219. $_map['agent_id'] = $param['agent_level_2_id'];
  220. }
  221. if (!empty($param['agent_id'])) {
  222. if ($param['agent_id'] == -1) {
  223. $_map['agent_id'] = 0;
  224. } else {
  225. $_map['agent_id'] = $param['agent_id'];
  226. }
  227. }
  228. if (!empty($param['agent_id'])) {
  229. if (is_array($param['agent_id'])) {
  230. if (in_array('in', $param['agent_id'])) {
  231. $_map['agent_id'] = $param['agent_id'];
  232. } else {
  233. $_map['agent_id'] = ['in', $param['agent_id']];
  234. }
  235. } else {
  236. $_map['agent_id'] = $param['agent_id'];
  237. }
  238. }
  239. if (!empty($param['game_id'])) {
  240. $_map['app_id'] = $param['game_id'];
  241. }
  242. if (!empty($param['app_id'])) {
  243. if (is_array($param['app_id'])) {
  244. if (in_array('in', $param['app_id'])) {
  245. $_map['app_id'] = $param['app_id'];
  246. } else {
  247. $_map['app_id'] = ['in', $param['app_id']];
  248. }
  249. } else {
  250. $_map['app_id'] = $param['app_id'];
  251. }
  252. }
  253. return $_map;
  254. }
  255. /**
  256. * @param array $where
  257. *
  258. * @return LtvAgentModel|LtvGameAgentModel|LtvGameModel|LtvDayModel|null|Model
  259. */
  260. public function getDataModel($where) {
  261. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  262. return (new LtvGameAgentModel());
  263. } elseif (!empty($where['agent_id'])) {
  264. return (new LtvAgentModel());
  265. } elseif (!empty($where['app_id'])) {
  266. return new LtvGameModel();
  267. } else {
  268. return new LtvDayModel();
  269. }
  270. }
  271. /**
  272. * 获取字段
  273. *
  274. * @param $where
  275. *
  276. * @return array
  277. */
  278. public function getField($where) {
  279. $_field = $this->base_field;
  280. if (isset($where['include_agent']) && 2 == $where['include_agent']
  281. || isset($where['is_summary'])
  282. && 2 == $where['is_summary']) {
  283. $_field = $this->sum_base_field;
  284. }
  285. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  286. $_field['agent_id'] = 'agent_id';
  287. $_field['app_id'] = 'app_id';
  288. } elseif (!empty($where['agent_id'])) {
  289. $_field['agent_id'] = 'agent_id';
  290. } elseif (!empty($where['app_id'])) {
  291. $_field['app_id'] = 'app_id';
  292. }
  293. return $_field;
  294. }
  295. /**
  296. * 获取with
  297. *
  298. * @param $where
  299. *
  300. * @return string
  301. */
  302. public function getWith($where) {
  303. $_with = '';
  304. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  305. $_with = 'agent,game';
  306. } elseif (!empty($where['agent_id'])) {
  307. $_with = 'agent';
  308. $_field['agent_id'] = 'agent_id';
  309. } elseif (!empty($where['app_id'])) {
  310. $_with = 'game';
  311. }
  312. return $_with;
  313. }
  314. /**
  315. * 获取列表底层函数
  316. *
  317. * @param array $where 搜索条件
  318. * @param string $page 列表个数
  319. * @param string $order 排序
  320. * @param array $field 附加字段
  321. * @param string $group 归类
  322. *
  323. * @return array ['count'=>0,'list'=>[]]
  324. */
  325. public function getList($where = [], $page = '1,10', $order = '-date', $field = [], $group = '', $with = '') {
  326. $_map = $where;
  327. $_field = $field;
  328. $_model = $this->getDataModel($_map);
  329. if (!empty($group)) {
  330. $_count = $_model->where($_map)->group($group)->count();
  331. } else {
  332. $_count = $_model->where($_map)->count();
  333. }
  334. if (empty($_count)) {
  335. return [
  336. 'count' => 0,
  337. 'list' => []
  338. ];
  339. }
  340. $_order = $this->orderFilter($order);
  341. if (!empty($group)) {
  342. $_datas = $_model->with($with)
  343. ->field($_field)
  344. ->where($_map)
  345. ->order($_order)
  346. ->group($group)
  347. ->page($page)
  348. ->select();
  349. } else {
  350. $_datas = $_model->with($with)
  351. ->field($_field)
  352. ->where($_map)
  353. ->order($_order)
  354. ->page($page)
  355. ->select();
  356. }
  357. if (is_object($_datas)) {
  358. $_datas = $_datas->toArray();
  359. }
  360. $_date = date('Y-m-d');
  361. $_date_end = new DateTime($_date);
  362. foreach ($_datas as $_k => $_v) {
  363. $_datas[$_k]['now_ltv'] = '0.00';
  364. if (!empty($_v['reg_cnt'])) {
  365. $_datas[$_k]['now_ltv'] = bcdiv($_v['sum_money'], $_v['reg_cnt'], 2);
  366. }
  367. $_date_start = new DateTime($_v['date']);
  368. $_days = $_date_start->diff($_date_end)->days; //记录至今相差天数
  369. foreach ($this->show_field as $_day) {
  370. if (strpos($_day, 'day') === false) {
  371. continue;
  372. }
  373. $_day_num = substr($_day, 3);
  374. if ($_days < $_day_num) {
  375. $_datas[$_k][$_day] = '--';
  376. continue;
  377. }
  378. if (empty($_v['reg_cnt'])) {
  379. $_datas[$_k][$_day] = '0.00';
  380. continue;
  381. }
  382. $_day_money = self::getTheDayMoney($_v, $_day_num);
  383. $_datas[$_k][$_day] = bcdiv($_day_money, $_v['reg_cnt'], 2);
  384. }
  385. if (!empty($_v['game'])) {
  386. $_datas[$_k]['game_name'] = get_val($_v['game'], 'name', '');
  387. $_datas[$_k]['game_icon'] = get_val($_v['game'], 'icon', '');
  388. $_datas[$_k]['classify'] = get_val($_v['game'], 'classify', '');
  389. unset($_datas[$_k]['game']);
  390. }
  391. if (!empty($_v['agent'])) {
  392. $_datas[$_k]['agent_nickname'] = get_val($_v['agent'], 'user_nicename', '');
  393. $_datas[$_k]['agent_name'] = get_val($_v['agent'], 'user_login', '');
  394. unset($_datas[$_k]['agent']);
  395. } else {
  396. $_datas[$_k]['agent_nickname'] = '';
  397. $_datas[$_k]['agent_name'] = '';
  398. }
  399. }
  400. return [
  401. 'count' => $_count,
  402. 'list' => $_datas
  403. ];
  404. }
  405. /**
  406. * 获取后台列表
  407. *
  408. * @param array $where 搜索条件
  409. * @param string $page 列表个数
  410. * @param string $order 排序
  411. * @param array $field 附加字段
  412. *
  413. * @return array ['count'=>0,'list'=>[]]
  414. */
  415. public function getAdminList($where = [], $page = '1,10', $order = '-date', $field = []) {
  416. $_map = $this->getWhere($where);
  417. $_field = $this->getField($_map);
  418. $_with = $this->getWith($_map);
  419. if (!empty($field)) {
  420. $_field = array_merge($_field, $field);/* 获取后台字段 */
  421. }
  422. $_group = '';
  423. if (isset($where['include_agent']) && 2 == $where['include_agent']
  424. || isset($where['is_summary'])
  425. && 2 == $where['is_summary']) {
  426. $_group = 'date';
  427. }
  428. return $this->getList($_map, $page, $order, $_field, $_group, $_with);
  429. }
  430. /**
  431. * 获取至当日金额
  432. *
  433. * @param array $data 单条数据
  434. * @param int $day 获取日期
  435. *
  436. * @return int|mixed|string
  437. */
  438. private function getTheDayMoney($data, $day) {
  439. $_money = 0;
  440. /* 最大循环60日 */
  441. $_lop_day = $day;
  442. if ($day > 60) {
  443. $_lop_day = 60;
  444. }
  445. for ($_i = 1; $_i <= $_lop_day; $_i++) {
  446. $_field = 'day'.$_i;
  447. $_value = get_val($data, $_field, 0);
  448. $_money += $_value;
  449. }
  450. /* 60日内数据返回 */
  451. if ($day <= 60) {
  452. return $_money;
  453. }
  454. if ($day <= 90) {
  455. $_value90 = get_val($data, 'day90', 0);
  456. $_money += $_value90;
  457. return $_money;
  458. }
  459. if ($day <= 120) {
  460. $_value90 = get_val($data, 'day90', 0);
  461. $_value120 = get_val($data, 'day120', 0);
  462. $_money = $_money + $_value90 + $_value120;
  463. return $_money;
  464. }
  465. if ($day <= 180) {
  466. $_value90 = get_val($data, 'day90', 0);
  467. $_value120 = get_val($data, 'day120', 0);
  468. $_value180 = get_val($data, 'day180', 0);
  469. $_money = $_money + $_value90 + $_value120 + $_value180;
  470. return $_money;
  471. }
  472. if ($day <= 270) {
  473. $_value90 = get_val($data, 'day90', 0);
  474. $_value120 = get_val($data, 'day120', 0);
  475. $_value180 = get_val($data, 'day180', 0);
  476. $_value270 = get_val($data, 'day270', 0);
  477. $_money = $_money + $_value90 + $_value120 + $_value180 + $_value270;
  478. return $_money;
  479. }
  480. if ($day <= 360) {
  481. $_value90 = get_val($data, 'day90', 0);
  482. $_value120 = get_val($data, 'day120', 0);
  483. $_value180 = get_val($data, 'day180', 0);
  484. $_value270 = get_val($data, 'day270', 0);
  485. $_value360 = get_val($data, 'day360', 0);
  486. $_money = $_money + $_value90 + $_value120 + $_value180 + $_value270 + $_value360;
  487. return $_money;
  488. }
  489. return $_money;
  490. }
  491. }