pl_models.py 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242
  1. """运输计划管理模块数据模型"""
  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. ForeignKey,
  16. )
  17. from sqlalchemy.orm import relationship
  18. from app.core.database import Base
  19. # =============================================================================
  20. # 1. 基础数据:承运商、车辆、司机
  21. # =============================================================================
  22. class PlCarrier(Base):
  23. """承运商表 pl_carrier"""
  24. __tablename__ = "pl_carrier"
  25. id = Column(String(64), primary_key=True, comment="主键ID")
  26. carrier_name = Column(String(200), nullable=False, comment="承运商名称")
  27. contact_name = Column(String(100), nullable=True, comment="联系人")
  28. contact_phone = Column(String(32), nullable=True, comment="联系电话")
  29. status = Column(CHAR(1), nullable=False, default="1", comment="合作状态 1-合作中 0-已终止")
  30. business_license_urls = Column(String(2000), nullable=True, comment="营业执照附件URL,逗号分隔")
  31. road_transport_license_urls = Column(String(2000), nullable=True, comment="道路经营许可证附件URL,逗号分隔")
  32. transport_agreement_urls = Column(String(2000), nullable=True, comment="运输协议附件URL,逗号分隔")
  33. transport_agreement_expire_date = Column(Date, nullable=True, comment="运输协议有效期")
  34. audit_status = Column(String(20), nullable=False, default="pending", comment="审核状态 pending-待审核 approved-已通过 rejected-已驳回")
  35. audit_by = Column(String(64), nullable=True, comment="审核人id")
  36. audit_time = Column(DateTime, nullable=True, comment="审核时间")
  37. audit_remark = Column(String(512), nullable=True, comment="审核备注(驳回原因等)")
  38. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  39. order_num = Column(Integer, nullable=True, comment="排序号")
  40. remark = Column(String(512), nullable=True, comment="备注")
  41. create_by = Column(String(64), nullable=True, comment="创建人id")
  42. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  43. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  44. update_by = Column(String(64), nullable=True, comment="更新人id")
  45. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  46. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  47. class PlVehicle(Base):
  48. """车辆表 pl_vehicle"""
  49. __tablename__ = "pl_vehicle"
  50. id = Column(String(64), primary_key=True, comment="主键ID")
  51. vehicle_type = Column(String(20), nullable=False, comment="车辆类型 self-自有 carrier-承运商")
  52. carrier_id = Column(String(64), nullable=True, comment="承运商ID(类型为承运商时必填)")
  53. carrier_name = Column(String(200), nullable=True, comment="承运商名称(冗余)")
  54. license_plate = Column(String(20), nullable=False, unique=True, comment="车牌号")
  55. trailer_no = Column(String(20), nullable=True, comment="挂车号")
  56. default_driver_id = Column(String(64), nullable=True, comment="默认司机ID")
  57. default_driver_name = Column(String(100), nullable=True, comment="默认司机姓名(冗余)")
  58. load_capacity = Column(DECIMAL(10, 2), nullable=True, comment="载重(吨)")
  59. vehicle_status = Column(String(20), nullable=False, default="available", comment="车辆状态 available-可用 maintaining-维修中 scrapped-报废")
  60. photo_urls = Column(String(2000), nullable=True, comment="车辆照片URL,逗号分隔")
  61. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  62. order_num = Column(Integer, nullable=True, comment="排序号")
  63. remark = Column(String(512), nullable=True, comment="备注")
  64. create_by = Column(String(64), nullable=True, comment="创建人id")
  65. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  66. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  67. update_by = Column(String(64), nullable=True, comment="更新人id")
  68. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  69. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  70. class PlPersonnel(Base):
  71. """人员表 pl_personnel"""
  72. __tablename__ = "pl_personnel"
  73. id = Column(String(64), primary_key=True, comment="主键ID")
  74. personnel_name = Column(String(100), nullable=False, comment="姓名")
  75. phone_no = Column(String(32), nullable=True, comment="手机号(非必填)")
  76. age = Column(Integer, nullable=True, comment="年龄")
  77. id_card_no = Column(String(32), nullable=True, comment="身份证号")
  78. personnel_type = Column(
  79. String(20),
  80. nullable=False,
  81. default="both",
  82. comment="人员类型 driver-驾驶员 escort-押运员 both-驾驶员兼押运员",
  83. )
  84. personnel_affiliation = Column(
  85. String(20),
  86. nullable=False,
  87. default="self",
  88. comment="人员归属 self-山峡 carrier-非山峡",
  89. )
  90. status = Column(CHAR(1), nullable=False, default="1", comment="状态 1-在职 0-停用")
  91. photo_urls = Column(String(2000), nullable=True, comment="人员照片URL,逗号分隔")
  92. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  93. order_num = Column(Integer, nullable=True, comment="排序号")
  94. remark = Column(String(512), nullable=True, comment="备注")
  95. create_by = Column(String(64), nullable=True, comment="创建人id")
  96. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  97. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  98. update_by = Column(String(64), nullable=True, comment="更新人id")
  99. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  100. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  101. class PlTransportAddress(Base):
  102. """运输通用地址库 pl_transport_address"""
  103. __tablename__ = "pl_transport_address"
  104. id = Column(String(64), primary_key=True, comment="主键ID")
  105. address_name = Column(String(200), nullable=False, comment="地址名称")
  106. full_address = Column(String(500), nullable=False, comment="详细地址")
  107. lng = Column(DECIMAL(10, 6), nullable=False, comment="经度")
  108. lat = Column(DECIMAL(10, 6), nullable=False, comment="纬度")
  109. contact_name = Column(String(100), nullable=True, comment="联系人")
  110. contact_phone = Column(String(32), nullable=True, comment="联系电话")
  111. status = Column(CHAR(1), nullable=False, default="1", comment="状态 1-启用 0-停用")
  112. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  113. order_num = Column(Integer, nullable=True, comment="排序号")
  114. remark = Column(String(512), nullable=True, comment="备注")
  115. create_by = Column(String(64), nullable=True, comment="创建人id")
  116. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  117. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  118. update_by = Column(String(64), nullable=True, comment="更新人id")
  119. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  120. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  121. class PlCert(Base):
  122. """证书表 pl_cert"""
  123. __tablename__ = "pl_cert"
  124. id = Column(String(64), primary_key=True, comment="主键ID")
  125. owner_type = Column(String(20), nullable=False, comment="归属类型 vehicle-车辆 personnel-人员")
  126. owner_id = Column(String(64), nullable=False, comment="归属主体ID")
  127. vehicle_part = Column(String(20), nullable=True, comment="车辆部位 head-主车 trailer-挂车,人员证书为空")
  128. cert_name = Column(String(100), nullable=False, comment="证书名称")
  129. cert_no = Column(String(64), nullable=True, comment="证号")
  130. expire_date = Column(Date, nullable=True, comment="有效期")
  131. remind_days = Column(Integer, nullable=False, default=30, comment="提前提醒天数")
  132. attachment_urls = Column(String(2000), nullable=True, comment="附件URL(逗号分隔)")
  133. status = Column(String(20), nullable=False, default="valid", comment="状态 valid-有效 expired-已过期 revoked-已作废")
  134. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  135. order_num = Column(Integer, nullable=True, comment="排序号")
  136. remark = Column(String(512), nullable=True, comment="备注")
  137. create_by = Column(String(64), nullable=True, comment="创建人id")
  138. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  139. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  140. update_by = Column(String(64), nullable=True, comment="更新人id")
  141. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  142. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  143. class PlDriver(Base):
  144. """司机表 pl_driver(兼容旧表,迁移后逐步废弃)"""
  145. __tablename__ = "pl_driver"
  146. id = Column(String(64), primary_key=True, comment="主键ID")
  147. driver_name = Column(String(100), nullable=False, comment="姓名")
  148. phone_no = Column(String(32), nullable=False, comment="手机号")
  149. id_card_no = Column(String(32), nullable=True, comment="身份证号")
  150. driving_license_no = Column(String(32), nullable=True, comment="驾驶证号")
  151. driving_license_expire = Column(Date, nullable=True, comment="驾驶证有效期")
  152. vehicle_license_no = Column(String(32), nullable=True, comment="行驶证号")
  153. vehicle_license_expire = Column(Date, nullable=True, comment="行驶证有效期")
  154. hazmat_cert_no = Column(String(32), nullable=True, comment="危化品证号")
  155. hazmat_cert_expire = Column(Date, nullable=True, comment="危化品证有效期")
  156. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  157. order_num = Column(Integer, nullable=True, comment="排序号")
  158. remark = Column(String(512), nullable=True, comment="备注")
  159. create_by = Column(String(64), nullable=True, comment="创建人id")
  160. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  161. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  162. update_by = Column(String(64), nullable=True, comment="更新人id")
  163. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  164. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  165. class PlVehiclePersonnel(Base):
  166. """车辆-人员关联表 pl_vehicle_personnel"""
  167. __tablename__ = "pl_vehicle_personnel"
  168. id = Column(String(64), primary_key=True, comment="主键ID")
  169. vehicle_id = Column(String(64), nullable=False, comment="车辆ID")
  170. personnel_id = Column(String(64), nullable=False, comment="人员ID")
  171. role = Column(String(20), nullable=False, default="driver", comment="角色 driver-司机 escort-押运员")
  172. is_default = Column(SmallInteger, nullable=False, default=0, comment="是否默认司机 0-否 1-是")
  173. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  174. order_num = Column(Integer, nullable=True, comment="排序号")
  175. remark = Column(String(512), nullable=True, comment="关联备注")
  176. create_by = Column(String(64), nullable=True, comment="创建人id")
  177. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  178. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  179. update_by = Column(String(64), nullable=True, comment="更新人id")
  180. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  181. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  182. class PlVehicleDriver(Base):
  183. """车辆-司机关联表 pl_vehicle_driver(兼容旧表)"""
  184. __tablename__ = "pl_vehicle_driver"
  185. id = Column(String(64), primary_key=True, comment="主键ID")
  186. vehicle_id = Column(String(64), nullable=False, comment="车辆ID")
  187. driver_id = Column(String(64), nullable=False, comment="司机ID")
  188. is_default = Column(SmallInteger, nullable=False, default=0, comment="是否默认 0-否 1-是")
  189. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  190. order_num = Column(Integer, nullable=True, comment="排序号")
  191. remark = Column(String(512), nullable=True, comment="备注")
  192. create_by = Column(String(64), nullable=True, comment="创建人id")
  193. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  194. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  195. update_by = Column(String(64), nullable=True, comment="更新人id")
  196. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  197. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  198. # =============================================================================
  199. # 2. 计划管理:计划主表、产品明细、变更记录
  200. # =============================================================================
  201. class PlPlan(Base):
  202. """计划主表 pl_plan"""
  203. __tablename__ = "pl_plan"
  204. id = Column(String(64), primary_key=True, comment="主键ID")
  205. # 编号信息
  206. plan_no = Column(String(32), nullable=False, unique=True, comment="计划订单编号 POYYYYMMDD###")
  207. create_date = Column(Date, nullable=False, comment="创建日期")
  208. plan_date = Column(Date, nullable=True, comment="计划日期")
  209. # 基本信息
  210. belongs_company = Column(String(20), nullable=False, comment="归属公司 shanxia-安庆山峡 yundong-安徽云栋")
  211. plan_type = Column(String(20), nullable=False, comment="单据类型 direct-直销单 inbound-入库单 outbound-出库单")
  212. follow_status = Column(
  213. String(30),
  214. nullable=False,
  215. default="pending_arrange",
  216. comment="跟进状态 wait_notice-等通知 pending_arrange-待安排 arranged-已安排 completed-已完成 cancelled-已取消",
  217. )
  218. transport_status = Column(String(20), nullable=False, default="pending", comment="运输安排状态 pending-待安排 arranged-已安排")
  219. archive_status = Column(String(20), nullable=False, default="unarchived", comment="归档状态 unarchived-未归档 archived-已归档")
  220. complete_status = Column(String(10), nullable=False, default="no", comment="完成状态 yes-是 no-否")
  221. # 合同关联
  222. contract_id = Column(String(64), nullable=True, comment="CRM合同ID")
  223. contract_no = Column(String(50), nullable=True, comment="合同编号")
  224. # 供应商与目的地
  225. supplier_id = Column(String(64), nullable=True, comment="供应商ID")
  226. supplier_name = Column(String(200), nullable=True, comment="供应商名称")
  227. destination_id = Column(String(64), nullable=True, comment="目的地ID")
  228. destination_name = Column(String(200), nullable=True, comment="目的地名称")
  229. # 客户信息(冗余自合同)
  230. customer_id = Column(String(64), nullable=True, comment="客户ID")
  231. customer_name = Column(String(200), nullable=True, comment="客户名称")
  232. contact_name = Column(String(100), nullable=True, comment="联系人")
  233. contact_phone = Column(String(32), nullable=True, comment="联系电话")
  234. party_a = Column(String(200), nullable=True, comment="甲方")
  235. party_b = Column(String(200), nullable=True, comment="乙方")
  236. # 合同有效期
  237. contract_start_date = Column(Date, nullable=True, comment="合同开始日期")
  238. contract_end_date = Column(Date, nullable=True, comment="合同结束日期")
  239. # 送货与结算
  240. delivery_method = Column(String(20), nullable=True, comment="送货方式 self_pick-山峡自提 one_ticket-一票制 customer_pick-客户自提")
  241. settlement_method = Column(String(50), nullable=True, comment="结算方式")
  242. # 运输信息
  243. has_freight = Column(SmallInteger, nullable=False, default=0, comment="是否有运输费用 0-否 1-是")
  244. pickup_address = Column(String(500), nullable=True, comment="取货地址")
  245. pickup_lng = Column(DECIMAL(10, 6), nullable=True, comment="取货经度")
  246. pickup_lat = Column(DECIMAL(10, 6), nullable=True, comment="取货纬度")
  247. pickup_time = Column(DateTime, nullable=True, comment="取货时间")
  248. pickup_contact = Column(String(200), nullable=True, comment="取货联系方式")
  249. pickup_notes = Column(String(500), nullable=True, comment="取货注意事项")
  250. destination_address = Column(String(500), nullable=True, comment="目的地地址")
  251. destination_lng = Column(DECIMAL(10, 6), nullable=True, comment="送货经度")
  252. destination_lat = Column(DECIMAL(10, 6), nullable=True, comment="送货纬度")
  253. delivery_time = Column(DateTime, nullable=True, comment="送达时间")
  254. delivery_contact = Column(String(200), nullable=True, comment="送货联系方式")
  255. destination_notes = Column(String(500), nullable=True, comment="目的地注意事项")
  256. transport_id = Column(String(64), nullable=True, comment="运输ID")
  257. transport_no = Column(String(32), nullable=True, comment="运输编号")
  258. vehicle_id = Column(String(64), nullable=True, comment="车辆ID")
  259. license_plate = Column(String(20), nullable=True, comment="车牌号")
  260. trailer_no = Column(String(20), nullable=True, comment="挂车号(安排运输时快照)")
  261. driver_id = Column(String(64), nullable=True, comment="司机ID")
  262. driver_name = Column(String(100), nullable=True, comment="司机姓名")
  263. personnel_summary = Column(String(500), nullable=True, comment="关联人员摘要(安排运输时快照)")
  264. resource_snapshot = Column(Text, nullable=True, comment="车辆/人员/证件整包快照 JSON")
  265. # 金额汇总
  266. total_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="计划总金额")
  267. freight_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="运费合计")
  268. # 通知信息
  269. notify_message = Column(Text, nullable=True, comment="通知信息(标准模板)")
  270. slip_template_content = Column(Text, nullable=True, comment="入库单打印模板内容(富文本HTML)")
  271. delivery_slip_template_content = Column(Text, nullable=True, comment="送(提)货单打印模板内容(富文本HTML)")
  272. subpack_slip_template_content = Column(Text, nullable=True, comment="分装单打印模板内容(富文本HTML)")
  273. subpack_slip_no = Column(String(32), nullable=True, comment="分装单号 NO:SXFZYYYYMMDD-序号")
  274. # 跟进人
  275. follow_user_id = Column(String(64), nullable=True, comment="跟进人ID")
  276. follow_user_name = Column(String(100), nullable=True, comment="跟进人姓名")
  277. # 危化品证书齐备(人工确认)
  278. hazard_cert_ready = Column(SmallInteger, nullable=False, default=0, comment="危化品证书是否已人工确认齐备 0-否 1-是")
  279. hazard_cert_ready_by = Column(String(64), nullable=True, comment="危化品证书确认人")
  280. hazard_cert_ready_time = Column(DateTime, nullable=True, comment="危化品证书确认时间")
  281. # 公共字段
  282. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  283. order_num = Column(Integer, nullable=True, comment="排序号")
  284. remark = Column(String(512), nullable=True, comment="备注")
  285. create_by = Column(String(64), nullable=True, comment="创建人id")
  286. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  287. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  288. update_by = Column(String(64), nullable=True, comment="更新人id")
  289. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  290. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  291. class PlPlanContract(Base):
  292. """运输计划-合同关联(分侧多选) pl_plan_contract"""
  293. __tablename__ = "pl_plan_contract"
  294. id = Column(String(64), primary_key=True, comment="主键ID")
  295. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  296. side = Column(String(20), nullable=False, comment="supplier-供方 demander-需方")
  297. contract_id = Column(String(64), nullable=False, comment="CRM合同ID")
  298. contract_no = Column(String(50), nullable=True, comment="合同编号快照")
  299. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  300. order_num = Column(Integer, nullable=True, comment="排序号")
  301. remark = Column(String(512), nullable=True, comment="备注")
  302. create_by = Column(String(64), nullable=True, comment="创建人id")
  303. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  304. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  305. update_by = Column(String(64), nullable=True, comment="更新人id")
  306. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  307. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  308. class PlPlanProduct(Base):
  309. """计划产品明细表 pl_plan_product"""
  310. __tablename__ = "pl_plan_product"
  311. id = Column(String(64), primary_key=True, comment="主键ID")
  312. plan_id = Column(String(64), nullable=False, comment="计划ID")
  313. # 产品信息
  314. product_id = Column(String(64), nullable=False, comment="产品ID")
  315. product_no = Column(String(50), nullable=False, comment="产品编号")
  316. product_name = Column(String(200), nullable=False, comment="产品名称")
  317. brand_mode = Column(String(20), nullable=True, comment="required/any")
  318. brand_id = Column(String(64), nullable=True, comment="指定品牌ID")
  319. brand_name = Column(String(100), nullable=True, comment="品牌名快照")
  320. model = Column(String(100), nullable=True, comment="规格型号")
  321. unit = Column(String(20), nullable=False, default="吨", comment="单位")
  322. category_name = Column(String(200), nullable=True, comment="产品分类")
  323. package_spec = Column(String(200), nullable=True, comment="包装规格")
  324. delivery_method = Column(String(50), nullable=True, comment="送货方式")
  325. quantity = Column(DECIMAL(15, 3), nullable=True, comment="合同数量")
  326. actual_qty = Column(DECIMAL(15, 3), nullable=True, comment="实际数量")
  327. tax_price = Column(DECIMAL(15, 4), nullable=True, comment="含税单价")
  328. tax_amount = Column(DECIMAL(15, 2), nullable=True, comment="税费")
  329. tax_subtotal = Column(DECIMAL(15, 2), nullable=True, comment="含税总价")
  330. # 产品属性(冗余自产品主数据)
  331. is_explosive = Column(SmallInteger, nullable=False, default=0, comment="是否易制爆 0-否 1-是")
  332. is_toxic = Column(SmallInteger, nullable=False, default=0, comment="是否易制毒 0-否 1-是")
  333. # 危化品证书(按 is_toxic / is_explosive 决定所需种类)
  334. purchase_cert_url = Column(String(2000), nullable=True, comment="购买证URL,逗号分隔")
  335. transport_cert_url = Column(String(2000), nullable=True, comment="运输证URL,逗号分隔")
  336. legal_use_cert_url = Column(String(2000), nullable=True, comment="合法使用证明URL,逗号分隔")
  337. # 入库信息
  338. inbound_estimate_qty = Column(DECIMAL(15, 3), nullable=True, comment="入库预估数")
  339. inbound_qty = Column(DECIMAL(15, 3), nullable=True, comment="入库数")
  340. inbound_price = Column(DECIMAL(15, 4), nullable=True, comment="入库价")
  341. inbound_amount = Column(DECIMAL(15, 2), nullable=True, comment="入库金额")
  342. # 出库信息
  343. outbound_estimate_qty = Column(DECIMAL(15, 3), nullable=True, comment="出库预估数")
  344. outbound_qty = Column(DECIMAL(15, 3), nullable=True, comment="出库数")
  345. outbound_price = Column(DECIMAL(15, 4), nullable=True, comment="出库单价")
  346. outbound_amount = Column(DECIMAL(15, 2), nullable=True, comment="出库金额")
  347. # 公共字段
  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="删除标记:0-正常 1-已删除")
  357. class PlPlanProductBrandQty(Base):
  358. """计划产品归档品牌数量 pl_plan_product_brand_qty"""
  359. __tablename__ = "pl_plan_product_brand_qty"
  360. id = Column(String(64), primary_key=True, comment="主键ID")
  361. plan_id = Column(String(64), nullable=False, comment="计划ID")
  362. plan_product_id = Column(String(64), nullable=False, comment="计划产品明细ID")
  363. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,空串=无品牌键")
  364. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  365. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌归档实际数量")
  366. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  367. order_num = Column(Integer, nullable=True, comment="排序号")
  368. remark = Column(String(512), nullable=True, comment="备注")
  369. create_by = Column(String(64), nullable=True, comment="创建人id")
  370. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  371. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  372. update_by = Column(String(64), nullable=True, comment="更新人id")
  373. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  374. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  375. class PlPlanChange(Base):
  376. """计划变更记录表 pl_plan_change"""
  377. __tablename__ = "pl_plan_change"
  378. id = Column(String(64), primary_key=True, comment="主键ID")
  379. plan_id = Column(String(64), nullable=False, comment="计划ID")
  380. change_type = Column(String(30), nullable=False, comment="变更类型")
  381. change_content = Column(Text, nullable=True, comment="变更内容")
  382. change_user_id = Column(String(64), nullable=True, comment="变更人ID")
  383. change_user_name = Column(String(100), nullable=True, comment="变更人姓名")
  384. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  385. order_num = Column(Integer, nullable=True, comment="排序号")
  386. remark = Column(String(512), nullable=True, comment="备注")
  387. create_by = Column(String(64), nullable=True, comment="创建人id")
  388. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  389. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  390. update_by = Column(String(64), nullable=True, comment="更新人id")
  391. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  392. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  393. # =============================================================================
  394. # 3. 运输管理:运输表、审批记录
  395. # =============================================================================
  396. class PlTransport(Base):
  397. """运输表 pl_transport"""
  398. __tablename__ = "pl_transport"
  399. id = Column(String(64), primary_key=True, comment="主键ID")
  400. transport_no = Column(String(32), nullable=False, unique=True, comment="运输编号 SXYS######")
  401. # 车辆与司机
  402. vehicle_id = Column(String(64), nullable=True, comment="车辆ID")
  403. license_plate = Column(String(20), nullable=True, comment="车牌号")
  404. trailer_no = Column(String(20), nullable=True, comment="挂车号(安排运输时快照)")
  405. driver_id = Column(String(64), nullable=True, comment="司机ID")
  406. driver_name = Column(String(100), nullable=True, comment="司机姓名")
  407. driver_phone = Column(String(32), nullable=True, comment="司机电话")
  408. resource_snapshot = Column(Text, nullable=True, comment="车辆/人员/证件整包快照 JSON")
  409. # 承运商
  410. carrier_id = Column(String(64), nullable=True, comment="承运商ID")
  411. carrier_name = Column(String(200), nullable=True, comment="承运商名称")
  412. # 运输信息
  413. transport_medium = Column(String(100), nullable=True, comment="运输介质")
  414. start_point = Column(String(200), nullable=True, comment="运输起点")
  415. end_point = Column(String(200), nullable=True, comment="运输终点")
  416. distance_km = Column(DECIMAL(10, 2), nullable=True, comment="运输公里数")
  417. unit = Column(String(20), nullable=True, comment="计量单位 吨/趟")
  418. transport_qty = Column(DECIMAL(15, 3), nullable=True, comment="运输量(按重量计费基数)")
  419. # 运费
  420. freight_price = Column(DECIMAL(15, 4), nullable=True, comment="运输单价")
  421. freight_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="运输费用")
  422. freight_type = Column(String(20), nullable=False, default="by_weight", comment="运费计算方式 by_weight-按重量 by_trip-按趟次")
  423. has_invoice = Column(SmallInteger, nullable=False, default=0, comment="是否开票 0-否 1-是")
  424. # 二维码
  425. qr_code = Column(String(500), nullable=True, comment="二维码内容")
  426. qr_expire_date = Column(Date, nullable=True, comment="二维码有效期")
  427. driver_access_token = Column(String(64), nullable=True, comment="司机免登录访问令牌")
  428. # 运输状态
  429. transport_status = Column(String(20), nullable=False, default="draft", comment="运输状态 draft-草稿 pending-待执行 executing-执行中 completed-已完成 cancelled-已取消")
  430. approval_status = Column(String(20), nullable=False, default="none", comment="审批状态 none-无需 pending-审批中 approved-已通过 rejected-已拒绝")
  431. # 司机回传信息
  432. feedback_time = Column(DateTime, nullable=True, comment="回传时间")
  433. feedback_qty = Column(DECIMAL(15, 3), nullable=True, comment="回传数量")
  434. feedback_images = Column(Text, nullable=True, comment="回传图片URLs(JSON数组)")
  435. feedback_remark = Column(String(500), nullable=True, comment="回传备注")
  436. # 公共字段
  437. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  438. order_num = Column(Integer, nullable=True, comment="排序号")
  439. remark = Column(String(512), nullable=True, comment="备注")
  440. create_by = Column(String(64), nullable=True, comment="创建人id")
  441. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  442. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  443. update_by = Column(String(64), nullable=True, comment="更新人id")
  444. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  445. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  446. class PlTransportProductFeedback(Base):
  447. """运输单按产品回传 pl_transport_product_feedback"""
  448. __tablename__ = "pl_transport_product_feedback"
  449. id = Column(String(64), primary_key=True, comment="主键ID")
  450. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  451. plan_id = Column(String(64), nullable=False, comment="计划ID")
  452. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  453. actual_qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="该产品回传总量")
  454. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  455. order_num = Column(Integer, nullable=True, comment="排序号")
  456. remark = Column(String(512), nullable=True, comment="备注")
  457. create_by = Column(String(64), nullable=True, comment="创建人id")
  458. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  459. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  460. update_by = Column(String(64), nullable=True, comment="更新人id")
  461. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  462. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  463. class PlTransportProductBrandQty(Base):
  464. """运输单产品回传品牌数量 pl_transport_product_brand_qty"""
  465. __tablename__ = "pl_transport_product_brand_qty"
  466. id = Column(String(64), primary_key=True, comment="主键ID")
  467. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  468. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  469. feedback_id = Column(String(64), nullable=True, comment="产品回传行ID")
  470. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID")
  471. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  472. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌数量")
  473. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  474. order_num = Column(Integer, nullable=True, comment="排序号")
  475. remark = Column(String(512), nullable=True, comment="备注")
  476. create_by = Column(String(64), nullable=True, comment="创建人id")
  477. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  478. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  479. update_by = Column(String(64), nullable=True, comment="更新人id")
  480. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  481. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  482. class PlTransportDbLink(Base):
  483. """运输-地磅出入库关联 pl_transport_db_link"""
  484. __tablename__ = "pl_transport_db_link"
  485. id = Column(String(64), primary_key=True, comment="主键ID")
  486. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  487. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  488. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  489. db_purchase_plan_id = Column(String(64), nullable=False, comment="地磅计划ID")
  490. db_inventory_id = Column(String(64), nullable=False, comment="出入库单ID")
  491. contributed_qty = Column(DECIMAL(15, 3), nullable=True, comment="本次联动贡献量(吨)")
  492. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  493. order_num = Column(Integer, nullable=True, comment="排序号")
  494. remark = Column(String(512), nullable=True, comment="备注")
  495. create_by = Column(String(64), nullable=True, comment="创建人id")
  496. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  497. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  498. update_by = Column(String(64), nullable=True, comment="更新人id")
  499. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  500. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  501. class PlPlanTransport(Base):
  502. """计划-运输关联表 pl_plan_transport"""
  503. __tablename__ = "pl_plan_transport"
  504. id = Column(String(64), primary_key=True, comment="主键ID")
  505. plan_id = Column(String(64), nullable=False, comment="计划ID")
  506. transport_id = Column(String(64), nullable=False, comment="运输ID")
  507. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  508. order_num = Column(Integer, nullable=True, comment="排序号")
  509. remark = Column(String(512), nullable=True, comment="备注")
  510. create_by = Column(String(64), nullable=True, comment="创建人id")
  511. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  512. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  513. update_by = Column(String(64), nullable=True, comment="更新人id")
  514. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  515. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  516. class PlTransportSiteLink(Base):
  517. """运输计划现场链接 pl_transport_site_link(与地磅出入库单解耦)"""
  518. __tablename__ = "pl_transport_site_link"
  519. id = Column(String(64), primary_key=True, comment="主键ID")
  520. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  521. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  522. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  523. site_access_token = Column(String(64), nullable=False, comment="现场人员免登录访问令牌")
  524. business_type = Column(String(20), nullable=False, comment="业务类型:入库/出库")
  525. partner_company = Column(String(200), nullable=True, comment="往来单位")
  526. product_id = Column(String(64), nullable=True, comment="CRM产品ID")
  527. product = Column(String(200), nullable=True, comment="产品名称快照")
  528. specification = Column(String(200), nullable=True, comment="规格快照")
  529. quantity = Column(DECIMAL(15, 3), nullable=True, comment="数量(吨)")
  530. vehicle_no = Column(String(32), nullable=True, comment="车牌号")
  531. plan_no = Column(String(64), nullable=True, comment="运输计划号")
  532. plan_date = Column(Date, nullable=True, comment="计划日期")
  533. site_feedback_remark = Column(String(500), nullable=True, comment="现场回执备注")
  534. site_feedback_images = Column(Text, nullable=True, comment="现场回执附件URLs(JSON数组)")
  535. site_feedback_time = Column(DateTime, nullable=True, comment="现场回执保存时间")
  536. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  537. order_num = Column(Integer, nullable=True, comment="排序号")
  538. remark = Column(String(512), nullable=True, comment="备注")
  539. create_by = Column(String(64), nullable=True, comment="创建人id")
  540. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  541. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  542. update_by = Column(String(64), nullable=True, comment="更新人id")
  543. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  544. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  545. class PlInboundOrder(Base):
  546. """运输计划-入库单 pl_inbound_order"""
  547. __tablename__ = "pl_inbound_order"
  548. id = Column(String(64), primary_key=True, comment="主键ID")
  549. order_no = Column(String(32), nullable=False, comment="入库单号")
  550. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  551. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  552. status = Column(String(20), nullable=False, default="in_progress", comment="in_progress/completed/voided")
  553. partner_company = Column(String(200), nullable=True, comment="往来单位快照")
  554. vehicle_no = Column(String(32), nullable=True, comment="车牌快照")
  555. plan_no = Column(String(64), nullable=True, comment="计划号快照")
  556. plan_date = Column(Date, nullable=True, comment="计划日期快照")
  557. site_access_token = Column(String(64), nullable=False, comment="现场免登录令牌")
  558. site_feedback_remark = Column(String(500), nullable=True, comment="现场备注")
  559. site_feedback_images = Column(Text, nullable=True, comment="现场附件URLs(JSON数组)")
  560. site_feedback_time = Column(DateTime, nullable=True, comment="最近现场提交时间")
  561. site_first_submitted_at = Column(DateTime, nullable=True, comment="首次现场提交时间")
  562. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  563. order_num = Column(Integer, nullable=True, comment="排序号")
  564. remark = Column(String(512), nullable=True, comment="备注")
  565. create_by = Column(String(64), nullable=True, comment="创建人id")
  566. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  567. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  568. update_by = Column(String(64), nullable=True, comment="更新人id")
  569. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  570. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  571. class PlInboundOrderItem(Base):
  572. """运输计划-入库单明细 pl_inbound_order_item"""
  573. __tablename__ = "pl_inbound_order_item"
  574. id = Column(String(64), primary_key=True, comment="主键ID")
  575. order_id = Column(String(64), nullable=False, comment="入库单ID")
  576. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  577. product_id = Column(String(64), nullable=True, comment="CRM产品ID")
  578. product_name = Column(String(200), nullable=True, comment="产品名称快照")
  579. specification = Column(String(200), nullable=True, comment="规格快照")
  580. unit = Column(String(32), nullable=True, comment="单位")
  581. plan_qty = Column(DECIMAL(15, 3), nullable=True, comment="计划数量")
  582. actual_qty = Column(DECIMAL(15, 3), nullable=True, comment="实际数量")
  583. qty_source = Column(String(20), nullable=True, default="plan", comment="plan/dibang/manual")
  584. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  585. order_num = Column(Integer, nullable=True, comment="排序号")
  586. remark = Column(String(512), nullable=True, comment="备注")
  587. create_by = Column(String(64), nullable=True, comment="创建人id")
  588. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  589. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  590. update_by = Column(String(64), nullable=True, comment="更新人id")
  591. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  592. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  593. class PlInboundOrderItemBrandQty(Base):
  594. """入库明细品牌数量 pl_inbound_order_item_brand_qty"""
  595. __tablename__ = "pl_inbound_order_item_brand_qty"
  596. id = Column(String(64), primary_key=True, comment="主键ID")
  597. order_id = Column(String(64), nullable=False, comment="入库单ID")
  598. order_item_id = Column(String(64), nullable=False, comment="入库明细ID")
  599. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  600. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID")
  601. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  602. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌数量")
  603. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  604. order_num = Column(Integer, nullable=True, comment="排序号")
  605. remark = Column(String(512), nullable=True, comment="备注")
  606. create_by = Column(String(64), nullable=True, comment="创建人id")
  607. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  608. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  609. update_by = Column(String(64), nullable=True, comment="更新人id")
  610. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  611. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  612. class PlOutboundOrder(Base):
  613. """运输计划-出库单 pl_outbound_order"""
  614. __tablename__ = "pl_outbound_order"
  615. id = Column(String(64), primary_key=True, comment="主键ID")
  616. order_no = Column(String(32), nullable=False, comment="出库单号")
  617. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  618. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  619. status = Column(String(20), nullable=False, default="in_progress", comment="in_progress/completed/voided")
  620. partner_company = Column(String(200), nullable=True, comment="往来单位快照")
  621. vehicle_no = Column(String(32), nullable=True, comment="车牌快照")
  622. plan_no = Column(String(64), nullable=True, comment="计划号快照")
  623. plan_date = Column(Date, nullable=True, comment="计划日期快照")
  624. site_access_token = Column(String(64), nullable=False, comment="现场免登录令牌")
  625. site_feedback_remark = Column(String(500), nullable=True, comment="现场备注")
  626. site_feedback_images = Column(Text, nullable=True, comment="现场附件URLs(JSON数组)")
  627. site_feedback_time = Column(DateTime, nullable=True, comment="最近现场提交时间")
  628. site_first_submitted_at = Column(DateTime, nullable=True, comment="首次现场提交时间")
  629. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  630. order_num = Column(Integer, nullable=True, comment="排序号")
  631. remark = Column(String(512), nullable=True, comment="备注")
  632. create_by = Column(String(64), nullable=True, comment="创建人id")
  633. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  634. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  635. update_by = Column(String(64), nullable=True, comment="更新人id")
  636. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  637. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  638. class PlOutboundOrderItem(Base):
  639. """运输计划-出库单明细 pl_outbound_order_item"""
  640. __tablename__ = "pl_outbound_order_item"
  641. id = Column(String(64), primary_key=True, comment="主键ID")
  642. order_id = Column(String(64), nullable=False, comment="出库单ID")
  643. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  644. product_id = Column(String(64), nullable=True, comment="CRM产品ID")
  645. product_name = Column(String(200), nullable=True, comment="产品名称快照")
  646. specification = Column(String(200), nullable=True, comment="规格快照")
  647. unit = Column(String(32), nullable=True, comment="单位")
  648. plan_qty = Column(DECIMAL(15, 3), nullable=True, comment="计划数量")
  649. actual_qty = Column(DECIMAL(15, 3), nullable=True, comment="实际数量")
  650. qty_source = Column(String(20), nullable=True, default="plan", comment="plan/dibang/manual")
  651. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  652. order_num = Column(Integer, nullable=True, comment="排序号")
  653. remark = Column(String(512), nullable=True, comment="备注")
  654. create_by = Column(String(64), nullable=True, comment="创建人id")
  655. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  656. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  657. update_by = Column(String(64), nullable=True, comment="更新人id")
  658. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  659. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  660. class PlOutboundOrderItemBrandQty(Base):
  661. """出库明细品牌数量 pl_outbound_order_item_brand_qty"""
  662. __tablename__ = "pl_outbound_order_item_brand_qty"
  663. id = Column(String(64), primary_key=True, comment="主键ID")
  664. order_id = Column(String(64), nullable=False, comment="出库单ID")
  665. order_item_id = Column(String(64), nullable=False, comment="出库明细ID")
  666. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  667. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID")
  668. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  669. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌数量")
  670. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  671. order_num = Column(Integer, nullable=True, comment="排序号")
  672. remark = Column(String(512), nullable=True, comment="备注")
  673. create_by = Column(String(64), nullable=True, comment="创建人id")
  674. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  675. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  676. update_by = Column(String(64), nullable=True, comment="更新人id")
  677. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  678. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  679. class PlTransportApproval(Base):
  680. """运输审批记录表 pl_transport_approval"""
  681. __tablename__ = "pl_transport_approval"
  682. id = Column(String(64), primary_key=True, comment="主键ID")
  683. transport_id = Column(String(64), nullable=False, comment="运输ID")
  684. approver_id = Column(String(64), nullable=False, comment="审批人ID")
  685. approver_name = Column(String(100), nullable=False, comment="审批人姓名")
  686. approval_order = Column(Integer, nullable=False, comment="审批顺序")
  687. status = Column(String(20), nullable=False, default="pending", comment="审批状态 pending-待审批 approved-已通过 rejected-已拒绝")
  688. comment = Column(String(500), nullable=True, comment="审批意见")
  689. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  690. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  691. order_num = Column(Integer, nullable=True, comment="排序号")
  692. remark = Column(String(512), nullable=True, comment="备注")
  693. create_by = Column(String(64), nullable=True, comment="创建人id")
  694. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  695. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  696. update_by = Column(String(64), nullable=True, comment="更新人id")
  697. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  698. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  699. # =============================================================================
  700. # 4. 运费结算
  701. # =============================================================================
  702. class PlFreightSettlement(Base):
  703. """运费结算表 pl_freight_settlement"""
  704. __tablename__ = "pl_freight_settlement"
  705. id = Column(String(64), primary_key=True, comment="主键ID")
  706. settlement_no = Column(String(32), nullable=False, unique=True, comment="结算单编号")
  707. # 结算金额
  708. total_freight = Column(DECIMAL(15, 2), nullable=False, default=0, comment="运费合计")
  709. invoice_amount = Column(DECIMAL(15, 2), nullable=True, comment="发票金额")
  710. # 发票信息
  711. invoice_no = Column(String(50), nullable=True, comment="发票号")
  712. invoice_date = Column(Date, nullable=True, comment="开票日期")
  713. invoice_attachment_urls = Column(Text, nullable=True, comment="发票附件URLs,逗号分隔")
  714. # 结算状态
  715. settlement_status = Column(String(20), nullable=False, default="pending", comment="结算状态 pending-待提交 submitted-已提交 approved-审核通过 confirmed-已确认")
  716. # 公共字段
  717. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  718. order_num = Column(Integer, nullable=True, comment="排序号")
  719. remark = Column(String(512), nullable=True, comment="备注")
  720. create_by = Column(String(64), nullable=True, comment="创建人id")
  721. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  722. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  723. update_by = Column(String(64), nullable=True, comment="更新人id")
  724. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  725. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  726. class PlFreightSettlementApproval(Base):
  727. """运费结算审批 pl_freight_settlement_approval"""
  728. __tablename__ = "pl_freight_settlement_approval"
  729. id = Column(String(64), primary_key=True, comment="主键ID")
  730. settlement_id = Column(String(64), nullable=False, comment="结算单ID")
  731. step = Column(Integer, nullable=False, default=1, comment="步骤序号")
  732. step_name = Column(String(50), nullable=True, comment="步骤名称")
  733. approver_id = Column(String(64), nullable=False, comment="审批人ID")
  734. approver_name = Column(String(64), nullable=True, comment="审批人姓名")
  735. approval_type = Column(String(20), nullable=False, default="sequential", comment="审批类型")
  736. approval_result = Column(String(20), nullable=False, default="pending", comment="审批结果")
  737. approval_opinion = Column(String(500), nullable=True, comment="审批意见")
  738. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  739. is_current = Column(SmallInteger, nullable=False, default=0, comment="是否当前节点")
  740. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  741. order_num = Column(Integer, nullable=True, comment="排序号")
  742. remark = Column(String(512), nullable=True, comment="备注")
  743. create_by = Column(String(64), nullable=True, comment="创建人id")
  744. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  745. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  746. update_by = Column(String(64), nullable=True, comment="更新人id")
  747. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  748. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  749. class PlFreightSettlementTransport(Base):
  750. """结算单-运输关联表 pl_freight_settlement_transport"""
  751. __tablename__ = "pl_freight_settlement_transport"
  752. id = Column(String(64), primary_key=True, comment="主键ID")
  753. settlement_id = Column(String(64), nullable=False, comment="结算单ID")
  754. transport_id = Column(String(64), nullable=False, comment="运输ID")
  755. freight_amount = Column(DECIMAL(15, 2), nullable=False, comment="运费金额")
  756. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  757. order_num = Column(Integer, nullable=True, comment="排序号")
  758. remark = Column(String(512), nullable=True, comment="备注")
  759. create_by = Column(String(64), nullable=True, comment="创建人id")
  760. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  761. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  762. update_by = Column(String(64), nullable=True, comment="更新人id")
  763. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  764. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  765. class PlRemittanceVoucher(Base):
  766. """汇款凭证表 pl_remittance_voucher"""
  767. __tablename__ = "pl_remittance_voucher"
  768. id = Column(String(64), primary_key=True, comment="主键ID")
  769. settlement_id = Column(String(64), nullable=False, comment="结算单ID")
  770. voucher_no = Column(String(32), nullable=True, comment="凭证编号")
  771. remittance_date = Column(Date, nullable=True, comment="汇款日期")
  772. remittance_amount = Column(DECIMAL(15, 2), nullable=True, comment="汇款金额")
  773. voucher_urls = Column(Text, nullable=True, comment="凭证文件URLs(JSON数组)")
  774. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  775. order_num = Column(Integer, nullable=True, comment="排序号")
  776. remark = Column(String(512), nullable=True, comment="备注")
  777. create_by = Column(String(64), nullable=True, comment="创建人id")
  778. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  779. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  780. update_by = Column(String(64), nullable=True, comment="更新人id")
  781. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  782. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  783. # =============================================================================
  784. # 5. 库存管理
  785. # =============================================================================
  786. class PlInventory(Base):
  787. """库存表 pl_inventory"""
  788. __tablename__ = "pl_inventory"
  789. id = Column(String(64), primary_key=True, comment="主键ID")
  790. product_id = Column(String(64), nullable=False, comment="产品ID")
  791. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,无品牌为空串")
  792. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  793. product_no = Column(String(50), nullable=False, comment="产品编号")
  794. product_name = Column(String(200), nullable=False, comment="产品名称")
  795. model = Column(String(100), nullable=True, comment="规格型号")
  796. unit = Column(String(20), nullable=False, default="吨", comment="单位")
  797. # 库存数量与金额
  798. stock_qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="库存数量")
  799. stock_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="库存金额")
  800. # 预警阈值
  801. low_stock_warning = Column(DECIMAL(15, 3), nullable=True, comment="最低库存预警值")
  802. high_stock_warning = Column(DECIMAL(15, 3), nullable=True, comment="最高库存预警值")
  803. # 公共字段
  804. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  805. order_num = Column(Integer, nullable=True, comment="排序号")
  806. remark = Column(String(512), nullable=True, comment="备注")
  807. create_by = Column(String(64), nullable=True, comment="创建人id")
  808. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  809. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  810. update_by = Column(String(64), nullable=True, comment="更新人id")
  811. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  812. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  813. class PlInventoryTransaction(Base):
  814. """库存流水表 pl_inventory_transaction"""
  815. __tablename__ = "pl_inventory_transaction"
  816. id = Column(String(64), primary_key=True, comment="主键ID")
  817. product_id = Column(String(64), nullable=False, comment="产品ID")
  818. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,无品牌为空串")
  819. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  820. product_name = Column(String(200), nullable=False, comment="产品名称")
  821. transaction_type = Column(String(20), nullable=False, comment="事务类型 inbound-入库 outbound-出库")
  822. plan_id = Column(String(64), nullable=True, comment="计划ID")
  823. plan_no = Column(String(32), nullable=True, comment="计划编号")
  824. # 数量与价格
  825. qty = Column(DECIMAL(15, 3), nullable=False, comment="变动数量(正数入库/负数出库)")
  826. unit_price = Column(DECIMAL(15, 4), nullable=False, comment="单价")
  827. amount = Column(DECIMAL(15, 2), nullable=False, comment="金额")
  828. stock_after = Column(DECIMAL(15, 3), nullable=False, comment="变动后库存")
  829. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  830. order_num = Column(Integer, nullable=True, comment="排序号")
  831. remark = Column(String(512), nullable=True, comment="备注")
  832. create_by = Column(String(64), nullable=True, comment="创建人id")
  833. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  834. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  835. update_by = Column(String(64), nullable=True, comment="更新人id")
  836. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  837. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  838. class PlInventoryWarning(Base):
  839. """库存预警表 pl_inventory_warning"""
  840. __tablename__ = "pl_inventory_warning"
  841. id = Column(String(64), primary_key=True, comment="主键ID")
  842. product_id = Column(String(64), nullable=False, comment="产品ID")
  843. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,无品牌为空串")
  844. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  845. product_name = Column(String(200), nullable=False, comment="产品名称")
  846. warning_type = Column(String(20), nullable=False, comment="预警类型 low-低于最低 high-高于最高")
  847. current_qty = Column(DECIMAL(15, 3), nullable=False, comment="当前库存")
  848. threshold_value = Column(DECIMAL(15, 3), nullable=False, comment="阈值")
  849. status = Column(String(20), nullable=False, default="pending", comment="状态 pending-待处理 resolved-已处理")
  850. resolve_time = Column(DateTime, nullable=True, comment="处理时间")
  851. resolve_remark = Column(String(500), nullable=True, comment="处理备注")
  852. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  853. order_num = Column(Integer, nullable=True, comment="排序号")
  854. remark = Column(String(512), nullable=True, comment="备注")
  855. create_by = Column(String(64), nullable=True, comment="创建人id")
  856. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  857. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  858. update_by = Column(String(64), nullable=True, comment="更新人id")
  859. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  860. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  861. class PlDocumentReminder(Base):
  862. """证件到期提醒表 pl_document_reminder"""
  863. __tablename__ = "pl_document_reminder"
  864. id = Column(String(64), primary_key=True, comment="主键ID")
  865. cert_id = Column(String(64), nullable=True, comment="证书ID")
  866. owner_type = Column(String(20), nullable=True, comment="归属类型 vehicle/personnel")
  867. owner_id = Column(String(64), nullable=True, comment="归属主体ID")
  868. owner_label = Column(String(200), nullable=True, comment="归属展示名(车牌/姓名)")
  869. driver_id = Column(String(64), nullable=True, comment="司机/人员ID(兼容)")
  870. driver_name = Column(String(100), nullable=True, comment="司机/人员姓名(兼容)")
  871. document_type = Column(String(100), nullable=False, comment="证件类型/证书名称")
  872. document_no = Column(String(50), nullable=True, comment="证件号")
  873. expire_date = Column(Date, nullable=False, comment="到期日期")
  874. days_remaining = Column(Integer, nullable=False, comment="剩余天数")
  875. status = Column(String(20), nullable=False, default="pending", comment="状态 pending-待处理 resolved-已处理")
  876. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  877. order_num = Column(Integer, nullable=True, comment="排序号")
  878. remark = Column(String(512), nullable=True, comment="备注")
  879. create_by = Column(String(64), nullable=True, comment="创建人id")
  880. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  881. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  882. update_by = Column(String(64), nullable=True, comment="更新人id")
  883. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  884. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  885. class PlVehicleRechargeApply(Base):
  886. """车辆ETC/加油充值申请 pl_vehicle_recharge_apply"""
  887. __tablename__ = "pl_vehicle_recharge_apply"
  888. id = Column(String(64), primary_key=True, comment="主键ID")
  889. apply_no = Column(String(32), nullable=False, unique=True, comment="申请单号")
  890. license_plate = Column(String(20), nullable=False, comment="车牌号")
  891. recharge_type = Column(String(20), nullable=False, comment="充值类型 etc/fuel")
  892. apply_date = Column(Date, nullable=False, comment="申请日期")
  893. odometer_km = Column(DECIMAL(10, 1), nullable=True, comment="期初公里数")
  894. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  895. applicant_id = Column(String(64), nullable=False, comment="申请人ID")
  896. status = Column(String(20), nullable=False, default="pending", comment="申请状态")
  897. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  898. order_num = Column(Integer, nullable=True, comment="排序号")
  899. remark = Column(String(512), nullable=True, comment="备注")
  900. create_by = Column(String(64), nullable=True, comment="创建人id")
  901. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  902. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  903. update_by = Column(String(64), nullable=True, comment="更新人id")
  904. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  905. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  906. class PlVehicleMaintenanceApply(Base):
  907. """车辆维保申请 pl_vehicle_maintenance_apply"""
  908. __tablename__ = "pl_vehicle_maintenance_apply"
  909. id = Column(String(64), primary_key=True, comment="主键ID")
  910. apply_no = Column(String(32), nullable=False, unique=True, comment="申请单号")
  911. license_plate = Column(String(20), nullable=False, comment="车牌号")
  912. applicant_id = Column(String(64), nullable=False, comment="申请人ID")
  913. apply_date = Column(Date, nullable=False, comment="申请时间")
  914. maintenance_type = Column(String(64), nullable=False, comment="维保类型")
  915. start_date = Column(Date, nullable=False, comment="维保开始时间")
  916. expected_pickup_date = Column(Date, nullable=True, comment="预计取车时间")
  917. maintenance_content = Column(String(1000), nullable=True, comment="维保内容")
  918. shop_address = Column(String(500), nullable=True, comment="维保店铺地址")
  919. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  920. status = Column(String(20), nullable=False, default="pending", comment="申请状态")
  921. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  922. order_num = Column(Integer, nullable=True, comment="排序号")
  923. remark = Column(String(512), nullable=True, comment="备注")
  924. create_by = Column(String(64), nullable=True, comment="创建人id")
  925. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  926. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  927. update_by = Column(String(64), nullable=True, comment="更新人id")
  928. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  929. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  930. class PlVehicleMaintenanceProcess(Base):
  931. """车辆维保处理登记 pl_vehicle_maintenance_process"""
  932. __tablename__ = "pl_vehicle_maintenance_process"
  933. id = Column(String(64), primary_key=True, comment="主键ID")
  934. process_no = Column(String(32), nullable=False, unique=True, comment="处理单号")
  935. apply_id = Column(String(64), nullable=True, unique=True, comment="关联申请单ID")
  936. license_plate = Column(String(20), nullable=True, comment="车牌号冗余")
  937. amount = Column(DECIMAL(10, 2), nullable=True, comment="金额")
  938. handler_id = Column(String(64), nullable=False, comment="处理人ID")
  939. process_date = Column(Date, nullable=False, comment="处理时间")
  940. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  941. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  942. order_num = Column(Integer, nullable=True, comment="排序号")
  943. remark = Column(String(512), nullable=True, comment="备注")
  944. create_by = Column(String(64), nullable=True, comment="创建人id")
  945. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  946. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  947. update_by = Column(String(64), nullable=True, comment="更新人id")
  948. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  949. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  950. class PlVehicleUreaApply(Base):
  951. """车辆尿素申请 pl_vehicle_urea_apply"""
  952. __tablename__ = "pl_vehicle_urea_apply"
  953. id = Column(String(64), primary_key=True, comment="主键ID")
  954. apply_no = Column(String(32), nullable=False, unique=True, comment="申请单号")
  955. license_plate = Column(String(20), nullable=False, comment="车牌号")
  956. applicant_id = Column(String(64), nullable=False, comment="申请人ID")
  957. apply_date = Column(Date, nullable=False, comment="申请时间")
  958. warehouse_in_date = Column(Date, nullable=False, comment="入库时间")
  959. unit = Column(String(32), nullable=False, comment="单位")
  960. quantity = Column(DECIMAL(10, 2), nullable=False, comment="入库数")
  961. apply_amount = Column(DECIMAL(10, 2), nullable=False, comment="申请金额")
  962. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  963. status = Column(String(20), nullable=False, default="pending", comment="申请状态")
  964. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  965. order_num = Column(Integer, nullable=True, comment="排序号")
  966. remark = Column(String(512), nullable=True, comment="备注")
  967. create_by = Column(String(64), nullable=True, comment="创建人id")
  968. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  969. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  970. update_by = Column(String(64), nullable=True, comment="更新人id")
  971. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  972. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  973. class PlVehicleUreaDisburse(Base):
  974. """车辆尿素发放登记 pl_vehicle_urea_disburse"""
  975. __tablename__ = "pl_vehicle_urea_disburse"
  976. id = Column(String(64), primary_key=True, comment="主键ID")
  977. disburse_no = Column(String(32), nullable=False, unique=True, comment="发放单号")
  978. apply_id = Column(String(64), nullable=True, unique=True, comment="关联申请单ID")
  979. license_plate = Column(String(20), nullable=True, comment="车牌号冗余")
  980. amount = Column(DECIMAL(10, 2), nullable=False, comment="发放金额")
  981. handler_id = Column(String(64), nullable=False, comment="处理人ID")
  982. disburse_date = Column(Date, nullable=False, comment="发放时间")
  983. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  984. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  985. order_num = Column(Integer, nullable=True, comment="排序号")
  986. remark = Column(String(512), nullable=True, comment="备注")
  987. create_by = Column(String(64), nullable=True, comment="创建人id")
  988. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  989. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  990. update_by = Column(String(64), nullable=True, comment="更新人id")
  991. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  992. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  993. class PlOcrUsageMonth(Base):
  994. """阿里云 OCR 月度调用计数 pl_ocr_usage_month(按自然月全局统计)"""
  995. __tablename__ = "pl_ocr_usage_month"
  996. id = Column(String(64), primary_key=True, comment="主键ID")
  997. usage_month = Column(String(7), nullable=False, unique=True, comment="自然月 YYYY-MM")
  998. used_count = Column(Integer, nullable=False, default=0, comment="当月已调用次数")
  999. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1000. order_num = Column(Integer, nullable=True, comment="排序号")
  1001. remark = Column(String(512), nullable=True, comment="备注")
  1002. create_by = Column(String(64), nullable=True, comment="创建人id")
  1003. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1004. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1005. update_by = Column(String(64), nullable=True, comment="更新人id")
  1006. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1007. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1008. class PlVehicleRechargeRecord(Base):
  1009. """车辆ETC/加油充值发放登记 pl_vehicle_recharge_record"""
  1010. __tablename__ = "pl_vehicle_recharge_record"
  1011. id = Column(String(64), primary_key=True, comment="主键ID")
  1012. recharge_order_no = Column(String(32), nullable=False, unique=True, comment="充值订单号")
  1013. recharge_date = Column(Date, nullable=False, comment="充值日期")
  1014. recharge_type = Column(String(20), nullable=False, comment="充值类型")
  1015. card_no = Column(String(64), nullable=True, comment="卡号")
  1016. gas_station = Column(String(200), nullable=True, comment="加油站/渠道")
  1017. amount = Column(DECIMAL(10, 2), nullable=False, comment="充值金额")
  1018. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1019. apply_id = Column(String(64), nullable=True, unique=True, comment="关联申请单ID")
  1020. license_plate = Column(String(20), nullable=True, comment="车牌号冗余")
  1021. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1022. order_num = Column(Integer, nullable=True, comment="排序号")
  1023. remark = Column(String(512), nullable=True, comment="备注")
  1024. create_by = Column(String(64), nullable=True, comment="创建人id")
  1025. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1026. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1027. update_by = Column(String(64), nullable=True, comment="更新人id")
  1028. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1029. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")