diff --git a/Application/Admin/Controller/ConsoleController.class.php b/Application/Admin/Controller/ConsoleController.class.php index 771cf52d1..e094f86fe 100644 --- a/Application/Admin/Controller/ConsoleController.class.php +++ b/Application/Admin/Controller/ConsoleController.class.php @@ -131,6 +131,21 @@ class ConsoleController extends Think { var_dump($result); } + public function testGameCat() + { + $key = '123456'; + $params = [ + + ]; + ksort($params); + $paramsStr = http_build_query($params) . '&key=' . $key; + $sign = md5($paramsStr); + + $client = new AggregateClient(); + $result = $client->api('game-data', ['unique_codes' => ['w123'], 'started_at' => '2019-06-27', 'ended_at' => '2020-07-27']); + var_dump($result); + } + public function initMarketAdmin() { $marketService = new MarketService(); diff --git a/Application/Admin/Controller/GameApiController.class.php b/Application/Admin/Controller/GameApiController.class.php new file mode 100644 index 000000000..7bd30f474 --- /dev/null +++ b/Application/Admin/Controller/GameApiController.class.php @@ -0,0 +1,57 @@ +where(['verify_status' => 0])->select(); + foreach ($batches as $batch) { + $service->verify($batch); + } + } + + public function provide() + { + $service = new TestingResourceService(); + $batches = M('testing_resource_batch', 'tab_')->where(['verify_status' => 1, 'provide_status' => 0])->select(); + foreach ($batches as $batch) { + $service->provide($batch); + } + } + + public function send() + { + $role = [ + 'role_id' => '6819493', + 'user_account' => 'qh11102', + 'sdk_version' => 1, + ]; + $order = [ + 'ref_amount' => '10.00', + 'ref_id' => '8', + 'remark' => '测试', + 'order_no' => date('YmdHis') . rand(1000, 9999) . '_1', + ]; + $service = new TestingResourceService(); + $result = $service->provideFromGameCat($order, $role); + var_dump($result); + } +} diff --git a/Application/Base/Service/PromoteService.class.php b/Application/Base/Service/PromoteService.class.php index 68962de83..41c4fd8f0 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; + } + } + /** * 获取最上级的推广员 */ @@ -854,6 +880,18 @@ class PromoteService { return M('promote', 'tab_')->field($fields)->where($conditions)->select(); } + public function subInSql($promote, $withSelf = true) + { + $conditions = [ + 'chain' => ['like', $promote['chain'] . $promote['id'] . '/%'] + ]; + if ($withSelf != 0) { + $conditions['_logic'] = 'or'; + $conditions['id'] = $promote['id']; + } + return M('promote', 'tab_')->field(['id'])->where($conditions)->select(false); + } + public function getLevelName($level) { return self::$levels[$level] ?? '未知'; @@ -1122,7 +1160,7 @@ class PromoteService { $selfGameIds = $topGameIds; // $selfGameIds = $promote['game_ids'] == '' ? [] : explode(',', $promote['game_ids']); // $selfGameIds = array_intersect($topGameIds, $selfGameIds); - + if ($promote['level'] == 1) { return $selfGameIds; } diff --git a/Application/Base/Service/TestingResourceService.class.php b/Application/Base/Service/TestingResourceService.class.php new file mode 100644 index 000000000..31db4fd23 --- /dev/null +++ b/Application/Base/Service/TestingResourceService.class.php @@ -0,0 +1,133 @@ + '待发放', + '1' => '已发放', + '2' => '异常', + ]; + public static $verifyStatusList = [ + '0' => '未审核', + '1' => '审核通过', + '2' => '审核拒绝', + ]; + + public function getProvideStatusText($provideStatus) + { + return self::$provideStatusList[$provideStatus] ?? '未知'; + } + + public function getVerifyStatusText($verifyStatus) + { + return self::$verifyStatusList[$verifyStatus] ?? '未知'; + } + + public function verify($batch) + { + if ($batch['verify_status'] != 0) { + throw new \Exception('审核状态异常'); + } + + $batchData = []; + $batchData['verify_time'] = time(); + $batchData['update_time'] = time(); + + if (!in_array($batch['game_id'], [229, 230])) { + + $batchData['verify_status'] = 2; + $batchData['verify_remark'] = '该游戏发放功能暂未实现'; + M('testing_resource_batch', 'tab_')->where(['id' => $batch['id']])->save($batchData); + + throw new \Exception('该游戏发放功能暂未实现'); + } + + $batchData['verify_status'] = 1; + $batchData['verify_remark'] = '审核成功'; + M('testing_resource_batch', 'tab_')->where(['id' => $batch['id']])->save($batchData); + } + + public function provide($batch) + { + if ($batch['verify_status'] != 1) { + throw new \Exception('该申请未审核通过'); + } + + if ($batch['provide_status'] != 0) { + throw new \Exception('发放状态异常'); + } + + $role = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'user_id', 'promote_id', 'user_account', 'sdk_version']) + ->where(['game_id' => $batch['game_id'], 'role_id' => $batch['role_id']]) + ->find(); + $orders = M('testing_resource_order', 'tab_') + ->where(['batch_id' => $batch['id']]) + ->select(); + + $hasError = false; + $provideAmount = 0; + foreach ($orders as $order) { + $result = $this->provideFromGameCat($order, $role); + $orderData = [ + 'result' => json_encode(['code' => $result['code'], 'message' => $result['message']]), + ]; + if (!$result['status']) { + $hasError = true; + $orderData['provide_status'] = 2; + } else { + $orderData['provide_status'] = 1; + } + $provideAmount += round($order['ref_amount'] * $order['num'], 2); + $orderData['provide_time'] = time(); + M('testing_resource_order', 'tab_') + ->where(['id' => $order['id']]) + ->save($orderData); + } + + $batchData = []; + if ($hasError) { + $batchData['provide_status'] = 2; + } else { + $batchData['provide_status'] = 1; + } + $batchData['provide_time'] = time(); + $batchData['provide_amount'] = $provideAmount; + $batchData['update_time'] = time(); + M('testing_resource_batch', 'tab_') + ->where(['id' => $batch['id']]) + ->save($batchData); + } + + public function provideFromGameCat($order, $role) + { + $gameCatClient = new GameCatClient(); + $result = $gameCatClient->api('provide', [ + 'roleId' => $role['role_id'], + 'amount' => intval($order['ref_amount']), + 'supportItem' => $order['ref_id'], + 'supportType' => '0', + 'channelUid' => $role['user_account'], + 'applyRemark' => $order['remark'] == '' ? '测试资源申请' : $order['remark'], + 'applyId' => $order['order_no'], + 'device_type' => $role['sdk_version'] == 1 ? 'andriod' : 'ios', + ]); + if ($result['state'] == 1 && $result['data']) { + return [ + 'status' => true, + 'message' => $result['msg'], + 'code' => 1, + ]; + } else { + return [ + 'status' => false, + 'msg' => $result['msg'], + 'code' => $result['state'], + ]; + } + } +} \ No newline at end of file diff --git a/Application/Base/Service/UserService.class.php b/Application/Base/Service/UserService.class.php index b6ff8f27b..f0d680ed1 100644 --- a/Application/Base/Service/UserService.class.php +++ b/Application/Base/Service/UserService.class.php @@ -3,7 +3,8 @@ namespace Base\Service; use Base\Facade\Request; -class UserService { +class UserService +{ public function isAccountExist($account) { diff --git a/Application/Base/Tool/GameCatClient.class.php b/Application/Base/Tool/GameCatClient.class.php new file mode 100644 index 000000000..594c1964c --- /dev/null +++ b/Application/Base/Tool/GameCatClient.class.php @@ -0,0 +1,108 @@ + ['uri' => '/game/support/items/v1', 'method' => 'post'], + 'provide' => ['uri' => '/game/support/provide/v1', 'method' => 'post'], + ]; + + private $appIds = [ + 'andriod' => 1746, + 'ios' => 1747, + ]; + + private $channelIds = [ + 'andriod' => 11595, + 'ios' => 11596, + ]; + + public function __construct() + { + $this->client = new Client([ + 'base_uri' => C('GAME_CAT_URL'), + 'timeout' => 10.0, + ]); + } + + public function api($api, array $params = []) + { + $api = $this->apis[$api] ?? null; + if (is_null($api)) { + throw new \Exception('接口不存在'); + } + $deviceType = 'andriod'; + if (isset($params['device_type'])) { + $deviceType = $params['device_type']; + unset($params['device_type']); + } + $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 { + return $this->request($api, $params); + } catch (\Exception $e) { + $env = C('APP_ENV', null, 'prod'); + return ['code' => 1000, 'state' => 1000, 'message' => '接口请求错误。' . ($env == 'prod' ? '' : $e->getMessage()) , 'data' => []]; + } + } + + public function request($api, $params) + { + if ($api['method'] == 'get') { + return $this->get($api['uri'], $params); + } else { + return $this->post($api['uri'], $params); + } + } + + protected function post($uri, array $params = []) + { + $response = $this->client->post($uri, [ + 'verify' => false, + 'form_params' => $params, + ]); + $result = (string)$response->getBody(); + /* var_dump($uri); + var_dump($params); + var_dump($result); */ + return json_decode($result, true); + } + + protected function get($uri, array $params = []) + { + $response = $this->client->get($uri, [ + 'verify' => false, + 'query' => $params, + ]); + $result = (string)$response->getBody(); + return json_decode($result, true); + } + + protected function sign($params) + { + unset($params[self::SIGN_NAME]); + ksort($params); + $params['key'] = C('GAME_CAT_KEY'); + $signRows = []; + foreach ($params as $key => $value) { + $signRows[] = $key . '=' . $value; + } + // var_dump(implode('&', $signRows)); + return md5(implode('&', $signRows)); + } +} \ No newline at end of file diff --git a/Application/Common/Common/extend.php b/Application/Common/Common/extend.php index da0f442f3..b5401ede7 100644 --- a/Application/Common/Common/extend.php +++ b/Application/Common/Common/extend.php @@ -833,7 +833,15 @@ function Status_recovery($msg){ if (empty($str)) {return $title;} $find = array('%webname%','%gamename%','%newsname%','%giftname%','%gametype%', '%catetitle%', '%gamedevice%'); - $replace = array($title,$array['game_name'],$array['news_title'],$array['giftbag_name'],$array['game_type_name'],$array['cate_title'],$array['game_device']); + $replace = array( + $title, + $array['game_name'] ?? '', + $array['news_title'] ?? '', + $array['giftbag_name'] ?? '', + $array['game_type_name'] ?? '', + $array['cate_title'] ?? '', + $array['game_device'] ?? '' + ); $str = str_replace($find,$replace,$str); return preg_replace('/((-|_)+)?((%[0-9A-Za-z_]*%)|%+)((-|_)+)?/','',$str); diff --git a/Application/Home/Controller/DownloadController.class.php b/Application/Home/Controller/DownloadController.class.php index 08225978b..b81a44233 100644 --- a/Application/Home/Controller/DownloadController.class.php +++ b/Application/Home/Controller/DownloadController.class.php @@ -1446,18 +1446,18 @@ class DownloadController extends BaseController { if (!empty(I('begtime')) && empty(I('endtime'))) { - $map['tab_spend.pay_time'] = ['egt', strtotime(I('begtime'))]; + $map['tab_spend.spend_time'] = ['egt', strtotime(I('begtime'))]; } elseif (empty(I('begtime')) && !empty(I('endtime'))) { - $map['tab_spend.pay_time'] = ['elt', strtotime(I('endtime')) + 86399]; + $map['tab_spend.spend_time'] = ['elt', strtotime(I('endtime')) + 86399]; } elseif (!empty(I('begtime')) && !empty(I('endtime'))) { - $map['tab_spend.pay_time'] = ['between', [strtotime(I('begtime')), strtotime(I('endtime')) + 86399]]; + $map['tab_spend.spend_time'] = ['between', [strtotime(I('begtime')), strtotime(I('endtime')) + 86399]]; }else { $nowTime = date('Y-m-d'); $initBegTime = date('Y-m-d', strtotime('-6 day', strtotime($nowTime))); $initEndTime = date('Y-m-d'); $initBegTime = strtotime($initBegTime); $initEndTime = strtotime($initEndTime); - $map['tab_spend.pay_time'] = ['between',[$initBegTime,$initEndTime]]; + $map['tab_spend.spend_time'] = ['between',[$initBegTime,$initEndTime]]; } empty(I('relation_game_id')) || $map['tab_game.relation_game_id'] = I('relation_game_id'); diff --git a/Application/Home/Controller/QueryController.class.php b/Application/Home/Controller/QueryController.class.php index 3ff0f0ce2..5ce3deb40 100644 --- a/Application/Home/Controller/QueryController.class.php +++ b/Application/Home/Controller/QueryController.class.php @@ -99,7 +99,7 @@ class QueryController extends BaseController $map['tab_spend.pay_status'] = $payStatus; } } - $map['tab_spend.pay_time'] = ['between', [$begTime, $endTime - 1]]; + $map['tab_spend.spend_time'] = ['between', [$begTime, $endTime - 1]]; $data = []; $count = 0; diff --git a/Application/Home/Controller/TestingResourceController.class.php b/Application/Home/Controller/TestingResourceController.class.php new file mode 100644 index 000000000..c258d711b --- /dev/null +++ b/Application/Home/Controller/TestingResourceController.class.php @@ -0,0 +1,824 @@ + 300, + 230 => 300, + ]; + + public function index() + { + $createTimeStart = I('create_time_start', ''); + $createTimeEnd = I('create_time_end', ''); + $gameId = I('game_id', 0); + $serverId = I('server_id', ''); + $account = I('account'); + $roleName = I('role_name'); + + $loginPromote = $this->getLoginPromote(); + + $conditions = []; + $subConditions = [ + '_string' => '1=1' + ]; + + $promoteService = new PromoteService(); + $visibleGameIds = $promoteService->getVisibleGameIds($loginPromote); + $strCondition = 'game_id in (0)'; + if (count($visibleGameIds) > 0) { + $strCondition = 'game_id in (' . implode(',', $visibleGameIds) . ')'; + } + + /** + * @todo 仅有游戏猫 + */ + $strCondition .= ' and game_id in (229, 230)'; + + if ($createTimeStart) { + $strCondition .= ' and create_time >=' . strtotime($createTimeStart . ' 00:00:00'); + } + if ($createTimeEnd) { + $strCondition .= ' and create_time <=' . strtotime($createTimeEnd . ' 23:59:59'); + } + + $subSql = M('testing_user', 'tab_')->field(['user_id'])->where($subConditions)->select(false); + $strCondition .= ' and user_id in (' . $subSql . ')'; + + $strCondition .= ' and promote_id in (' . $promoteService->subInSql($loginPromote) . ')'; + + if ($account) { + $user = M('user', 'tab_')->field(['id'])->where('account like "' . $account . '%"')->find(); + if ($user) { + $conditions['user_id'] = $user['id']; + } else { + $strCondition .= ' and 1<>1'; + } + } + if ($gameId) { + $conditions['game_id'] = $gameId; + } + if ($serverId) { + $conditions['server_id'] = $serverId; + } + if ($roleName) { + $conditions['role_name'] = ['like', $roleName . '%']; + } + $conditions['_string'] = $strCondition; + + $query = M('user_play_info', 'tab_')->where($conditions)->order('create_time desc'); + + list($roles, $pagination, $count) = $this->paginate($query); + + $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 = []; + $bindings = []; + $bindingRoles = []; + $applyRecords = []; + if (count($roles) > 0) { + $users = M('user', 'tab_')->field(['id', 'phone', 'lock_status'])->where(['id' => ['in', $userIds]])->select(); + $users = index_by_column('id', $users); + $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', 'game_id', 'game_role_id']) + ->where(['game_role_id' => ['in', $bindingRoleIds]]) + ->select(); + $bindingRoles = index_by_column('game_role_id', $bindingRoles); + } + + $verifyItems = M('testing_resource_batch', 'tab_') + ->field('sum(apply_amount) amount, game_id, role_id') + ->where([ + 'verify_status' => 0, + '_string' => implode(' or ', $bindingOrWhere) + ]) + ->group('game_id,role_id')->select(); + $verifyRecords = []; + foreach ($verifyItems as $item) { + $verifyRecords[$this->getGameRoleId($item['game_id'], $item['role_id'])] = $item['amount'] ; + } + + $provideItems = M('testing_resource_batch', 'tab_') + ->field('sum(provide_amount) amount, game_id, role_id') + ->where([ + 'verify_status' => 1, + '_string' => implode(' or ', $bindingOrWhere) + ]) + ->group('game_id,role_id')->select(); + $provideRecords = []; + foreach ($provideItems as $item) { + $provideRecords[$this->getGameRoleId($item['game_id'], $item['role_id'])] = $item['amount'] ; + } + + $todayProvideItems = M('testing_resource_batch', 'tab_') + ->field('sum(provide_amount) amount, game_id, role_id') + ->where([ + 'verify_status' => 1, + '_string' => implode(' or ', $bindingOrWhere), + 'provide_time' => ['egt', strtotime(date('Y-m-d 00:00:00'))], + 'provide_time' => ['elt', strtotime(date('Y-m-d 23:59:59'))], + ]) + ->group('game_id,role_id')->select(); + $todayProvideRecords = []; + foreach ($todayProvideItems as $item) { + $todayProvideRecords[$this->getGameRoleId($item['game_id'], $item['role_id'])] = $item['amount'] ; + } + + $applyItems = M('testing_resource_batch', 'tab_') + ->field('sum(apply_amount) amount, game_id, role_id') + ->where([ + '_string' => implode(' or ', $bindingOrWhere), + ]) + ->group('game_id,role_id')->select(); + $applyRecords = []; + foreach ($applyItems as $item) { + $applyRecords[$this->getGameRoleId($item['game_id'], $item['role_id'])] = $item['amount'] ; + } + + } + $spendItems = []; + if (count($bindingRoles) > 0) { + $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($spendCondition)->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['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'], + 'server_name' => $role['server_name'], + 'server_id' => $role['server_id'], + 'role_id' => $role['role_id'], + 'user_account' => $role['user_account'], + 'user_phone' => $user ? $user['phone'] : '', + 'role_name' => $role['role_name'], + 'bind_user_account' => $bindingRole ? $bindingRole['user_account'] : '', + 'bind_role_name' => $bindingRole ? $bindingRole['role_name'] : '', + 'base_quota' => $this->gameBaseQuota[$role['game_id']] ?? 0, + 'other_quota' => $role['testing_other_quota'], + 'quota' => $bindingRole && isset($spendItems[$bindingRole['game_role_id']]) ? $spendItems[$bindingRole['game_role_id']] : 0, + 'verify_amount' => $verifyRecords[$role['game_role_id']] ?? 0, + 'provide_amount' => $provideRecords[$role['game_role_id']] ?? 0, + 'today_amount' => $todayProvideRecords[$role['game_role_id']] ?? 0, + 'apply_amount' => $applyRecords[$role['game_role_id']] ?? 0, + 'status' => $user && $user['lock_status'] == 1 ? '正常' : '锁定', + 'create_time' => date('Y-m-d H:i:s', $role['create_time']) + ]; + } + + $this->assign('games', $this->getGames()); + $this->assign('servers', $this->getServersByGameId($gameId)); + $this->assign('count', $count); + $this->assign('pagination', $pagination); + $this->assign('records', $records); + $this->display(); + } + + private function getGameRoleId($gameId, $roleId) + { + return $gameId . '#' . $roleId; + } + + public function addTestingUsers() + { + $loginPromote = $this->getLoginPromote(); + $accountsStr = trim(I('accounts', ''), ','); + if ($accountsStr == '') { + return $this->ajaxReturn(['status' => 0, 'message' => '请输入测试资源账号']); + } + $accounts = explode(',', $accountsStr); + $accounts = array_unique($accounts); + $existAccounts = M('testing_user', 'tab_')->where(['user_account' => ['in', $accounts]])->getField('user_account', true); + $existAccounts = $existAccounts ?? []; + $existCount = count($existAccounts); + $newAccounts = array_diff($accounts, $existAccounts); + $errorCount = 0; + $successCount = 0; + if (count($newAccounts)) { + + $promoteService = new PromoteService(); + $strCondition = 'promote_id in (' . $promoteService->subInSql($loginPromote) . ')'; + + $users = M('user', 'tab_')->field(['id', 'account'])->where(['account' => ['in', $newAccounts], '_string' => $strCondition])->select(); + $errorAccounts = array_diff($newAccounts, array_column($users, 'account')); + $errorCount = count($errorAccounts); + foreach ($users as $user) { + if (in_array($user['account'], $errorAccounts)) { + continue; + } + $data = [ + 'user_id' => $user['id'], + 'user_account' => $user['account'], + 'status' => 1, + 'create_time' => time(), + 'update_time' => time(), + ]; + M('testing_user', 'tab_')->add($data); + $successCount ++; + } + } + return $this->ajaxReturn(['status' => 1, 'message' => '请求成功', 'data' => [ + 'errorCount' => $errorCount, + 'successCount' => $successCount, + 'existCount' => $existCount, + ]]); + } + + public function batches() + { + $gameId = I('game_id', 0); + $serverId = I('server_id', ''); + $createTimeStart = I('create_time_start', ''); + $createTimeEnd = I('create_time_end', ''); + $verifyStatus = I('verify_status', -1); + $provideStatus = I('provide_status', -1); + $account = I('account'); + + $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' => 'exists (' . $subSql . ')' + ]; + if ($createTimeStart) { + $conditions['_string'] .= ' and create_time >=' . strtotime($createTimeStart . ' 00:00:00'); + } + if ($createTimeEnd) { + $conditions['_string'] .= ' and create_time <=' . strtotime($createTimeEnd . ' 23:59:59'); + } + if ($verifyStatus != -1) { + $conditions['verify_status'] = $verifyStatus; + } + if ($provideStatus != -1) { + $conditions['provide_status'] = $provideStatus; + } + if ($gameId) { + $conditions['game_id'] = $gameId; + } + if ($serverId) { + $conditions['server_id'] = $serverId; + } + if ($account) { + $user = M('user', 'tab_')->field(['id'])->where('account like "' . $account . '%"')->find(); + if ($user) { + $conditions['user_id'] = $user['id']; + } else { + $conditions['_string'] .= ' and 1<>1'; + } + } + $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); + } + } + + $testingResourceService = new TestingResourceService(); + + $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' => substr($batch['batch_no'], 14), + 'create_time' => date('Y-m-d H:i:s', $batch['create_time']), + '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'], + 'verify_status' => $batch['verify_status'], + 'verify_status_text' => $testingResourceService->getVerifyStatusText($batch['verify_status']), + 'verify_time' => $batch['verify_time'] == 0 ? '--' : date('Y-m-d H:i:s', $batch['verify_time']), + 'provide_status' => $batch['provide_status'], + 'provide_status_text' => $testingResourceService->getProvideStatusText($batch['provide_status']), + 'provide_time' => $batch['provide_time'] == 0 ? '--' : date('Y-m-d H:i:s', $batch['provide_time']), + 'content' => $content, + ]; + } + + $this->assign('verifyStatusList', TestingResourceService::$verifyStatusList); + $this->assign('provideStatusList', TestingResourceService::$provideStatusList); + $this->assign('servers', $this->getServersByGameId($gameId)); + $this->assign('games', $this->getGames()); + $this->assign('count', $count); + $this->assign('pagination', $pagination); + $this->assign('records', $records); + $this->display(); + } + + public function orders() + { + $id = I('id', 0); + + $batch = M('testing_resource_batch', 'tab_')->where(['id' => $id])->find(); + + $role = M('user_play_info', 'tab_') + ->field(['id', 'game_name', 'server_name', 'role_name', 'game_role_id', 'user_account']) + ->where(['game_id' => $batch['game_id'], 'role_id' => $batch['role_id']]) + ->find(); + + $applyPromote = M('promote', 'tab_')->field(['id', 'account'])->where(['id' => $batch['apply_promote_id']])->find(); + $promote = M('promote', 'tab_')->field(['id', 'account'])->where(['id' => $role['apply_promote_id']])->find(); + + $query = M('testing_resource_order', 'tab_')->where(['batch_id' => $id])->order('id desc'); + list($orders, $pagination, $count) = $this->paginate($query); + + $testingResourceService = new TestingResourceService(); + foreach ($orders as $order) { + $records[] = [ + 'id' => $order['id'], + 'create_time' => $batch['create_time'] == 0 ? '--' : date('Y-m-d H:i:s', $batch['create_time']), + 'game_name' => $role['game_name'], + 'user_account' => $role['user_account'], + 'server_name' => $role['server_name'], + 'role_name' => $role['role_name'], + 'apply_promote_account' => $applyPromote ? $applyPromote['account'] : '', + 'promote_account' => $promote['account'], + 'ref_name' => $order['ref_name'], + 'ref_amount' => $order['ref_amount'], + 'num' => $order['num'], + 'amount' => $order['num'] * $order['ref_amount'], + 'remark' => $order['remark'], + 'provide_status' => $order['provide_status'], + 'provide_status_text' => $testingResourceService->getProvideStatusText($order['provide_status']), + ]; + } + + $this->assign('count', $count); + $this->assign('pagination', $pagination); + $this->assign('records', $records); + $this->display(); + } + + private function getRemainQuota($role, $bindRole = null) + { + $totalQuota = $role['testing_other_quota'] + ($this->gameBaseQuota[$role['game_id']] ?? 0); + if (!is_null($bindRole)) { + $totalQuota += M('spend', 'tab_') + ->where(['game_id' => $role['game_id'], 'game_player_id' => $bindRole['role_id'], 'pay_status' => 1]) + ->group('game_id,game_player_id') + ->sum('pay_amount'); + } + $providedQuota = M('testing_resource_batch', 'tab_') + ->where(['provide_status' => [in, [1, 2]], 'game_id' => $role['game_id'], 'role_id' => $role['role_id']]) + ->sum('provide_amount'); + $providingQuota = M('testing_resource_batch', 'tab_') + ->where(['verify_status' => [in, [0, 1]], 'provide_status' => 0, 'game_id' => $role['game_id'], 'role_id' => $role['role_id']]) + ->sum('apply_amount'); + return round(floatval($totalQuota) - floatval($providedQuota) - floatval($providingQuota), 2); + } + + public function apply() + { + $id = I('id', 0); + + $role = null; + if ($id != 0) { + $role = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'user_id', 'game_id', 'server_id', 'user_account', 'role_name', 'testing_other_quota']) + ->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(['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(['game_id' => $binding['game_id'], 'role_id' => $binding['bind_role_id']]) + ->find(); + } + } + + /** + * @todo 目前固定游戏猫 + */ + $games = M('game', 'tab_')->field(['id' , 'game_name'])->where(['id' => ['in', [229, 230]]])->select(); + $this->assign('games', $games); + $this->assign('servers', $servers); + $this->assign('bindingRole', $bindingRole); + $this->assign('role', $role); + $this->assign('quota', $this->getRemainQuota($role, $bindingRole)); + $this->display(); + } + + public function doApply() + { + $gameId = I('game_id', 0); + $roleId = I('role_id', ''); + $serverId = I('server_id', 0); + $userAccount = I('user_account', ''); + $records = I('records', []); + $loginPromote = $this->getLoginPromote(); + + if ($loginPromote['level'] > 2) { + return $this->ajaxReturn(['status' => 0, 'message' => '权限不足']); + } + + $resources = []; + /** + * @todo 目前仅限游戏猫 + */ + if ($gameId == 229) { + $resources = $this->getGameCatResources('android'); + } elseif ($gameId == 230) { + $resources = $this->getGameCatResources('ios'); + } else { + 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(); + if (is_null($user)) { + return $this->ajaxReturn(['status' => 0, 'message' => '玩家账号不存在']); + } + $testingUser = M('testing_user', 'tab_')->where(['user_id' => $user['id']])->find(); + if (is_null($testingUser)) { + return $this->ajaxReturn(['status' => 0, 'message' => '测试账号不存在']); + } + + $server = M('server', 'tab_')->field(['id', 'server_name', 'server_id'])->where(['id' => $serverId])->find(); + if (is_null($server)) { + return $this->ajaxReturn(['status' => 0, 'message' => '区服不存在']); + } + + $promoteService = new PromoteService(); + + $role = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'promote_id', 'game_id', 'testing_other_quota']) + ->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' => '角色不存在']); + } + + $otherRoleBatch = M('testing_resource_batch', 'tab_') + ->where([ + 'user_id' => $user['id'], + 'game_id' => $gameId, + 'server_id' => $server['server_id'], + 'role_id' => ['neq', $roleId], + 'verify_status' => ['in', [0, 1]], + ]) + ->find(); + if ($otherRoleBatch) { + 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 = null; + if ($binding) { + $bindingRole = M('user_play_info', 'tab_') + ->field(['id', 'role_id', 'user_id', 'promote_id', 'game_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']])) { + $value = $resources[$record['resource_id']]['amount']; + $records[$key]['value'] = $value; + $records[$key]['resource_name'] = $resources[$record['resource_id']]['name']; + $amount += $record['num'] * $value; + } else { + return $this->ajaxReturn(['status' => 0, 'message' => '含有资源内容不存在']); + } + /** + * @todo 游戏猫只能每个资源数量只能为1 + */ + if ($record['num'] != 1) { + return $this->ajaxReturn(['status' => 0, 'message' => '该游戏每次申请单项资源数量只能为1']); + } + } + + $remainQuota = $this->getRemainQuota($role, $bindingRole); + 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 { + $model = new Model(); + $model->startTrans(); + + $batch = [ + 'batch_no' => $batchNo, + 'user_id' => $testingUser['user_id'], + 'game_id' => $gameId, + 'role_id' => $roleId, + 'server_id' => $serverId, + 'apply_promote_id' => $loginPromote['id'], + 'apply_amount' => $amount, + 'provide_status' => 0, + 'verify_status' => 0, + 'create_time' => time(), + 'update_time' => time(), + ]; + $batchId = M('testing_resource_batch', 'tab_')->add($batch); + $i = 1; + foreach ($records as $record) { + $orderNo = $batchNo . '_' . $i; + $order = [ + 'batch_id' => $batchId, + 'order_no' => $orderNo, + 'ref_id' => $record['resource_id'], + 'ref_name' => $record['resource_name'], + 'ref_amount' => $record['value'], + 'num' => $record['num'], + 'amount' => $record['num'] * $record['value'], + 'remark' => $record['remark'], + ]; + 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' => '系统异常' . $e->getMessage()]); + } + } + + public function bindRole() + { + $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', 'game_id', 'promote_id']) + ->where(['game_role_id' => $testingGameRoleId]) + ->find(); + if (is_null($testingRole)) { + return $this->ajaxReturn(['status' => 0, 'message' => '测试账号角色不存在']); + } + + $testingUser = M('testing_user', 'tab_')->where(['user_id' => $testingRole['user_id']])->find(); + if (is_null($testingUser)) { + 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', '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(['game_id' => $gameId, 'bind_role_id' => $bindRoleId])->find(); + if ($existBind) { + return $this->ajaxReturn(['status' => 0, 'message' => '该玩家角色已被绑定']); + } + + $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['role_id'], + 'bind_user_id' => $bindRole['user_id'], + 'bind_role_id' => $bindRole['role_id'], + 'create_time' => time(), + 'update_time' => time() + ]); + return $this->ajaxReturn(['status' => 1, 'message' => '绑定成功']); + } + + private function getGames() + { + $map = [ + 'id' => ['in', [229, 230]] + ]; + $loginPromote = $this->getLoginPromote(); + $promoteService = new PromoteService(); + $visibleGameIds = $promoteService->getVisibleGameIds($loginPromote); + $map['_string'] = 'id in (0)'; + if (count($visibleGameIds) > 0) { + $map['_string'] = 'id in (' . implode(',', $visibleGameIds) . ')'; + } + return M('game', 'tab_')->field('id,game_name')->where($map)->select(); + } + + private function getServersByGameId($gameId = 0) + { + if ($gameId == 0) { + return []; + } + $map = []; + $map['game_id'] = $gameId; + return M('server', 'tab_') + ->field('id,server_name,server_id') + ->where($map) + ->order('server_id asc') + ->select(); + } + + public function getServers() + { + $gameId = I('game_id', 0); + $servers = $this->getServersByGameId($gameId); + return $this->ajaxReturn(['status' => 1, 'message' => '获取成功', 'data' => ['servers' => $servers]]); + } + + public function getResourceTypes() + { + $gameId = I('game_id', 0); + $resourceTypes = []; + + /** + * @todo 目前固定游戏猫 + */ + if ($gameId == 229) { + $resourceTypes[] = ['id' => 1, 'name' => '通用']; + } elseif ($gameId == 230) { + $resourceTypes[] = ['id' => 2, 'name' => '通用']; + } + return $this->ajaxReturn(['status' => 1, 'message' => '获取成功', 'data' => ['resourceTypes' => $resourceTypes]]); + } + + public function getResources() + { + $typeId = I('type_id', 0); + + $resources = []; + + /** + * @todo 目前固定游戏猫资源类型ID + */ + if ($typeId == 2) { + $resources = $this->getGameCatResources('ios'); + } elseif ($typeId == 1) { + $resources = $this->getGameCatResources('andriod'); + } + + return $this->ajaxReturn(['status' => 1, 'message' => '获取成功', 'data' => ['resources' => $resources]]); + } + + public function getUserRoles() + { + $gameId = I('game_id', 0); + $serverId = I('server_id', 0); + $userAccount = I('user_account', ''); + $server = M('server', 'tab_')->field(['id', 'server_name', 'server_id'])->where(['id' => $serverId])->find(); + if (is_null($server)) { + 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_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]]); + } + + private function getGameCatResources($deviceType) + { + $resources = []; + $gameCatClient = new GameCatClient(); + $result = $gameCatClient->api('get-pay-type', ['device_type' => $deviceType]); + if ($result['state'] == 1) { + $items = $result['data']; + foreach ($items as $item) { + $resources[$item['supportItem']] = [ + 'ref_id' => $item['supportItem'], + 'name' => $item['content'], + 'amount' => $item['amount'], + ]; + } + } + return $resources; + } +} \ No newline at end of file diff --git a/Application/Home/View/default/Public/promote_base.html b/Application/Home/View/default/Public/promote_base.html index 8c9a800f7..b1873c24b 100644 --- a/Application/Home/View/default/Public/promote_base.html +++ b/Application/Home/View/default/Public/promote_base.html @@ -112,13 +112,13 @@ 操作日志 +
资源类型 | +资源内容 | +资源价值 | +资源数量 | +备注 | +操作 | +
---|
批次号 | +申请时间 | +游戏名称 | +区服名称 | +角色名称 | +测试账号 | +手机号 | +所属推广员 | +申请人 | + +申请金额 | +发放金额 | +审核状态 | +审核时间 | +发放状态 | +发放时间 | + +操作 | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
![]() 暂无数据 | |||||||||||||||
{$record.batch_no} | +
+ =substr($record['create_time'], 0, 10)?>
+ + =substr($record['create_time'], 10)?> + |
+ {$record.game_name} | +{$record.server_name} | +{$record.role_name} | +{$record.user_account} | +{$record.user_phone} | +{$record.promote_account} | +{$record.apply_promote_account} | + +{$record.apply_amount} | +{$record.provide_amount} | ++ {$record.verify_status_text} + | +
+ =substr($record['verify_time'], 0, 10)?>
+ + =substr($record['verify_time'], 10)?> + |
+ + {$record.provide_status_text} + | +
+ =substr($record['provide_time'], 0, 10)?>
+ + =substr($record['provide_time'], 10)?> + |
+
+ + |
+ 选择 + | +游戏名称 | +区服名称 | +测试账号 | +手机号 | +角色名称 | +绑定账号 | +绑定角色 | +初始额度 | +额外额度 | +累计额度 | +待审核金额 | +累计发放资源 | +今日发放金额 | +申请总金额 | +状态 | +创建时间 | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
![]() 暂无数据 + |
+ ||||||||||||||||
+ + | +{$record.game_name} | +{$record.server_name} | +{$record.user_account} | +{$record.user_phone} | +{$record.role_name} | +{$record.bind_user_account} | +{$record.bind_role_name} | +{$record.base_quota} | +{$record.other_quota} | +{$record.quota} | +{$record.verify_amount} | +{$record.provide_amount} | +{$record.today_amount} | +{$record.apply_amount} | +{$record.status} | +
+ =substr($record['create_time'], 0, 10)?>
+ + =substr($record['create_time'], 10)?> + |
+
申请ID | +申请时间 | +游戏名称 | +玩家账号 | +区服名称 | +角色名称 | +申请人 | +资源内容 | +资源价值 | +申请数量 | +申请金额 | +申请备注 | +发放状态 | +|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
![]() 暂无数据 | |||||||||||||
{$record.id} | +
+ =substr($record['create_time'], 0, 10)?>
+ + =substr($record['create_time'], 10)?> + |
+ {$record.game_name} | +{$record.user_account} | +{$record.server_name} | +{$record.role_name} | +{$record.apply_promote_account} | +{$record.ref_name} | +{$record.ref_amount} | +{$record.num} | +{$record.amount} | +{$record.remark} | +{$record.provide_status_text} | +