dataList(1); /** * 渲染模板 */ return $this->render('index', $params); } /** * 查询数据列表 */ protected function dataList($type = '') { $request = Yii::$app->request; $creatTime = $request->get('creatTime'); $endTime = $request->get('endTime'); $status = $request->get('status'); $version = $request->get('version'); $manufacture_name = $request->get('manufacture_name'); $project_name = $request->get('project_name'); $model_name = $request->get('model_name'); $dataType = !empty($request->get('type')) ? $request->get('type') : UpgradeStatus::TYPE_APP; $gets = [ 'creatTime' => $creatTime, 'endTime' => $endTime, 'status' => $status, 'version' => $version, 'type' => $dataType, 'manufacture_name' => $manufacture_name, 'project_name' => $project_name, 'model_name' => $model_name ]; $where = ['and']; if ($manufacture_name) { $where[] = ['or', ['like','mf.name', $manufacture_name], ['like','mf.manufacture_no', $manufacture_name]]; } if ($project_name) { $where[] = ['or', ['like','pro.name', $project_name], ['like','pro.project_no', $project_name]]; } if ($model_name) { $where[] = ['or', ['like','mo.name', $model_name], ['like','mo.model_no', $model_name]]; } if ($creatTime) { $creatTime = strtotime($creatTime); $where[] = ['>=', 'u.pushed_at', $creatTime]; } if ($endTime) { $endTime = strtotime($endTime) + 86400; $where[] = ['<=', 'u.pushed_at', $endTime]; } if ($status) { $status = ($status == -1) ? 0 : $status; $where[] = ['=', 'u.status', $status]; } if ($version) { $where[] = ['like', 'u.version', $version]; } if ($dataType) { $where[] = ['=', 'u.type', $dataType]; } $user = Yii::$app->user->identity; if (isset($user->is_manufacture) && $user->is_manufacture == 1) { $where[] = ['=', 'mf.sys_user_id', $user->id];// ??? } if ($type == 0) { $pageList = UpgradeRepository::getPageList($where, 0 , 0); $pages = null; } else { $pageSize = 20; $pages = new Pagination(['totalCount' => UpgradeRepository::getPageCount($where), 'pageSize' => $pageSize]); $pageList = UpgradeRepository::getPageList($where, $pages->offset, $pages->limit); } /** * 数据整理 */ return [ 'listdata' => $pageList, 'pages' => $pages, 'gets' => $gets ]; } /** * 创建版本 * @return string */ public function actionCreate() { $gets = $this->request->get(); $user = Yii::$app->user->identity; if (isset($user->is_manufacture) && $user->is_manufacture == 1) { $gets["is_manufacture"] = 1; $manufacturer = ManufacturerRepository::findOne(["sys_user_id" => $user->id]); if ($manufacturer) { $gets["manufacture_name"] = $manufacturer->name; $gets["manufacture_id"] = $manufacturer->id; } } return $this->render('create', ['gets' => $gets]); } /** * 创建版本 * @return string */ public function actionDoAdd() { $request = Yii::$app->request; $version = $request->post("version"); // 版本 if (empty(trim($version))) { Yii::$app->session->setFlash('error', '版本不能为空'); return $this->render('create'); } $user = Yii::$app->user->identity; if (isset($user->is_manufacture) && $user->is_manufacture == 1) { $manufacturer = ManufacturerRepository::findOne(["sys_user_id" => $user->id]); if (empty($manufacturer) || $manufacturer->id != $request->post("manufacture_id")) { Yii::$app->session->setFlash('error', '添加失败'); return $this->render('create'); } } $result = Upgrade::create($request->post()); if ($result === -1) { Yii::$app->session->setFlash('error', '添加失败,版本' . $version . '已存在'); return $this->render('create'); } if ($result) { Yii::$app->session->setFlash('success', '添加成功'); } else { Yii::$app->session->setFlash('error', '添加失败'); } return $this->redirect('index?type=' . (!empty($request->post("type")) ? $request->post("type") : UpgradeStatus::TYPE_APP)); } /** * 取消发布 * @return string */ public function actionDoCancel() { $request = Yii::$app->request; $id = $request->post("id"); // $e = new stdClass(); $e->success = false; $e->message = 'fail'; if (empty($id)) { $e->message = 'ID为空'; return $this->renderJson($e); } $upgradeModel = UpgradeRepository::findOne(['id' => $id]); if (empty($upgradeModel)) { $e->message = '未找到版本记录'; return $this->renderJson($e); } $upgradeModel->status = UpgradeStatus::STATUS_WAIT; if ($upgradeModel->save()) { $e->success = true; } else { $e->message = '取消失败'; } return $this->renderJson($e); } /** * 编辑版本 * @return string */ public function actionEdit() { $upgradeId = $this->request->get("uid"); $isCreate = $this->request->get("isCreate"); $info = UpgradeRepository::selectOne($upgradeId, true); if (isset($info["path"])) { $info["oldName"] = $info["path"]; $manufacture = ManufacturerRepository::selectOne($info["manufacture_id"]); if (isset($manufacture["name"])) { $info["manufacture_name"] = $manufacture["name"]; } } return $this->render('edit', ["info" => ($isCreate == 2 ? $this->request->get() : $info)]); } /** * 编辑版本 * @return string */ public function actionDoEdit() { $request = Yii::$app->request; $version = $request->post("version"); $uid = $request->post("uid"); if (empty($uid)) { Yii::$app->session->setFlash('error', '版本编号不能为空'); $params = $this->dataList(1); return $this->render('index', $params); } $user = Yii::$app->user->identity; if (isset($user->is_manufacture) && $user->is_manufacture == 1) { $manufacturer = ManufacturerRepository::findOne(["sys_user_id" => $user->id]); if (empty($manufacturer) || $manufacturer->id != $request->post("manufacture_id")) { Yii::$app->session->setFlash('error', '编辑失败'); $params = $this->dataList(1); return $this->render('index', $params); } } $upgrade = UpgradeRepository::selectOne($uid,true); if (isset($upgrade["path"])) { $upgrade["oldName"] = $upgrade["path"]; $manufacture = ManufacturerRepository::selectOne($upgrade["manufacture_id"]); if (isset($manufacture["name"])) { $upgrade["manufacture_name"] = $manufacture["name"]; } } if (empty($upgrade)) { Yii::$app->session->setFlash('error', '版本记录不存在'); $params = $this->dataList(1); return $this->render('index', $params); } if (empty(trim($version))) { Yii::$app->session->setFlash('error', '版本不能为空'); return $this->render('edit', ["info" => $upgrade]); } $result = Upgrade::update($uid, $request->post()); if ($result === -1) { Yii::$app->session->setFlash('error', '修改的版本' . $version . '已存在'); return $this->render('edit', ["info" => $upgrade]); } if ($result) { Yii::$app->session->setFlash('success', '编辑成功'); } else { Yii::$app->session->setFlash('error', '编辑失败'); } $upgrade = UpgradeRepository::selectOne($uid,true); if (isset($upgrade["path"])) { $upgrade["oldName"] = $upgrade["path"]; $manufacture = ManufacturerRepository::selectOne($upgrade["manufacture_id"]); if (isset($manufacture["name"])) { $upgrade["manufacture_name"] = $manufacture["name"]; } } return $this->render('edit', ["info" => $upgrade]); } /** * 删除版本 * @return string * @throws \Exception */ public function actionDoDel() { $request = Yii::$app->request; $itemId = $request->post("data_id"); $msg = array(); $user = Yii::$app->user->identity; if (isset($user->is_manufacture) && $user->is_manufacture == 1) { $manufacturer = ManufacturerRepository::findOne(["sys_user_id" => $user->id]); $upgrade = UpgradeRepository::selectOne($itemId, true); if (empty($upgrade) || empty($manufacturer) || $manufacturer->id != $upgrade['manufacture_id']) { $msg['status'] = 0; $msg['msg'] = "删除"; return $this->renderJson($msg); } } // 删除对应的版本 if (Upgrade::delete($itemId)) { $msg['status'] = 1; $msg['msg'] = "操作成功"; } else { $msg['status'] = 0; $msg['msg'] = "操作失败"; } return $this->renderJson($msg); } /** * 导出厂商数据 * @return string */ public function actionExport() { $params = $this->dataList(0); return $this->renderPartial('export', $params); } /** * 厂商管理 */ public function actionSelectManufacture() { $params = $this->dataListManufacture(1); /** * 渲染模板 */ return $this->render('select-manufacture', $params); } /** * 查询数据列表 */ protected function dataListManufacture($type = '') { $request = Yii::$app->request; $creatTime = $request->get('creatTime'); $endTime = $request->get('endTime'); $name = $request->get('name'); $phone = $request->get('phone'); $loginName = $request->get('loginName'); $version = $request->get('version'); $uid = $request->get('uid'); $package_name = $request->get('package_name'); $manufacture_id = $request->get('manufacture_id'); $path = $request->get('path'); $size = $request->get('size'); $file_md5 = $request->get('file_md5'); $oldName = $request->get('oldName'); $type = $request->get('type'); $isCreate = $request->get('isCreate'); $gets = [ 'creatTime' => $creatTime, 'endTime' => $endTime, 'name' => $name, 'phone' => $phone, 'loginName' => $loginName, 'version' => $version, 'package_name' => $package_name, 'path' => $path, 'size' => $size, 'file_md5' => $file_md5, 'manufacture_id' => $manufacture_id, 'oldName' => $oldName, 'type' => $type, 'uid' => $uid, 'isCreate' => $isCreate, ]; $where = ['and']; if ($name) { $where[] = ['like', 'name', $name]; } if ($phone) { $where[] = ['like', 'phone', $phone]; } if ($loginName) { $where[] = ['like', 'username', $loginName]; } if ($creatTime) { $creatTime = strtotime($creatTime); $where[] = ['>=', 'm.created_at', $creatTime]; } if ($endTime) { $endTime = strtotime($endTime) + 86400; $where[] = ['<=', 'm.created_at', $endTime]; } if ($type == 0) { $pageList = ManufacturerRepository::getPageList($where, 0 , 0); $pages = null; } else { $pageSize = 8; $pages = new Pagination(['totalCount' => ManufacturerRepository::getPageCount($where), 'pageSize' => $pageSize]); $pageList = ManufacturerRepository::getPageList($where, $pages->offset, $pages->limit); } /** * 数据整理 */ return [ 'listdata' => $pageList, 'pages' => $pages, 'gets' => $gets ]; } /** * 上传文件函数,如过上传不成功打印$_FILES数组,查看error报错信息 * 值:0; 没有错误发生,文件上传成功。 * 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 * 值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 * 值:3; 文件只有部分被上传。 * 值:4; 没有文件被上传。 * date:2018.4.18 from:zhix.net */ public function actionUploadFile() { header("Expires: Mon, 26 Jul 2030 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Content-type: text/html; charset=utf-8"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { exit; // finish preflight CORS requests here } if ( !empty($_REQUEST[ 'debug' ]) ) { $random = rand(0, intval($_REQUEST[ 'debug' ]) ); if ( $random === 0 ) { header("HTTP/1.0 500 Internal Server Error"); exit; } } // header("HTTP/1.0 500 Internal Server Error"); // exit; // 5 minutes execution time set_time_limit(60 * 60); // Uncomment this one to fake upload time usleep(5000); // Settings $upload = Yii::getAlias('@app/api') . "/web/upload"; $savePath = 'web/upload/packages/package_' . date("Ym"); $assetsUrl = Yii::$app->params['assetsUrl']; $targetDir = $upload . '/packages/file_material_tmp'; //存放分片临时目录 $uploadDir = $upload . '/packages/package_' . date("Ym"); $cleanupTargetDir = true; // Remove old files $maxFileAge = 5 * 3600; // Temp file age in seconds // Create target dir if (!file_exists($targetDir)) { mkdir($targetDir,0777,true); } // Create target dir if (!file_exists($uploadDir)) { mkdir($uploadDir,0777,true); } // Get a file name if (isset($_REQUEST["name"])) { $fileName = $_REQUEST["name"]; } elseif (!empty($_FILES)) { $fileName = $_FILES["file"]["name"]; } else { $fileName = uniqid("file_"); } $oldName = $fileName; //$fileName = iconv('gbk','UTF-8',$fileName); $filePath = $targetDir . "/" . $fileName; // $uploadPath = $uploadDir . "/" . $fileName; // Chunking might be enabled $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1; // Remove old temp files if ($cleanupTargetDir) { if (!is_dir($targetDir) || !$dir = opendir($targetDir)) { die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}'); } while (($file = readdir($dir)) !== false) { $tmpfilePath = $targetDir . "/" . $file; // If temp file is current file proceed to the next if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") { continue; } // Remove temp file if it is older than the max age and is not the current file if (preg_match('/\.(part|parttmp)$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge)) { unlink($tmpfilePath); } } closedir($dir); } // Open temp file if (!$out = fopen("{$filePath}_{$chunk}.parttmp", "wb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); } if (!empty($_FILES)) { if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); } // Read binary input stream and append it to temp file if (!$in = fopen($_FILES["file"]["tmp_name"], "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 104, "message": "Failed to open input stream."}, "id" : "id"}'); } } else { if (!$in = fopen("php://input", "rb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 105, "message": "Failed to open input stream."}, "id" : "id"}'); } } while ($buff = fread($in, 4096)) { fwrite($out, $buff); } fclose($out); fclose($in); rename("{$filePath}_{$chunk}.parttmp", "{$filePath}_{$chunk}.part"); $index = 0; $done = true; for( $index = 0; $index < $chunks; $index++ ) { if ( !file_exists("{$filePath}_{$index}.part") ) { $done = false; break; } } if ($done) { $pathInfo = pathinfo($fileName); $hashStr = substr(md5(time().mt_rand(000000, 999999)), 8, 16); $fName = str_replace(' ', '', $pathInfo['basename']); $filenameArr = explode('.', $fName); $hashName = $filenameArr[0] .'_'. $hashStr . '.' .$pathInfo['extension']; $uploadPath = $uploadDir . "/" .$hashName; $saveUploadPath = $savePath . "/" . $hashName; if (!$out = fopen($uploadPath, "wb")) { die('{"jsonrpc" : "2.0", "error" : {"code": 106, "message": "Failed to open output stream."}, "id" : "id"}'); } //flock($hander,LOCK_EX)文件锁 if ( flock($out, LOCK_EX) ) { for( $index = 0; $index < $chunks; $index++ ) { if (!$in = fopen("{$filePath}_{$index}.part", "rb")) { break; } while ($buff = fread($in, 4096)) { fwrite($out, $buff); } fclose($in); unlink("{$filePath}_{$index}.part"); } flock($out, LOCK_UN); } fclose($out); $savePath = self::getFilePath($hashName, Yii::$app->user->id); $response = [ 'success' => true, 'oldName' => $oldName, 'filePath' => $savePath, 'uploadPath' => $saveUploadPath, 'fileSize' => filesize($uploadPath), 'fileSuffixes' => $pathInfo['extension'], //文件后缀名 'file_md5' => md5_file($uploadPath), ]; // 上传OSS /* 分两步上传 $fileService = new FileService(); $fileService->add($uploadPath, $savePath);*/ // 删除服务器传成功的文件 //@unlink($uploadPath); /** * 后台操作日志 */ AdminLogs::doImport('上传APP版本', 1); return json_encode($response); } // Return Success JSON-RPC response die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}'); } /** * 同步文件到OSS * @return array */ public function actionPushOss() { $e = new stdClass(); try { $request = Yii::$app->request; $upgradeId = $request->post('upgrade_id'); $e->success = false; $e->message = ""; if (empty($upgradeId)) { $e->message = "缺少版本编号"; return $this->renderJson($e); } $upgradeModel = UpgradeRepository::findOne($upgradeId); if (empty($upgradeModel)) { $e->message = "该版本不存在"; return $this->renderJson($e); } $uploadPath = Yii::getAlias('@app/api') . "/" . $upgradeModel->upload_path; if (!file_exists($uploadPath)) { $e->message = "该版本ECS文件不存在"; return $this->renderJson($e); } $savePath = $upgradeModel->path; $fileService = new FileService(); $fileService->add($uploadPath, $savePath); $upgradeModel->oss_upload_status = UpgradeStatus::OSS_UPLOAD_SUCCESS; $upgradeModel->save(); $e->success = true; $e->message = "同步OSS成功"; return $this->renderJson($e); } catch (\Exception $ex) { $e->message = "同步OSS异常:" . $ex->getMessage(); return $this->renderJson($e); } } /** * 发布APP版本 * @return string */ public function actionPushApp() { $upgradeId = $this->request->get("uid"); $info = UpgradeRepository::selectOne($upgradeId, true); if (isset($info["path"])) { $info["oldName"] = $info["path"]; $manufacture = ManufacturerRepository::selectOne($info["manufacture_id"]); if (isset($manufacture["name"])) { $info["manufacture_name"] = $manufacture["name"]; } $project = ProjectRepository::selectOne($info["project_id"]); if (isset($project["name"])) { $info["project_name"] = $project["name"]; } $model = ModelRepository::selectOne($info["model_id"]); if (isset($model["name"])) { $info["model_name"] = $model["name"]; } } return $this->render('push-app', ["info" => $info]); } /** * 发布OTA版本 * @return string */ public function actionPushOta() { $upgradeId = $this->request->get("uid"); $info = UpgradeRepository::selectOne($upgradeId, true); if (isset($info["path"])) { $info["oldName"] = $info["path"]; $manufacture = ManufacturerRepository::selectOne($info["manufacture_id"]); if (isset($manufacture["name"])) { $info["manufacture_name"] = $manufacture["name"]; } $project = ProjectRepository::selectOne($info["project_id"]); if (isset($project["name"])) { $info["project_name"] = $project["name"]; } $model = ModelRepository::selectOne($info["model_id"]); if (isset($model["name"])) { $info["model_name"] = $model["name"]; } } return $this->render('push-ota', ["info" => $info]); } /** * 发布版本 * @return string */ public function actionDoPushApp() { $request = Yii::$app->request; $selFocuse = $request->post("focuse"); $uid = $request->post("uid"); $type = $request->post("type"); if (empty($uid)) { Yii::$app->session->setFlash('error', '版本编号不能为空'); $params = $this->dataList(1); return $this->render('index', $params); } $upgradeModel = UpgradeRepository::findOne(['id' => $uid, 'is_delete' => 0]); if (!$upgradeModel) { Yii::$app->session->setFlash('error', '未找到升级记录'); $params = $this->dataList(1); return $this->render('index', $params); } if (UpgradeStatus::TYPE_OTA == $upgradeModel->type) { $upgradeURL = 'push-ota?uid='.$uid; } else { $upgradeURL = 'push-app?uid='.$uid; } if (empty($selFocuse)) { Yii::$app->session->setFlash('error', '请选择是否强制升级'); return $this->redirect($upgradeURL); } if (empty($upgradeModel->manufacture_id)) { Yii::$app->session->setFlash('error', '请先配置好厂商'); return $this->redirect($upgradeURL); } if (empty($upgradeModel->project_id)) { Yii::$app->session->setFlash('error', '请先配置版本项目'); return $this->redirect($upgradeURL); } if (empty($upgradeModel->model_id)) { Yii::$app->session->setFlash('error', '请先配置版本型号'); return $this->redirect($upgradeURL); } $exitUpgradeModel = UpgradeRepository::findOne([ 'manufacture_id' => $upgradeModel->manufacture_id, 'project_id' => $upgradeModel->project_id, 'model_id' => $upgradeModel->model_id, 'is_delete' => 0, 'type' => $upgradeModel->type, 'version' => $upgradeModel->version, 'package_name' => $upgradeModel->package_name, 'status' => UpgradeStatus::STATUS_ON ]); if ($exitUpgradeModel && $upgradeModel->id != $exitUpgradeModel->id) { Yii::$app->session->setFlash('error', '该厂商该批次已经存在一个版本号为:'.$exitUpgradeModel->version.'的发布版本,请先取消它再发布'); return $this->redirect($upgradeURL); } $result = Upgrade::update($uid, $request->post()); if ($result === -1) { Yii::$app->session->setFlash('error', '发布失败'); } if ($result) { Yii::$app->session->setFlash('success', '发布成功'); } else { Yii::$app->session->setFlash('error', '发布失败'); } return $this->redirect('index?type=' . (!empty($request->post("type")) ? $request->post("type") : UpgradeStatus::TYPE_APP)); } /** * 获取文件存储路径: bind_apply/201705//文件名 * @param $suffix 文件后缀 * @return string */ public static function getFilePath( $filename, $userId) { $basePath = "upgrade_packages/" . date("Ym"); $savePath = $basePath . '/' . $filename; return $savePath; } /** * @return string */ public function actionCheckUpgrade() { $e = new stdClass(); $e->success = false; $request = Yii::$app->request; $manufactureId = $request->post("manufacture"); $projectId = $request->post("project"); $modelId = $request->post("model"); $type = $request->post("type"); $id = $request->post('id'); $version = $request->post('version'); $package_name = $request->post('package_name'); if (empty($package_name)) { $e->message = '请先录入一个包名'; return $this->renderJson($e); } if (empty($manufactureId)) { $e->message = '请先选择厂商'; return $this->renderJson($e); } if (empty($projectId)) { $e->message = '请先选择项目'; return $this->renderJson($e); } if (empty($modelId)) { $e->message = '请先选择型号'; return $this->renderJson($e); } $upgradeModel = UpgradeRepository::findOne(['manufacture_id' => $manufactureId, 'project_id' => $projectId, 'model_id' => $modelId, 'is_delete' => 0, 'package_name' => $package_name, 'type' => $type]); if ($upgradeModel && empty($id) ) { $e->message = '该厂商该批次已经存在一个版本号为:'.$upgradeModel->version.' 包名为'.$package_name.'的版本,请先确认再上传'; return $this->renderJson($e); } if ($upgradeModel && !empty($id) && $id != $upgradeModel->id ) { $e->message = '该厂商该批次已经存在一个版本号为:'.$upgradeModel->version.' 包名为'.$package_name.'的版本,请先确认再上传!'; return $this->renderJson($e); } $e->success = true; $e->message = 'ok'; return $this->renderJson($e); } }