controller.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. from typing import Annotated
  2. from fastapi import APIRouter, Depends, Path, Query
  3. from fastapi.responses import JSONResponse
  4. from app.api.v1.module_system.auth.schema import AuthSchema
  5. from app.common.response import ResponseSchema, SuccessResponse
  6. from app.core.dependencies import AuthPermission
  7. from app.core.logger import log
  8. from app.core.router_class import OperationLogRoute
  9. from .schema import (
  10. ExpenseQuotaCreateSchema,
  11. ExpenseQuotaDeleteSchema,
  12. ExpenseQuotaModifySchema,
  13. ExpenseQuotaQuerySchema,
  14. QuotaCreateSchema,
  15. QuotaListOutSchema,
  16. QuotaOperationOutSchema,
  17. QuotaOutSchema,
  18. QuotaUpdateSchema,
  19. )
  20. from .service import QuotaService
  21. from .outsource_schema import OutsourceNotifySchema, OutsourceNotifyOutSchema
  22. from .outsource_service import OutsourceNotifyService
  23. QuotaRouter = APIRouter(
  24. route_class=OperationLogRoute,
  25. prefix="/quota",
  26. tags=["额度管理"],
  27. )
  28. @QuotaRouter.post(
  29. "/expense/create",
  30. summary="创建余额/点券",
  31. description="创建余额或点券 (alipay.ebpp.invoice.expensecontrol.quota.create)",
  32. response_model=ResponseSchema[QuotaOperationOutSchema],
  33. )
  34. async def create_expense_quota_controller(
  35. data: ExpenseQuotaCreateSchema,
  36. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:create"]))],
  37. ) -> JSONResponse:
  38. result = await QuotaService.create_expense_quota_service(auth=auth, data=data)
  39. log.info(f"创建余额/点券成功: out_biz_no={result.out_biz_no}")
  40. return SuccessResponse(data=result, msg="创建余额/点券成功")
  41. @QuotaRouter.post(
  42. "/expense/query",
  43. summary="查询余额/点券",
  44. description="查询余额或点券 (alipay.ebpp.invoice.expensecontrol.quota.query)",
  45. response_model=ResponseSchema[ExpenseQuotaQuerySchema],
  46. )
  47. async def query_expense_quota_controller(
  48. data: ExpenseQuotaQuerySchema,
  49. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:query"]))],
  50. ) -> JSONResponse:
  51. result = await QuotaService.query_expense_quota_service(auth=auth, data=data)
  52. log.info(f"查询余额/点券成功")
  53. return SuccessResponse(data=result, msg="查询余额/点券成功")
  54. @QuotaRouter.put(
  55. "/expense/{out_biz_no}",
  56. summary="修改余额/点券",
  57. description="修改余额或点券 (alipay.ebpp.invoice.expensecontrol.quota.modify)",
  58. response_model=ResponseSchema[QuotaOperationOutSchema],
  59. )
  60. async def modify_expense_quota_controller(
  61. out_biz_no: Annotated[str, Path(description="外部业务编号")],
  62. data: ExpenseQuotaModifySchema,
  63. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:modify"]))],
  64. ) -> JSONResponse:
  65. result = await QuotaService.modify_expense_quota_service(auth=auth, out_biz_no=out_biz_no, data=data)
  66. log.info(f"修改余额/点券成功: {out_biz_no}")
  67. return SuccessResponse(data=result, msg="修改余额/点券成功")
  68. @QuotaRouter.delete(
  69. "/expense/{out_biz_no}",
  70. summary="删除额度",
  71. description="删除额度 (alipay.ebpp.invoice.expensecontrol.quota.delete)",
  72. response_model=ResponseSchema[QuotaOperationOutSchema],
  73. )
  74. async def delete_expense_quota_controller(
  75. out_biz_no: Annotated[str, Path(description="外部业务编号")],
  76. data: ExpenseQuotaDeleteSchema,
  77. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:delete"]))],
  78. ) -> JSONResponse:
  79. result = await QuotaService.delete_expense_quota_service(auth=auth, out_biz_no=out_biz_no, data=data)
  80. log.info(f"删除额度成功: {out_biz_no}")
  81. return SuccessResponse(data=result, msg="删除额度成功")
  82. @QuotaRouter.post(
  83. "",
  84. summary="创建额度",
  85. description="创建额度",
  86. response_model=ResponseSchema[QuotaOperationOutSchema],
  87. )
  88. async def create_quota_controller(
  89. data: QuotaCreateSchema,
  90. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:create"]))],
  91. ) -> JSONResponse:
  92. result = await QuotaService.create_quota_service(auth=auth, data=data)
  93. log.info(f"创建额度成功: out_biz_no={result.out_biz_no}")
  94. return SuccessResponse(data=result, msg="创建额度成功")
  95. @QuotaRouter.get(
  96. "",
  97. summary="查询额度列表",
  98. description="分页查询额度列表",
  99. response_model=ResponseSchema[QuotaListOutSchema],
  100. )
  101. async def list_quota_controller(
  102. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:list"]))],
  103. page_no: Annotated[int, Query(description="页码")] = 1,
  104. page_size: Annotated[int, Query(description="每页数量")] = 20,
  105. institution_id: Annotated[str | None, Query(description="制度ID")] = None,
  106. employee_id: Annotated[str | None, Query(description="员工ID")] = None,
  107. ) -> JSONResponse:
  108. search = {}
  109. if institution_id:
  110. search["institution_id"] = institution_id
  111. if employee_id:
  112. search["employee_id"] = employee_id
  113. result = await QuotaService.list_service(
  114. auth=auth, page_no=page_no, page_size=page_size, search=search
  115. )
  116. return SuccessResponse(data=result, msg="查询额度列表成功")
  117. @QuotaRouter.post(
  118. "/outsource/notify",
  119. summary="外部消费额度同步",
  120. description="将外部消费同步到支付宝额度系统 (alipay.ebpp.invoice.expensecomsue.outsource.notify)",
  121. response_model=ResponseSchema[OutsourceNotifyOutSchema],
  122. )
  123. async def outsource_notify_controller(
  124. data: OutsourceNotifySchema,
  125. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:outsource:notify"]))],
  126. ) -> JSONResponse:
  127. result = await OutsourceNotifyService.notify_service(auth=auth, data=data)
  128. log.info(f"外部消费额度同步: out_source_id={result.out_source_id}, success={result.success}")
  129. return SuccessResponse(data=result, msg="外部消费额度同步成功" if result.success else "外部消费额度同步失败")