作者 lyh

gx

@@ -7,6 +7,7 @@ use App\Events\CopyImageFile; @@ -7,6 +7,7 @@ use App\Events\CopyImageFile;
7 use App\Events\CopyProject; 7 use App\Events\CopyProject;
8 use App\Exceptions\AsideGlobalException; 8 use App\Exceptions\AsideGlobalException;
9 use App\Jobs\CopyImageFileJob; 9 use App\Jobs\CopyImageFileJob;
  10 +use App\Jobs\CopyProjectJob;
10 use App\Models\Com\NoticeLog; 11 use App\Models\Com\NoticeLog;
11 use App\Models\Com\UpdateLog; 12 use App\Models\Com\UpdateLog;
12 use App\Models\Devops\ServerConfig; 13 use App\Models\Devops\ServerConfig;
@@ -612,7 +613,7 @@ class ProjectLogic extends BaseLogic @@ -612,7 +613,7 @@ class ProjectLogic extends BaseLogic
612 * @time :2023/11/8 14:23 613 * @time :2023/11/8 14:23
613 */ 614 */
614 public function copyProject(){ 615 public function copyProject(){
615 - CopyProject::dispatch(['project_id'=>$this->param['project_id']]); 616 + CopyProjectJob::dispatch(['project_id'=>$this->param['project_id']]);
616 return $this->success(); 617 return $this->success();
617 } 618 }
618 619
  1 +<?php
  2 +
  3 +namespace App\Jobs;
  4 +
  5 +use App\Events\CopyProject;
  6 +use App\Events\UpdateHtml;
  7 +use App\Jobs\updateHtmlJob;
  8 +use App\Models\Project\After;
  9 +use App\Models\Project\DeployBuild;
  10 +use App\Models\Project\DeployOptimize;
  11 +use App\Models\Project\Payment;
  12 +use App\Models\Project\Project;
  13 +use App\Models\Template\Setting;
  14 +use App\Models\User\User as UserModel;
  15 +use App\Services\ProjectServer;
  16 +use Hashids\Hashids;
  17 +use Illuminate\Bus\Queueable;
  18 +use Illuminate\Contracts\Queue\ShouldQueue;
  19 +use Illuminate\Foundation\Bus\Dispatchable;
  20 +use Illuminate\Queue\InteractsWithQueue;
  21 +use Illuminate\Queue\SerializesModels;
  22 +use Illuminate\Support\Facades\DB;
  23 +use Illuminate\Support\Facades\Schema;
  24 +
  25 +class CopyProjectJob implements ShouldQueue
  26 +{
  27 + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  28 + public $tries = 3; // 可配置任务重试次数
  29 +
  30 + protected $param;
  31 +
  32 + /**
  33 + * Create a new job instance.
  34 + *
  35 + * @param CopyImageFile $event
  36 + * @return void
  37 + */
  38 + public function __construct($data)
  39 + {
  40 + $this->param = $data;
  41 + }
  42 +
  43 +
  44 + /**
  45 + * Handle the event.
  46 + *
  47 + * @param UpdateHtml $event
  48 + * @return void
  49 + */
  50 + public function handle(CopyProject $event)
  51 + {
  52 + @file_put_contents(storage_path('logs/lyh_error.log'), var_export('复制项目测试进入:', true) . PHP_EOL, FILE_APPEND);
  53 + $this->param = $event->data;
  54 + $this->model = new Project();
  55 + DB::beginTransaction();
  56 + try {
  57 + //复制初始项目
  58 + $data = $this->model::where('id', $this->param['project_id'])->first();
  59 + $data = $data->getAttributes();
  60 + $type = $data['type'];
  61 + $data['type'] = 0;
  62 + $data['title'] = $data['title'].'-copy';
  63 + unset($data['id']);
  64 + $project_id = $this->model->insertGetId($data);
  65 + //复制部署表
  66 + $buildModel = new DeployBuild();
  67 + $buildData = $buildModel::where('project_id', $this->param['project_id'])->first();
  68 + if(!empty($buildData)){
  69 + $buildData = $buildData->getAttributes();
  70 + $buildData['project_id'] = $project_id;
  71 + $hashids = new Hashids('test_domain', 5, 'abcdefghjkmnpqrstuvwxyz1234567890');
  72 + $code = $hashids->encode($project_id);
  73 + $buildData['test_domain'] = 'https://v6-' . $code . '.globalso.site/';
  74 + unset($buildData['id']);
  75 + $buildModel->insert($buildData);
  76 + }
  77 + //复制优化表
  78 + $optimizeModel = new DeployOptimize();
  79 + $optimizeData = $optimizeModel::where('project_id', $this->param['project_id'])->first();
  80 + if(!empty($optimizeData)){
  81 + $optimizeData = $optimizeData->getAttributes();
  82 + unset($optimizeData['id'],$optimizeData['domain']);
  83 + $optimizeData['project_id'] = $project_id;
  84 + $optimizeModel->insert($optimizeData);
  85 + }
  86 + //复制付费表
  87 + $paymentModel = new Payment();
  88 + $paymentData = $paymentModel::where('project_id', $this->param['project_id'])->first();
  89 + if(!empty($paymentData)){
  90 + $paymentData = $paymentData->getAttributes();
  91 + unset($paymentData['id']);
  92 + $paymentData['project_id'] = $project_id;
  93 + $paymentModel->insert($paymentData);
  94 + }
  95 + //复制售后表
  96 + $afterModel = new After();
  97 + $afterData = $afterModel::where('project_id', $this->param['project_id'])->first();
  98 + if(!empty($afterData)){
  99 + $afterData = $afterData->getAttributes();
  100 + unset($afterData['id']);
  101 + $afterData['project_id'] = $project_id;
  102 + $afterModel->insert($afterData);
  103 + }
  104 + //复制用户
  105 + $userModel = new UserModel();
  106 + $userData = $userModel::where('project_id', $this->param['project_id'])->where('role_id',0)->first();
  107 + if(!empty($userData)){
  108 + $userData = $userData->getAttributes();
  109 + unset($userData['id']);
  110 + $userData['project_id'] = $project_id;
  111 + $userModel->insert($userData);
  112 + }
  113 + //复制设置的模版
  114 + $settingTemplateModel = new Setting();
  115 + $settingData = $settingTemplateModel::where('project_id', $this->param['project_id'])->first();
  116 + if(!empty($settingData)){
  117 + $settingData = $settingData->getAttributes();
  118 + unset($settingData['id']);
  119 + $settingData['project_id'] = $project_id;
  120 + $settingTemplateModel->insert($settingData);
  121 + }
  122 + DB::commit();
  123 + }catch (\Exception $e){
  124 + DB::rollBack();
  125 + $this->fail('error');
  126 + }
  127 + if($type != 0){
  128 + $this->copyMysql($this->param['project_id'],$project_id);
  129 + }
  130 + return true;
  131 + }
  132 +
  133 + //复制数据库
  134 + public function copyMysql($project_id,$new_project_id){
  135 + //切换数据库配置
  136 + $project = ProjectServer::useProject($new_project_id);
  137 + //创建数据库
  138 + ProjectServer::createDatabase($project);
  139 + //创建表
  140 + $this->initTable($project_id,$new_project_id);
  141 + }
  142 +
  143 + /**
  144 + * @remark :创建数据库
  145 + * @name :initTable
  146 + * @author :lyh
  147 + * @method :post
  148 + * @time :2023/12/11 10:09
  149 + */
  150 + public function initTable($project_id,$news_project_id)
  151 + {
  152 + config(['database.connections.custom_tmp_mysql_copy.database' => 'gl_data_'.$project_id]);
  153 + $database_name = DB::connection('custom_tmp_mysql_copy')->getDatabaseName();
  154 + $tables = Schema::connection('custom_tmp_mysql_copy')->getAllTables();
  155 + $tables = array_column($tables, 'Tables_in_' . $database_name);
  156 + foreach ($tables as $table) {
  157 + $has_table = Schema::connection('custom_mysql')->hasTable($table);
  158 + if (!$has_table) {
  159 + $sql = DB::connection('custom_tmp_mysql_copy')->select("SHOW CREATE TABLE {$table}");
  160 + DB::connection('custom_mysql')->statement(get_object_vars($sql[0])['Create Table']);
  161 + }
  162 + DB::connection('custom_mysql')->table($table)->truncate(); // 清空目标表数据
  163 + DB::connection('custom_mysql')->table($table)->insertUsing(
  164 + [], // 列名数组,留空表示插入所有列
  165 + function ($query) use ($table,$project_id) {
  166 + $name = 'gl_data_'.$project_id.'.'.$table;
  167 + $query->select('*')->from("{$name}");
  168 + }
  169 + );
  170 + if (Schema::connection('custom_mysql')->hasColumn($table, 'project_id')) {
  171 + DB::connection('custom_mysql')->table($table)->update(['project_id' => $news_project_id]);
  172 + }
  173 + }
  174 + return true;
  175 + }
  176 +}
@@ -25,7 +25,7 @@ class EventServiceProvider extends ServiceProvider @@ -25,7 +25,7 @@ class EventServiceProvider extends ServiceProvider
25 'Illuminate\Database\Events\QueryExecuted' => [ 25 'Illuminate\Database\Events\QueryExecuted' => [
26 'App\Listeners\QueryListener', 26 'App\Listeners\QueryListener',
27 ], 27 ],
28 - CopyProject::class => [CopyProjectListener::class], 28 +// CopyProject::class => [CopyProjectListener::class],
29 ]; 29 ];
30 30
31 /** 31 /**