SwitchDayDataLogic.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. <?php
  2. /**
  3. * SwitchDayDataLogic.php UTF-8
  4. * 切量每日数据
  5. *
  6. * @date : 2018/5/21 21:49
  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\finance\Income;
  15. use huo\controller\member\MemCache;
  16. use huo\controller\pay\SdkOrderCache;
  17. use huo\model\common\CommonModel;
  18. use huo\model\data\DayAgentModel;
  19. use huo\model\data\DayGameAgentModel;
  20. use huo\model\data\DayGameModel;
  21. use huo\model\data\DayModel;
  22. use huo\model\log\DayMemLogModel;
  23. use huoAgentSwitch\model\DayAgentSwitchModel;
  24. use huoAgentSwitch\model\DayGameSwitchModel;
  25. use huoAgentSwitch\model\DaySwitchModel;
  26. use huoAgentSwitch\model\DgaSwitchModel;
  27. use huoAgentSwitch\model\DmlSwitchModel;
  28. use huolib\constant\OrderConst;
  29. use huolib\tool\StrUtils;
  30. class SwitchDayDataLogic extends CommonModel {
  31. private $base_field
  32. = [
  33. 'date' => 'date', /* 日期 */
  34. 'down_cnt' => 'down_cnt', /* 访问人数 */
  35. 'active_cnt' => 'active_cnt', /* 访问人数 */
  36. 'today_cnt' => 'today_cnt', /* 访问人数 */
  37. 'ip_cnt' => 'ip_cnt', /* 独立IP数 */
  38. 'user_cnt' => 'user_cnt', /* 活跃玩家数量 */
  39. 'reg_device_cnt' => 'reg_device_cnt', /* 新增设备 */
  40. 'reg_cnt' => 'reg_cnt', /* 注册玩家数 */
  41. 'pay_user_cnt' => 'pay_user_cnt',/* 付费玩家数 */
  42. 'order_cnt' => 'order_cnt', /* 成功订单数 */
  43. 'reg_pay_cnt' => 'reg_pay_cnt', /* 新增即付费人数 */
  44. 'sum_money' => 'sum_money', /* 充值金额 */
  45. 'reg_sum_money' => 'reg_sum_money', /* 新增即付总额 */
  46. ];
  47. private $switch_base_field
  48. = [
  49. 'date' => 'date', /* 日期 */
  50. 'down_cnt' => 'down_cnt', /* 访问人数 */
  51. 'active_cnt' => 'active_cnt', /* 访问人数 */
  52. 'today_cnt' => 'today_cnt', /* 访问人数 */
  53. 'ip_cnt' => 'ip_cnt', /* 独立IP数 */
  54. 'user_cnt' => 'user_cnt', /* 活跃玩家数量 */
  55. 'reg_device_cnt' => 'reg_device_cnt', /* 新增设备 */
  56. 'reg_cnt' => 'reg_cnt', /* 注册玩家数 */
  57. 'pay_user_cnt' => 'pay_user_cnt',/* 付费玩家数 */
  58. 'order_cnt' => 'order_cnt', /* 成功订单数 */
  59. 'reg_pay_cnt' => 'reg_pay_cnt', /* 新增即付费人数 */
  60. 'sum_money' => 'sum_money', /* 充值金额 */
  61. 'reg_sum_money' => 'reg_sum_money', /* 新增即付总额 */
  62. 'reg_cnt_show' => 'reg_cnt_show', /* 修改后值 */
  63. ];
  64. private $sum_field
  65. = [
  66. 'sum(down_cnt)' => 'down_cnt',
  67. 'sum(active_cnt)' => 'active_cnt',
  68. 'sum(today_cnt)' => 'today_cnt',
  69. 'sum(ip_cnt)' => 'ip_cnt',
  70. 'sum(order_cnt)' => 'order_cnt',
  71. 'sum(user_cnt)' => 'user_cnt',
  72. 'sum(reg_device_cnt)' => 'reg_device_cnt',
  73. 'sum(reg_cnt)' => 'reg_cnt',
  74. 'sum(pay_user_cnt)' => 'pay_user_cnt',
  75. 'sum(reg_order_cnt)' => 'reg_order_cnt',
  76. 'sum(reg_pay_cnt)' => 'reg_pay_cnt',
  77. 'sum(sum_money)' => 'sum_money',
  78. 'sum(reg_sum_money)' => 'reg_sum_money',
  79. ];
  80. private $switch_sum_field
  81. = [
  82. 'sum(down_cnt)' => 'down_cnt',
  83. 'sum(active_cnt)' => 'active_cnt',
  84. 'sum(today_cnt)' => 'today_cnt',
  85. 'sum(ip_cnt)' => 'ip_cnt',
  86. 'sum(order_cnt)' => 'order_cnt',
  87. 'sum(user_cnt)' => 'user_cnt',
  88. 'sum(reg_device_cnt)' => 'reg_device_cnt',
  89. 'sum(reg_cnt)' => 'reg_cnt',
  90. 'sum(reg_cnt_show)' => 'reg_cnt_show',
  91. 'sum(pay_user_cnt)' => 'pay_user_cnt',
  92. 'sum(reg_order_cnt)' => 'reg_order_cnt',
  93. 'sum(reg_pay_cnt)' => 'reg_pay_cnt',
  94. 'sum(sum_money)' => 'sum_money',
  95. 'sum(reg_sum_money)' => 'reg_sum_money',
  96. ];
  97. /**
  98. * @param array $param
  99. *
  100. * @return array
  101. */
  102. protected function getWhere($param = []) {
  103. $_map = [];
  104. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  105. $_map['date'] = ['between', [$param['start_time'], $param['end_time']]];
  106. } elseif (!empty($param['start_time'])) {
  107. $_map['date'] = ['egt', $param['start_time']];
  108. } elseif (!empty($param['end_time'])) {
  109. $_map['date'] = ['elt', $param['end_time']];
  110. }
  111. if (!empty($param['agent_id'])) {
  112. $_map['agent_id'] = $param['agent_id'] == -1 ? 0 : $param['agent_id'];
  113. }
  114. if (!empty($param['sub_agent_id'])) {
  115. $_map['agent_id'] = $param['sub_agent_id'];
  116. }
  117. if (!empty($param['game_id'])) {
  118. $_map['app_id'] = $param['game_id'];
  119. }
  120. if (!empty($param['app_id'])) {
  121. $_map['app_id'] = $param['app_id'];
  122. }
  123. return $_map;
  124. }
  125. /**
  126. * @param array $where
  127. *
  128. * @return DayAgentSwitchModel|DgaSwitchModel|DayGameSwitchModel|DaySwitchModel|null|\think\Model
  129. */
  130. public function getSwitchDataModel($where) {
  131. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  132. return new DgaSwitchModel();
  133. } elseif (!empty($where['agent_id'])) {
  134. return new DayAgentSwitchModel();
  135. } elseif (!empty($where['app_id'])) {
  136. return new DayGameSwitchModel();
  137. } else {
  138. return new DaySwitchModel();
  139. }
  140. }
  141. /**
  142. * @param array $where
  143. *
  144. * @return DayAgentModel|DayGameAgentModel|DayGameModel|DayModel|null|\think\Model
  145. */
  146. public function getDataModel($where) {
  147. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  148. return new DayGameAgentModel();
  149. } elseif (!empty($where['agent_id'])) {
  150. return new DayAgentModel();
  151. } elseif (!empty($where['app_id'])) {
  152. return new DayGameModel();
  153. } else {
  154. return new DayModel();
  155. }
  156. }
  157. /**
  158. * 获取字段
  159. *
  160. * @param $where
  161. *
  162. * @return array
  163. */
  164. public function getField($where) {
  165. $_field = $this->base_field;
  166. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  167. $_field['agent_id'] = 'agent_id';
  168. $_field['app_id'] = 'app_id';
  169. } elseif (!empty($where['agent_id'])) {
  170. $_field['agent_id'] = 'agent_id';
  171. } elseif (!empty($where['app_id'])) {
  172. $_field['app_id'] = 'app_id';
  173. }
  174. return $_field;
  175. }
  176. /**
  177. * 获取字段
  178. *
  179. * @param $where
  180. *
  181. * @return array
  182. */
  183. public function getSwitchField($where) {
  184. $_field = $this->switch_base_field;
  185. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  186. $_field['agent_id'] = 'agent_id';
  187. $_field['app_id'] = 'app_id';
  188. } elseif (!empty($where['agent_id'])) {
  189. $_field['agent_id'] = 'agent_id';
  190. } elseif (!empty($where['app_id'])) {
  191. $_field['app_id'] = 'app_id';
  192. }
  193. return $_field;
  194. }
  195. /**
  196. * 获取今日数据
  197. *
  198. * @param $where
  199. *
  200. * @return array|bool|false
  201. */
  202. public function getTodayData($where) {
  203. $_map = $this->getWhere($where);
  204. if (isset($_map['agent_id']) && -1 == $_map['agent_id']) {
  205. $_map['agent_id'] = 0;
  206. }
  207. $_date = date('Y-m-d');
  208. $_map['date'] = $_date;
  209. $_group = 'date';
  210. if (!empty($_map['agent_id']) && !empty($_map['app_id'])) {
  211. $_group .= ',app_id,agent_id';
  212. } elseif (!empty($_map['agent_id'])) {
  213. $_group .= ',agent_id';
  214. } elseif (!empty($where['app_id'])) {
  215. $_group .= ',app_id';
  216. }
  217. $_field = [
  218. 'date' => 'date',
  219. 'app_id' => 'app_id',
  220. 'agent_id' => 'agent_id',
  221. 'COUNT(DISTINCT `mem_id`)' => 'active_cnt',
  222. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 THEN `mem_id` END))' => 'today_cnt',
  223. // 'SUM(`login_cnt`)' => 'click_cnt',
  224. 'COUNT(DISTINCT(CASE WHEN `auth_cnt`>0 THEN `mem_id` END))' => 'user_cnt',
  225. 'COUNT(DISTINCT `last_login_ip`)' => 'ip_cnt',
  226. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `mem_id` END))' => 'reg_cnt',
  227. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `device_id` END))' => 'reg_device_cnt',
  228. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `last_login_ip` END))' => 'reg_ip_cnt',
  229. 'COUNT(DISTINCT(CASE WHEN `sum_money`>0 THEN `mem_id` END))' => 'pay_user_cnt',
  230. // 'COUNT(DISTINCT(CASE WHEN `first_pay_time`>0 THEN `mem_id` END))' => 'first_pay_user_cnt',
  231. // 'SUM(`order_suc_cnt`)' => 'order_cnt',
  232. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `sum_money`>0 THEN `mem_id` END))' => 'reg_pay_cnt',
  233. 'SUM(`sum_money`)' => 'sum_money',
  234. 'SUM(`order_cnt`)' => 'order_cnt',
  235. // 'SUM(`sum_real_money`)' => 'sum_real_money',
  236. 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_money` END)' => 'reg_sum_money',
  237. 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_real_money` END)' => 'reg_real_sum_money',
  238. ];
  239. $_data = (new DayMemLogModel())->computeTable($_date)->field($_field)->where($_map)->group($_group)->find();
  240. if (is_object($_data)) {
  241. $_data = $_data->toArray();
  242. }
  243. if (empty($_data)) {
  244. return false;
  245. }
  246. /* 取切量数据 */
  247. $_switch_data = (new DmlSwitchModel())->computeTable($_date)->field($_field)->where($_map)->group($_group)
  248. ->find();
  249. if (is_object($_switch_data)) {
  250. $_switch_data = $_switch_data->toArray();
  251. }
  252. if (!empty($_switch_data)) {
  253. //$_data['active_cnt'] -= $_switch_data['active_cnt'];
  254. //$_data['today_cnt'] -= $_switch_data['today_cnt'];
  255. $_data['ip_cnt'] -= $_switch_data['ip_cnt'];
  256. $_data['order_cnt'] -= $_switch_data['order_cnt'];
  257. $_data['user_cnt'] -= $_switch_data['user_cnt'];
  258. $_data['reg_device_cnt'] -= $_switch_data['reg_device_cnt'];
  259. $_data['reg_cnt'] -= $_switch_data['reg_cnt'];
  260. $_data['pay_user_cnt'] -= $_switch_data['pay_user_cnt'];
  261. $_data['reg_pay_cnt'] -= $_switch_data['reg_pay_cnt'];
  262. $_data['sum_money'] -= $_switch_data['sum_money'];
  263. $_data['reg_sum_money'] -= $_switch_data['reg_sum_money'];
  264. }
  265. $_data['act_pay_rate'] = StrUtils::getRate($_data['reg_pay_cnt'], $_data['today_cnt']);
  266. $_data['reg_pay_rate'] = StrUtils::getRate($_data['reg_pay_cnt'], $_data['reg_cnt']);
  267. $_data['user_pay_rate'] = StrUtils::getRate($_data['pay_user_cnt'], $_data['user_cnt']);
  268. $_data['reg_arpu'] = StrUtils::getArpu($_data['reg_sum_money'], $_data['reg_pay_cnt']);
  269. $_data['arpu'] = StrUtils::getArpu($_data['sum_money'], $_data['user_cnt']);
  270. $_data['arppu'] = StrUtils::getArpu($_data['sum_money'], $_data['pay_user_cnt']);
  271. $_data['acr'] = StrUtils::getArpu($_data['reg_cnt'], $_data['today_cnt']);
  272. return $_data;
  273. }
  274. /**
  275. * 获取列表
  276. *
  277. * @param array $where
  278. * @param string $page
  279. * @param string $order
  280. *
  281. * @return array
  282. */
  283. public function getList($where, $page = '1,10', $order = '-date') {
  284. $_rdata = ['count' => 0, 'sum' => 0, 'list' => []];
  285. if (empty($where['agent_id'])) {
  286. return $_rdata;
  287. }
  288. $_map = $this->getWhere($where);
  289. $_model = $this->getDataModel($_map);
  290. $_count = $_model->where($_map)->count();
  291. if (empty($_count)) {
  292. return $_rdata;
  293. }
  294. $_sum_field = $this->sum_field;
  295. $_sum_data = $_model
  296. ->field($_sum_field)
  297. ->where($_map)
  298. ->find();
  299. if (is_object($_sum_data)) {
  300. $_sum_data = $_sum_data->toArray();
  301. }
  302. $_sum = $_sum_data;
  303. $_dml_model = new DayMemLogModel();
  304. $_user_cnt = $this->getActiveUserSum($_dml_model, $where);
  305. $_sum['user_cnt'] = $_user_cnt;
  306. $_field = $this->getField($_map);
  307. $_order = $_model->orderFilter($order);
  308. if (!empty($_map['agent_id']) && is_array($_map['agent_id'])) {
  309. $_count = $_model->where($_map)->group('date')->count();
  310. $_sum_field['date'] = 'date';
  311. $_datas = $_model
  312. ->where($_map)
  313. ->field($_sum_field)
  314. ->group('date')
  315. ->order($_order)
  316. ->page($page)
  317. ->select();
  318. } else {
  319. $_datas = $_model
  320. ->where($_map)
  321. ->field($_field)
  322. ->order($_order)
  323. ->page($page)
  324. ->select();
  325. }
  326. if (is_object($_datas)) {
  327. $_datas = $_datas->toArray();
  328. }
  329. if (empty($_datas)) {
  330. return $_rdata;
  331. }
  332. /* 取切量数据 */
  333. $_switch_model = $this->getSwitchDataModel($_map);
  334. $_switch_count = $_switch_model->where($_map)->count();
  335. if (!empty($_switch_count)) {
  336. $_sum_field = $this->switch_sum_field;
  337. $_sum_data = $_switch_model
  338. ->field($_sum_field)
  339. ->where($_map)
  340. ->find();
  341. if (is_object($_sum_data)) {
  342. $_sum_data = $_sum_data->toArray();
  343. }
  344. if (!empty($_sum_data)) {
  345. $_dml_model = new DmlSwitchModel();
  346. $_user_cnt = $this->getActiveUserSum($_dml_model, $where);
  347. $_sum_data['user_cnt'] = $_user_cnt;
  348. //$_sum['active_cnt'] -= $_sum_data['active_cnt'];
  349. //$_sum['active_cnt'] = $_sum['active_cnt']>0?$_sum['active_cnt']:0;
  350. //$_sum['today_cnt'] -= $_sum_data['today_cnt'];
  351. //$_sum['today_cnt'] = $_sum['today_cnt']>0?$_sum['today_cnt']:0;
  352. $_sum['down_cnt'] -= $_sum_data['down_cnt'];
  353. $_sum['down_cnt'] = $_sum['down_cnt'] > 0 ? $_sum['down_cnt'] : 0;
  354. $_sum['ip_cnt'] -= $_sum_data['ip_cnt'];
  355. $_sum['ip_cnt'] = $_sum['ip_cnt'] > 0 ? $_sum['ip_cnt'] : 0;
  356. $_sum['order_cnt'] -= $_sum_data['order_cnt'];
  357. $_sum['order_cnt'] = $_sum['order_cnt'] > 0 ? $_sum['order_cnt'] : 0;
  358. $_sum['user_cnt'] -= $_sum_data['user_cnt'];
  359. $_sum['user_cnt'] = $_sum['user_cnt'] > 0 ? $_sum['user_cnt'] : 0;
  360. $_sum['reg_device_cnt'] -= $_sum_data['reg_device_cnt'];
  361. $_sum['reg_device_cnt'] = $_sum['reg_device_cnt'] > 0 ? $_sum['reg_device_cnt'] : 0;
  362. $_sum['reg_cnt'] -= $_sum_data['reg_cnt'];
  363. $_sum['reg_cnt'] = $_sum['reg_cnt'] > 0 ? $_sum['reg_cnt'] : 0;
  364. $_sum['reg_cnt'] -= $_sum_data['reg_cnt_show'];
  365. $_sum['pay_user_cnt'] -= $_sum_data['pay_user_cnt'];
  366. $_sum['pay_user_cnt'] = $_sum['pay_user_cnt'] > 0 ? $_sum['pay_user_cnt'] : 0;
  367. $_sum['reg_order_cnt'] -= $_sum_data['reg_order_cnt'];
  368. $_sum['reg_order_cnt'] = $_sum['reg_order_cnt'] > 0 ? $_sum['reg_order_cnt'] : 0;
  369. $_sum['reg_pay_cnt'] -= $_sum_data['reg_pay_cnt'];
  370. $_sum['reg_pay_cnt'] = $_sum['reg_pay_cnt'] > 0 ? $_sum['reg_pay_cnt'] : 0;
  371. $_sum['sum_money'] -= $_sum_data['sum_money'];
  372. $_sum['sum_money'] = $_sum['sum_money'] > 0 ? $_sum['sum_money'] : 0;
  373. $_sum['reg_sum_money'] -= $_sum_data['reg_sum_money'];
  374. $_sum['reg_sum_money'] = $_sum['reg_sum_money'] > 0 ? $_sum['reg_sum_money'] : 0;
  375. }
  376. $_field = $this->getSwitchField($_map);
  377. $_order = $_model->orderFilter($order);
  378. $_switch_datas = $_switch_model
  379. ->where($_map)
  380. ->field($_field)
  381. ->order($_order)
  382. ->select();
  383. if (is_object($_switch_datas)) {
  384. $_switch_datas = $_switch_datas->toArray();
  385. }
  386. if (!empty($_switch_datas)) {
  387. foreach ($_switch_datas as $_sk => $_sv) {
  388. foreach ($_datas as $_k => $_v) {
  389. if ($_sv['date'] == $_v['date']) {
  390. //$_datas[$_k]['active_cnt'] -= $_sv['active_cnt'];
  391. //$_datas[$_k]['active_cnt']= $_datas[$_k]['active_cnt']>0?$_datas[$_k]['active_cnt']:0;
  392. //$_datas[$_k]['today_cnt'] -= $_sv['today_cnt'];
  393. //$_datas[$_k]['today_cnt']= $_datas[$_k]['today_cnt']>0?$_datas[$_k]['today_cnt']:0;
  394. $_datas[$_k]['down_cnt'] -= $_sv['down_cnt'];
  395. $_datas[$_k]['down_cnt'] = $_datas[$_k]['down_cnt'] > 0 ? $_datas[$_k]['down_cnt'] : 0;
  396. $_datas[$_k]['ip_cnt'] -= $_sv['ip_cnt'];
  397. $_datas[$_k]['ip_cnt'] = $_datas[$_k]['ip_cnt'] > 0 ? $_datas[$_k]['ip_cnt'] : 0;
  398. $_datas[$_k]['user_cnt'] -= $_sv['user_cnt'];
  399. $_datas[$_k]['user_cnt'] = $_datas[$_k]['user_cnt'] > 0 ? $_datas[$_k]['user_cnt'] : 0;
  400. $_datas[$_k]['reg_device_cnt'] -= $_sv['reg_device_cnt'];
  401. $_datas[$_k]['reg_device_cnt'] = $_datas[$_k]['reg_device_cnt'] > 0
  402. ? $_datas[$_k]['reg_device_cnt'] : 0;
  403. $_datas[$_k]['reg_cnt'] -= $_sv['reg_cnt'];
  404. $_datas[$_k]['real_reg_cnt'] = $_datas[$_k]['reg_cnt'] > 0 ? $_datas[$_k]['reg_cnt'] : 0;
  405. $_datas[$_k]['reg_cnt'] -= $_sv['reg_cnt_show'];
  406. $_datas[$_k]['pay_user_cnt'] -= $_sv['pay_user_cnt'];
  407. $_datas[$_k]['pay_user_cnt'] = $_datas[$_k]['pay_user_cnt'] > 0
  408. ? $_datas[$_k]['pay_user_cnt'] : 0;
  409. $_datas[$_k]['order_cnt'] -= $_sv['order_cnt'];
  410. $_datas[$_k]['order_cnt'] = $_datas[$_k]['order_cnt'] > 0 ? $_datas[$_k]['order_cnt'] : 0;
  411. $_datas[$_k]['reg_pay_cnt'] -= $_sv['reg_pay_cnt'];
  412. $_datas[$_k]['reg_pay_cnt'] = $_datas[$_k]['reg_pay_cnt'] > 0 ? $_datas[$_k]['reg_pay_cnt']
  413. : 0;
  414. $_datas[$_k]['sum_money'] -= $_sv['sum_money'];
  415. $_datas[$_k]['sum_money'] = $_datas[$_k]['sum_money'] > 0 ? $_datas[$_k]['sum_money'] : 0;
  416. $_datas[$_k]['reg_sum_money'] -= $_sv['reg_sum_money'];
  417. $_datas[$_k]['reg_sum_money'] = $_datas[$_k]['reg_sum_money'] > 0
  418. ? $_datas[$_k]['reg_sum_money'] : 0;
  419. }
  420. }
  421. }
  422. }
  423. }
  424. $_sum['act_pay_rate'] = StrUtils::getRate($_sum['reg_pay_cnt'], $_sum['today_cnt']);
  425. $_sum['reg_pay_rate'] = StrUtils::getRate($_sum['reg_pay_cnt'], $_sum['reg_cnt']);
  426. $_sum['user_pay_rate'] = StrUtils::getRate($_sum['pay_user_cnt'], $_sum['user_cnt']);
  427. $_sum['reg_arpu'] = StrUtils::getArpu($_sum['reg_sum_money'], $_sum['reg_pay_cnt']);
  428. $_sum['arpu'] = StrUtils::getArpu($_sum['sum_money'], $_sum['user_cnt']);
  429. $_sum['arppu'] = StrUtils::getArpu($_sum['sum_money'], $_sum['pay_user_cnt']);
  430. $_sum['acr'] = StrUtils::getRate($_sum['reg_cnt'], $_sum['today_cnt']);
  431. $_sum['old_active_cnt'] = $_sum['active_cnt'] - $_sum['reg_cnt'];
  432. $_sum['old_pay_user_cnt'] = $_sum['pay_user_cnt'] - $_sum['reg_pay_cnt'];
  433. $_sum['old_sum_money'] = $_sum['sum_money'] - $_sum['reg_sum_money'];
  434. $_sum['first_day_ltv'] = StrUtils::getArpu($_sum['reg_sum_money'], $_sum['reg_cnt']);
  435. $_sum['total_act_pay_rate'] = StrUtils::getRate($_sum['pay_user_cnt'], $_sum['user_cnt']);
  436. foreach ($_datas as $_k => $_v) {
  437. $_datas[$_k]['agent_name'] = !empty($_v['agent']) ? $_v['agent']['user_login'] : '';
  438. $_datas[$_k]['reg_pay_rate'] = StrUtils::getRate($_v['reg_pay_cnt'], $_v['reg_cnt']);
  439. $_datas[$_k]['user_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['user_cnt']);
  440. $_datas[$_k]['act_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['today_cnt']);
  441. $_datas[$_k]['reg_arpu'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_pay_cnt']);
  442. $_datas[$_k]['arppu'] = StrUtils::getArpu($_v['sum_money'], $_v['pay_user_cnt']);
  443. $_datas[$_k]['arpu'] = StrUtils::getArpu($_v['sum_money'], $_v['user_cnt']);
  444. $_datas[$_k]['acr'] = StrUtils::getRate($_v['reg_cnt'], $_v['today_cnt']);
  445. $_datas[$_k]['old_active_cnt'] = $_v['active_cnt'] - $_v['reg_cnt'];
  446. $_datas[$_k]['old_pay_user_cnt'] = $_v['pay_user_cnt'] - $_v['reg_pay_cnt'];
  447. $_datas[$_k]['old_sum_money'] = $_v['sum_money'] - $_v['reg_sum_money'];
  448. $_datas[$_k]['first_day_ltv'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_cnt']);
  449. $_datas[$_k]['total_act_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['user_cnt']);
  450. }
  451. return [
  452. 'count' => $_count,
  453. 'sum' => $_sum,
  454. 'list' => $_datas
  455. ];
  456. }
  457. /**
  458. * 获取活跃数据汇总
  459. *
  460. * @param $model
  461. * @param array $param
  462. *
  463. * @return int|string
  464. */
  465. public function getActiveUserSum($model, $param = []) {
  466. $_start_time = time();
  467. $_end_time = $_start_time;
  468. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  469. $_start_time = strtotime($param['start_time']);
  470. $_end_time = strtotime($param['end_time']);
  471. }
  472. $_map = $this->getWhere($param);
  473. $_group = 'mem_id';
  474. if (!empty($param['agent_id'])) {
  475. $_group .= ',agent_id';
  476. }
  477. if (!empty($param['app_id'])) {
  478. $_group .= ',app_id';
  479. }
  480. $_cnt = $model->getActiveUserSum($_map, $_start_time, $_end_time, $_group);
  481. return $_cnt;
  482. }
  483. /**
  484. * 玩家切量回退每日数据
  485. *
  486. * @param $mem_id
  487. *
  488. * @return bool
  489. */
  490. public function returnMemData($mem_id) {
  491. $_mem_id = $mem_id;
  492. $_mem_cache = MemCache::ins();
  493. $_mem_data = $_mem_cache->getInfoById($_mem_id);
  494. $_mem_data ['is_switch'] = OrderConst::PAY_SWITCH_NO;
  495. $_rs = MemCache::ins()->updateMem($_mem_id, $_mem_data);
  496. if (false == $_rs) {
  497. return $_rs;
  498. }
  499. $_date = date('Y-m-d', $_mem_data['create_time']);
  500. /* 删除当前玩家今日数据 */
  501. (new DmlSwitchModel())->deleteLog($_mem_id, $_date);
  502. /* 修改数据 */
  503. $_map = ['date' => $_date];
  504. $_model = new DaySwitchModel();
  505. $_rs = $this->updateMemData($_model, $_map);
  506. if (false == $_rs) {
  507. return $_rs;
  508. }
  509. $_map = ['date' => $_date, 'app_id' => $_mem_data['app_id']];
  510. $_model = new DayGameSwitchModel();
  511. $_rs = $this->updateMemData($_model, $_map);
  512. if (false == $_rs) {
  513. return $_rs;
  514. }
  515. $_agent_id = $_mem_data['agent_id'];
  516. if (!empty($_mem_data['origin_agent_id']) && 1 != $_mem_data['origin_agent_id']) {
  517. $_agent_id = $_mem_data['origin_agent_id'];
  518. }
  519. $_map = ['date' => $_date, 'agent_id' => $_agent_id];
  520. $_model = new DayAgentSwitchModel();
  521. $_rs = $this->updateMemData($_model, $_map);
  522. if (false == $_rs) {
  523. return $_rs;
  524. }
  525. $_map = ['date' => $_date, 'agent_id' => $_agent_id, 'app_id' => $_mem_data['app_id']];
  526. $_model = new DgaSwitchModel();
  527. $_rs = $this->updateMemData($_model, $_map);
  528. if (false == $_rs) {
  529. return $_rs;
  530. }
  531. $this->setAgentRegCnt($_agent_id, 1);
  532. return true;
  533. }
  534. /**
  535. * 减少渠道邀请数量
  536. *
  537. * @param int $agent_id
  538. * @param int $cnt //正数增加 负数减少
  539. *
  540. * @return bool
  541. */
  542. public function setAgentRegCnt($agent_id, $cnt = 0) {
  543. $_agent_cache = AgentCache::ins();
  544. $_agent_ext = $_agent_cache->getAgentExtByAgentId($agent_id);
  545. $_agent_ext['reg_cnt'] += $cnt;
  546. $_agent_ext['reg_cnt'] = $_agent_ext['reg_cnt'] > 0 ? $_agent_ext['reg_cnt'] : 0;
  547. $_rs = $_agent_cache->updateAgentExt($agent_id, $_agent_ext);
  548. return $_rs;
  549. }
  550. /**
  551. * 修改切量玩家数据
  552. *
  553. * @param $model
  554. * @param $where
  555. *
  556. * @return bool
  557. */
  558. public function updateMemData($model, $where) {
  559. $_field = ['user_cnt', 'reg_cnt'];
  560. $_date = $model->where($where)->field($_field)->find();
  561. if (empty($_date)) {
  562. return true;
  563. }
  564. if (is_object($_date)) {
  565. $_date = $_date->toArray();
  566. }
  567. $_date['user_cnt'] = $_date['user_cnt'] > 1 ? $_date['user_cnt'] - 1 : 0;
  568. $_date['reg_cnt'] = $_date['reg_cnt'] > 1 ? $_date['reg_cnt'] - 1 : 0;
  569. $_rs = $model->where($where)->update($_date);
  570. return $_rs;
  571. }
  572. /**
  573. * 修改切量订单数据
  574. *
  575. * @param $order_id
  576. *
  577. * @return bool
  578. */
  579. public function returnOrdData($order_id) {
  580. $_order_data = SdkOrderCache::ins()->getInfoByOrderId($order_id);
  581. if (empty($_order_data)) {
  582. return false;
  583. }
  584. /* 修改订单切换状态 */
  585. $_order_data['is_switch'] = OrderConst::PAY_SWITCH_NO;
  586. $_rs = SdkOrderCache::ins()->updateOrder($_order_data['order_id'], $_order_data);
  587. if (false == $_rs) {
  588. return false;
  589. }
  590. if (OrderConst::PAY_STATUS_SUC != $_order_data['status']) { //支付成功订单才需要做数据处理
  591. return true;
  592. }
  593. /* 计算订单渠道收益 */
  594. (new Income())->incomeFromSdkOrder($order_id);
  595. /* 修改玩家当日数据 */
  596. $_time = empty($_order_data['pay_time']) ? $_order_data['create_time'] : $_order_data['pay_time'];
  597. $_date = date('Y-m-d', $_time);
  598. $_model = new DayMemLogModel();
  599. $_map['date'] = $_date;
  600. $_map['mem_id'] = $_order_data['mem_id'];
  601. $_map['app_id'] = $_order_data['app_id'];
  602. $_log_data = $_model->getDetail($_map);
  603. if (!empty($_log_data)) {
  604. $_log_data['sum_money'] -= $_order_data['amount'];
  605. $_log_data['sum_real_money'] -= $_order_data['real_amount'];
  606. $_model->updateLog($_log_data, $_log_data['id']);
  607. }
  608. /* 数据恢复-主要处理 switch 后缀的几个表 */
  609. $_map = ['date' => $_date];
  610. $_model = new DaySwitchModel();
  611. $_rs = $this->updateOrdData($_model, $_map, $_order_data);
  612. if (false === $_rs) {
  613. return $_rs;
  614. }
  615. $_map = ['date' => $_date, 'app_id' => $_order_data['app_id']];
  616. $_model = new DayGameSwitchModel();
  617. $_rs = $this->updateOrdData($_model, $_map, $_order_data);
  618. if (false === $_rs) {
  619. return $_rs;
  620. }
  621. $_map = ['date' => $_date, 'agent_id' => $_order_data['agent_id']];
  622. $_model = new DayAgentSwitchModel();
  623. $_rs = $this->updateOrdData($_model, $_map, $_order_data);
  624. if (false === $_rs) {
  625. return $_rs;
  626. }
  627. $_map = ['date' => $_date, 'agent_id' => $_order_data['agent_id'], 'app_id' => $_order_data['app_id']];
  628. $_model = new DgaSwitchModel();
  629. $_rs = $this->updateOrdData($_model, $_map, $_order_data);
  630. if (false === $_rs) {
  631. return $_rs;
  632. }
  633. return true;
  634. }
  635. /**
  636. * 修改切量订单数据
  637. *
  638. * @param $model
  639. * @param $where
  640. * @param $_order_data
  641. *
  642. * @return bool
  643. */
  644. public function updateOrdData($model, $where, $_order_data) {
  645. $_field = ['pay_user_cnt', 'order_cnt', 'sum_money', 'sum_real_money'];
  646. $_date = $model->where($where)->field($_field)->find();
  647. if (empty($_date)) {
  648. return true;
  649. }
  650. if (is_object($_date)) {
  651. $_date = $_date->toArray();
  652. }
  653. $_date['pay_user_cnt'] = $_date['pay_user_cnt'] > 1 ? $_date['pay_user_cnt'] - 1 : 0;
  654. $_date['order_cnt'] = $_date['order_cnt'] > 1 ? $_date['order_cnt'] - 1 : 0;
  655. $_date['sum_money'] = $_date['sum_money'] > $_order_data['amount'] ? $_date['sum_money']
  656. - $_order_data['amount'] : 0;
  657. $_date['sum_real_money'] = $_date['sum_real_money'] > $_order_data['real_amount'] ? $_date['sum_real_money']
  658. - $_order_data['real_amount']
  659. : 0;
  660. $_rs = $model->where($where)->update($_date);
  661. return $_rs;
  662. }
  663. }