From e3e68d0aba9008b3ea89703d4ba58a2a57570cb4 Mon Sep 17 00:00:00 2001 From: limeng <1131177064@qq.com> Date: Sun, 11 Oct 2026 11:23:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=AD=BE=E7=BD=B2=EF=BC=9A?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E4=BB=BB=E5=8A=A1=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E4=B8=BB=E5=88=A0=E9=99=A4=E5=B9=B6=E4=BF=9D=E7=95=99=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Business/CourierAgreementSignatures.php | 31 ++-- .../Business/CourierAgreementSignature.php | 21 --- app/Support/CourierQuoteSignatureService.php | 3 + .../agreement-signing.blade.php | 33 ++-- routes/admin.php | 1 + .../CourierAgreementTaskDeletionTest.php | 158 +++++++++++++----- 6 files changed, 152 insertions(+), 95 deletions(-) diff --git a/app/Http/Controllers/Business/CourierAgreementSignatures.php b/app/Http/Controllers/Business/CourierAgreementSignatures.php index 1500f9d5..054150b9 100644 --- a/app/Http/Controllers/Business/CourierAgreementSignatures.php +++ b/app/Http/Controllers/Business/CourierAgreementSignatures.php @@ -310,27 +310,24 @@ class CourierAgreementSignatures extends Controller } public function destroy(Request $request, CourierAgreementSignature $agreementSignature): JsonResponse|RedirectResponse + { + return $this->deleteTask($request, $agreementSignature); + } + + public function destroyQuote(Request $request, CourierQuoteSignature $quoteSignature): JsonResponse|RedirectResponse + { + return $this->deleteTask($request, $quoteSignature); + } + + private function deleteTask(Request $request, CourierAgreementSignature|CourierQuoteSignature $task): JsonResponse|RedirectResponse { $this->ensureCanManage(); - abort_unless($agreementSignature->company_id === (int) company_id(), 404); + abort_unless($task->company_id === (int) company_id(), 404); $request->validate(['delete_confirmed' => ['required', 'accepted']]); - DB::transaction(function () use ($agreementSignature): void { - $signature = CourierAgreementSignature::query()->disableCache()->lockForUpdate()->findOrFail($agreementSignature->id); - abort_unless($signature->canDelete(), 422, '仅可删除未推送成功、已撤销、已过期或已拒签的任务;签署中、已签署或状态不明的任务不能删除。'); - - if (filled($signature->esign_sign_flow_id)) { - abort_unless(EsignClient::configured() - && $signature->environment === config('services.esign.environment', 'sandbox'), 422, '无法核对 E 签宝流程状态,任务未删除。'); - try { - $detail = app(EsignClient::class)->signFlowDetail($signature->esign_sign_flow_id); - } catch (\Throwable) { - throw ValidationException::withMessages(['signature' => 'E 签宝状态查询失败,任务未删除,请稍后重试。']); - } - abort_unless(in_array((string) ($detail['signFlowStatus'] ?? $detail['status'] ?? ''), ['3', '5', '7'], true), 422, 'E 签宝流程尚未结束或已完成签署,任务未删除,请先同步状态。'); - } - - // Keep the original files and callback audit records for traceability. + DB::transaction(function () use ($task): void { + $signature = $task::query()->disableCache()->lockForUpdate()->findOrFail($task->id); + // Soft-delete only the local task, retaining its files, remote flow and audit records. $signature->updated_by = user_id(); $signature->save(); $signature->delete(); diff --git a/app/Models/Business/CourierAgreementSignature.php b/app/Models/Business/CourierAgreementSignature.php index b7e08b98..ce9b63a8 100644 --- a/app/Models/Business/CourierAgreementSignature.php +++ b/app/Models/Business/CourierAgreementSignature.php @@ -119,27 +119,6 @@ class CourierAgreementSignature extends Model && blank($this->esign_sign_flow_id); } - public function canDelete(): bool - { - if ($this->trashed() || $this->completed_at || $this->archived_at - || filled($this->signed_pdf_path) || filled($this->certificate_path) - || in_array((string) $this->remote_status, ['1', '2'], true)) { - return false; - } - - if (blank($this->esign_sign_flow_id)) { - return in_array($this->status, [self::STATUS_PREPARED, self::STATUS_FAILED, self::STATUS_REVOKED, self::STATUS_EXPIRED, self::STATUS_REJECTED], true) - || ($this->status === self::STATUS_UNKNOWN && $this->hasDefinitiveFailure()); - } - - return match ($this->status) { - self::STATUS_REVOKED => $this->remote_status === '3', - self::STATUS_EXPIRED => $this->remote_status === '5', - self::STATUS_REJECTED => $this->remote_status === '7', - default => false, - }; - } - public function documentLabel(): string { return self::DOCUMENTS[$this->document_type]['name'] ?? $this->document_type; diff --git a/app/Support/CourierQuoteSignatureService.php b/app/Support/CourierQuoteSignatureService.php index c9bf7b2e..9852b546 100644 --- a/app/Support/CourierQuoteSignatureService.php +++ b/app/Support/CourierQuoteSignatureService.php @@ -20,6 +20,9 @@ final class CourierQuoteSignatureService public function prepareVersion(CourierQuoteVersion $version, int $userId, ?string $signatureDate = null): CourierQuoteSignature { + if (CourierQuoteSignature::onlyTrashed()->where('quote_version_id', $version->id)->exists()) { + throw ValidationException::withMessages(['signature' => '该报价版本的签署任务已删除,请使用新报价版本发起新的签署任务。']); + } $existing = $version->signature; if ($signatureDate === null && $existing && $this->sourcePdfIsIntact($existing)) { diff --git a/resources/views/business/pages/courier-payables/agreement-signing.blade.php b/resources/views/business/pages/courier-payables/agreement-signing.blade.php index b92627a5..20d2449b 100644 --- a/resources/views/business/pages/courier-payables/agreement-signing.blade.php +++ b/resources/views/business/pages/courier-payables/agreement-signing.blade.php @@ -1397,7 +1397,7 @@ @foreach ($agreementQuoteSignatures as $quoteSignature) @php($quoteVersion = $quoteSignature->version) @php($quoteError = $quoteSignature->lastErrorSummary()) -
删除后,此任务将从列表移除,可重新发起签章。原文件和操作记录保留备查。
+确认后,此任务将从本系统的全部列表移除。原文件和操作记录保留备查。
+删除本系统任务不会撤销或终止 E 签宝上的签署流程,已签署文件仍然有效。是否删除请自行核对。