allowed()->filter($request->all())->paginate(); $foldsCount = Folder::query() ->where('object_type','container') ->where('parent_id',0) ->whereIn("object_id", $containers->pluck("id")->toArray()) ->selectRaw("count(*) as cut, object_id") ->groupBy("object_id") ->pluck("cut", "object_id"); $fileCount = File::query() ->where('object_type','container') ->whereIn('object_id',$containers->pluck("id")->toArray()) ->where("folder_id", 0) ->where("is_latest_version", 1) ->selectRaw("count(*) as cut, object_id") ->groupBy("object_id") ->pluck("cut", "object_id"); $containers = $containers->map(function (Container $container) use ($foldsCount,$fileCount) { $container->itemCount =$foldsCount->get($container->id, 0)+$fileCount->get($container->id, 0); $container->type = 'container'; $container->uniId = $container->type . '_' . $container->id; return $container; }); return $this->success([ 'data' => $containers ]); //return ContainerResource::collection($containers); } /** * Store a newly created resource in storage. */ public function store( CreateOrUpdateRequest $request, ImageUrlService $imageUrlService, FileAssociationService $service, CustomFieldRepository $customFieldRepo ) { $formData = [ ...$request->all(), 'company_id' => Auth::user()->company_id, 'created_by' => Auth::id(), 'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null, ]; $service->check( $request->get("file_ids", []), FileObjectType::CONTAINER, $request->get("file_uuid"), ); if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) { $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id")); $formData['naming_rules'] = $request->only($keys); } $container = new Container(); $container->mergeFillable(['company_id', 'created_by']); $container->fill($formData); $container->save(); $service->association($container->id); $files = File::query()->where('object_id', $container->id) ->where('object_type', ActionObjectType::CONTAINER) ->where('source', 1) ->pluck("id") ->sort(); $contentFormData = [ 'description' => $imageUrlService->interceptImageUrl($request->description), 'container_id' => $container->id, 'created_by' => Auth::id(), 'name' => $request->name, 'files' => $files->implode(",") ?: null ]; ContainerContent::query()->create($contentFormData); ActionRepository::createByContainer($container, ObjectAction::CREATED); return $this->created(); } /** * Display the specified resource. */ public function show(string $id) { $container = Container::query()->allowed() ->when(\request("version") > 0, fn($query) => $query->where("version", ">=", \request("version"))) ->findOrFail($id); return new ContainerDetailResource($container); } /** * Update the specified resource in storage. */ public function update( CreateOrUpdateRequest $request, ImageUrlService $imageUrlService, CustomFieldRepository $customFieldRepo, string $id ) { $container = Container::query()->allowed()->findOrFail($id); $formData = [ ...$request->all(), 'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null, 'description' => $imageUrlService->interceptImageUrl($request->description) , ]; if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) { $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id")); $formData['naming_rules'] = $request->only($keys); } $container->fill($formData); $changes = ModelChangeDetector::detector(ActionObjectType::CONTAINER, $container); $files = File::query()->where('object_id', $container->id) ->where('object_type', ActionObjectType::CONTAINER) ->where('source', 1) ->pluck("id") ->sort(); $contentFormData = [ 'description' => $imageUrlService->interceptImageUrl($request->description), 'name' => $request->name, 'files' => $files->implode(",") ?: null ]; $containerContent = $container->content; $containerContent->fill($contentFormData); $contentChange = ModelChangeDetector::detector(ActionObjectType::CONTAINER_CONTENT, $containerContent); if ($contentChange) { $container->version++; $changes = array_merge($changes, $contentChange); ContainerContent::query()->create([ ...$contentFormData, 'container_id' => $container->id, 'created_by' => Auth::id(), 'version' => $container->version, ]); } $container->save(); ActionRepository::createByContainer($container, ObjectAction::EDITED, objectChanges: $changes); return $this->noContent(); } /** * Remove the specified resource from storage. */ public function destroy(string $id) { $container = Container::query()->allowed()->findOrFail($id); $container->delete(); Approval::query()->where('object_type','container')->where('object_id',$id)->delete(); ActionRepository::createByContainer($container, ObjectAction::DELETED); return $this->noContent(); } public function linkage(string $libraryId) { $items = Container::query()->allowed()->where("library_id", $libraryId)->get(['id', 'name'])->each(function ($items) { // 设置固定的type值 $items->type = 'container'; $items->uniId=$items->type.'_'.$items->id; }); return $this->success([ 'data' => $items ]); } public function attachments(Request $request){ $folderObjectType = FileObjectType::from($request->object_type); $object=$folderObjectType->modelBuilderAllowed()->findOrFail($request->object_id); if($folderObjectType->value==='asset'){ $requirementsId=$object->requirements->pluck('id'); if(!$requirementsId->isEmpty()){ $file=File::query()->where('object_type','requirement') ->whereIn('object_id',$requirementsId) ->where('is_latest_version',1) ->where('source',1) ->get(); return FileByObjectResource::collection($file); } }else if($folderObjectType->value==='project'){ $tasksId=$object->tasks->pluck('id'); if(!$tasksId->isEmpty()){ $file=File::query()->where('object_type','task') ->whereIn('object_id',$tasksId) ->where('is_latest_version',1) ->where('source',1) ->get(); return FileByObjectResource::collection($file); } } return $this->noContent(); } public function containerReport(){ $companyId=Auth::user()->company_id; $librarys=Library::query()->where('company_id',$companyId)->withCount('container') ->get(['id', 'name', 'created_at', 'updated_at', 'container_count as container_count']); $libraryCount=$librarys->count(); $containerCount = $librarys->sum('container_count'); $MyLibrarys=Library::query()->allowed()->orderBy('updated_at', 'desc')->get(['id', 'name', 'type','created_at', 'updated_at']); $MyContainers = Container::query()->allowed()->orderBy('updated_at', 'desc')->get( ['id', 'name','library_id', 'created_at', 'updated_at']); return $this->success([ 'data' =>[ 'libraryCount'=>$libraryCount, 'containerCount'=>$containerCount, 'MyLibrarysCount'=>$MyLibrarys->count(), 'MyContainersCount'=>$MyContainers->count(), 'MyContainers'=>ContainerReportResource::collection($MyContainers), 'MyLibrarys'=>LibraryReportResource::collection($MyLibrarys) ] ]); } }