Browse Source

审批列表和详细加载字对象

moell 4 months ago
parent
commit
9bd2dd36fd

+ 11 - 1
app/Http/Controllers/API/ApprovalController.php

@@ -8,6 +8,8 @@ use App\Http\Requests\API\Approval\CreateOrUpdateRequest;
 use App\Http\Resources\API\ActionByApprovalLogResource;
 use App\Http\Resources\API\ApprovalCollection;
 use App\Http\Resources\API\ApprovalFlowDetailResource;
+use App\Http\Resources\API\FileDownloadResource;
+use App\Http\Resources\API\FileSimpleResource;
 use App\Http\Resources\API\UserProfileResource;
 use App\Models\Action;
 use App\Models\Approval;
@@ -17,6 +19,7 @@ use App\Models\Enums\ApprovalFlowType;
 use App\Models\Enums\ApprovalObjectType;
 use App\Models\Enums\ObjectAction;
 use App\Models\Enums\ObjectApprovalStatus;
+use App\Models\File;
 use App\Repositories\ActionRepository;
 use App\Services\Approval\ActionService;
 use App\Services\Approval\StoreService;
@@ -41,7 +44,7 @@ class ApprovalController extends Controller
         };
 
         $approvals = $query->filter($request->all())->orderByDesc("created_at")->paginate($pageSize);
-        make_display_id($approvals,$pageSize);
+
         return new ApprovalCollection($approvals);
     }
 
@@ -83,6 +86,12 @@ class ApprovalController extends Controller
             'additional_id' => $approval->id,
         ])->orderByDesc("created_at")->get();
 
+        $subObjects = [];
+        if ($approvalObjectType == ApprovalObjectType::CONTAINER_FILE && $approval->sub_object_ids) {
+            $containerFiles = File::query()->whereIn("id", $approval->sub_object_ids)->get();
+            $subObjects = FileDownloadResource::collection($containerFiles);
+        }
+
         return $this->success([
             'data' => [
                 'id' => $approval->id,
@@ -98,6 +107,7 @@ class ApprovalController extends Controller
                 'created_by' => new UserProfileResource($approval->createdBy),
                 'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow),
                 'approval_logs' => ActionByApprovalLogResource::collection($actions),
+                'sub_objects' => $subObjects,
             ]
         ]);
     }

+ 44 - 5
app/Http/Resources/API/ApprovalCollection.php

@@ -3,9 +3,11 @@
 namespace App\Http\Resources\API;
 
 use App\Models\Enums\ApprovalObjectType;
+use App\Models\File;
 use App\Models\User;
 use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\ResourceCollection;
+use Illuminate\Support\Collection;
 
 class ApprovalCollection extends ResourceCollection
 {
@@ -21,14 +23,15 @@ class ApprovalCollection extends ResourceCollection
      */
     public function toArray(Request $request): array
     {
-        $usersId=make_array_list($this->users??'');
-        $approvalUsers=User::query()->whereIn('id',$usersId)->get();
         $groupObjects = $this->getGroupObjects();
 
+        $containerFiles = $this->getContainerFiles();
+
         $items = [];
         foreach ($this->resource as $approval) {
             $usersId=make_array_list($approval->users??'');
-            $approvalUsers=User::query()->whereIn('id',$usersId)->get();
+            $approvalUsers=User::query()->whereIn('id', $usersId)->get();
+
             $items[] = [
                 'id' => $approval->id,
                 'status' => $approval->status,
@@ -37,17 +40,53 @@ class ApprovalCollection extends ResourceCollection
                 'node_level' => $approval->node_level,
                 'created_by' => new UserProfileResource($approval->createdBy),
                 'display_id' => $approval->display_id,
-                'approval_user'=>UserProfileResource::collection($approvalUsers),
+                'approval_user' => UserProfileResource::collection($approvalUsers),
                 'object' => [
                     'id' => $approval->object_id,
                     'name' => data_get($groupObjects, sprintf("%s.%s", $approval->object_type, $approval->object_id)),
-                ]
+                ],
+                'sub_objects' => $this->getSubContainerFiles($containerFiles, $approval->sub_object_ids),
             ];
         }
 
         return $items;
     }
 
+    protected function getSubContainerFiles(Collection $files, ?array $fileIds = null)
+    {
+        if (! $fileIds) {
+            return [];
+        }
+
+        $items = [];
+        foreach ($fileIds as $fileId) {
+            if ($files->has($fileId)) {
+                $items[] = $files->get($fileId);
+            }
+        }
+
+        return FileSimpleResource::collection($items);
+    }
+
+    protected function getContainerFiles(): \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection|array
+    {
+        $result = $this->resource->where("object_type", ApprovalObjectType::CONTAINER_FILE->value)->pluck("sub_object_ids");
+
+        $files = collect([]);
+        $fileIds = [];
+        foreach ($result as $item) {
+            if (is_array($item)) {
+                $fileIds = [...$fileIds, ...$item];
+            }
+        }
+
+        if (! $fileIds) {
+            return $files;
+        }
+
+        return File::query()->whereIn("id", $fileIds)->get()->keyBy("id");
+    }
+
     protected function getGroupObjects(): array
     {
         $groupObjects = [];

+ 26 - 0
app/Http/Resources/API/FileSimpleResource.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Support\Facades\Storage;
+
+class FileSimpleResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'title' => $this->title,
+            'extension' => $this->extension,
+            'size' => $this->size,
+            'version' => $this->version,
+        ];
+    }
+}