feat:风控Agent(规则引擎+前置拦截+人工处置+工单闭环)

This commit is contained in:
zhangyongcai
2026-09-12 21:08:20 +08:00
parent 98751d592f
commit 8b6893af18
21 changed files with 1403 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
"""audit_log 操作审计日志 ORM 模型(谁在何时做了什么,企业级合规留痕)。"""
from __future__ import annotations
from datetime import datetime
from sqlalchemy import BigInteger, DateTime, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column
from model.base import Base
class AuditLog(Base):
__tablename__ = "audit_log"
__table_args__ = {"comment": "操作审计日志表(企业级合规留痕)"}
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
user_id: Mapped[int | None] = mapped_column(BigInteger)
username: Mapped[str | None] = mapped_column(String(64))
module: Mapped[str] = mapped_column(String(32))
action: Mapped[str] = mapped_column(String(64))
target: Mapped[str | None] = mapped_column(String(128))
detail: Mapped[str | None] = mapped_column(Text)
ip: Mapped[str | None] = mapped_column(String(64))
trace_id: Mapped[str | None] = mapped_column(String(32))
status: Mapped[str] = mapped_column(String(8), server_default="成功")
create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
+30
View File
@@ -0,0 +1,30 @@
"""fin_risk_alert 风控预警 ORM 模型(命中记录 + 人工处置留痕)。"""
from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from typing import Any
from sqlalchemy import BigInteger, DateTime, JSON, Numeric, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column
from model.base import Base
class FinRiskAlert(Base):
__tablename__ = "fin_risk_alert"
__table_args__ = {"comment": "风控预警表(阻断后由风控专员在控制台处置)"}
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
customer_id: Mapped[int] = mapped_column(BigInteger)
order_id: Mapped[int | None] = mapped_column(BigInteger)
alert_type: Mapped[str] = mapped_column(String(32))
alert_level: Mapped[str] = mapped_column(String(8))
trigger_detail: Mapped[str | None] = mapped_column(Text)
transaction_ids: Mapped[list | None] = mapped_column(JSON)
confidence: Mapped[Decimal] = mapped_column(Numeric(5, 2), server_default="0.50")
status: Mapped[str] = mapped_column(String(16), server_default="未处理")
handler_id: Mapped[int | None] = mapped_column(BigInteger)
handle_result: Mapped[str | None] = mapped_column(Text)
handle_time: Mapped[datetime | None] = mapped_column(DateTime)
create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
+29
View File
@@ -0,0 +1,29 @@
"""fin_transaction 成交流水 ORM 模型(成交后落库的账务凭证)。"""
from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from sqlalchemy import BigInteger, DateTime, Numeric, String, func
from sqlalchemy.orm import Mapped, mapped_column
from model.base import Base
class FinTransaction(Base):
__tablename__ = "fin_transaction"
__table_args__ = {"comment": "成交流水表(成交后落库)"}
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
transaction_no: Mapped[str] = mapped_column(String(32), unique=True)
order_id: Mapped[int | None] = mapped_column(BigInteger)
customer_id: Mapped[int] = mapped_column(BigInteger)
product_id: Mapped[int] = mapped_column(BigInteger)
operator_id: Mapped[int | None] = mapped_column(BigInteger)
transaction_type: Mapped[str] = mapped_column(String(16))
amount: Mapped[Decimal] = mapped_column(Numeric(18, 2))
shares: Mapped[Decimal | None] = mapped_column(Numeric(18, 4))
nav: Mapped[Decimal | None] = mapped_column(Numeric(12, 6))
fee: Mapped[Decimal] = mapped_column(Numeric(12, 2), server_default="0")
status: Mapped[str] = mapped_column(String(16), server_default="已确认")
create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
+29
View File
@@ -0,0 +1,29 @@
"""risk_rule 风控规则 ORM 模型(规则引擎表驱动配置:存参数不存逻辑)。"""
from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from typing import Any
from sqlalchemy import BigInteger, DateTime, JSON, Numeric, String, func
from sqlalchemy.orm import Mapped, mapped_column
from model.base import Base
class RiskRule(Base):
__tablename__ = "risk_rule"
__table_args__ = {"comment": "风控规则表(20 条反洗钱/异常交易规则,驱动风控Agent)"}
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
rule_id: Mapped[str] = mapped_column(String(16), unique=True)
rule_name: Mapped[str] = mapped_column(String(64))
trigger_condition: Mapped[str | None] = mapped_column(String(512))
threshold: Mapped[dict[str, Any] | None] = mapped_column(JSON)
risk_level: Mapped[str] = mapped_column(String(8), server_default="低")
weight: Mapped[Decimal] = mapped_column(Numeric(4, 2), server_default="1.00")
status: Mapped[str] = mapped_column(String(8), server_default="启用")
create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
update_time: Mapped[datetime] = mapped_column(
DateTime, server_default=func.now(), onupdate=func.now()
)
+23
View File
@@ -0,0 +1,23 @@
"""sys_message 站内信 ORM 模型(风控拦截/冻结后触达客户的通道)。"""
from __future__ import annotations
from datetime import datetime
from sqlalchemy import BigInteger, DateTime, Integer, String, func
from sqlalchemy.orm import Mapped, mapped_column
from model.base import Base
class SysMessage(Base):
__tablename__ = "sys_message"
__table_args__ = {"comment": "站内信/消息中心表(投顾触达客户通道)"}
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
user_id: Mapped[int] = mapped_column(BigInteger)
msg_type: Mapped[str] = mapped_column(String(32))
title: Mapped[str] = mapped_column(String(128))
content: Mapped[str | None] = mapped_column(String(512))
biz_id: Mapped[str | None] = mapped_column(String(64))
is_read: Mapped[int] = mapped_column(Integer, server_default="0")
create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
+31
View File
@@ -0,0 +1,31 @@
"""trade_order 交易申请单 ORM 模型(风控阻断闭环主表,状态机单一来源)。"""
from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from sqlalchemy import BigInteger, DateTime, Numeric, String, func
from sqlalchemy.orm import Mapped, mapped_column
from model.base import Base
class TradeOrder(Base):
__tablename__ = "trade_order"
__table_args__ = {"comment": "交易申请单(风控阻断闭环主表,状态机单一来源)"}
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
order_no: Mapped[str] = mapped_column(String(32), unique=True)
customer_id: Mapped[int] = mapped_column(BigInteger)
product_id: Mapped[int] = mapped_column(BigInteger)
advisor_id: Mapped[int | None] = mapped_column(BigInteger)
order_type: Mapped[str] = mapped_column(String(16))
amount: Mapped[Decimal | None] = mapped_column(Numeric(18, 2))
shares: Mapped[Decimal | None] = mapped_column(Numeric(18, 4))
nav: Mapped[Decimal | None] = mapped_column(Numeric(12, 6))
fee: Mapped[Decimal | None] = mapped_column(Numeric(12, 2))
status: Mapped[str] = mapped_column(String(16), server_default="待确认")
risk_alert_id: Mapped[int | None] = mapped_column(BigInteger)
cancel_reason: Mapped[str | None] = mapped_column(String(255))
create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
confirm_time: Mapped[datetime | None] = mapped_column(DateTime)