* @version : HUOSDK 8.0 */ namespace huo\model\log; use huo\controller\member\MemCache; use huo\model\game\GameModel; use huolib\tool\Time; class DayMemLogModel extends LogModel { protected $name = 'log_day_mem'; /** * LogModel constructor. * * @param array $data */ public function __construct($data = []) { $_db_conf = []; if (file_exists(GLOBAL_CONF_PATH.'database_log.php')) { $_db_conf = include GLOBAL_CONF_PATH.'database_log.php'; } $this->connection = $_db_conf; parent::db(); parent::__construct($data); } public function game() { return $this->hasOne(GameModel::className(), 'id', 'app_id') ->field(['id', 'name', 'icon']); } /** * @param array $where * date * mem_id * app_id * * @return array|bool|false */ public function getDetail($where) { $_map['date'] = isset($where['date']) ? $where['date'] : date('Y-m-d'); $_map['mem_id'] = isset($where['mem_id']) ? $where['mem_id'] : 0; $_map['app_id'] = isset($where['app_id']) ? $where['app_id'] : 0; $_data = $this->computeTable($_map['date'])->where($_map)->find(); if (is_object($_data)) { $_data = $_data->toArray(); } if (empty($_data)) { return false; } return $_data; } /** * 计算总登陆次数 * * @param $where * * @return float|int */ public function getSumLoginCnt($where) { $_map['date'] = isset($where['date']) ? $where['date'] : date('Y-m-d'); $_map['mem_id'] = isset($where['mem_id']) ? $where['mem_id'] : 0; $_sum_login_cnt = $this->computeTable($_map['date'])->where($_map)->sum('login_cnt'); if (empty($_sum_login_cnt)) { return 0; } return $_sum_login_cnt; } /** * @param $data * @param bool $replace * @param bool $get_last_insert_id * * @return bool|int|string */ public function insertLog($data, $replace = true, $get_last_insert_id = true) { return parent::insertLog($data, $replace, $get_last_insert_id); } /** * 更新每日玩家表 * * @param array $data * * @param int $id 主键ID * * @return bool */ public function updateLog($data, $id) { $_map['id'] = $id; if (false === $this->computeTable($data['date'])->where($_map)->update($data)) { return false; } else { return true; } } /** * 添加数据 * * @param array $data 需要添加的数据 * * @return false|int 添加失败返回 false 添加成功 返回添加的ID */ public function addData($data) { if (empty($data['date'])) { return false; } $_data = $data; $_id = $this->computeTableTwo($_data['date'])->insert($_data, true, true); if (false === $_id) { return false; } /* TAG缓存操作 */ return $_id; } /** * 获取信息 * * @param string $date 日期 * @param int $mem_id 玩家ID * @param int $app_id 应用ID * @param string $device_id 设备 * * @return array|false */ public function getInfoByDateMemAppDevice($date, $mem_id, $app_id, $device_id = '') { /* 缓存操作 */ $_map = [ 'date' => $date, 'mem_id' => $mem_id, 'app_id' => $app_id, // 'device_id' => $device_id, ]; $_data = $this->computeTableTwo($_map['date'])->where($_map)->find(); if (is_object($_data)) { $_data = $_data->toArray(); } if (empty($_data)) { return []; } return $_data; } /** * 更新单条数据 * * @param array $data 数据 * @param int $id ID * * @return bool */ public function updateData($data, $id) { if (empty($data['date'])) { return false; } $_data = $this->getInfoByDateMemAppDevice($data['date'], $data['mem_id'], $data['app_id']); if (!empty($_data)) { $_data = array_merge($_data, $data); } else { $_data = $data; $_time = time(); $_mem_data = (new MemCache())->getInfoById($data['mem_id']); $_data['last_login_ip'] = ip2long($_mem_data['reg_ip']); $_data['device_id'] = $_mem_data['device_id']; $_data['reg_time'] = $_mem_data['create_time']; $_data['reg_days'] = Time::timeDateDiff($_data['reg_time'], $_time); } $_id = $this->addData($_data); return $_id; } /** * 创建表 * * @param int $create_time * * @return int */ function checkTable($create_time = 0) { $_time = !empty($create_time) ? $create_time : time(); $this->partition_data[$this->partition_field] = date('Y-m-d', $_time); $this->table = $this->getPartitionTableName( $this->partition_data, $this->partition_field, $this->partition_rule ); $_sql = "CREATE TABLE IF NOT EXISTS `$this->table` ("; $_sql .= " `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '',"; $_sql .= " `date` date NOT NULL COMMENT '日期',"; $_sql .= " `mem_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '玩家ID',"; $_sql .= " `agent_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '归属渠道',"; $_sql .= " `app_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '游戏ID',"; $_sql .= " `reg_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '玩家注册时间',"; $_sql .= " `reg_days` int(11) NOT NULL DEFAULT '0' COMMENT '注册天数',"; $_sql .= " `role_days` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创角天数',"; $_sql .= " `device_id` varchar(64) NOT NULL DEFAULT '' COMMENT '手机设备码',"; $_sql .= " `device_cnt` int(11) NOT NULL DEFAULT '1' COMMENT '登陆的设备个数',"; $_sql .= " `login_cnt` int(11) NOT NULL DEFAULT '1' COMMENT '登陆次数',"; $_sql .= " `sum_money` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '累计充值',"; $_sql .= " `sum_real_money` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '累计真实充值',"; $_sql .= " `first_pay_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '第一笔充值时间',"; $_sql .= " `last_pay_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '最近充值时间',"; $_sql .= " `last_money` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '最近充值金额',"; $_sql .= " `order_cnt` int(20) unsigned NOT NULL DEFAULT '0' COMMENT '订单数量',"; $_sql .= " `order_suc_cnt` int(20) unsigned NOT NULL DEFAULT '0' COMMENT '支付成功订单数量',"; $_sql .= " `last_login_ip` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '玩家最近登陆ip',"; $_sql .= " `auth_cnt` int(11) NOT NULL DEFAULT '0' COMMENT '授权登陆次数',"; $_sql .= " `is_cpa` tinyint(4) UNSIGNED unsigned NOT NULL DEFAULT 1 COMMENT '是否计算cpa 1 否 2是',"; $_sql .= " `is_auth` tinyint(4) UNSIGNED unsigned NOT NULL DEFAULT 1 COMMENT '是否第三方注册 1 否 2是',"; $_sql .= " `reg_app_id` int(11) NOT NULL DEFAULT '0' COMMENT '注册游戏ID',"; $_sql .= " `is_new_app` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否游戏新增注册玩家 1 否 2是',"; $_sql .= " `is_new_role` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否游戏新增角色 1 否 2是',"; $_sql .= " PRIMARY KEY (`id`),"; $_sql .= " UNIQUE KEY `ldm_date_mem_app_unique` (`date`,`mem_id`,`app_id`),"; $_sql .= " KEY `ldm_ip_index` (`last_login_ip`),"; $_sql .= " KEY `ldm_mem_index` (`mem_id`)"; $_sql .= ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家每日';"; return $this->execute($_sql); } /** * 获取活跃数据汇总排重 * * @param array $where * @param $start_time * @param $end_time * @param string $group * * @return int|string */ public function getActiveUserSum($where = [], $start_time, $end_time, $group = 'mem_id') { $_cnt = 0; $_start_date = date('Ym', $start_time); $_end_date = date('Ym', $end_time); if ($_end_date < $_start_date) { return $_cnt; } if ($_start_date == $_end_date) { $_date = date('Y-m-d', $start_time); $_cnt = $this->computeTableTwo($_date)->where($where)->group($group)->count(); } else { $tableName = []; for ($_i = $_start_date; $_i <= $_end_date; $_i++) { $_table = $this->getTable().'_'.($_i); /* 检查表是否存在 */ $_rs = $this->query('show tables like "'.$_table.'"'); if (empty($_rs)) { continue; } /* 构造sql 查询 */ $tableName[] = 'SELECT * FROM '.$_table; } if (empty($tableName)) { return $_cnt; } $tableName = '( '.implode(" UNION ", $tableName).') AS '.$this->name; $this->setTable($tableName); $_cnt = $this->where($where)->group($group)->count(); } return $_cnt; } }