schema.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. from datetime import datetime
  2. from typing import Optional
  3. from pydantic import BaseModel, ConfigDict, Field
  4. class IssueQuotaTargetSchema(BaseModel):
  5. """发放明细"""
  6. owner_type: str = Field(
  7. description="owner类型: EMPLOYEE(支付宝id)/PHONE(手机号)/ENTERPRISE_PAY_UID(员工企业码id)"
  8. )
  9. owner_id: str = Field(description="owner ID")
  10. quota: float = Field(description="发放额度")
  11. amount: Optional[float] = Field(default=None, description="面额")
  12. class ExpenseQuotaCreateSchema(BaseModel):
  13. """创建余额/点券请求 (alipay.ebpp.invoice.expensecontrol.quota.create)"""
  14. target_type: str = Field(
  15. description="额度维度 (必填): INSTITUTION(制度维度)/EXPENSE_TYPE(费用类型维度)"
  16. )
  17. target_id: str = Field(description="额度维度ID (必填)")
  18. enterprise_id: str = Field(description="企业ID (必填)")
  19. effective_start_date: Optional[datetime] = Field(default=None, description="额度生效时间")
  20. effective_end_date: Optional[datetime] = Field(default=None, description="额度失效时间")
  21. outer_source_id: Optional[str] = Field(default=None, description="外部幂等id")
  22. quota_type: Optional[str] = Field(
  23. default="CAP", description="额度类型: COUPON(点券)/CAP(余额)/COUNT(次卡)"
  24. )
  25. share_mode: Optional[str] = Field(
  26. default="0", description="是否可转增: 0(不可转增)/1(可转增)"
  27. )
  28. issue_name: Optional[str] = Field(default=None, max_length=20, description="发放名称")
  29. issue_desc: Optional[str] = Field(default=None, max_length=200, description="发放描述")
  30. issue_quota_target_list: Optional[list[IssueQuotaTargetSchema]] = Field(
  31. default=None, description="发放明细列表"
  32. )
  33. class QuotaCreateSchema(BaseModel):
  34. """创建额度请求 (本地)"""
  35. employee_id: str = Field(description="员工ID")
  36. institution_id: str = Field(description="制度ID")
  37. total_amount: float = Field(description="总金额")
  38. available_amount: Optional[float] = Field(default=None, description="可用金额")
  39. valid_from: Optional[datetime] = Field(default=None, description="有效期开始")
  40. valid_to: Optional[datetime] = Field(default=None, description="有效期结束")
  41. class QuotaUpdateSchema(BaseModel):
  42. """更新额度请求"""
  43. total_amount: Optional[float] = Field(default=None, description="总金额")
  44. available_amount: Optional[float] = Field(default=None, description="可用金额")
  45. valid_from: Optional[datetime] = Field(default=None, description="有效期开始")
  46. valid_to: Optional[datetime] = Field(default=None, description="有效期结束")
  47. class ExpenseQuotaModifySchema(BaseModel):
  48. """修改余额/点券请求 (alipay.ebpp.invoice.expensecontrol.quota.modify)"""
  49. quota_id: str = Field(description="额度ID (必填)")
  50. action: str = Field(
  51. description="变更模式 (必填): ADD(增加额度)/DEDUCT(减少额度)/MODIFY_SHARE_MODE(修改转赠属性)"
  52. )
  53. outer_source_id: str = Field(description="外部操作幂等ID (必填)")
  54. enterprise_id: str = Field(description="企业ID (必填)")
  55. amount: Optional[float] = Field(default=None, description="变更金额")
  56. share_mode: Optional[str] = Field(
  57. default=None, description="是否可转增: 0(不可转增)/1(可转增)"
  58. )
  59. class ExpenseQuotaDeleteSchema(BaseModel):
  60. """删除额度请求 (alipay.ebpp.invoice.expensecontrol.quota.delete)"""
  61. enterprise_id: str = Field(description="企业ID (必填)")
  62. quota_id: Optional[str] = Field(default=None, description="额度ID")
  63. issue_batch_id: Optional[str] = Field(default=None, description="发放批次ID")
  64. class ExpenseQuotaQuerySchema(BaseModel):
  65. """查询余额/点券请求"""
  66. owner_type: str = Field(
  67. description="额度所属者类型 (必填): EMPLOYEE(支付宝id)/ENTERPRISE_PAY_UID(企业码id)/PHONE(手机号)"
  68. )
  69. page_size: int = Field(default=20, description="每页条数")
  70. page_num: int = Field(default=1, description="页码")
  71. target_type: Optional[str] = Field(
  72. default=None, description="额度维度: EXPENSE_TYPE/RULE_GROUP_AGGREGATION/INSTITUTION"
  73. )
  74. target_id: Optional[str] = Field(default=None, description="额度维度ID")
  75. owner_id: Optional[str] = Field(default=None, description="额度所属者ID")
  76. owner_open_id: Optional[str] = Field(default=None, description="额度所属者开放ID")
  77. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  78. quota_id_list: Optional[list[str]] = Field(default=None, description="额度ID列表")
  79. quota_type: Optional[str] = Field(default=None, description="额度类型: COUPON/CAP")
  80. class QuotaDetailInfoSchema(BaseModel):
  81. """额度详细信息"""
  82. quota_id: Optional[str] = Field(default=None, description="额度ID")
  83. target_type: Optional[str] = Field(default=None, description="额度维度")
  84. target_id: Optional[str] = Field(default=None, description="额度维度ID")
  85. quota_type: Optional[str] = Field(default=None, description="额度类型")
  86. owner_type: Optional[str] = Field(default=None, description="额度所属者类型")
  87. owner_id: Optional[str] = Field(default=None, description="额度所属者ID")
  88. owner_open_id: Optional[str] = Field(default=None, description="额度所属者开放ID")
  89. total_amount: Optional[float] = Field(default=None, description="总金额")
  90. available_amount: Optional[float] = Field(default=None, description="可用金额")
  91. frozen_amount: Optional[float] = Field(default=None, description="冻结金额")
  92. consumed_amount: Optional[float] = Field(default=None, description="已消费金额")
  93. effective_start_date: Optional[str] = Field(default=None, description="生效开始时间")
  94. effective_end_date: Optional[str] = Field(default=None, description="生效结束时间")
  95. status: Optional[str] = Field(default=None, description="状态")
  96. class ExpenseQuotaQueryOutSchema(BaseModel):
  97. """查询余额/点券响应"""
  98. page_size: int = Field(description="每页条数")
  99. page_num: int = Field(description="页码")
  100. total_page_count: int = Field(description="总页数")
  101. total_count: Optional[int] = Field(default=None, description="总记录数")
  102. quota_detail_info_list: Optional[list[QuotaDetailInfoSchema]] = Field(
  103. default=None, description="额度详细信息列表"
  104. )
  105. class QuotaOutSchema(BaseModel):
  106. """额度响应模型"""
  107. model_config = ConfigDict(from_attributes=True)
  108. id: int = Field(description="主键ID")
  109. quota_id: Optional[str] = Field(default=None, description="额度ID")
  110. target_type: Optional[str] = Field(default=None, description="额度维度")
  111. target_id: Optional[str] = Field(default=None, description="额度维度ID")
  112. quota_type: Optional[str] = Field(default=None, description="额度类型")
  113. employee_id: Optional[str] = Field(default=None, description="员工ID")
  114. institution_id: Optional[str] = Field(default=None, description="制度ID")
  115. out_biz_no: Optional[str] = Field(default=None, description="外部业务编号")
  116. total_amount: Optional[float] = Field(default=None, description="总金额")
  117. available_amount: Optional[float] = Field(default=None, description="可用金额")
  118. frozen_amount: Optional[float] = Field(default=None, description="冻结金额")
  119. valid_from: Optional[datetime] = Field(default=None, description="有效期开始")
  120. valid_to: Optional[datetime] = Field(default=None, description="有效期结束")
  121. status: str = Field(description="状态")
  122. created_time: Optional[datetime] = Field(default=None, description="创建时间")
  123. updated_time: Optional[datetime] = Field(default=None, description="更新时间")
  124. class QuotaListOutSchema(BaseModel):
  125. """额度列表响应"""
  126. model_config = ConfigDict(from_attributes=True)
  127. id: int = Field(description="主键ID")
  128. quota_id: Optional[str] = Field(default=None, description="额度ID")
  129. target_type: Optional[str] = Field(default=None, description="额度维度")
  130. target_id: Optional[str] = Field(default=None, description="额度维度ID")
  131. quota_type: Optional[str] = Field(default=None, description="额度类型")
  132. employee_id: Optional[str] = Field(default=None, description="员工ID")
  133. institution_id: Optional[str] = Field(default=None, description="制度ID")
  134. total_amount: Optional[float] = Field(default=None, description="总金额")
  135. available_amount: Optional[float] = Field(default=None, description="可用金额")
  136. status: str = Field(description="状态")
  137. created_time: Optional[datetime] = Field(default=None, description="创建时间")
  138. class QuotaOperationOutSchema(BaseModel):
  139. """额度操作响应"""
  140. model_config = ConfigDict(from_attributes=True)
  141. out_biz_no: Optional[str] = Field(default=None, description="外部业务编号")
  142. quota_id: Optional[str] = Field(default=None, description="额度ID")
  143. result: Optional[bool] = Field(default=None, description="操作结果")
  144. # ========================
  145. # 手工批量发放额度 (issuebatch)
  146. # ========================
  147. class IssueTargetInfoSchema(BaseModel):
  148. """手工发放 - 员工发放信息"""
  149. issue_quota: str = Field(description="发放额度(单位: 元)")
  150. owner_open_id: Optional[str] = Field(default=None, description="员工开放ID")
  151. owner_id: Optional[str] = Field(default=None, description="员工ID")
  152. user_name: Optional[str] = Field(default=None, description="员工姓名")
  153. owner_type: Optional[str] = Field(default=None, description="owner类型: PHONE/EMPLOYEE/ENTERPRISE_PAY_UID")
  154. class IssueBatchCreateSchema(BaseModel):
  155. """手工批量发放额度请求 (alipay.ebpp.invoice.expensecontrol.issuebatch.create)"""
  156. enterprise_id: str = Field(description="企业ID")
  157. issue_name: str = Field(max_length=20, description="发放名称")
  158. quota_type: str = Field(description="额度类型: 只能填写COUPON")
  159. effective_start_date: str = Field(description="额度有效起始时间 (yyyy-MM-dd HH:mm:ss)")
  160. effective_end_date: str = Field(description="额度有效结束时间")
  161. institution_id: str = Field(description="制度ID")
  162. batch_no: str = Field(description="发放批次号(用于幂等校验, 必须是数字)")
  163. share_mode: str = Field(default="0", description="是否可转赠: 0(不可转赠)/1(可转赠)")
  164. issue_desc: Optional[str] = Field(default=None, max_length=200, description="发放说明")
  165. issue_target_info_list: Optional[list[IssueTargetInfoSchema]] = Field(
  166. default=None, description="员工发放信息列表(最多1000条)"
  167. )
  168. class IssueQuotaCheckFailedItem(BaseModel):
  169. """批量发放校验失败项"""
  170. user_name: Optional[str] = Field(default=None, description="员工姓名")
  171. owner_type: Optional[str] = Field(default=None, description="owner类型")
  172. owner_id: Optional[str] = Field(default=None, description="员工ID")
  173. owner_open_id: Optional[str] = Field(default=None, description="员工开放ID")
  174. issue_quota: Optional[str] = Field(default=None, description="发放额度")
  175. message: Optional[str] = Field(default=None, description="失败原因")
  176. result: Optional[bool] = Field(default=None, description="是否成功")
  177. class IssueBatchCreateOutSchema(BaseModel):
  178. """手工批量发放额度响应"""
  179. issue_batch_id: Optional[str] = Field(default=None, description="发放批次ID")
  180. issue_quota_check_failed_list: Optional[list[IssueQuotaCheckFailedItem]] = Field(
  181. default=None, description="校验失败的数据"
  182. )
  183. class IssueBatchCancelSchema(BaseModel):
  184. """手工批量发放作废请求 (alipay.ebpp.invoice.expensecontrol.issuebatch.cancel)"""
  185. enterprise_id: str = Field(description="企业ID")
  186. institution_id: str = Field(description="制度ID")
  187. issue_batch_id: str = Field(description="发放批次ID")
  188. class IssueBatchCancelOutSchema(BaseModel):
  189. """手工批量发放作废响应"""
  190. result: bool = Field(description="是否成功")
  191. class IssueBatchRecordsQuerySchema(BaseModel):
  192. """手工发放发放明细分页查询请求 (alipay.ebpp.invoice.issuebatch.issuerecords.batchquery)"""
  193. enterprise_id: str = Field(description="企业ID")
  194. institution_id: str = Field(description="制度ID")
  195. issue_batch_id: str = Field(description="发放批次ID")
  196. page_size: int = Field(default=20, description="页大小(最大100)")
  197. page_num: int = Field(default=1, description="页码")
  198. class IssueRecordInfoItem(BaseModel):
  199. """发放记录信息"""
  200. quota_id: Optional[str] = Field(default=None, description="额度ID")
  201. issue_quota: Optional[str] = Field(default=None, description="发放额度")
  202. issue_status: Optional[int] = Field(default=None, description="发放状态")
  203. owner_type: Optional[str] = Field(default=None, description="owner类型")
  204. owner_id: Optional[str] = Field(default=None, description="员工ID")
  205. owner_open_id: Optional[str] = Field(default=None, description="员工开放ID")
  206. user_name: Optional[str] = Field(default=None, description="员工姓名")
  207. currency: Optional[str] = Field(default=None, description="币种")
  208. class IssueBatchRecordsQueryOutSchema(BaseModel):
  209. """手工发放发放明细分页查询响应"""
  210. page_num: int = Field(description="页码")
  211. page_size: int = Field(description="页大小")
  212. total_page_count: int = Field(default=0, description="总页数")
  213. issue_record_info_list: Optional[list[IssueRecordInfoItem]] = Field(
  214. default=None, description="发放记录信息列表"
  215. )
  216. class IssueBatchListOutSchema(BaseModel):
  217. """手工发放批次列表响应"""
  218. model_config = ConfigDict(from_attributes=True)
  219. id: int = Field(description="主键ID")
  220. issue_batch_id: Optional[str] = Field(default=None, description="发放批次ID")
  221. batch_no: str = Field(description="发放批次号")
  222. institution_id: str = Field(description="制度ID")
  223. issue_name: str = Field(description="发放名称")
  224. quota_type: str = Field(description="额度类型")
  225. share_mode: str = Field(description="是否可转赠")
  226. total_count: int = Field(description="发放总人数")
  227. total_amount: Optional[float] = Field(default=None, description="发放总金额")
  228. status: str = Field(description="状态")
  229. created_time: Optional[datetime] = Field(default=None, description="创建时间")
  230. updated_time: Optional[datetime] = Field(default=None, description="更新时间")
  231. # ========================
  232. # 员工额度记录 & 变更记录
  233. # ========================
  234. class EmployeeQuotaRecordItem(BaseModel):
  235. """员工维度额度记录项"""
  236. quota_id: Optional[str] = Field(default=None, description="额度ID")
  237. out_biz_no: Optional[str] = Field(default=None, description="外部业务编号")
  238. total_amount: Optional[float] = Field(default=None, description="发放金额")
  239. available_amount: Optional[float] = Field(default=None, description="剩余可用金额")
  240. quota_type: Optional[str] = Field(default=None, description="额度类型")
  241. status: str = Field(description="状态")
  242. valid_from: Optional[datetime] = Field(default=None, description="有效开始时间")
  243. valid_to: Optional[datetime] = Field(default=None, description="有效结束时间")
  244. created_time: Optional[datetime] = Field(default=None, description="发放时间")
  245. institution_id: Optional[str] = Field(default=None, description="制度ID")
  246. class EmployeeQuotaRecordsOutSchema(BaseModel):
  247. """员工额度记录列表响应"""
  248. items: list[EmployeeQuotaRecordItem] = Field(default_factory=list, description="记录列表")
  249. total: int = Field(default=0, description="总数")
  250. class AdjustQuotaSchema(BaseModel):
  251. """调整额度请求"""
  252. quota_id: str = Field(description="额度ID")
  253. enterprise_id: str = Field(description="企业ID")
  254. amount: float = Field(description="调整为的金额")
  255. change_desc: Optional[str] = Field(default=None, description="调整说明")
  256. class QuotaChangeLogItem(BaseModel):
  257. """变更记录项"""
  258. coupon_name: Optional[str] = Field(default=None, description="点券名称")
  259. change_time: Optional[datetime] = Field(default=None, description="变更时间")
  260. change_amount: Optional[float] = Field(default=None, description="变更金额")
  261. change_desc: Optional[str] = Field(default=None, description="变更说明")
  262. change_type: Optional[str] = Field(default=None, description="变更类型")
  263. class QuotaChangeLogOutSchema(BaseModel):
  264. """变更记录列表响应"""
  265. items: list[QuotaChangeLogItem] = Field(default_factory=list, description="变更记录列表")
  266. total: int = Field(default=0, description="总数")