NAC_Blockchain/gnacs-service/routers/compliance.py

82 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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)}