get('page_size') ?? 50; $approvalFlows = ApprovalFlow::query()->with(['createdBy']) ->when($request->type, fn($query) => $query->where("type", $request->type)) ->orderByDesc("id")->paginate($pageSize); return ApprovalFlowResource::collection($approvalFlows); } public function store(CreateOrUpdateRequest $request) { if ($request->nodes){ $nodes = $this->getNewApprovalNodes($request->nodes['childNode'],1); } // $nodes = $this->getApprovalNodes($request); $limitObject = $request->get("object_type") && $request->get("object_id") && in_array($request->get("type"), [ApprovalFlowType::TASK->value]); $exists = ApprovalFlow::query()->where("type", $request->type) ->where("company_id", Auth::user()->company_id)->where('name',$request->name) ->count(); throw_validation_if($exists && !isset($request->nodes), "Please do not add repeatedly."); $approvalFlow = new ApprovalFlow(); $approvalFlow->mergeFillable([ 'company_id', 'type' ]); $approvalFlow->fill([ ...$request->all(), 'object_id' => $limitObject ? $request->object_id : 0, 'company_id' => Auth::user()->company_id, 'created_by' => Auth::id(), ]); if (!$exists){ $approvalFlow->save(); }else{ ApprovalFlow::query()->where("company_id", Auth::user()->company_id)->where('name',$request->name)->update([ 'nodes'=>$nodes ??[], 'nodes_config'=>json_encode($request->nodes??[]) ]); } return $this->noContent(); } protected function getNewApprovalNodes($nodeList = array(),$level = 1){ $users = $nodeList['nodeUserList'] ? array_column($nodeList['nodeUserList'],'targetId') : []; $node = ['name'=>$nodeList['nodeName'],'level'=>$level,'approval_mode'=>'1','approval_users'=>$users]; $nodes[$level] = $node; if (is_array($nodeList['childNode'])){ $node = $this->getNewApprovalNodes($nodeList['childNode'],$level+1); $nodes = $nodes + $node; } return $nodes; } protected function getApprovalNodes(Request $request) { $nodes = []; foreach ($request->nodes as $node) { $userCount = User::query()->whereIn("id", $node['approval_users'])->count(); throw_validation_if($userCount != count($node['approval_users']), "The selected approver does not exist"); $nodes[$node['level']] = collect($node)->only(['name', 'approval_users', 'approval_mode', 'level'])->toArray(); } throw_validation_if(max(array_keys($nodes)) != count($nodes), "The level field is incorrect"); return $nodes; } public function update(CreateOrUpdateRequest $request, string $id) { $approvalFlow = ApprovalFlow::query()->findOrFail($id); $nodes = $this->getApprovalNodes($request); $nodeIsChange = false; if (count($nodes) != count($approvalFlow->nodes)) { $nodeIsChange = true; } else { foreach ($approvalFlow->nodes as $node) { $oldNodeUsers = $node['approval_users']; $nowNodeUsers = $nodes[$node['level']]['approval_users']; sort($oldNodeUsers); sort($nowNodeUsers); if (implode(',', $oldNodeUsers) != implode(',', $nowNodeUsers) || $node['approval_mode'] != $nodes[$node['level']]['approval_mode'] ) { $nodeIsChange = true; break; } } } if ($nodeIsChange) { $newApprovalFlow = new ApprovalFlow(); $newApprovalFlow->mergeFillable([ 'company_id', 'type', ]); $newApprovalFlow->fill([ 'name' => $request->name, 'type' => $approvalFlow->type, 'object_type' => $approvalFlow->object_type, 'object_id' => $approvalFlow->object_id, 'company_id' => Auth::user()->company_id, 'created_by' => Auth::id(), 'nodes' => $nodes, ]); $newApprovalFlow->save(); $approvalFlow->delete(); return $this->noContent(); } else { $approvalFlow->name = $request->name; $approvalFlow->nodes = $nodes; $approvalFlow->save(); } //return new ApprovalFlowDetailResource($approvalFlow); return $this->noContent(); } public function show(string $id) { $approvalFlow = ApprovalFlow::query()->findOrFail($id); return new ApprovalFlowDetailResource($approvalFlow); } public function destroy(string $id) { $approvalFlow = ApprovalFlow::query()->findOrFail($id); $approvalFlow->delete(); return $this->noContent(); } }