payment_qr_service.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # app/services/payment_qr_service.py
  2. from typing import List
  3. from sqlalchemy.ext.asyncio import AsyncSession
  4. from sqlalchemy import select
  5. from app.core.biz_exception import NotFoundError
  6. from app.models.payment_provider import VasPaymentProvider
  7. from app.models.payment_qr import VasPaymentQR
  8. from app.schemas.payment_qr import (
  9. VasPaymentQrCreate,
  10. VasPaymentQrSetEnableIn,
  11. )
  12. class PaymentQrService:
  13. # --------------------------------------------------
  14. # 创建支付二维码
  15. # --------------------------------------------------
  16. @staticmethod
  17. async def create(
  18. db: AsyncSession,
  19. data: VasPaymentQrCreate,
  20. ) -> VasPaymentQR:
  21. rec = VasPaymentQR(**data.dict())
  22. db.add(rec)
  23. await db.commit()
  24. await db.refresh(rec)
  25. return rec
  26. # --------------------------------------------------
  27. # 根据 ID 获取
  28. # --------------------------------------------------
  29. @staticmethod
  30. async def get_by_id(
  31. db: AsyncSession,
  32. qr_id: int,
  33. ) -> VasPaymentQR:
  34. stmt = select(VasPaymentQR).where(
  35. VasPaymentQR.id == qr_id
  36. )
  37. obj = (await db.execute(stmt)).scalar_one_or_none()
  38. if not obj:
  39. raise NotFoundError("QR not exist")
  40. return obj
  41. # --------------------------------------------------
  42. # 启用 / 禁用 QR
  43. # --------------------------------------------------
  44. @staticmethod
  45. async def set_enable(
  46. db: AsyncSession,
  47. qr_id: int,
  48. payload: VasPaymentQrSetEnableIn,
  49. ) -> VasPaymentQR:
  50. stmt = select(VasPaymentQR).where(
  51. VasPaymentQR.id == qr_id
  52. )
  53. obj = (await db.execute(stmt)).scalar_one_or_none()
  54. if not obj:
  55. raise NotFoundError("QR not exist")
  56. obj.is_active = payload.is_active
  57. await db.commit()
  58. await db.refresh(obj)
  59. return obj
  60. # --------------------------------------------------
  61. # 删除 QR
  62. # --------------------------------------------------
  63. @staticmethod
  64. async def delete(
  65. db: AsyncSession,
  66. qr_id: int,
  67. ) -> bool:
  68. stmt = select(VasPaymentQR).where(
  69. VasPaymentQR.id == qr_id
  70. )
  71. obj = (await db.execute(stmt)).scalar_one_or_none()
  72. if not obj:
  73. raise NotFoundError("QR not exist")
  74. await db.delete(obj)
  75. await db.commit()
  76. return True
  77. # --------------------------------------------------
  78. # 根据设备 ID 查询
  79. # --------------------------------------------------
  80. @staticmethod
  81. async def get_by_devid(
  82. db: AsyncSession,
  83. devid: str,
  84. ) -> List[VasPaymentQR]:
  85. stmt = select(VasPaymentQR).where(
  86. VasPaymentQR.devid == devid
  87. )
  88. result = await db.execute(stmt)
  89. return result.scalars().all()
  90. # --------------------------------------------------
  91. # 根据 provider 名称查询
  92. # --------------------------------------------------
  93. @staticmethod
  94. async def get_by_provider(
  95. db: AsyncSession,
  96. provider: str,
  97. ) -> List[VasPaymentQR]:
  98. stmt = select(VasPaymentQR).where(
  99. VasPaymentQR.provider == provider
  100. )
  101. result = await db.execute(stmt)
  102. return result.scalars().all()
  103. # --------------------------------------------------
  104. # 根据 provider_id 查询 QR(安全校验)
  105. # --------------------------------------------------
  106. @staticmethod
  107. async def list_by_provider(
  108. db: AsyncSession,
  109. provider_id: int,
  110. ) -> List[VasPaymentQR]:
  111. stmt = select(VasPaymentProvider).where(
  112. VasPaymentProvider.id == provider_id
  113. )
  114. provider = (await db.execute(stmt)).scalar_one_or_none()
  115. if not provider:
  116. raise NotFoundError("Provider not exist")
  117. stmt = select(VasPaymentQR).where(
  118. VasPaymentQR.provider == provider.name
  119. )
  120. result = await db.execute(stmt)
  121. return result.scalars().all()