完善审计日志展示与导出权限
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import uuid
|
||||
import json
|
||||
from decimal import Decimal
|
||||
from typing import Any
|
||||
|
||||
@@ -52,6 +53,34 @@ async def _ensure_center_active(db: AsyncSession, study_id: uuid.UUID, center_id
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="中心已停用")
|
||||
|
||||
|
||||
async def _contract_audit_name(db: AsyncSession, contract) -> str:
|
||||
site = await site_crud.get_site(db, contract.center_id)
|
||||
center_name = site.name if site else "中心"
|
||||
contract_no = str(contract.contract_no or "").strip()
|
||||
return f"{center_name} / {contract_no}" if contract_no else center_name
|
||||
|
||||
|
||||
async def _contract_audit_detail(db: AsyncSession, action: str, contract) -> str:
|
||||
name = await _contract_audit_name(db, contract)
|
||||
return json.dumps({"targetName": name, "description": f"{action}合同费用“{name}”"}, ensure_ascii=False)
|
||||
|
||||
|
||||
async def _payment_audit_name(db: AsyncSession, contract, payment) -> str:
|
||||
contract_name = await _contract_audit_name(db, contract)
|
||||
seq = getattr(payment, "seq", None)
|
||||
amount = getattr(payment, "amount", None)
|
||||
if seq:
|
||||
return f"{contract_name} / 第{seq}期"
|
||||
if amount is not None:
|
||||
return f"{contract_name} / {amount}"
|
||||
return contract_name
|
||||
|
||||
|
||||
async def _payment_audit_detail(db: AsyncSession, action: str, contract, payment) -> str:
|
||||
name = await _payment_audit_name(db, contract, payment)
|
||||
return json.dumps({"targetName": name, "description": f"{action}合同费用分期“{name}”"}, ensure_ascii=False)
|
||||
|
||||
|
||||
def _parse_optional_uuid(value: str | None, detail: str) -> uuid.UUID | None:
|
||||
if not value:
|
||||
return None
|
||||
@@ -261,7 +290,7 @@ async def create_contract_fee(
|
||||
entity_type="contract_fee",
|
||||
entity_id=contract.id,
|
||||
action="CREATE_CONTRACT_FEE",
|
||||
detail="合同费用已创建",
|
||||
detail=await _contract_audit_detail(db, "创建", contract),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await get_operator_role_label(db, contract.study_id, current_user),
|
||||
)
|
||||
@@ -291,7 +320,7 @@ async def update_contract_fee(
|
||||
entity_type="contract_fee",
|
||||
entity_id=contract_id,
|
||||
action="UPDATE_CONTRACT_FEE",
|
||||
detail="合同费用已更新",
|
||||
detail=await _contract_audit_detail(db, "更新", contract),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await get_operator_role_label(db, contract.study_id, current_user),
|
||||
)
|
||||
@@ -313,6 +342,7 @@ async def delete_contract_fee(
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="合同费用不存在")
|
||||
await _ensure_study_access(db, contract.study_id, current_user, "fees_contracts:delete")
|
||||
await _ensure_center_active(db, contract.study_id, contract.center_id)
|
||||
contract_detail = await _contract_audit_detail(db, "删除", contract)
|
||||
await contract_fee_crud.delete_contract_fee(db, contract)
|
||||
await audit_crud.log_action(
|
||||
db,
|
||||
@@ -320,7 +350,7 @@ async def delete_contract_fee(
|
||||
entity_type="contract_fee",
|
||||
entity_id=contract_id,
|
||||
action="DELETE_CONTRACT_FEE",
|
||||
detail="合同费用已删除",
|
||||
detail=contract_detail,
|
||||
operator_id=current_user.id,
|
||||
operator_role=await get_operator_role_label(db, contract.study_id, current_user),
|
||||
)
|
||||
@@ -350,7 +380,7 @@ async def create_contract_payment(
|
||||
entity_type="contract_fee_payment",
|
||||
entity_id=payment.id,
|
||||
action="CREATE_CONTRACT_FEE_PAYMENT",
|
||||
detail="合同费用分期已创建",
|
||||
detail=await _payment_audit_detail(db, "创建", contract, payment),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await get_operator_role_label(db, contract.study_id, current_user),
|
||||
)
|
||||
@@ -391,7 +421,7 @@ async def update_contract_payment(
|
||||
entity_type="contract_fee_payment",
|
||||
entity_id=payment_id,
|
||||
action="UPDATE_CONTRACT_FEE_PAYMENT",
|
||||
detail="合同费用分期已更新",
|
||||
detail=await _payment_audit_detail(db, "更新", contract, payment),
|
||||
operator_id=current_user.id,
|
||||
operator_role=await get_operator_role_label(db, contract.study_id, current_user),
|
||||
)
|
||||
@@ -415,6 +445,7 @@ async def delete_contract_payment(
|
||||
if not contract:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="合同费用不存在")
|
||||
await _ensure_study_access(db, contract.study_id, current_user, "fees_contracts:update")
|
||||
payment_detail = await _payment_audit_detail(db, "删除", contract, payment)
|
||||
await payment_crud.delete_payment(db, payment)
|
||||
await payment_crud.resequence_payments(db, contract.id)
|
||||
await audit_crud.log_action(
|
||||
@@ -423,7 +454,7 @@ async def delete_contract_payment(
|
||||
entity_type="contract_fee_payment",
|
||||
entity_id=payment_id,
|
||||
action="DELETE_CONTRACT_FEE_PAYMENT",
|
||||
detail="合同费用分期已删除",
|
||||
detail=payment_detail,
|
||||
operator_id=current_user.id,
|
||||
operator_role=await get_operator_role_label(db, contract.study_id, current_user),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user