schema.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. from datetime import datetime
  2. from decimal import Decimal
  3. from typing import List, Optional
  4. from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator, model_validator
  5. class BankcardExtInfoSchema(BaseModel):
  6. """银行卡信息"""
  7. # account_type|收款账户类型
  8. # 【描述】收款账户类型。 1:对公(在金融机构开设的公司账户),如果银行卡为对公,必须传递省市支行信息或者联行号
  9. # 2:对私(在金融机构开设的个人账户)
  10. account_type: str = Field(description="收款账户类型: 1/2。对公: 1,对私: 2")
  11. # inst_name|机构名称
  12. # 【描述】当收款账户为对公账户时,机构名称必填;当收款账户为对私账户时,机构名称可为空。
  13. inst_name: Optional[str] = Field(default=None, description="机构名称")
  14. # 【描述】银行所在省份
  15. inst_province: Optional[str] = Field(default=None, description="银行所在省份")
  16. # inst_city|收款银行所在市
  17. # 【描述】收款银行所在市
  18. inst_city: Optional[str] = Field(default=None, description="收款银行所在市")
  19. # inst_branch_name|收款银行所属支行
  20. # 【描述】收款银行所属支行
  21. inst_branch_name: Optional[str] = Field(default=None, description="收款银行所属支行")
  22. # bank_code|银行支行联行号
  23. # 【描述】银行支行联行号
  24. bank_code: Optional[str] = Field(default=None, description="银行支行联行号")
  25. @field_validator("account_type")
  26. def validate_account_type(cls, v: str) -> str:
  27. if v not in ["1", "2"]:
  28. raise ValueError(f"account_type 必须是 {['1', '2']}")
  29. return v
  30. @model_validator(mode='after')
  31. def validate_inst_name(self) -> 'BankcardExtInfoSchema':
  32. """验证对公账户时inst_name必填"""
  33. if self.account_type == "1" and self.inst_name is None:
  34. raise ValueError("当 account_type 是 1 时,inst_name 必填")
  35. return self
  36. class PayeeInfoSchema(BaseModel):
  37. """收款方信息"""
  38. identity_type: str = Field(description="收款方类型: ALIPAY_ACCOUNT/BANK_CARD/BOOK")
  39. name: str = Field(description="收款方真实姓名")
  40. identity: str = Field(description="收款方唯一标识")
  41. bankcard_ext_info: Optional[BankcardExtInfoSchema] = Field(default=None, description="银行卡信息")
  42. @field_validator("identity_type")
  43. def validate_identity_type(cls, v: str) -> str:
  44. if v == "alipay":
  45. return "ALIPAY_ACCOUNT"
  46. elif v == "bank":
  47. return "BANK_CARD"
  48. elif v == "book":
  49. return "BOOK"
  50. # else:
  51. # raise ValueError(f"identity_type must be one of {['alipay', 'bank', 'book']}")
  52. return v
  53. @model_validator(mode='after')
  54. def validate_bankcard_ext_info(self) -> 'PayeeInfoSchema':
  55. """验证银行卡类型时bankcard_ext_info必填"""
  56. if self.identity_type == "BANK_CARD" and self.bankcard_ext_info is None:
  57. raise ValueError("当 identity_type 是银行卡时,bankcard_ext_info 必填")
  58. return self
  59. class AccountAuthorizeApplySchema(BaseModel):
  60. """申请转账授权签约请求"""
  61. enterprise_id: str = Field(description="企业ID")
  62. class AccountAuthorizeCallbackSchema(BaseModel):
  63. """转账授权回调通知请求"""
  64. enterprise_id: str = Field(description="企业ID")
  65. status: str = Field(description="协议状态: NORMAL")
  66. sign_time: str = Field(description="签约时间")
  67. class AccountCreateSchema(BaseModel):
  68. """开通资金专户请求"""
  69. enterprise_id: str = Field(description="企业ID")
  70. account_type: Optional[str] = Field(default="ALL", description="账户类型: INCOME/DISBURSE/ALL")
  71. scene: Optional[str] = Field(default="B2B_TRANS", description="场景类型: ENT_CREDIT/B2B_TRANS")
  72. account_book_id: Optional[str] = Field(default=None, description="资金专户号")
  73. remark: Optional[str] = Field(default=None, description="备注")
  74. class AccountDepositSchema(BaseModel):
  75. """资金专户充值请求"""
  76. enterprise_id: str = Field(description="企业ID")
  77. account_book_id: str = Field(description="资金专户号")
  78. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="充值金额")
  79. out_biz_no: Optional[str] = Field(default=None, description="外部订单号")
  80. remark: Optional[str] = Field(default=None, description="充值备注")
  81. class AccountTransferSchema(BaseModel):
  82. """资金专户转账请求"""
  83. account_book_id: str = Field(description="付款方资金专户号")
  84. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  85. out_biz_no: Optional[str] = Field(default=None, description="商家侧订单号")
  86. # 转账总金额,单位为元,精确到小数点后两位
  87. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="转账金额")
  88. order_title: Optional[str] = Field(default=None, description="转账标题")
  89. remark: Optional[str] = Field(default=None, description="转账备注")
  90. payee_info: PayeeInfoSchema = Field(description="收款方信息")
  91. employee_id: Optional[str] = Field(default=None, description="员工ID")
  92. priority: Optional[str] = Field(default="NORMAL", description="优先级: HIGH/NORMAL/LOW")
  93. ext_info: Optional[dict] = Field(default=None, description="扩展信息")
  94. @model_validator(mode="after")
  95. def validate_ext_info(self):
  96. if self.ext_info and not isinstance(self.ext_info, dict):
  97. raise ValueError("ext_info 需要是字典类型")
  98. return self
  99. class TenantTransferCreate(BaseModel):
  100. """租户API转账请求"""
  101. account_book_id: str = Field(description="付款方资金专户号")
  102. enterprise_id: Optional[str] = Field(description="企业ID")
  103. # 转账总金额,单位为元,精确到小数点后两位
  104. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="转账金额")
  105. order_title: Optional[str] = Field(default=None, description="转账标题")
  106. remark: Optional[str] = Field(default=None, description="转账备注")
  107. payee_info: PayeeInfoSchema = Field(description="收款方信息")
  108. class TenantTransferResponse(BaseModel):
  109. """租户API转账响应"""
  110. status: Optional[str] = Field(description="转账状态,SUCCESS:成功(对转账到银行卡的单据, 该状态可能变为退票[REFUND]); FAIL:失败; DEALING:处理中(转账到支付宝账户不涉及); REFUND:退票(转账到支付宝账户不涉及)")
  111. order_no: Optional[str] = Field(default=None, description="支付宝转账单号")
  112. fund_order_id: Optional[str] = Field(default=None, description="宝支付资金流水号")
  113. class AccountWithdrawSchema(BaseModel):
  114. """资金专户提现请求"""
  115. enterprise_id: str = Field(description="企业ID")
  116. account_book_id: str = Field(description="资金专户号")
  117. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="提现金额")
  118. remark: Optional[str] = Field(default=None, description="提现备注")
  119. class AccountQuerySchema(BaseModel):
  120. """资金专户查询请求"""
  121. enterprise_id: str = Field(description="企业ID")
  122. class AccountOutSchema(BaseModel):
  123. """资金专户响应模型"""
  124. model_config = ConfigDict(from_attributes=True)
  125. id: int = Field(description="主键ID")
  126. enterprise_id: Optional[str] = Field(default=None, description="所属企业ID")
  127. account_book_id: Optional[str] = Field(default=None, description="资金专户号")
  128. account_name: Optional[str] = Field(default=None, description="专户名称")
  129. scene: str = Field(description="场景类型")
  130. sign_status: str = Field(description="授权状态")
  131. sign_time: Optional[datetime] = Field(default=None, description="授权时间")
  132. status: str = Field(description="专户状态")
  133. created_time: datetime = Field(description="创建时间")
  134. updated_time: datetime = Field(description="更新时间")
  135. class AccountAuthorizeApplyOutSchema(BaseModel):
  136. """申请转账授权响应"""
  137. sign_url: Optional[str] = Field(description="签约链接")
  138. class AccountDepositOutSchema(BaseModel):
  139. """充值响应"""
  140. url: Optional[str] = Field(description="充值确认页面URL")
  141. class AccountTransferOutSchema(BaseModel):
  142. """转账响应"""
  143. status: Optional[str] = Field(description="转账状态,SUCCESS:成功(对转账到银行卡的单据, 该状态可能变为退票[REFUND]); FAIL:失败; DEALING:处理中(转账到支付宝账户不涉及); REFUND:退票(转账到支付宝账户不涉及)")
  144. order_no: Optional[str] = Field(default=None, description="支付宝转账单号")
  145. fund_order_id: Optional[str] = Field(default=None, description="宝支付资金流水号")
  146. out_biz_no: Optional[str] = Field(default=None, description="平台流水号")
  147. class AccountTransferBatchSchema(BaseModel):
  148. """批量资金专户转账请求"""
  149. transfers: List[AccountTransferSchema] = Field(
  150. description="转账列表"
  151. )
  152. callback_url: Optional[str] = Field(
  153. default=None,
  154. description="转账结果回调URL"
  155. )
  156. class AccountTransferBatchOutSchema(BaseModel):
  157. """批量转账响应"""
  158. batch_id: str = Field(description="批次ID")
  159. status: str = Field(description="状态: PENDING/PROCESSING/COMPLETED")
  160. total: int = Field(description="总笔数")
  161. processed: int = Field(description="已处理笔数")
  162. success: int = Field(description="成功笔数")
  163. failed: int = Field(description="失败笔数")
  164. class TransferResultSchema(BaseModel):
  165. """单笔转账结果"""
  166. out_biz_no: str = Field(description="商家侧订单号")
  167. status: str = Field(description="状态: SUCCESS/FAIL")
  168. order_no: Optional[str] = Field(default=None, description="支付宝转账单号")
  169. error_msg: Optional[str] = Field(default=None, description="错误信息")
  170. class TransferTaskSchema(BaseModel):
  171. """转账任务"""
  172. task_id: str = Field(description="任务ID")
  173. enterprise_id: str = Field(description="企业ID")
  174. account_book_id: str = Field(description="资金专户号")
  175. out_biz_no: str = Field(description="商家侧订单号")
  176. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="转账金额")
  177. order_title: str = Field(description="转账标题")
  178. payee_info: PayeeInfoSchema = Field(description="收款方信息")
  179. priority: str = Field(default="NORMAL", description="优先级: HIGH/NORMAL/LOW")
  180. status: str = Field(default="PENDING", description="状态: PENDING/PROCESSING/SUCCESS/FAILED/RETRYING")
  181. retries: int = Field(default=0, description="重试次数")
  182. created_at: str = Field(description="创建时间")
  183. class TransferSyncStatusSchema(BaseModel):
  184. """手动同步转账状态请求"""
  185. out_biz_no: str = Field(description="商家侧订单号")
  186. status: str = Field(description="同步后的状态: SUCCESS/FAIL")
  187. error_code: Optional[str] = Field(default=None, description="错误码")
  188. error_msg: Optional[str] = Field(default=None, description="错误信息")
  189. class TransferTaskOutSchema(BaseModel):
  190. """转账任务响应"""
  191. task_id: str = Field(description="任务ID")
  192. status: str = Field(description="任务状态")
  193. enterprise_id: str = Field(description="企业ID")
  194. out_biz_no: str = Field(description="商家侧订单号")
  195. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="转账金额")
  196. priority: str = Field(description="优先级")
  197. created_at: str = Field(description="创建时间")
  198. class TransferQueueStatusSchema(BaseModel):
  199. """队列状态"""
  200. enterprise_id: str = Field(description="企业ID")
  201. pending_count: int = Field(description="待处理任务数")
  202. processing_count: int = Field(description="处理中任务数")
  203. completed_count: int = Field(description="已完成任务数")
  204. high_priority_count: int = Field(description="高优先级任务数")
  205. normal_priority_count: int = Field(description="普通优先级任务数")
  206. low_priority_count: int = Field(description="低优先级任务数")
  207. class TransferOutSchema(BaseModel):
  208. """转账记录响应"""
  209. model_config = ConfigDict(from_attributes=True)
  210. # id: int = Field(description="主键ID")
  211. enterprise_id: Optional[str] = Field(default=None, description="所属企业ID")
  212. out_biz_no: Optional[str] = Field(default=None, description="商家侧订单号")
  213. account_book_id: Optional[str] = Field(default=None, description="付款方资金专户号")
  214. amount: Decimal = Field(max_digits=10, decimal_places=2, gt=0, description="转账金额")
  215. order_title: Optional[str] = Field(default=None, description="转账标题")
  216. payee_info: Optional[PayeeInfoSchema] = Field(default=None, description="收款方信息")
  217. status: str = Field(description="转账状态")
  218. remark: Optional[str] = Field(default=None,description="备注")
  219. order_no: Optional[str] = Field(default=None, description="支付宝转账单号")
  220. error_code: Optional[str] = Field(default=None, description="错误码")
  221. error_msg: Optional[str] = Field(default=None, description="错误信息")
  222. # ext_info: Optional[dict] = Field(default=None, description="扩展信息")
  223. created_time: datetime = Field(description="创建时间")
  224. third_biz_no: Optional[str] = Field(default=None, description="三方侧订单号")
  225. @field_validator("payee_info", mode="after")
  226. def normal_payee_info(cls, v: Optional["PayeeInfoSchema"]) -> Optional["PayeeInfoSchema"]:
  227. if v is None:
  228. return v
  229. # 脱敏处理
  230. if v.identity_type == "BANK_CARD" and v.identity:
  231. # 银行卡号:保留前4位和后4位
  232. if len(v.identity) >= 8:
  233. v.identity = v.identity[:4] + "*" * (len(v.identity) - 8) + v.identity[-4:]
  234. elif v.identity_type == "ALIPAY_ACCOUNT" and v.identity:
  235. # 支付宝账号脱敏
  236. if "@" in v.identity:
  237. # 邮箱格式:保留@前第一个字符和域名
  238. parts = v.identity.split("@")
  239. if len(parts[0]) > 1:
  240. v.identity = parts[0][0] + "*" * 3 + "@" + parts[1]
  241. else:
  242. # 手机号格式:保留前3位和后4位
  243. if len(v.identity) >= 7:
  244. v.identity = v.identity[:3] + "*" * (len(v.identity) - 7) + v.identity[-4:]
  245. # 姓名脱敏:只保留第一个字
  246. if v.name and len(v.name) > 1:
  247. v.name = v.name[0] + "*" * (len(v.name) - 1)
  248. # 银行卡扩展信息脱敏
  249. if v.bankcard_ext_info:
  250. if v.bankcard_ext_info.inst_name:
  251. v.bankcard_ext_info.inst_name = "***"
  252. return v
  253. @field_serializer('amount')
  254. def serialize_amount(self, value: Decimal) -> str:
  255. """将 Decimal 序列化为保留两位小数的字符串"""
  256. return f"{value:.2f}"
  257. class TransferListOutSchema(BaseModel):
  258. """转账记录列表响应"""
  259. model_config = ConfigDict(from_attributes=True)
  260. id: int = Field(description="主键ID")
  261. out_biz_no: Optional[str] = Field(default=None, description="商家侧订单号")
  262. account_book_id: Optional[str] = Field(default=None, description="付款方资金专户号")
  263. amount: Optional[float] = Field(default=None, description="转账金额")
  264. order_title: Optional[str] = Field(default=None, description="转账标题")
  265. status: str = Field(description="转账状态")
  266. order_no: Optional[str] = Field(default=None, description="支付宝转账单号")
  267. fund_order_id: Optional[str] = Field(default=None, description="宝支付资金流水号")
  268. payee_info: Optional[PayeeInfoSchema] = Field(default=None, description="收款方信息")
  269. created_time: datetime = Field(description="创建时间")
  270. @field_validator("payee_info", mode="after")
  271. def normal_payee_info(cls, v: Optional["PayeeInfoSchema"]) -> Optional["PayeeInfoSchema"]:
  272. if v is None:
  273. return v
  274. # 脱敏处理
  275. if v.identity_type == "BANK_CARD" and v.identity:
  276. # 银行卡号:保留前4位和后4位
  277. if len(v.identity) >= 8:
  278. v.identity = v.identity[:4] + "*" * (len(v.identity) - 8) + v.identity[-4:]
  279. elif v.identity_type == "ALIPAY_ACCOUNT" and v.identity:
  280. # 支付宝账号脱敏
  281. if "@" in v.identity:
  282. # 邮箱格式:保留@前第一个字符和域名
  283. parts = v.identity.split("@")
  284. if len(parts[0]) > 1:
  285. v.identity = parts[0][0] + "*" * 3 + "@" + parts[1]
  286. else:
  287. # 手机号格式:保留前3位和后4位
  288. if len(v.identity) >= 7:
  289. v.identity = v.identity[:3] + "*" * (len(v.identity) - 7) + v.identity[-4:]
  290. # 姓名脱敏:只保留第一个字
  291. if v.name and len(v.name) > 1:
  292. v.name = v.name[0] + "*" * (len(v.name) - 1)
  293. # 银行卡扩展信息脱敏
  294. if v.bankcard_ext_info:
  295. if v.bankcard_ext_info.inst_name:
  296. v.bankcard_ext_info.inst_name = "***"
  297. return v
  298. @field_serializer('amount')
  299. def serialize_amount(self, value: Decimal) -> str:
  300. """将 Decimal 序列化为保留两位小数的字符串"""
  301. return f"{value:.2f}"
  302. class DepositOutSchema(BaseModel):
  303. """充值记录响应"""
  304. model_config = ConfigDict(from_attributes=True)
  305. id: int = Field(description="主键ID")
  306. enterprise_id: Optional[str] = Field(default=None, description="所属企业ID")
  307. out_biz_no: Optional[str] = Field(default=None, description="商家侧订单号")
  308. account_book_id: Optional[str] = Field(default=None, description="资金专户号")
  309. amount: Optional[float] = Field(default=None, description="充值金额")
  310. deposit_url: Optional[str] = Field(default=None, description="充值确认页面URL")
  311. status: str = Field(description="充值状态")
  312. created_time: datetime = Field(description="创建时间")
  313. class WithdrawOutSchema(BaseModel):
  314. """提现记录响应"""
  315. model_config = ConfigDict(from_attributes=True)
  316. id: int = Field(description="主键ID")
  317. enterprise_id: Optional[str] = Field(default=None, description="所属企业ID")
  318. out_biz_no: Optional[str] = Field(default=None, description="商家侧订单号")
  319. account_book_id: Optional[str] = Field(default=None, description="资金专户号")
  320. amount: Optional[Decimal] = Field(default=None, description="提现金额")
  321. status: str = Field(description="提现状态")
  322. order_no: Optional[str] = Field(default=None, description="支付宝提现单号")
  323. error_code: Optional[str] = Field(default=None, description="错误码")
  324. error_msg: Optional[str] = Field(default=None, description="错误信息")
  325. created_time: datetime = Field(description="创建时间")
  326. class ReceiptApplySchema(BaseModel):
  327. """申请回单请求"""
  328. enterprise_id: str = Field(description="企业ID")
  329. order_no: str = Field(description="支付宝转账单号")
  330. class ReceiptApplyOutSchema(BaseModel):
  331. """申请回单响应"""
  332. model_config = ConfigDict(from_attributes=True)
  333. file_id: str = Field(description="文件申请号")
  334. class ReceiptQueryOutSchema(BaseModel):
  335. """查询回单响应"""
  336. model_config = ConfigDict(from_attributes=True)
  337. file_id: str = Field(description="文件申请号")
  338. status: str = Field(description="处理状态: INIT/PROCESS/SUCCESS/FAIL")
  339. download_url: Optional[str] = Field(default=None, description="下载链接")
  340. error_message: Optional[str] = Field(default=None, description="错误信息")
  341. class AccountOperationOutSchema(BaseModel):
  342. """资金专户操作响应"""
  343. model_config = ConfigDict(from_attributes=True)
  344. enterprise_id: Optional[str] = Field(default=None, description="企业ID")
  345. account_book_id: Optional[str] = Field(default=None, description="资金专户号")
  346. class ConsumeDetailQuerySchema(BaseModel):
  347. """账单详情查询请求"""
  348. pay_no: str = Field(..., description="支付宝账单号")
  349. enterprise_id: Optional[str] = Field(default=None, description="企业ID(2.0接口签约企业必填)")
  350. ant_shop_id: Optional[str] = Field(default=None, description="蚂蚁门店ID(商户服务商必填)")
  351. query_options: Optional[List[str]] = Field(
  352. default=None,
  353. description="查询选项: Refund(关联退款账单)/Order(关联订单)/Ticket(关联票据)"
  354. )
  355. class EcConsumeInfoSchema(BaseModel):
  356. """账单信息子属性"""
  357. model_config = ConfigDict(from_attributes=True)
  358. account_id: str = Field(description="共同账户ID")
  359. pay_no: str = Field(description="交易流水号")
  360. consume_type: str = Field(description="账单类型: CONSUME(消费账单)/REFUND(退款账单)/TRANSFER(转账账单)")
  361. gmt_biz_create: str = Field(description="账单创建时间,格式:yyyy-MM-dd HH:mm:ss")
  362. consume_biz_type: str = Field(description="账单业务类型: EC_PAY(因公支付)/EC_CLLCT(因公收款)")
  363. consume_amount: str = Field(description="账单金额,单位:元")
  364. order_complete_label: str = Field(description="订单完结标识: 0(未完结)/1(已完结)")
  365. refund_status: str = Field(description="退款状态: INIT(未退款)/REFUND_PART(部分退款)/REFUND_FULL(全额退款)")
  366. refund_amount: str = Field(description="退款金额,单位:元")
  367. peer_payer_card_name: str = Field(description="实际出资人名称")
  368. user_id: Optional[str] = Field(default=None, description="员工支付宝UID")
  369. open_id: Optional[str] = Field(default=None, description="员工open_id")
  370. enterprise_id: str = Field(description="企业ID")
  371. employee_id: str = Field(description="员工ID")
  372. enterprise_name: Optional[str] = Field(default=None, description="企业名称")
  373. employee_name: Optional[str] = Field(default=None, description="员工名称")
  374. consume_scene_code: Optional[str] = Field(default=None, description="消费场景编码")
  375. consume_type_sub_category: Optional[str] = Field(default=None, description="消费类型子类")
  376. consume_title: Optional[str] = Field(default=None, description="账单标题")
  377. gmt_pay: Optional[str] = Field(default=None, description="账单支付时间")
  378. gmt_refund: Optional[str] = Field(default=None, description="退款时间")
  379. pay_amount: Optional[str] = Field(default=None, description="用户实际支付金额")
  380. invoice_amount: Optional[str] = Field(default=None, description="用户实际承担金额")
  381. peer_pay_amount: Optional[str] = Field(default=None, description="企业代付金额")
  382. subsidy_amount: Optional[str] = Field(default=None, description="补贴金额")
  383. ext_infos: Optional[dict] = Field(default=None, description="扩展信息")
  384. class ConsumeDetailOutSchema(BaseModel):
  385. """账单详情查询响应"""
  386. model_config = ConfigDict(from_attributes=True)
  387. consume_info: EcConsumeInfoSchema = Field(description="账单信息")