File size: 4,771 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | from __future__ import annotations
import logging
from typing import Any
from django.http import HttpRequest
from ninja import Router
from apps.contracts.schemas import (
ContractAssignmentOut,
ContractIn,
ContractOut,
ContractPartySourceOut,
ContractPaymentIn,
ContractUpdate,
UpdateLawyersIn,
)
from apps.core.dto.request_context import extract_request_context
logger = logging.getLogger("apps.contracts.api")
router = Router()
def _get_contract_service() -> Any:
from apps.contracts.services.contract.wiring import get_contract_service
return get_contract_service()
def _get_domain_service() -> Any:
from apps.contracts.services.contract.wiring import get_contract_domain_service
return get_contract_domain_service()
@router.get("/contracts", response=list[ContractOut])
def list_contracts(
request: HttpRequest,
case_type: str | None = None,
status: str | None = None,
page: int = 1,
page_size: int = 20,
) -> Any:
"""
获取合同列表(分页)
Requirements: 6.1, 6.2, 6.3
"""
service = _get_domain_service()
ctx = extract_request_context(request)
result = service.list_contracts(
case_type=case_type,
status=status,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
)
# list_contracts 返回 dict(含分页),前端做客户端分页所以只返回 items
return result["items"] if isinstance(result, dict) else result
class ContractWithCasesIn(ContractIn):
cases: list[dict[str, Any]] | None = None
@router.post("/contracts/full", response=ContractOut)
def create_contract_with_cases(request: HttpRequest, payload: ContractWithCasesIn) -> Any:
service = _get_domain_service()
data = payload.model_dump()
cases_data = data.pop("cases", None)
lawyer_ids = data.pop("lawyer_ids", [])
return service.create_contract_with_cases(
contract_data=data,
cases_data=cases_data,
assigned_lawyer_ids=lawyer_ids,
)
@router.get("/contracts/{contract_id}", response=ContractOut)
def get_contract(request: HttpRequest, contract_id: int) -> Any:
"""
获取合同详情
Requirements: 6.1, 6.2, 6.3
"""
service = _get_domain_service()
ctx = extract_request_context(request)
return service.get_contract(
contract_id=contract_id,
user=ctx.user,
org_access=ctx.org_access,
perm_open_access=ctx.perm_open_access,
)
@router.put("/contracts/{contract_id}", response=ContractOut)
def update_contract(
request: HttpRequest,
contract_id: int,
payload: ContractUpdate,
sync_cases: bool = False,
confirm_finance: bool = False,
new_payments: list[ContractPaymentIn] | None = None,
) -> Any:
service = _get_domain_service()
ctx = extract_request_context(request)
data = payload.model_dump(exclude_unset=True)
return service.update_contract_with_finance(
contract_id=contract_id,
update_data=data,
user=ctx.user,
confirm_finance=confirm_finance,
new_payments=[p.model_dump() for p in new_payments] if new_payments else None,
)
@router.post("/contracts", response=ContractOut)
def create_contract(
request: HttpRequest,
payload: ContractIn,
payments: list[ContractPaymentIn] | None = None,
confirm_finance: bool = False,
) -> Any:
service = _get_domain_service()
ctx = extract_request_context(request)
data = payload.model_dump()
lawyer_ids = data.pop("lawyer_ids", [])
return service.create_contract_with_cases(
contract_data=data,
cases_data=None,
assigned_lawyer_ids=lawyer_ids,
payments_data=[p.model_dump() for p in payments] if payments else None,
confirm_finance=confirm_finance,
user=ctx.user,
)
@router.put("/contracts/{contract_id}/lawyers", response=list[ContractAssignmentOut])
def update_contract_lawyers(request: HttpRequest, contract_id: int, payload: UpdateLawyersIn) -> Any:
service = _get_domain_service()
assignments = service.update_contract_lawyers(contract_id=contract_id, lawyer_ids=payload.lawyer_ids)
return [ContractAssignmentOut.from_assignment(item) for item in assignments]
@router.delete("/contracts/{contract_id}")
def delete_contract(request: HttpRequest, contract_id: int) -> dict[str, bool]:
service = _get_domain_service()
service.delete_contract(contract_id)
return {"success": True}
@router.get("/contracts/{contract_id}/all-parties", response=list[ContractPartySourceOut])
def get_contract_all_parties(request: HttpRequest, contract_id: int) -> Any:
service = _get_domain_service()
return service.get_all_parties(contract_id)
|