schema.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. from datetime import datetime
  2. from typing import Optional
  3. from pydantic import BaseModel, ConfigDict, Field, model_validator
  4. class StandardConditionInfoSchema(BaseModel):
  5. """使用规则因子"""
  6. rule_factor: str = Field(description="条件类型")
  7. rule_value: str = Field(description="条件值")
  8. rule_operator: Optional[str] = Field(
  9. default=None, description="操作符: LT(<)/LE(<=)/EQ(=)/NE(!=)/GE(>=)/GT(>)"
  10. )
  11. rule_name: Optional[str] = Field(default=None, description="条件名称")
  12. class AssetShareSourceInfoSchema(BaseModel):
  13. """资产共享源信息"""
  14. share_mode: str = Field(description="共享模式")
  15. source_id_list: list[str] = Field(description="源ID列表")
  16. class ExpenseRuleCreateSchema(BaseModel):
  17. """创建费控使用规则请求 (alipay.ebpp.invoice.institution.expenserule.create)"""
  18. institution_id: str = Field(description="制度ID (必填)")
  19. standard_name: str = Field(max_length=20, description="费控规则名称 (必填)")
  20. standard_desc: Optional[str] = Field(default=None, description="规则描述")
  21. expense_type_sub_category: str = Field(
  22. description="费用类型子类 (必填): TAKE_AWAY(外卖)/REACH_SHOP(到店)/METRO(地铁)"
  23. )
  24. standard_condition_info_list: list[StandardConditionInfoSchema] = Field(
  25. description="使用规则因子列表 (必填)"
  26. )
  27. enterprise_id: Optional[str] = Field(default=None, description="企业码ID")
  28. account_id: Optional[str] = Field(default=None, description="企业共同账户ID (已废弃)")
  29. agreement_no: Optional[str] = Field(default=None, description="授权签约协议号 (已废弃)")
  30. outer_source_id: Optional[str] = Field(default=None, description="外部唯一标识(幂等)")
  31. open_rule_id: Optional[str] = Field(default=None, description="开票规则ID")
  32. payment_policy: Optional[str] = Field(
  33. default=None, description="支付策略: PERSONAL(全部个人账户)/COMBINATION(组合支付)"
  34. )
  35. consume_mode: Optional[str] = Field(
  36. default=None, description="消费模式: COUPON_ONLY/COUPON_AND_CAP/DEFAULT"
  37. )
  38. expense_cert_type: Optional[str] = Field(default=None, description="费用凭证类型")
  39. personal_qrcode_mode: Optional[int] = Field(default=None, description="个人二维码模式")
  40. asset_share_source_info: Optional[AssetShareSourceInfoSchema] = Field(default=None, description="资产共享源信息")
  41. class ExpenseRuleDeleteSchema(BaseModel):
  42. """删除费控使用规则请求"""
  43. institution_id: str = Field(description="制度ID")
  44. standard_id_list: list[str] = Field(description="使用规则ID列表")
  45. enterprise_id: str = Field(description="企业ID")
  46. class ExpenseRuleModifySchema(BaseModel):
  47. """编辑费控使用规则请求"""
  48. institution_id: str = Field(description="制度ID")
  49. standard_id: str = Field(description="使用规则ID")
  50. action: str = Field(description="操作类型")
  51. standard_name: Optional[str] = Field(default=None, description="规则名称")
  52. standard_desc: Optional[str] = Field(default=None, description="规则描述")
  53. expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类")
  54. standard_condition_info_list: Optional[list[StandardConditionInfoSchema]] = Field(
  55. default=None, description="使用规则因子列表"
  56. )
  57. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  58. outer_source_id: Optional[str] = Field(default=None, description="外部唯一标识")
  59. open_rule_id: Optional[str] = Field(default=None, description="开票规则ID")
  60. payment_policy: Optional[str] = Field(default=None, description="支付策略")
  61. consume_mode: Optional[str] = Field(default=None, description="消费模式")
  62. expense_cert_type: Optional[str] = Field(default=None, description="凭证类型")
  63. class RuleCreateSchema(BaseModel):
  64. """创建使用规则请求"""
  65. institution_id: str = Field(description="制度ID")
  66. standard_name: str = Field(max_length=20, description="规则名称")
  67. standard_desc: Optional[str] = Field(default=None, description="规则描述")
  68. expense_type_sub_category: str = Field(description="费用类型子类")
  69. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  70. class RuleOperationOutSchema(BaseModel):
  71. """使用规则操作响应"""
  72. out_biz_no: str = Field(description="外部业务编号")
  73. rule_id: Optional[str] = Field(default=None, description="规则ID")
  74. result: Optional[str] = Field(default=None, description="操作结果")
  75. class RuleListOutSchema(BaseModel):
  76. """使用规则列表响应"""
  77. model_config = ConfigDict(from_attributes=True)
  78. id: int = Field(description="主键ID")
  79. out_biz_no: str = Field(description="外部业务编号")
  80. institution_id: str = Field(description="制度ID")
  81. rule_id: Optional[str] = Field(default=None, description="规则ID")
  82. standard_name: Optional[str] = Field(default=None, description="规则名称")
  83. expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类")
  84. status: Optional[str] = Field(default=None, description="状态")
  85. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  86. single_limit: Optional[float] = Field(default=None, description="单笔限额")
  87. max_day_amount: Optional[float] = Field(default=None, description="日限额")
  88. max_month_amount: Optional[float] = Field(default=None, description="月限额")
  89. max_quarter_amount: Optional[float] = Field(default=None, description="季限额")
  90. max_year_amount: Optional[float] = Field(default=None, description="年限额")
  91. condition_info: Optional[list] = Field(default=None, description="规则条件列表")
  92. created_time: Optional[datetime] = Field(default=None, description="创建时间")
  93. updated_time: Optional[datetime] = Field(default=None, description="更新时间")
  94. @model_validator(mode="after")
  95. def extract_period_limits(self):
  96. """从 condition_info 中提取日/月/季/年限额"""
  97. if not self.condition_info:
  98. return self
  99. for cond in self.condition_info:
  100. factor = cond.get("rule_factor")
  101. try:
  102. value = float(cond.get("rule_value", 0))
  103. except (ValueError, TypeError):
  104. continue
  105. if factor == "QUOTA_DAY":
  106. self.max_day_amount = value
  107. elif factor == "QUOTA_MONTH":
  108. self.max_month_amount = value
  109. elif factor == "QUOTA_QUARTER":
  110. self.max_quarter_amount = value
  111. elif factor == "QUOTA_YEAR":
  112. self.max_year_amount = value
  113. return self
  114. class RuleOutSchema(BaseModel):
  115. """使用规则详情响应"""
  116. model_config = ConfigDict(from_attributes=True)
  117. out_biz_no: str = Field(description="外部业务编号")
  118. institution_id: str = Field(description="制度ID")
  119. rule_id: Optional[str] = Field(default=None, description="规则ID")
  120. standard_name: Optional[str] = Field(default=None, description="规则名称")
  121. standard_desc: Optional[str] = Field(default=None, description="规则描述")
  122. expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类")
  123. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  124. status: Optional[str] = Field(default=None, description="状态")
  125. class RuleUpdateSchema(BaseModel):
  126. """更新使用规则请求"""
  127. institution_id: Optional[str] = Field(default=None, description="制度ID")
  128. standard_name: Optional[str] = Field(default=None, description="规则名称")
  129. standard_desc: Optional[str] = Field(default=None, description="规则描述")
  130. expense_type_sub_category: Optional[str] = Field(default=None, description="费用类型子类")
  131. status: Optional[str] = Field(default=None, description="状态")
  132. enterprise_id: Optional[str] = Field(default=None, description="企业ID")