File size: 1,745 Bytes
b4f2238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
"""
诉讼费用计算 API

API 层职责:
1. 接收 HTTP 请求,验证参数(通过 Schema)
2. 调用 Service 层方法
3. 返回响应

不包含:业务逻辑、权限检查、异常处理(依赖全局异常处理器)
"""

from __future__ import annotations

from typing import Any

from django.http import HttpRequest
from ninja import Router

from apps.cases.schemas.litigation_fee_schemas import FeeCalculationRequest, FeeCalculationResponse

router = Router()


def _get_litigation_fee_calculator_service() -> Any:
    """创建 LitigationFeeCalculatorService 实例"""
    from apps.cases.services import LitigationFeeCalculatorService  # type: ignore[attr-defined]

    return LitigationFeeCalculatorService()


@router.post("/calculate-fee", response=FeeCalculationResponse)
def calculate_fee(request: HttpRequest, data: FeeCalculationRequest) -> FeeCalculationResponse:
    """
    计算诉讼费用

    根据涉案金额、财产保全金额、案件类型等参数计算各类诉讼费用.

        data: 费用计算请求参数

        FeeCalculationResponse: 包含各类费用明细的响应
    """
    service = _get_litigation_fee_calculator_service()

    # 输入验证和 Decimal 转换由 Service 层负责
    target_amount, preservation_amount = service.validate_and_convert_fee_inputs(
        target_amount=data.target_amount,
        preservation_amount=data.preservation_amount,
    )

    result: dict[str, Any] = service.calculate_all_fees(
        target_amount=target_amount,
        preservation_amount=preservation_amount,
        case_type=data.case_type,
        cause_of_action=data.cause_of_action,
        cause_of_action_id=data.cause_of_action_id,
    )

    return FeeCalculationResponse(**result)