From 6911dd98a76e9c55fe81264b6c200acd342e8dba Mon Sep 17 00:00:00 2001 From: zhangshy <994452054@qq.com> Date: Fri, 11 Sep 2026 11:42:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AF=81=E6=8D=AE?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=AE=A1=E8=AE=A1=E5=B9=B6=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=93=8D=E4=BD=9C=E6=8F=90=E7=A4=BA=E8=A6=81?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/service/risk_evidence_archive_service.py | 2 + .../17-前端合并提示词与验收约束.md | 78 ++++++++++++++++++- .../test_risk_evidence_archive_service.py | 1 + 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index d1ef047..499053a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ __pycache__/ .coverage htmlcov/ coverage.xml +storage/ build/ dist/ *.log diff --git a/app/service/risk_evidence_archive_service.py b/app/service/risk_evidence_archive_service.py index be270e7..bbddb99 100644 --- a/app/service/risk_evidence_archive_service.py +++ b/app/service/risk_evidence_archive_service.py @@ -9,6 +9,7 @@ from __future__ import annotations import io import os import re +from datetime import UTC, datetime from hashlib import sha256 from pathlib import Path from uuid import uuid4 @@ -129,6 +130,7 @@ class RiskEvidenceArchiveService: "file_size": len(content), "sha256": sha256(content).hexdigest(), }, + created_at=datetime.now(UTC).replace(tzinfo=None), )) await self.session.commit() committed = True diff --git a/docs/风控业务演示文档/17-前端合并提示词与验收约束.md b/docs/风控业务演示文档/17-前端合并提示词与验收约束.md index ad49c89..2c26414 100644 --- a/docs/风控业务演示文档/17-前端合并提示词与验收约束.md +++ b/docs/风控业务演示文档/17-前端合并提示词与验收约束.md @@ -91,7 +91,78 @@ - SSE 需要处理 `start`、`tools`、`delta`、`replace`、`done` 和 `error`。 - 断线重连后根据 `run_id` 恢复最终结果。 -## 六、验收要求 +## 六、预警操作结果提示 + +本节要求不依赖后端修改,前端根据当前接口响应统一实现操作成功和失败提示。 + +### 成功提示 + +操作返回 HTTP 2xx 后,根据操作类型显示对应提示: + +| 操作 | 提示 | +|---|---| +| 确认接收 | 预警已确认接收 | +| 进入调查 | 已进入调查 | +| 关闭误报 | 已关闭误报 | +| 完成结案 | 预警已完成结案 | +| 升级处理 | 预警已升级 | +| 上传证据 | 证据上传成功 | +| 手动扫描 | 预警扫描完成 | +| 生成日报 | 日报生成完成 | +| 邮件发送 | 日报发送成功 | + +### 失败提示 + +失败时优先读取主项目统一错误信封: + +```json +{ + "error": { + "code": "AGENT_PERMISSION_DENIED", + "message": "缺少操作权限" + } +} +``` + +前端统一按以下顺序解析: + +```text +error.message +-> HTTP 状态码映射 +-> 通用失败提示 +``` + +推荐映射: + +| 状态或错误码 | 提示 | +|---|---| +| `401 AUTHENTICATION_REQUIRED` | 登录已失效,请重新登录 | +| `403 AGENT_PERMISSION_DENIED` | 没有当前操作权限 | +| `404` | 预警不存在或无权查看 | +| `409` | 当前状态不允许该操作 | +| `413` | 文件超过大小限制 | +| `422` | 提交内容不符合要求 | +| `500` | 系统异常,请稍后重试 | +| `503/504` | 服务暂时不可用 | + +### 组合操作 + +“完成处置并上传证据”必须分别提示: + +- 文件上传成功、结案失败:提示“证据已上传,结案失败”,不重复上传文件。 +- 文件上传失败、结案未执行:提示上传失败,保留弹窗填写内容。 +- 结案成功、页面刷新失败:继续提示结案成功,再单独刷新列表或详情。 +- 重复操作返回 409:刷新预警详情,提示“预警可能已处理,请核对状态”。 + +### 交互要求 + +- 操作进行中禁用重复点击,并显示进行中状态。 +- 成功或失败必须使用主项目统一的消息、Toast 或通知组件。 +- 不能只用控制台日志代替用户提示。 +- 弹窗关闭前必须明确操作结果。 +- 不使用浏览器原生 `alert` 作为正式交互方案。 + +## 七、验收要求 后续模型完成前端后必须提供: @@ -103,7 +174,7 @@ 6. 权限按钮与服务端权限一致。 7. 不直接修改风控业务规则和数据库结构。 -## 七、可直接交给后续模型的提示词 +## 八、可直接交给后续模型的提示词 ```text 你正在把风控模块前端合并到主项目中。开始写代码前必须完成以下工作: @@ -129,6 +200,8 @@ - 预警队列按风险等级优先排序,行高固定,内容过长省略。 - 确认接收需要二次确认,误报必须填写理由。 - Agent 对话必须使用主项目 Agent Run 和 SSE,不新建私有协议。 +- 所有预警操作必须实现成功和失败提示;后端不修改,前端解析统一错误信封并按操作类型生成提示。 +- 完成处置并上传证据时,必须分别处理上传和结案的成功、失败及部分成功场景。 - 页面权限和按钮可见性必须由后端权限和 roles/permissions 决定。 - 不修改公共底座,不新增启动顺序和访问地址,不生成演示数据。 @@ -139,4 +212,3 @@ - 文字无重叠、无溢出、无布局抖动。 - 风控功能与主项目其他模块边界清晰。 ``` - diff --git a/tests/unit/service/test_risk_evidence_archive_service.py b/tests/unit/service/test_risk_evidence_archive_service.py index 5b622ae..f2cb798 100644 --- a/tests/unit/service/test_risk_evidence_archive_service.py +++ b/tests/unit/service/test_risk_evidence_archive_service.py @@ -106,6 +106,7 @@ async def test_archive_success_updates_snapshot_and_audit() -> None: assert item.evidence_snapshot["evidence_archive"]["file_size"] == len(PNG) assert session.committed is True assert session.added[0].action_type == "risk_evidence_archived" + assert session.added[0].created_at is not None @pytest.mark.asyncio