feat(api): 更新代销平台 API v0.1,增强适当性检查功能

- 在 `risk_suitability_log` 表中新增 `check_source` 枚举值 `platform`,支持代销平台的适当性检查。
- 更新相关 SQL 脚本以适应新的数据结构,确保数据一致性。
- 修改文档以反映 API 的最新状态和测试基线,确保文档与实现保持一致。
- 测试基线更新至 530 passed, 0 skipped,确保系统稳定性。

此更新为代销平台提供了更全面的适当性检查能力,提升了系统的功能性与可维护性。
This commit is contained in:
2026-09-08 21:44:16 +08:00
parent ef56c56435
commit c9cac1cdf9
20 changed files with 204 additions and 32 deletions
+1 -1
View File
@@ -25,7 +25,7 @@
- **内部分析**:SQL 或 IT 导表。
- **风控**:事后/T+1 发现异常;适当性靠交易前规则;AML 批处理或人工。
Agent **尚未上线**;后端风控全链路 + Wave 0 共用底座已在 **`merger` 分支**集成(AL-09 完成,502 pytest 绿):事件线 B1~B9b · 对话线 C1~C6 · 知识库 T-21 · chat sessions/stream;客户/代理人/分析 Agent 仍为 chat 骨架,无独立业务 Tool;无生产接入。
Agent **尚未上线**;后端风控全链路 + Wave 0 共用底座 + 代销平台 API v0.1 已在 **`merger` 分支**集成(AL-09 完成,**530 pytest 绿**):事件线 B1~B9b · 对话线 C1~C6 · 知识库 T-21 · chat sessions/stream · 平台 REST v0.1;客户/代理人/分析 Agent 仍为 chat 骨架,无独立业务 Tool;无生产接入。
------
+3 -3
View File
@@ -33,7 +33,7 @@
⑥ 验证
uvicorn app.main:app --reload
GET http://127.0.0.1:8000/health → {"status":"ok"}
python -m pytest → 502 passed 1 skipped(改路由必同步 test_all_routers_mounted)
python -m pytest → 530 passed 0 skipped(改路由必同步 test_all_routers_mounted)
RBAC 联调账号:scripts/dev/rbac-seed-reference.md
```
@@ -48,11 +48,11 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md
Client → Gateway(JWT/RBAC) → api/chat → agent_service(LangGraph) → Tools → 存储 → 响应 + audit_log
```
当前:**风控全链路 + Wave 0 共用底座 + AL-09 合并接线已完成(2026-09-08,`merger` 分支)**——B1~B9b 事件线 · C1~C6 对话/追加需求(FR-8/9/10)· 前端接入 B/C(sessions/stream)· T-03/T-04/T-21 · JWT 统一 + auth_adapter 接缝。**测试基线:`python -m pytest` → 502 passed 1 skipped**(含 `test_module_boundary` 宿主 D 类文件排除规则)。
当前:**风控全链路 + Wave 0 共用底座 + 代销平台 API v0.1 + AL-09 合并接线已完成(2026-09-08,`merger` 分支)**——B1~B9b 事件线 · C1~C6 对话/追加需求(FR-8/9/10)· 前端接入 B/C(sessions/stream)· T-03/T-04/T-21 · JWT 统一 + auth_adapter 接缝。**测试基线:`python -m pytest` → 530 passed 0 skipped**(含 `test_module_boundary` 宿主 D 类文件排除规则)。
**下一步(统筹 P1):** Core 公共 API v0.1(见 `docs/项目管理/04` Phase A)· 接口契约 v0.1 发群 · 前端 `web/` init · 客户/代理人/分析 Agent 并行。
**本机已就位状态(2026-09-08 · 已完成上述 ①~⑤,无需重做):** `.env` 已配置(学习项目;DEEPSEEK_API_KEY 空时 chat 走降级回复;JWT 未配项时走默认 `JWT_DEV_SECRET`,**启动 warning 属预期**);`jinrong_core` + `jinrong_agent` 已灌库(33 客户/14 产品/矩阵 25 行/风评 33 / AML 8 条 / 归属 33 行);`python -m pytest` **502 绿 1 skipped**(集成测试真连本机 MySQL,未灌库自动 skip;系统 Python 3.13.14);Redis `redis://127.0.0.1:6379/0` 在跑。**演示/走查后按《演示SOP-风控模块.md》§2 重灌**(`reset.ps1` + `prepare_risk_demo.sql` 两步必跑)。
**本机已就位状态(2026-09-08 · 已完成上述 ①~⑤,无需重做):** `.env` 已配置(学习项目;DEEPSEEK_API_KEY 空时 chat 走降级回复;JWT 未配项时走默认 `JWT_DEV_SECRET`,**启动 warning 属预期**);`jinrong_core` + `jinrong_agent` 已灌库(33 客户/14 产品/矩阵 25 行/风评 33 / AML 8 条 / 归属 33 行);`python -m pytest` **530 绿 0 skipped**(集成测试真连本机 MySQL;Windows 中文乱码跑 `python scripts/dev/fix_utf8_seed.py`);Redis `redis://127.0.0.1:6379/0` 在跑。**演示/走查后按《演示SOP-风控模块.md》§2 重灌**(`reset.ps1` + `prepare_risk_demo.sql` 两步必跑)。
**本机已知坑:** `mysql.exe` 不在 PATH(位于 `C:\Program Files\MySQL\MySQL Server 8.0\bin`);`reset.ps1` 的交互式 `-p` 在自动化执行时会卡死——脚本化重灌用 `MYSQL_PWD` 环境变量传密码(交互执行不受影响,不把密码写进仓库脚本);**`redis` 与 `python-jose[cryptography]` 包均出现过 requirements 有而环境漏装(B9a 补装 redis、Wave 0 补装 jose,2026-09-07),重装环境后先 `python -c "import jose, redis"` 自检**。
+1 -1
View File
@@ -16,4 +16,4 @@
| 2026-09-08 | **前端接入方案 B/C**:chat 拉侧三端点 `8328c24` · SSE 流式 `01ec5fc` · 503→502 测试基线 | 前端联调前置 | MEMORY / TODO / chat / session_repository / agent_service |
| 2026-09-08 | **AL-09 合并接线完成**(`merger` 分支):JWT 统一 · 模块 chat/agent/memory 恢复 · auth_adapter S2 接缝 · trace 中间件 ApiError re-raise · test_module_boundary 绿 · **502 passed 1 skipped** | 风控模块并入宿主 Wave 0 | MEMORY / TODO / FRAMEWORK / FLOW / REQUIREMENTS / ENVIRONMENT / 合并注意事项 |
| 2026-09-08 | **代销平台 API 口径拍板**:路由 A(业务域)· 重复功能以平台 API 为准 · 《接口契约-代销平台API-v0.1》 | 统筹 P1 实现前定契约 | 04 / MEMORY / TODO / 接口契约 |
| 2026-09-08 | **代销平台 API v0.1 落地**:MVC 分层 api→service/platform→core_ro · 17 端点测试 · 519 pytest 绿 | v0.1 实现约定 | 接口契约 / 04 / ITERATION |
| 2026-09-08 | P1 环境收口(续):补建 `risk_aml_list` + AML 种子 · `fix_utf8_seed.py` 修复 Windows 中文乱码 · 集成测试 11 例恢复 · **530 passed 0 skipped** | 真库集成 skip/失败 | MEMORY / ENVIRONMENT / FLOW / ITERATION / bootstrap 脚本 |
+11 -9
View File
@@ -9,7 +9,7 @@
**项目是什么:** 金融四 Agent(客户财富 / 代理人 / 数据分析 / 风控)共用数据层与合规底座;**不**互调 LLM,跨 Agent 走 L1/L2/L3 画像与预警表。
**当前进度:** 需求与表设计已定 · **风控模块 B1~B9b + 阶段 C(C1~C3)+ C4~C6(FR-8/9/10)+ 前端接入 B/C 全部完成** · **AL-09 合并接线已完成(2026-09-08,`merger` 分支)**:`risk-control-agent` 并入宿主 Wave 0;JWT 统一(`/api/auth/login` → `auth_service.issue_dev_token`,与 risk/chat 共用 `settings.jwt_issuer`);模块版 chat/agent/memory 已恢复(含 sessions/stream);S2 接缝 `auth_adapter.module_auth_from_host` 已接线;**502 passed 1 skipped**(`python -m pytest`)。**下一步:统筹侧 Core 公共 API v0.1 + 前端 `web/`;各 Agent 负责人并行 Tool/编排。**
**当前进度:** 需求与表设计已定 · **风控模块 B1~B9b + C4~C6 + 前端 B/C + AL-09 合并** · **代销平台 API v0.1 已落地(2026-09-08)**:`customers/products/advisors/staff/compliance` + `service/platform/` · **530 passed 0 skipped**(`python -m pytest`)。**下一步:接口契约发群 · 前端 `web/` · Agent 合并改调 platform Service。**
**工作分支:** 团队开发在 **`merger`**(已 merge 风控模块);历史开发分支 `risk-control-agent` 交付冻结。旧文档中「待 AL-09 合并」口径已过时。
@@ -17,13 +17,15 @@
| 路径 | 状态 | 说明 |
| --- | --- | --- |
| `app/main.py` | **已集成(AL-09)** | 宿主 TraceMiddleware + 模块 audit/trace 中间件 + 路由(auth/chat/risk/simulate)+ lifespan;trace 中间件对 ApiError 等 **原样 re-raise**,仅未捕获异常 → 500 |
| `app/main.py` | **已集成(AL-09)** | 宿主 TraceMiddleware + 模块 audit/trace + 路由(auth/**platform**/chat/risk/simulate)+ lifespan |
| `app/api/auth.py` | **已实现(AL-09)** | Mock 登录;签发走 `auth_service.issue_dev_token`(与模块 API 同一 issuer) |
| `app/api/auth_adapter.py` | **已接线(S2)** | `module_auth_from_host()`:宿主 AuthContext → 模块 AuthContext |
| `app/gateway/` | **宿主 Wave 0(并存)** | jwt_service / auth_deps / rbac / ownership;模块 API 走 `deps.py`,禁止模块 import gateway |
| `app/api/risk.py` `simulate.py` `deps.py` | **已实现** | 风控 4 API + 模拟网关路由 + **JWT 鉴权工厂(T-01:Bearer 全环境优先;debug 头仅 dev+无 RS256 公钥时兜底;AGENT_ACCESS_MATRIX 准入)** |
| `app/api/chat.py` `audit_middleware.py` | **已实现(T-06/T-02 + 前端接入 B/C)** | POST /api/chat(SessionGuard+归属+窗口+落盘)· **前端拉侧三端点**(`GET /sessions` / `GET /sessions/{id}/messages` / `POST /sessions/{id}/close`,方案 B `8328c24`)· **SSE 流式 `POST /api/chat/stream`**(OpenAI 兼容 chunk,方案 C `01ec5fc`);守卫抽 `_guard_request`/`_prepare_turn`/`_guard_session` 同步流式共用 · http_access 访问审计 |
| `app/api/customers.py` `products.py` `advisors.py` `staff.py` `compliance.py` | **已实现(v0.1)** | 代销平台 REST;`get_platform_auth_context`(无 X-Agent-Type);Service 层 `app/service/platform/` |
| `app/api/knowledge.py` `admin.py` | 空壳 | 待审计查询台与知识库 API(T-21 拍板一期只做脚本入库,上传/重建端点不做) |
| `app/service/platform/` | **已实现(v0.1)** | 封装 core_ro + `PLATFORM_RESPONSE_DESENSITIZE` 脱敏开关 |
| `app/service/embedding.py` `milvus_service.py` `rag_service.py` | **已实现(T21-1/2/4)** | Ollama bge-m3 1024 维(失败不静默降级)/ kb_product_rules 建集合+upsert+合规过滤检索 / search_knowledge→chunks+source_refs 溯源 |
| `app/tool/kb_tools.py` | **已实现(T21-5)** | search_knowledge 对话 Tool(skip_access_check 公开知识;仅 customer/advisor 意图开放,risk 不开放);kb_product_rules 首批 24 块已入库(data/kb 6 产品手册,scripts/kb/build_kb.py 可重灌) |
| `app/service/auth_service.py` | **已实现(T-01)** | Auth SDK:JWT 验签(HS256 dev/RS256 生产)、必填 claims、jti 吊销(Redis fail-open);签发 CLI `scripts/dev/issue_dev_token.py` |
@@ -37,9 +39,9 @@
| `app/utils/` | **基本就绪** | trace(trace_id+request_id 双 contextvar)/ desensitize / db(引擎工厂)/ response(统一错误体+4xx/500 handler)/ exceptions(含 ApiError)已实现;logger 占位 |
| `app/config/settings.py` | **已实现** | 双库 + risk_* 阈值 + JWT 配置(jwt_public_key_path/jwt_dev_secret/jwt_issuer/jwt_audience) |
| `scripts/core/*.sql` + `reset.ps1` | **已实现** | Core 模拟库 DDL + 种子 |
| `scripts/agent/` `scripts/demo/` `scripts/dev/` | **已实现** | AML 名单种子 + 风控演示数据 + subscribe_alerts/rebuild_alerts + issue_dev_token(JWT 签发) |
| `scripts/agent/` `scripts/demo/` `scripts/dev/` | **已实现** | AML 名单种子 + 风控演示数据 + `fix_utf8_seed.py`/`run_sql_file.py`(Windows UTF-8 灌库)+ issue_dev_token |
| `scripts/sync/*.py` | **已实现** | 归属同步 + Neo4j 全图 |
| `tests/` | **已实现** | 36+ 测试模块 **502 用例 1 skipped**(sqlite 隔离;`test_module_boundary` 宿主 D 类文件不参与跨层扫描)。改路由必同步 `tests/test_main.py::test_all_routers_mounted` |
| `tests/` | **已实现** | 37+ 测试模块 **530 用例 0 skipped**(sqlite + 真 MySQL 集成;`test_module_boundary` 宿主 D 类排除)。改路由必同步 `tests/test_main.py::test_all_routers_mounted` |
| `docs/需求拆解/` | 已定 | 场景 P0、矩阵、合规原文 |
| `docs/PRD/PRD-风控监测Agent.md` | **已冻结(v1.1)** | 风控 PRD v1.0 + v1.1 追加 FR-8/9/10(§4A)+ 规则表附录 |
| `docs/项目框架设计/实现方案-风控追加需求v1.1-C4C6.md` | **已定稿** | C4~C6 编码依据(经独立 AI 评审修订闭环);分支/进度速览另见项目根 `交接文档.md` |
@@ -58,10 +60,10 @@
3. .\scripts\core\reset.ps1 # 建 jinrong_core 模拟库 + 种子
4. mysql … < 01-mysql-共用底座.sql # jinrong_agent 共用 11 表
mysql … < 02-mysql-agent专用.sql # 风控四表 + risk_aml_list
5. mysql … < scripts/agent/seed-aml-list.sql # AML 名单种子
5. mysql … < scripts/agent/seed-aml-list.sql # AML 名单(Windows 乱码:`python scripts/dev/fix_utf8_seed.py`)
(风控演示:scripts/demo/prepare_risk_demo.sql,reset 后重跑)
6. python scripts/sync/sync_advisor_rel.py && python scripts/sync/sync_neo4j.py
7. uvicorn app.main:app --reload → GET /health;python -m pytest(**502 绿**,系统 Python 3.13.14)
7. uvicorn app.main:app --reload → GET /health;`docker compose up -d redis`(限流/会话窗口);python -m pytest(**530 绿**,系统 Python 3.13.14)
```
**AL-09 合并后架构(一句话):** 宿主 `gateway/` + 模块 `deps.py` **双栈并存**;对外登录/token **统一**;chat/risk 均走模块鉴权;接缝 S2 用 `auth_adapter`。
@@ -87,7 +89,7 @@
## 1. 项目简介
- **名称:** JinRong 金融四 Agent 智能管家
- **当前阶段:** **AL-09 合并接线完成(2026-09-08,`merger` 分支)**——风控 + Wave 0 宿主共存;502 测试绿;接口实调此前已通过
- **当前阶段:** **代销平台 API v0.1 + AL-09 合并完成(2026-09-08,`merger` 分支)**——530 测试绿;Redis/演示库/AML 集成已就位
- **当前优先级:** 代销平台 API v0.1(统筹 P1)/ 前端 `web/` / Agent 队友并行(合并期改调平台 canonical API)
------
@@ -151,7 +153,7 @@ Core 模拟:scripts/core/reset.ps1 · 文档 docs/项目框架设计/Core模
种子:scripts/agent/seed-aml-list.sql(AML 名单)· scripts/demo/prepare_risk_demo.sql(reset 后重跑)
依赖:requirements.txt(LangGraph + langchain-core/openai + FastAPI + SQLAlchemy)
启动:uvicorn app.main:app --reload → GET /health
测试:python -m pytest(**502 绿** 1 skipped;集成测试需本机演示数据,未灌库时自动 skip)
测试:python -m pytest(**530 绿**;集成测试需本机 MySQL + `risk_aml_list` + `prepare_risk_demo.sql`)
运维/演示脚本:scripts/demo/subscribe_alerts.py(订阅推送演示)· rebuild_alerts.py TRD-xxx(引擎异常补偿重放)
JWT 联调:python scripts/dev/issue_dev_token.py --sub STAFF-30001 --roles risk_officer(+ Authorization: Bearer + X-Agent-Type)
配置:.env(见 .env.example)
@@ -196,6 +198,6 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md
2. 改动属于 api / service / tool / repository 哪一层?
3. 是否需 customer_id 归属与 JWT RBAC?
4. Core 是模拟库只读还是 agent 库读写?
5. 如何验证?(`python -m pytest` 全量(当前 **502 绿**)· uvicorn 启动 + /health · `tests/test_module_boundary.py` 全绿 · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列)
5. 如何验证?(`python -m pytest` 全量(当前 **530 绿**)· `docker compose up -d redis` · uvicorn + /health · 平台 `/api/customers/*` · `tests/test_module_boundary.py` 全绿)
大任务:FRAMEWORK/FLOW 与实现状态不符时先更新 memory 再编码(用户确认跳过除外)。
+2 -2
View File
@@ -5,11 +5,11 @@
## 进行中
**AL-09 合并接线已完成(2026-09-08,`merger` 分支)**:JWT 统一 · 模块 chat/agent/memory 恢复 · auth_adapter 接线 · trace 中间件修复(应用异常 re-raise)· **502 passed 1 skipped** ✓
**AL-09 合并接线已完成(2026-09-08,`merger` 分支)**:JWT 统一 · 模块 chat/agent/memory 恢复 · auth_adapter 接线 · trace 中间件修复(应用异常 re-raise)· **530 passed 0 skipped** ✓
## 待办(统筹 · P1 推荐顺序)
- [x] **代销平台 API v0.1 实现**(2026-09-08):`customers/products/advisors/staff/compliance` + `service/platform/` + `PLATFORM_RESPONSE_DESENSITIZE` · **519 passed 1 skipped**
- [x] **代销平台 API v0.1 实现**(2026-09-08):`customers/products/advisors/staff/compliance` + `service/platform/` + `PLATFORM_RESPONSE_DESENSITIZE` · **530 passed 0 skipped**
- [ ] **接口契约发群**(login + 平台读 API + simulate/trade;强调重复功能以平台路径为准)
- [ ] 前端 React 多 Agent 入口(HashRouter,`web/` init)
- [ ] 同步 `MEMORY/REQUIREMENTS/FRAMEWORK` 与各 Agent 负责人联调节奏