82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
"""GNACS 合规规则路由"""
|
||
from fastapi import APIRouter, HTTPException, Query
|
||
import database
|
||
|
||
router = APIRouter()
|
||
|
||
def serialize(doc):
|
||
if doc is None:
|
||
return None
|
||
result = {}
|
||
for k, v in doc.items():
|
||
if k == "_id":
|
||
result["_id"] = str(v)
|
||
elif isinstance(v, dict):
|
||
result[k] = serialize(v)
|
||
else:
|
||
result[k] = v
|
||
return result
|
||
|
||
@router.get("/query")
|
||
async def query_compliance_rules(
|
||
jurisdiction: str = Query(..., description="辖区代码,如CN/US/SG"),
|
||
asset_class: str = Query(..., description="资产大类ID,如RE/FA/AT"),
|
||
transaction_type: str = Query("domestic", description="交易类型:domestic/cross_border_export/cross_border_import")
|
||
):
|
||
"""查询指定辖区+资产类别的合规规则"""
|
||
col = database.compliance_rules_col
|
||
|
||
# 精确匹配
|
||
rule = await col.find_one({
|
||
"jurisdiction": jurisdiction.upper(),
|
||
"asset_class": asset_class.upper(),
|
||
"transaction_type": transaction_type
|
||
})
|
||
|
||
# 如果没有精确匹配,查找辖区通用规则
|
||
if not rule:
|
||
rule = await col.find_one({
|
||
"jurisdiction": jurisdiction.upper(),
|
||
"asset_class": "ALL",
|
||
"transaction_type": transaction_type
|
||
})
|
||
|
||
# 如果还没有,查找全局规则
|
||
if not rule:
|
||
rule = await col.find_one({
|
||
"jurisdiction": "GLOBAL",
|
||
"asset_class": asset_class.upper()
|
||
})
|
||
|
||
# 同时获取资产类别信息
|
||
asset_info = await database.asset_classes_col.find_one({"class_id": asset_class.upper()})
|
||
jurisdiction_info = await database.jurisdictions_col.find_one({"code": jurisdiction.upper()})
|
||
|
||
return {
|
||
"success": True,
|
||
"rule": serialize(rule),
|
||
"asset_class_info": serialize(asset_info),
|
||
"jurisdiction_info": serialize(jurisdiction_info),
|
||
"fallback_used": rule is not None and rule.get("jurisdiction") != jurisdiction.upper()
|
||
}
|
||
|
||
@router.get("/matrix")
|
||
async def get_compliance_matrix(
|
||
jurisdiction: str = Query(None, description="按辖区筛选"),
|
||
asset_class: str = Query(None, description="按资产类别筛选")
|
||
):
|
||
"""获取合规规则矩阵"""
|
||
col = database.compliance_rules_col
|
||
query = {}
|
||
if jurisdiction:
|
||
query["jurisdiction"] = jurisdiction.upper()
|
||
if asset_class:
|
||
query["asset_class"] = asset_class.upper()
|
||
|
||
cursor = col.find(query, sort=[("jurisdiction", 1), ("asset_class", 1)])
|
||
rules = []
|
||
async for doc in cursor:
|
||
rules.append(serialize(doc))
|
||
return {"success": True, "rules": rules, "total": len(rules)}
|
||
|