crm_models.py 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. """CRM 模块数据模型(产品分类、产品主表、统一附件表、客户管理、公海池、线索管理)"""
  2. from datetime import datetime
  3. from decimal import Decimal
  4. from sqlalchemy import (
  5. BigInteger,
  6. Column,
  7. DECIMAL,
  8. Date,
  9. DateTime,
  10. Integer,
  11. SmallInteger,
  12. String,
  13. Text,
  14. CHAR,
  15. )
  16. from app.core.database import Base
  17. class CrmProductCategory(Base):
  18. """CRM 产品分类表(树形结构)"""
  19. __tablename__ = "crm_product_category"
  20. id = Column(String(64), primary_key=True, comment="主键ID")
  21. parent_id = Column(String(64), nullable=False, default="0", comment="父级分类ID(0为顶级)")
  22. category_name = Column(String(128), nullable=False, comment="分类名称")
  23. category_code = Column(String(64), nullable=True, comment="分类编码")
  24. level = Column(SmallInteger, nullable=False, default=1, comment="层级")
  25. status = Column(CHAR(1), nullable=False, default="1", comment="状态 1启用 0停用")
  26. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  27. order_num = Column(Integer, nullable=True, comment="排序号")
  28. remark = Column(String(512), nullable=True, comment="备注")
  29. create_by = Column(String(64), nullable=True, comment="创建人id")
  30. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  31. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  32. update_by = Column(String(64), nullable=True, comment="更新人id")
  33. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  34. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  35. class CrmProduct(Base):
  36. """CRM 产品主表"""
  37. __tablename__ = "crm_product"
  38. id = Column(String(64), primary_key=True, comment="主键ID")
  39. product_no = Column(String(50), nullable=False, comment="产品编号")
  40. product_name = Column(String(200), nullable=False, comment="产品名称")
  41. category_id = Column(String(64), nullable=True, comment="分类ID")
  42. category_name = Column(String(100), nullable=True, comment="分类名称(冗余)")
  43. model = Column(String(100), nullable=True, comment="规格型号")
  44. unit = Column(String(20), nullable=True, default=None, comment="单位")
  45. barcode = Column(String(100), nullable=True, comment="条码")
  46. price = Column(DECIMAL(15, 2), nullable=True, default=None, comment="标准单价")
  47. cost_price = Column(DECIMAL(15, 2), nullable=True, default=None, comment="成本价")
  48. stock = Column(Integer, nullable=False, default=0, comment="库存数量")
  49. low_stock = Column(Integer, nullable=False, default=10, comment="库存预警值")
  50. tax_rate = Column(DECIMAL(5, 2), nullable=False, default=13.00, comment="税率(百分比)")
  51. is_toxic = Column(SmallInteger, nullable=False, default=0, comment="是否易制毒 0-否 1-是")
  52. is_explosive = Column(SmallInteger, nullable=False, default=0, comment="是否易制爆 0-否 1-是")
  53. status = Column(String(3), nullable=False, default="on", comment="状态 on 上架 off 下架")
  54. description = Column(Text, nullable=True, comment="产品描述")
  55. images = Column(String(1000), nullable=True, comment="产品图片(多个用逗号分隔)")
  56. sale_count = Column(Integer, nullable=False, default=0, comment="销售次数")
  57. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  58. order_num = Column(Integer, nullable=True, comment="排序号")
  59. remark = Column(String(512), nullable=True, comment="备注")
  60. create_by = Column(String(64), nullable=True, comment="创建人id")
  61. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  62. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  63. update_by = Column(String(64), nullable=True, comment="更新人id")
  64. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  65. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  66. class CrmProductBrand(Base):
  67. """CRM-产品品牌(按产品独立维护)"""
  68. __tablename__ = "crm_product_brand"
  69. id = Column(String(64), primary_key=True, comment="主键ID")
  70. product_id = Column(String(64), nullable=False, comment="产品ID")
  71. brand_name = Column(String(100), nullable=False, comment="品牌名称")
  72. status = Column(String(3), nullable=False, default="on", comment="状态 on/off")
  73. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  74. order_num = Column(Integer, nullable=True, comment="排序号")
  75. remark = Column(String(512), nullable=True, comment="备注")
  76. create_by = Column(String(64), nullable=True, comment="创建人id")
  77. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  78. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  79. update_by = Column(String(64), nullable=True, comment="更新人id")
  80. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  81. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  82. class CrmProductAlias(Base):
  83. """CRM-产品别名"""
  84. __tablename__ = "crm_product_alias"
  85. id = Column(String(64), primary_key=True, comment="主键ID")
  86. product_id = Column(String(64), nullable=False, comment="产品ID")
  87. alias_name = Column(String(200), nullable=False, comment="别名")
  88. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  89. order_num = Column(Integer, nullable=True, comment="排序号")
  90. remark = Column(String(512), nullable=True, comment="备注")
  91. create_by = Column(String(64), nullable=True, comment="创建人id")
  92. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  93. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  94. update_by = Column(String(64), nullable=True, comment="更新人id")
  95. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  96. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  97. class SysOss(Base):
  98. """统一附件表(全系统共用 sys_oss)"""
  99. __tablename__ = "sys_oss"
  100. id = Column(String(64), primary_key=True, comment="主键ID")
  101. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  102. biz_type = Column(String(50), nullable=True, comment="业务类型")
  103. biz_id = Column(String(64), nullable=True, comment="业务主键ID")
  104. file_name = Column(String(255), nullable=False, default="", comment="文件名")
  105. original_name = Column(String(255), nullable=False, default="", comment="原始文件名")
  106. file_suffix = Column(String(10), nullable=False, default="", comment="文件后缀名")
  107. url = Column(String(500), nullable=False, comment="文件URL地址")
  108. file_size = Column(BigInteger, nullable=True, comment="文件大小(字节)")
  109. file_type = Column(String(200), nullable=True, comment="MIME类型")
  110. attach_type = Column(String(32), nullable=True, default="attachment", comment="附件类型")
  111. sort_order = Column(Integer, nullable=False, default=0, comment="排序号")
  112. service = Column(String(20), nullable=False, default="minio", comment="存储服务商")
  113. ext1 = Column(Text, nullable=True, comment="扩展字段")
  114. order_num = Column(Integer, nullable=True, comment="排序号")
  115. remark = Column(String(512), nullable=True, comment="备注")
  116. create_by = Column(String(64), nullable=True, comment="创建人id")
  117. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  118. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  119. update_by = Column(String(64), nullable=True, comment="更新人id")
  120. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  121. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  122. # ── 客户管理模块 ──────────────────────────────────────────────
  123. class CrmCustomer(Base):
  124. """CRM-客户主表"""
  125. __tablename__ = "crm_customer"
  126. # 主键
  127. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  128. # 业务字段
  129. customer_no = Column(String(50), nullable=False, comment="客户编号(唯一)")
  130. customer_name = Column(String(200), nullable=False, comment="客户名称")
  131. short_name = Column(String(100), nullable=True, comment="客户简称")
  132. customer_type = Column(String(20), nullable=True, default="company", comment="客户类型(字典 crm_customer_type)")
  133. mobile = Column(String(20), nullable=True, comment="手机号")
  134. telephone = Column(String(30), nullable=True, comment="固定电话")
  135. email = Column(String(100), nullable=True, comment="邮箱")
  136. website = Column(String(500), nullable=True, comment="客户网站")
  137. level = Column(
  138. String(20), nullable=True, default="normal", comment="客户级别(字典 crm_customer_level: key/normal/potential)"
  139. )
  140. source = Column(String(20), nullable=True, comment="客户来源(字典 crm_clue_source)")
  141. industry = Column(String(50), nullable=True, comment="所属行业(字典 crm_customer_industry)")
  142. park_area = Column(String(100), nullable=True, comment="所在园区(字典 crm_customer_park)")
  143. payment_terms = Column(String(500), nullable=True, comment="收付款条件")
  144. scale = Column(String(20), nullable=True, comment="企业规模")
  145. province = Column(String(50), nullable=True, comment="省")
  146. city = Column(String(50), nullable=True, comment="市")
  147. district = Column(String(50), nullable=True, comment="区")
  148. address = Column(String(255), nullable=True, comment="详细地址")
  149. # 状态与归属
  150. status = Column(
  151. String(20), nullable=True, default="normal", comment="客户状态(字典 crm_customer_status: normal/pool/invalid)"
  152. )
  153. deal_status = Column(
  154. String(20), nullable=True, default="not_deal", comment="成交状态(字典 crm_deal_status: not_deal/dealed/lost)"
  155. )
  156. owner_user_id = Column(String(64), nullable=True, comment="负责人ID")
  157. owner_user_name = Column(String(50), nullable=True, comment="负责人姓名(冗余)")
  158. # 跟进统计
  159. last_time = Column(DateTime, nullable=True, comment="最后跟进时间")
  160. next_time = Column(DateTime, nullable=True, comment="下次联系时间")
  161. follow_count = Column(Integer, nullable=True, default=0, comment="跟进次数")
  162. # 成交统计
  163. deal_time = Column(DateTime, nullable=True, comment="成交时间")
  164. deal_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="累计成交金额")
  165. # 关联统计
  166. contact_count = Column(Integer, nullable=True, default=0, comment="联系人数量")
  167. opportunity_count = Column(Integer, nullable=True, default=0, comment="商机数量")
  168. contract_count = Column(Integer, nullable=True, default=0, comment="合同数量")
  169. # 公海池相关
  170. into_pool_time = Column(DateTime, nullable=True, comment="进入公海时间")
  171. into_pool_by = Column(String(64), nullable=True, comment="进入公海操作人ID")
  172. into_pool_reason = Column(String(500), nullable=True, comment="进入公海原因")
  173. claim_time = Column(DateTime, nullable=True, comment="领取时间")
  174. assign_time = Column(DateTime, nullable=True, comment="分配时间")
  175. assign_by = Column(String(64), nullable=True, comment="分配人ID")
  176. protect_time = Column(DateTime, nullable=True, comment="保护到期时间")
  177. # 证照附件
  178. business_license_img = Column(String(1000), nullable=True, comment="营业执照图片(附件URL,逗号分隔)")
  179. business_permit_images = Column(String(1000), nullable=True, comment="经营许可证图片(附件URL,逗号分隔)")
  180. other_cert_images = Column(String(1000), nullable=True, comment="其他证件图片(附件URL,逗号分隔)")
  181. # 线索关联
  182. clue_id = Column(String(64), nullable=True, comment="关联线索ID(从线索转化)")
  183. # 公共字段
  184. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  185. order_num = Column(Integer, nullable=True, comment="排序号")
  186. remark = Column(String(512), nullable=True, comment="备注")
  187. create_by = Column(String(64), nullable=True, comment="创建人ID")
  188. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  189. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  190. update_by = Column(String(64), nullable=True, comment="更新人ID")
  191. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  192. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  193. class CrmContact(Base):
  194. """CRM-联系人表"""
  195. __tablename__ = "crm_contact"
  196. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  197. customer_id = Column(String(64), nullable=False, comment="客户ID")
  198. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  199. contact_name = Column(String(100), nullable=False, comment="联系人姓名")
  200. gender = Column(String(10), nullable=True, comment="性别(male/female/unknown)")
  201. mobile = Column(String(20), nullable=True, comment="手机号")
  202. telephone = Column(String(30), nullable=True, comment="固定电话")
  203. email = Column(String(100), nullable=True, comment="邮箱")
  204. wechat = Column(String(100), nullable=True, comment="微信号")
  205. qq = Column(String(20), nullable=True, comment="QQ号")
  206. department = Column(String(100), nullable=True, comment="部门")
  207. position = Column(String(50), nullable=True, comment="职位")
  208. role = Column(String(20), nullable=True, comment="角色(decision/manager/user/other)")
  209. birthday = Column(Date, nullable=True, comment="生日")
  210. address = Column(String(255), nullable=True, comment="住址")
  211. is_key = Column(SmallInteger, nullable=True, default=0, comment="是否关键决策人(0-否 1-是)")
  212. is_primary = Column(SmallInteger, nullable=True, default=0, comment="是否主要联系人(0-否 1-是)")
  213. status = Column(String(20), nullable=True, default="active", comment="状态(active-在职/leave-离职)")
  214. # 公共字段
  215. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  216. order_num = Column(Integer, nullable=True, comment="排序号")
  217. remark = Column(String(512), nullable=True, comment="备注")
  218. create_by = Column(String(64), nullable=True, comment="创建人ID")
  219. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  220. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  221. update_by = Column(String(64), nullable=True, comment="更新人ID")
  222. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  223. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  224. class CrmInvoiceInfo(Base):
  225. """CRM-客户开票信息表"""
  226. __tablename__ = "crm_invoice_info"
  227. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  228. customer_id = Column(String(64), nullable=False, comment="客户ID")
  229. company_name = Column(String(200), nullable=False, comment="单位名称")
  230. tax_no = Column(String(50), nullable=True, comment="税号")
  231. company_address = Column(String(500), nullable=True, comment="单位地址")
  232. legal_representative = Column(String(100), nullable=True, comment="法定代表人")
  233. agent = Column(String(100), nullable=True, comment="代理人")
  234. phone_fax = Column(String(100), nullable=True, comment="电话/传真")
  235. bank_name = Column(String(200), nullable=True, comment="开户银行")
  236. bank_account = Column(String(100), nullable=True, comment="银行账号")
  237. is_default = Column(String(1), nullable=False, default="0", comment="是否默认(0否 1是)")
  238. # 公共字段
  239. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  240. order_num = Column(Integer, nullable=True, comment="排序号")
  241. remark = Column(String(512), nullable=True, comment="备注")
  242. create_by = Column(String(64), nullable=True, comment="创建人ID")
  243. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  244. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  245. update_by = Column(String(64), nullable=True, comment="更新人ID")
  246. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  247. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  248. class CrmCustomerFollow(Base):
  249. """CRM-客户跟进记录表"""
  250. __tablename__ = "crm_customer_follow"
  251. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  252. customer_id = Column(String(64), nullable=False, comment="客户ID")
  253. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  254. contact_id = Column(String(64), nullable=True, comment="联系人ID")
  255. contact_name = Column(String(100), nullable=True, comment="联系人姓名(冗余)")
  256. follow_type = Column(
  257. String(20), nullable=False, comment="跟进方式(字典 crm_follow_type: phone/wechat/visit/email/other)"
  258. )
  259. follow_content = Column(Text, nullable=False, comment="跟进内容")
  260. follow_time = Column(DateTime, nullable=True, comment="跟进时间")
  261. next_time = Column(DateTime, nullable=True, comment="下次联系时间")
  262. attachment = Column(String(1000), nullable=True, comment="附件URL(多个用逗号分隔)")
  263. owner_user_id = Column(String(64), nullable=True, comment="跟进人ID")
  264. owner_user_name = Column(String(50), nullable=True, comment="跟进人姓名(冗余)")
  265. # 公共字段
  266. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  267. order_num = Column(Integer, nullable=True, comment="排序号")
  268. remark = Column(String(512), nullable=True, comment="备注")
  269. create_by = Column(String(64), nullable=True, comment="创建人ID")
  270. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  271. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  272. update_by = Column(String(64), nullable=True, comment="更新人ID")
  273. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  274. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  275. class CrmCustomerPool(Base):
  276. """CRM-客户公海池记录表"""
  277. __tablename__ = "crm_customer_pool"
  278. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  279. customer_id = Column(String(64), nullable=False, comment="客户ID")
  280. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  281. operation_type = Column(String(20), nullable=False, comment="操作类型(into-进入公海/claim-领取/assign-分配/recycle-回收)")
  282. from_user_id = Column(String(64), nullable=True, comment="原负责人ID")
  283. from_user_name = Column(String(50), nullable=True, comment="原负责人姓名(冗余)")
  284. to_user_id = Column(String(64), nullable=True, comment="新负责人ID")
  285. to_user_name = Column(String(50), nullable=True, comment="新负责人姓名(冗余)")
  286. reason = Column(String(500), nullable=True, comment="操作原因")
  287. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  288. order_num = Column(Integer, nullable=True, comment="排序号")
  289. remark = Column(String(500), nullable=True, comment="备注")
  290. create_by = Column(String(64), nullable=True, comment="创建者(操作人)")
  291. create_by_name = Column(String(50), nullable=True, comment="操作人姓名(冗余)")
  292. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  293. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间(操作时间)")
  294. update_by = Column(String(64), nullable=True, comment="更新者")
  295. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  296. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  297. class CrmCustomerPoolRule(Base):
  298. """CRM-客户公海池规则表"""
  299. __tablename__ = "crm_customer_pool_rule"
  300. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  301. pool_name = Column(String(100), nullable=False, comment="规则名称")
  302. rule_type = Column(String(20), nullable=False, comment="规则类型(no_follow-未跟进/no_deal-未成交)")
  303. timeout_days = Column(Integer, nullable=False, comment="超时天数(多少天未跟进/未成交)")
  304. protect_days = Column(Integer, nullable=False, default=0, comment="保护期天数(领取后保护多少天)")
  305. status = Column(String(20), nullable=True, default="enable", comment="状态(enable-启用/disable-禁用)")
  306. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  307. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  308. order_num = Column(Integer, nullable=True, comment="排序号")
  309. remark = Column(String(500), nullable=True, comment="备注")
  310. create_by = Column(String(64), nullable=True, comment="创建者")
  311. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  312. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  313. update_by = Column(String(64), nullable=True, comment="更新者")
  314. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  315. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  316. class CrmOpportunity(Base):
  317. """CRM-商机主表"""
  318. __tablename__ = "crm_opportunity"
  319. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  320. opportunity_no = Column(String(50), nullable=False, comment="商机编号")
  321. opportunity_name = Column(String(200), nullable=False, comment="商机名称")
  322. customer_id = Column(String(64), nullable=False, comment="客户ID")
  323. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  324. contact_id = Column(String(64), nullable=True, comment="联系人ID")
  325. contact_name = Column(String(50), nullable=True, comment="联系人姓名(冗余)")
  326. stage = Column(String(20), nullable=False, default="initial", comment="商机阶段")
  327. stage_percent = Column(Integer, nullable=True, default=10, comment="阶段进度百分比")
  328. status = Column(String(20), nullable=False, default="following", comment="商机状态")
  329. win_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("50.00"), comment="赢单率(百分比)")
  330. amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="商机金额")
  331. expect_deal_date = Column(Date, nullable=True, comment="预计成交日期")
  332. actual_deal_date = Column(Date, nullable=True, comment="实际成交日期")
  333. lost_reason = Column(String(500), nullable=True, comment="输单原因")
  334. owner_user_id = Column(String(64), nullable=True, comment="负责人ID")
  335. owner_user_name = Column(String(50), nullable=True, comment="负责人姓名(冗余)")
  336. product_count = Column(Integer, nullable=True, default=0, comment="产品数量(冗余)")
  337. last_time = Column(DateTime, nullable=True, comment="最后跟进时间")
  338. next_time = Column(DateTime, nullable=True, comment="下次联系时间")
  339. follow_count = Column(Integer, nullable=True, default=0, comment="跟进次数(冗余)")
  340. contract_id = Column(String(64), nullable=True, comment="关联合同ID")
  341. source = Column(String(20), nullable=True, comment="商机来源")
  342. type = Column(String(20), nullable=True, comment="商机类型")
  343. description = Column(Text, nullable=True, comment="商机描述")
  344. competitors = Column(String(500), nullable=True, comment="竞争对手")
  345. key_factors = Column(String(500), nullable=True, comment="关键决策因素")
  346. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  347. order_num = Column(Integer, nullable=True, comment="排序号")
  348. remark = Column(String(512), nullable=True, comment="备注")
  349. create_by = Column(String(64), nullable=True, comment="创建人ID")
  350. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  351. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  352. update_by = Column(String(64), nullable=True, comment="更新人ID")
  353. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  354. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  355. class CrmOpportunityFollow(Base):
  356. """CRM-商机跟进记录表"""
  357. __tablename__ = "crm_opportunity_follow"
  358. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  359. opportunity_id = Column(String(64), nullable=False, comment="商机ID")
  360. follow_type = Column(String(20), nullable=False, comment="跟进方式")
  361. follow_content = Column(Text, nullable=False, comment="跟进内容")
  362. follow_time = Column(DateTime, nullable=True, comment="跟进时间")
  363. stage = Column(String(20), nullable=True, comment="当前商机阶段")
  364. stage_percent = Column(Integer, nullable=True, comment="阶段进度百分比")
  365. next_time = Column(DateTime, nullable=True, comment="下次联系时间")
  366. next_content = Column(String(500), nullable=True, comment="下次联系计划")
  367. attachments = Column(String(1000), nullable=True, comment="附件(逗号分隔)")
  368. contact_id = Column(String(64), nullable=True, comment="联系人ID")
  369. contact_name = Column(String(50), nullable=True, comment="联系人姓名")
  370. location = Column(String(200), nullable=True, comment="跟进地点")
  371. duration = Column(Integer, nullable=True, comment="跟进时长(分钟)")
  372. follow_by = Column(String(64), nullable=True, comment="跟进人ID")
  373. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  374. order_num = Column(Integer, nullable=True, comment="排序号")
  375. remark = Column(String(500), nullable=True, comment="备注")
  376. create_by = Column(String(64), nullable=True, comment="创建人ID")
  377. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  378. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  379. update_by = Column(String(64), nullable=True, comment="更新人ID")
  380. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  381. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  382. class CrmOpportunityProduct(Base):
  383. """CRM-商机产品关联表"""
  384. __tablename__ = "crm_opportunity_product"
  385. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  386. opportunity_id = Column(String(64), nullable=False, comment="商机ID")
  387. product_id = Column(String(64), nullable=False, comment="产品ID")
  388. product_name = Column(String(200), nullable=True, comment="产品名称(冗余)")
  389. product_no = Column(String(50), nullable=True, comment="产品编号(冗余)")
  390. category_id = Column(String(64), nullable=True, comment="产品分类ID")
  391. category_name = Column(String(100), nullable=True, comment="产品分类名称(冗余)")
  392. model = Column(String(100), nullable=True, comment="规格型号")
  393. unit = Column(String(20), nullable=True, default="件", comment="单位")
  394. quantity = Column(DECIMAL(20, 4), nullable=False, comment="数量")
  395. price = Column(DECIMAL(15, 2), nullable=False, default=0, comment="单价")
  396. discount = Column(DECIMAL(5, 2), nullable=True, default=0, comment="折扣(百分比)")
  397. subtotal = Column(DECIMAL(15, 2), nullable=False, default=0, comment="小计金额")
  398. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  399. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  400. order_num = Column(Integer, nullable=True, comment="排序号")
  401. remark = Column(String(500), nullable=True, comment="备注")
  402. create_by = Column(String(64), nullable=True, comment="创建人ID")
  403. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  404. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  405. update_by = Column(String(64), nullable=True, comment="更新人ID")
  406. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  407. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  408. class CrmOpportunityStageLog(Base):
  409. """CRM-商机阶段变更日志表"""
  410. __tablename__ = "crm_opportunity_stage_log"
  411. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  412. opportunity_id = Column(String(64), nullable=False, comment="商机ID")
  413. from_stage = Column(String(20), nullable=True, comment="原阶段")
  414. from_stage_name = Column(String(50), nullable=True, comment="原阶段名称")
  415. from_percent = Column(Integer, nullable=True, comment="原进度百分比")
  416. to_stage = Column(String(20), nullable=False, comment="新阶段")
  417. to_stage_name = Column(String(50), nullable=True, comment="新阶段名称")
  418. to_percent = Column(Integer, nullable=True, comment="新进度百分比")
  419. change_type = Column(String(20), nullable=True, default="forward", comment="变更类型")
  420. change_reason = Column(String(500), nullable=True, comment="变更原因")
  421. change_amount = Column(DECIMAL(15, 2), nullable=True, comment="变更时商机金额")
  422. lost_detail = Column(String(2000), nullable=True, comment="输单详细说明")
  423. competitor_info = Column(String(1000), nullable=True, comment="竞争对手信息")
  424. improvement = Column(String(1000), nullable=True, comment="改进建议")
  425. won_remark = Column(String(2000), nullable=True, comment="赢单说明")
  426. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  427. order_num = Column(Integer, nullable=True, comment="排序号")
  428. remark = Column(String(500), nullable=True, comment="备注")
  429. create_by = Column(String(64), nullable=True, comment="创建人ID")
  430. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  431. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  432. update_by = Column(String(64), nullable=True, comment="更新人ID")
  433. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  434. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  435. class CrmContract(Base):
  436. """CRM-合同主表"""
  437. __tablename__ = "crm_contract"
  438. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  439. contract_no = Column(String(50), nullable=False, comment="合同编号")
  440. contract_name = Column(String(200), nullable=False, comment="合同名称")
  441. customer_id = Column(String(64), nullable=False, comment="客户ID")
  442. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  443. opportunity_id = Column(String(64), nullable=True, comment="商机ID")
  444. quote_id = Column(String(64), nullable=True, comment="报价单ID")
  445. parent_contract_id = Column(String(64), nullable=True, comment="原合同ID(续签)")
  446. renewal_count = Column(Integer, nullable=True, default=0, comment="续签次数")
  447. template_id = Column(String(64), nullable=True, comment="合同模板ID")
  448. contract_template = Column(String(50), nullable=True, default="shanxia", comment="合同模版")
  449. contact_id = Column(String(64), nullable=True, comment="联系人ID")
  450. contact_name = Column(String(50), nullable=True, comment="联系人姓名(冗余)")
  451. contact_mobile = Column(String(20), nullable=True, comment="联系人手机(冗余)")
  452. contract_type = Column(String(20), nullable=False, default="sale", comment="合同类型")
  453. contract_nature = Column(String(20), nullable=True, default="new", comment="合同性质")
  454. amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="合同金额")
  455. currency = Column(String(10), nullable=True, default="CNY", comment="币种")
  456. tax_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("6.00"), comment="税率(%)")
  457. amount_with_tax = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="含税金额")
  458. status = Column(String(20), nullable=False, default="draft", comment="合同状态")
  459. approval_status = Column(String(20), nullable=True, comment="审批状态")
  460. sign_date = Column(Date, nullable=True, comment="签订日期")
  461. actual_sign_date = Column(Date, nullable=True, comment="实际签订日期")
  462. start_date = Column(Date, nullable=True, comment="开始日期")
  463. end_date = Column(Date, nullable=True, comment="结束日期")
  464. contract_period = Column(Integer, nullable=True, comment="合同期限(月)")
  465. performance_status = Column(String(20), nullable=True, default="normal", comment="履约状态")
  466. performance_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("0.00"), comment="履约完成度(%)")
  467. customer_satisfaction = Column(Integer, nullable=True, comment="客户满意度")
  468. approval_flow_id = Column(String(64), nullable=True, comment="审批流程ID")
  469. contract_file = Column(String(500), nullable=True, comment="合同文件路径")
  470. attachment_files = Column(String(2000), nullable=True, comment="附件文件")
  471. owner_user_id = Column(String(64), nullable=True, comment="负责人ID")
  472. owner_user_name = Column(String(50), nullable=True, comment="负责人姓名(冗余)")
  473. received_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="已回款金额")
  474. unreceived_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="未回款金额")
  475. invoice_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="已开票金额")
  476. uninvoice_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="未开票金额")
  477. payment_terms = Column(Text, nullable=True, comment="付款条款")
  478. delivery_terms = Column(Text, nullable=True, comment="交付条款")
  479. contract_terms = Column(Text, nullable=True, comment="合同条款")
  480. settlement_method = Column(String(50), nullable=True, comment="结算方式")
  481. template_content = Column(Text, nullable=True, comment="合同模板内容")
  482. settlement_clause_drafts = Column(Text, nullable=True, comment="结算方式草稿JSON")
  483. invalid_reason = Column(String(500), nullable=True, comment="作废原因")
  484. invalid_time = Column(DateTime, nullable=True, comment="作废时间")
  485. version_no = Column(Integer, nullable=True, default=0, comment="乐观锁版本号")
  486. party_a = Column(String(200), nullable=True, comment="甲方")
  487. party_a_address = Column(String(255), nullable=True, comment="甲方地址")
  488. party_a_contact = Column(String(50), nullable=True, comment="甲方联系人")
  489. party_a_mobile = Column(String(20), nullable=True, comment="甲方联系电话")
  490. party_a_legal_person = Column(String(50), nullable=True, comment="甲方法定代表人")
  491. party_a_agent = Column(String(50), nullable=True, comment="甲方代理人")
  492. party_a_phone_fax = Column(String(50), nullable=True, comment="甲方电话/传真")
  493. party_a_bank = Column(String(100), nullable=True, comment="甲方开户银行")
  494. party_a_account = Column(String(50), nullable=True, comment="甲方银行账号")
  495. party_b = Column(String(200), nullable=True, comment="乙方")
  496. party_b_address = Column(String(255), nullable=True, comment="乙方地址")
  497. party_b_contact = Column(String(50), nullable=True, comment="乙方联系人")
  498. party_b_mobile = Column(String(20), nullable=True, comment="乙方联系电话")
  499. party_b_legal_person = Column(String(100), nullable=True, comment="乙方法定代表人")
  500. party_b_agent = Column(String(100), nullable=True, comment="乙方代理人")
  501. party_b_phone_fax = Column(String(100), nullable=True, comment="乙方电话/传真")
  502. party_b_bank = Column(String(200), nullable=True, comment="乙方开户银行")
  503. party_b_account = Column(String(100), nullable=True, comment="乙方银行账号")
  504. supplier_id = Column(String(64), nullable=True, comment="供方主体ID")
  505. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  506. order_num = Column(Integer, nullable=True, comment="排序号")
  507. remark = Column(String(512), nullable=True, comment="备注")
  508. create_by = Column(String(64), nullable=True, comment="创建人ID")
  509. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  510. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  511. update_by = Column(String(64), nullable=True, comment="更新人ID")
  512. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  513. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  514. class CrmContractApproverSetting(Base):
  515. """CRM-合同审批人设置(租户级)"""
  516. __tablename__ = "crm_contract_approver_setting"
  517. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  518. approver_ids = Column(String(1000), nullable=False, default="", comment="有序审批人用户ID,逗号分隔")
  519. status = Column(String(1), nullable=False, default="0", comment="0启用 1停用")
  520. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  521. order_num = Column(Integer, nullable=True, comment="排序号")
  522. remark = Column(String(500), nullable=True, comment="备注")
  523. create_by = Column(String(64), nullable=True, comment="创建者")
  524. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  525. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  526. update_by = Column(String(64), nullable=True, comment="更新者")
  527. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  528. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  529. class CrmContractApproval(Base):
  530. """CRM-合同审批记录表"""
  531. __tablename__ = "crm_contract_approval"
  532. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  533. contract_id = Column(String(64), nullable=False, comment="合同ID")
  534. flow_id = Column(String(64), nullable=True, comment="审批流程ID")
  535. step = Column(Integer, nullable=False, default=1, comment="审批步骤")
  536. step_name = Column(String(100), nullable=True, comment="步骤名称")
  537. approver_id = Column(String(64), nullable=False, comment="审批人ID")
  538. approver_name = Column(String(50), nullable=True, comment="审批人姓名(冗余)")
  539. approver_dept = Column(String(100), nullable=True, comment="审批人部门")
  540. approval_result = Column(String(20), nullable=True, default="pending", comment="审批结果")
  541. approval_opinion = Column(Text, nullable=True, comment="审批意见")
  542. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  543. approval_duration = Column(Integer, nullable=True, comment="审批耗时(小时)")
  544. attachments = Column(String(1000), nullable=True, comment="附件")
  545. is_current = Column(SmallInteger, nullable=True, default=1, comment="是否当前步骤")
  546. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  547. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  548. order_num = Column(Integer, nullable=True, comment="排序号")
  549. remark = Column(String(500), nullable=True, comment="备注")
  550. create_by = Column(String(64), nullable=True, comment="创建者")
  551. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  552. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  553. update_by = Column(String(64), nullable=True, comment="更新者")
  554. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  555. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  556. class CrmContractChange(Base):
  557. """CRM-合同变更记录表"""
  558. __tablename__ = "crm_contract_change"
  559. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  560. contract_id = Column(String(64), nullable=False, comment="合同ID")
  561. contract_no = Column(String(50), nullable=True, comment="合同编号(冗余)")
  562. change_type = Column(String(50), nullable=False, comment="变更类型")
  563. change_reason = Column(String(500), nullable=False, comment="变更原因")
  564. change_content = Column(Text, nullable=True, comment="变更内容描述")
  565. old_value = Column(Text, nullable=True, comment="变更前值(JSON)")
  566. new_value = Column(Text, nullable=True, comment="变更后值(JSON)")
  567. change_amount = Column(DECIMAL(15, 2), nullable=True, comment="变更金额")
  568. approval_status = Column(String(20), nullable=True, default="pending", comment="审批状态")
  569. approver_id = Column(String(64), nullable=True, comment="审批人ID")
  570. approver_name = Column(String(50), nullable=True, comment="审批人姓名")
  571. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  572. approval_opinion = Column(String(500), nullable=True, comment="审批意见")
  573. attachment_files = Column(String(1000), nullable=True, comment="附件文件")
  574. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  575. order_num = Column(Integer, nullable=True, comment="排序号")
  576. remark = Column(String(500), nullable=True, comment="备注")
  577. create_by = Column(String(64), nullable=True, comment="创建者")
  578. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  579. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  580. update_by = Column(String(64), nullable=True, comment="更新者")
  581. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  582. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  583. class CrmContractTemplate(Base):
  584. """CRM-合同模板表"""
  585. __tablename__ = "crm_contract_template"
  586. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  587. template_no = Column(String(50), nullable=False, comment="模板编号")
  588. template_name = Column(String(200), nullable=False, comment="模板名称")
  589. contract_type = Column(String(20), nullable=True, comment="适用合同类型")
  590. template_content = Column(Text, nullable=True, comment="模板内容")
  591. payment_terms = Column(Text, nullable=True, comment="付款条款模板")
  592. delivery_terms = Column(Text, nullable=True, comment="交付条款模板")
  593. contract_terms = Column(Text, nullable=True, comment="合同条款模板")
  594. party_b = Column(String(200), nullable=True, comment="乙方名称")
  595. party_b_address = Column(String(255), nullable=True, comment="乙方地址")
  596. party_b_contact = Column(String(50), nullable=True, comment="乙方联系人")
  597. party_b_mobile = Column(String(20), nullable=True, comment="乙方联系电话")
  598. default_currency = Column(String(10), nullable=True, default="CNY", comment="默认币种")
  599. default_tax_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("6.00"), comment="默认税率(%)")
  600. default_period = Column(Integer, nullable=True, default=12, comment="默认合同期限(月)")
  601. is_active = Column(SmallInteger, nullable=True, default=1, comment="是否启用")
  602. usage_count = Column(Integer, nullable=True, default=0, comment="使用次数")
  603. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  604. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  605. order_num = Column(Integer, nullable=True, comment="排序号")
  606. remark = Column(String(500), nullable=True, comment="备注")
  607. create_by = Column(String(64), nullable=True, comment="创建者")
  608. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  609. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  610. update_by = Column(String(64), nullable=True, comment="更新者")
  611. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  612. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  613. class CrmContractProduct(Base):
  614. """CRM-合同产品明细表"""
  615. __tablename__ = "crm_contract_product"
  616. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  617. contract_id = Column(String(64), nullable=False, comment="合同ID")
  618. product_id = Column(String(64), nullable=False, comment="产品ID")
  619. product_name = Column(String(200), nullable=False, comment="产品名称")
  620. brand_mode = Column(String(20), nullable=True, comment="required/any")
  621. brand_id = Column(String(64), nullable=True, comment="指定品牌ID")
  622. brand_name = Column(String(100), nullable=True, comment="品牌名快照")
  623. product_no = Column(String(50), nullable=True, comment="产品编号")
  624. category_id = Column(String(64), nullable=True, comment="产品分类ID")
  625. category_name = Column(String(100), nullable=True, comment="产品分类名称")
  626. model = Column(String(100), nullable=True, comment="规格型号")
  627. unit = Column(String(20), nullable=True, default="件", comment="单位")
  628. quantity = Column(DECIMAL(20, 4), nullable=False, comment="数量")
  629. price = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="单价")
  630. discount = Column(DECIMAL(5, 2), nullable=True, default=Decimal("0.00"), comment="折扣(%)")
  631. tax_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("6.00"), comment="税率(%)")
  632. tax_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="税费金额")
  633. subtotal = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="小计金额")
  634. delivery_date = Column(Date, nullable=True, comment="交付日期")
  635. delivery_status = Column(String(20), nullable=True, default="pending", comment="交付状态")
  636. delivered_quantity = Column(DECIMAL(20, 4), nullable=True, default=Decimal("0.0000"), comment="已交付数量")
  637. description = Column(String(1000), nullable=True, comment="产品描述")
  638. package_spec = Column(String(200), nullable=True, comment="包装规格")
  639. delivery_method = Column(String(100), nullable=True, comment="送货方式")
  640. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  641. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  642. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  643. remark = Column(String(500), nullable=True, comment="备注")
  644. create_by = Column(String(64), nullable=True, comment="创建者")
  645. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  646. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  647. update_by = Column(String(64), nullable=True, comment="更新者")
  648. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  649. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  650. class CrmContractProductPriceTier(Base):
  651. """CRM-框架合同产品调价区间"""
  652. __tablename__ = "crm_contract_product_price_tier"
  653. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  654. contract_id = Column(String(64), nullable=False, comment="合同ID")
  655. contract_product_id = Column(String(64), nullable=False, comment="合同产品明细ID")
  656. start_date = Column(Date, nullable=False, comment="区间开始日期")
  657. end_date = Column(Date, nullable=False, comment="区间结束日期")
  658. price = Column(DECIMAL(15, 2), nullable=False, comment="含税单价")
  659. letter_oss_ids = Column(String(4000), nullable=True, comment="调价函OSS ID列表(JSON数组)")
  660. letter_oss_id = Column(String(64), nullable=True, comment="调价函单附件(废弃)")
  661. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  662. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  663. order_num = Column(Integer, nullable=True, comment="排序号(公共)")
  664. remark = Column(String(500), nullable=True, comment="备注")
  665. create_by = Column(String(64), nullable=True, comment="创建者")
  666. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  667. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  668. update_by = Column(String(64), nullable=True, comment="更新者")
  669. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  670. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  671. class CrmQuote(Base):
  672. """CRM-报价单主表"""
  673. __tablename__ = "crm_quote"
  674. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  675. quote_no = Column(String(50), nullable=False, comment="报价单编号")
  676. quote_title = Column(String(200), nullable=False, comment="报价单标题")
  677. quote_type = Column(String(20), nullable=False, default="sales", comment="报价单类型")
  678. customer_id = Column(String(64), nullable=False, comment="客户ID")
  679. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  680. opportunity_id = Column(String(64), nullable=True, comment="商机ID")
  681. contact_id = Column(String(64), nullable=True, comment="联系人ID")
  682. contact_name = Column(String(50), nullable=True, comment="联系人姓名(冗余)")
  683. contact_mobile = Column(String(20), nullable=True, comment="联系人手机(冗余)")
  684. contact_email = Column(String(100), nullable=True, comment="联系人邮箱(冗余)")
  685. version = Column(String(20), nullable=True, default="V1.0", comment="版本号")
  686. parent_id = Column(String(64), nullable=True, default="0", comment="父版本ID")
  687. is_latest = Column(SmallInteger, nullable=True, default=1, comment="是否最新版本")
  688. total_amount = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="总金额")
  689. discount_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("0.00"), comment="整单折扣率")
  690. discount_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="折扣金额")
  691. final_amount = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="最终金额")
  692. validity_days = Column(Integer, nullable=True, default=30, comment="有效期(天数)")
  693. quote_date = Column(Date, nullable=True, comment="报价日期")
  694. expire_date = Column(Date, nullable=True, comment="到期日期")
  695. status = Column(String(20), nullable=False, default="draft", comment="状态")
  696. reject_reason = Column(String(500), nullable=True, comment="拒绝原因")
  697. pdf_url = Column(String(500), nullable=True, comment="PDF文件路径")
  698. pdf_generated = Column(SmallInteger, nullable=True, default=0, comment="PDF是否已生成")
  699. share_link = Column(String(500), nullable=True, comment="分享链接")
  700. share_code = Column(String(50), nullable=True, comment="分享码")
  701. share_password = Column(String(100), nullable=True, comment="分享密码")
  702. share_expire_time = Column(DateTime, nullable=True, comment="分享链接过期时间")
  703. view_count = Column(Integer, nullable=True, default=0, comment="查看次数")
  704. last_view_time = Column(DateTime, nullable=True, comment="最后查看时间")
  705. owner_user_id = Column(String(64), nullable=False, comment="负责人ID")
  706. owner_user_name = Column(String(50), nullable=True, comment="负责人姓名(冗余)")
  707. supplier_id = Column(String(64), nullable=True, comment="报价主体ID")
  708. supplier_name = Column(String(200), nullable=True, comment="报价主体名称(冗余)")
  709. contract_id = Column(String(64), nullable=True, comment="关联合同ID")
  710. payment_terms = Column(String(500), nullable=True, comment="付款条款")
  711. delivery_terms = Column(String(500), nullable=True, comment="交付条款")
  712. freight = Column(DECIMAL(18, 2), nullable=False, default=Decimal("0.00"), comment="运费")
  713. attachments = Column(String(1000), nullable=True, comment="附件")
  714. template_content = Column(Text, nullable=True, comment="报价单模板内容")
  715. version_no = Column(Integer, nullable=True, default=0, comment="乐观锁版本号")
  716. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  717. order_num = Column(Integer, nullable=True, comment="排序号")
  718. remark = Column(String(500), nullable=True, comment="备注")
  719. create_by = Column(String(64), nullable=True, comment="创建者")
  720. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  721. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  722. update_by = Column(String(64), nullable=True, comment="更新者")
  723. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  724. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  725. class CrmQuoteProduct(Base):
  726. """CRM-报价单产品明细表"""
  727. __tablename__ = "crm_quote_product"
  728. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  729. quote_id = Column(String(64), nullable=False, comment="报价单ID")
  730. product_id = Column(String(64), nullable=False, comment="产品ID")
  731. product_name = Column(String(200), nullable=False, comment="产品名称")
  732. brand_mode = Column(String(20), nullable=True, comment="required/any")
  733. brand_id = Column(String(64), nullable=True, comment="指定品牌ID")
  734. brand_name = Column(String(100), nullable=True, comment="品牌名快照")
  735. product_no = Column(String(50), nullable=True, comment="产品编号")
  736. category_id = Column(String(64), nullable=True, comment="产品分类ID")
  737. category_name = Column(String(100), nullable=True, comment="产品分类名称")
  738. model = Column(String(100), nullable=True, comment="规格型号")
  739. unit = Column(String(20), nullable=True, default="件", comment="单位")
  740. quantity = Column(DECIMAL(20, 4), nullable=False, comment="数量")
  741. price = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="含税单价")
  742. discount = Column(DECIMAL(5, 2), nullable=True, default=Decimal("0.00"), comment="折扣(%)")
  743. subtotal = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="含税总价")
  744. tax_amount = Column(DECIMAL(15, 2), nullable=True, default=Decimal("0.00"), comment="税费")
  745. tax_rate = Column(DECIMAL(5, 2), nullable=True, default=Decimal("13.00"), comment="税率(%)")
  746. package_spec = Column(String(200), nullable=True, comment="包装规格")
  747. delivery_method = Column(String(200), nullable=True, comment="送货方式")
  748. description = Column(String(1000), nullable=True, comment="产品描述")
  749. sort = Column(Integer, nullable=True, default=0, comment="排序号")
  750. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  751. order_num = Column(Integer, nullable=True, comment="排序号")
  752. remark = Column(String(500), nullable=True, comment="备注")
  753. create_by = Column(String(64), nullable=True, comment="创建者")
  754. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  755. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  756. update_by = Column(String(64), nullable=True, comment="更新者")
  757. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  758. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  759. class CrmQuoteApproverSetting(Base):
  760. """CRM-报价单审批人设置(租户级)"""
  761. __tablename__ = "crm_quote_approver_setting"
  762. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  763. approver_ids = Column(String(1000), nullable=False, default="", comment="有序审批人用户ID,逗号分隔")
  764. status = Column(String(1), nullable=False, default="0", comment="0启用 1停用")
  765. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  766. order_num = Column(Integer, nullable=True, comment="排序号")
  767. remark = Column(String(500), nullable=True, comment="备注")
  768. create_by = Column(String(64), nullable=True, comment="创建者")
  769. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  770. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  771. update_by = Column(String(64), nullable=True, comment="更新者")
  772. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  773. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  774. class CrmQuoteApproval(Base):
  775. """CRM-报价单审批记录表"""
  776. __tablename__ = "crm_quote_approval"
  777. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  778. quote_id = Column(String(64), nullable=False, comment="报价单ID")
  779. quote_no = Column(String(50), nullable=True, comment="报价单编号(冗余)")
  780. step = Column(Integer, nullable=False, comment="审批步骤")
  781. approver_id = Column(String(64), nullable=False, comment="审批人ID")
  782. approver_name = Column(String(50), nullable=True, comment="审批人姓名(冗余)")
  783. approval_result = Column(String(20), nullable=True, default="pending", comment="审批结果")
  784. approval_opinion = Column(Text, nullable=True, comment="审批意见")
  785. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  786. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  787. order_num = Column(Integer, nullable=True, comment="排序号")
  788. remark = Column(String(500), nullable=True, comment="备注")
  789. create_by = Column(String(64), nullable=True, comment="创建者")
  790. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  791. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  792. update_by = Column(String(64), nullable=True, comment="更新者")
  793. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  794. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  795. class CrmQuoteShareLog(Base):
  796. """CRM-报价单分享访问日志表"""
  797. __tablename__ = "crm_quote_share_log"
  798. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  799. quote_id = Column(String(64), nullable=False, comment="报价单ID")
  800. share_code = Column(String(50), nullable=False, comment="分享码")
  801. visit_time = Column(DateTime, nullable=False, default=datetime.now, comment="访问时间")
  802. ip_address = Column(String(50), nullable=True, comment="IP地址")
  803. location = Column(String(200), nullable=True, comment="地理位置")
  804. device_type = Column(String(50), nullable=True, comment="设备类型")
  805. browser = Column(String(100), nullable=True, comment="浏览器信息")
  806. stay_duration = Column(Integer, nullable=True, default=0, comment="停留时长(秒)")
  807. page_views = Column(Integer, nullable=True, default=1, comment="浏览页数")
  808. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  809. order_num = Column(Integer, nullable=True, comment="排序号")
  810. remark = Column(String(500), nullable=True, comment="备注")
  811. create_by = Column(String(64), nullable=True, comment="创建者")
  812. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  813. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  814. update_by = Column(String(64), nullable=True, comment="更新者")
  815. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  816. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  817. class CrmClue(Base):
  818. """CRM-线索主表"""
  819. __tablename__ = "crm_clue"
  820. id = Column(String(64), primary_key=True, comment="主键ID")
  821. clue_name = Column(String(100), nullable=False, comment="线索姓名")
  822. mobile = Column(String(20), nullable=False, comment="手机号")
  823. company = Column(String(200), nullable=True, comment="公司名称")
  824. customer_type = Column(String(20), nullable=True, comment="客户类型(company-企业/person-个人)")
  825. telephone = Column(String(30), nullable=True, comment="固定电话")
  826. email = Column(String(100), nullable=True, comment="邮箱")
  827. title = Column(String(10), nullable=True, comment="称呼(先生/女士/其他)")
  828. position = Column(String(50), nullable=True, comment="职位")
  829. source = Column(String(20), nullable=False, comment="线索来源")
  830. level = Column(String(10), nullable=True, default="unrated", comment="线索等级(A/B/C/unrated)")
  831. industry = Column(String(50), nullable=True, comment="所属行业(字典 crm_customer_industry)")
  832. park_area = Column(String(100), nullable=True, comment="所在园区")
  833. province = Column(String(50), nullable=True, comment="省")
  834. city = Column(String(50), nullable=True, comment="市")
  835. district = Column(String(50), nullable=True, comment="区")
  836. address = Column(String(255), nullable=True, comment="详细地址")
  837. website = Column(String(500), nullable=True, comment="客户网站")
  838. intent_products = Column(String(500), nullable=True, comment="意向产品(多个用逗号分隔)")
  839. expect_time = Column(Date, nullable=True, comment="预计购买时间")
  840. budget = Column(String(20), nullable=True, comment="预算范围")
  841. requirement = Column(Text, nullable=True, comment="需求描述")
  842. status = Column(String(20), nullable=True, default="new", comment="线索状态(new/follow/invalid/converted)")
  843. owner_user_id = Column(String(64), nullable=True, comment="负责人ID")
  844. owner_user_name = Column(String(50), nullable=True, comment="负责人姓名(冗余)")
  845. last_time = Column(DateTime, nullable=True, comment="最后跟进时间")
  846. next_time = Column(DateTime, nullable=True, comment="下次联系时间")
  847. follow_count = Column(Integer, nullable=True, default=0, comment="跟进次数")
  848. is_converted = Column(SmallInteger, nullable=True, default=0, comment="是否已转化(0-否 1-是)")
  849. converted_time = Column(DateTime, nullable=True, comment="转化时间")
  850. customer_id = Column(String(64), nullable=True, comment="转化的客户ID")
  851. converted_by = Column(String(64), nullable=True, comment="转化操作人")
  852. assign_time = Column(DateTime, nullable=True, comment="分配时间")
  853. assign_by = Column(String(64), nullable=True, comment="分配人")
  854. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  855. order_num = Column(Integer, nullable=True, comment="排序号")
  856. remark = Column(String(512), nullable=True, comment="备注")
  857. create_by = Column(String(64), nullable=True, comment="创建人ID")
  858. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  859. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  860. update_by = Column(String(64), nullable=True, comment="更新人ID")
  861. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  862. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  863. class CrmClueFollow(Base):
  864. """CRM-线索跟进记录表"""
  865. __tablename__ = "crm_clue_follow"
  866. id = Column(String(64), primary_key=True, comment="主键ID")
  867. clue_id = Column(String(64), nullable=False, comment="线索ID")
  868. clue_name = Column(String(100), nullable=True, comment="线索姓名(冗余)")
  869. follow_type = Column(String(20), nullable=False, comment="跟进方式(电话/微信/邮件/拜访/其他)")
  870. follow_content = Column(Text, nullable=False, comment="跟进内容")
  871. next_time = Column(DateTime, nullable=True, comment="下次联系时间")
  872. attachments = Column(String(1000), nullable=True, comment="附件(多个用逗号分隔)")
  873. create_by_name = Column(String(50), nullable=True, comment="跟进人姓名(冗余)")
  874. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  875. order_num = Column(Integer, nullable=True, comment="排序号")
  876. remark = Column(String(512), nullable=True, comment="备注")
  877. create_by = Column(String(64), nullable=True, comment="创建人ID")
  878. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  879. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  880. update_by = Column(String(64), nullable=True, comment="更新人ID")
  881. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  882. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  883. class CrmPriceLetter(Base):
  884. """CRM-调价函档案(独立,不关联合同/报价单)"""
  885. __tablename__ = "crm_price_letter"
  886. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  887. letter_type = Column(String(20), nullable=False, comment="类型 receive接受/send发出")
  888. adjust_date = Column(Date, nullable=False, comment="调价日期")
  889. customer_id = Column(String(64), nullable=False, comment="客户ID")
  890. customer_name = Column(String(200), nullable=True, comment="客户名称(冗余)")
  891. product_id = Column(String(64), nullable=False, comment="产品ID")
  892. product_name = Column(String(200), nullable=True, comment="产品名称(冗余)")
  893. price = Column(DECIMAL(15, 2), nullable=False, comment="调整后现金价格(元)")
  894. bill_price = Column(DECIMAL(15, 2), nullable=False, default=Decimal("0.00"), comment="调整后汇票价格(元)")
  895. content = Column(Text, nullable=True, comment="发出类富文本HTML")
  896. attachment_urls = Column(String(4000), nullable=True, comment="附件URL(逗号分隔)")
  897. status = Column(String(20), nullable=False, default="normal", comment="状态 normal/invalid")
  898. invalid_reason = Column(String(200), nullable=True, comment="作废原因")
  899. invalid_time = Column(DateTime, nullable=True, comment="作废时间")
  900. invalid_by = Column(String(64), nullable=True, comment="作废人ID")
  901. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  902. order_num = Column(Integer, nullable=True, comment="排序号")
  903. remark = Column(String(512), nullable=True, comment="备注")
  904. create_by = Column(String(64), nullable=True, comment="创建人ID")
  905. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  906. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  907. update_by = Column(String(64), nullable=True, comment="更新人ID")
  908. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  909. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")
  910. class CrmSupplierInfo(Base):
  911. """CRM-供方信息表"""
  912. __tablename__ = "crm_supplier_info"
  913. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  914. supplier_name = Column(String(200), nullable=False, comment="供方名称(章)")
  915. short_name = Column(String(100), nullable=True, comment="简称")
  916. supplier_code = Column(String(50), nullable=True, comment="编码")
  917. supplier_address = Column(String(500), nullable=True, comment="单位地址")
  918. legal_person = Column(String(100), nullable=True, comment="法定代表人")
  919. agent = Column(String(100), nullable=True, comment="代理人")
  920. phone_fax = Column(String(100), nullable=True, comment="电话/传真")
  921. bank_name = Column(String(200), nullable=True, comment="开户银行")
  922. bank_account = Column(String(100), nullable=True, comment="账号")
  923. allow_toxic = Column(SmallInteger, nullable=False, default=0, comment="是否允许易制毒产品(0否1是)")
  924. allow_explosive = Column(SmallInteger, nullable=False, default=0, comment="是否允许易制爆产品(0否1是)")
  925. status = Column(String(1), nullable=True, default="0", comment="状态(0正常 1停用)")
  926. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  927. order_num = Column(Integer, nullable=True, comment="排序号")
  928. remark = Column(String(500), nullable=True, comment="备注")
  929. create_by = Column(String(64), nullable=True, comment="创建人ID")
  930. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  931. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  932. update_by = Column(String(64), nullable=True, comment="更新人ID")
  933. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  934. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记")