bx_models.py 22 KB

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