crm_models.py 71 KB

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