controller.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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. IssueBatchCancelOutSchema,
  15. IssueBatchCancelSchema,
  16. IssueBatchCreateOutSchema,
  17. IssueBatchCreateSchema,
  18. IssueBatchListOutSchema,
  19. IssueBatchRecordsQueryOutSchema,
  20. IssueBatchRecordsQuerySchema,
  21. QuotaCreateSchema,
  22. QuotaListOutSchema,
  23. QuotaOperationOutSchema,
  24. QuotaOutSchema,
  25. QuotaUpdateSchema,
  26. )
  27. from .service import QuotaService
  28. from .outsource_schema import OutsourceNotifySchema, OutsourceNotifyOutSchema
  29. from .outsource_service import OutsourceNotifyService
  30. QuotaRouter = APIRouter(
  31. route_class=OperationLogRoute,
  32. prefix="/quota",
  33. tags=["额度管理"],
  34. )
  35. @QuotaRouter.post(
  36. "/expense/create",
  37. summary="创建余额/点券",
  38. description="创建余额或点券 (alipay.ebpp.invoice.expensecontrol.quota.create)",
  39. response_model=ResponseSchema[QuotaOperationOutSchema],
  40. )
  41. async def create_expense_quota_controller(
  42. data: ExpenseQuotaCreateSchema,
  43. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:create"]))],
  44. ) -> JSONResponse:
  45. result = await QuotaService.create_expense_quota_service(auth=auth, data=data)
  46. log.info(f"创建余额/点券成功: out_biz_no={result.out_biz_no}")
  47. return SuccessResponse(data=result, msg="创建余额/点券成功")
  48. @QuotaRouter.post(
  49. "/expense/query",
  50. summary="查询余额/点券",
  51. description="查询余额或点券 (alipay.ebpp.invoice.expensecontrol.quota.query)",
  52. response_model=ResponseSchema[ExpenseQuotaQuerySchema],
  53. )
  54. async def query_expense_quota_controller(
  55. data: ExpenseQuotaQuerySchema,
  56. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:query"]))],
  57. ) -> JSONResponse:
  58. result = await QuotaService.query_expense_quota_service(auth=auth, data=data)
  59. log.info(f"查询余额/点券成功")
  60. return SuccessResponse(data=result, msg="查询余额/点券成功")
  61. @QuotaRouter.put(
  62. "/expense/{out_biz_no}",
  63. summary="修改余额/点券",
  64. description="修改余额或点券 (alipay.ebpp.invoice.expensecontrol.quota.modify)",
  65. response_model=ResponseSchema[QuotaOperationOutSchema],
  66. )
  67. async def modify_expense_quota_controller(
  68. out_biz_no: Annotated[str, Path(description="外部业务编号")],
  69. data: ExpenseQuotaModifySchema,
  70. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:modify"]))],
  71. ) -> JSONResponse:
  72. result = await QuotaService.modify_expense_quota_service(auth=auth, out_biz_no=out_biz_no, data=data)
  73. log.info(f"修改余额/点券成功: {out_biz_no}")
  74. return SuccessResponse(data=result, msg="修改余额/点券成功")
  75. @QuotaRouter.delete(
  76. "/expense/{out_biz_no}",
  77. summary="删除额度",
  78. description="删除额度 (alipay.ebpp.invoice.expensecontrol.quota.delete)",
  79. response_model=ResponseSchema[QuotaOperationOutSchema],
  80. )
  81. async def delete_expense_quota_controller(
  82. out_biz_no: Annotated[str, Path(description="外部业务编号")],
  83. data: ExpenseQuotaDeleteSchema,
  84. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:expense:delete"]))],
  85. ) -> JSONResponse:
  86. result = await QuotaService.delete_expense_quota_service(auth=auth, out_biz_no=out_biz_no, data=data)
  87. log.info(f"删除额度成功: {out_biz_no}")
  88. return SuccessResponse(data=result, msg="删除额度成功")
  89. @QuotaRouter.post(
  90. "",
  91. summary="创建额度",
  92. description="创建额度",
  93. response_model=ResponseSchema[QuotaOperationOutSchema],
  94. )
  95. async def create_quota_controller(
  96. data: QuotaCreateSchema,
  97. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:create"]))],
  98. ) -> JSONResponse:
  99. result = await QuotaService.create_quota_service(auth=auth, data=data)
  100. log.info(f"创建额度成功: out_biz_no={result.out_biz_no}")
  101. return SuccessResponse(data=result, msg="创建额度成功")
  102. @QuotaRouter.get(
  103. "",
  104. summary="查询额度列表",
  105. description="分页查询额度列表",
  106. response_model=ResponseSchema[QuotaListOutSchema],
  107. )
  108. async def list_quota_controller(
  109. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:list"]))],
  110. page_no: Annotated[int, Query(description="页码")] = 1,
  111. page_size: Annotated[int, Query(description="每页数量")] = 20,
  112. institution_id: Annotated[str | None, Query(description="制度ID")] = None,
  113. employee_id: Annotated[str | None, Query(description="员工ID")] = None,
  114. ) -> JSONResponse:
  115. search = {}
  116. if institution_id:
  117. search["institution_id"] = institution_id
  118. if employee_id:
  119. search["employee_id"] = employee_id
  120. result = await QuotaService.list_service(
  121. auth=auth, page_no=page_no, page_size=page_size, search=search
  122. )
  123. return SuccessResponse(data=result, msg="查询额度列表成功")
  124. # ========================
  125. # 手工批量发放额度
  126. # ========================
  127. @QuotaRouter.get(
  128. "/issuebatch/list",
  129. summary="查询手工发放批次列表",
  130. description="分页查询手工发放批次列表",
  131. )
  132. async def list_issue_batch_controller(
  133. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:issuebatch:list"]))],
  134. page_no: Annotated[int, Query(description="页码")] = 1,
  135. page_size: Annotated[int, Query(description="每页数量")] = 20,
  136. institution_id: Annotated[str | None, Query(description="制度ID")] = None,
  137. ) -> JSONResponse:
  138. search = {}
  139. if institution_id:
  140. search["institution_id"] = institution_id
  141. result = await QuotaService.list_batch_service(
  142. auth=auth, page_no=page_no, page_size=page_size, search=search
  143. )
  144. return SuccessResponse(data=result, msg="查询批次列表成功")
  145. @QuotaRouter.post(
  146. "/issuebatch/create",
  147. summary="手工批量发放额度",
  148. description="批量对企业下的员工进行额度发放 (alipay.ebpp.invoice.expensecontrol.issuebatch.create)",
  149. response_model=ResponseSchema[IssueBatchCreateOutSchema],
  150. )
  151. async def issue_batch_create_controller(
  152. data: IssueBatchCreateSchema,
  153. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:issuebatch:create"]))],
  154. ) -> JSONResponse:
  155. result = await QuotaService.issue_batch_create_service(auth=auth, data=data)
  156. log.info(f"手工批量发放额度成功: batch_no={data.batch_no}, issue_batch_id={result.issue_batch_id}")
  157. return SuccessResponse(data=result, msg="手工批量发放额度成功")
  158. @QuotaRouter.post(
  159. "/issuebatch/cancel",
  160. summary="作废手工发放批次",
  161. description="作废当前批次下发放的额度 (alipay.ebpp.invoice.expensecontrol.issuebatch.cancel)",
  162. response_model=ResponseSchema[IssueBatchCancelOutSchema],
  163. )
  164. async def issue_batch_cancel_controller(
  165. data: IssueBatchCancelSchema,
  166. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:issuebatch:cancel"]))],
  167. ) -> JSONResponse:
  168. result = await QuotaService.issue_batch_cancel_service(auth=auth, data=data)
  169. log.info(f"作废手工发放批次成功: issue_batch_id={data.issue_batch_id}")
  170. return SuccessResponse(data=result, msg="作废手工发放批次成功")
  171. @QuotaRouter.post(
  172. "/issuebatch/records",
  173. summary="查询手工发放发放明细",
  174. description="根据批次号分页查询手工发放的发放明细 (alipay.ebpp.invoice.issuebatch.issuerecords.batchquery)",
  175. response_model=ResponseSchema[IssueBatchRecordsQueryOutSchema],
  176. )
  177. async def issue_batch_records_query_controller(
  178. data: IssueBatchRecordsQuerySchema,
  179. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:issuebatch:records"]))],
  180. ) -> JSONResponse:
  181. result = await QuotaService.issue_batch_records_query_service(auth=auth, data=data)
  182. log.info(f"查询手工发放发放明细成功: issue_batch_id={data.issue_batch_id}")
  183. return SuccessResponse(data=result, msg="查询手工发放发放明细成功")
  184. @QuotaRouter.post(
  185. "/outsource/notify",
  186. summary="外部消费额度同步",
  187. description="将外部消费同步到支付宝额度系统 (alipay.ebpp.invoice.expensecomsue.outsource.notify)",
  188. response_model=ResponseSchema[OutsourceNotifyOutSchema],
  189. )
  190. async def outsource_notify_controller(
  191. data: OutsourceNotifySchema,
  192. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:quota:outsource:notify"]))],
  193. ) -> JSONResponse:
  194. result = await OutsourceNotifyService.notify_service(auth=auth, data=data)
  195. log.info(f"外部消费额度同步: out_source_id={result.out_source_id}, success={result.success}")
  196. return SuccessResponse(data=result, msg="外部消费额度同步成功" if result.success else "外部消费额度同步失败")