|
|
<?php
|
|
|
/**
|
|
|
* 定时自动完成
|
|
|
*/
|
|
|
namespace Admin\Controller;
|
|
|
use Admin\Model\SpendModel;
|
|
|
use Think\Think;
|
|
|
use Base\Tool\Printer;
|
|
|
use Base\Tool\TaskClient;
|
|
|
use Base\Service\PromoteService;
|
|
|
use GuzzleHttp\Client;
|
|
|
|
|
|
class ConsoleController extends Think {
|
|
|
|
|
|
protected function _initialize()
|
|
|
{
|
|
|
C(api('Config/lists'));
|
|
|
}
|
|
|
|
|
|
public function modifyPromote()
|
|
|
{
|
|
|
$promotes = M('promote', 'tab_')->where(['parent_id' => 0])->select();
|
|
|
foreach ($promotes as $promote) {
|
|
|
$promote['chain'] = '/';
|
|
|
$promote['level'] = 1;
|
|
|
|
|
|
M('promote', 'tab_')->where(['id' => $promote['id']])->save(['chain' => '/', 'level' => 1]);
|
|
|
|
|
|
$subPromote = $promote;
|
|
|
unset($subPromote['id']);
|
|
|
$subPromote['parent_id'] = $promote['id'];
|
|
|
$subPromote['parent_name'] = $promote['account'];
|
|
|
$subPromote['chain'] = $promote['chain'] . $promote['id'] . '/';
|
|
|
$subPromote['level'] = $promote['level'] + 1;
|
|
|
$subPromote['account'] = 'second_' . $promote['account'];
|
|
|
$subPromote['nickname'] = '二级_' . $promote['nickname'];
|
|
|
$subPromote['mobile_phone'] = '';
|
|
|
$subPromote['email'] = '';
|
|
|
$subPromote['real_name'] = '';
|
|
|
$subPromote['money'] = 0;
|
|
|
$subPromote['total_money'] = 0;
|
|
|
$subPromote['balance_coin'] = 0;
|
|
|
$subPromote['create_time'] = time();
|
|
|
$subPromote['last_login_time'] = 0;
|
|
|
$subPromote['idcard'] = '';
|
|
|
M('promote', 'tab_')->add($subPromote);
|
|
|
$subId = M()->getLastInsID();
|
|
|
$subChain = $subPromote['chain'] . $subId . '/';
|
|
|
M('promote', 'tab_')->where(['parent_id' => $promote['id'], 'id' => ['neq', $subId]])->save([
|
|
|
'parent_id' => $subId,
|
|
|
'parent_name' => $subPromote['account'],
|
|
|
'chain' => $subChain,
|
|
|
'level' => 3,
|
|
|
]);
|
|
|
// echo M()->getLastSql() . "\n";
|
|
|
M('promote', 'tab_')->where(['grand_id' => $promote['id']])->save([
|
|
|
'chain' => ['exp', 'concat("' . $subChain. '",parent_id,"/")'],
|
|
|
'level' => 4,
|
|
|
]);
|
|
|
// echo M()->getLastSql() . "\n";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function runShiftTask()
|
|
|
{
|
|
|
$promoteService = new PromoteService();
|
|
|
$tasks = M('shift_task', 'sys_')->where(['status' => 0, 'order_time' => ['elt', time()]])->select();
|
|
|
if (count($tasks) == 0) {
|
|
|
Printer::export('无可执行任务', true);
|
|
|
}
|
|
|
foreach ($tasks as $task) {
|
|
|
if ($task['type'] == 1) {
|
|
|
$message = '推广员迁移[' . $task['id'] . ']';
|
|
|
$result = $promoteService->shiftPromote($task);
|
|
|
if ($result['status']) {
|
|
|
$message = 'SUCCESS ----- ' . $message . $result['msg'];
|
|
|
} else {
|
|
|
$message = 'ERROR ----- ' . $message . $result['msg'];
|
|
|
}
|
|
|
Printer::export($message);
|
|
|
} elseif ($task['type'] == 2) {
|
|
|
$message = '玩家迁移[' . $task['id'] . ']';
|
|
|
$result = $promoteService->shiftPlayer($task);
|
|
|
if ($result['status']) {
|
|
|
$message = 'SUCCESS ----- ' . $message . $result['msg'];
|
|
|
} else {
|
|
|
$message = 'ERROR ----- ' . $message . $result['msg'];
|
|
|
}
|
|
|
Printer::export($message);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function modifyLoginRepair()
|
|
|
{
|
|
|
$this->modifyLogin(1569686400);
|
|
|
}
|
|
|
|
|
|
public function modifyLoginGenerate($start_time=0)
|
|
|
{
|
|
|
$start_time = $start_time ? $start_time : date('Y-m-d', strtotime('-1 day'));
|
|
|
$this->modifyLogin(strtotime($start_time));
|
|
|
}
|
|
|
|
|
|
public function modifyLoginCheck($start_time=0, $end_time=0)
|
|
|
{
|
|
|
$start_time = $start_time ? strtotime($start_time) : strtotime(date("Y-m-d"));
|
|
|
$end_time = $end_time ? strtotime($end_time) : $start_time;
|
|
|
$this->modifyLogin($start_time, $end_time);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 登录校验
|
|
|
*/
|
|
|
private function modifyLogin($start_time=0, $end_time=0)
|
|
|
{
|
|
|
$current_time = $end_time?: strtotime(date("Y-m-d"))-86400;
|
|
|
for ($i=$start_time; $i<=$current_time; $i+=86400) {
|
|
|
$end_time = $i+86400;
|
|
|
$result = M()->query("SELECT
|
|
|
game_id,
|
|
|
UNIX_TIMESTAMP(FROM_UNIXTIME(login_time, '%Y-%m-%d')) create_time,
|
|
|
user_id,
|
|
|
promote_id
|
|
|
FROM
|
|
|
tab_user_login_record ulr
|
|
|
WHERE
|
|
|
login_time >= {$i} and login_time < {$end_time}
|
|
|
AND NOT EXISTS (
|
|
|
SELECT
|
|
|
id
|
|
|
FROM
|
|
|
tab_login_daily_record ldr
|
|
|
where ldr.create_time >= {$i} and ldr.create_time < {$end_time} and ldr.game_id = ulr.game_id and ldr.user_id = ulr.user_id and ldr.promote_id = ulr.promote_id
|
|
|
)
|
|
|
GROUP BY
|
|
|
create_time,
|
|
|
game_id,
|
|
|
user_id,
|
|
|
promote_id");
|
|
|
if ($result) {
|
|
|
foreach ($result as $index => $item) {
|
|
|
if (is_null($result[$index]['promote_id']))
|
|
|
{
|
|
|
unset($result[$index]);
|
|
|
}
|
|
|
}
|
|
|
$step = 500;
|
|
|
for ($j=0;;$j+=$step) {
|
|
|
$insData = array_slice($result, $j, $step);
|
|
|
if ($insData) {
|
|
|
$res = M("login_daily_record", 'tab_')->addAll($insData);
|
|
|
echo "写入 $res \n";
|
|
|
} else {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
echo "写入{$item['create_time']} 无 \n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function deleteRepeatUserPlayInfo()
|
|
|
{
|
|
|
$gameIds = [157, 155, 153, 150, 151, 148, 175, 142, 143, 172, 173, 155, 154, 180];
|
|
|
foreach($gameIds as $gameId) {
|
|
|
$this->doDeleteRepeatUserPlayInfo($gameId);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function doDeleteRepeatUserPlayInfo($gameId)
|
|
|
{
|
|
|
$sql = 'select id from tab_user_play_info a left join (
|
|
|
select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id, server_name having count(1) > 1
|
|
|
) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
|
|
|
$model = new \Think\Model();
|
|
|
|
|
|
$servers = M('server', 'tab_')->field('server_id')->where(['game_id' => $gameId])->group('server_id')->select();
|
|
|
foreach ($servers as $server) {
|
|
|
$serverId = $server['server_id'];
|
|
|
$sql = 'select a.id, a.role_id, a.server_id, a.game_id, a.role_level from tab_user_play_info a left join (
|
|
|
select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id, server_name having count(1) > 1
|
|
|
) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
|
|
|
// var_dump($sql);
|
|
|
|
|
|
$result = $model->query($sql);
|
|
|
$uniqueRole = null;
|
|
|
$items = [];
|
|
|
foreach ($result as $item) {
|
|
|
$items[$item['role_id']][] = $item;
|
|
|
}
|
|
|
|
|
|
$maxRoleIds = [];
|
|
|
$repeatIds = [];
|
|
|
foreach ($items as $roles) {
|
|
|
$maxRole = null;
|
|
|
foreach ($roles as $role) {
|
|
|
if ($maxRole == null) {
|
|
|
$maxRole = $role;
|
|
|
} elseif ($role['role_level'] > $maxRole['role_level']) {
|
|
|
$repeatIds[] = $maxRole['id'];
|
|
|
$maxRole = $role;
|
|
|
} else {
|
|
|
$repeatIds[] = $role['id'];
|
|
|
}
|
|
|
}
|
|
|
$maxRoleIds[] = $maxRole['id'];
|
|
|
}
|
|
|
if (count($repeatIds) > 0) {
|
|
|
M('user_play_info', 'tab_')->where(['id' => ['in', $repeatIds], 'game_id' => $gameId, 'server_id' => $serverId])->delete();
|
|
|
echo M()->getLastSql();
|
|
|
echo PHP_EOL;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function deleteRepeatUserPlayInfo2()
|
|
|
{
|
|
|
$gameIds = [157, 148, 150, 151, 158, 175, 142, 143, 172, 173, 154, 155, 176, 165, 164, 179, 156, 153, 180];
|
|
|
foreach ($gameIds as $gameId) {
|
|
|
$this->doDeleteRepeatUserPlayInfo2($gameId);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function doDeleteRepeatUserPlayInfo2($gameId)
|
|
|
{
|
|
|
$sql = 'select id from tab_user_play_info a left join (
|
|
|
select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id, server_name having count(1) > 1
|
|
|
) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
|
|
|
$model = new \Think\Model();
|
|
|
|
|
|
$servers = M('server', 'tab_')->field('server_id')->where(['game_id' => $gameId])->group('server_id')->select();
|
|
|
foreach ($servers as $server) {
|
|
|
$serverId = $server['server_id'];
|
|
|
$sql = 'select a.id, a.role_id, a.server_id, a.game_id, a.role_level from tab_user_play_info a left join (
|
|
|
select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id having count(1) > 1
|
|
|
) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
|
|
|
// var_dump($sql);
|
|
|
|
|
|
$result = $model->query($sql);
|
|
|
$uniqueRole = null;
|
|
|
$items = [];
|
|
|
foreach ($result as $item) {
|
|
|
$items[$item['role_id']][] = $item;
|
|
|
}
|
|
|
|
|
|
$maxRoleIds = [];
|
|
|
$repeatIds = [];
|
|
|
foreach ($items as $roles) {
|
|
|
$maxRole = null;
|
|
|
foreach ($roles as $role) {
|
|
|
if ($maxRole == null) {
|
|
|
$maxRole = $role;
|
|
|
} elseif ($role['role_level'] >= $maxRole['role_level']) {
|
|
|
$repeatIds[] = $maxRole['id'];
|
|
|
$maxRole = $role;
|
|
|
} else {
|
|
|
$repeatIds[] = $role['id'];
|
|
|
}
|
|
|
}
|
|
|
$maxRoleIds[] = $maxRole['id'];
|
|
|
}
|
|
|
if (count($repeatIds) > 0) {
|
|
|
M('user_play_info', 'tab_')->where(['id' => ['in', $repeatIds], 'game_id' => $gameId, 'server_id' => $serverId])->delete();
|
|
|
echo M()->getLastSql();
|
|
|
echo PHP_EOL;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function resetIndexChart()
|
|
|
{
|
|
|
for ($i=1; $i<100; $i++) {
|
|
|
$item = M('index_chart', 'tab_')->where(['id' => $i])->find();
|
|
|
if ($item) {
|
|
|
$item['new_user_hours'] = json_encode(unserialize($item['new_user_hours']));
|
|
|
$item['active_user_hours'] = json_encode(unserialize($item['active_user_hours']));
|
|
|
$item['active_user_list'] = json_encode(unserialize($item['active_user_list']));
|
|
|
$item['pay_user_hours'] = json_encode(unserialize($item['pay_user_hours']));
|
|
|
$item['pay_user_list'] = json_encode(unserialize($item['pay_user_list']));
|
|
|
$item['pay_money_hours'] = json_encode(unserialize($item['pay_money_hours']));
|
|
|
$item['promote_new_hours'] = json_encode(unserialize($item['promote_new_hours']));
|
|
|
$item['all_count'] = json_encode(unserialize($item['all_count']));
|
|
|
M("index_chart_1", "tab_")->add($item);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public function testLogin()
|
|
|
{
|
|
|
/* $client = new Client([
|
|
|
'base_uri' => 'http://47.111.118.107:9501',
|
|
|
'timeout' => 10.0,
|
|
|
]);
|
|
|
$response = $client->post('/game-event/login', [
|
|
|
'form_params' => [
|
|
|
'user_id' => 28747,
|
|
|
'game_id' => 153,
|
|
|
'login_time' => 1577361998
|
|
|
]
|
|
|
]);
|
|
|
$result = (string)$response->getBody();
|
|
|
echo $result; */
|
|
|
|
|
|
$data = [
|
|
|
'user_id' => 28747,
|
|
|
'game_id' => 153,
|
|
|
'login_time' => 1577361998
|
|
|
];
|
|
|
$client = new Client([
|
|
|
'base_uri' => 'http://47.111.118.107:9501',
|
|
|
'timeout' => 5.0,
|
|
|
]);
|
|
|
$promise = $client->requestAsync('POST', '/game-event/login', [
|
|
|
'form_params' => $data
|
|
|
]);
|
|
|
$promise->then(
|
|
|
function (ResponseInterface $res) {
|
|
|
echo $res->getStatusCode() . PHP_EOL;
|
|
|
},
|
|
|
function (RequestException $e) {
|
|
|
echo $e->getMessage() . PHP_EOL;
|
|
|
echo $e->getRequest()->getMethod();
|
|
|
}
|
|
|
);
|
|
|
}
|
|
|
|
|
|
public function divideWarnCheck()
|
|
|
{
|
|
|
$redis = new \Org\RedisSDK\Redis(['host'=>'127.0.0.1','port'=>6379],[]);
|
|
|
$warns = M('partner_divide_warn', 'tab_')->alias('pdw')
|
|
|
->field('pdw.*, cgr.ratio, sum(s.pay_amount) as total_amount, p.partner')
|
|
|
->join('tab_partner p on pdw.partner_id = p.id')
|
|
|
->join('tab_game g on pdw.partner_id = g.partner_id')
|
|
|
->join('tab_cp_game_ratio cgr on cgr.game_id = g.id and begin_total_amount = 0 and is_del = 0')
|
|
|
->join('tab_spend s on s.game_id = g.id')
|
|
|
->where(['pdw.status'=>1, 's.pay_status'=>1])
|
|
|
->group('pdw.id')
|
|
|
->select();
|
|
|
if (!$warns) return;
|
|
|
$taskClient = new TaskClient();
|
|
|
$current_time = date('Y-m-d H:i:s');
|
|
|
foreach ($warns as $info) {
|
|
|
if (!$info['ratio']) return;
|
|
|
$total_amount = ceil(($info['ratio'] / 100) * $info['total_amount']);
|
|
|
$cacheKey = "divide:warn:check:{$info['partner_id']}";
|
|
|
if (!($lastStep = $redis->get($cacheKey))) {
|
|
|
$lastStep = 0;
|
|
|
}
|
|
|
if ((intval($info['advance_amount']) - intval($total_amount)) <= $info['warming_amount']) {
|
|
|
if ($total_amount - $lastStep >= $info['warn_frequency']) { // 达到预警
|
|
|
// 发送预警短信
|
|
|
$content = "{$info['partner']}的预付分成款已于{$current_time}余额不足{$info['warming_amount']}元,请尽快进行充值。";
|
|
|
$sendRes = $taskClient->sendSmsBatch(json_decode($info['phones'], true), $content);
|
|
|
if ($sendRes['code'] != TaskClient::SUCCESS) {
|
|
|
continue;
|
|
|
}
|
|
|
// 变换缓存值,如果为0,需要设置过期时间
|
|
|
if ($lastStep) {
|
|
|
$redis->set($cacheKey, $total_amount);
|
|
|
} else {
|
|
|
$redis->setex($cacheKey, 86400 * 30, $total_amount);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|