bx_models.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  173. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  174. remark = Column(String(512), nullable=True, comment="备注")
  175. create_by = Column(String(64), nullable=True, comment="创建人")
  176. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  177. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  178. update_by = Column(String(64), nullable=True, comment="更新人")
  179. update_time = Column(
  180. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  181. )
  182. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  183. class BxReimburseApproval(Base):
  184. __tablename__ = "bx_reimburse_approval"
  185. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  186. apply_id = Column(String(64), nullable=False, comment="报销申请单ID")
  187. node_order = Column(Integer, nullable=False, comment="节点顺序")
  188. node_name = Column(String(128), nullable=False, comment="节点名称")
  189. approver_id = Column(String(64), nullable=False, comment="审批人用户ID")
  190. approver_name = Column(String(64), nullable=False, comment="审批人姓名")
  191. approval_status = Column(String(32), nullable=False, comment="审批结果")
  192. approval_opinion = Column(String(1024), nullable=True, comment="审批意见")
  193. approval_time = Column(DateTime, nullable=False, comment="审批时间")
  194. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  195. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  196. remark = Column(String(512), nullable=True, comment="备注")
  197. create_by = Column(String(64), nullable=True, comment="创建人")
  198. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  199. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  200. update_by = Column(String(64), nullable=True, comment="更新人")
  201. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  202. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  203. class BxReimburseOffset(Base):
  204. __tablename__ = "bx_reimburse_offset"
  205. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  206. reimburse_id = Column(String(64), nullable=False, comment="报销申请单ID")
  207. advance_id = Column(String(64), nullable=False, comment="备用金申请单ID")
  208. offset_amount = Column(DECIMAL(14, 2), nullable=False, comment="冲抵金额")
  209. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  210. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  211. remark = Column(String(512), nullable=True, comment="备注")
  212. create_by = Column(String(64), nullable=True, comment="创建人")
  213. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  214. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  215. update_by = Column(String(64), nullable=True, comment="更新人")
  216. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  217. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  218. class BxAttachment(Base):
  219. __tablename__ = "bx_attachment"
  220. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  221. biz_type = Column(String(32), nullable=False, comment="业务类型")
  222. biz_id = Column(String(64), nullable=False, comment="业务单据ID")
  223. file_name = Column(String(256), nullable=False, comment="文件名")
  224. file_path = Column(String(512), nullable=False, comment="文件存储路径")
  225. file_type = Column(String(128), nullable=True, comment="文件MIME类型")
  226. file_size = Column(BigInteger, nullable=True, comment="文件大小")
  227. attach_type = Column(String(32), nullable=True, default="attachment", comment="附件类型")
  228. sort_order = Column(Integer, nullable=False, default=0, comment="排序号")
  229. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  230. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  231. remark = Column(String(512), nullable=True, comment="备注")
  232. create_by = Column(String(64), nullable=True, comment="创建人")
  233. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  234. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  235. update_by = Column(String(64), nullable=True, comment="更新人")
  236. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  237. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  238. class BxInvoice(Base):
  239. __tablename__ = "bx_invoice"
  240. id = Column(String(64), primary_key=True, comment="主键UUID")
  241. owner_user_id = Column(String(64), nullable=False, comment="所属员工ID")
  242. owner_user_name = Column(String(64), nullable=False, comment="所属员工姓名")
  243. amount = Column(DECIMAL(14, 2), nullable=False, comment="入账金额")
  244. upload_by = Column(String(64), nullable=True, comment="上传操作人ID")
  245. upload_by_name = Column(String(64), nullable=True, comment="上传操作人姓名")
  246. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  247. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  248. remark = Column(String(512), nullable=True, comment="备注")
  249. create_by = Column(String(64), nullable=True, comment="创建人")
  250. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  251. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  252. update_by = Column(String(64), nullable=True, comment="更新人")
  253. update_time = Column(
  254. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  255. )
  256. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  257. class BxInvoiceLedger(Base):
  258. __tablename__ = "bx_invoice_ledger"
  259. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  260. owner_user_id = Column(String(64), nullable=False, comment="所属员工ID")
  261. entry_type = Column(
  262. String(32),
  263. nullable=False,
  264. comment="credit_upload|debit_delete|debit_reimburse|credit_release",
  265. )
  266. amount = Column(DECIMAL(14, 2), nullable=False, comment="正数,方向由 entry_type 决定")
  267. invoice_id = Column(String(64), nullable=True, comment="发票档案ID")
  268. reimburse_id = Column(String(64), nullable=True, comment="报销单ID")
  269. ref_ledger_id = Column(String(64), nullable=True, comment="退回指向原占用流水")
  270. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  271. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  272. remark = Column(String(512), nullable=True, comment="备注")
  273. create_by = Column(String(64), nullable=True, comment="创建人")
  274. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  275. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  276. update_by = Column(String(64), nullable=True, comment="更新人")
  277. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  278. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  279. class BxReimburseInvoice(Base):
  280. __tablename__ = "bx_reimburse_invoice"
  281. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  282. reimburse_id = Column(String(64), nullable=False, comment="报销单ID")
  283. invoice_id = Column(String(64), nullable=False, comment="发票档案ID")
  284. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  285. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  286. remark = Column(String(512), nullable=True, comment="备注")
  287. create_by = Column(String(64), nullable=True, comment="创建人")
  288. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  289. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  290. update_by = Column(String(64), nullable=True, comment="更新人")
  291. update_time = Column(DateTime, nullable=True, onupdate=datetime.now, comment="更新时间")
  292. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  293. class BxInvoiceWalletSummary(Base):
  294. __tablename__ = "bx_invoice_wallet_summary"
  295. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  296. owner_user_id = Column(String(64), nullable=False, comment="所属员工ID")
  297. owner_user_name = Column(String(64), nullable=False, default="", comment="所属员工姓名")
  298. total_amount = Column(DECIMAL(14, 2), nullable=False, default=0, comment="累计入账金额")
  299. used_amount = Column(DECIMAL(14, 2), nullable=False, default=0, comment="已占用金额")
  300. balance = Column(DECIMAL(14, 2), nullable=False, default=0, comment="可用余额")
  301. invoice_count = Column(Integer, nullable=False, default=0, comment="发票数量")
  302. version = Column(Integer, nullable=False, default=0, comment="乐观锁版本号")
  303. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  304. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  305. remark = Column(String(512), nullable=True, comment="备注")
  306. create_by = Column(String(64), nullable=True, comment="创建人")
  307. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  308. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  309. update_by = Column(String(64), nullable=True, comment="更新人")
  310. update_time = Column(
  311. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  312. )
  313. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")