SwitchDataLogic.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. <?php
  2. /**
  3. * SwitchDataLogic.php UTF-8
  4. * 切量数据产生逻辑处理
  5. *
  6. * @date : 2018/5/31 19:37
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : chenbingling <cbl@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huoAgentSwitch\logic;
  13. use huo\controller\agent\AgentCache;
  14. use huo\controller\data\Day;
  15. use huo\model\agent\AgentRelationModel;
  16. use huo\model\common\CommonModel;
  17. use huo\model\game\GameextModel;
  18. use huoAgentSwitch\model\DayAgentSwitchModel;
  19. use huoAgentSwitch\model\DayGameSwitchModel;
  20. use huoAgentSwitch\model\DaySwitchModel;
  21. use huoAgentSwitch\model\DgaSwitchModel;
  22. use huolib\constant\AgentConst;
  23. use huolib\constant\CommonConst;
  24. class SwitchDataLogic extends CommonModel {
  25. private $base_filed
  26. = [
  27. 'history_user_cnt',
  28. 'active_cnt',
  29. 'today_cnt',
  30. 'ip_cnt',
  31. 'click_cnt',
  32. 'page_down_cnt',
  33. 'down_cnt',
  34. 'real_down_cnt',
  35. 'user_cnt',
  36. 'reg_cnt',
  37. 'reg_device_cnt',
  38. 'pay_user_cnt',
  39. 'first_pay_user_cnt',
  40. 'order_cnt',
  41. 'fail_order_cnt',
  42. 'un_order_cnt',
  43. 'reg_order_cnt',
  44. 'reg_pay_cnt',
  45. 'sum_money',
  46. 'sum_real_money',
  47. 'share_money',
  48. 'first_pay_money',
  49. 'first_pay_sum_money',
  50. 'reg_sum_money',
  51. 'reg_real_sum_money',
  52. 'day2',
  53. 'day3',
  54. 'day4',
  55. 'day5',
  56. 'day6',
  57. 'day7',
  58. 'day8',
  59. 'day9',
  60. 'day10',
  61. 'day11',
  62. 'day12',
  63. 'day13',
  64. 'day14',
  65. 'day15',
  66. 'day21',
  67. 'day30',
  68. 'day60',
  69. 'device_day2',
  70. 'device_day3',
  71. 'device_day4',
  72. 'device_day5',
  73. 'device_day6',
  74. 'device_day7',
  75. 'device_day8',
  76. 'device_day9',
  77. 'device_day10',
  78. 'device_day11',
  79. 'device_day12',
  80. 'device_day13',
  81. 'device_day14',
  82. 'device_day15',
  83. 'device_day21',
  84. 'device_day30',
  85. 'device_day60'
  86. ];
  87. /**
  88. * 更新每日游戏渠道
  89. *
  90. * @param $data
  91. *
  92. * @return bool
  93. */
  94. public function upDayGameAgent($data) {
  95. $_map['date'] = $data['date'];
  96. $_map['app_id'] = $data['app_id'];
  97. $_map['agent_id'] = $data['agent_id'];
  98. $_model = new DgaSwitchModel();
  99. // try {
  100. $_rs = $this->updateData($_model, $_map, $data);
  101. if (false === $_rs) {
  102. // TODO: wuyonghong 2018/5/31 记录LOG
  103. return false;
  104. }
  105. if (!empty($data['origin_agent_id']) && $data['origin_agent_id'] != $data['agent_id']) {
  106. /* 更新原始渠道数据 */
  107. $_map['agent_id'] = $data['origin_agent_id'];
  108. $_rs = $this->updateData($_model, $_map, $data);
  109. if (false === $_rs) {
  110. // TODO: wuyonghong 2018/5/31 记录LOG
  111. return false;
  112. }
  113. $_agent_relation = new AgentRelationModel();
  114. /* 获得当前cps渠道 等级*/
  115. $_agent_map = ['agent_id' => $data['origin_agent_id'], 'p_id' => $data['origin_agent_id']];
  116. $_level = $_agent_relation->where($_agent_map)->value('level');
  117. for ($_i = AgentConst::AGENT_LEVEL_1; $_i < $_level; $_i++) {
  118. $_agent_map = ['agent_id' => $data['origin_agent_id'], 'agent_level' => $_i];
  119. $_p_id = $_agent_relation->where($_agent_map)->value('p_id');
  120. if (empty($_p_id)) {
  121. continue;
  122. }
  123. /* 更新原始渠道数据 */
  124. $_map['agent_id'] = $_p_id;
  125. $_rs = $this->updateData($_model, $_map, $data);
  126. if (false === $_rs) {
  127. // TODO: wuyonghong 2018/5/31 记录LOG
  128. }
  129. }
  130. }
  131. $_rs = $this->upDayGame($data);
  132. if (false === $_rs) {
  133. // TODO: wuyonghong 2018/5/31 记录LOG
  134. return false;
  135. }
  136. $_rs = $this->upDayAgent($data);
  137. if (false === $_rs) {
  138. // TODO: wuyonghong 2018/5/31 记录LOG
  139. return false;
  140. }
  141. $_rs = $this->upDay($data);
  142. if (false === $_rs) {
  143. // TODO: wuyonghong 2018/5/31 记录LOG
  144. return false;
  145. }
  146. return true;
  147. // } catch (DataNotFoundException $e) {
  148. // // TODO: wuyonghong 2018/5/31 记录LOG
  149. // return false;
  150. // } catch (ModelNotFoundException $e) {
  151. // // TODO: wuyonghong 2018/5/31 记录LOG
  152. // return false;
  153. // } catch (DbException $e) {
  154. // // TODO: wuyonghong 2018/5/31 记录LOG
  155. // return false;
  156. // } catch (Exception $e) {
  157. // // TODO: wuyonghong 2018/5/31 记录LOG
  158. // return false;
  159. // }
  160. }
  161. /**
  162. * 更新每日游戏数据
  163. *
  164. * @param $data
  165. *
  166. * @return bool
  167. */
  168. public function upDayGame($data) {
  169. $_map['date'] = $data['date'];
  170. $_map['app_id'] = $data['app_id'];
  171. $_model = new DayGameSwitchModel();
  172. $_rs = $this->updateData($_model, $_map, $data);
  173. if (false === $_rs) {
  174. // TODO: wuyonghong 2018/5/31 记录LOG
  175. return false;
  176. }
  177. return true;
  178. }
  179. /**
  180. * 更新每日渠道数据
  181. *
  182. * @param $data
  183. *
  184. * @return bool
  185. */
  186. public function upDayAgent($data) {
  187. $_map['date'] = $data['date'];
  188. $_map['agent_id'] = $data['agent_id'];
  189. $_model = new DayAgentSwitchModel();
  190. $_rs = $this->updateData($_model, $_map, $data, true);
  191. if (false === $_rs) {
  192. // TODO: wuyonghong 2018/5/31 记录LOG
  193. return false;
  194. }
  195. /* 更新渠道扩展信息 */
  196. $this->upAgentExt($_map['agent_id'], $data);
  197. if (!empty($data['origin_agent_id']) && $data['origin_agent_id'] != $data['agent_id']) {
  198. /* 更新原始渠道数据 */
  199. $_map['agent_id'] = $data['origin_agent_id'];
  200. $_rs = $this->updateData($_model, $_map, $data);
  201. if (false === $_rs) {
  202. // TODO: wuyonghong 2018/5/31 记录LOG
  203. return false;
  204. }
  205. /* 更新渠道扩展信息 */
  206. $this->upAgentExt($_map['agent_id'], $data);
  207. $_agent_relation = new AgentRelationModel();
  208. /* 获得当前cps渠道 等级*/
  209. $_agent_map = ['agent_id' => $data['origin_agent_id'], 'p_id' => $data['origin_agent_id']];
  210. $_level = $_agent_relation->where($_agent_map)->value('level');
  211. for ($_i = AgentConst::AGENT_LEVEL_1; $_i < $_level; $_i++) {
  212. $_agent_map = ['agent_id' => $data['origin_agent_id'], 'agent_level' => $_i];
  213. $_p_id = $_agent_relation->where($_agent_map)->value('p_id');
  214. if (empty($_p_id)) {
  215. continue;
  216. }
  217. /* 更新原始渠道数据 */
  218. $_map['agent_id'] = $_p_id;
  219. $_rs = $this->updateData($_model, $_map, $data);
  220. if (false === $_rs) {
  221. continue;
  222. // TODO: wuyonghong 2018/5/31 记录LOG
  223. }
  224. /* 更新渠道扩展信息 */
  225. $this->upAgentExt($_map['agent_id'], $data);
  226. }
  227. }
  228. return true;
  229. }
  230. /**
  231. * 更新每日数据
  232. *
  233. * @param $data
  234. *
  235. * @return bool
  236. */
  237. public function upDay($data) {
  238. $_map['date'] = $data['date'];
  239. $_model = new DaySwitchModel();
  240. $_rs = $this->updateData($_model, $_map, $data, true);
  241. if (false === $_rs) {
  242. // TODO: wuyonghong 2018/5/31 记录LOG
  243. return false;
  244. }
  245. return true;
  246. }
  247. /**
  248. * 更新数据
  249. *
  250. * @param $model
  251. * @param $map
  252. * @param $data
  253. * @param bool $rm_repeat
  254. *
  255. * @return mixed
  256. */
  257. public function updateData($model, $map, $data, $rm_repeat = false) {
  258. $_data = $data;
  259. $_rm_repeat = false;
  260. if (isset($_data['sum_login_cnt'])) {
  261. $_sum_login_cnt = $_data['sum_login_cnt'];
  262. if ($rm_repeat && $_sum_login_cnt > 1) {
  263. $_rm_repeat = true;
  264. }
  265. unset($_data['sum_login_cnt']);
  266. }
  267. $_map = $map;
  268. $_date = $data['date'];
  269. $_retain_day_arr = (new Day())->getRetainDayArr();
  270. foreach ($_retain_day_arr as $_v) {
  271. $_day = 'day'.$_v;
  272. $_device_day = 'device_day'.$_v;
  273. if ($_rm_repeat && $_data[$_day] > 0) {
  274. $_data[$_day] -= 1;
  275. }
  276. if ($_rm_repeat && $_data[$_device_day] > 0) {
  277. $_data[$_device_day] -= 1;
  278. }
  279. if (!empty($_data[$_day]) || !empty($_data[$_device_day])) {
  280. $_map['date'] = date('Y-m-d', strtotime($_date) - CommonConst::CONST_DAY_SECONDS * ($_v - 1));
  281. $_day_data[$_day] = $_data[$_day];
  282. $_day_data[$_device_day] = $_data[$_device_day];
  283. $this->updateOrInsert($model, $_map, $_day_data);
  284. }
  285. unset($_data[$_day]);
  286. unset($_data[$_device_day]);
  287. }
  288. if ($_rm_repeat && $_data['user_cnt'] > 0) {
  289. $_data['user_cnt'] -= 1;
  290. }
  291. return $this->updateOrInsert($model, $map, $_data);
  292. }
  293. /**
  294. * 更新或插入
  295. *
  296. * @param $model
  297. * @param $_map
  298. * @param $data
  299. *
  300. * @return mixed
  301. */
  302. public function updateOrInsert($model, $_map, $data) {
  303. $_data = $model->where($_map)->find();
  304. if (is_object($_data)) {
  305. $_data = $_data->toArray();
  306. }
  307. if (empty($_data)) {
  308. $_data = $_map;
  309. foreach ($this->base_filed as $_v) {
  310. if (isset($data[$_v])) {
  311. $_data[$_v] = $data[$_v];
  312. }
  313. }
  314. $_rs = $model->insert($_data);
  315. } else {
  316. foreach ($this->base_filed as $_v) {
  317. if (isset($data[$_v])) {
  318. $_data[$_v] += $data[$_v];
  319. }
  320. }
  321. $_rs = $model->where(['id' => $_data['id']])->update($_data);
  322. }
  323. return $_rs;
  324. }
  325. /**
  326. * 更新渠道扩展信息
  327. *
  328. * @param int $app_id
  329. * @param array $data
  330. *
  331. * @return bool
  332. */
  333. public function upGameExt($app_id, $data) {
  334. if (empty($app_id)) {
  335. /* 不需要更新 */
  336. return true;
  337. }
  338. $_gc_class = new GameextModel();
  339. $_ge_data = $_gc_class->getInfoById($app_id);
  340. if (empty($_ge_data)) {
  341. /* 游戏不存在 */
  342. return true;
  343. }
  344. $_files = array(
  345. 'active_cnt',
  346. 'down_cnt',
  347. 'real_down_cnt',
  348. 'user_cnt',
  349. 'reg_cnt',
  350. 'reg_device_cnt',
  351. 'pay_user_cnt',
  352. 'first_pay_user_cnt',
  353. 'order_cnt',
  354. 'fail_order_cnt',
  355. 'un_order_cnt',
  356. 'reg_order_cnt',
  357. 'reg_pay_cnt',
  358. 'sum_money',
  359. 'first_pay_money',
  360. 'first_pay_sum_money',
  361. 'reg_sum_money'
  362. );
  363. foreach ($_files as $f) {
  364. if (isset($data[$f])) {
  365. $_ge_data[$f] += $data[$f];
  366. }
  367. }
  368. if (empty($_ge_data)) {
  369. return true;
  370. }
  371. return $_gc_class->updateData($_ge_data, $app_id);
  372. }
  373. /**
  374. * 更新渠道扩展信息
  375. *
  376. * @param int $agent_id
  377. * @param array $data
  378. *
  379. * @return bool
  380. */
  381. public function upAgentExt($agent_id = 0, $data) {
  382. if (empty($agent_id)) {
  383. /* 不需要更新 */
  384. return true;
  385. }
  386. $_ac_class = AgentCache::ins();
  387. $_ae_data = $_ac_class->getAgentExtByAgentId($agent_id);
  388. if (empty($_ae_data)) {
  389. /* 渠道不存在 */
  390. return true;
  391. }
  392. $_files = array(
  393. 'history_user_cnt',
  394. 'active_cnt',
  395. 'down_cnt',
  396. 'real_down_cnt',
  397. 'user_cnt',
  398. 'reg_cnt',
  399. 'reg_device_cnt',
  400. 'pay_user_cnt',
  401. 'first_pay_user_cnt',
  402. 'order_cnt',
  403. 'fail_order_cnt',
  404. 'un_order_cnt',
  405. 'reg_order_cnt',
  406. 'reg_pay_cnt',
  407. 'sum_money',
  408. 'first_pay_money',
  409. 'first_pay_sum_money',
  410. );
  411. foreach ($_files as $f) {
  412. if (isset($data[$f])) {
  413. $_ae_data[$f] -= $data[$f];
  414. }
  415. }
  416. if (empty($_ae_data)) {
  417. return true;
  418. }
  419. return $_ac_class->updateAgentExt($agent_id, $_ae_data);
  420. }
  421. }