GenDataLogic.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <?php
  2. /**
  3. * GenDataLogic.php UTF-8
  4. *
  5. *
  6. * @date : 2019/11/21 10:40
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : ouzhongfu <ozf@huosdk.com>
  10. * @version : HUOSDK_NOVEL 1.0
  11. */
  12. namespace huo\logic\data;
  13. use huo\model\agent\AgentCpaLogModel;
  14. use huo\model\common\CommonModel;
  15. use huo\model\log\DayMemLogModel;
  16. use huo\model\member\MemberModel;
  17. use huo\model\member\MemGameModel;
  18. use huo\model\member\MemoauthModel;
  19. use huo\model\member\MgRoleModel;
  20. use huo\model\order\OrderModel;
  21. use huolib\constant\CommonConst;
  22. use think\Exception;
  23. use think\Log;
  24. class GenDataLogic extends CommonModel {
  25. private $log_db_conf = [];
  26. private $db_conf = [];
  27. private $dw_conf = [];
  28. public function __construct($name = null) {
  29. parent::__construct($name);
  30. if (file_exists(GLOBAL_CONF_PATH.'database_log.php')) {
  31. $this->log_db_conf = include GLOBAL_CONF_PATH.'database_log.php';
  32. }
  33. if (file_exists(GLOBAL_CONF_PATH.'database.php')) {
  34. $this->db_conf = include GLOBAL_CONF_PATH.'database.php';
  35. }
  36. if (file_exists(GLOBAL_CONF_PATH.'database_dw.php')) {
  37. $this->dw_conf = include GLOBAL_CONF_PATH.'database_dw.php';
  38. }
  39. }
  40. /**
  41. * 执行每日数据
  42. *
  43. * @param string $date 日期
  44. *
  45. * @return void
  46. */
  47. function archiveDaily($date = '') {
  48. set_time_limit(0);
  49. $_ts = time();
  50. if (empty($date)) {
  51. $_date = date('Y-m-d', strtotime("-1 day"));
  52. } else {
  53. $_date = $date;
  54. }
  55. $_log_date = date('Y-m-d H:i:s', $_ts);
  56. $_config = $this->getDbConfig();
  57. /* 数据库处理 */
  58. try {
  59. $_start_time = time();
  60. Log::write("ETL archiveDaily at $_log_date and date = $_date", 'etl', true);
  61. $this->genLogMemByLoginData($_date);
  62. $this->genLogMem($_date);
  63. $this->genLogMemGame($_date);
  64. $this->genLogMemCpa($_date);
  65. db('', $_config, true)->query("call rundaily('$_date')");
  66. $_end_time = time();
  67. $_diff = $_end_time - $_start_time;
  68. Log::write("ETL archiveDaily end use time $_diff s", 'etl', true);
  69. } catch (Exception $_e) {
  70. Log::write("Error:code:".$_e->getCode().";msg:".$_e->getMessage(), 'etl', true);
  71. }
  72. return;
  73. }
  74. /**
  75. * @param $date
  76. */
  77. public function genLogMemByLoginData($date) {
  78. $_date = $date;
  79. $_start_time = strtotime($_date);
  80. $_end_time = strtotime($_date);
  81. $_log_database = $this->log_db_conf['database'];
  82. $_database = $this->db_conf['database'];
  83. $_day_mem_model = new DayMemLogModel();
  84. while ($_start_time <= $_end_time) {
  85. $_day_mem_model->checkTable($_start_time);
  86. $_day_end_time = $_start_time + 86400;
  87. $_date_key = date('Ym', $_start_time);
  88. $_date_month_key = date('Ym', $_start_time);
  89. $_date = date('Y-m-d', $_start_time);
  90. $_delete_sql = "DELETE FROM ".$_log_database.".log_log_day_mem_".$_date_key." WHERE date='".$_date."' ";
  91. db()->execute($_delete_sql);
  92. $_sql = "REPLACE INTO ".$_log_database.".log_log_day_mem_".$_date_key."
  93. (
  94. `date`,
  95. `mem_id`,
  96. `app_id`,
  97. `agent_id`,
  98. `reg_time`,
  99. `reg_days`,
  100. `device_id`,
  101. `login_cnt`,
  102. `last_login_ip`,
  103. `reg_app_id`
  104. )
  105. SELECT
  106. '".$_date."',
  107. `ll`.`mem_id` AS `mem_id`,
  108. `ll`.`app_id` AS `app_id`,
  109. IFNULL(`m`.`agent_id` , '0') AS `agent_id`,
  110. IFNULL(`m`.`create_time` , '0') AS `reg_time`,
  111. (TO_DAYS(FROM_UNIXTIME(`ll`.`create_time`)) - TO_DAYS(FROM_UNIXTIME(IFNULL(`m`.`create_time`,0)))) AS `reg_days`,
  112. `ll`.`device_id` AS `device_id`,
  113. COUNT(`ll`.`id`) AS `login_cnt`,
  114. inet_aton(`ll`.`ip`) AS `last_login_ip`,
  115. `ll`.`reg_app_id` AS `reg_app_id`
  116. FROM
  117. (".$_database.".`h_log_mem_login_".$_date_month_key."` `ll`)
  118. LEFT JOIN ".$_database.".`h_member` m ON ll.mem_id = m.id
  119. WHERE
  120. (FROM_UNIXTIME(`ll`.`create_time`, '%Y-%m-%d') = '".$_date."')
  121. GROUP BY `ll`.`mem_id` , `ll`.`app_id`;";
  122. db()->execute($_sql);
  123. $_start_time = $_day_end_time;
  124. }
  125. }
  126. public function genLogMem($date) {
  127. $_date = $date;
  128. $_start_time = strtotime($_date);
  129. $_end_time = strtotime($_date);
  130. $_order_model = new OrderModel();
  131. $_day_mem_model = new DayMemLogModel();
  132. $_field = [
  133. 'count(`id`)' => 'order_suc_cnt',
  134. 'app_id' => 'app_id',
  135. 'agent_id' => 'agent_id',
  136. 'mem_id' => 'mem_id',
  137. 'sum(`amount`)' => 'sum_money',
  138. 'sum(`real_amount`)' => 'sum_real_money',
  139. 'create_time' => 'last_pay_time',
  140. 'amount' => 'last_money',
  141. ];
  142. while ($_start_time <= $_end_time) {
  143. $_day_end_time = $_start_time + 86400;
  144. $_map = [
  145. 'status' => 2,
  146. 'create_time' => ['between', [$_start_time, $_day_end_time]],
  147. ];
  148. $_group = 'mem_id,app_id';
  149. $_datas = $_order_model->where($_map)->field($_field)->group($_group)->select();
  150. if (is_object($_datas)) {
  151. $_datas = $_datas->toArray();
  152. }
  153. foreach ($_datas as $_data) {
  154. $_data['date'] = date('Y-m-d', $_start_time);
  155. $_data['order_cnt'] = $_data['order_suc_cnt'];
  156. unset($_data['id']);
  157. $_rs = $_day_mem_model->updateData($_data, 0);
  158. if (false === $_rs) {
  159. var_dump($_data);
  160. exit;
  161. }
  162. }
  163. $_start_time = $_day_end_time;
  164. }
  165. }
  166. public function genLogMemCpa($date) {
  167. $_date = $date;
  168. $_start_time = strtotime($_date);
  169. $_end_time = strtotime($_date);
  170. $_mem_model = new MemberModel();
  171. $_day_mem_model = new DayMemLogModel();
  172. $_acl_model = new AgentCpaLogModel();
  173. $_ma_model = new MemoauthModel();
  174. $_field = [
  175. 'id' => 'mem_id',
  176. 'app_id' => 'app_id',
  177. 'agent_id' => 'agent_id'
  178. ];
  179. while ($_start_time <= $_end_time) {
  180. $_day_end_time = $_start_time + 86400;
  181. $_map = [
  182. 'create_time' => ['between', [$_start_time, $_day_end_time]],
  183. ];
  184. $_datas = $_mem_model->where($_map)->field($_field)->select();
  185. if (is_object($_datas)) {
  186. $_datas = $_datas->toArray();
  187. }
  188. foreach ($_datas as $_data) {
  189. $_data['date'] = date('Y-m-d', $_start_time);
  190. $_id = $_acl_model->getIdByMemId($_data['mem_id']);
  191. if (!empty($_id)) {
  192. $_data['is_cpa'] = 2;
  193. }
  194. $_openid = $_ma_model->getOpenidByMemId('', $_data['mem_id']);
  195. if (!empty($_openid)) {
  196. $_data['is_auth'] = 2;
  197. }
  198. $_rs = $_day_mem_model->updateData($_data, 0);
  199. if (false === $_rs) {
  200. var_dump($_data);
  201. exit;
  202. }
  203. }
  204. $_start_time = $_day_end_time;
  205. }
  206. }
  207. /**
  208. * 查询玩家游戏是否新创
  209. *
  210. * @param $date
  211. *
  212. * @return bool
  213. */
  214. public function genLogMemGame($date) {
  215. $_date = $date;
  216. $_start_time = strtotime($_date);
  217. $_end_time = $_start_time + CommonConst::CONST_DAY_SECONDS;
  218. $_map = [
  219. 'create_time' => ['between', [$_start_time, $_end_time]]
  220. ];
  221. $_mg_model = new MemGameModel();
  222. $_datas = $_mg_model->where($_map)->column('id,mem_id,app_id');
  223. $_day_mem_model = new DayMemLogModel();
  224. foreach ($_datas as $_mem) {
  225. $_data = [];
  226. $_data['date'] = $_date;
  227. $_data['app_id'] = $_mem['app_id'];
  228. $_data['mem_id'] = $_mem['mem_id'];
  229. $_data['is_new_app'] = CommonConst::STATUS_YES;
  230. $_rs = $_day_mem_model->updateData($_data, 0);
  231. if (false === $_rs) {
  232. var_dump($_data);
  233. exit;
  234. }
  235. }
  236. return true;
  237. }
  238. /**
  239. * 获取数据仓库配置
  240. */
  241. public function getDbConfig() {
  242. $_db_dw = [ // 数据库类型
  243. 'type' => '',
  244. // 服务器地址
  245. 'hostname' => '',
  246. // 数据库名
  247. 'database' => '',
  248. // 用户名
  249. 'username' => '',
  250. // 密码
  251. 'password' => '',
  252. // 端口
  253. 'hostport' => '',
  254. // 数据库编码默认采用utf8
  255. 'charset' => 'utf8mb4',
  256. // 数据库表前缀
  257. 'prefix' => 'dw_',
  258. // 连接dsn
  259. 'dsn' => '',
  260. // 数据库连接参数
  261. 'params' => [],
  262. // 数据库调试模式
  263. 'debug' => true,
  264. // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
  265. 'deploy' => 0,
  266. // 数据库读写是否分离 主从式有效
  267. 'rw_separate' => false,
  268. // 读写分离后 主服务器数量
  269. 'master_num' => 1,
  270. // 指定从服务器序号
  271. 'slave_no' => '',
  272. // 是否严格检查字段是否存在
  273. 'fields_strict' => true,
  274. // 数据集返回类型
  275. 'resultset_type' => 'collection',
  276. // 自动写入时间戳字段
  277. 'auto_timestamp' => false,
  278. // 时间字段取出后的默认时间格式
  279. 'datetime_format' => false,
  280. // 是否需要进行SQL性能分析
  281. 'sql_explain' => false,];
  282. if (file_exists(CMF_ROOT.'data/conf/database_dw.php')) {
  283. $_db_dw = include CMF_ROOT.'data/conf/database_dw.php';
  284. }
  285. return $_db_dw;
  286. }
  287. }