作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

1 <?php 1 <?php
  2 +/**
  3 + * @remark :
  4 + * @name :CopyProject.php
  5 + * @author :lyh
  6 + * @method :post
  7 + * @time :2025/1/15 14:40
  8 + */
2 9
3 -namespace App\Jobs; 10 +namespace App\Console\Commands\Project;
4 11
5 -use App\Events\CopyProject;  
6 -use App\Events\UpdateHtml;  
7 -use App\Jobs\updateHtmlJob; 12 +use App\Models\Com\NoticeLog;
8 use App\Models\Project\After; 13 use App\Models\Project\After;
9 use App\Models\Project\DeployBuild; 14 use App\Models\Project\DeployBuild;
10 use App\Models\Project\DeployOptimize; 15 use App\Models\Project\DeployOptimize;
@@ -14,130 +19,191 @@ use App\Models\Template\Setting; @@ -14,130 +19,191 @@ use App\Models\Template\Setting;
14 use App\Models\User\User as UserModel; 19 use App\Models\User\User as UserModel;
15 use App\Services\ProjectServer; 20 use App\Services\ProjectServer;
16 use Hashids\Hashids; 21 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\Console\Command;
22 use Illuminate\Support\Facades\DB; 23 use Illuminate\Support\Facades\DB;
23 use Illuminate\Support\Facades\Log; 24 use Illuminate\Support\Facades\Log;
24 use Illuminate\Support\Facades\Schema; 25 use Illuminate\Support\Facades\Schema;
25 26
26 -class CopyProjectJob implements ShouldQueue 27 +class CopyProject extends Command
27 { 28 {
28 - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;  
29 - public $tries = 3; // 可配置任务重试次数  
30 -  
31 - protected $param;  
32 -  
33 /** 29 /**
34 - * Create a new job instance. 30 + * The name and signature of the console command.
35 * 31 *
36 - * @param CopyImageFile $event  
37 - * @return void 32 + * @var string
38 */ 33 */
39 - public function __construct($data)  
40 - {  
41 - $this->param = $data;  
42 - }  
43 - 34 + protected $signature = 'copy_project';
44 35
45 /** 36 /**
46 - * Handle the event. 37 + * The console command description.
47 * 38 *
48 - * @param UpdateHtml $event  
49 - * @return void 39 + * @var string
50 */ 40 */
  41 + protected $description = 'copy--复制项目';
  42 +
51 public function handle() 43 public function handle()
52 { 44 {
53 $projectModel = new Project(); 45 $projectModel = new Project();
54 - DB::beginTransaction();  
55 - try {  
56 - $this->output('CopyProjectJob start, project_id: ' . $this->param['project_id']);  
57 - //复制初始项目  
58 - $data = $projectModel::where('id', $this->param['project_id'])->first();  
59 - $data = $data->getAttributes();  
60 - $type = $data['type'];  
61 - $data['type'] = 0;  
62 - $data['status'] = 0;  
63 - $data['finish_remain_day'] = 0;  
64 - $data['title'] = $data['title'].'-copy';  
65 - $data['delete_status'] = 1;  
66 - unset($data['id'],$data['robots'],$data['is_translate_tag'],$data['is_translate'],$data['is_minor_languages'],$data['uptime']);  
67 - $project_id = $projectModel->insertGetId($data);  
68 - $hashids = new Hashids($data['from_order_id'], 13, 'abcdefghjkmnpqrstuvwxyz1234567890');  
69 - $projectModel->edit(['from_order_id'=>$hashids->encode($project_id)],['id'=>$project_id]);  
70 - //复制设置的模版  
71 - $settingTemplateModel = new Setting();  
72 - $settingData = $settingTemplateModel::where('project_id', $this->param['project_id'])->first();  
73 - if(!empty($settingData)){  
74 - $data = [  
75 - 'template_id' =>$settingData['template_id'],  
76 - 'project_id' => $project_id  
77 - ];  
78 - $settingTemplateModel->add($data);  
79 - }  
80 - //复制部署表  
81 - $buildModel = new DeployBuild();  
82 - $buildData = $buildModel::where('project_id', $this->param['project_id'])->first();  
83 - if(!empty($buildData)){  
84 - $buildData = $buildData->getAttributes();  
85 - $buildData['project_id'] = $project_id;  
86 - $hashids = new Hashids('test_domain', 5, 'abcdefghjkmnpqrstuvwxyz1234567890');  
87 - $code = $hashids->encode($project_id);  
88 - $buildData['test_domain'] = 'https://v6-' . $code . '.globalso.site/';  
89 - unset($buildData['id']);  
90 - $buildModel->insert($buildData);  
91 - }  
92 - //复制优化表  
93 - $optimizeModel = new DeployOptimize();  
94 - $optimizeData = $optimizeModel::where('project_id', $this->param['project_id'])->first();  
95 - if(!empty($optimizeData)){  
96 - $optimizeData = $optimizeData->getAttributes();  
97 - unset($optimizeData['id'],$optimizeData['domain'],$optimizeData['backlink'],$optimizeData['ai_video']);  
98 - $optimizeData['project_id'] = $project_id;  
99 - $optimizeData['api_no'] = 0;  
100 - $optimizeModel->insert($optimizeData);  
101 - }  
102 - //复制付费表  
103 - $paymentModel = new Payment();  
104 - $paymentData = $paymentModel::where('project_id', $this->param['project_id'])->first();  
105 - if(!empty($paymentData)){  
106 - $paymentData = $paymentData->getAttributes();  
107 - unset($paymentData['id']);  
108 - $paymentData['project_id'] = $project_id;  
109 - $paymentModel->insert($paymentData);  
110 - }  
111 - //复制售后表  
112 - $afterModel = new After();  
113 - $afterData = $afterModel::where('project_id', $this->param['project_id'])->first();  
114 - if(!empty($afterData)){  
115 - $afterData = $afterData->getAttributes();  
116 - unset($afterData['id']);  
117 - $afterData['project_id'] = $project_id;  
118 - $afterModel->insert($afterData); 46 + while (true) {
  47 + $list = NoticeLog::where('type', NoticeLog::TYPE_COPY_PROJECT)->where('status', NoticeLog::STATUS_PENDING)->get();
  48 + if(empty($list)){
  49 + sleep(5);
  50 + continue;
119 } 51 }
120 - //复制用户  
121 - $userModel = new UserModel();  
122 - $userData = $userModel::where('project_id', $this->param['project_id'])->where('role_id',0)->first();  
123 - if(!empty($userData)){  
124 - $userData = $userData->getAttributes();  
125 - unset($userData['id']);  
126 - $userData['project_id'] = $project_id;  
127 - $userModel->insert($userData); 52 + foreach ($list as $item){
  53 + DB::beginTransaction();
  54 + try {
  55 + $old_project_id = $item['data']['project_id'];
  56 + $this->output('CopyProjectJob start, project_id: ' . $old_project_id);
  57 + $data = $this->copyProject($old_project_id);
  58 + $project_id = $data['project_id'];
  59 + $type = $data['type'];
  60 + $this->copyDeployBuild($old_project_id,$project_id);
  61 + $this->copyDeployOptimize($old_project_id,$project_id);
  62 + $this->copyPayment($old_project_id,$project_id);
  63 + $this->copyAfter($old_project_id,$project_id);
  64 + $this->copyUser($old_project_id,$project_id);
  65 + if($type != 0){
  66 + $this->copyMysql($old_project_id,$project_id);
  67 + }
  68 + //修改项目状态
  69 + $projectModel->edit(['delete_status'=>0],['id'=>$project_id]);
  70 + $this->output('CopyProjectJob end, old project_id: ' . $old_project_id . ', new project_id: ' . $project_id);
  71 + $item->status = NoticeLog::STATUS_SUCCESS;
  72 + $item->save();
  73 + DB::commit();
  74 + }catch (\Exception $e){
  75 + DB::rollBack();
  76 + echo 'error:' . $item['id'] . $e->getMessage() . PHP_EOL . date('Y-m-d H:i:s');
  77 + errorLog('项目初始化失败', $item, $e);
  78 + $item->status = NoticeLog::STATUS_FAIL;
  79 + $item->save();
  80 + }
128 } 81 }
129 - DB::commit();  
130 - }catch (\Exception $e){  
131 - DB::rollBack();  
132 - $this->output('CopyProjectJob error, error message: ' . $e->getMessage());  
133 - $this->fail('error');  
134 } 82 }
135 - if($type != 0){  
136 - $this->copyMysql($this->param['project_id'],$project_id); 83 + return true;
  84 + }
  85 +
  86 + public function copyProject($old_project_id){
  87 + $projectModel = new Project();
  88 + $data = $projectModel::where('id', $old_project_id)->first();
  89 + $data = $data->getAttributes();
  90 + $type = $data['type'];
  91 + $data['type'] = 0;
  92 + $data['status'] = 0;
  93 + $data['finish_remain_day'] = 0;
  94 + $data['title'] = $data['title'].'-copy';
  95 + $data['delete_status'] = 1;
  96 + unset($data['id'],$data['robots'],$data['is_translate_tag'],$data['is_translate'],$data['is_minor_languages'],$data['uptime']);
  97 + $project_id = $projectModel->insertGetId($data);
  98 + $hashids = new Hashids($data['from_order_id'], 13, 'abcdefghjkmnpqrstuvwxyz1234567890');
  99 + $projectModel->edit(['from_order_id'=>$hashids->encode($project_id)],['id'=>$project_id]);
  100 + //复制设置的模版
  101 + $settingTemplateModel = new Setting();
  102 + $settingData = $settingTemplateModel::where('project_id', $old_project_id)->first();
  103 + if(!empty($settingData)){
  104 + $data = [
  105 + 'template_id' =>$settingData['template_id'],
  106 + 'project_id' => $project_id
  107 + ];
  108 + $settingTemplateModel->add($data);
  109 + }
  110 + return ['project_id'=>$project_id,'type'=>$type];
  111 + }
  112 +
  113 + /**
  114 + * @remark :复制部署表
  115 + * @name :copyDeployBuild
  116 + * @author :lyh
  117 + * @method :post
  118 + * @time :2025/1/15 14:59
  119 + */
  120 + public function copyDeployBuild($old_project_id,$project_id){
  121 + //复制部署表
  122 + $buildModel = new DeployBuild();
  123 + $buildData = $buildModel::where('project_id', $old_project_id)->first();
  124 + if(!empty($buildData)){
  125 + $buildData = $buildData->getAttributes();
  126 + $buildData['project_id'] = $project_id;
  127 + $hashids = new Hashids('test_domain', 5, 'abcdefghjkmnpqrstuvwxyz1234567890');
  128 + $code = $hashids->encode($project_id);
  129 + $buildData['test_domain'] = 'https://v6-' . $code . '.globalso.site/';
  130 + unset($buildData['id']);
  131 + $buildModel->insert($buildData);
  132 + }
  133 + return true;
  134 + }
  135 +
  136 + /**
  137 + * @remark :复制优化表
  138 + * @name :copyDeployOptimize
  139 + * @author :lyh
  140 + * @method :post
  141 + * @time :2025/1/15 15:02
  142 + */
  143 + public function copyDeployOptimize($old_project_id,$project_id){
  144 + //复制优化表
  145 + $optimizeModel = new DeployOptimize();
  146 + $optimizeData = $optimizeModel::where('project_id', $old_project_id)->first();
  147 + if(!empty($optimizeData)){
  148 + $optimizeData = $optimizeData->getAttributes();
  149 + unset($optimizeData['id'],$optimizeData['domain'],$optimizeData['backlink'],$optimizeData['ai_video']);
  150 + $optimizeData['project_id'] = $project_id;
  151 + $optimizeData['api_no'] = 0;
  152 + $optimizeModel->insert($optimizeData);
  153 + }
  154 + return true;
  155 + }
  156 +
  157 + /**
  158 + * @remark :复制付费表
  159 + * @name :copyPayment
  160 + * @author :lyh
  161 + * @method :post
  162 + * @time :2025/1/15 15:03
  163 + */
  164 + public function copyPayment($old_project_id,$project_id){
  165 + //复制付费表
  166 + $paymentModel = new Payment();
  167 + $paymentData = $paymentModel::where('project_id', $old_project_id)->first();
  168 + if(!empty($paymentData)){
  169 + $paymentData = $paymentData->getAttributes();
  170 + unset($paymentData['id']);
  171 + $paymentData['project_id'] = $project_id;
  172 + $paymentModel->insert($paymentData);
  173 + }
  174 + return true;
  175 + }
  176 +
  177 + public function copyAfter($old_project_id,$project_id){
  178 + //复制售后表
  179 + $afterModel = new After();
  180 + $afterData = $afterModel::where('project_id',$old_project_id)->first();
  181 + if(!empty($afterData)){
  182 + $afterData = $afterData->getAttributes();
  183 + unset($afterData['id']);
  184 + $afterData['project_id'] = $project_id;
  185 + $afterModel->insert($afterData);
  186 + }
  187 + return true;
  188 + }
  189 +
  190 + /**
  191 + * @remark :复制user
  192 + * @name :copyUser
  193 + * @author :lyh
  194 + * @method :post
  195 + * @time :2025/1/15 15:04
  196 + */
  197 + public function copyUser($old_project_id,$project_id){
  198 + //复制用户
  199 + $userModel = new UserModel();
  200 + $userData = $userModel::where('project_id', $old_project_id)->where('role_id',0)->first();
  201 + if(!empty($userData)){
  202 + $userData = $userData->getAttributes();
  203 + unset($userData['id']);
  204 + $userData['project_id'] = $project_id;
  205 + $userModel->insert($userData);
137 } 206 }
138 - //修改项目状态  
139 - $projectModel->edit(['delete_status'=>0],['id'=>$project_id]);  
140 - $this->output('CopyProjectJob end, old project_id: ' . $this->param['project_id'] . ', new project_id: ' . $project_id);  
141 return true; 207 return true;
142 } 208 }
143 209
@@ -200,4 +266,5 @@ class CopyProjectJob implements ShouldQueue @@ -200,4 +266,5 @@ class CopyProjectJob implements ShouldQueue
200 Log::info($output); 266 Log::info($output);
201 return true; 267 return true;
202 } 268 }
  269 +
203 } 270 }
@@ -754,7 +754,7 @@ class ProjectLogic extends BaseLogic @@ -754,7 +754,7 @@ class ProjectLogic extends BaseLogic
754 * @time :2023/11/8 14:23 754 * @time :2023/11/8 14:23
755 */ 755 */
756 public function copyProject(){ 756 public function copyProject(){
757 - CopyProjectJob::dispatch(['project_id'=>$this->param['project_id']]); 757 + NoticeLog::createLog(NoticeLog::TYPE_COPY_PROJECT, ['project_id' => $this->param['project_id']]);
758 return $this->success('项目复制中,请稍后前往初始化项目查看;'); 758 return $this->success('项目复制中,请稍后前往初始化项目查看;');
759 } 759 }
760 760
@@ -13,6 +13,7 @@ class NoticeLog extends Base @@ -13,6 +13,7 @@ class NoticeLog extends Base
13 const TYPE_PROJECT = 'project'; 13 const TYPE_PROJECT = 'project';
14 const TYPE_RANK_DATA = 'rank_data'; 14 const TYPE_RANK_DATA = 'rank_data';
15 const TYPE_INIT_PROJECT = 'init_project'; 15 const TYPE_INIT_PROJECT = 'init_project';
  16 + const TYPE_COPY_PROJECT = 'copy_project';
16 const TYPE_INIT_KEYWORD = 'init_keyword'; 17 const TYPE_INIT_KEYWORD = 'init_keyword';
17 const DELETE_PRODUCT_CATEGORY = 'delete_product_category'; 18 const DELETE_PRODUCT_CATEGORY = 'delete_product_category';
18 const DELETE_BLOG_CATEGORY = 'delete_blog_category'; 19 const DELETE_BLOG_CATEGORY = 'delete_blog_category';