bx_models.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. """报销(bx)模块数据模型 — 对齐 docs/sql/20260606_bx_tables.sql"""
  2. from datetime import datetime
  3. from sqlalchemy import BigInteger, Column, Date, DateTime, DECIMAL, ForeignKey, Integer, SmallInteger, String
  4. from sqlalchemy.orm import relationship
  5. from app.core.database import Base
  6. class BxExpenseItem(Base):
  7. __tablename__ = "bx_expense_item"
  8. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  9. parent_id = Column(String(64), nullable=False, default="0", comment="父级项目ID")
  10. item_name = Column(String(128), nullable=False, comment="项目名称")
  11. item_code = Column(String(64), nullable=True, comment="项目编码")
  12. level = Column(SmallInteger, nullable=False, default=1, comment="层级")
  13. sort_order = Column(Integer, nullable=False, default=0, comment="排序号")
  14. status = Column(SmallInteger, nullable=False, default=1, comment="状态")
  15. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  16. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  17. remark = Column(String(512), nullable=True, comment="备注")
  18. create_by = Column(String(64), nullable=True, comment="创建人")
  19. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  20. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  21. update_by = Column(String(64), nullable=True, comment="更新人")
  22. update_time = Column(
  23. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  24. )
  25. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  26. class BxWorkflowDef(Base):
  27. __tablename__ = "bx_workflow_def"
  28. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  29. biz_type = Column(String(32), nullable=False, comment="业务类型")
  30. wf_name = Column(String(128), nullable=False, comment="工作流名称")
  31. status = Column(SmallInteger, nullable=False, default=1, comment="状态")
  32. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  33. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  34. remark = Column(String(512), nullable=True, comment="备注")
  35. create_by = Column(String(64), nullable=True, comment="创建人")
  36. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  37. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  38. update_by = Column(String(64), nullable=True, comment="更新人")
  39. update_time = Column(
  40. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  41. )
  42. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  43. nodes = relationship(
  44. "BxWorkflowNode",
  45. back_populates="workflow_def",
  46. primaryjoin="and_(BxWorkflowDef.id == BxWorkflowNode.wf_id, BxWorkflowNode.del_flag == 0)",
  47. foreign_keys="BxWorkflowNode.wf_id",
  48. order_by="BxWorkflowNode.node_order",
  49. lazy="selectin",
  50. )
  51. class BxWorkflowNode(Base):
  52. __tablename__ = "bx_workflow_node"
  53. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  54. wf_id = Column(
  55. String(64),
  56. ForeignKey("bx_workflow_def.id"),
  57. nullable=False,
  58. comment="工作流定义ID",
  59. )
  60. node_name = Column(String(128), nullable=False, comment="节点名称")
  61. node_order = Column(Integer, nullable=False, default=0, comment="节点顺序")
  62. approver_id = Column(String(64), nullable=True, comment="审批人用户ID")
  63. approver_name = Column(String(64), nullable=True, comment="审批人姓名")
  64. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  65. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  66. remark = Column(String(512), nullable=True, comment="备注")
  67. create_by = Column(String(64), nullable=True, comment="创建人")
  68. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  69. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  70. update_by = Column(String(64), nullable=True, comment="更新人")
  71. update_time = Column(
  72. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  73. )
  74. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  75. workflow_def = relationship(
  76. "BxWorkflowDef",
  77. back_populates="nodes",
  78. foreign_keys=[wf_id],
  79. )
  80. class BxAdvanceApply(Base):
  81. __tablename__ = "bx_advance_apply"
  82. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  83. apply_code = Column(String(32), nullable=False, comment="申请单号")
  84. applicant_id = Column(String(64), nullable=False, comment="申请人用户ID")
  85. applicant_name = Column(String(64), nullable=False, comment="申请人姓名")
  86. reason = Column(String(1024), nullable=False, comment="申请原因")
  87. purpose = Column(String(1024), nullable=True, comment="申请目的")
  88. expense_item_id = Column(String(64), nullable=True, comment="费用项目ID")
  89. amount = Column(DECIMAL(14, 2), nullable=False, comment="申请金额")
  90. status = Column(String(32), nullable=False, default="draft", comment="状态")
  91. current_node = Column(String(128), nullable=True, comment="当前审批节点")
  92. wf_id = Column(String(64), nullable=True, comment="工作流定义ID")
  93. issue_status = Column(String(32), nullable=True, comment="发放状态")
  94. issue_time = Column(DateTime, nullable=True, comment="发放时间")
  95. issue_user_id = Column(String(64), nullable=True, comment="发放操作人ID")
  96. issue_user_name = Column(String(64), nullable=True, comment="发放操作人姓名")
  97. issue_remark = Column(String(512), nullable=True, comment="发放备注")
  98. actual_amount = Column(DECIMAL(14, 2), nullable=True, comment="实际发放金额")
  99. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  100. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  101. remark = Column(String(512), nullable=True, comment="备注")
  102. create_by = Column(String(64), nullable=True, comment="创建人")
  103. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  104. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  105. update_by = Column(String(64), nullable=True, comment="更新人")
  106. update_time = Column(
  107. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  108. )
  109. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  110. class BxAdvanceApproval(Base):
  111. __tablename__ = "bx_advance_approval"
  112. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  113. apply_id = Column(String(64), nullable=False, comment="备用金申请单ID")
  114. node_order = Column(Integer, nullable=False, comment="节点顺序")
  115. node_name = Column(String(128), nullable=False, comment="节点名称")
  116. approver_id = Column(String(64), nullable=False, comment="审批人用户ID")
  117. approver_name = Column(String(64), nullable=False, comment="审批人姓名")
  118. approval_status = Column(String(32), nullable=False, comment="审批结果")
  119. approval_opinion = Column(String(1024), nullable=True, comment="审批意见")
  120. approval_time = Column(DateTime, nullable=False, comment="审批时间")
  121. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  122. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  123. remark = Column(String(512), nullable=True, comment="备注")
  124. create_by = Column(String(64), nullable=True, comment="创建人")
  125. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  126. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  127. update_by = Column(String(64), nullable=True, comment="更新人")
  128. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  129. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  130. class BxReimburseApply(Base):
  131. __tablename__ = "bx_reimburse_apply"
  132. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  133. apply_code = Column(String(32), nullable=False, comment="报销单号")
  134. title = Column(String(256), nullable=False, comment="报销标题")
  135. reimburse_date = Column(Date, nullable=False, comment="报销日期")
  136. title_seq = Column(Integer, nullable=True, comment="标题序号(同租户同报销日期下自增)")
  137. applicant_id = Column(String(64), nullable=False, comment="申请人用户ID")
  138. applicant_name = Column(String(64), nullable=False, comment="申请人姓名")
  139. expense_id = Column(String(64), nullable=False, comment="费用项目ID")
  140. expense_name = Column(String(128), nullable=False, comment="费用项目名称")
  141. amount = Column(DECIMAL(14, 2), nullable=False, comment="报销金额")
  142. invoice_count = Column(Integer, nullable=False, default=0, comment="发票数量")
  143. attach_count = Column(Integer, nullable=False, default=0, comment="附件数量")
  144. status = Column(String(32), nullable=False, default="draft", comment="状态")
  145. current_node = Column(String(128), nullable=True, comment="当前审批节点")
  146. wf_id = Column(String(64), nullable=True, comment="工作流定义ID")
  147. pay_status = Column(String(32), nullable=True, comment="支付状态")
  148. pay_time = Column(DateTime, nullable=True, comment="支付时间")
  149. pay_user_id = Column(String(64), nullable=True, comment="支付操作人ID")
  150. pay_user_name = Column(String(64), nullable=True, comment="支付操作人姓名")
  151. actual_amount = Column(DECIMAL(14, 2), nullable=True, comment="实际发放金额")
  152. offset_advance_id = Column(String(64), nullable=True, comment="冲抵备用金单ID")
  153. offset_amount = Column(DECIMAL(14, 2), nullable=True, comment="冲抵金额")
  154. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  155. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  156. remark = Column(String(512), nullable=True, comment="备注说明")
  157. create_by = Column(String(64), nullable=True, comment="创建人")
  158. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  159. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  160. update_by = Column(String(64), nullable=True, comment="更新人")
  161. update_time = Column(
  162. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  163. )
  164. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  165. class BxReimburseDetail(Base):
  166. __tablename__ = "bx_reimburse_detail"
  167. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  168. reimburse_id = Column(String(64), nullable=False, comment="报销单ID")
  169. expense_id = Column(String(64), nullable=False, comment="费用项目ID")
  170. expense_name = Column(String(128), nullable=False, comment="费用项目名称")
  171. amount = Column(DECIMAL(14, 2), nullable=False, comment="报销金额")
  172. occur_date = Column(Date, nullable=True, comment="费用发生日期")
  173. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  174. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  175. remark = Column(String(512), nullable=True, comment="备注")
  176. create_by = Column(String(64), nullable=True, comment="创建人")
  177. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  178. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  179. update_by = Column(String(64), nullable=True, comment="更新人")
  180. update_time = Column(
  181. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  182. )
  183. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  184. class BxReimburseApproval(Base):
  185. __tablename__ = "bx_reimburse_approval"
  186. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  187. apply_id = Column(String(64), nullable=False, comment="报销申请单ID")
  188. node_order = Column(Integer, nullable=False, comment="节点顺序")
  189. node_name = Column(String(128), nullable=False, comment="节点名称")
  190. approver_id = Column(String(64), nullable=False, comment="审批人用户ID")
  191. approver_name = Column(String(64), nullable=False, comment="审批人姓名")
  192. approval_status = Column(String(32), nullable=False, comment="审批结果")
  193. approval_opinion = Column(String(1024), nullable=True, comment="审批意见")
  194. approval_time = Column(DateTime, nullable=False, comment="审批时间")
  195. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  196. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  197. remark = Column(String(512), nullable=True, comment="备注")
  198. create_by = Column(String(64), nullable=True, comment="创建人")
  199. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  200. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  201. update_by = Column(String(64), nullable=True, comment="更新人")
  202. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  203. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  204. class BxReimburseOffset(Base):
  205. __tablename__ = "bx_reimburse_offset"
  206. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  207. reimburse_id = Column(String(64), nullable=False, comment="报销申请单ID")
  208. advance_id = Column(String(64), nullable=False, comment="备用金申请单ID")
  209. offset_amount = Column(DECIMAL(14, 2), nullable=False, comment="冲抵金额")
  210. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  211. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  212. remark = Column(String(512), nullable=True, comment="备注")
  213. create_by = Column(String(64), nullable=True, comment="创建人")
  214. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  215. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  216. update_by = Column(String(64), nullable=True, comment="更新人")
  217. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  218. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  219. class BxAttachment(Base):
  220. __tablename__ = "bx_attachment"
  221. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  222. biz_type = Column(String(32), nullable=False, comment="业务类型")
  223. biz_id = Column(String(64), nullable=False, comment="业务单据ID")
  224. file_name = Column(String(256), nullable=False, comment="文件名")
  225. file_path = Column(String(512), nullable=False, comment="文件存储路径")
  226. file_type = Column(String(128), nullable=True, comment="文件MIME类型")
  227. file_size = Column(BigInteger, nullable=True, comment="文件大小")
  228. attach_type = Column(String(32), nullable=True, default="attachment", comment="附件类型")
  229. sort_order = Column(Integer, nullable=False, default=0, comment="排序号")
  230. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  231. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  232. remark = Column(String(512), nullable=True, comment="备注")
  233. create_by = Column(String(64), nullable=True, comment="创建人")
  234. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  235. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  236. update_by = Column(String(64), nullable=True, comment="更新人")
  237. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  238. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  239. class BxInvoice(Base):
  240. __tablename__ = "bx_invoice"
  241. id = Column(String(64), primary_key=True, comment="主键UUID")
  242. owner_user_id = Column(String(64), nullable=False, comment="所属员工ID")
  243. owner_user_name = Column(String(64), nullable=False, comment="所属员工姓名")
  244. amount = Column(DECIMAL(14, 2), nullable=False, comment="入账金额")
  245. upload_by = Column(String(64), nullable=True, comment="上传操作人ID")
  246. upload_by_name = Column(String(64), nullable=True, comment="上传操作人姓名")
  247. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  248. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  249. remark = Column(String(512), nullable=True, comment="备注")
  250. create_by = Column(String(64), nullable=True, comment="创建人")
  251. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  252. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  253. update_by = Column(String(64), nullable=True, comment="更新人")
  254. update_time = Column(
  255. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  256. )
  257. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  258. class BxInvoiceLedger(Base):
  259. __tablename__ = "bx_invoice_ledger"
  260. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  261. owner_user_id = Column(String(64), nullable=False, comment="所属员工ID")
  262. entry_type = Column(
  263. String(32),
  264. nullable=False,
  265. comment="credit_upload|debit_delete|debit_reimburse|credit_release",
  266. )
  267. amount = Column(DECIMAL(14, 2), nullable=False, comment="正数,方向由 entry_type 决定")
  268. invoice_id = Column(String(64), nullable=True, comment="发票档案ID")
  269. reimburse_id = Column(String(64), nullable=True, comment="报销单ID")
  270. ref_ledger_id = Column(String(64), nullable=True, comment="退回指向原占用流水")
  271. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  272. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  273. remark = Column(String(512), nullable=True, comment="备注")
  274. create_by = Column(String(64), nullable=True, comment="创建人")
  275. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  276. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  277. update_by = Column(String(64), nullable=True, comment="更新人")
  278. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  279. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  280. class BxReimburseInvoice(Base):
  281. __tablename__ = "bx_reimburse_invoice"
  282. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  283. reimburse_id = Column(String(64), nullable=False, comment="报销单ID")
  284. invoice_id = Column(String(64), nullable=False, comment="发票档案ID")
  285. attachment_id = Column(String(64), nullable=True, comment="勾选的发票附件ID")
  286. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  287. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  288. remark = Column(String(512), nullable=True, comment="备注")
  289. create_by = Column(String(64), nullable=True, comment="创建人")
  290. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  291. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  292. update_by = Column(String(64), nullable=True, comment="更新人")
  293. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  294. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  295. class BxInvoiceWalletSummary(Base):
  296. __tablename__ = "bx_invoice_wallet_summary"
  297. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  298. owner_user_id = Column(String(64), nullable=False, comment="所属员工ID")
  299. owner_user_name = Column(String(64), nullable=False, default="", comment="所属员工姓名")
  300. total_amount = Column(DECIMAL(14, 2), nullable=False, default=0, comment="累计入账金额")
  301. used_amount = Column(DECIMAL(14, 2), nullable=False, default=0, comment="已占用金额")
  302. balance = Column(DECIMAL(14, 2), nullable=False, default=0, comment="可用余额")
  303. invoice_count = Column(Integer, nullable=False, default=0, comment="发票数量")
  304. version = Column(Integer, nullable=False, default=0, comment="乐观锁版本号")
  305. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  306. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  307. remark = Column(String(512), nullable=True, comment="备注")
  308. create_by = Column(String(64), nullable=True, comment="创建人")
  309. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  310. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  311. update_by = Column(String(64), nullable=True, comment="更新人")
  312. update_time = Column(
  313. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  314. )
  315. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")