From ecf460e7c9da01928a59b836042544dc43264640 Mon Sep 17 00:00:00 2001 From: ELF <360197197@qq.com> Date: Fri, 14 Aug 2020 18:29:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/Service/PromoteService.class.php | 26 ++ Application/Base/Tool/GameCatClient.class.php | 1 + .../TestingResourceController.class.php | 254 ++++++++++++++---- .../View/default/TestingResource/apply.html | 44 ++- .../View/default/TestingResource/batches.html | 131 +++------ .../View/default/TestingResource/index.html | 15 +- Data/update.sql | 19 +- 7 files changed, 319 insertions(+), 171 deletions(-) diff --git a/Application/Base/Service/PromoteService.class.php b/Application/Base/Service/PromoteService.class.php index 2f54f9bbc..30e2bcf7d 100644 --- a/Application/Base/Service/PromoteService.class.php +++ b/Application/Base/Service/PromoteService.class.php @@ -825,6 +825,32 @@ class PromoteService { return $chain == '' ? 1 : count(explode('/', $chain)); } + public function getIdsByChain($chain) + { + $chain = trim($chain, '/'); + return $chain == '' ? [] : explode('/', $chain); + } + + public function isSub($promote, $parent) + { + $chainList = $this->getIdsByChain($promote['chain']); + if (in_array($parent['id'], $chainList)) { + return true; + } + return false; + } + + public function isSubOrSelf($promote, $parent) + { + if ($promote['id'] == $parent['id']) { + return true; + } elseif ($this->isSub($promote, $parent)) { + return true; + } else { + return false; + } + } + /** * 获取最上级的推广员 */ diff --git a/Application/Base/Tool/GameCatClient.class.php b/Application/Base/Tool/GameCatClient.class.php index 0b23bac3d..11e2bd73d 100644 --- a/Application/Base/Tool/GameCatClient.class.php +++ b/Application/Base/Tool/GameCatClient.class.php @@ -51,6 +51,7 @@ class GameCatClient } $params['appId'] = $this->appIds[$deviceType] ?? $this->appIds['andriod']; $params['channelId'] = $this->channelIds[$deviceType] ?? $this->channelIds['andriod']; + $params['timestamp'] = time(); $params[self::SIGN_NAME] = $this->sign($params); try { diff --git a/Application/Home/Controller/TestingResourceController.class.php b/Application/Home/Controller/TestingResourceController.class.php index 3f4b050d5..b61e70b12 100644 --- a/Application/Home/Controller/TestingResourceController.class.php +++ b/Application/Home/Controller/TestingResourceController.class.php @@ -62,7 +62,10 @@ class TestingResourceController extends BaseController list($roles, $pagination, $count) = $this->paginate($query); - $roleIds = array_column($roles, 'id'); + $bindingOrWhere = []; + foreach ($roles as $role) { + $bindingOrWhere[] = '(role_id="' . $role['role_id'] . '" and game_id=' . $role['game_id'] . ')'; + } $userIds = array_unique(array_column($roles, 'user_id')); $users = []; @@ -71,25 +74,44 @@ class TestingResourceController extends BaseController if (count($roles) > 0) { $users = M('user', 'tab_')->field(['id', 'phone'])->where(['id' => ['in', $userIds]])->select(); $uesrs = index_by_column('id', $users); - $bindings = M('testing_binding', 'tab_')->where(['role_id' => ['in', $roleIds]])->select(); - $bindings = index_by_column('role_id', $bindings); - $bindingRoleIds = array_column($bindings, 'bind_role_id'); + $bindingRows = M('testing_binding', 'tab_')->where(['_string' => implode(' or ', $bindingOrWhere)])->select(); + $bindingRoleIds = []; + foreach ($bindingRows as $bindingRow) { + $bindings[$this->getGameRoleId($bindingRow['game_id'], $bindingRow['role_id'])] = $bindingRow; + $bindingRoleIds[] = $this->getGameRoleId($bindingRow['game_id'], $bindingRow['bind_role_id']); + } if (count($bindings) > 0) { - $bindingRoles = M('user_play_info', 'tab_')->field(['id', 'role_id', 'role_name', 'user_account'])->where(['id' => ['in', $bindingRoleIds]])->select(); - $bindingRoles = index_by_column('id', $bindingRoles); + $bindingRoles = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'role_name', 'user_account', 'game_id', 'game_role_id']) + ->where(['game_role_id' => ['in', $bindingRoleIds]]) + ->select(); + $bindingRoles = index_by_column('game_role_id', $bindingRoles); } } - + $spendItems = []; if (count($bindingRoles) > 0) { - M('spend', 'tab_')->where(); + $spendOrWhere = []; + foreach ($bindingRoles as $bindingRole) { + $spendOrWhere[] = '(game_player_id="' . $bindingRole['role_id'] . '" and game_id=' . $bindingRole['game_id'] . ')'; + } + $spendCondition = [ + 'pay_status' => 1, + '_string' => '(' . implode(' or ', $spendOrWhere) . ')', + ]; + $spendList = M('spend', 'tab_')->field('sum(pay_amount) amount, game_id, game_player_id')->where($spendOrWhere)->group('game_id,game_player_id')->select(); + foreach ($spendList as $item) { + $spendItems[$this->getGameRoleId($item['game_id'], $item['game_player_id'])] = $item['amount']; + } } - - $records = []; foreach ($roles as $role) { $user = $users[$role['user_id']] ?? null; - $binding = $bindings[$role['id']] ?? null; - $bindingRole = $binding && $bindingRoles[$binding['bind_role_id']] ? $bindingRoles[$binding['bind_role_id']] : null; + $binding = $bindings[$role['game_role_id']] ?? null; + $bindingRole = null; + if ($binding) { + $bindGameRoleId = $this->getGameRoleId($binding['game_id'], $binding['bind_role_id']); + $bindingRole = $bindingRoles[$bindGameRoleId] ? $bindingRoles[$bindGameRoleId] : null; + } $records[] = [ 'id' => $role['id'], 'game_name' => $role['game_name'], @@ -103,7 +125,7 @@ class TestingResourceController extends BaseController 'bind_role_name' => $bindingRole ? $bindingRole['role_name'] : '', 'base_quota' => $binding ? $binding['base_quota'] : 0, 'other_quota' => $binding ? $binding['other_quota'] : 0, - 'quota' => 0, + 'quota' => $bindingRole && isset($spendItems[$bindingRole['game_role_id']]) ? $spendItems[$bindingRole['game_role_id']] : 0, 'verify_amount' => 0, 'provide_amount' => 0, 'today_amount' => 0, @@ -119,6 +141,11 @@ class TestingResourceController extends BaseController $this->display(); } + private function getGameRoleId($gameId, $roleId) + { + return $gameId . '#' . $roleId; + } + public function addTestingUsers() { $loginPromote = $this->getLoginPromote(); @@ -175,8 +202,12 @@ class TestingResourceController extends BaseController $loginPromote = $this->getLoginPromote(); $promoteService = new PromoteService(); + $subSql = M('user', 'tab_') + ->where('id=tab_testing_resource_batch.user_id and promote_id in (' . $promoteService->subInSql($loginPromote) . ')') + ->select(false); + $conditions = [ - '_string' => 'promote_id in (' . $promoteService->subInSql($loginPromote) . ')', + '_string' => 'exists (' . $subSql . ')' ]; if ($verifyTimeStart) { $conditions['verify_time'] = ['egt', strtotime($verifyTimeStart . ' 00:00:00')]; @@ -195,28 +226,60 @@ class TestingResourceController extends BaseController if ($user) { $conditions['user_id'] = $user['id']; } else { - $conditions['_string'] = '1<>1'; + $conditions['_string'] .= ' and 1<>1'; } } - $query = M('testing_resource_batch', 'tab_')->where($conditions)->order('create_time desc')->select(); + $query = M('testing_resource_batch', 'tab_')->where($conditions)->order('create_time desc'); list($batches, $pagination, $count) = $this->paginate($query); + $roles = []; + $applyPromotes = []; + $users = []; + $promotes = []; + if (count($batches) > 0) { + $gameRoleIds = []; + foreach ($batches as $batch) { + $gameRoleIds[] = $this->getGameRoleId($batch['game_id'], $batch['role_id']); + } + $roles = M('user_play_info', 'tab_') + ->field(['id', 'game_name', 'server_name', 'role_name', 'game_role_id', 'user_account']) + ->where(['game_role_id' => ['in', $gameRoleIds]]) + ->select(); + $roles = index_by_column('game_role_id', $roles); + + $users = M('user', 'tab_')->field(['id', 'account', 'phone', 'promote_id'])->where(['id' => ['in', array_column($batches, 'user_id')]])->select(); + $users = index_by_column('id', $users); + + $applyPromotes = M('promote', 'tab_')->field(['id', 'account'])->where(['id' => ['in', array_column($batches, 'apply_promote_id')]])->select(); + $applyPromotes = index_by_column('id', $applyPromotes); + + if (count($users) > 0) { + $promotes = M('promote', 'tab_')->field(['id', 'account'])->where(['id' => ['in', array_column($users, 'promote_id')]])->select(); + $promotes = index_by_column('id', $promotes); + } + } + $records = []; foreach ($batches as $batch) { + $roleKey = $this->getGameRoleId($batch['game_id'], $batch['role_id']); + $role = isset($roles[$roleKey]) ? $roles[$roleKey] : null; + $user = $users[$batch['user_id']] ?? null; + $applyPromote = $applyPromotes[$batch['apply_promote_id']] ?? null; + $promote = $user && isset($promotes[$user['promote_id']]) ? $promotes[$user['promote_id']] : null; $records[] = [ 'id' => $batch['id'], - 'batch_no' => $batch['batch_no'], + 'batch_no' => substr($batch['batch_no'], 14), 'create_time' => date('Y-m-d H:i:s', $batch['create_time']), - 'game_name' => $batch['game_id'], - 'server_name' => $batch['server_id'], - 'role_name' => $batch['role_id'], - 'user_account' => $batch['user_id'], - 'user_phone' => $batch['batch_no'], - 'creator_account' => $batch['batch_no'], + 'game_name' => $role ? $role['game_name'] : '--', + 'server_name' => $role ? $role['server_name'] : '--', + 'role_name' => $role ? $role['role_name'] : '--', + 'user_account' => $role ?$role['user_account'] : '--', + 'user_phone' => $user ? $user['phone'] : '', + 'apply_promote_account' => $applyPromote ? $applyPromote['account'] : '', + 'promote_account' => $promote['account'], 'history_provide_amount' => 0.00, 'apply_amount' => $batch['apply_amount'], 'provide_amount' => $batch['provide_amount'], - 'remark' => $batch['remark'], 'verify_status_text' => $batch['verify_status'], 'verify_time' => date('Y-m-d H:i:s', $batch['verify_time']), 'status_text' => $batch['status'], @@ -249,22 +312,38 @@ class TestingResourceController extends BaseController $this->display(); } + private function getRemainQuota($gameId, $bindRoleId, $testingRoleId) + { + $totalQuota = M('spend', 'tab_') + ->where(['game_id' => $gameId, 'game_player_id' => $bindRoleId]) + ->group('game_id,game_player_id') + ->sum('pay_amount'); + $usedQuota = M('testing_resource_batch', 'tab_')->where(['game_id' => $gameId, 'role_id' => $testingRoleId])->sum('provide_amount'); + return round(floatval($totalQuota) - floatval($usedQuota), 2); + } + public function apply() { - $roleId = I('role_id', 0); + $id = I('id', 0); $role = null; - if ($roleId > 0) { - $role = M('user_play_info', 'tab_')->field(['id', 'role_id', 'user_id', 'game_id', 'server_id', 'user_account', 'role_name'])->where(['id' => $roleId])->find(); + if ($id != 0) { + $role = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'user_id', 'game_id', 'server_id', 'user_account', 'role_name']) + ->where(['id' => $id]) + ->find(); } $servers = []; $bindingRole = null; if ($role) { $servers = M('server', 'tab_')->field('id,server_name,server_id')->where(['game_id' => $role['game_id']])->order('server_id asc')->select(); - $binding = M('testing_binding', 'tab_')->where(['role_id' => $roleId])->find(); + $binding = M('testing_binding', 'tab_')->where(['game_id' => $role['game_id'], 'role_id' => $role['role_id']])->find(); if ($binding) { - $bindingRole = M('user_play_info', 'tab_')->field(['id', 'role_id', 'user_id', 'game_id', 'server_id', 'user_account', 'role_name'])->where(['id' => $binding['bind_role_id']])->find(); + $bindingRole = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'user_id', 'game_id', 'server_id', 'user_account', 'role_name']) + ->where(['game_id' => $binding['game_id'], 'role_id' => $binding['bind_role_id']]) + ->find(); } } @@ -276,13 +355,14 @@ class TestingResourceController extends BaseController $this->assign('servers', $servers); $this->assign('bindingRole', $bindingRole); $this->assign('role', $role); + $this->assign('quota', $this->getRemainQuota($bindingRole['game_id'], $bindingRole['role_id'], $role['role_id'])); $this->display(); } public function doApply() { $gameId = I('game_id', 0); - $roleId = I('role_id', 0); + $roleId = I('role_id', ''); $serverId = I('server_id', 0); $userAccount = I('user_account', ''); $records = I('records', []); @@ -292,10 +372,17 @@ class TestingResourceController extends BaseController /** * @todo 目前仅限游戏猫 */ - if (!in_array($gameId, [229, 230])) { - return $this->ajaxReturn(['status' => 0, 'message' => '该游戏不可申请资源']); + if ($gameId == 229) { + $resources = $this->getGameCatResources('android'); + } elseif ($gameId == 230) { + $resources = $this->getGameCatResources('ios'); } else { - $resources = $this->getGameCatResources(); + return $this->ajaxReturn(['status' => 0, 'message' => '该游戏不可申请资源']); + } + + $binding = M('testing_binding', 'tab_')->where(['game_id' => $gameId, 'role_id' => $roleId])->find(); + if (is_null($binding)) { + return $this->ajaxReturn(['status' => 0, 'message' => '该角色未绑定玩家角色']); } $user = M('user', 'tab_')->field(['id', 'promote_id'])->where(['account' => $userAccount])->find(); @@ -312,14 +399,36 @@ class TestingResourceController extends BaseController return $this->ajaxReturn(['status' => 0, 'message' => '区服不存在']); } + $promoteService = new PromoteService(); + $role = M('user_play_info', 'tab_') - ->field(['id', 'role_id']) - ->where(['user_id' => $user['id'], 'game_id' => $gameId, 'server_id' => $server['server_id']]) + ->field(['id', 'role_id', 'promote_id']) + ->where(['user_id' => $user['id'], 'game_id' => $gameId, 'server_id' => $server['server_id'], 'role_id' => $roleId]) ->find(); if (is_null($role)) { return $this->ajaxReturn(['status' => 0, 'message' => '角色不存在']); } + $testPromote = M('promote', 'tab_')->field(['id', 'chain'])->where(['id' => $role['promote_id']])->find(); + if (is_null($testPromote) || !$promoteService->isSubOrSelf($testPromote, $loginPromote)) { + return $this->ajaxReturn(['status' => 0, 'message' => '测试角色所属推广员异常']); + } + + $bindingRole = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'user_id', 'promote_id']) + ->where(['game_id' => $gameId, 'role_id' => $binding['bind_role_id']]) + ->find(); + if (is_null($bindingRole)) { + return $this->ajaxReturn(['status' => 0, 'message' => '绑定玩家角色不存在']); + } + $bindPromote = M('promote', 'tab_')->field(['id', 'chain'])->where(['id' => $bindingRole['promote_id']])->find(); + if (is_null($bindPromote) || !$promoteService->isSubOrSelf($bindPromote, $loginPromote)) { + return $this->ajaxReturn(['status' => 0, 'message' => '绑定角色所属推广员异常']); + } + if ($testPromote['id'] != $bindPromote['id']) { + return $this->ajaxReturn(['status' => 0, 'message' => '测试账号与玩家账号所属推广员不同']); + } + $amount = 0; foreach ($records as $key => $record) { if (isset($resources[$record['resource_id']])) { @@ -332,6 +441,11 @@ class TestingResourceController extends BaseController } } + $remainQuota = $this->getRemainQuota($bindingRole['game_id'], $bindingRole['role_id'], $role['role_id']); + if ($amount > $remainQuota) { + // return $this->ajaxReturn(['status' => 0, 'message' => '额度不足']); + } + $batchNo = date('YmdHis') . substr(md5($loginPromote['id'] . strval(microtime(true)) . rand(0, 9999)), 8, 16); try { @@ -339,21 +453,19 @@ class TestingResourceController extends BaseController $model->startTrans(); $batch = [ - 'batch_id' => $batchId, 'batch_no' => $batchNo, 'user_id' => $testingUser['user_id'], 'game_id' => $gameId, 'role_id' => $roleId, 'server_id' => $serverId, - 'promote_id' => $loginPromote['id'], - 'amount' => $amount, - 'status' => 0, + 'apply_promote_id' => $loginPromote['id'], + 'apply_amount' => $amount, + 'provide_status' => 0, 'verify_status' => 0, - 'remark' => $record['remark'], 'create_time' => time(), 'update_time' => time(), ]; - $batchId = M('testing_resource_batch')->add($batch); + $batchId = M('testing_resource_batch', 'tab_')->add($batch); $i = 1; foreach ($records as $record) { $orderNo = $batchNo . '_' . $i; @@ -366,24 +478,29 @@ class TestingResourceController extends BaseController 'amount' => $record['num'] * $record['value'], 'remark' => $record['remark'], ]; - M('testing_resource_order')->add($order); + M('testing_resource_order', 'tab_')->add($order); } $model->commit(); return $this->ajaxReturn(['status' => 1, 'message' => '申请成功,等待审核']); } catch (\Exception $e) { $model->rollback(); - return $this->ajaxReturn(['status' => 0, 'message' => '系统异常']); + return $this->ajaxReturn(['status' => 0, 'message' => '系统异常' . $e->getMessage()]); } } public function bindRole() { - $testingRoleId = I('testing_role_id', 0); - $bindRoleId = I('bind_role_id', 0); + $gameId = I('game_id', 0); + $testingRoleId = I('testing_role_id', ''); + $bindRoleId = I('bind_role_id', ''); + $loginPromote = $this->getLoginPromote(); + + $testingGameRoleId = $this->getGameRoleId($gameId, $testingRoleId); + $bindGameRoleId = $this->getGameRoleId($gameId, $bindRoleId); $testingRole = M('user_play_info', 'tab_') - ->field(['id', 'role_id', 'user_id']) - ->where(['id' => $testingRoleId]) + ->field(['id', 'role_id', 'user_id', 'game_id', 'promote_id']) + ->where(['game_role_id' => $testingGameRoleId]) ->find(); if (is_null($testingRole)) { return $this->ajaxReturn(['status' => 0, 'message' => '测试账号角色不存在']); @@ -394,34 +511,50 @@ class TestingResourceController extends BaseController return $this->ajaxReturn(['status' => 0, 'message' => '测试账号不存在']); } + $promoteService = new PromoteService(); + $testPromote = M('promote', 'tab_')->field(['id', 'chain'])->where(['id' => $testingRole['promote_id']])->find(); + if (is_null($testPromote) || !$promoteService->isSubOrSelf($testPromote, $loginPromote)) { + return $this->ajaxReturn(['status' => 0, 'message' => '测试角色所属推广员异常']); + } + $bindRole = M('user_play_info', 'tab_') - ->field(['id', 'role_id', 'user_id']) - ->where(['id' => $bindRoleId]) + ->field(['id', 'role_id', 'user_id', 'promote_id']) + ->where(['game_role_id' => $bindGameRoleId]) ->find(); if (is_null($bindRole)) { return $this->ajaxReturn(['status' => 0, 'message' => '玩家角色不存在']); } + $bindPromote = M('promote', 'tab_')->field(['id', 'chain'])->where(['id' => $bindRole['promote_id']])->find(); + if (is_null($bindPromote) || !$promoteService->isSubOrSelf($bindPromote, $loginPromote)) { + return $this->ajaxReturn(['status' => 0, 'message' => '玩家账号所属推广员异常']); + } + + if ($testPromote['id'] != $bindPromote['id']) { + return $this->ajaxReturn(['status' => 0, 'message' => '玩家账号与测试账号非同一推广员']); + } + $bindIsTesting = M('testing_user', 'tab_')->where(['user_id' => $bindRole['user_id']])->find(); if ($bindIsTesting) { return $this->ajaxReturn(['status' => 0, 'message' => '该玩家账号为测试账号,无法绑定']); } - $existBind = M('testing_binding', 'tab_')->field(['id'])->where(['bind_role_id' => $bindRoleId])->find(); + $existBind = M('testing_binding', 'tab_')->field(['id'])->where(['game_id' => $gameId, 'bind_role_id' => $bindRoleId])->find(); if ($existBind) { return $this->ajaxReturn(['status' => 0, 'message' => '该玩家角色已被绑定']); } - $testExistBind = M('testing_binding', 'tab_')->field(['id'])->where(['role_id' => $testingRoleId])->find(); + $testExistBind = M('testing_binding', 'tab_')->field(['id'])->where(['game_id' => $gameId, 'role_id' => $testingRoleId])->find(); if ($testExistBind) { return $this->ajaxReturn(['status' => 0, 'message' => '该测试账号角色已绑定有角色']); } M('testing_binding', 'tab_')->add([ + 'game_id' => $testingRole['game_id'], 'user_id' => $testingRole['user_id'], - 'role_id' => $testingRole['id'], + 'role_id' => $testingRole['role_id'], 'bind_user_id' => $bindRole['user_id'], - 'bind_role_id' => $bindRole['id'], + 'bind_role_id' => $bindRole['role_id'], 'create_time' => time(), 'update_time' => time() ]); @@ -485,11 +618,16 @@ class TestingResourceController extends BaseController return $this->ajaxReturn(['status' => 0, 'message' => '区服不存在']); } + $user = M('user', 'tab_')->field(['id', 'promote_id'])->where(['account' => $userAccount])->find(); + if (is_null($user)) { + return $this->ajaxReturn(['status' => 0, 'message' => '账号不存在']); + } + $testingUser = M('testing_user', 'tab_')->where(['user_account' => $userAccount])->find(); $isTestingAccount = is_null($testingUser) ? false : true; $roles = M('user_play_info', 'tab_') - ->field(['id', 'role_name']) + ->field(['id', 'role_id', 'role_name']) ->where(['user_account' => $userAccount, 'game_id' => $gameId, 'server_id' => $server['server_id']]) ->select(); return $this->ajaxReturn(['status' => 1, 'message' => '获取成功', 'data' => ['roles' => $roles, 'is_testing_account' => $isTestingAccount]]); @@ -497,6 +635,14 @@ class TestingResourceController extends BaseController private function getGameCatResources($deviceType) { + /* return [ + 1 => ['ref_id' => 1, 'name' => '礼包钻石6', 'amount' => 6], + 2 => ['ref_id' => 2, 'name' => '礼包钻石18', 'amount' => 18], + 3 => ['ref_id' => 3, 'name' => '礼包钻石30', 'amount' => 30], + 4 => ['ref_id' => 4, 'name' => '礼包钻石98', 'amount' => 98], + 5 => ['ref_id' => 5, 'name' => '礼包钻石128', 'amount' => 128], + 6 => ['ref_id' => 6, 'name' => '礼包钻石648', 'amount' => 648], + ]; */ $resources = []; $gameCatClient = new GameCatClient(); $result = $gameCatClient->api('get-pay-type', ['device_type' => $deviceType]); diff --git a/Application/Home/View/default/TestingResource/apply.html b/Application/Home/View/default/TestingResource/apply.html index 9c09f1b07..3820eb0ce 100644 --- a/Application/Home/View/default/TestingResource/apply.html +++ b/Application/Home/View/default/TestingResource/apply.html @@ -112,21 +112,25 @@
+
-
当前可用额度:1364 待审核额度:0
+
+ 当前可用额度: 待审核额度:0 +
+