CaiWuXiTong/app/Http/Controllers/Business/SupplierNegativeAlertDingTalkForms.php
苏木 75d63602ad feat: 展示负数预警最新账期合计 (#741)
在采购钉钉任务页展示最新账期供应商负数合计。
Co-authored-by: 苏木 <594326199@qq.com>
Co-committed-by: 苏木 <594326199@qq.com>
2026-10-28 16:19:00 +08:00

87 lines
3.0 KiB
PHP

<?php
namespace App\Http\Controllers\Business;
use App\Models\Common\Company;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Illuminate\Validation\ValidationException;
use Illuminate\View\View;
use Modules\EcommerceFinance\Services\SupplierNegativeAlertDingTalkWorkflow;
class SupplierNegativeAlertDingTalkForms extends Controller
{
public function __construct(
private readonly SupplierNegativeAlertDingTalkWorkflow $workflow,
) {
}
public function show(string $token): View|Response
{
$assignment = $this->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);
}
}