Browse Source

任务导入、excel导出模板

moell 8 months ago
parent
commit
38704be143

+ 10 - 1
app/Http/Controllers/API/TaskController.php

@@ -12,6 +12,7 @@ use App\Http\Requests\API\Task\CreateOrUpdateRequest;
 use App\Http\Requests\API\Task\LinkContainerRequest;
 use App\Http\Resources\API\TaskDetailResource;
 use App\Http\Resources\API\TaskResource;
+use App\Imports\TaskImport;
 use App\Models\Container;
 use App\Models\Enums\ActionObjectType;
 use App\Models\Enums\FileObjectType;
@@ -30,6 +31,7 @@ use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Validator;
+use Maatwebsite\Excel\Facades\Excel;
 
 class TaskController extends Controller
 {
@@ -70,7 +72,7 @@ class TaskController extends Controller
         $isAction=true;
         $projectId=$request->get("project_id");
         $project = Project::allowed($projectId,$isAction)->find($projectId);
-        if($project==null){
+        if($project == null){
             return $this->badRequest('Permission denied or project not found. Please contact the administrator.');
         };
 
@@ -108,6 +110,13 @@ class TaskController extends Controller
         return $this->created();
     }
 
+    public function import(Request $request)
+    {
+        Excel::import(new TaskImport(), $request->file("file"));
+
+        return $this->created();
+    }
+
     /**
      * Display the specified resource.
      */

+ 32 - 14
app/Http/Requests/API/Task/CreateOrUpdateRequest.php

@@ -31,7 +31,38 @@ class CreateOrUpdateRequest extends FormRequest
      */
     public function rules(): array
     {
-        $rules =  [
+        $rules = $this->generalRules();
+
+        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage', "state", "suitability"]);
+
+        if ($this->has("naming_rule_id") && $this->get("naming_rule_id") > 0) {
+            $this->namingRuleCheck($this->get("naming_rule_id"));
+
+            $namingRules = $this->customFieldRuleByGroup($this->get("naming_rule_id"));
+
+            $rules = [...$rules, ... $namingRules];
+        }
+
+        return [
+            ...$rules,
+            ...$taskRules
+        ];
+
+    }
+
+    public function importRules()
+    {
+        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage', "state", "suitability"], 'label');
+
+        return [
+            ...$this->rules(),
+            ...$taskRules,
+        ];
+    }
+
+    public function generalRules(): array
+    {
+        return [
             'project_id' => [
                 'required',
                 Rule::exists('projects', 'id')->where($this->userCompanyWhere()),
@@ -83,18 +114,5 @@ class CreateOrUpdateRequest extends FormRequest
                 }
             ],
         ];
-
-        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage', "state", "suitability"]);
-
-        if ($this->has("naming_rule_id") && $this->get("naming_rule_id") > 0) {
-            $this->namingRuleCheck($this->get("naming_rule_id"));
-
-            $namingRules = $this->customFieldRuleByGroup($this->get("naming_rule_id"));
-
-            $rules = [...$rules, ... $namingRules];
-        }
-
-        return [...$rules, ...$taskRules];
-
     }
 }

+ 33 - 4
app/Http/Requests/CustomFieldRuleHelper.php

@@ -8,7 +8,24 @@ use Illuminate\Validation\Rule;
 
 trait CustomFieldRuleHelper
 {
-    protected function customFieldRuleByGroup(string $group, array $keys = []): array
+    protected array $groupLabelValue = [];
+
+    public function getGroupLabelValue(string $group, string $key, string $label = null)
+    {
+        if (! $label) {
+            return null;
+        }
+
+        return $this->groupLabelValue[$group][$key][$label] ?? null;
+    }
+
+    /**
+     * @param string $group
+     * @param array $keys
+     * @param string $inField value,label
+     * @return array
+     */
+    protected function customFieldRuleByGroup(string $group, array $keys = [], string $inField = "value"): array
     {
         $customFields = CustomField::query()
             ->where("group", $group)
@@ -19,7 +36,7 @@ trait CustomFieldRuleHelper
 
         $rules = [];
         foreach ($customFields as $customField) {
-            $rule = $this->customFieldToRule($customField);
+            $rule = $this->customFieldToRule($customField, $inField);
             if (! $rule) {
                 continue;
             }
@@ -30,17 +47,29 @@ trait CustomFieldRuleHelper
         return $rules;
     }
 
-    protected function customFieldToRule(CustomField $customField): array
+    protected function customFieldToRule(CustomField $customField, string $inField = "value"): array
     {
         $rule = [];
         if ($customField->required  == 1) {
             $rule[] = "required";
         }
 
+        $inOptions = [];
+        if ($inField == "value") {
+            $inOptions = array_column($customField->options, "value");
+        } else {
+            foreach ($customField->options as $option) {
+                foreach ($option['lang'] as $label) {
+                    $inOptions[] = $label;
+                    $this->groupLabelValue[$customField->group][$customField->key][$label] = $option['value'];
+                }
+            }
+        }
+
         $typeRule = match (CustomFieldType::tryFrom($customField->type)) {
             CustomFieldType::TEXT => "string",
             CustomFieldType::TEXTAREA => "string",
-            CustomFieldType::SELECT => $customField->options ? Rule::in(array_column($customField->options, "value")) : "",
+            CustomFieldType::SELECT => $customField->options ? Rule::in($inOptions) : "",
             CustomFieldType::NUMBER => "numeric",
             default => ""
         };

+ 41 - 0
app/Imports/TaskImport.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Imports;
+
+use App\Http\Requests\API\Task\CreateOrUpdateRequest;
+use App\Models\Enums\ObjectAction;
+use App\Models\Task;
+use App\Repositories\ActionRepository;
+use Illuminate\Support\Facades\Auth;
+use Maatwebsite\Excel\Concerns\ToCollection;
+use Maatwebsite\Excel\Concerns\WithHeadingRow;
+use Illuminate\Support\Collection;
+
+class TaskImport implements ToCollection, WithHeadingRow
+{
+    use ImportValidatorHelper;
+
+    public function collection(Collection $collection): void
+    {
+        $requestRule = new CreateOrUpdateRequest();
+
+        $this->validatorByCollection($collection, $requestRule->importRules());
+
+        foreach ($collection as $item) {
+            $formData = [
+                ...$item->all(),
+                'company_id' => Auth::user()->company_id,
+                'created_by' => Auth::id(),
+                'task_type' => $requestRule->getGroupLabelValue("task", "task_type", $item->get("task_type")),
+                'doc_type' => $requestRule->getGroupLabelValue("task", "doc_type", $item->get("doc_type")),
+                'doc_stage' => $requestRule->getGroupLabelValue("task", "doc_stage", $item->get("doc_stage")),
+                'state' => $requestRule->getGroupLabelValue("task", "state", $item->get("state")),
+                'suitability' => $requestRule->getGroupLabelValue("task", "suitability", $item->get("suitability")),
+            ];
+
+            $task = Task::create($formData);
+
+            ActionRepository::createByTask($task, ObjectAction::CREATED);
+        }
+    }
+}

BIN
public/template/import/requirement.xlsx


BIN
public/template/import/task.xlsx


+ 1 - 0
routes/api.php

@@ -143,6 +143,7 @@ Route::middleware(['auth:sanctum','account.limit'])->group(function () {
         Route::delete("task-container/{task_container}", [API\TaskController::class, "unlinkContainer"])->name("task.unlink-container");
         Route::get("task/{task}/container-to-be-linked", [API\TaskController::class, "containerToBeLinked"])->name("task.container-to-be-linked");
         Route::get("task-export", [API\TaskController::class, "export"])->name("task.export");
+        Route::post("task-import", [API\TaskController::class, "import"])->name("task.import");
 
         Route::post("user/user-batch-create", [API\UserController::class, "batchStore"])->name("user.batch-create");
         Route::put("user/status/{status}", [API\UserController::class, "status"])->name("user.status");