| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- 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))
|