service.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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.utils.snowflake import get_snowflake_id
  6. from .enums import RuleStatusEnum
  7. from .schema import (
  8. ExpenseRuleCreateSchema,
  9. ExpenseRuleDeleteSchema,
  10. ExpenseRuleModifySchema,
  11. RuleCreateSchema,
  12. RuleListOutSchema,
  13. RuleOperationOutSchema,
  14. RuleOutSchema,
  15. RuleUpdateSchema,
  16. )
  17. from .crud import RuleCRUD
  18. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionExpenseruleCreateRequest import (
  19. AlipayEbppInvoiceInstitutionExpenseruleCreateRequest,
  20. )
  21. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionExpenseruleCreateModel import (
  22. AlipayEbppInvoiceInstitutionExpenseruleCreateModel,
  23. )
  24. from alipay.aop.api.domain.StandardConditionInfo import (
  25. StandardConditionInfo,
  26. )
  27. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionExpenseruleCreateResponse import (
  28. AlipayEbppInvoiceInstitutionExpenseruleCreateResponse,
  29. )
  30. class RuleService:
  31. """使用规则服务层"""
  32. @classmethod
  33. async def create_expense_rule_service(
  34. cls, auth: AuthSchema, data: ExpenseRuleCreateSchema
  35. ) -> RuleOperationOutSchema:
  36. """
  37. 创建费控使用规则
  38. 调用: alipay.ebpp.invoice.institution.expenserule.create
  39. """
  40. crud = RuleCRUD(auth)
  41. out_biz_no = data.outer_source_id or str(get_snowflake_id())
  42. model = AlipayEbppInvoiceInstitutionExpenseruleCreateModel()
  43. model.institution_id = data.institution_id
  44. model.standard_name = data.standard_name
  45. model.expense_type_sub_category = data.expense_type_sub_category
  46. model.outer_source_id = out_biz_no
  47. if data.standard_condition_info_list:
  48. condition_list = []
  49. for item in data.standard_condition_info_list:
  50. condition = StandardConditionInfo()
  51. condition.rule_factor = item.rule_factor
  52. condition.rule_value = item.rule_value
  53. if item.rule_operator:
  54. condition.rule_operator = item.rule_operator
  55. if item.rule_name:
  56. condition.rule_name = item.rule_name
  57. condition_list.append(condition)
  58. model.standard_condition_info_list = condition_list
  59. if data.enterprise_id:
  60. model.enterprise_id = data.enterprise_id
  61. if data.open_rule_id:
  62. model.open_rule_id = data.open_rule_id
  63. if data.payment_policy:
  64. model.payment_policy = data.payment_policy
  65. if data.consume_mode:
  66. model.consume_mode = data.consume_mode
  67. request = AlipayEbppInvoiceInstitutionExpenseruleCreateRequest()
  68. request.biz_model = model
  69. client = AlipayClient.get_client()
  70. response = client.execute(request)
  71. if not response:
  72. raise CustomException(msg="创建费控使用规则失败: 无响应")
  73. result = AlipayEbppInvoiceInstitutionExpenseruleCreateResponse()
  74. result.parse_response_content(response)
  75. if not result.is_success():
  76. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  77. raise CustomException(msg=f"创建费控使用规则失败: {result.msg}")
  78. rule_data = data.model_dump(exclude_none=True)
  79. rule_data["out_biz_no"] = out_biz_no
  80. rule_data["name"] = data.standard_name
  81. rule_data["status"] = RuleStatusEnum.RULE_ACTIVE.value
  82. if result.standard_id:
  83. rule_data["standard_id"] = result.standard_id
  84. rule = await crud.create(rule_data)
  85. if not rule:
  86. raise CustomException(msg="创建使用规则记录失败")
  87. return RuleOperationOutSchema(out_biz_no=out_biz_no, rule_id=result.standard_id)
  88. @classmethod
  89. async def create_rule_service(
  90. cls, auth: AuthSchema, data: RuleCreateSchema
  91. ) -> RuleOperationOutSchema:
  92. """创建使用规则"""
  93. crud = RuleCRUD(auth)
  94. out_biz_no = str(get_snowflake_id())
  95. rule_data = data.model_dump(exclude_none=True)
  96. rule_data["out_biz_no"] = out_biz_no
  97. rule = await crud.create(rule_data)
  98. if not rule:
  99. raise CustomException(msg="创建使用规则记录失败")
  100. return RuleOperationOutSchema(out_biz_no=out_biz_no, rule_id=rule.rule_id)
  101. @classmethod
  102. async def modify_expense_rule_service(
  103. cls, auth: AuthSchema, out_biz_no: str, data: ExpenseRuleModifySchema
  104. ) -> RuleOperationOutSchema:
  105. """
  106. 编辑使用规则
  107. 调用: alipay.ebpp.invoice.institution.expenserule.modify
  108. """
  109. crud = RuleCRUD(auth)
  110. rule = await crud.get_by_out_biz_no(out_biz_no)
  111. if not rule:
  112. raise CustomException(msg="使用规则不存在")
  113. try:
  114. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionExpenseruleModifyRequest import (
  115. AlipayEbppInvoiceInstitutionExpenseruleModifyRequest,
  116. )
  117. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionExpenseruleModifyModel import (
  118. AlipayEbppInvoiceInstitutionExpenseruleModifyModel,
  119. )
  120. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionExpenseruleModifyResponse import (
  121. AlipayEbppInvoiceInstitutionExpenseruleModifyResponse,
  122. )
  123. except ImportError:
  124. raise CustomException(msg="支付宝SDK未正确安装,请检查alipay-sdk-python依赖")
  125. model = AlipayEbppInvoiceInstitutionExpenseruleModifyModel()
  126. model.institution_id = data.institution_id
  127. model.standard_id = data.standard_id
  128. model.action = data.action
  129. model.enterprise_id = data.enterprise_id
  130. if data.standard_name:
  131. model.standard_name = data.standard_name
  132. if data.standard_desc:
  133. model.standard_desc = data.standard_desc
  134. if data.open_rule_id:
  135. model.open_rule_id = data.open_rule_id
  136. if data.payment_policy:
  137. model.payment_policy = data.payment_policy
  138. if data.consume_mode:
  139. model.consume_mode = data.consume_mode
  140. request = AlipayEbppInvoiceInstitutionExpenseruleModifyRequest()
  141. request.biz_model = model
  142. client = AlipayClient.get_client()
  143. response = client.execute(request)
  144. if not response:
  145. raise CustomException(msg="编辑使用规则失败: 无响应")
  146. result = AlipayEbppInvoiceInstitutionExpenseruleModifyResponse()
  147. result.parse_response_content(response)
  148. if not result.is_success():
  149. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  150. raise CustomException(msg=f"编辑使用规则失败: {result.msg}")
  151. update_data = data.model_dump(exclude_unset=True, exclude_none=True)
  152. exclude_fields = ["institution_id", "standard_id", "action", "enterprise_id"]
  153. for field in exclude_fields:
  154. update_data.pop(field, None)
  155. if update_data:
  156. await crud.update(id=rule.id, data=update_data)
  157. return RuleOperationOutSchema(out_biz_no=out_biz_no, rule_id=data.standard_id)
  158. @classmethod
  159. async def delete_expense_rule_service(
  160. cls, auth: AuthSchema, out_biz_no: str, data: ExpenseRuleDeleteSchema
  161. ) -> RuleOperationOutSchema:
  162. """
  163. 删除使用规则
  164. 调用: alipay.ebpp.invoice.institution.expenserule.delete
  165. """
  166. crud = RuleCRUD(auth)
  167. rule = await crud.get_by_out_biz_no(out_biz_no)
  168. if not rule:
  169. raise CustomException(msg="使用规则不存在")
  170. try:
  171. from alipay.aop.api.request.AlipayEbppInvoiceInstitutionExpenseruleDeleteRequest import (
  172. AlipayEbppInvoiceInstitutionExpenseruleDeleteRequest,
  173. )
  174. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionExpenseruleDeleteModel import (
  175. AlipayEbppInvoiceInstitutionExpenseruleDeleteModel,
  176. )
  177. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionExpenseruleDeleteResponse import (
  178. AlipayEbppInvoiceInstitutionExpenseruleDeleteResponse,
  179. )
  180. except ImportError:
  181. raise CustomException(msg="支付宝SDK未正确安装,请检查alipay-sdk-python依赖")
  182. model = AlipayEbppInvoiceInstitutionExpenseruleDeleteModel()
  183. model.institution_id = data.institution_id
  184. model.standard_id_list = data.standard_id_list
  185. model.enterprise_id = data.enterprise_id
  186. request = AlipayEbppInvoiceInstitutionExpenseruleDeleteRequest()
  187. request.biz_model = model
  188. client = AlipayClient.get_client()
  189. response = client.execute(request)
  190. if not response:
  191. raise CustomException(msg="删除使用规则失败: 无响应")
  192. result = AlipayEbppInvoiceInstitutionExpenseruleDeleteResponse()
  193. result.parse_response_content(response)
  194. if not result.is_success():
  195. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  196. raise CustomException(msg=f"删除使用规则失败: {result.msg}")
  197. await crud.delete(id=rule.id)
  198. return RuleOperationOutSchema(
  199. out_biz_no=out_biz_no,
  200. result=result.result,
  201. )
  202. @classmethod
  203. async def list_service(
  204. cls,
  205. auth: AuthSchema,
  206. page_no: int = 1,
  207. page_size: int = 20,
  208. search: dict | None = None,
  209. ) -> dict:
  210. crud = RuleCRUD(auth)
  211. offset = (page_no - 1) * page_size
  212. return await crud.page(
  213. offset=offset,
  214. limit=page_size,
  215. order_by=[{"id": "desc"}],
  216. search=search or {},
  217. out_schema=RuleListOutSchema,
  218. )
  219. @classmethod
  220. async def detail_service(
  221. cls, auth: AuthSchema, out_biz_no: str
  222. ) -> RuleOutSchema:
  223. crud = RuleCRUD(auth)
  224. rule = await crud.get_by_out_biz_no(out_biz_no)
  225. if not rule:
  226. raise CustomException(msg="使用规则不存在")
  227. return RuleOutSchema.model_validate(rule)
  228. @classmethod
  229. async def update_service(
  230. cls, auth: AuthSchema, out_biz_no: str, data: RuleUpdateSchema
  231. ) -> RuleOperationOutSchema:
  232. crud = RuleCRUD(auth)
  233. rule = await crud.get_by_out_biz_no(out_biz_no)
  234. if not rule:
  235. raise CustomException(msg="使用规则不存在")
  236. update_data = data.model_dump(exclude_unset=True)
  237. if update_data:
  238. await crud.update(id=rule.id, data=update_data)
  239. return RuleOperationOutSchema(out_biz_no=out_biz_no, rule_id=rule.rule_id)