Files
zkxw/backend/app/api/clinical_payment.py
T
2026-06-18 11:05:53 +08:00

407 lines
13 KiB
Python

from typing import List, Optional
from fastapi import APIRouter, Depends, Query
from pydantic import BaseModel, ConfigDict, Field
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.core.menu_guard import require_admin_or_super_admin
from app.core.response import error_response, success_response
from app.crud import clinical_payment
from app.models.models import SysUser
router = APIRouter(prefix="/web/admin", tags=["临床应用缴费管理"])
def _get_tenant_no(db: Session, user: dict) -> str:
user_id = user.get("user_id")
if not user_id:
raise PermissionError("用户身份信息缺失,无法确定租户")
sys_user = db.query(SysUser).filter(SysUser.id == user_id).first()
if not sys_user or not sys_user.tenant_no:
raise PermissionError("用户租户信息缺失")
return sys_user.tenant_no
class PaymentIdBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
id: str
class BatchPaymentIdsBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
payment_ids: List[str] = Field(..., alias="paymentIds")
class SubmitReceiptBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
transfer_amount: Optional[float] = Field(None, alias="transferAmount")
transfer_type: Optional[str] = Field(None, alias="transferType")
remark: Optional[str] = None
transfer_attachments: Optional[str] = Field(None, alias="transferAttachments")
class BatchSubmitReceiptBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
payment_ids: List[str] = Field(..., alias="paymentIds")
remark: Optional[str] = None
transfer_attachments: Optional[str] = Field(None, alias="transferAttachments")
class ConfirmReceiptBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
finance_confirm_attachments: Optional[str] = Field(None, alias="financeConfirmAttachments")
finance_remark: Optional[str] = Field(None, alias="financeRemark")
class SubmitRefundBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
refund_amount: float = Field(..., alias="refundAmount")
refund_remark: Optional[str] = Field(None, alias="refundRemark")
refund_attachments: Optional[str] = Field(None, alias="refundAttachments")
class BatchSubmitRefundBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
payment_ids: List[str] = Field(..., alias="paymentIds")
refund_amount: float = Field(..., alias="refundAmount")
refund_remark: Optional[str] = Field(None, alias="refundRemark")
refund_attachments: Optional[str] = Field(None, alias="refundAttachments")
class ConfirmRefundBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
refund_finance_confirm_attachments: Optional[str] = Field(
None, alias="refundFinanceConfirmAttachments"
)
refund_finance_remark: Optional[str] = Field(None, alias="refundFinanceRemark")
@router.get("/clinical-payments")
async def api_list_payments(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
payStatus: Optional[str] = Query(None, alias="payStatus"),
keyword: Optional[str] = Query(None, alias="keyword"),
bizType: Optional[str] = Query(None, alias="bizType"),
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
rows, total = clinical_payment.list_payments(
db,
page=page,
page_size=pageSize,
pay_status=payStatus,
keyword=keyword,
biz_type=bizType,
tenant_no=tenant_no,
user_info=user,
)
return success_response({"list": rows, "total": total})
except Exception as e:
return error_response(500, str(e))
@router.get("/clinical-payments/receipt-pending")
async def api_receipt_pending(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = Query(None, alias="keyword"),
bizType: Optional[str] = Query(None, alias="bizType"),
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
rows, total = clinical_payment.list_payments(
db,
page=page,
page_size=pageSize,
pay_status="jfqrz",
keyword=keyword,
biz_type=bizType,
tenant_no=tenant_no,
user_info=user,
)
return success_response({"list": rows, "total": total})
except Exception as e:
return error_response(500, str(e))
@router.get("/clinical-payments/receipt-confirmed")
async def api_receipt_confirmed(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = Query(None, alias="keyword"),
bizType: Optional[str] = Query(None, alias="bizType"),
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
rows, total = clinical_payment.list_payments(
db,
page=page,
page_size=pageSize,
pay_status="yjf",
keyword=keyword,
biz_type=bizType,
tenant_no=tenant_no,
user_info=user,
)
return success_response({"list": rows, "total": total})
except Exception as e:
return error_response(500, str(e))
@router.get("/clinical-payments/refund-pending")
async def api_refund_pending(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = Query(None, alias="keyword"),
bizType: Optional[str] = Query(None, alias="bizType"),
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
rows, total = clinical_payment.list_payments(
db,
page=page,
page_size=pageSize,
pay_status="tfqrz",
keyword=keyword,
biz_type=bizType,
tenant_no=tenant_no,
user_info=user,
)
return success_response({"list": rows, "total": total})
except Exception as e:
return error_response(500, str(e))
@router.get("/clinical-payments/refund-confirmed")
async def api_refund_confirmed(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = Query(None, alias="keyword"),
bizType: Optional[str] = Query(None, alias="bizType"),
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
rows, total = clinical_payment.list_payments(
db,
page=page,
page_size=pageSize,
pay_status="ytf",
keyword=keyword,
biz_type=bizType,
tenant_no=tenant_no,
user_info=user,
)
return success_response({"list": rows, "total": total})
except Exception as e:
return error_response(500, str(e))
@router.get("/clinical-payments/{payment_id}")
async def api_get_payment_detail(
payment_id: str,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
result = clinical_payment.get_payment_detail(
db, payment_id=payment_id, tenant_no=tenant_no
)
if result is None:
return error_response(404, "缴费记录不存在")
return success_response(result)
except ValueError as e:
return error_response(404, str(e))
@router.post("/clinical-payments/{payment_id}/submit-receipt")
async def api_submit_receipt(
payment_id: str,
body: SubmitReceiptBody = SubmitReceiptBody(),
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
clinical_payment.submit_receipt(
db,
payment_id=payment_id,
tenant_no=tenant_no,
user_id=user.get("user_id"),
remark=body.remark,
transfer_attachments=body.transfer_attachments,
transfer_amount=body.transfer_amount,
transfer_type=body.transfer_type,
)
return success_response(None, message="提交缴费确认成功")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/submit-receipt-batch")
async def api_batch_submit_receipt(
body: BatchSubmitReceiptBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
count = clinical_payment.batch_submit_receipt(
db,
payment_ids=body.payment_ids,
tenant_no=tenant_no,
user_id=user.get("user_id"),
remark=body.remark,
transfer_attachments=body.transfer_attachments,
)
return success_response({"count": count}, message=f"批量提交成功,共{count}条")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/{payment_id}/confirm-receipt")
async def api_confirm_receipt(
payment_id: str,
body: ConfirmReceiptBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
clinical_payment.confirm_receipt(
db,
payment_id=payment_id,
tenant_no=tenant_no,
user_id=user.get("user_id"),
finance_confirm_attachments=body.finance_confirm_attachments,
finance_remark=body.finance_remark,
)
return success_response(None, message="确认收款成功")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/{payment_id}/reject-receipt")
async def api_reject_receipt(
payment_id: str,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
clinical_payment.reject_receipt(
db,
payment_id=payment_id,
tenant_no=tenant_no,
user_id=user.get("user_id"),
)
return success_response(None, message="退回成功")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/{payment_id}/submit-refund")
async def api_submit_refund(
payment_id: str,
body: SubmitRefundBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
clinical_payment.submit_refund(
db,
payment_id=payment_id,
tenant_no=tenant_no,
user_id=user.get("user_id"),
refund_amount=body.refund_amount,
refund_remark=body.refund_remark,
refund_attachments=body.refund_attachments,
)
return success_response(None, message="提交退费申请成功")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/submit-refund-batch")
async def api_batch_submit_refund(
body: BatchSubmitRefundBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
count = clinical_payment.batch_submit_refund(
db,
payment_ids=body.payment_ids,
tenant_no=tenant_no,
user_id=user.get("user_id"),
refund_amount=body.refund_amount,
refund_remark=body.refund_remark,
refund_attachments=body.refund_attachments,
)
return success_response({"count": count}, message=f"批量提交退费成功,共{count}条")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/{payment_id}/confirm-refund")
async def api_confirm_refund(
payment_id: str,
body: ConfirmRefundBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
clinical_payment.confirm_refund(
db,
payment_id=payment_id,
tenant_no=tenant_no,
user_id=user.get("user_id"),
refund_finance_confirm_attachments=body.refund_finance_confirm_attachments,
refund_finance_remark=body.refund_finance_remark,
)
return success_response(None, message="确认退费成功")
except ValueError as e:
return error_response(400, str(e))
@router.post("/clinical-payments/{payment_id}/reject-refund")
async def api_reject_refund(
payment_id: str,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
try:
clinical_payment.reject_refund(
db,
payment_id=payment_id,
tenant_no=tenant_no,
user_id=user.get("user_id"),
)
return success_response(None, message="退回成功")
except ValueError as e:
return error_response(400, str(e))