作者 zhl

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

@@ -9,9 +9,13 @@ @@ -9,9 +9,13 @@
9 9
10 namespace App\Console\Commands\LyhTest; 10 namespace App\Console\Commands\LyhTest;
11 11
  12 +use App\Enums\Common\Code;
12 use App\Helper\Common; 13 use App\Helper\Common;
  14 +use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
13 use App\Models\Blog\Blog; 15 use App\Models\Blog\Blog;
14 use App\Models\Com\V6WeeklyReport; 16 use App\Models\Com\V6WeeklyReport;
  17 +use App\Models\Manage\Manage;
  18 +use App\Models\Manage\ManageHr;
15 use App\Models\News\News; 19 use App\Models\News\News;
16 use App\Models\Product\Category; 20 use App\Models\Product\Category;
17 use App\Models\Product\CategoryRelated; 21 use App\Models\Product\CategoryRelated;
@@ -22,6 +26,7 @@ use App\Models\Template\BTemplate; @@ -22,6 +26,7 @@ use App\Models\Template\BTemplate;
22 use App\Models\Visit\Visit; 26 use App\Models\Visit\Visit;
23 use App\Models\Visit\VisitItem; 27 use App\Models\Visit\VisitItem;
24 use App\Models\Workchat\MessagePush; 28 use App\Models\Workchat\MessagePush;
  29 +use App\Models\WorkOrder\Tickets;
25 use App\Services\ProjectServer; 30 use App\Services\ProjectServer;
26 use Illuminate\Console\Command; 31 use Illuminate\Console\Command;
27 use Illuminate\Support\Facades\DB; 32 use Illuminate\Support\Facades\DB;
@@ -45,11 +50,11 @@ class DownloadProject extends Command @@ -45,11 +50,11 @@ class DownloadProject extends Command
45 protected $description = '导出项目数据'; 50 protected $description = '导出项目数据';
46 51
47 public function handle(){ 52 public function handle(){
48 - echo date('Y-m-d H:i:s') . 'start' . PHP_EOL;  
49 - ProjectServer::useProject(671);  
50 - $this->newsImportBlog();  
51 - DB::disconnect('custom_mysql');  
52 - echo date('Y-m-d H:i:s') . 'end' . PHP_EOL; 53 + echo date('Y-m-d H:i:s') . 'start1' . PHP_EOL;
  54 +// ProjectServer::useProject(671);
  55 + $this->downloadTicket();
  56 +// DB::disconnect('custom_mysql');
  57 + echo date('Y-m-d H:i:s') . 'end1' . PHP_EOL;
53 return true; 58 return true;
54 } 59 }
55 60
@@ -121,6 +126,58 @@ class DownloadProject extends Command @@ -121,6 +126,58 @@ class DownloadProject extends Command
121 } 126 }
122 127
123 /** 128 /**
  129 + * @remark :导出工单数据
  130 + * @name :downloadTicketList
  131 + * @author :lyh
  132 + * @method :post
  133 + * @time :2025/9/13 15:24
  134 + */
  135 + /**
  136 + * A端查看所有工单
  137 + *
  138 + * @return \Illuminate\Http\Response
  139 + */
  140 + public function downloadTicket()
  141 + {
  142 + $this->param['dept_id'] = 2;
  143 + $this->param['entry_position'] = 2;
  144 + $search = '资料上传';
  145 + $query = Tickets::with([
  146 + 'logs.engineer',
  147 + 'project.pm',
  148 + 'project.projectV6',
  149 + ]);
  150 + $query = $query->where('title', 'like', '%' . $search . '%');
  151 + $query = $query->where('status', '!=' ,Tickets::STATUS_COMPLETED)->where('plan_end_at','<',date("Y-m-d H:i:s", strtotime("-72 hours")));
  152 + $query = $query->where('status', 0)->where('plan_end_at','<',date("Y-m-d H:i:s", strtotime("-120 hours")));//超过120个小时未处理的工单
  153 + //TODO::用户部门搜索
  154 + if(isset($this->param['dept_id']) && !empty($this->param['dept_id'])){
  155 + $manageHrModel = new ManageHr();
  156 + //售后优化+技术搜索
  157 + if($this->param['dept_id'] == 2 && !empty($this->param['entry_position'])) {//售后部
  158 + if ($this->param['entry_position'] == 1) {
  159 + $manageIdArr = $manageHrModel->selectField(['entry_position' => ['in', [44, 46, 49]], 'status' => 1], 'manage_id');
  160 + } else {
  161 + //售后技术
  162 + $manageIdArr = $manageHrModel->selectField(['entry_position' => ['in', [42, 43, 45, 48, 51]], 'status' => 1], 'manage_id');
  163 + }
  164 + $query = $query->whereHas('logs', function ($q) use ($manageIdArr) {
  165 + $q->whereIn('engineer_id', $manageIdArr);
  166 + });
  167 + }else{
  168 + $manageIdArr = $manageHrModel->selectField(['dept_id'=>$this->param['dept_id'],'status'=>1],'manage_id');
  169 + $query = $query->whereHas('logs', function ($q) use ($manageIdArr) {
  170 + $q->whereIn('engineer_id', $manageIdArr);
  171 + });
  172 + }
  173 + }
  174 + // 添加排序功能
  175 + $query->orderBy('status', 'asc');
  176 + $lists = $query->get()->toArray();
  177 + return $this->exportData($lists);
  178 + }
  179 +
  180 + /**
124 * @remark :导出访问明细 181 * @remark :导出访问明细
125 * @name :exportData 182 * @name :exportData
126 * @author :lyh 183 * @author :lyh
@@ -132,22 +189,27 @@ class DownloadProject extends Command @@ -132,22 +189,27 @@ class DownloadProject extends Command
132 $spreadsheet = new Spreadsheet(); 189 $spreadsheet = new Spreadsheet();
133 $sheet = $spreadsheet->getActiveSheet(); 190 $sheet = $spreadsheet->getActiveSheet();
134 // 添加表头 191 // 添加表头
135 - $sheet->setCellValue('A1', '浏览时间');  
136 - $sheet->setCellValue('B1', '访客来源');  
137 - $sheet->setCellValue('C1', '访客入路页面');  
138 - $sheet->setCellValue('D1', '终端');  
139 - $sheet->setCellValue('E1', '国家ip');  
140 - $sheet->setCellValue('F1', '深度访问页数');  
141 - $sheet->setCellValue('G1', '国家'); 192 + $sheet->setCellValue('A1', '公司名称');
  193 + $sheet->setCellValue('B1', '工单提交时间');
  194 + $sheet->setCellValue('C1', '工单内容');
  195 + $sheet->setCellValue('D1', '正式域名');
  196 + $sheet->setCellValue('E1', '测试域名');
  197 + $sheet->setCellValue('F1', '提交人');
  198 + $sheet->setCellValue('G1', '执行技术');
142 $rowCount = 2; 199 $rowCount = 2;
143 foreach ($data as $v) { 200 foreach ($data as $v) {
144 - $sheet->setCellValue('A' . $rowCount, $v['created_at']);  
145 - $sheet->setCellValue('B' . $rowCount, $v['referrer_url']);  
146 - $sheet->setCellValue('C' . $rowCount, $v['url']);  
147 - $sheet->setCellValue('D' . $rowCount, $v['device_text']);  
148 - $sheet->setCellValue('E' . $rowCount, $v['ip']);  
149 - $sheet->setCellValue('F' . $rowCount, $v['depth']);  
150 - $sheet->setCellValue('G' . $rowCount, $v['country']); 201 + foreach ($v['logs'] as $key => $value) {
  202 + if($value['is_engineer'] == 1){
  203 + $is_engineer = $value['engineer']['name'];
  204 + }
  205 + }
  206 + $sheet->setCellValue('A' . $rowCount, $v['project']['company_name']);
  207 + $sheet->setCellValue('B' . $rowCount, $v['created_at']);
  208 + $sheet->setCellValue('C' . $rowCount, $v['content']);
  209 + $sheet->setCellValue('D' . $rowCount, $v['project']['website']);
  210 + $sheet->setCellValue('E' . $rowCount, $v['project']['test_website']);
  211 + $sheet->setCellValue('F' . $rowCount, $v['submit_username']);
  212 + $sheet->setCellValue('G' . $rowCount, $is_engineer ?? '');
151 $rowCount++; 213 $rowCount++;
152 } 214 }
153 // 创建一个新的 Excel Writer 对象 215 // 创建一个新的 Excel Writer 对象
@@ -43,7 +43,6 @@ class LyhImportTest extends Command @@ -43,7 +43,6 @@ class LyhImportTest extends Command
43 protected $description = '导入数据'; 43 protected $description = '导入数据';
44 44
45 45
46 -  
47 /** 46 /**
48 * @remark :统一更新路由 47 * @remark :统一更新路由
49 * @name :handle 48 * @name :handle
@@ -51,10 +50,12 @@ class LyhImportTest extends Command @@ -51,10 +50,12 @@ class LyhImportTest extends Command
51 * @method :post 50 * @method :post
52 * @time :2023/11/20 15:13 51 * @time :2023/11/20 15:13
53 */ 52 */
54 - public function handle(){  
55 - ProjectServer::useProject(3654);  
56 - echo date('Y-m-d H:i:s') . 'start' . PHP_EOL;  
57 - $this->importProductCategory('https://ecdn6-nc.globalso.com/upload/p/3654/file/2025-06/products-1.csv',3654); 53 + public function handle()
  54 + {
  55 + ProjectServer::useProject(3531);
  56 + echo date('Y-m-d H:i:s') . 'start->3531' . PHP_EOL;
  57 +// $this->importProductCategory('https://ecdn6-nc.globalso.com/upload/p/3654/file/2025-06/products-1.csv',3654);
  58 + $this->import3531CustomModule(3531);
58 DB::disconnect('custom_mysql'); 59 DB::disconnect('custom_mysql');
59 echo date('Y-m-d H:i:s') . 'end' . PHP_EOL; 60 echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
60 } 61 }
@@ -66,7 +67,8 @@ class LyhImportTest extends Command @@ -66,7 +67,8 @@ class LyhImportTest extends Command
66 * @method :post 67 * @method :post
67 * @time :2025/5/24 11:32 68 * @time :2025/5/24 11:32
68 */ 69 */
69 - public function import3951Product($url,$project_id){ 70 + public function import3951Product($url, $project_id)
  71 + {
70 $line_of_text = []; 72 $line_of_text = [];
71 $opts = [ 73 $opts = [
72 'http' => [ 74 'http' => [
@@ -84,18 +86,18 @@ class LyhImportTest extends Command @@ -84,18 +86,18 @@ class LyhImportTest extends Command
84 } 86 }
85 fclose($file_handle); 87 fclose($file_handle);
86 $saveData = []; 88 $saveData = [];
87 - foreach ($line_of_text as $k => $val){  
88 - if($k < 1){ 89 + foreach ($line_of_text as $k => $val) {
  90 + if ($k < 1) {
89 continue; 91 continue;
90 } 92 }
91 - if(empty($val[0])){  
92 - echo '跳过的名称:'.$val[0]; 93 + if (empty($val[0])) {
  94 + echo '跳过的名称:' . $val[0];
93 continue; 95 continue;
94 } 96 }
95 $saveData[] = [ 97 $saveData[] = [
96 - 'title'=>$val[0],  
97 - 'thumb' => json_encode(['alt'=>'主图','url'=>'/upload/p/3951/image/',$val[2]],true),  
98 - 'gallery' => json_encode([['alt'=>'主图','url'=>'/upload/p/3951/image/',$val[2]]],true) 98 + 'title' => $val[0],
  99 + 'thumb' => json_encode(['alt' => '主图', 'url' => '/upload/p/3951/image/', $val[2]], true),
  100 + 'gallery' => json_encode([['alt' => '主图', 'url' => '/upload/p/3951/image/', $val[2]]], true)
99 ]; 101 ];
100 } 102 }
101 } 103 }
@@ -107,7 +109,8 @@ class LyhImportTest extends Command @@ -107,7 +109,8 @@ class LyhImportTest extends Command
107 * @method :post 109 * @method :post
108 * @time :2025/3/13 9:58 110 * @time :2025/3/13 9:58
109 */ 111 */
110 - public function importProductCategory($url,$project_id){ 112 + public function importProductCategory($url, $project_id)
  113 + {
111 $line_of_text = []; 114 $line_of_text = [];
112 $opts = [ 115 $opts = [
113 'http' => [ 116 'http' => [
@@ -125,50 +128,50 @@ class LyhImportTest extends Command @@ -125,50 +128,50 @@ class LyhImportTest extends Command
125 } 128 }
126 fclose($file_handle); 129 fclose($file_handle);
127 $categoryModel = new Category(); 130 $categoryModel = new Category();
128 - foreach ($line_of_text as $k => $val){  
129 - if($k < 1){ 131 + foreach ($line_of_text as $k => $val) {
  132 + if ($k < 1) {
130 continue; 133 continue;
131 } 134 }
132 - if(empty($val[0])){  
133 - echo '跳过的名称:'.$val[0]; 135 + if (empty($val[0])) {
  136 + echo '跳过的名称:' . $val[0];
134 continue; 137 continue;
135 } 138 }
136 try { 139 try {
137 - $cateArr = explode('/',$val[0]); 140 + $cateArr = explode('/', $val[0]);
138 $pid = 0; 141 $pid = 0;
139 $two_pid = 0; 142 $two_pid = 0;
140 - foreach ($cateArr as $key => $item){  
141 - if($key == 0){ 143 + foreach ($cateArr as $key => $item) {
  144 + if ($key == 0) {
142 //查看一级分类是否存在 145 //查看一级分类是否存在
143 - $info = $categoryModel->read(['title'=>$item,'pid'=>0],['id']);  
144 - if($info === false){  
145 - $pid = $categoryModel->addReturnId(['project_id'=>$project_id,'title'=>$item]); 146 + $info = $categoryModel->read(['title' => $item, 'pid' => 0], ['id']);
  147 + if ($info === false) {
  148 + $pid = $categoryModel->addReturnId(['project_id' => $project_id, 'title' => $item]);
146 //设置路由 149 //设置路由
147 - $route = RouteMap::setRoute($item,RouteMap::SOURCE_PRODUCT_CATE,$pid,$project_id);  
148 - $categoryModel->edit(['route'=>$route],['id'=>$pid]);  
149 - }else{ 150 + $route = RouteMap::setRoute($item, RouteMap::SOURCE_PRODUCT_CATE, $pid, $project_id);
  151 + $categoryModel->edit(['route' => $route], ['id' => $pid]);
  152 + } else {
150 $pid = $info['id']; 153 $pid = $info['id'];
151 } 154 }
152 - }elseif ($key == 1){ 155 + } elseif ($key == 1) {
153 //查看当前下面的子级别是否存在 156 //查看当前下面的子级别是否存在
154 - $two_info = $categoryModel->read(['title'=>$item,'pid'=>$pid],['id']);  
155 - if($two_info === false){  
156 - $two_pid = $categoryModel->addReturnId(['project_id'=>$project_id,'title'=>$item,'pid'=>$pid]); 157 + $two_info = $categoryModel->read(['title' => $item, 'pid' => $pid], ['id']);
  158 + if ($two_info === false) {
  159 + $two_pid = $categoryModel->addReturnId(['project_id' => $project_id, 'title' => $item, 'pid' => $pid]);
157 //设置路由 160 //设置路由
158 - $route = RouteMap::setRoute($item,RouteMap::SOURCE_PRODUCT_CATE,$two_pid,$project_id);  
159 - $categoryModel->edit(['route'=>$route],['id'=>$two_pid]);  
160 - }else{ 161 + $route = RouteMap::setRoute($item, RouteMap::SOURCE_PRODUCT_CATE, $two_pid, $project_id);
  162 + $categoryModel->edit(['route' => $route], ['id' => $two_pid]);
  163 + } else {
161 $two_pid = $two_info['id']; 164 $two_pid = $two_info['id'];
162 } 165 }
163 - }else{  
164 - $id = $categoryModel->addReturnId(['project_id'=>$project_id,'title'=>$item,'pid'=>$two_pid]);  
165 - $route = RouteMap::setRoute($item,RouteMap::SOURCE_PRODUCT_CATE,$id,$project_id);  
166 - $categoryModel->edit(['route'=>$route],['id'=>$id]); 166 + } else {
  167 + $id = $categoryModel->addReturnId(['project_id' => $project_id, 'title' => $item, 'pid' => $two_pid]);
  168 + $route = RouteMap::setRoute($item, RouteMap::SOURCE_PRODUCT_CATE, $id, $project_id);
  169 + $categoryModel->edit(['route' => $route], ['id' => $id]);
167 } 170 }
168 } 171 }
169 - echo date('Y-m-d H:i:s') . '产品分类id:'.PHP_EOL;  
170 - }catch (\Exception $e){  
171 - echo date('Y-m-d H:i:s') . '跳过的名称:'. $val[1]; 172 + echo date('Y-m-d H:i:s') . '产品分类id:' . PHP_EOL;
  173 + } catch (\Exception $e) {
  174 + echo date('Y-m-d H:i:s') . '跳过的名称:' . $val[1];
172 continue; 175 continue;
173 } 176 }
174 } 177 }
@@ -182,7 +185,8 @@ class LyhImportTest extends Command @@ -182,7 +185,8 @@ class LyhImportTest extends Command
182 * @method :post 185 * @method :post
183 * @time :2025/3/3 15:59 186 * @time :2025/3/3 15:59
184 */ 187 */
185 - public function importProduct($url,$project_id){ 188 + public function importProduct($url, $project_id)
  189 + {
186 $line_of_text = []; 190 $line_of_text = [];
187 $opts = [ 191 $opts = [
188 'http' => [ 192 'http' => [
@@ -203,163 +207,163 @@ class LyhImportTest extends Command @@ -203,163 +207,163 @@ class LyhImportTest extends Command
203 $productModel = new Product(); 207 $productModel = new Product();
204 $detailModel = new Detail(); 208 $detailModel = new Detail();
205 $extentInfoModel = new ExtendInfo(); 209 $extentInfoModel = new ExtendInfo();
206 - foreach ($line_of_text as $k => $val){  
207 - if($k < 1){ 210 + foreach ($line_of_text as $k => $val) {
  211 + if ($k < 1) {
208 continue; 212 continue;
209 } 213 }
210 $saveData = []; 214 $saveData = [];
211 - if(!empty($val[11])){ 215 + if (!empty($val[11])) {
212 $saveData['title'] = $val[11]; 216 $saveData['title'] = $val[11];
213 - }else{ 217 + } else {
214 continue; 218 continue;
215 } 219 }
216 - if(!empty($val[1])){  
217 - $cateInfo = $cateModel->read(['seo_title'=>trim($val[1])]);  
218 - if($cateInfo !== false){  
219 - $saveData['category_id'] = ','.$cateInfo['id'].','; 220 + if (!empty($val[1])) {
  221 + $cateInfo = $cateModel->read(['seo_title' => trim($val[1])]);
  222 + if ($cateInfo !== false) {
  223 + $saveData['category_id'] = ',' . $cateInfo['id'] . ',';
220 } 224 }
221 } 225 }
222 $saveData['project_id'] = $project_id; 226 $saveData['project_id'] = $project_id;
223 $saveData['status'] = 1; 227 $saveData['status'] = 1;
224 $saveData['intro'] = $val[6] ?? ''; 228 $saveData['intro'] = $val[6] ?? '';
225 - $seo = ['title'=>$val[11]];  
226 - $saveData['seo_mate'] = json_encode($seo,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);  
227 - $thumb = ['alt'=>'主图','url'=>str_replace('/public','/upload/p/3283',$val[12])];  
228 - $gallery = [['alt'=>'主图','url'=>str_replace('/public','/upload/p/3283',$val[12])]];  
229 - $saveData['thumb'] = json_encode($thumb,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);  
230 - $saveData['gallery'] = json_encode($gallery,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); 229 + $seo = ['title' => $val[11]];
  230 + $saveData['seo_mate'] = json_encode($seo, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
  231 + $thumb = ['alt' => '主图', 'url' => str_replace('/public', '/upload/p/3283', $val[12])];
  232 + $gallery = [['alt' => '主图', 'url' => str_replace('/public', '/upload/p/3283', $val[12])]];
  233 + $saveData['thumb'] = json_encode($thumb, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
  234 + $saveData['gallery'] = json_encode($gallery, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
231 try { 235 try {
232 $id = $productModel->addReturnId($saveData); 236 $id = $productModel->addReturnId($saveData);
233 - }catch (\Exception $e){  
234 - @file_put_contents(storage_path('logs/lyh_error.log'), var_export('未导入成功--标题:'.$val[0], true) . PHP_EOL, FILE_APPEND); 237 + } catch (\Exception $e) {
  238 + @file_put_contents(storage_path('logs/lyh_error.log'), var_export('未导入成功--标题:' . $val[0], true) . PHP_EOL, FILE_APPEND);
235 continue; 239 continue;
236 } 240 }
237 //设置关联关系 241 //设置关联关系
238 - if($cateInfo !== false){  
239 - CategoryRelated::saveRelated($id,[$cateInfo['id']]); 242 + if ($cateInfo !== false) {
  243 + CategoryRelated::saveRelated($id, [$cateInfo['id']]);
240 } 244 }
241 //设置路由 245 //设置路由
242 - $route = RouteMap::setRoute($val[11],RouteMap::SOURCE_PRODUCT,$id,$project_id);  
243 - $productModel->edit(['route'=>$route],['id'=>$id]);  
244 - echo date('Y-m-d H:i:s') . '新增产品id:'.$id . PHP_EOL;  
245 - if(!empty($val[2])){ 246 + $route = RouteMap::setRoute($val[11], RouteMap::SOURCE_PRODUCT, $id, $project_id);
  247 + $productModel->edit(['route' => $route], ['id' => $id]);
  248 + echo date('Y-m-d H:i:s') . '新增产品id:' . $id . PHP_EOL;
  249 + if (!empty($val[2])) {
246 $extent = [ 250 $extent = [
247 - 'key'=>'pd_extended_field_4',  
248 - 'product_id'=>$id,  
249 - 'project_id'=>$project_id,  
250 - 'values'=>$val[2], 251 + 'key' => 'pd_extended_field_4',
  252 + 'product_id' => $id,
  253 + 'project_id' => $project_id,
  254 + 'values' => $val[2],
251 ]; 255 ];
252 try { 256 try {
253 $extentInfoModel->addReturnId($extent); 257 $extentInfoModel->addReturnId($extent);
254 - }catch (\Exception $e){  
255 - echo '错误:'.$val[2]; 258 + } catch (\Exception $e) {
  259 + echo '错误:' . $val[2];
256 } 260 }
257 261
258 } 262 }
259 - if(!empty($val[3])){ 263 + if (!empty($val[3])) {
260 $extent = [ 264 $extent = [
261 - 'key'=>'pd_extended_field_1',  
262 - 'product_id'=>$id,  
263 - 'project_id'=>$project_id,  
264 - 'values'=>$val[3], 265 + 'key' => 'pd_extended_field_1',
  266 + 'product_id' => $id,
  267 + 'project_id' => $project_id,
  268 + 'values' => $val[3],
265 ]; 269 ];
266 try { 270 try {
267 $extentInfoModel->addReturnId($extent); 271 $extentInfoModel->addReturnId($extent);
268 - }catch (\Exception $e){  
269 - echo '错误:'.$val[3]; 272 + } catch (\Exception $e) {
  273 + echo '错误:' . $val[3];
270 } 274 }
271 } 275 }
272 - if(!empty($val[4])){ 276 + if (!empty($val[4])) {
273 $extent = [ 277 $extent = [
274 - 'key'=>'pd_extended_field_2',  
275 - 'product_id'=>$id,  
276 - 'project_id'=>$project_id,  
277 - 'values'=>$val[4], 278 + 'key' => 'pd_extended_field_2',
  279 + 'product_id' => $id,
  280 + 'project_id' => $project_id,
  281 + 'values' => $val[4],
278 ]; 282 ];
279 try { 283 try {
280 $extentInfoModel->addReturnId($extent); 284 $extentInfoModel->addReturnId($extent);
281 - }catch (\Exception $e){  
282 - echo '错误:'.$val[4]; 285 + } catch (\Exception $e) {
  286 + echo '错误:' . $val[4];
283 } 287 }
284 } 288 }
285 - if(!empty($val[5])){ 289 + if (!empty($val[5])) {
286 $extent = [ 290 $extent = [
287 - 'key'=>'pd_extended_field_3',  
288 - 'product_id'=>$id,  
289 - 'project_id'=>$project_id,  
290 - 'values'=>$val[5], 291 + 'key' => 'pd_extended_field_3',
  292 + 'product_id' => $id,
  293 + 'project_id' => $project_id,
  294 + 'values' => $val[5],
291 ]; 295 ];
292 try { 296 try {
293 $extentInfoModel->addReturnId($extent); 297 $extentInfoModel->addReturnId($extent);
294 - }catch (\Exception $e){  
295 - echo '错误:'.$val[5]; 298 + } catch (\Exception $e) {
  299 + echo '错误:' . $val[5];
296 } 300 }
297 } 301 }
298 //产品描述 302 //产品描述
299 - if(!empty($val[7])){ 303 + if (!empty($val[7])) {
300 //设置产品描述 304 //设置产品描述
301 $detail = [ 305 $detail = [
302 - 'title'=>'SEODescription',  
303 - 'product_id'=>$id,  
304 - 'column_id'=>1,  
305 - 'text_type'=>1,  
306 - 'content'=>json_encode(['content'=>$val[7]],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) 306 + 'title' => 'SEODescription',
  307 + 'product_id' => $id,
  308 + 'column_id' => 1,
  309 + 'text_type' => 1,
  310 + 'content' => json_encode(['content' => $val[7]], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
307 ]; 311 ];
308 $detailModel->addReturnId($detail); 312 $detailModel->addReturnId($detail);
309 } 313 }
310 //产品描述 314 //产品描述
311 - if(!empty($val[8])){ 315 + if (!empty($val[8])) {
312 //设置产品描述 316 //设置产品描述
313 $detail = [ 317 $detail = [
314 - 'title'=>'SEOSpecification',  
315 - 'product_id'=>$id,  
316 - 'column_id'=>1,  
317 - 'text_type'=>1,  
318 - 'content'=>json_encode(['content'=>$val[8]],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) 318 + 'title' => 'SEOSpecification',
  319 + 'product_id' => $id,
  320 + 'column_id' => 1,
  321 + 'text_type' => 1,
  322 + 'content' => json_encode(['content' => $val[8]], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
319 ]; 323 ];
320 $detailModel->addReturnId($detail); 324 $detailModel->addReturnId($detail);
321 } 325 }
322 - if(!empty($val[9])){ 326 + if (!empty($val[9])) {
323 try { 327 try {
324 - $faqsDetail = json_decode($val[9],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);  
325 - if(!empty($faqsDetail) && is_array($faqsDetail)){ 328 + $faqsDetail = json_decode($val[9], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
  329 + if (!empty($faqsDetail) && is_array($faqsDetail)) {
326 $faqContent = '<div>'; 330 $faqContent = '<div>';
327 - foreach ($faqsDetail as $faq_Val){  
328 - $faqContent .= "<span>question:".$faq_Val['question'] . "</span><br /><span>" . "answer:".$faq_Val['answer']. "</span><br />"; 331 + foreach ($faqsDetail as $faq_Val) {
  332 + $faqContent .= "<span>question:" . $faq_Val['question'] . "</span><br /><span>" . "answer:" . $faq_Val['answer'] . "</span><br />";
329 } 333 }
330 $faqContent .= '</div>'; 334 $faqContent .= '</div>';
331 $detailFaqInfo = [ 335 $detailFaqInfo = [
332 - 'title'=>'SEOQandA',  
333 - 'product_id'=>$id,  
334 - 'column_id'=>1,  
335 - 'text_type'=>1,  
336 - 'content'=>json_encode(['content'=>$faqContent],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) 336 + 'title' => 'SEOQandA',
  337 + 'product_id' => $id,
  338 + 'column_id' => 1,
  339 + 'text_type' => 1,
  340 + 'content' => json_encode(['content' => $faqContent], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
337 ]; 341 ];
338 $detailModel->addReturnId($detailFaqInfo); 342 $detailModel->addReturnId($detailFaqInfo);
339 } 343 }
340 - }catch(\Exception $e){ 344 + } catch (\Exception $e) {
341 echo 'fqs'; 345 echo 'fqs';
342 } 346 }
343 } 347 }
344 - if(!empty($val[10])){ 348 + if (!empty($val[10])) {
345 try { 349 try {
346 - $faqsDetail = json_decode($val[10],true);  
347 - if(!empty($faqsDetail) && is_array($faqsDetail)){ 350 + $faqsDetail = json_decode($val[10], true);
  351 + if (!empty($faqsDetail) && is_array($faqsDetail)) {
348 $faqContent = '<div>'; 352 $faqContent = '<div>';
349 - foreach ($faqsDetail as $faq_Val){  
350 - $faqContent .= "<span>question:".$faq_Val['question'] . "</span><br /><span>" . "answer:".$faq_Val['answer']. "</span><br />"; 353 + foreach ($faqsDetail as $faq_Val) {
  354 + $faqContent .= "<span>question:" . $faq_Val['question'] . "</span><br /><span>" . "answer:" . $faq_Val['answer'] . "</span><br />";
351 } 355 }
352 $faqContent .= '</div>'; 356 $faqContent .= '</div>';
353 $detailFaqInfo = [ 357 $detailFaqInfo = [
354 - 'title'=>'SEOQandA_Product',  
355 - 'product_id'=>$id,  
356 - 'column_id'=>1,  
357 - 'text_type'=>1,  
358 - 'content'=>json_encode(['content'=>$faqContent]) 358 + 'title' => 'SEOQandA_Product',
  359 + 'product_id' => $id,
  360 + 'column_id' => 1,
  361 + 'text_type' => 1,
  362 + 'content' => json_encode(['content' => $faqContent])
359 ]; 363 ];
360 $detailModel->addReturnId($detailFaqInfo); 364 $detailModel->addReturnId($detailFaqInfo);
361 } 365 }
362 - }catch(\Exception $e){ 366 + } catch (\Exception $e) {
363 continue; 367 continue;
364 } 368 }
365 } 369 }
@@ -367,217 +371,24 @@ class LyhImportTest extends Command @@ -367,217 +371,24 @@ class LyhImportTest extends Command
367 return true; 371 return true;
368 } 372 }
369 373
370 - public function handleCatePid(){ 374 + public function handleCatePid()
  375 + {
371 $cateModel = new Category(); 376 $cateModel = new Category();
372 - $list = $cateModel->list([],'id',['*'],'asc');  
373 - foreach ($list as $k => $v){  
374 - if($v['seo_des'] == 0){ 377 + $list = $cateModel->list([], 'id', ['*'], 'asc');
  378 + foreach ($list as $k => $v) {
  379 + if ($v['seo_des'] == 0) {
375 $pid = 0; 380 $pid = 0;
376 - }else{  
377 - $info = $cateModel->read(['seo_title'=>$v['seo_des']],['id']);  
378 - if($info !== false){ 381 + } else {
  382 + $info = $cateModel->read(['seo_title' => $v['seo_des']], ['id']);
  383 + if ($info !== false) {
379 $pid = $info['id']; 384 $pid = $info['id'];
380 - }else{ 385 + } else {
381 $pid = 0; 386 $pid = 0;
382 } 387 }
383 } 388 }
384 //更新pid 389 //更新pid
385 - $cateModel->edit(['pid'=>$pid],['id'=>$v['id']]);  
386 - }  
387 - return true;  
388 - }  
389 -  
390 - /**  
391 - * @remark :导入扩展模块数据  
392 - * @name :importCustomModule  
393 - * @author :lyh  
394 - * @method :post  
395 - * @time :2025/2/24 14:54  
396 - */  
397 - public function importCustomModule($url,$project_id){  
398 - $line_of_text = [];  
399 - $opts = [  
400 - 'http' => [  
401 - 'method' => 'GET',  
402 - 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'  
403 - ],  
404 - 'ssl' => [  
405 - 'verify_peer' => false,  
406 - 'verify_peer_name' => false  
407 - ]  
408 - ];  
409 - $file_handle = fopen($url, 'r', null, stream_context_create($opts));  
410 - while (!feof($file_handle)) {  
411 - $line_of_text[] = fgetcsv($file_handle, 0, ',');  
412 - }  
413 - fclose($file_handle);  
414 - $customContentModel = new CustomModuleContent();  
415 - $customCategoryModel = new CustomModuleCategory();;  
416 - $customExtendContentTModel = new CustomModuleExtentContent();  
417 - foreach ($line_of_text as $k => $item){  
418 -// try {  
419 - //添加内容  
420 - $contentId = $customContentModel->addReturnId(['name'=>$item[0],'module_id'=>3,'remark'=>$item[1],'project_id'=>$project_id]);  
421 - echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;  
422 - //注册路由  
423 - $route = RouteMap::setRoute($item[0], RouteMap::SOURCE_MODULE,  
424 - $contentId, $project_id);  
425 - $customContentModel->edit(['route'=>$route],['id'=>$contentId]);  
426 - if(!empty($item[3])){  
427 - $categoryId = ',';  
428 - $cateArr = explode('/',$item[3]);  
429 - foreach ($cateArr as $cateV){  
430 - $cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>3,'project_id'=>$project_id]);  
431 - if($cateInfo !== false){  
432 - $categoryId .= $cateInfo['id'].',';  
433 - }else{  
434 - $cateVId = $customCategoryModel->addReturnId(['name'=>$cateV,'module_id'=>3,'project_id'=>$project_id]);  
435 - $cateRoute = RouteMap::setRoute($cateV, RouteMap::SOURCE_MODULE_CATE,  
436 - $cateVId, $project_id);  
437 - $customCategoryModel->edit(['route'=>$cateRoute],['id'=>$cateVId]);  
438 - $categoryId .= $cateVId.',';  
439 - }  
440 - }  
441 - $customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);  
442 - }  
443 - $saveData = [  
444 - ['key'=>'pd_extended_field_1', 'type'=>1, 'values'=>$item[2], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>3, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
445 -// ['key'=>'pd_extended_field_2', 'type'=>1, 'values'=>$item[4], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
446 -// ['key'=>'pd_extended_field_3', 'type'=>1, 'values'=>$item[5], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
447 -// ['key'=>'pd_extended_field_4', 'type'=>1, 'values'=>$item[3], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
448 -// ['key'=>'pd_extended_field_5', 'type'=>1, 'values'=>$item[8], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
449 -// ['key'=>'pd_extended_field_6', 'type'=>1, 'values'=>$item[6], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
450 -// ['key'=>'pd_extended_field_7', 'type'=>1, 'values'=>$item[9], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
451 -// ['key'=>'pd_extended_field_8', 'type'=>1, 'values'=>$item[10], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
452 -// ['key'=>'pd_extended_field_9', 'type'=>1, 'values'=>$item[11], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
453 -// ['key'=>'pd_extended_field_10', 'type'=>1, 'values'=>$item[12], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
454 -// ['key'=>'pd_extended_field_11', 'type'=>1, 'values'=>$item[13], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
455 -// ['key'=>'pd_extended_field_12', 'type'=>1, 'values'=>$item[14] ?? '', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
456 -// ['key'=>'pd_extended_field_13', 'type'=>1, 'values'=>$item[7], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
457 - ];  
458 - $customExtendContentTModel->insert($saveData);  
459 -// }catch (\Exception $e){  
460 -// echo date('Y-m-d H:i:s') . '错误name:'. $item[0] . PHP_EOL;  
461 -// continue;  
462 -// }  
463 - }  
464 - }  
465 -  
466 - /**  
467 - * @remark :新闻导入到扩展模块  
468 - * @name :newsImportCustom  
469 - * @author :lyh  
470 - * @method :post  
471 - * @time :2025/2/28 11:04  
472 - */  
473 - public function newsImportCustom($project_id = 2385){  
474 - $newsModel = new News();  
475 - $lists = $newsModel->list(['category_id'=>',3,']);  
476 - foreach ($lists as $k => $v){  
477 - $param = [  
478 - 'name'=>$v['name'],  
479 - 'content'=>$v['text'],  
480 - 'remark'=>$v['remark'],  
481 - 'route'=>$v['url'],  
482 - 'image'=>$v['image'],  
483 - 'seo_title'=>$v['seo_title'],  
484 - 'seo_keywords'=>$v['seo_keywords'],  
485 - 'seo_description'=>$v['seo_keywords'],  
486 - 'project_id'=>$project_id,  
487 - 'operator_id'=>$v['operator_id'],  
488 - 'release_at'=>$v['release_at'],  
489 - 'module_id'=>3,  
490 - 'category_id'=>',2,',  
491 - ];  
492 - //删除当前新闻的路由  
493 - RouteMap::delRoute(RouteMap::SOURCE_NEWS,$v['id'],$project_id);  
494 - //删除当前数据  
495 - $newsModel->del(['id'=>$v['id']]);  
496 - $customContentModel = new CustomModuleContent();  
497 - $id = $customContentModel->addReturnId($param);  
498 - $route = RouteMap::setRoute($param['route'],RouteMap::SOURCE_MODULE,$id,$project_id);  
499 - $customContentModel->edit(['route'=>$route],['id'=>$id]); 390 + $cateModel->edit(['pid' => $pid], ['id' => $v['id']]);
500 } 391 }
501 return true; 392 return true;
502 } 393 }
503 -  
504 - public function import2140CustomModule($url,$project_id){  
505 - $line_of_text = [];  
506 - $opts = [  
507 - 'http' => [  
508 - 'method' => 'GET',  
509 - 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'  
510 - ],  
511 - 'ssl' => [  
512 - 'verify_peer' => false,  
513 - 'verify_peer_name' => false  
514 - ]  
515 - ];  
516 - $file_handle = fopen($url, 'r', null, stream_context_create($opts));  
517 - while (!feof($file_handle)) {  
518 - $line_of_text[] = fgetcsv($file_handle, 0, ',');  
519 - }  
520 - fclose($file_handle);  
521 - $customContentModel = new CustomModuleContent();  
522 - $customCategoryModel = new CustomModuleCategory();  
523 - $customExtendContentTModel = new CustomModuleExtentContent();  
524 - foreach ($line_of_text as $k => $item){  
525 -// try {  
526 - //添加内容  
527 - $contentId = $customContentModel->addReturnId(['name'=>$item[0],'image'=>'/upload/p/2140/image/'.$item[2],'module_id'=>7,'project_id'=>$project_id]);  
528 - echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;  
529 - //注册路由  
530 - $route = RouteMap::setRoute($item[0], RouteMap::SOURCE_MODULE,  
531 - $contentId, $project_id);  
532 - $customContentModel->edit(['route'=>$route],['id'=>$contentId]);  
533 - if(!empty($item[1])){  
534 - $categoryId = ',';  
535 - $cateArr = explode('/',$item[1]);  
536 - foreach ($cateArr as $cateV){  
537 - $cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>7,'project_id'=>$project_id]);  
538 - if($cateInfo !== false){  
539 - $categoryId .= $cateInfo['id'].',';  
540 - }else{  
541 - $cateVId = $customCategoryModel->addReturnId(['name'=>$cateV,'module_id'=>7,'project_id'=>$project_id]);  
542 - $cateRoute = RouteMap::setRoute($cateV, RouteMap::SOURCE_MODULE_CATE,  
543 - $cateVId, $project_id);  
544 - $customCategoryModel->edit(['route'=>$cateRoute],['id'=>$cateVId]);  
545 - $categoryId .= $cateVId.',';  
546 - }  
547 - }  
548 - $customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);  
549 - }  
550 - $saveData = [  
551 - ['key'=>'pd_extended_field_1', 'type'=>1, 'values'=>$item[3], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
552 - ['key'=>'pd_extended_field_2', 'type'=>1, 'values'=>$item[4], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
553 - ['key'=>'pd_extended_field_3', 'type'=>1, 'values'=>$item[5], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
554 - ['key'=>'pd_extended_field_4', 'type'=>1, 'values'=>$item[6], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
555 - ['key'=>'pd_extended_field_5', 'type'=>1, 'values'=>$item[7], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
556 - ['key'=>'pd_extended_field_6', 'type'=>1, 'values'=>$item[8]??'', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
557 - ['key'=>'pd_extended_field_7', 'type'=>1, 'values'=>$item[9], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
558 - ['key'=>'pd_extended_field_8', 'type'=>1, 'values'=>$item[10], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
559 - ['key'=>'pd_extended_field_9', 'type'=>1, 'values'=>$item[11], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
560 - ['key'=>'pd_extended_field_10', 'type'=>1, 'values'=>$item[12], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
561 - ['key'=>'pd_extended_field_11', 'type'=>1, 'values'=>$item[13], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
562 - ['key'=>'pd_extended_field_12', 'type'=>1, 'values'=>$item[14] ?? '', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
563 - ['key'=>'pd_extended_field_13', 'type'=>1, 'values'=>$item[15], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
564 - ['key'=>'pd_extended_field_14', 'type'=>1, 'values'=>$item[16], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
565 - ['key'=>'pd_extended_field_15', 'type'=>1, 'values'=>$item[17], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
566 - ['key'=>'pd_extended_field_16', 'type'=>1, 'values'=>$item[18], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
567 - ['key'=>'pd_extended_field_17', 'type'=>1, 'values'=>$item[19], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
568 - ['key'=>'pd_extended_field_18', 'type'=>1, 'values'=>$item[20], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
569 - ['key'=>'pd_extended_field_19', 'type'=>1, 'values'=>$item[21], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
570 - ['key'=>'pd_extended_field_20', 'type'=>1, 'values'=>$item[22], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
571 - ['key'=>'pd_extended_field_21', 'type'=>1, 'values'=>$item[23], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
572 - ['key'=>'pd_extended_field_22', 'type'=>1, 'values'=>$item[24], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
573 - ['key'=>'pd_extended_field_23', 'type'=>1, 'values'=>$item[25], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
574 - ['key'=>'pd_extended_field_24', 'type'=>1, 'values'=>$item[26], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
575 - ];  
576 - $customExtendContentTModel->insert($saveData);  
577 -// }catch (\Exception $e){  
578 -// echo date('Y-m-d H:i:s') . '错误name:'. $item[0] . PHP_EOL;  
579 -// continue;  
580 -// }  
581 - }  
582 - }  
583 } 394 }
@@ -4,10 +4,10 @@ namespace App\Console\Commands\Project; @@ -4,10 +4,10 @@ namespace App\Console\Commands\Project;
4 4
5 use App\Helper\Arr; 5 use App\Helper\Arr;
6 use App\Models\Product\Product; 6 use App\Models\Product\Product;
7 -use App\Models\Project\Project;  
8 use App\Services\ProjectServer; 7 use App\Services\ProjectServer;
9 use Illuminate\Console\Command; 8 use Illuminate\Console\Command;
10 use Illuminate\Support\Facades\DB; 9 use Illuminate\Support\Facades\DB;
  10 +use Illuminate\Support\Facades\Redis;
11 11
12 class ThumbProjectImage extends Command 12 class ThumbProjectImage extends Command
13 { 13 {
@@ -16,7 +16,7 @@ class ThumbProjectImage extends Command @@ -16,7 +16,7 @@ class ThumbProjectImage extends Command
16 * 16 *
17 * @var string 17 * @var string
18 */ 18 */
19 - protected $signature = 'thumb_project_image {project_id}'; 19 + protected $signature = 'thumb_project_image';
20 20
21 /** 21 /**
22 * The console command description. 22 * The console command description.
@@ -27,79 +27,49 @@ class ThumbProjectImage extends Command @@ -27,79 +27,49 @@ class ThumbProjectImage extends Command
27 27
28 public function handle() 28 public function handle()
29 { 29 {
30 - $project_id = $this->argument('project_id');  
31 -  
32 - if ($project_id > 0) {  
33 - //指定项目  
34 - $this->output('project_id:' . $project_id . ' | start');  
35 -  
36 - $project_info = ProjectServer::useProject($project_id);  
37 -  
38 - if ($project_info) {  
39 - $thumb_w = $project_info->deploy_build->thumb_w ?? 0;  
40 - Product::select(['id', 'project_id', 'thumb'])->chunk(100, function ($products) use ($thumb_w) {  
41 - foreach ($products as $product) {  
42 - $thumb = $product->thumb;  
43 - if (isset($thumb['url']) && $thumb['url']) {  
44 - $new_thumb = thumbImageByUrl($thumb['url'], $thumb_w);  
45 - if ($new_thumb != $thumb['url']) {  
46 - $thumb['url'] = $new_thumb;  
47 - $json_thumb = Arr::a2s($thumb);  
48 - if (strlen($json_thumb) <= 500) {  
49 - $product->timestamps = false;  
50 - $product->thumb = $json_thumb;  
51 - $product->save();  
52 -  
53 - $this->output('project_id:' . $product->project_id . ',product_id:' . $product->id . ' | success');  
54 - }  
55 - }  
56 - }  
57 - }  
58 - });  
59 -  
60 - DB::disconnect('custom_mysql');  
61 - } 30 + while (true) {
  31 + $this->start_thumb();
  32 + }
  33 + }
62 34
63 - $this->output('project_id:' . $project_id . ' | end');  
64 - } else {  
65 - //所有项目  
66 - $projectModel = new Project();  
67 - $list = $projectModel->list(['delete_status' => 0, 'is_upgrade' => 0, 'type' => ['in', [1, 2, 3, 4, 6]]], 'id', ['id'], 'asc');  
68 - foreach ($list as $k => $v) {  
69 - $project_id = $v['id']; 35 + public function start_thumb()
  36 + {
  37 + $key = 'thumb_project_image';
  38 + $project_id = Redis::rpop($key);
  39 + if (empty($project_id)) {
  40 + sleep(60);
  41 + return true;
  42 + }
70 43
71 - $this->output('project_id:' . $project_id . ' | start'); 44 + $this->output('project_id:' . $project_id . ' | start');
72 45
73 - $project_info = ProjectServer::useProject($project_id); 46 + $project_info = ProjectServer::useProject($project_id);
74 47
75 - if ($project_info) {  
76 - $thumb_w = $project_info->deploy_build->thumb_w ?? 0;  
77 - Product::select(['id', 'project_id', 'thumb'])->chunk(100, function ($products) use ($thumb_w) {  
78 - foreach ($products as $product) {  
79 - $thumb = $product->thumb;  
80 - if (isset($thumb['url']) && $thumb['url']) {  
81 - $new_thumb = thumbImageByUrl($thumb['url'], $thumb_w);  
82 - if ($new_thumb != $thumb['url']) {  
83 - $thumb['url'] = $new_thumb;  
84 - $json_thumb = Arr::a2s($thumb);  
85 - if (strlen($json_thumb) <= 500) {  
86 - $product->timestamps = false;  
87 - $product->thumb = $json_thumb;  
88 - $product->save(); 48 + if ($project_info) {
  49 + $thumb_w = $project_info->deploy_build->thumb_w ?? 0;
  50 + Product::select(['id', 'project_id', 'gallery'])->chunk(100, function ($products) use ($thumb_w) {
  51 + foreach ($products as $product) {
  52 + $thumb = $product['gallery'][0] ?? [];
  53 + if (isset($thumb['url']) && $thumb['url']) {
  54 + $thumb['url'] = thumbImageByUrl($thumb['url'], $thumb_w);
  55 + $json_thumb = Arr::a2s($thumb);
  56 + if (strlen($json_thumb) <= 500) {
  57 + $product->timestamps = false;
  58 + $product->thumb = $json_thumb;
  59 + $product->save();
89 60
90 - $this->output('project_id:' . $product->project_id . ',product_id:' . $product->id . ' | success');  
91 - }  
92 - }  
93 - } 61 + $this->output('project_id:' . $product->project_id . ',product_id:' . $product->id . ',thumb:' . $thumb_w . ' | success');
94 } 62 }
95 - });  
96 -  
97 - DB::disconnect('custom_mysql'); 63 + }
98 } 64 }
  65 + });
99 66
100 - $this->output('project_id:' . $project_id . ' | end');  
101 - } 67 + DB::disconnect('custom_mysql');
102 } 68 }
  69 +
  70 + $this->output('project_id:' . $project_id . ' | end');
  71 +
  72 + return true;
103 } 73 }
104 74
105 75
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 namespace App\Console\Commands\SyncFilesImage; 10 namespace App\Console\Commands\SyncFilesImage;
11 11
12 use App\Models\File\File; 12 use App\Models\File\File;
  13 +use App\Models\File\Image;
13 use Illuminate\Console\Command; 14 use Illuminate\Console\Command;
14 15
15 class SyncProjectFile extends Command 16 class SyncProjectFile extends Command
@@ -31,7 +32,7 @@ class SyncProjectFile extends Command @@ -31,7 +32,7 @@ class SyncProjectFile extends Command
31 32
32 public function handle(){ 33 public function handle(){
33 $project_id = $this->argument('project_id'); 34 $project_id = $this->argument('project_id');
34 - $fileModel = new File(); 35 + $fileModel = new Image();
35 $lists = $fileModel->list(['project_id'=>$project_id]);//未同步成功的图片及文件 36 $lists = $fileModel->list(['project_id'=>$project_id]);//未同步成功的图片及文件
36 foreach ($lists as $k => $v){ 37 foreach ($lists as $k => $v){
37 if(strpos($v['path'], '/181/') !== false ){ 38 if(strpos($v['path'], '/181/') !== false ){
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 namespace App\Console\Commands\SyncFilesImage; 10 namespace App\Console\Commands\SyncFilesImage;
11 11
12 use App\Models\File\File; 12 use App\Models\File\File;
  13 +use App\Models\File\Image;
13 use Illuminate\Console\Command; 14 use Illuminate\Console\Command;
14 15
15 class SyncTimeFiles extends Command 16 class SyncTimeFiles extends Command
@@ -30,11 +31,11 @@ class SyncTimeFiles extends Command @@ -30,11 +31,11 @@ class SyncTimeFiles extends Command
30 31
31 public function handle() 32 public function handle()
32 { 33 {
33 - $fileModel = new File();  
34 -// $imagesModel = new Image();  
35 - $start = '2025-08-20 00:00:00';  
36 - $end = '2025-08-28 00:00:00';  
37 - $lists = $fileModel->list(['created_at'=>['between',[$start,$end]]]); 34 +// $fileModel = new File();
  35 + $imagesModel = new Image();
  36 + $start = '2025-08-28 00:00:00';
  37 + $end = '2025-08-29 23:59:59';
  38 + $lists = $imagesModel->list(['created_at'=>['between',[$start,$end]]]);
38 foreach ($lists as $v){ 39 foreach ($lists as $v){
39 $path = $v['path']; 40 $path = $v['path'];
40 echo date('Y-m-d H:i:s') . ' | 图片链接:' . $path . PHP_EOL; 41 echo date('Y-m-d H:i:s') . ' | 图片链接:' . $path . PHP_EOL;
@@ -83,6 +83,9 @@ class UpdateKeyword extends Command @@ -83,6 +83,9 @@ class UpdateKeyword extends Command
83 if($info['update_method'] != 1){ 83 if($info['update_method'] != 1){
84 $idArr = shuffle($idArr); 84 $idArr = shuffle($idArr);
85 } 85 }
  86 + if(!$idArr){
  87 + return false;
  88 + }
86 $result = $this->splitArrayIntoParts($idArr,$number); 89 $result = $this->splitArrayIntoParts($idArr,$number);
87 foreach ($result as $key => $val){ 90 foreach ($result as $key => $val){
88 $keywordModel->edit(['keyword_content'=>$text[$key]],['id'=>['in',$val]]); 91 $keywordModel->edit(['keyword_content'=>$text[$key]],['id'=>['in',$val]]);
@@ -286,14 +286,14 @@ class FetchTicketProjects extends Command @@ -286,14 +286,14 @@ class FetchTicketProjects extends Command
286 286
287 $fields = [ 287 $fields = [
288 'company_name' => $item->company, 288 'company_name' => $item->company,
289 - 'title' => $item->title . " - V6", 289 + 'title' => $item->title . " - V" . (empty($item->version) ? 6 : $item->version),
290 'assm_id' => $assm_id, 290 'assm_id' => $assm_id,
291 'seom_id' => $seom_id, 291 'seom_id' => $seom_id,
292 'engineer_id' => $engineer_id, 292 'engineer_id' => $engineer_id,
293 'is_del' => $is_del, 293 'is_del' => $is_del,
294 'website' => !empty($item->domainInfo->domain) ? 'https://'.$item->domainInfo->domain : '', 294 'website' => !empty($item->domainInfo->domain) ? 'https://'.$item->domainInfo->domain : '',
295 'test_website' => $item->deploy_build->test_domain ?? '', 295 'test_website' => $item->deploy_build->test_domain ?? '',
296 - 'version' => empty($item->version) ? 7 : $item->version, // 版本号 296 + 'version' => empty($item->version) ? 6 : $item->version, // 版本号
297 'plan' => $item->planMap()[$item->deploy_build->plan] ?? '', 297 'plan' => $item->planMap()[$item->deploy_build->plan] ?? '',
298 'project_cate' => 2, 298 'project_cate' => 2,
299 'wechat_group_id' => ProjectAssociation::where('project_id', $item->id) 299 'wechat_group_id' => ProjectAssociation::where('project_id', $item->id)
@@ -1468,68 +1468,66 @@ function diffInHours($startTime, $endTime) @@ -1468,68 +1468,66 @@ function diffInHours($startTime, $endTime)
1468 return round($hours, 1); 1468 return round($hours, 1);
1469 } 1469 }
1470 1470
1471 -/**  
1472 - * 通过图片地址压缩图片  
1473 - * @param $url  
1474 - * @param int $width  
1475 - * @return string  
1476 - * @author Akun  
1477 - * @date 2025/09/01 15:18  
1478 - */  
1479 -function thumbImageByUrl($url, $width = 360)  
1480 -{  
1481 - if (empty($url)) {  
1482 - return $url;  
1483 - } 1471 +if (!function_exists('thumbImageByUrl')) {
  1472 + /**
  1473 + * 通过图片地址压缩图片
  1474 + * @param $url
  1475 + * @param int $width
  1476 + * @return string
  1477 + * @author Akun
  1478 + * @date 2025/09/01 15:18
  1479 + */
  1480 + function thumbImageByUrl($url, $width = 360)
  1481 + {
  1482 + if (empty($url)) {
  1483 + return $url;
  1484 + }
1484 1485
1485 - if ($width == 0) {  
1486 - return $url;  
1487 - } 1486 + if ($width == 0) {
  1487 + return $url;
  1488 + }
1488 1489
1489 - if (strpos($url, '_thumb') !== false) {  
1490 - return $url;  
1491 - } 1490 + //获取图片完整访问地址
  1491 + $url_complete = getImageUrl($url, 0, 0, 0);//先用v6-file地址
  1492 + if (strpos($url_complete, 'v6-file') !== false) {
  1493 + $is_exists = checkRemoteFileExists($url_complete);
  1494 + if (!$is_exists) {
  1495 + //不存在,再用cdn地址
  1496 + $url_complete = getImageUrl($url);
  1497 + }
  1498 + }
1492 1499
1493 - //获取图片完整访问地址  
1494 - $url_complete = getImageUrl($url, 0, 0, 0);//先用v6-file地址  
1495 - if (strpos($url_complete, 'v6-file') !== false) {  
1496 - $is_exists = checkRemoteFileExists($url_complete);  
1497 - if (!$is_exists) {  
1498 - //不存在,再用cdn地址  
1499 - $url_complete = getImageUrl($url); 1500 + //获取与原图存储路径相同的压缩路径
  1501 + $path = parse_url($url_complete, PHP_URL_PATH);
  1502 + $path_arr = explode('.', $path);
  1503 + if (count($path_arr) != 2) {
  1504 + return $url;
1500 } 1505 }
1501 - } 1506 + $path_arr[0] = $path_arr[0] . '_thumbW' . $width;
  1507 + $key = implode('.', $path_arr);
1502 1508
1503 - //获取与原图存储路径相同的压缩路径  
1504 - $path = parse_url($url_complete, PHP_URL_PATH);  
1505 - $path_arr = explode('.', $path);  
1506 - if (count($path_arr) != 2) {  
1507 - return $url;  
1508 - }  
1509 - $path_arr[0] = $path_arr[0] . '_thumbW' . $width;  
1510 - $key = implode('.', $path_arr); 1509 + try {
  1510 + $img = \Intervention\Image\Facades\Image::make($url_complete);
1511 1511
1512 - try {  
1513 - $img = \Intervention\Image\Facades\Image::make($url_complete); 1512 + //宽度按设定,高度自动调整
  1513 + $img->resize($width, null, function ($constraint) {
  1514 + $constraint->aspectRatio();
  1515 + $constraint->upsize();
  1516 + });
1514 1517
1515 - //宽度按设定,高度自动调整  
1516 - $img->resize($width, null, function ($constraint) {  
1517 - $constraint->aspectRatio();  
1518 - $constraint->upsize();  
1519 - }); 1518 + //获取处理后的图片二进制资源
  1519 + $resource = $img->stream()->__toString();
1520 1520
1521 - //获取处理后的图片二进制资源  
1522 - $resource = $img->stream()->__toString(); 1521 + //上传存储桶
  1522 + $thumb_url = CosService::uploadRemote('', '', '', $key, $resource);
1523 1523
1524 - //上传存储桶  
1525 - $thumb_url = CosService::uploadRemote('', '', '', $key, $resource); 1524 + $url = $thumb_url ? $thumb_url : $url;
  1525 + } catch (\Exception $e) {
  1526 + Log::channel('thumb_img')->error($e->getMessage(), [$url_complete, $width]);
  1527 + }
1526 1528
1527 - $url = $thumb_url ? $thumb_url : $url;  
1528 - } catch (\Exception $e) {  
1529 - Log::channel('thumb_img')->error($e->getMessage(), [$url, $width]); 1529 + return $url;
1530 } 1530 }
1531 -  
1532 - return $url;  
1533 } 1531 }
1534 1532
1535 if (!function_exists('checkRemoteFileExists')) { 1533 if (!function_exists('checkRemoteFileExists')) {
@@ -221,7 +221,7 @@ class TicketController extends BaseController @@ -221,7 +221,7 @@ class TicketController extends BaseController
221 $data['record'] = array_filter($data['record'], function($item) { 221 $data['record'] = array_filter($data['record'], function($item) {
222 return $item['date'] > '2025-09-01'; 222 return $item['date'] > '2025-09-01';
223 }); 223 });
224 - if($project['type'] == 2){ 224 + if($project['type'] == 2 || ($project['deploy_build']['seo_plan'] > 0 && ($project['deploy_build']['plan'] == 0))){
225 //优化项目 默认在seo优化中 225 //优化项目 默认在seo优化中
226 if($data['optimize_record'] == 0) { 226 if($data['optimize_record'] == 0) {
227 $data['optimize_record'] = 1; 227 $data['optimize_record'] = 1;
@@ -236,14 +236,17 @@ class TicketController extends BaseController @@ -236,14 +236,17 @@ class TicketController extends BaseController
236 } 236 }
237 //无剩余时间 237 //无剩余时间
238 if($project['project_type'] == 1){ 238 if($project['project_type'] == 1){
239 - if($project['remain_day'] == 0){$data['optimize_record'] = 4;}  
240 - }else{ 239 + $remain_day = $project['seo_remain_day'];
241 if($project['seo_remain_day'] == 0){$data['optimize_record'] = 4;} 240 if($project['seo_remain_day'] == 0){$data['optimize_record'] = 4;}
  241 + }else{
  242 + $remain_day = $project['remain_day'];
  243 + if($project['remain_day'] == 0){$data['optimize_record'] = 4;}
242 } 244 }
243 if(in_array(2,$project['level'])){ 245 if(in_array(2,$project['level'])){
244 $data['date_project_record'] = ['暂停优化']; 246 $data['date_project_record'] = ['暂停优化'];
245 }else{ 247 }else{
246 $data['date_project_record'] = Project::projectProgress('optimize'); 248 $data['date_project_record'] = Project::projectProgress('optimize');
  249 + $data['date_project_record'][4] .= (': '.$remain_day.'天');
247 } 250 }
248 }else{ 251 }else{
249 //查看是否绑定微信群 252 //查看是否绑定微信群
@@ -49,11 +49,20 @@ class OptimizeController extends BaseController @@ -49,11 +49,20 @@ class OptimizeController extends BaseController
49 ->orderBy('gl_project_deploy_optimize.start_date','desc'); 49 ->orderBy('gl_project_deploy_optimize.start_date','desc');
50 $lists = $query->paginate($this->row, $this->selectParam(), 'page', $this->page)->toArray(); 50 $lists = $query->paginate($this->row, $this->selectParam(), 'page', $this->page)->toArray();
51 if(!empty($lists) && !empty($lists['list'])){ 51 if(!empty($lists) && !empty($lists['list'])){
  52 + //多apino项目
  53 + $api_no_project = [2104,3041];
52 $rankDataModel = new RankData(); 54 $rankDataModel = new RankData();
53 foreach ($lists['list'] as $k => $v){ 55 foreach ($lists['list'] as $k => $v){
54 - //特殊项目 两个api_no  
55 - if($v['id'] == 2104){  
56 - $keyword_num_map = [10690=>100, 11201 => 50]; 56 + if(in_array($v['id'],$api_no_project)){
  57 + switch ($v['id']){
  58 + case 2104:
  59 + $keyword_num_map = [10690=>100, 11201 => 50];
  60 + break;
  61 + case 3041:
  62 + $keyword_num_map = [11298=>100, 10659 => 50];
  63 + break;
  64 + default:break;
  65 + }
57 $v['first_page_num'] = $v['indexed_pages_num'] = $v['g'] = $v['keyword_num'] = []; 66 $v['first_page_num'] = $v['indexed_pages_num'] = $v['g'] = $v['keyword_num'] = [];
58 foreach ($keyword_num_map as $api_no => $keyword_num){ 67 foreach ($keyword_num_map as $api_no => $keyword_num){
59 $data = $rankDataModel->read(['project_id'=>$v['id'],'api_no' => $api_no, 'lang'=>''],['first_page_num','indexed_pages_num']); 68 $data = $rankDataModel->read(['project_id'=>$v['id'],'api_no' => $api_no, 'lang'=>''],['first_page_num','indexed_pages_num']);
@@ -66,8 +75,8 @@ class OptimizeController extends BaseController @@ -66,8 +75,8 @@ class OptimizeController extends BaseController
66 $v['indexed_pages_num'] = implode(',', $v['indexed_pages_num']); 75 $v['indexed_pages_num'] = implode(',', $v['indexed_pages_num']);
67 $v['g'] = implode(',', $v['g']); 76 $v['g'] = implode(',', $v['g']);
68 $v['keyword_num'] = implode(',', $v['keyword_num']); 77 $v['keyword_num'] = implode(',', $v['keyword_num']);
69 - }else{  
70 - $data = $rankDataModel->read(['project_id'=>$v['id'],'lang'=>'', 'api_no' => $v['api_no']],['first_page_num','indexed_pages_num']); 78 + }else {
  79 + $data = $rankDataModel->read(['project_id' => $v['id'], 'lang' => '', 'api_no' => $v['api_no']], ['first_page_num', 'indexed_pages_num']);
71 $v['first_page_num'] = $data['first_page_num'] ?? 0; 80 $v['first_page_num'] = $data['first_page_num'] ?? 0;
72 $v['indexed_pages_num'] = $data['indexed_pages_num'] ?? 0; 81 $v['indexed_pages_num'] = $data['indexed_pages_num'] ?? 0;
73 $v['g'] = $this->getGNum($v['id']); 82 $v['g'] = $this->getGNum($v['id']);
@@ -8,6 +8,7 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest; @@ -8,6 +8,7 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest;
8 use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest; 8 use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
9 use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest; 9 use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
10 use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest; 10 use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest;
  11 +use App\Models\Manage\Manage;
11 use App\Models\Manage\ManageHr; 12 use App\Models\Manage\ManageHr;
12 use App\Models\WorkOrder\TicketLog; 13 use App\Models\WorkOrder\TicketLog;
13 use App\Models\WorkOrder\TicketProject; 14 use App\Models\WorkOrder\TicketProject;
@@ -52,7 +53,7 @@ class AsideTicketController extends BaseController @@ -52,7 +53,7 @@ class AsideTicketController extends BaseController
52 $status = $request->input('status'); 53 $status = $request->input('status');
53 if($status == 10){ 54 if($status == 10){
54 $newTime = date("Y-m-d H:i:s", strtotime("-120 hours")); 55 $newTime = date("Y-m-d H:i:s", strtotime("-120 hours"));
55 - return $query->where('status', 0)->where('plan_end_at','<',$newTime);//超过120个小时未处理的工单 56 + return $query->where('status', '!=' ,Tickets::STATUS_COMPLETED)->where('plan_end_at','<',$newTime);//超过120个小时未处理的工单
56 }else{ 57 }else{
57 return $query->where('status', $status); 58 return $query->where('status', $status);
58 } 59 }
@@ -142,7 +143,15 @@ class AsideTicketController extends BaseController @@ -142,7 +143,15 @@ class AsideTicketController extends BaseController
142 if ($sortField != 'plan_end_at') $query->orderBy('plan_end_at', 'asc'); 143 if ($sortField != 'plan_end_at') $query->orderBy('plan_end_at', 'asc');
143 $lists = $query->paginate($this->row, ['*'], 'page', $this->page)->toArray(); 144 $lists = $query->paginate($this->row, ['*'], 'page', $this->page)->toArray();
144 if(!empty($lists) && !empty($lists['list'])){ 145 if(!empty($lists) && !empty($lists['list'])){
  146 + $manageModel = new Manage();
145 foreach ($lists['list'] as $key => $item){ 147 foreach ($lists['list'] as $key => $item){
  148 + if($item['project']['version'] != 5){
  149 + $item['project']['engineer_id_name'] = $manageModel->getName($item['project']['engineer_id'] ?? 0);
  150 + }
  151 + //自动登录v6
  152 + if($item['project']['project_cate'] == 2){
  153 + $item['autologin_code'] = getAutoLoginCode($item['project']['table_id']);
  154 + }
146 //计算超时多少个小时 155 //计算超时多少个小时
147 if($item['status'] == 0){ 156 if($item['status'] == 0){
148 $end = date('Y-m-d H:i:s'); 157 $end = date('Y-m-d H:i:s');
@@ -280,9 +289,7 @@ class AsideTicketController extends BaseController @@ -280,9 +289,7 @@ class AsideTicketController extends BaseController
280 'logs.engineer', 289 'logs.engineer',
281 'project.projectV6:id,company,title', 290 'project.projectV6:id,company,title',
282 ])->find($id); 291 ])->find($id);
283 -  
284 if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE); 292 if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
285 -  
286 $this->response('success', Code::SUCCESS, $ticket->toArray()); 293 $this->response('success', Code::SUCCESS, $ticket->toArray());
287 } 294 }
288 295
@@ -296,7 +303,6 @@ class AsideTicketController extends BaseController @@ -296,7 +303,6 @@ class AsideTicketController extends BaseController
296 $request->validated(); 303 $request->validated();
297 $ticket = Tickets::find($id); 304 $ticket = Tickets::find($id);
298 if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE); 305 if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
299 -  
300 // 开始修改 306 // 开始修改
301 $result = DB::transaction(function () use ($request, $ticket) { 307 $result = DB::transaction(function () use ($request, $ticket) {
302 if ($request->input('engineer_ids')) 308 if ($request->input('engineer_ids'))
@@ -84,20 +84,19 @@ class AsideTicketLogController extends BaseController @@ -84,20 +84,19 @@ class AsideTicketLogController extends BaseController
84 if ($pending) 84 if ($pending)
85 { 85 {
86 $ticket->status = Tickets::STATUS_PROCESSING; 86 $ticket->status = Tickets::STATUS_PROCESSING;
87 - }else  
88 - { 87 + }else {
89 // 如果所有子任务都完成了,则将工单状态改为已完成 88 // 如果所有子任务都完成了,则将工单状态改为已完成
90 - // todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态  
91 - if (($ticket->title == 'GEO项目') || !($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))  
92 - {  
93 - $ticket->status = Tickets::STATUS_COMPLETED;  
94 - $ticket->end_at = now();  
95 - $ticket->end_time = diffInHours($ticket->created_at,$ticket->end_at);  
96 - $project = $ticket->project;  
97 - if ($project->wechat_switch && !$ticket->close_wechat)  
98 - $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");  
99 - $ticket->pushDing('finish');  
100 - }else{ 89 + // todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态
  90 + if (($ticket->title == 'GEO项目') || !($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))
  91 + {
  92 + $ticket->status = Tickets::STATUS_COMPLETED;
  93 + $ticket->end_at = now();
  94 + $ticket->end_time = diffInHours($ticket->created_at,$ticket->end_at);
  95 + $project = $ticket->project;
  96 + if ($project->wechat_switch && !$ticket->close_wechat)
  97 + $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
  98 + $ticket->pushDing('finish');
  99 + }else{
101 $ticket->status = Tickets::STATUS_YANSHOU; 100 $ticket->status = Tickets::STATUS_YANSHOU;
102 } 101 }
103 } 102 }
@@ -232,12 +232,12 @@ class CNoticeController extends BaseController @@ -232,12 +232,12 @@ class CNoticeController extends BaseController
232 } 232 }
233 //获取项目所在服务器 233 //获取项目所在服务器
234 $project_model = new Project(); 234 $project_model = new Project();
235 - $project_info = $project_model->read(['id'=>$project_id],['serve_id','is_upgrade', 'main_lang_id']); 235 + $project_info = $project_model->read(['id'=>$project_id],['serve_id','type','is_upgrade', 'main_lang_id']);
236 if(!$project_info){ 236 if(!$project_info){
237 $this->fail('未查询到项目数据'); 237 $this->fail('未查询到项目数据');
238 } 238 }
239 // --------------------------------------------------- 特殊处理通知生成页面 -------------------------------------------------------------- 239 // --------------------------------------------------- 特殊处理通知生成页面 --------------------------------------------------------------
240 - if ($type == 2 && $project_info['main_lang_id'] == 8) { 240 + if ($type == 2 && ($project_id != 4041) && ($project_info['main_lang_id'] == 8)) {
241 $this->fail('申请项目主语种为俄语,禁止翻译小语种,如若需要翻译小语种, 请联系售后人员确认!'); 241 $this->fail('申请项目主语种为俄语,禁止翻译小语种,如若需要翻译小语种, 请联系售后人员确认!');
242 } 242 }
243 243
@@ -73,7 +73,7 @@ class GeoLinkLogic extends BaseLogic @@ -73,7 +73,7 @@ class GeoLinkLogic extends BaseLogic
73 foreach ($this->param['data'] as $item){ 73 foreach ($this->param['data'] as $item){
74 $data[] = [ 74 $data[] = [
75 'project_id'=>$this->param['project_id'], 75 'project_id'=>$this->param['project_id'],
76 - 'da'=>$item['da'] ?? '', 76 + 'da'=>$item['da'] ?? 0,
77 'url'=>$item['url'], 77 'url'=>$item['url'],
78 'send_time'=>$item['send_time'] 78 'send_time'=>$item['send_time']
79 ]; 79 ];
@@ -64,7 +64,7 @@ class ProcessRecordsLogic extends BaseLogic @@ -64,7 +64,7 @@ class ProcessRecordsLogic extends BaseLogic
64 // $data['record'] = array_filter($data['record'], function($item) { 64 // $data['record'] = array_filter($data['record'], function($item) {
65 // return $item['date'] > '2025-09-01'; 65 // return $item['date'] > '2025-09-01';
66 // }); 66 // });
67 - if($project['type'] == 2){ 67 + if($project['type'] == 2 || ($project['deploy_build']['seo_plan'] > 0 && ($project['deploy_build']['plan'] == 0))){
68 //优化项目 默认在seo优化中 68 //优化项目 默认在seo优化中
69 if($data['optimize_record'] == 0) { 69 if($data['optimize_record'] == 0) {
70 $data['optimize_record'] = 1; 70 $data['optimize_record'] = 1;
@@ -79,14 +79,17 @@ class ProcessRecordsLogic extends BaseLogic @@ -79,14 +79,17 @@ class ProcessRecordsLogic extends BaseLogic
79 } 79 }
80 //无剩余时间 80 //无剩余时间
81 if($project['project_type'] == 1){ 81 if($project['project_type'] == 1){
  82 + $remain_day = $project['seo_remain_day'];
82 if($project['seo_remain_day'] == 0){$data['optimize_record'] = 4;} 83 if($project['seo_remain_day'] == 0){$data['optimize_record'] = 4;}
83 }else{ 84 }else{
  85 + $remain_day = $project['remain_day'];
84 if($project['remain_day'] == 0){$data['optimize_record'] = 4;} 86 if($project['remain_day'] == 0){$data['optimize_record'] = 4;}
85 } 87 }
86 if(in_array(2,$project['level'])){ 88 if(in_array(2,$project['level'])){
87 $data['date_project_record'] = ['暂停优化']; 89 $data['date_project_record'] = ['暂停优化'];
88 }else{ 90 }else{
89 $data['date_project_record'] = Project::projectProgress('optimize'); 91 $data['date_project_record'] = Project::projectProgress('optimize');
  92 + $data['date_project_record'][4] .= (': '.$remain_day.'天');
90 } 93 }
91 }else{ 94 }else{
92 //查看是否绑定微信群 95 //查看是否绑定微信群
@@ -59,6 +59,7 @@ use Illuminate\Support\Facades\Cache; @@ -59,6 +59,7 @@ use Illuminate\Support\Facades\Cache;
59 use Illuminate\Support\Facades\DB; 59 use Illuminate\Support\Facades\DB;
60 use Illuminate\Support\Facades\Http; 60 use Illuminate\Support\Facades\Http;
61 use Illuminate\Support\Facades\Log as LogInfo; 61 use Illuminate\Support\Facades\Log as LogInfo;
  62 +use Illuminate\Support\Facades\Redis;
62 63
63 /** 64 /**
64 * Class ProjectLogic 65 * Class ProjectLogic
@@ -528,6 +529,13 @@ class ProjectLogic extends BaseLogic @@ -528,6 +529,13 @@ class ProjectLogic extends BaseLogic
528 protected function saveProjectDeployBuild($deploy_build){ 529 protected function saveProjectDeployBuild($deploy_build){
529 $deployBuildModel = new DeployBuild(); 530 $deployBuildModel = new DeployBuild();
530 $deploy_build['configuration'] = Arr::a2s(!empty($deploy_build['configuration']) ? $deploy_build['configuration'] : []); 531 $deploy_build['configuration'] = Arr::a2s(!empty($deploy_build['configuration']) ? $deploy_build['configuration'] : []);
  532 +
  533 + //如果更改了缩略图压缩大小,同步写入处理缩略图任务队列
  534 + $old_thumb_info = $deployBuildModel->read(['id'=>$deploy_build['id']],['thumb_w']);
  535 + if(isset($old_thumb_info['thumb_w']) && $old_thumb_info['thumb_w'] != $deploy_build['thumb_w']){
  536 + Redis::lpush('thumb_project_image',$deploy_build['project_id']);
  537 + }
  538 +
531 $deployBuildModel->edit($deploy_build,['id'=>$deploy_build['id']]); 539 $deployBuildModel->edit($deploy_build,['id'=>$deploy_build['id']]);
532 return $this->success(); 540 return $this->success();
533 } 541 }
@@ -263,6 +263,9 @@ class CustomModuleContentLogic extends BaseLogic @@ -263,6 +263,9 @@ class CustomModuleContentLogic extends BaseLogic
263 * @time :2023/10/20 9:02 263 * @time :2023/10/20 9:02
264 */ 264 */
265 public function getCategory($category){ 265 public function getCategory($category){
  266 + if(empty($category)){
  267 + return '';
  268 + }
266 $str = ''; 269 $str = '';
267 foreach ($category as $v){ 270 foreach ($category as $v){
268 $str .= $v.','; 271 $str .= $v.',';
@@ -979,6 +979,18 @@ class ProductLogic extends BaseLogic @@ -979,6 +979,18 @@ class ProductLogic extends BaseLogic
979 } 979 }
980 } 980 }
981 } 981 }
  982 + $exist_attr_keys = array_column($attrs,'key');//已存在的参数key
  983 + for($i=12;$i<count($data);$i++){
  984 + if($data[$i] ?? ''){
  985 + $data_i_array = explode('^v6sp$',$data[$i]);
  986 + if(count($data_i_array) == 2 && !in_array($data_i_array[0],$exist_attr_keys)){
  987 + $attrs[] = [
  988 + 'key' => $data_i_array[0],
  989 + 'value' => $data_i_array[1]
  990 + ];
  991 + }
  992 + }
  993 + }
982 //处理描述切换栏 994 //处理描述切换栏
983 $describe = []; 995 $describe = [];
984 if($data[11]??''){ 996 if($data[11]??''){
@@ -319,7 +319,7 @@ class UserLoginLogic @@ -319,7 +319,7 @@ class UserLoginLogic
319 $info['is_amp'] = $is_amp; 319 $info['is_amp'] = $is_amp;
320 $info['is_three_code'] = $project['is_three_code'] ?? 0; 320 $info['is_three_code'] = $project['is_three_code'] ?? 0;
321 //产品,新闻,博客导入模板 321 //产品,新闻,博客导入模板
322 - $info['import_products_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/products.csv'; 322 + $info['import_products_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2025-09/products-1.csv';
323 $info['import_news_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/news.csv'; 323 $info['import_news_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/news.csv';
324 $info['import_blogs_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/blogs.csv'; 324 $info['import_blogs_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/blogs.csv';
325 //缩略图宽度 325 //缩略图宽度
@@ -199,7 +199,7 @@ class Project extends Base @@ -199,7 +199,7 @@ class Project extends Base
199 1 => 'SEO设置', 199 1 => 'SEO设置',
200 2 => '开始推广', 200 2 => '开始推广',
201 3 => '排名达标', 201 3 => '排名达标',
202 - 4 => '剩余服务时' 202 + 4 => '剩余服务时'
203 ] 203 ]
204 ]; 204 ];
205 205
@@ -254,7 +254,6 @@ Route::middleware(['aloginauth'])->group(function () { @@ -254,7 +254,6 @@ Route::middleware(['aloginauth'])->group(function () {
254 // 售后工单改版 254 // 售后工单改版
255 Route::prefix('tickets')->group(function () { 255 Route::prefix('tickets')->group(function () {
256 Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表'); 256 Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表');
257 - Route::post('/lists', [Aside\WorkOrder\AsideTicketController::class, 'lists'])->name('admin.tickets.lists')->summary('A端工单列表2');  
258 Route::post('/', [Aside\WorkOrder\AsideTicketController::class, 'store'])->name('admin.tickets.store')->summary('A端创建工单'); 257 Route::post('/', [Aside\WorkOrder\AsideTicketController::class, 'store'])->name('admin.tickets.store')->summary('A端创建工单');
259 Route::get('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'show'])->name('admin.tickets.show')->summary('A端工单详情'); 258 Route::get('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'show'])->name('admin.tickets.show')->summary('A端工单详情');
260 Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事'); 259 Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');