Browse Source

Merge branch '20250814_randomweb_fr'

FengR 4 months ago
parent
commit
0d4d35fb63
3 changed files with 272 additions and 90 deletions
  1. 255 89
      app/JsonRpc/PublicRpcService.php
  2. 4 0
      app/Model/ComponentImg.php
  3. 13 1
      app/Model/Sector.php

+ 255 - 89
app/JsonRpc/PublicRpcService.php

@@ -2,6 +2,7 @@
 
 namespace App\JsonRpc;
 
+// use ___PHPSTORM_HELPERS\object;
 use _PHPStan_62c6a0a8b\OndraM\CiDetector\Env;
 use App\Model\BlackWord;
 use App\Model\Department;
@@ -2938,49 +2939,79 @@ class PublicRpcService implements PublicRpcServiceInterface
         if(empty($template)){
             return Result::error('此皮肤不存在!');
         }
+
         $rule = TemplateRule::first();
-        switch ($data['page']) {
-            case 1:
-                $index_rule = json_decode($rule['index_rule']);
-                break;
-            case 2:
-                $index_rule = json_decode($rule['class_rule']);
-                break;
-            case 3:
-                $index_rule = json_decode($rule['list_rule']);
-                break;
-            case 4:
-                $index_rule = json_decode($rule['info_rule']);
-                break;
-            case 5:
-                $index_rule = json_decode($rule['search_rule']);
-                break;
-            case 6:
-                $index_rule = json_decode($rule['footerlist_rule']);
-                break;
-            case 7:
-                $index_rule = json_decode($rule['footerinfo_rule']);
-                break;
-            default:
-                break;
+        if(isset($data['page']) && !empty($data['page'])){
+            switch ($data['page']) {
+                case 1:
+                    $index_rule = json_decode($rule['index_rule']);
+                    break;
+                case 2:
+                    $index_rule = json_decode($rule['class_rule']);
+                    break;
+                case 3:
+                    $index_rule = json_decode($rule['list_rule']);
+                    break;
+                case 4:
+                    $index_rule = json_decode($rule['info_rule']);
+                    break;
+                case 5:
+                    $index_rule = json_decode($rule['search_rule']);
+                    break;
+                case 6:
+                    $index_rule = json_decode($rule['footerlist_rule']);
+                    break;
+                case 7:
+                    $index_rule = json_decode($rule['footerinfo_rule']);
+                    break;
+                default:
+                    break;
+            }
         }
-        // return Result::success($index_rule);
-        $tempalte['index'] = $this->randomPage($data,$data['page'],$index_rule);
-        // $tempalte['class'] = $this->randomPage($data,2,$class_rule);
-        // $tempalte['list'] = $this->randomPage($data,3);
-        // $tempalte['article'] = $this->randomPage($data,4);
-        // $tempalte['search'] = $this->randomPage($data,5);
-        // $tempalte['aloneList'] = $this->randomPage($data,6);
-        // $tempalte['aloneArticle'] = $this->randomPage($data,7);
+        
+        $cate_num = WebsiteCategory::where('website_id',$data['website_id'])
+        ->where('is_show',1)
+        ->count();
+        if($cate_num < 5){
+            return Result::error('此网站栏目过少,无法进行随机模板!');
+        }
+        // return Result::success($data);
+        // $tempalte['index'] = $this->randomWeb($data,$index_rule);
+        if(isset($data['page']) && !empty($data['page'])){
+            $tempalte['index'] = $this->randomPage($data,$cate_num,$index_rule);
+        }else{
+            $data['page'] = 1;
+            $ruleIndex = json_decode($rule->index_rule);
+            $tempalte['index'] = $this->randomPage($data, $cate_num, $ruleIndex);
+            $data['page'] = 2;
+            $ruleClass = json_decode($rule->class_rule);
+            $tempalte['class'] = $this->randomPage($data, $cate_num, $ruleClass);
+            $data['page'] = 3;
+            $ruleList = json_decode($rule->list_rule);
+            $tempalte['list'] = $this->randomPage($data,$cate_num,$ruleList);
+            $data['page'] = 4;
+            $ruleInfo = json_decode($rule->info_rule);
+            $tempalte['info'] = $this->randomPage($data,$cate_num,$ruleInfo);
+            $data['page'] = 5;
+            $ruleSearch = json_decode($rule->search_rule);
+            $tempalte['search'] = $this->randomPage($data,$cate_num,$ruleSearch);
+            $data['page'] = 6;
+            $ruleFooterlist = json_decode($rule->footerlist_rule);
+            $tempalte['footerlist'] = $this->randomPage($data,$cate_num,$ruleFooterlist);
+            $data['page'] = 7;
+            $ruleFooterinfo = json_decode($rule->footerinfo_rule);
+            $tempalte['footerinfo'] = $this->randomPage($data,$cate_num,$ruleFooterinfo);
+        }        
         // $index = $this->randomPage($data);
         return Result::success($tempalte);
     }
-    public function randomPage($data,$page,$rule){
+    public function randomPage($data,$cate_num,$rule){
         // return $rule;
+        $page = $data['page'];
         $sectors = Sector::where('sector.template_id',$data['template_id'])
         ->where('sector.page_type','like','%'.$page.'%')
         ->select('sector.sector_name', 'sector.sector_id','sector.pic_height','sector.sector_img',
-        'sector.sector_type','sector.sector_code','sector.id','sector.sector_width')  
+        'sector.sector_type','sector.sector_code','sector.id','sector.sector_width','sector.component_num')  
         ->orderBy('id')
         ->get()->all();
         if(empty($sectors)){
@@ -3004,7 +3035,7 @@ class PublicRpcService implements PublicRpcServiceInterface
 
             return $result;
         }, []);
-        // return $sector_types;
+        // return [$sector_type_keys,$sector_types];
         $must_type = $rule->must_type;
         $sector_num = $rule->max_num;
         // 获取必需通栏类别与查询到的通栏类别的交集数量;
@@ -3018,7 +3049,30 @@ class PublicRpcService implements PublicRpcServiceInterface
         // return $must_type;
 
 
-        // 非必须通栏的随机处理
+        // 1.必需通栏
+        $must_type = array_intersect($all_sector_types,$must_type);
+        // return $must_type;
+        // 此代码用于从 $sectors 数组中筛选出必需的通栏数据。
+        // 1. array_keys($must_type) 获取 $must_type 数组的所有键名
+        // 2. array_flip() 将这些键名作为值,生成一个新数组
+        // 3. array_intersect_key() 比较 $sectors 和上述新数组的键名,返回键名相同的元素
+        // 4. array_values() 重新索引返回的数组,使其键名从 0 开始连续递增
+        // 最终得到的 $must_sector 数组包含了 $sectors 中对应 $must_type 键名的所有必需通栏数据
+        // 获取 $rector 数组中 component_num 字段的值
+        
+        
+        // 获取最小值对应的键值
+        // $minKey = array_search($min_component_num, $componentNums);
+        $must_sector = array_values(array_intersect_key($sectors, array_flip(array_keys($must_type))));
+        $must_count = count($must_sector);
+        // return $sector_comnum;
+        // $must_sector = array_column($must_sector,'sector_type');
+        // 目前按照首页必需通栏的数量进行处理,若是存在必需通栏的数量大于查询到的通栏数量,则返回必需通栏的数量
+        if($must_count > $sector_num){
+            return $must_sector;
+        }
+        // return $must_sector;
+        // 2.非必须通栏的随机处理
         $not_must_type = array_diff($all_sector_types,$must_type);
         
         $total = count($not_must_type);
@@ -3062,17 +3116,7 @@ class PublicRpcService implements PublicRpcServiceInterface
         var_dump("rand_count",$rand_count);
         // return $random_sector;
 
-        // 必需通栏
-        $must_type = array_intersect($all_sector_types,$must_type);
-        // return $must_type;
-// 此代码用于从 $sectors 数组中筛选出必需的通栏数据。
-// 1. array_keys($must_type) 获取 $must_type 数组的所有键名
-// 2. array_flip() 将这些键名作为值,生成一个新数组
-// 3. array_intersect_key() 比较 $sectors 和上述新数组的键名,返回键名相同的元素
-// 4. array_values() 重新索引返回的数组,使其键名从 0 开始连续递增
-// 最终得到的 $must_sector 数组包含了 $sectors 中对应 $must_type 键名的所有必需通栏数据
-        $must_sector = array_values(array_intersect_key($sectors, array_flip(array_keys($must_type))));
-        $must_count = count($must_sector);
+        
         // var_dump("must_sector",$must_sector);
         // var_dump("must_count",$must_count);
         // return $must_sector;
@@ -3080,6 +3124,19 @@ class PublicRpcService implements PublicRpcServiceInterface
         $repeat_num = $sector_num-$rand_count-$must_count;
         // 组合起来通栏
         $sector_zuhe1 = array_merge($must_sector,$random_sector);
+        $sector_zuhe1_type = array_column($sector_zuhe1,'sector_type');
+        $sector_zuhe1_comnum = array_column($sector_zuhe1,'component_num');
+        $comnum_1 = 0;
+        $comnum_3 = 0;
+        if(in_array(1,$sector_zuhe1_type)){
+            $type_key_1 = array_search(1,$sector_zuhe1_type);
+            $comnum_1 = $sector_zuhe1_comnum[$type_key_1];
+        }
+        if(in_array(3,$sector_zuhe1_type)){
+            $type_key_3 = array_search(3,$sector_zuhe1_type);
+            $comnum_3 = $sector_zuhe1_comnum[$type_key_3];
+        }
+        $sector_zuhe1_comnum = $comnum_1+$comnum_3;
         $sector_ids = array_column($sector_zuhe1, 'id');
         if($repeat_num > 0){
             $rule_repeat = (array)$rule->type_max;
@@ -3095,6 +3152,9 @@ class PublicRpcService implements PublicRpcServiceInterface
             if(count(array_intersect($sector_zuhe1,$must_sector)) != count($must_sector)){
                 return '此页面缺少必要通栏!';
             }
+            if($cate_num == 5){
+                return $sector_zuhe1;
+            }
             // 剩余通栏进行重复处理
             // $rule_repeat = (array)$rule->type_max;
             // 取到可以重复的通栏类别
@@ -3106,47 +3166,55 @@ class PublicRpcService implements PublicRpcServiceInterface
             $type = [];
             // return $rule_repaet_type;
             // 防止无限循环,设置最大迭代次数
-            $max_iterations = 20; 
+            $max_iterations = 10; 
             $iteration_count = 0;
-            // return [
-            //     'repaet_key' => $repaet_key,
-            //     'repeat_num' => $repeat_num,
-            //     'rule_repeat' => $rule_repeat,
-            //     'repeat_type' => $repeat_type,
-            //     'must_type' => $must_type,
-            // ];
+            $sector_comnum = $cate_num-$sector_zuhe1_comnum;
+            $com_num = 0;
+            // 随机重复通栏
             while($repaet_key < $repeat_num && $iteration_count < $max_iterations){
                 $num++;
-                foreach($repeat_type as $key => $value){
-                    if(!isset($type[$key])){
-                        $type[$key] = 0;
-                    }else{
-                        $type[$key]++;
-                    }
-                    // $type代表每个类型的通栏数量,每个类型的通栏的数量应该≤规则限制的数量
-                    if($repaet_key < $repeat_num  && $type[$key] <= $rule_repeat[$key]){
-                        // $max_repaert_num = $rule_repeat[$key];
-                        // if($max_repaert_num < $num ){
-                        //     // $arr_key = $num+$key;
-                            if (count($value) > 1) {
-                                // 若 可以随机的通栏类型存在多个通栏,随机取其一
-                                $repeat_sector_key[$repaet_key] = $value[array_rand($value)];
-                            } else {
-                                $repeat_sector_key[$repaet_key] = $value[0];
+                if($sector_comnum - $com_num > 0){
+                    foreach($repeat_type as $key => $value){
+                        if(!isset($type[$key])){
+                            $type[$key] = 0;
+                        }else{
+                            $type[$key]++;
+                        }
+                        // $type代表每个类型的通栏数量,每个类型的通栏的数量应该≤规则限制的数量
+                        if($repaet_key < $repeat_num  && $type[$key] <= $rule_repeat[$key]){
+                            // $max_repaert_num = $rule_repeat[$key];
+                            // if($max_repaert_num < $num ){
+                            //     // $arr_key = $num+$key;
+                            if(($key == 1 && $sector_comnum - $com_num >= 3) || ($key == 3 && $sector_comnum - $com_num >= 1) || ($key != 1 && $key != 3)){
+                                if (count($value) > 1) {
+                                    // 若 可以随机的通栏类型存在多个通栏,随机取其一
+                                    $repeat_sector_key[$repaet_key] = $value[array_rand($value)];
+                                } else {
+                                    $repeat_sector_key[$repaet_key] = $value[0];
+                                }
+                                if($key ==1 || $key == 3){
+                                    $rk = $repeat_sector_key[$repaet_key];
+                                    $rk_sector = $sectors[$rk];
+                                    $com_num += $rk_sector['component_num'];
+                                }
+                                $type[$repaet_key] = $repeat_sector_key[$repaet_key];
+                                $repaet_key++;
                             }
-                            $type[$repaet_key] = $repeat_sector_key[$repaet_key];
-                            $repaet_key++;
+                        }
+                        // else{
+                        //     break;
                         // }
                     }
-                    // else{
-                    //     break;
-                    // }
+                }else{
+                    break;
                 }
                 // var_dump("num",  $type[$key]);
                 // var_dump("repeat_sector_key", $repeat_sector_key);
                 $iteration_count++;
             }
-            // return $repeat_sector_key;
+            // return [
+            //     $repeat_sector_key,$com_num,$sector_comnum
+            // ];
             // var_dump("num", $num);
             // var_dump("repeat_sector_key", $repeat_sector_key);
             // 随机的重复通栏键值转换成真正的通栏
@@ -3161,19 +3229,21 @@ class PublicRpcService implements PublicRpcServiceInterface
             }
             $repeat_count = count($repeat_sector);
             var_dump("repeat_count",$repeat_count);
-            // var_dump("repeat_sector", $repeat_sector);
-            //  return ($data['page'] == '2' || $data['page'] == 2);
+            // return [
+            //     'sector_comnum'=>$sector_comnum,
+            //     'com_num'=>$com_num,
+            //     'repeat_count'=>$repeat_count,
+            //     'repeat_sector'=>$repeat_sector,
+            // ];
+            // // var_dump("repeat_sector", $repeat_sector);
+            //  return $repeat_sector;
             
             $sector = array_merge($repeat_sector,$sector_zuhe1);
         }else{
             $sector = $sector_zuhe1;
         }
         // var_dump("sector_ids",$sector_ids);
-        // return [
-        //     'random_sector'=>$random_sector,
-        //     'must_sector'=>$must_sector,
-        //     'sector_ids'=>$sector_ids,
-        // ];
+        //  
         // 各类型通栏最大数量数量限制 = 规则最大数量-已经存在的通栏数量(目前的通栏不会有重复的,所以只是-1)
         
         // var_dump("sector",$sector);
@@ -3234,13 +3304,22 @@ class PublicRpcService implements PublicRpcServiceInterface
         // if(count(array_intersect($sector,$must_sector)) != count($must_sector)){
         //     return '此页面缺少必要通栏!';
         // }
-        $data['page'] = $page;
+        // return Result::success([
+        //     'sector_id'=>$sector_id,
+        //     // 'sector'=>$sector,
+        // ]);
+        // $data['page'] = $page;
         $component[] = $this->randomComponent($sector_id,$data,$sector);
         var_dump("sector_id",$sector_id);
-        return ['sector_id'=>$sector_id,
-        // 'sector'=>$sector,
-        'component'=>$component,
-        // 'sector'=>$sector,
+        return [
+            // 'sector_id'=>$sector_id,
+            // 'sector'=>$sector,
+            // 'sector_comnum'=>$sector_comnum,
+            // 'com_num'=>$com_num,
+            // 'cate_num'=>$cate_num,
+            // '$sector_zuhe1_comnum'=>$sector_zuhe1_comnum+$com_num,
+            'component'=>$component,
+            // 'sector'=>$sector,
     ];
     }
     public function randomComponent($sector_id,$data,$sector){
@@ -3543,4 +3622,91 @@ class PublicRpcService implements PublicRpcServiceInterface
             'canvas_data' => $canvas_data,
         ];
     }
+    // public function randomWeb($data,$index_rule)
+    // {
+    //     // 在使用 with 方法关联查询其他表时限制查询字段,不需要修改 Sector 的 model 文件,
+    //     // 可以直接在查询时通过 select 方法指定要查询的字段。以下是修改后的代码:
+    //     $component_img = Sector::select('sector.id', 'sector.template_id', 'sector.page_type','sector.sector_id','sector.component_num'
+    //     ,'sector.sector_name','sector.sector_type')
+    //         ->where('sector.template_id', $data['template_id'])
+    //         ->where('sector.page_type', 'like', '%' . $data['page'] . '%')
+    //         ->with([
+    //             'sectorComponents' => function ($query) use ($data) {
+    //                 $query->select('sectorid', 'sort_id', 'component_id')
+    //                     ->with([
+    //                         'component' => function ($q) use ($data) {
+    //                             $q->select('id', 'component_type', 'component_data', 'component_code', 'component_column', 'ad','type_id')
+    //                             ->with([
+    //                                 'componentImgs' => function ($subQ) use ($data) {
+    //                                     $subQ
+    //                                     ->where('template_id', $data['template_id'])
+    //                                     // ->select('id', 'img_id', 'img_name', 'img_url', 'template_id')
+    //                                         ;
+    //                                 }
+    //                             ]);
+    //                         }
+    //                     ]);
+    //             }
+    //         ])
+    //         ->get()
+    //         ->all();
+    //     // 通栏类别:1:资讯类:2:广告类;3:混合类;4:搜索框类;5:导航类;6:头条类;
+    //     // 7:轮播图类;8:静态资源类;9:单页(列表)类;10:单页(详情)类;11:列表类;12:详情类;13:栏目轮播图类;',
+    //     // {"max_num": 10, "min_num": 6, "and_type": [6, 7], 
+    //     // "type_max": {"1": 20, "2": 4, "3": 3}, "must_type": [1, 2]}
+    //     $rule = is_array($index_rule) ? $index_rule : (array)$index_rule;
+    //     // return gettype($rule);
+    //     $must_num = count($rule['must_type']);
+    //     $sector_type = array_column($component_img,'sector_type');
+    //     $notmust_sectortype = count(array_diff(array_unique(array_column($component_img,'sector_type')),$rule['must_type']));
+    //     $notmust_num = random_int(0,$notmust_sectortype);
+    //     $min_num = $notmust_sectortype+$must_num;
+    //     $max_num = $rule['max_num'];
+    //     $index_num = random_int($min_num, $max_num);
+    //     $repeat_num = $index_num - $must_num - $notmust_num;
+    //     $category_num = WebsiteCategory::where('website_id',$data['website_id'])
+    //     ->where('is_show',1)
+    //     ->get()
+    //     ->all();
+    //     $category_num = count($category_num);
+    //     // ->count();
+    //     $sectorids = array_column($component_img,'id');
+    //     // $components = SectorComponent::whereIn('sector_component.sectorid',$sectorids)
+    //     //     ->leftJoin('component','component.component_type','sector_component.component_id')
+    //     //     ->select('sector_component.sectorid','sector_component.sort_id','component.component_type','component.type_id')
+    //     //     ->get()
+    //     //     ->all();
+    //     // $num = 0;
+    //     // $sector_ids = [];
+    //     // $sector_sortids = [];
+    //     // foreach($components as $key => $value){
+    //     //     if(!in_array($value['sectorid'],$sector_ids)){
+    //     //         $num = 0;
+    //     //     }
+    //     //     if($value['type_id'] == 7 && !in_array($value['sort_id'],$sector_sortids[$value['sectorid']])){
+    //     //         $num++;
+    //     //     }
+    //     //      $sector_typenum[$value['sectorid']]['num'] = $num;
+    //     //     $sector_typenum[$value['sectorid']][$value['sort_id']] = $num;
+    //     //     $sector_ids[$key] = $value['sectorid'];
+    //     //     $sector_sortids[$value['sectorid']][$key] = $value['sort_id'];
+    //     // }
+    //     foreach($sector_type as $key => $value){
+    //         if($value == 1){
+    //                 $sector_type[$key] = 1;
+    //         }
+    //     }
+    //     return [
+    //         'index_num' => $index_num,
+    //         'min_num' => $min_num,
+    //         '$sector_type' => $sector_type,
+    //         'notmust_sectortype' => $notmust_sectortype,
+    //         'must_num' => $must_num,
+    //         'notmust_num' => $notmust_num,
+    //         'repeat_num' => $repeat_num,
+    //         // '$sector_typenum' => $sector_typenum,
+    //     ];
+    //     // return $component_img;
+    // }
+
 }

+ 4 - 0
app/Model/ComponentImg.php

@@ -26,4 +26,8 @@ class ComponentImg extends Model
     protected array $casts = [];
 
     protected array $guarded = [];
+     public function componentImgs()
+    {
+        return $this->belongsTo(ComponentImg::class, 'component_id', 'component_type');
+    }
 }

+ 13 - 1
app/Model/Sector.php

@@ -24,4 +24,16 @@ class  Sector extends Model
      * The attributes that should be cast to native types.
      */
     protected array $casts = [];
-}
+
+    /**
+     * 定义与 sectorComponents 的关联关系
+     *
+     * @return \Hyperf\Database\Model\Relations\HasMany|\Hyperf\Database\Model\Relations\BelongsTo|\Hyperf\Database\Model\Relations\HasOne
+     * 注意:这里需要根据实际业务确定具体的关联类型,示例中暂未明确指定
+     */
+    public function sectorComponents()
+    {
+        // 请根据实际业务逻辑修改关联类型,如 hasMany、belongsTo、hasOne 等
+        return $this->hasMany(SectorComponent::class, 'sectorid', 'id');
+    }
+}