作者 lyh

gx

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