Parcourir la source

命名规则关联字段导入,excel导出模板

kely il y a 4 mois
Parent
commit
32e86c3721

+ 65 - 0
app/Exports/NameRuleExport.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Exports;
+
+use App\Models\CustomField;
+use App\Models\Enums\CustomFieldType;
+use App\Models\NamingRule;
+use Maatwebsite\Excel\Concerns\FromCollection;
+use Maatwebsite\Excel\Concerns\WithHeadings;
+
+class NameRuleExport implements FromCollection, WithHeadings
+{
+    public function collection()
+    {
+        $objects = collect([]);
+        $customFields=CustomField::query()->where('group',request()->group)->get();
+        foreach ($customFields as $customField){
+            $key=$customField['key'];
+            $options=$customField->options;
+            $inputs=$customField->inputs;
+            $type=CustomFieldType::from($customField->type)->name;
+            if($customField->type==3){
+                foreach ($options as $option){
+                    $customKey=$option['lang']['en'];
+                    $customValue=$option['value'];
+                    $objects->push($this->formatRow($key,$type,$customKey,$customValue));
+                }
+            }
+
+            if($customField->type==1){
+                foreach ($inputs as $input){
+                    $customKey=$input['lang']['en'];
+                    $customValue=$input['value'];
+                    $objects->push($this->formatRow($key,$type,$customKey,$customValue));
+                }
+            }
+
+            $objects->push($this->formatRow('','','',''));
+
+        }
+
+        return $objects;
+        // TODO: Implement collection() method.
+    }
+
+    protected function formatRow($key,$type,$customKey,$customValue)
+    {
+        return [
+            $key,
+            $type,
+            $customKey,
+            $customValue,
+        ];
+    }
+
+    public function headings(): array
+    {
+        return [
+            'key',
+            'type',
+            'customKey',
+            'customValue',
+        ];
+    }
+}

+ 21 - 0
app/Http/Controllers/API/NameRuleController.php

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers\API;
 
+use App\Exports\DownloadHelper;
+use App\Exports\NameRuleExport;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\NamingRule\AutonameRequest;
 use App\Http\Requests\API\NamingRule\CombinationSettingRequest;
@@ -10,6 +12,7 @@ use App\Http\Requests\API\NamingRule\ParseRequest;
 use App\Http\Resources\API\NamingRuleCombinationResource;
 use App\Http\Resources\API\NamingRuleResource;
 use App\Http\Resources\API\NamingRuleSimpleResource;
+use App\Imports\NameRuleImport;
 use App\Models\Asset;
 use App\Models\CustomField;
 use App\Models\Enums\LibraryType;
@@ -19,9 +22,11 @@ use App\Services\NamingRule\NamingRuleCheck;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
+use Maatwebsite\Excel\Facades\Excel;
 
 class NameRuleController extends Controller
 {
+    use DownloadHelper;
     /**
      * Display a listing of the resource.
      */
@@ -190,4 +195,20 @@ class NameRuleController extends Controller
             'data' => $items,
         ]);
     }
+
+    public function exportCustom(Request $request)
+    {
+        return $this->downloadExcelHelper(
+            new NameRuleExport(),
+            "NameRule",
+            $request->get("extension"),
+        );
+    }
+
+    public function importCustom(Request $request)
+    {
+        Excel::import(new NameRuleImport(), $request->file("file"));
+
+        return $this->created();
+    }
 }

+ 20 - 0
app/Http/Requests/API/CustomField/CreateOrUpdateRequest.php

@@ -2,12 +2,15 @@
 
 namespace App\Http\Requests\API\CustomField;
 
+use App\Http\Requests\RuleHelper;
 use App\Models\Enums\CustomFieldType;
 use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
 use Illuminate\Validation\Rules\Enum;
 
 class CreateOrUpdateRequest extends FormRequest
 {
+    use RuleHelper;
     /**
      * Determine if the user is authorized to make this request.
      */
@@ -35,4 +38,21 @@ class CreateOrUpdateRequest extends FormRequest
             'options' => 'array',
         ];
     }
+
+    public function importRules(): array
+    {
+        return [
+            'naming_rule_id'=>[
+                'required',
+                Rule::exists('naming_rules', 'id')->where($this->userCompanyWhere()),
+            ],
+            'key' => 'required',
+            'type' => [
+                'required',
+                new Enum(CustomFieldType::class),
+            ],
+            'custom_key'=> 'required_if:type,3',
+            'custom_value'=>'required',
+        ];
+    }
 }

+ 76 - 0
app/Imports/NameRuleImport.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Imports;
+
+use App\Http\Requests\API\CustomField\CreateOrUpdateRequest;
+use App\Models\CustomField;
+use App\Models\CustomOptions;
+use Illuminate\Support\Collection;
+use Maatwebsite\Excel\Concerns\ToCollection;
+use Maatwebsite\Excel\Concerns\WithHeadingRow;
+
+class NameRuleImport implements ToCollection, WithHeadingRow
+{
+    use ImportValidatorHelper;
+    public function collection(Collection $collection)
+    {
+        $requestRule = new CreateOrUpdateRequest();
+
+        $this->validatorByCollection($collection,$requestRule->importRules());
+
+        $options=[];
+        $inputs=[];
+        $keys=[];
+
+        //拿到每个key和对应的type去重key
+        foreach ($collection as $item){
+            $key = $item->get('key');
+            $type = $item->get('type');
+            $group = $item->get('naming_rule_id');
+
+            if (!isset($seenKeys[$key])) {
+                $keys[$key] = $type;
+                $seenKeys[$key] = true;
+            }
+        }
+
+        foreach ($keys as $key=>$value){
+            //封装下拉列表或者文本
+            foreach ($collection as $item){
+                if($key == $item->get('key')){
+                    $type=$item->get('type');
+                    $langData=[
+                        'en'=>$item->get('custom_key'),
+                        'zh'=>null,
+                    ];
+                    $valueData = $item->get('custom_value');
+                    $remarkData = $item->get('remark');
+
+                    if($type==1){
+                        $inputs[] =new CustomOptions($langData,$valueData,$remarkData);
+                    }else{
+                        $options[] =new CustomOptions($langData,$valueData,$remarkData);
+                    }
+                }
+            }
+           $formData=[
+               'global'=>0,
+               'group'=>$group,
+               'key'=>$key,
+               'type'=>$value,
+               'options'=>empty($options)?null:$options,
+               'required'=>0,
+               'inputs'=>empty($inputs)?null:$inputs,
+           ];
+            CustomField::query()->updateOrCreate([
+                'group' => $group,
+                'key' => $key,
+                ], $formData);
+            $options=[];
+            $inputs=[];
+        }
+
+    }
+
+
+}

+ 17 - 0
app/Models/CustomOptions.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Models;
+
+class CustomOptions
+{
+    public $lang;
+    public $value;
+    public $remark;
+
+    public function __construct($lang, $value,$remark)
+    {
+        $this->lang = $lang;
+        $this->value = $value;
+        $this->remark=$remark;
+    }
+}

BIN
public/template/import/namingRule.xlsx


+ 5 - 0
routes/api.php

@@ -223,6 +223,11 @@ Route::middleware(['auth:sanctum','account.limit'])->group(function () {
             ->name("name-rule.autoname");
         Route::post("naming-rule/{name_rule}/parse", [API\NameRuleController::class, "parse"])
             ->name("name-rule.parse");
+        Route::get("naming-rule/export/custom", [API\NameRuleController::class, "exportCustom"])
+            ->name("name-rule.export-custom");
+        Route::post("naming-rule/import/custom", [API\NameRuleController::class, "importCustom"])
+            ->name("name-rule.import-custom");
+
 
         Route::get("team-member/{project}", [API\TeamMemberController::class, "members"])->name("team-member.list");
         Route::delete("team-member/{team_member}", [API\TeamMemberController::class, "destroy"])->name("team-member.destroy");