From 2867a05bb37fee4502807da2079b1f0a6289a539 Mon Sep 17 00:00:00 2001
From: ELF <360197197@qq.com>
Date: Thu, 20 Aug 2020 18:25:45 +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
---
.../Admin/View/PromoteCompany/add.html | 16 +-
.../Service/PresidentDepositService.class.php | 100 +++
.../TestingResourceController.class.php | 824 ++++++++++++++++++
3 files changed, 932 insertions(+), 8 deletions(-)
create mode 100644 Application/Home/Controller/TestingResourceController.class.php
diff --git a/Application/Admin/View/PromoteCompany/add.html b/Application/Admin/View/PromoteCompany/add.html
index 6277ac540..90d22a34c 100644
--- a/Application/Admin/View/PromoteCompany/add.html
+++ b/Application/Admin/View/PromoteCompany/add.html
@@ -244,10 +244,10 @@
- *付款方式: |
+ *押金付款方式: |
|
- *金额: |
+ *押金金额: |
-
+
|
- 付款人: |
+ 押金付款人: |
-
+
|
- 付款账号: |
+ 押金付款账号: |
-
+
|
diff --git a/Application/Base/Service/PresidentDepositService.class.php b/Application/Base/Service/PresidentDepositService.class.php
index ef12da126..4e9c534f3 100644
--- a/Application/Base/Service/PresidentDepositService.class.php
+++ b/Application/Base/Service/PresidentDepositService.class.php
@@ -31,4 +31,104 @@ class PresidentDepositService
1 => '已收到',
2 => '已退款',
];
+
+ public function add($params)
+ {
+ $payWay = $params['pay_way'] ?? 0;
+ $payType = $params['pay_type'] ?? 0;
+ $promoteId = $params['id'] ?? 0;
+ $payAccount = $params['pay_account'] ?? '';
+ $amount = $params['amount'] ?? '';
+ $payer = $params['payer'] ?? '';
+ $payAcceptTime = $params['pay_accept_time'] ?? '';
+ $refundTime = $params['refund_time'] ?? '';
+
+ $payAcceptTime = $payAcceptTime ? strtotime($payAcceptTime) : 0;
+ $refundTime = $refundTime ? strtotime($refundTime) : 0;
+
+
+ $record = M('president_deposit', 'tab_')->where(['promote_id' => $promoteId])->find();
+
+ $promoteData = M('promote', 'tab_')->field('account')->where(['id' => $promoteId])->find();
+
+ // 市场部门无法操作押金退款和收到时间
+ if ((($record['pay_accept_time'] != $payAcceptTime) || ($record['refund_time'] != $refundTime)) && isMarketAdmin()) {
+ throw new \Exception('无法操作记录');
+ }
+
+ if ($payType == 0) {
+ throw new \Exception('请选择押金付款方式');
+ }
+ if ($payType == 3) {
+ return $this->handleNoDeposit($promoteId);
+ }
+ if ($payType != 2 && $payWay == 0) {
+ throw new \Exception('请选择付款方式');
+ }
+
+ if (!$record) {
+ if ($amount !== '') {
+ if (!is_numeric($amount)) {
+ throw new \Exception('请输入正确金额');
+ }
+ if ($amount <= 0) {
+ throw new \Exception('金额必须大于0');
+ }
+ if ($amount > 100000000) {
+ throw new \Exception('金额过高');
+ }
+ }
+
+ $data = [];
+
+ // 填写押金到账时间后自动变为押金已确认到账状态,并且状态在待确认时候
+ if ($record['pay_accept_time'] != $payAcceptTime && $record['status'] == 0) {
+ $data = ['status' => 1,
+ 'pay_confirm_time' => time()];
+ }
+
+ $data['pay_way'] = $payType == 2 ? 4 : $payWay;
+ $data['pay_type'] = $payType;
+ $data['promote_id'] = $promoteId;
+ $data['pay_account'] = $payAccount;
+ $data['amount'] = floatval($amount);
+ $data['payer'] = $payer;
+ $data['create_time'] = time();
+ $data['update_time'] = time();
+ $data['pay_accept_time'] = $payAcceptTime;
+ $data['refund_time'] = $refundTime;
+
+ M('president_deposit', 'tab_')->add($data);
+
+ addOperationLog(['op_type'=>0,'key'=>$promoteData['account'].'/'.$amount,'op_name'=>'新增会长押金','url'=>U('PresidentDeposit/edit',['id'=>$promoteId]),'menu'=>'推广员-结算单管理-奖罚记录管理-新增会长押金']);
+ }
+ }
+
+ public function handleNoDeposit($promoteId)
+ {
+ $record = M('president_deposit', 'tab_')->where(['promote_id' => $promoteId])->find();
+
+ $data = [];
+ $data['pay_way'] = 0;
+ $data['pay_type'] = self::PAY_TYPE_NONE;
+ $data['pay_account'] = '';
+ $data['amount'] = 0;
+ $data['payer'] = '';
+ $data['status'] = 1;
+ $data['pay_confirm_time'] = time();
+ $data['create_time'] = time();
+ $data['update_time'] = time();
+ $data['status'] = 1;
+ $data['pay_accept_time'] = $data['refund_time'] = 0;
+ $data['promote_id'] = $promoteId;
+
+ if (!$record) {
+ M('president_deposit', 'tab_')->add($data);
+ } else {
+ M('president_deposit', 'tab_')->where(['promote_id' => $promoteId])->save($data);
+ }
+
+ $promoteData = M('promote', 'tab_')->field('account')->where(['id' => $promoteId])->find();
+ addOperationLog(['op_type'=>1,'key'=>$promoteData['account'],'op_name'=>'编辑无需押金','url'=>U('PresidentDeposit/records'),'menu'=>'推广员-结算单管理-会长押金管理-无需押金']);
+ }
}
\ No newline at end of file
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