在采购钉钉任务页展示最新账期供应商负数合计。 Co-authored-by: 苏木 <594326199@qq.com> Co-committed-by: 苏木 <594326199@qq.com>
87 lines
3.0 KiB
PHP
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);
|
|
}
|
|
}
|