| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539 |
- <?php
- /**
- * 游戏管理控制器
- */
- namespace app\admin\controller;
- use app\common\library\FileUpload;
- use app\common\library\MakeReport;
- use app\common\model\AndroidSdk;
- use app\common\model\GameBand;
- use app\common\model\Game as GameModel;
- use app\common\logic\SubPackage as SubChannel;
- use app\common\model\SdkGameList;
- use app\common\model\GameInfo;
- use app\common\model\GameNotify;
- use app\common\model\GameBanned;
- use app\common\model\GameExtraPointRatio;
- use Overtrue\Pinyin\Pinyin;
- use app\common\model\PromotionShortLink;
- use think\Config;
- use think\Db;
- use think\Env;
- use think\Exception;
- use think\Request;
- class GamePackage extends Admin
- {
- protected $gameModel;
- /**
- * 不进行父类的登录验证,所以增加构造方法重写了父类的初始化方法
- */
- protected function _initialize()
- {
- parent::_initialize();
- $this->subChannel = new SubChannel;
- $this->gameModel = new GameModel;
- $this->sdkgamelistModel = $this->cyModel('sdkgamelist');
- $this->gameList = $gameList = model('Common/Game')->getAllByCondition('id,name');
- $this->selfGameList = $selfGameList = model('Common/Game')->getAllByCondition('id,name,pinyin,package_name,type,sign_ver', [], '', 'self');
- }
- /**
- * 列表
- */
- public function index()
- {
- //查询参数
- $param = input('get.');
- $page_size = input('page_size', 15);
- $where = [];
- if (isset($param['game_id']) && $param['game_id']) {
- $where['game_id'] = $param['game_id'];
- }
- if (isset($param['game_name']) && $param['game_name']) {
- $where['game.name'] = ['like', '%' . $param['game_name'] . '%'];
- }
- $gamelist = Db::name('nw_game_package_upload')->field('game_id as id,game_name as name')->where('path != ""')->select();
- $list = Db::name('nw_game_package_upload')->alias('a')
- ->join('cy_game game', 'nw_game_package_upload.game_id = game.id', 'left')
- ->field('a.id,game.name as game_name,a.bag_name,a.platform_type,convert((bag_size/1024/1024),decimal(10,2)) as bag_size,from_unixtime(update_time) as create_time,control_name,path,game_id,game.pinyin,game.channel_version,game.sign_ver, from_unixtime(a.update_time) as update_time,game.type,a.remark')
- ->where($where)
- ->order('update_time desc')
- ->paginate($page_size, false, array('query' => $param));
- $meb_list = $list->toarray();
- // dump($meb_list);
- foreach ($meb_list['data'] as $key => $value) {
- $meb_list['data'][$key]['path_ext'] = substr(substr($value['path'], strrpos($value['path'], "/") + 1), 0, -4);
- }
- $this->assign('list', $meb_list['data']);
- $this->assign('total', $meb_list['total']);
- $this->assign('game_list', $gamelist);
- $this->assign('page', $list->render());
- $this->assign('gameList', $this->cyModel('game')->field('id,name')->select());
- return $this->fetch();
- }
- /**
- * [FunctionName description]
- *
- * @param string $value [description]
- */
- public function deleted()
- {
- $id = input('id');
- $game_id = input('game_id');
- if (empty($id) || empty($game_id)) {
- $this->error('删除失败,参数错误');
- }
- $game_package_name = db::name('cy_game')->where(['id' => $game_id])->value('pinyin');//文件拼音
- $path = Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->value('path');
- if (!$path) {
- $this->error('无游戏原包 请先上传');
- }
- if (empty($game_package_name)) {
- $this->error('原包错误 请先刷新后重试');
- }
- $filed = substr(strrchr($path, "sygame/"), 6);
- if (empty($filed)) {
- $this->error('原包错误 请先刷新后重试');
- }
- $ups = Env::get('MUBAO_PATH') . 'sygame' . $filed;//服务器文件路劲
- if (file_exists($ups)) {
- @unlink(iconv('UTF-8', 'GBK', $ups));
- }
- Db::startTrans();
- try {
- $data['bag_name'] = '--';
- $data['bag_size'] = 0;
- $data['bag_version'] = '';
- $data['update_time'] = NOW_TIMESTAMP;
- $data['control_name'] = session('USERNAME');
- $data['path'] = '';
- $resultUpdate = Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->update($data);
- if (!$resultUpdate) {
- throw new Exception("数据更新失败");
- }
- $cont = [];
- $cont['game_id'] = $game_id;
- $cont['create_time'] = NOW_TIMESTAMP;
- $cont['control_name'] = session('USERNAME');
- $cont['control_type'] = 3;
- $result = Db::name('game_upload_log')->insert($cont);
- Db::commit();
- } catch (Exception $e) {
- Db::rollback();
- $this->error("删除失败 " . $e->getMessage());
- }
- $this->success("删除成功");
- }
- /**
- * 查看记录
- *
- * @param string $value [description]
- */
- public function checklog()
- {
- $game_id = input('game_id', '');
- if (empty($game_id)) {
- $this->error('参数错误');
- }
- $list = db::name('game_upload_log')->field('id,game_id,from_unixtime(create_time) as create_time,control_name,CASE WHEN control_type = 1 THEN "新增原包" WHEN control_type = 2 THEN "更新原包" WHEN control_type = 3 THEN "删除原包" END as control_type')->where(['game_id' => $game_id])->order('id desc')->select();
- if ($list) {
- $this->success('添加成功', null, $list);
- } else {
- $this->error("暂无数据");
- }
- }
- /**
- * 新增原包
- */
- public function add()
- {
- $param = input('get.');
- $list = [];
- $exist_ids = Db::name('nw_game_package_upload')->column('game_id');
- $info = ['package_name' => '', 'pinyin' => '', 'type' => '', 'sign_ver' => 0, 'path' => '', 'remark' => ''];
- if (isset($param['game_id'])) {
- $info = Db::name('cy_game')->alias('g')
- ->join("nw_game_package_upload gpu", "g.id = gpu.game_id", 'left')
- ->field('g.id,g.name, g.pinyin,g.package_name, g.channel_version, gpu.path, g.sign_ver, g.type, gpu.remark')
- // ->field('id,name,channel_version,pinyin,package_name,type,sign_ver, "" as path')
- ->where(['g.id' => $param['game_id']])->find();
- $list[] = $info;
- } else {
- $list = Db::name('cy_game')
- ->where('id', 'not in', $exist_ids)
- ->field('id,name,channel_version,pinyin,package_name,type,sign_ver,"" as remark, "" as path')
- ->select();
- // $list = $this->get_diff_array_by_filter($this->selfGameList, $gamelist);
- }
- $this->assign('game_list', $list);
- $this->assign('info', $info);
- $this->assign('upload_url', Env::get('mubao.upload_url'));
- return $this->fetch('add');
- }
- /**
- * 数组取差集
- *
- * @param [type] $arr1 [description]
- * @param [type] $arr2 [description]
- *
- * @return [type] [description]
- */
- public function get_diff_array_by_filter($arr1, $arr2)
- {
- try {
- return array_filter($arr1, function ($v) use ($arr2) {
- return !in_array($v, $arr2);
- });
- } catch (\Exception $exception) {
- return $arr1;
- }
- }
- // 母包上传成功 - 用于新版分包
- public function uploadSuccess()
- {
- $postParam = input('post.');
- $game_package_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('pinyin');
- if (empty($game_package_name)) {
- $this->error('游戏有误!');
- }
- if (!isset($postParam['file_name']) && $postParam['type'] != 3) {
- $this->error('请上传游戏包!');
- }
- //合并后记录数据库
- Db::startTrans();
- try {
- $info = Db::name('nw_game_package_upload')->where(['game_id' => $postParam['game_id']])->field('id,bag_version')->find();
-
- $game_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('name');
- $data = [
- 'game_name' => $game_name,
- 'bag_version' => $postParam['bag_version'],
- 'platform_type' => $postParam['type'],
- 'create_time' => NOW_TIMESTAMP,
- 'update_time' => NOW_TIMESTAMP,
- 'control_name' => session('USERNAME'),
- 'game_id' => $postParam['game_id'],
- 'remark' => $postParam['remark'],
- ];
-
- if($postParam['type'] == 3){
- $data['path'] = $postParam['path'];
- }else{
- // 有上传文件 才更新游戏原包数据
- if (!empty($postParam['file_name'])) {
- $domain = Env::get('mubao.down_url');
- $ext_suffix = substr($postParam['file_name'], strripos($postParam['file_name'], ".") + 1);//后缀
-
- $data['bag_size'] = $postParam['size'];
- $data['bag_name'] = $postParam['bag_name'];
- $data['path'] = $domain . '/sygame/' . $game_package_name . '/' . $game_package_name . '.' . $ext_suffix;
- }
- }
- if ($info) {//存在记录的情况更新
- $control_type = 2;
- $resultUpdate = Db::name('nw_game_package_upload')->where(['game_id' => $postParam['game_id']])->update($data);
-
- // ## 通知直播平台更新游戏包
- if ($postParam['type'] != 3 && !empty($postParam['notice_status']) && $postParam['notice_status'] == 1) {
- $zb_config = Config::get('zb_str');
- $data = [
- "gameid" => $postParam['game_id'],
- "app_key" => 'qm_sdk',
- "timestamp" => time(),
- ];
- $data['sign'] = $this->getZbSign($data, $zb_config['sign_key']);
- if (APP_STATUS == 'stable') {
- $zb_url = $zb_config['pro_url'];
- } else {
- $zb_url = $zb_config['dev_url'];
- }
- $zb_res = curlHeader($zb_url . "/v1/api/game/pack/notice", $data, ['Content-Type' => 'application/x-www-form-urlencoded']);
- log_message("## ZB_API: " . json_encode(['url' => $zb_url . "/v1/api/game/pack/notice", 'body' => $data, 'result' => $zb_res]), 'log', LOG_PATH . 'admin/httplog/');
- }
- } else {
- $control_type = 1;
- $resultUpdate = Db::name('nw_game_package_upload')->insert($data);
- }
- if (!$resultUpdate) {
- throw new Exception("数据更新失败");
- }
- $cont = [];
- $cont['game_id'] = $postParam['game_id'];
- $cont['create_time'] = NOW_TIMESTAMP;
- $cont['control_name'] = session('USERNAME');
- $cont['control_type'] = $control_type;
- $result = Db::name('game_upload_log')->insert($cont);
- $sign_ver = input('sign_ver', 0);
- Db::name('cy_game')->where(['id' => $postParam['game_id']])->update(['channel_version' => $postParam['bag_version'], 'sign_ver' => $sign_ver]);
- Db::commit();
- } catch (Exception $e) {
- Db::rollback();
- $this->error("上传失败 " . $e->getMessage());
- }
- $this->success('上传成功');
- }
- /**
- * 开始上传
- *
- * @return [type] [description]
- */
- public function UploadBigFile()
- {
- $pinyin = new Pinyin();
- $getParam = input('get.');
- $postParam = input('post.');
- $game_id = $postParam['game_id'];
- if (!$game_id) {
- $this->error('上传失败,游戏ID不存在');
- }
- //放入sygame/temp 临时文件夹内
- $name = $pinyin->permalink(substr($postParam['name'], 0, strrpos($postParam['name'], ".")), '');//转中文
- $act = $getParam['act'];
- $tpm_ups = Env::get('MUBAO_PATH') . 'sygame/temp/' . $name . '/';
- $ext_suffix = substr($postParam['name'], strripos($postParam['name'], ".") + 1);//后缀
- $flag = true;
- !in_array($ext_suffix, ['ipa', 'apk']) && $flag = false;//判断后缀名是否符合
- if (!$flag) {
- $this->error('请选择ipa或者apk文件!');
- }
- $game_ext = db::name('cy_gameinfo')->where(['game_id' => $game_id])->value('platform');
- if ($game_ext == 1) {
- $game_ext = 'ipa';
- } else {
- $game_ext = 'apk';
- }
- if ($game_ext != $ext_suffix) {
- $this->error('文件类型选择错误');
- }
- if ($act == 'upload') {
- $index = $postParam['index'];
- $filename = $tpm_ups . "$index" . $name . '.' . $ext_suffix;
- if (!file_exists($tpm_ups))//如果文件夹不存在
- {
- mkdir($tpm_ups, 0777, 1);
- }
- //断点上传已经存在的就跳过
- if (file_exists($filename)) {
- $this->success('上传成功');
- } else {
- $result = move_uploaded_file($_FILES['data']['tmp_name'], iconv('UTF-8', 'GBK', $filename));
- }
- if ($result) {
- $this->success('上传成功');
- } else {
- $this->success('上传失败');
- }
- } elseif ($_GET['act'] == 'join') {
- $fileUpload = new FileUpload();
- $total = intval($postParam['total']);
- $filename = $tpm_ups . $name . '.' . $ext_suffix;
- $request = Request::instance();
- $domain = $request->domain();
- $game_package_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('pinyin');
- if (empty($game_package_name)) {
- $this->error('游戏参数错误 请先刷新后重试');
- }
- $ups = Env::get('MUBAO_PATH') . 'sygame/' . $game_package_name . '/';
- if (!file_exists($ups))//如果文件夹不存在
- {
- mkdir($ups, 0777, 1);
- }
- //合并时候判断 存在之前上传过的文件就删除掉在合并
- @unlink(iconv('UTF-8', 'GBK', $ups . $game_package_name . '.' . $ext_suffix));
- for ($i = 1; $i <= $total; $i++) {
- file_put_contents($ups . iconv('UTF-8', 'GBK', $game_package_name . '.' . $ext_suffix), file_get_contents(iconv('UTF-8', 'GBK', $tpm_ups . "$i" . $name . '.' . $ext_suffix)), FILE_APPEND);
- @unlink(iconv('UTF-8', 'GBK', $tpm_ups . "$i" . $name . '.' . $ext_suffix));
- }
- //合并后记录数据库
- Db::startTrans();
- try {
- $data = [];
- if (Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->value('id')) {//存在记录的情况更新
- $control_type = 2;
- $data['bag_size'] = $postParam['size'];
- $data['control_name'] = session('USERNAME');
- $data['update_time'] = NOW_TIMESTAMP;
- $data['bag_name'] = $postParam['bag_name'];
- $data['bag_version'] = $postParam['bag_version'];
- $data['remark'] = $postParam['remark'];
- $data['path'] = $domain . '/sygame/' . $game_package_name . '/' . $game_package_name . '.' . $ext_suffix;
- $resultUpdate = Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->update($data);
- if ($resultUpdate) {
- $zb_config = Config::get('zb_str');
- $data = [
- "gameid" => $game_id,
- "app_key" => 'qm_sdk',
- "timestamp" => time(),
- ];
- $data['sign'] = $this->getZbSign($data, $zb_config['sign_key']);
- if (APP_STATUS == 'stable') {
- $zb_url = $zb_config['pro_url'];
- } else {
- $zb_url = $zb_config['dev_url'];
- }
- // 通知直播平台更新游戏包
- $zb_res = curlHeader($zb_url . "/v1/api/game/pack/notice", $data, ['Content-Type' => 'application/x-www-form-urlencoded']);
- trace("## ZB_API: " . json_encode(['url' => $zb_url . "/v1/api/game/pack/notice", 'body' => $data, 'result' => $zb_res]), 'info');
- }
- } else {
- $game_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('name');
- $control_type = 1;
- $data['game_name'] = $game_name;
- $data['bag_name'] = $postParam['bag_name'];
- $data['bag_size'] = $postParam['size'];
- $data['bag_version'] = $postParam['bag_version'];
- $data['platform_type'] = $ext_suffix == 'apk' ? 1 : 2;
- $data['create_time'] = NOW_TIMESTAMP;
- $data['update_time'] = NOW_TIMESTAMP;
- $data['control_name'] = session('USERNAME');
- $data['game_id'] = $game_id;
- $data['remark'] = $postParam['remark'];
- $data['path'] = $domain . '/sygame/' . $game_package_name . '/' . $game_package_name . '.' . $ext_suffix;
- $resultUpdate = Db::name('nw_game_package_upload')->insert($data);
- }
- if (!$resultUpdate) {
- throw new Exception("数据更新失败");
- }
- $cont = [];
- $cont['game_id'] = $game_id;
- $cont['create_time'] = NOW_TIMESTAMP;
- $cont['control_name'] = session('USERNAME');
- $cont['control_type'] = $control_type;
- $result = Db::name('game_upload_log')->insert($cont);
- Db::name('cy_game')->where(['id' => $game_id])->update(['channel_version' => $postParam['bag_version']]);
- Db::commit();
- } catch (Exception $e) {
- Db::rollback();
- $this->error("上传失败 " . $e->getMessage());
- }
- $this->success('上传成功');
- // $datas = [];
- // $datas['game_name'] = $postParam['name'];
- // $datas['bag_name'] = $name.'.'.$ext_suffix;
- // $datas['bag_size'] = $postParam['size'];
- // $datas['platform_type'] = $ext_suffix == 'apk'?1:2;
- // $datas['create_time'] = NOW_TIMESTAMP;
- // $datas['control_type'] = 1;
- // $datas['control_name'] = session('USERNAME');
- // $datas['path'] = $domain.'/sygame/'.$name.'/'.$name.'.'.$ext_suffix;
- // // if (Db::name('nw_game_package_upload')->where(['bag_name'=>$datas['bag_name']])->value('id')) {
- // // $resultUpdate = Db::name('nw_game_package_upload')->where(['bag_name'=>$datas['bag_name']])->update($datas);
- // // }else{
- // $resultUpdate = Db::name('nw_game_package_upload')->insert($datas);
- // // }
- // $this->success('上传成功');
- }
- }
- // 直播接口交互签名
- private function getZbSign($data, $sign_key)
- {
- // TODO:注意×会被转成×的问题,浏览器展示会处理,实际接口请求不影响
- // 1. 构建待拼接字符串
- $pre_sign_str = md5($sign_key);
- $sign_str = md5(sprintf('app_key=qm_sdk×tamp=%d', $data['timestamp']));
- // 2. 进行两次 md5 计算
- $sign = md5($pre_sign_str . $sign_str);
- // 3. 返回签名
- return $sign;
- }
- // 测试包&物料管理
- public function testPackage(){
- if(request()->isPost()){
- $gameid = input('game_id', '');
- $where = [];
- if (!empty($gameid)) {
- $where['game_id'] = $gameid;
- }
- $list = Db::table('nw_game_package_test')->where($where)->page(input('page', 1), input('limit', 15))->order('id desc')->select();
- foreach ($list as &$value) {
- $value['tg_url'] = Env::get('HTTP_HOST_URL_ALL') .'/game/external?code='. base64_encode($value['game_id']);
- }
- $count = Db::table('nw_game_package_test')->where($where)->count();
- $this->result(['list' => $list, 'upload_url' => Env::get('mubao.upload_url'), 'count' => $count], 200, 'success', 'json');
- }
- // $gamne_ids = Db::table('nw_game_package_test')->column('game_id');
- // ->where('id','not in', $gamne_ids)
- $game_lsit = Db::table('cy_game')->whereIn('type', [1,2])->field('id,name,pinyin')->order('id desc')->select();
- $this->assign('gameLsit', $game_lsit);
- return $this->fetch();
- }
- public function testPackageSave()
- {
- if(request()->isPost()){
- $param = Request::instance()->only(['id', 'name', 'game_id', 'path_url', 'material_url', 'remarks', 'status', 'game_pinyin']);
- if (isset($param['id'])) {
- $id = $param['id'];
- unset($param['id']);
- $param['update_time'] = date('Y-m-d H:i:s', time());
- // TODO: 删除老文件
- $info = Db::table('nw_game_package_test')->where(['id' => $id])->update($param);
- }else{
- $param['create_time'] = date('Y-m-d H:i:s', time());
- $info = Db::table('nw_game_package_test')->insert($param);
- }
- if(!$info){
- $this->result([], -100, 'error', 'json');
- }
- $this->result([], 200, 'success', 'json');
- }
- $id = input('id', '');
- $info = Db::table('nw_game_package_test')->where(['id' => $id])->find();
- // 编辑模式下,排除其他记录的游戏ID,但包含当前记录的游戏
- $gamne_ids = Db::table('nw_game_package_test')->where('id', '<>', $id)->column('game_id');
- $game_lsit = Db::table('cy_game')->whereIn('type', [1,2])->whereNotIn('id', $gamne_ids)->field('id,name,pinyin')->order('id desc')->select();
- $this->assign('info', $info);
- $this->assign('gameLsit', $game_lsit);
- $this->assign('upload_url', Env::get('mubao.upload_url'));
- return $this->fetch();
- }
- public function testPackageDel(){
- $id = input('id', '');
- $res = Db::table('nw_game_package_test')->where(['id' => $id])->delete();
- if(!$res){
- $this->result([], -100, 'error', 'json');
- }
- $this->result([], 200, 'success', 'json');
- }
- }
|