|
|
@@ -213,6 +213,14 @@ class InstitutionService:
|
|
|
if hasattr(info, 'outer_source_id') and hasattr(info, 'standard_id'):
|
|
|
standard_id_map[info.outer_source_id] = info.standard_id
|
|
|
for idx, std in enumerate(raw_data["standard_info_list"]):
|
|
|
+ condition_list = std.get("standard_condition_info_list", [])
|
|
|
+ single_limit_val = None
|
|
|
+ for cond in (condition_list or []):
|
|
|
+ if cond.get("rule_factor") == "QUOTA_TOTAL":
|
|
|
+ try:
|
|
|
+ single_limit_val = float(cond.get("rule_value", 0))
|
|
|
+ except (ValueError, TypeError):
|
|
|
+ pass
|
|
|
std_data = {
|
|
|
"out_biz_no": std.get("outer_source_id", f"std_{institution_id}_{idx}"),
|
|
|
"institution_id": institution_id,
|
|
|
@@ -222,6 +230,8 @@ class InstitutionService:
|
|
|
"expense_type_sub_category": std.get("expense_type_sub_category", "DEFAULT"),
|
|
|
"enterprise_id": enterprise_id,
|
|
|
"tenant_id": auth.user.tenant_id if auth.user else 1,
|
|
|
+ "condition_info": condition_list,
|
|
|
+ "single_limit": single_limit_val,
|
|
|
}
|
|
|
try:
|
|
|
from app.plugin.module_payment.expense.rule.model import ExpenseRuleModel
|
|
|
@@ -325,10 +335,11 @@ class InstitutionService:
|
|
|
enterprise_id: str,
|
|
|
) -> dict | None:
|
|
|
"""
|
|
|
- 从支付宝查询费控制度详情
|
|
|
+ 从支付宝查询费控制度详情,并补充本地规则和额度数据
|
|
|
调用: alipay.ebpp.invoice.institution.detailinfo.query
|
|
|
失败时降级到本地DB
|
|
|
"""
|
|
|
+ result_dict = None
|
|
|
try:
|
|
|
model = AlipayEbppInvoiceInstitutionDetailinfoQueryModel()
|
|
|
model.institution_id = institution_id
|
|
|
@@ -344,18 +355,63 @@ class InstitutionService:
|
|
|
result.parse_response_content(response)
|
|
|
|
|
|
if result.is_success():
|
|
|
- return result.to_alipay_dict()
|
|
|
+ result_dict = result.to_alipay_dict()
|
|
|
|
|
|
- log.warning("支付宝 detailinfo.query 失败,降级到本地DB")
|
|
|
+ if not result_dict:
|
|
|
+ log.warning("支付宝 detailinfo.query 失败,降级到本地DB")
|
|
|
except Exception as e:
|
|
|
log.warning(f"支付宝 detailinfo.query 异常: {e},降级到本地DB")
|
|
|
|
|
|
# 降级:查本地DB
|
|
|
- crud = InstitutionCRUD(auth)
|
|
|
- obj = await crud.get(institution_id=institution_id, enterprise_id=enterprise_id)
|
|
|
- if obj:
|
|
|
- return InstitutionListOutSchema.model_validate(obj).model_dump()
|
|
|
- return None
|
|
|
+ if not result_dict:
|
|
|
+ crud = InstitutionCRUD(auth)
|
|
|
+ obj = await crud.get(institution_id=institution_id, enterprise_id=enterprise_id)
|
|
|
+ if obj:
|
|
|
+ result_dict = InstitutionListOutSchema.model_validate(obj).model_dump()
|
|
|
+
|
|
|
+ if not result_dict:
|
|
|
+ return None
|
|
|
+
|
|
|
+ # 补充本地规则和额度
|
|
|
+ from app.plugin.module_payment.expense.rule.model import ExpenseRuleModel
|
|
|
+ from app.plugin.module_payment.expense.quota.model import QuotaModel
|
|
|
+ from sqlalchemy import select
|
|
|
+
|
|
|
+ # 查使用规则
|
|
|
+ rule_stmt = select(ExpenseRuleModel).where(ExpenseRuleModel.institution_id == institution_id)
|
|
|
+ rule_result = await auth.db.execute(rule_stmt)
|
|
|
+ rules = rule_result.scalars().all()
|
|
|
+ if rules:
|
|
|
+ rule_list = []
|
|
|
+ for r in rules:
|
|
|
+ rule_item = {
|
|
|
+ "rule_id": r.rule_id,
|
|
|
+ "standard_name": r.standard_name,
|
|
|
+ "standard_desc": r.standard_desc,
|
|
|
+ }
|
|
|
+ if hasattr(r, 'condition_info') and r.condition_info:
|
|
|
+ rule_item["condition_info"] = r.condition_info
|
|
|
+ if hasattr(r, 'single_limit') and r.single_limit:
|
|
|
+ rule_item["single_limit"] = float(r.single_limit)
|
|
|
+ rule_list.append(rule_item)
|
|
|
+ result_dict["rule_list"] = rule_list
|
|
|
+
|
|
|
+ # 查额度
|
|
|
+ quota_stmt = select(QuotaModel).where(QuotaModel.institution_id == institution_id)
|
|
|
+ quota_result = await auth.db.execute(quota_stmt)
|
|
|
+ quotas = quota_result.scalars().all()
|
|
|
+ if quotas:
|
|
|
+ result_dict["quota_list"] = [
|
|
|
+ {
|
|
|
+ "quota_id": q.quota_id,
|
|
|
+ "total_amount": float(q.total_amount) if q.total_amount else 0,
|
|
|
+ "available_amount": float(q.available_amount) if q.available_amount else 0,
|
|
|
+ "status": q.status,
|
|
|
+ }
|
|
|
+ for q in quotas
|
|
|
+ ]
|
|
|
+
|
|
|
+ return result_dict
|
|
|
|
|
|
@classmethod
|
|
|
async def list_service(
|