feat:风控Agent(规则引擎+前置拦截+人工处置+工单闭环)
This commit is contained in:
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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()
|
||||
)
|
||||
@@ -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())
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user