resolve($token); if ($assignment === null) { return $this->unavailable(); } $snapshot = json_decode((string) $assignment->snapshot, true); $snapshot = is_array($snapshot) ? array_values($snapshot) : []; return view('business.pages.negative-alerts.dingtalk-task', [ 'assignment' => $assignment, 'suppliers' => $snapshot, 'latestPeriod' => $this->workflow->latestPeriodSummary($snapshot), 'supplierResults' => $this->workflow->resultsForAssignment((int) $assignment->id), 'token' => $token, ]); } public function update(Request $request, string $token): RedirectResponse|Response { $assignment = $this->resolve($token); if ($assignment === null) { return $this->unavailable(); } $snapshot = json_decode((string) $assignment->snapshot, true); $supplierCount = is_array($snapshot) ? count($snapshot) : 0; $data = $request->validate([ 'results' => ['required', 'array', 'size:' . $supplierCount], 'results.*' => ['required', 'string', 'max:2000'], ], [ 'results.required' => '请为每个供应商填写处理结果。', 'results.size' => '请为每个供应商填写处理结果。', 'results.*.required' => '请为每个供应商填写处理结果。', 'results.*.max' => '单个供应商的处理结果不能超过 2000 个字符。', ]); try { $this->workflow->submit($token, array_values((array) $data['results'])); } catch (ValidationException $exception) { throw $exception; } return redirect() ->route('supplier-negative-alert.task', ['token' => $token]) ->with('negative_alert_success', '处理结果已回传财务系统,可以继续修改并再次提交。'); } private function resolve(string $token): ?object { $assignment = $this->workflow->findByToken($token); if ($assignment === null) { return null; } Company::find($assignment->company_id)?->makeCurrent(); return $assignment; } private function unavailable(): Response { return response()->view('business.pages.negative-alerts.dingtalk-task-unavailable', [], 404); } }