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