validate([ 'subject_type' => 'required', ]); $subjectType = $request->input('subject_type'); $user = $this->guard()->user(); $include = ['check']; if ($request->input('include')) { $explodes = explode(',', $request->input('include')); $include = array_merge($include, $explodes); } $orderBy = <<<'MySQL' CASE WHEN check_status = 2 THEN 100 ELSE 0 END MySQL; $list = WorkflowLog::with($include) ->whereHas('check', fn ($q) => $q->where('subject_type', $subjectType)) ->own($user) ->where('check_status', '>', CheckStatus::None->value) ->orderBy(DB::raw($orderBy), 'DESC') ->orderBy('id', 'desc') ->paginate($request->input('per_page')); return WorkflowLogResource::collection($list); } public function show($id, Request $request, WorkFlowService $service) { $include = ['check']; if ($request->input('include')) { $explodes = explode(',', $request->input('include')); $include = array_merge($include, $explodes); } $info = WorkflowLog::with($include)->findOrFail($id); // 当前用户是否可以审核 $checkable = false; $user = $this->guard()->user(); if ($user && $info->check_status == CheckStatus::Processing && $service->authCheck($user, $info)) { $checkable = true; } return ['data' => WorkflowLogResource::make($info), 'checkable' => $checkable]; } public function logs($id, Request $request) { $check = WorkflowCheck::findOrFail($id); $logs = $check->logs()->with(['checkUser'])->sort()->get(); return WorkflowLogResource::collection($logs); } public function cancel($id, Request $request, WorkFlowService $workFlowService) { $user = $this->guard()->user(); $check = WorkflowCheck::where('employee_id', $user->id)->findOrFail($id); try { DB::beginTransaction(); if (! $workFlowService->cancel($check)) { throw new RuntimeException($workFlowService->getError()); } DB::commit(); return response('', Response::HTTP_OK); } catch (\Exception $e) { DB::rollBack(); throw new RuntimeException($e->getMessage()); } } public function check($id, Request $request, WorkFlowService $workFlowService) { $request->validate([ 'status' => ['required'], 'remarks' => [Rule::requiredIf(fn () => ! $request->input('status'))], ], [ 'remarks.required_if' => '未通过原因必填', ]); $log = WorkflowLog::findOrFail($id); $user = $this->guard()->user(); try { DB::beginTransaction(); if (! $workFlowService->check($user, $log, (bool) $request->input('status'), ['remarks' => $request->input('remarks')])) { throw new RuntimeException($workFlowService->getError()); } DB::commit(); return response('', Response::HTTP_OK); } catch (\Exception $e) { DB::rollBack(); throw new RuntimeException($e->getMessage()); } } protected function mapResource(string $model) { $class = match ($model) { TaskHygiene::class => TaskResource::class, default => 'App\\Http\\Resources\\'.class_basename($model).'Resource', }; if (! class_exists($class)) { throw new RuntimeException('未知的 subject_type'); } return $class; } }