UpgradeController.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace backend\modules\admin\controllers;
  3. use addons\UpgradeGift\common\listeners\UpgradeGiftListener;
  4. use backend\controllers\AdminController;
  5. use common\enums\RabbitMqEnum;
  6. use common\enums\StatusEnum;
  7. use common\helpers\CurlHelper;
  8. use common\models\addons\AddonsCombo;
  9. use common\models\backend\SystemVersionLog;
  10. use common\models\common\Addons;
  11. use services\common\UpgradeService;
  12. use Yii;
  13. use yii\helpers\Json;
  14. use Exception;
  15. /**
  16. * 更新管理
  17. *
  18. * @Author zmz
  19. * @DateTime 2022-10-30 10:11:22
  20. * @copyright: Copyright (c) 2022 广东七件事集团
  21. */
  22. class UpgradeController extends AdminController
  23. {
  24. public function actionIndex()
  25. {
  26. $retuest = Yii::$app->request;
  27. if ($retuest->isAjax) {
  28. if ($retuest->isPost) {
  29. $post = Yii::$app->request->post();
  30. // 检查提交的参数
  31. $res = Yii::$app->services->validate->validate($post,[
  32. [['limit'],'default','value' => '15'],
  33. ]);
  34. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  35. $where = [];
  36. $order = 'id desc';
  37. $params = array('where' => $where, 'order'=>$order, 'limit' => $post['limit']);
  38. $status_msg = [
  39. -1 => '更新失败',
  40. 0 => '更新中',
  41. 1 => '更新完成'
  42. ];
  43. $list = SystemVersionLog::listPage($params, false, true);
  44. foreach($list['list'] as $key => $value){
  45. $value['status_msg'] = $status_msg[$value['status']] ?? '';
  46. //upgrade_addons_version
  47. if(!$value['upgrade_addons_version']){
  48. $value['addons_version'] = '';
  49. }else{
  50. $upgrade_addons_version = explode(',',$value['upgrade_addons_version']);
  51. $tmp_upgrade_addons_version = [];
  52. foreach($upgrade_addons_version as $v){
  53. $v = explode(':',$v);
  54. $tmp_upgrade_addons_version[$v[0]] = $v[1];
  55. }
  56. $tmp_addons_version = [];
  57. $addons_version = explode(',',$value['addons_version']);
  58. foreach($addons_version as $v){
  59. $v = explode(':',$v);
  60. if(array_key_exists($v[0],$tmp_upgrade_addons_version)){
  61. //存在更新的插件
  62. $tmp_addons_version[] = implode(':',$v);
  63. }
  64. }
  65. $value['addons_version'] = implode(',',$tmp_addons_version);
  66. }
  67. $list['list'][$key] = $value;
  68. }
  69. // 检查最近一次更新时间
  70. $list['alert'] = SystemVersionLog::getUpgradeAlert();
  71. return $this->success('获取成功', $list);
  72. }
  73. }else {
  74. return $this->render($this->action->id);
  75. }
  76. }
  77. /**
  78. * 请求中台系统,检测是否有版本更新
  79. */
  80. public function actionCheck()
  81. {
  82. try{
  83. $version_list = $this->getNowVersion();
  84. //请求远程接口
  85. $result = Yii::$app->services->upgrade->getNewVersion($version_list);
  86. if(!$result){
  87. throw new Exception('请求远程接口出现错误');
  88. }
  89. Yii::error('actionCheck:'.json_encode($result));
  90. if($result['code']){
  91. throw new Exception($result['msg']);
  92. }
  93. return $this->success('存在版本更新',$result['data']);
  94. }catch(Exception $e){
  95. return $this->error($e->getMessage());
  96. }
  97. }
  98. /**
  99. * 升级版本
  100. */
  101. public function actionUpgrade()
  102. {
  103. try {
  104. $dbConfig = \Yii::$app->getComponents()['db'];
  105. $dsn = $dbConfig['dsn'];
  106. preg_match('|port=(.*?);|',$dsn,$match);
  107. $port = $match[1] ?? '';
  108. if($port != 3306){
  109. throw new Exception('鉴于当前系统是分布式部署,请联系技术处理版本更新');
  110. }
  111. //add lock
  112. Yii::$app->services->upgrade->lockUpgrade();
  113. $version_list = $this->getNowVersion();
  114. //请求远程接口
  115. $result = Yii::$app->services->upgrade->getNewVersion($version_list);
  116. if(!$result || !$result['data']){
  117. $msg = $result['msg'] ?? '请求远程接口出现错误';
  118. throw new Exception($msg);
  119. }
  120. $data = [
  121. 'now_version' => $version_list,
  122. 'upgrade' => $result['data']
  123. ];
  124. //写入队列,下载更新
  125. Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, UpgradeService::class, 'upgrade');
  126. return $this->success('正在更新,请等待5分钟后刷新列表查看...');
  127. }catch(Exception $e){
  128. return $this->error($e->getMessage());
  129. }
  130. }
  131. /**
  132. * 获取当前版本信息
  133. * @return void
  134. */
  135. private function getNowVersion(){
  136. $addons_path = Yii::getAlias('@addons');
  137. $addons = [];
  138. foreach( glob( $addons_path . '/*') as $item ){
  139. if( is_dir( $item )){
  140. $addons_name = str_replace($addons_path.'/','',$item);
  141. $version_file = $item.'/version';
  142. if(file_exists($version_file)){
  143. $version = file_get_contents($version_file);
  144. $addons[] = $addons_name.':'.trim($version);
  145. }else{
  146. //默认版本 1.0.0
  147. $addons[] = $addons_name.':1.0.0';
  148. }
  149. }
  150. }
  151. //主包版本
  152. if(file_exists(Yii::getAlias('@webpath').'/version')){
  153. $mian_version = file_get_contents(Yii::getAlias('@webpath').'/version');
  154. $mian_version = 'mian:'.trim($mian_version);
  155. }else{
  156. $mian_version = 'mian:1.0.0';
  157. }
  158. //h5版本
  159. if(file_exists(Yii::getAlias('@webpath').'/h5/version')){
  160. $h5_version = file_get_contents(Yii::getAlias('@webpath').'/h5/version');
  161. $h5_version = 'h5:'.trim($h5_version);
  162. }else{
  163. $h5_version = 'h5:1.0.0';
  164. }
  165. // 发薪猫版本
  166. $salary_h5_version = '';
  167. if (Addons::install('Salary')) {
  168. if(file_exists(Yii::getAlias('@webpath').'/salary/version')){
  169. $salary_h5_version = file_get_contents(Yii::getAlias('@webpath').'/salary/version');
  170. $salary_h5_version = 'salary-h5:'.trim($salary_h5_version) . ',';
  171. }else{
  172. $salary_h5_version = 'salary-h5:1.0.0,';
  173. }
  174. }
  175. //$system_info = file_get_contents(Yii::getAlias('@webpath').'/system.info');
  176. $version_list = $mian_version.','.$h5_version.','.$salary_h5_version.implode(',',$addons);
  177. return $version_list;
  178. }
  179. /**
  180. * 强制降低h5版本
  181. *
  182. * @return void
  183. */
  184. public function actionForceDowngradeH5()
  185. {
  186. try {
  187. Yii::$app->services->upgrade->forceDowngradeH5();
  188. } catch (\Exception $e) {
  189. return $this->error($e->getMessage());
  190. }
  191. return $this->success('降级成功');
  192. }
  193. }