service.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. from app.api.v1.module_system.auth.schema import AuthSchema
  2. from app.core.alipay import AlipayClient
  3. from app.core.exceptions import CustomException
  4. from app.core.logger import log
  5. from app.plugin.module_payment.expense.institution.schema import InstitutionListOutSchema, InstitutionCreateSchema
  6. from .crud import InstitutionCRUD
  7. from .enums import InstitutionStatusEnum
  8. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionCreateRequest import (
  9. AlipayEbppInvoiceInstitutionCreateRequest,
  10. )
  11. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionCreateModel import (
  12. AlipayEbppInvoiceInstitutionCreateModel,
  13. )
  14. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionCreateResponse import (
  15. AlipayEbppInvoiceInstitutionCreateResponse,
  16. )
  17. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionPageinfoQueryRequest import (
  18. AlipayEbppInvoiceInstitutionPageinfoQueryRequest,
  19. )
  20. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionPageinfoQueryModel import (
  21. AlipayEbppInvoiceInstitutionPageinfoQueryModel,
  22. )
  23. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionPageinfoQueryResponse import (
  24. AlipayEbppInvoiceInstitutionPageinfoQueryResponse,
  25. )
  26. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionDeleteRequest import (
  27. AlipayEbppInvoiceInstitutionDeleteRequest,
  28. )
  29. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionDeleteModel import (
  30. AlipayEbppInvoiceInstitutionDeleteModel,
  31. )
  32. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionDeleteResponse import (
  33. AlipayEbppInvoiceInstitutionDeleteResponse,
  34. )
  35. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionModifyRequest import (
  36. AlipayEbppInvoiceInstitutionModifyRequest,
  37. )
  38. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionModifyModel import (
  39. AlipayEbppInvoiceInstitutionModifyModel,
  40. )
  41. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionModifyResponse import (
  42. AlipayEbppInvoiceInstitutionModifyResponse,
  43. )
  44. class InstitutionService:
  45. """费控制度服务层"""
  46. @classmethod
  47. async def create_institution_service(
  48. cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionCreateModel
  49. ) -> AlipayEbppInvoiceInstitutionCreateResponse:
  50. """
  51. 创建费控制度
  52. 调用: alipay.ebpp.invoice.institution.create
  53. """
  54. if data.enterprise_id is None:
  55. raise CustomException(msg="创建费控制度失败: 企业ID不能为空")
  56. if data.outer_source_id:
  57. data.outer_source_id = None
  58. data.currency = 'CNY'
  59. request = AlipayEbppInvoiceInstitutionCreateRequest()
  60. request.biz_model = data
  61. client = AlipayClient.get_client()
  62. response = client.execute(request)
  63. if not response:
  64. raise CustomException(msg="创建费控制度失败: 无响应")
  65. result = AlipayEbppInvoiceInstitutionCreateResponse()
  66. result.parse_response_content(response)
  67. if not result.is_success():
  68. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  69. raise CustomException(msg=f"创建费控制度失败: {result.msg}")
  70. # 构建创建数据
  71. create_data = InstitutionCreateSchema(
  72. enterprise_id=data.enterprise_id,
  73. institution_id=result.institution_id,
  74. institution_name=getattr(data, 'institution_name', None),
  75. institution_desc=getattr(data, 'institution_desc', None),
  76. scene_type=getattr(data, 'scene_type', None),
  77. expense_type=getattr(data, 'expense_type', None),
  78. expense_sub_type=getattr(data, 'expense_sub_type', None),
  79. status=InstitutionStatusEnum.INSTITUTION_CREATE.value, # 初始状态
  80. effective=getattr(data, 'effective', None),
  81. effective_start_date=getattr(data, 'effective_start_date', None),
  82. effective_end_date=getattr(data, 'effective_end_date', None),
  83. consult_mode=getattr(data, 'consult_mode', None),
  84. multi_employee_share_mode=getattr(data, 'multi_employee_share_mode', None),
  85. currency=getattr(data, 'currency', None)
  86. )
  87. # 转换为字典并添加额外字段
  88. create_data_dict = create_data.model_dump(exclude_unset=True)
  89. crud = InstitutionCRUD(auth)
  90. await crud.create(create_data_dict)
  91. return result
  92. @classmethod
  93. async def list_service(
  94. cls,
  95. auth: AuthSchema,
  96. page_no: int = 1,
  97. page_size: int = 20,
  98. search: dict | None = None,
  99. ) -> dict:
  100. """
  101. 查询费控制度列表
  102. """
  103. crud = InstitutionCRUD(auth)
  104. offset = (page_no - 1) * page_size
  105. return await crud.page(
  106. offset=offset,
  107. limit=page_size,
  108. order_by=[{"id": "desc"}],
  109. search=search or {},
  110. out_schema=InstitutionListOutSchema,
  111. )
  112. @classmethod
  113. async def delete_institution_service(
  114. cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionDeleteModel
  115. ) -> AlipayEbppInvoiceInstitutionDeleteResponse:
  116. """
  117. 删除费控制度
  118. 调用: alipay.ebpp.invoice.institution.delete
  119. """
  120. request = AlipayEbppInvoiceInstitutionDeleteRequest()
  121. request.biz_model = data
  122. client = AlipayClient.get_client()
  123. response = client.execute(request)
  124. if not response:
  125. raise CustomException(msg="删除费控制度失败: 无响应")
  126. result = AlipayEbppInvoiceInstitutionDeleteResponse()
  127. result.parse_response_content(response)
  128. if not result.is_success():
  129. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  130. raise CustomException(msg=f"删除费控制度失败: {result.msg}")
  131. return result
  132. @classmethod
  133. async def modify_institution_service(
  134. cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionModifyModel
  135. ) -> AlipayEbppInvoiceInstitutionModifyResponse:
  136. """
  137. 编辑费控制度
  138. 调用: alipay.ebpp.invoice.institution.modify
  139. """
  140. if data.institution_id is None:
  141. raise CustomException(msg="编辑费控制度失败: 制度ID不能为空")
  142. request = AlipayEbppInvoiceInstitutionModifyRequest()
  143. request.biz_model = data
  144. client = AlipayClient.get_client()
  145. response = client.execute(request)
  146. if not response:
  147. raise CustomException(msg="编辑费控制度失败: 无响应")
  148. result = AlipayEbppInvoiceInstitutionModifyResponse()
  149. result.parse_response_content(response)
  150. if not result.is_success():
  151. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  152. raise CustomException(msg=f"编辑费控制度失败: {result.msg}")
  153. # 更新本地数据库状态
  154. # crud = InstitutionCRUD(auth)
  155. # update_data = {}
  156. # if hasattr(data, 'institution_name') and data.institution_name:
  157. # update_data['institution_name'] = data.institution_name
  158. # if hasattr(data, 'institution_desc') and data.institution_desc:
  159. # update_data['institution_desc'] = data.institution_desc
  160. # if hasattr(data, 'effective') and data.effective is not None:
  161. # update_data['effective'] = data.effective
  162. # if hasattr(data, 'effective_start_date') and data.effective_start_date:
  163. # update_data['effective_start_date'] = data.effective_start_date
  164. # if hasattr(data, 'effective_end_date') and data.effective_end_date:
  165. # update_data['effective_end_date'] = data.effective_end_date
  166. # if hasattr(data, 'consult_mode') and data.consult_mode:
  167. # update_data['consult_mode'] = data.consult_mode
  168. # if update_data:
  169. # await crud.update({'institution_id': data.institution_id}, update_data)
  170. return result