You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

379 lines
13 KiB
PHP

<?php
namespace Base\Repository;
class PromoteRepository {
public function __construct()
{
}
private function assembleZero($allKeys, $records, $zeroValue) {
$noExistKeys = array_diff($allKeys, array_keys($records));
foreach ($noExistKeys as $key) {
$records[$key] = $zeroValue;
}
return $records;
}
/**
* 获取业绩公共map
*/
private function getPublicAchievementMap($ids, $params)
{
$isContainSubs = false;
if (isset($params['isContainSubs']) && $params['isContainSubs']) {
$isContainSubs = true;
}
$map = [];
$map['promote_id'] = ['in', $ids];
$allIds = $ids;
if ($isContainSubs) {
$allIds = array_merge($ids, array_keys($params['basicPromotes']));
$map['promote_id'] = ['in', $allIds];
}
if (isset($params['game_id'])) {
$map['game_id'] = $params['game_id'];
}
if (isset($params['server_id'])) {
$map['server_id'] = $params['server_id'];
}
if (isset($params['sdk_version'])) {
$map['sdk_version'] = $params['sdk_version'];
}
if (isset($params['begin_time']) && isset($params['begin_time']) && isset($params['time_column'])) {
$map[$params['time_column']] = ['between', [$params['begin_time'], $params['end_time']]];
}
if (isset($params['lock_status'])) {
$lockUserIds = M('user', 'tab_')->where(['lock_status' => 0, 'promote_id' => ['in', $allIds]])->getField('id', 'true');
if (count($lockUserIds) > 0) {
$map['user_id'] = ['not in', $lockUserIds];
}
}
return $map;
}
/**
* 获取指定推广员底下的角色创建数
*/
public function getCreateRoleCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'create_time';
$map = $this->getPublicAchievementMap($ids, $params);
$items = M('user_play_info', 'tab_')->field(['count(*) count', 'promote_id'])->where($map)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, $records, 0);
return $records;
}
/**
* 获取指定推广员底下的角色创建的用户数
*/
public function getCreateRoleUserCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'create_time';
$map = $this->getPublicAchievementMap($ids, $params);
$items = M('user_play_info', 'tab_')->field(['count(distinct user_id) count', 'promote_id'])->where($map)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, $records, 0);
return $records;
}
/**
* 获取指定推广员底下的新创角设备数
*/
public function getNewCreateRoleDeviceCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'create_time';
$map = $this->getPublicAchievementMap($ids, $params);
$subMap = $map;
if (isset($params['begin_time']) && isset($params['begin_time'])) {
$subMap['create_time'] = ['lt', $params['begin_time']];
}
$subQuery = M('user_play_info', 'tab_')->field('create_device_number')->group('create_device_number')->where($subMap)->buildSql();
$map['create_device_number'] = ['exp', ' not in (' . $subQuery . ')'];
$inQuery = M('user_play_info', 'tab_')->field('create_device_number')->group('create_device_number')->where($map)->buildSql();
$resultMap = ['create_device_number' => ['exp', ' in (' . $inQuery . ')']];
$items = M('user_play_info', 'tab_')->field(['count(*) count', 'promote_id'])->where($resultMap)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, [], 0);
return $records;
}
/**
* 获取指定推广员底下的新创角IP数
*/
public function getNewCreateRoleIpCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'create_time';
$map = $this->getPublicAchievementMap($ids, $params);
$subMap = $map;
if (isset($params['begin_time']) && isset($params['begin_time'])) {
$subMap['create_time'] = ['lt', $params['begin_time']];
}
$subQuery = M('user_play_info', 'tab_')->field('create_ip')->group('create_ip')->where($subMap)->buildSql();
$map['create_ip'] = ['exp', ' not in (' . $subQuery . ')'];
$inQuery = M('user_play_info', 'tab_')->field('create_ip')->group('create_ip')->where($map)->buildSql();
$resultMap = ['create_ip' => ['exp', ' in (' . $inQuery . ')']];
$items = M('user_play_info', 'tab_')->field(['count(*) count', 'promote_id'])->where($resultMap)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, [], 0);
return $records;
}
/**
* 获取指定推广员底下的新创角用户数
*/
public function getNewCreateRoleUserCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'create_time';
$map = $this->getPublicAchievementMap($ids, $params);
$subMap = $map;
if (isset($params['begin_time']) && isset($params['begin_time'])) {
$subMap['create_time'] = ['lt', $params['begin_time']];
}
$subQuery = M('user_play_info', 'tab_')->field('user_id')->group('user_id')->where($subMap)->buildSql();
$map['_string'] = ' user_id not in (' . $subQuery . ')';
$inQuery = M('user_play_info', 'tab_')->field('user_id')->group('user_id')->where($map)->buildSql();
$resultMap = ['_string' => 'user_id in (' . $inQuery . ')'];
$items = M('user_play_info', 'tab_')->field(['count(*) count', 'promote_id'])->where($resultMap)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, [], 0);
return $records;
}
/**
* 获取指定推广员底下的登录用户数
*/
public function getLoginUserCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'login_time';
$map = $this->getPublicAchievementMap($ids, $params);
$items = M('user_login_record', 'tab_')->field(['count(DISTINCT user_id) as count', 'promote_id'])->where($map)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, $records, 0);
return $records;
}
/**
* 获取指定推广员底下的充值次数
*/
public function getRechargeCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'pay_time';
$map = $this->getPublicAchievementMap($ids, $params);
$items = M('spend', 'tab_')->field(['count(*) count', 'promote_id'])->where($map)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, $records, 0);
return $records;
}
/**
* 获取指定推广员底下的充值用户数
*/
public function getRechargeUserCountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'pay_time';
$map = $this->getPublicAchievementMap($ids, $params);
$items = M('spend', 'tab_')->field(['count(distinct user_id) count', 'promote_id'])->where($map)->group('promote_id')->select();
$records = [];
foreach ($items as $item) {
$promoteId = $item['promote_id'];
if (isset($params['basicPromotes'][$item['promote_id']])) {
$promoteId = $params['basicPromotes'][$item['promote_id']];
}
if (isset($records[$promoteId])) {
$records[$promoteId] += $item['count'];
} else {
$records[$promoteId] = $item['count'];
}
}
$records = $this->assembleZero($ids, $records, 0);
return $records;
}
/**
* 获取指定推广员底下的充值金额(分类型)
*/
public function getRechargeAmountByIds(array $ids, array $params = [])
{
if (count($ids) == 0) {
return [];
}
$params['time_column'] = 'pay_time';
$map = $this->getPublicAchievementMap($ids, $params);
$items = M('spend', 'tab_')->field(['sum(pay_amount) amount', 'promote_id', 'pay_way'])->where($map)->group('promote_id, pay_way')->select();
$records = [];
foreach ($items as $item) {
if ($item['pay_way'] == -1) {
$records[$item['promote_id']]['ban_coin'] = $item['amount'];
} elseif ($item['pay_way'] == 0) {
$records[$item['promote_id']]['coin'] = $item['amount'];
} else {
if (isset($records[$item['promote_id']])) {
$records[$item['promote_id']]['cash'] = isset($records[$item['promote_id']]['cash']) ?
$records[$item['promote_id']]['cash'] + $item['amount'] :
$item['amount'];
} else {
$records[$item['promote_id']]['cash'] = $item['amount'];
}
}
}
foreach ($ids as $id) {
if (isset($records[$id])) {
$records[$id] = [
'ban_coin' => isset($records[$id]['ban_coin']) ? $records[$id]['ban_coin'] : 0,
'coin' => isset($records[$id]['coin']) ? $records[$id]['coin'] : 0,
'cash' => isset($records[$id]['cash']) ? $records[$id]['cash'] : 0,
];
} else {
$records[$id] = [
'ban_coin' => 0,
'coin' => 0,
'cash' => 0,
];
}
}
return $records;
}
}