pl_models.py 91 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456
  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 PlCustomerStopPref(Base):
  122. """客户装/送货物流默认记忆 pl_customer_stop_pref"""
  123. __tablename__ = "pl_customer_stop_pref"
  124. id = Column(String(64), primary_key=True, comment="主键ID")
  125. customer_id = Column(String(64), nullable=False, comment="客户ID")
  126. customer_name = Column(String(200), nullable=True, comment="客户名称")
  127. stop_type = Column(String(20), nullable=False, comment="load-装货 delivery-送货")
  128. address = Column(String(500), nullable=True, comment="地址")
  129. lng = Column(DECIMAL(10, 6), nullable=True, comment="经度")
  130. lat = Column(DECIMAL(10, 6), nullable=True, comment="纬度")
  131. contact = Column(String(200), nullable=True, comment="联系方式")
  132. notes = Column(String(500), nullable=True, comment="注意事项")
  133. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  134. order_num = Column(Integer, nullable=True, comment="排序号")
  135. remark = Column(String(512), nullable=True, comment="备注")
  136. create_by = Column(String(64), nullable=True, comment="创建人id")
  137. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  138. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  139. update_by = Column(String(64), nullable=True, comment="更新人id")
  140. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  141. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  142. class PlCert(Base):
  143. """证书表 pl_cert"""
  144. __tablename__ = "pl_cert"
  145. id = Column(String(64), primary_key=True, comment="主键ID")
  146. owner_type = Column(String(20), nullable=False, comment="归属类型 vehicle-车辆 personnel-人员")
  147. owner_id = Column(String(64), nullable=False, comment="归属主体ID")
  148. vehicle_part = Column(String(20), nullable=True, comment="车辆部位 head-主车 trailer-挂车,人员证书为空")
  149. cert_name = Column(String(100), nullable=False, comment="证书名称")
  150. cert_no = Column(String(64), nullable=True, comment="证号")
  151. expire_date = Column(Date, nullable=True, comment="有效期")
  152. remind_days = Column(Integer, nullable=False, default=30, comment="提前提醒天数")
  153. attachment_urls = Column(String(2000), nullable=True, comment="附件URL(逗号分隔)")
  154. status = Column(String(20), nullable=False, default="valid", comment="状态 valid-有效 expired-已过期 revoked-已作废")
  155. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  156. order_num = Column(Integer, nullable=True, comment="排序号")
  157. remark = Column(String(512), nullable=True, comment="备注")
  158. create_by = Column(String(64), nullable=True, comment="创建人id")
  159. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  160. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  161. update_by = Column(String(64), nullable=True, comment="更新人id")
  162. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  163. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  164. class PlDriver(Base):
  165. """司机表 pl_driver(兼容旧表,迁移后逐步废弃)"""
  166. __tablename__ = "pl_driver"
  167. id = Column(String(64), primary_key=True, comment="主键ID")
  168. driver_name = Column(String(100), nullable=False, comment="姓名")
  169. phone_no = Column(String(32), nullable=False, comment="手机号")
  170. id_card_no = Column(String(32), nullable=True, comment="身份证号")
  171. driving_license_no = Column(String(32), nullable=True, comment="驾驶证号")
  172. driving_license_expire = Column(Date, nullable=True, comment="驾驶证有效期")
  173. vehicle_license_no = Column(String(32), nullable=True, comment="行驶证号")
  174. vehicle_license_expire = Column(Date, nullable=True, comment="行驶证有效期")
  175. hazmat_cert_no = Column(String(32), nullable=True, comment="危化品证号")
  176. hazmat_cert_expire = Column(Date, nullable=True, comment="危化品证有效期")
  177. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  178. order_num = Column(Integer, nullable=True, comment="排序号")
  179. remark = Column(String(512), nullable=True, comment="备注")
  180. create_by = Column(String(64), nullable=True, comment="创建人id")
  181. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  182. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  183. update_by = Column(String(64), nullable=True, comment="更新人id")
  184. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  185. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  186. class PlVehiclePersonnel(Base):
  187. """车辆-人员关联表 pl_vehicle_personnel"""
  188. __tablename__ = "pl_vehicle_personnel"
  189. id = Column(String(64), primary_key=True, comment="主键ID")
  190. vehicle_id = Column(String(64), nullable=False, comment="车辆ID")
  191. personnel_id = Column(String(64), nullable=False, comment="人员ID")
  192. role = Column(String(20), nullable=False, default="driver", comment="角色 driver-司机 escort-押运员")
  193. is_default = Column(SmallInteger, nullable=False, default=0, comment="是否默认司机 0-否 1-是")
  194. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  195. order_num = Column(Integer, nullable=True, comment="排序号")
  196. remark = Column(String(512), nullable=True, comment="关联备注")
  197. create_by = Column(String(64), nullable=True, comment="创建人id")
  198. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  199. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  200. update_by = Column(String(64), nullable=True, comment="更新人id")
  201. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  202. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  203. class PlVehicleDriver(Base):
  204. """车辆-司机关联表 pl_vehicle_driver(兼容旧表)"""
  205. __tablename__ = "pl_vehicle_driver"
  206. id = Column(String(64), primary_key=True, comment="主键ID")
  207. vehicle_id = Column(String(64), nullable=False, comment="车辆ID")
  208. driver_id = Column(String(64), nullable=False, comment="司机ID")
  209. is_default = Column(SmallInteger, nullable=False, default=0, comment="是否默认 0-否 1-是")
  210. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  211. order_num = Column(Integer, nullable=True, comment="排序号")
  212. remark = Column(String(512), nullable=True, comment="备注")
  213. create_by = Column(String(64), nullable=True, comment="创建人id")
  214. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  215. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  216. update_by = Column(String(64), nullable=True, comment="更新人id")
  217. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  218. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  219. # =============================================================================
  220. # 2. 计划管理:计划主表、产品明细、变更记录
  221. # =============================================================================
  222. class PlPlan(Base):
  223. """计划主表 pl_plan"""
  224. __tablename__ = "pl_plan"
  225. id = Column(String(64), primary_key=True, comment="主键ID")
  226. # 编号信息
  227. plan_no = Column(String(32), nullable=False, unique=True, comment="计划订单编号 POYYYYMMDD###")
  228. create_date = Column(Date, nullable=False, comment="创建日期")
  229. plan_date = Column(Date, nullable=True, comment="计划日期")
  230. # 基本信息
  231. belongs_company = Column(String(20), nullable=False, comment="归属公司 shanxia-安庆山峡 yundong-安徽云栋")
  232. plan_type = Column(String(20), nullable=False, comment="单据类型 direct-直销单 inbound-入库单 outbound-出库单")
  233. follow_status = Column(
  234. String(30),
  235. nullable=False,
  236. default="pending_arrange",
  237. comment="跟进状态 wait_notice-等通知 pending_arrange-待安排 arranged-已安排 completed-已完成 cancelled-已取消",
  238. )
  239. transport_status = Column(String(20), nullable=False, default="pending", comment="运输安排状态 pending-待安排 arranged-已安排")
  240. archive_status = Column(String(20), nullable=False, default="unarchived", comment="归档状态 unarchived-未归档 draft-已暂存 archived-已归档")
  241. complete_status = Column(String(10), nullable=False, default="no", comment="完成状态 yes-是 no-否")
  242. # 合同关联
  243. contract_id = Column(String(64), nullable=True, comment="CRM合同ID")
  244. contract_no = Column(String(50), nullable=True, comment="合同编号")
  245. # 供应商与目的地
  246. supplier_id = Column(String(64), nullable=True, comment="供应商ID")
  247. supplier_name = Column(String(200), nullable=True, comment="供应商名称")
  248. destination_id = Column(String(64), nullable=True, comment="目的地ID")
  249. destination_name = Column(String(200), nullable=True, comment="目的地名称")
  250. # 客户信息(冗余自合同)
  251. customer_id = Column(String(64), nullable=True, comment="客户ID")
  252. customer_name = Column(String(200), nullable=True, comment="客户名称")
  253. contact_name = Column(String(100), nullable=True, comment="联系人")
  254. contact_phone = Column(String(32), nullable=True, comment="联系电话")
  255. party_a = Column(String(200), nullable=True, comment="甲方")
  256. party_b = Column(String(200), nullable=True, comment="乙方")
  257. # 合同有效期
  258. contract_start_date = Column(Date, nullable=True, comment="合同开始日期")
  259. contract_end_date = Column(Date, nullable=True, comment="合同结束日期")
  260. # 送货与结算
  261. delivery_method = Column(String(20), nullable=True, comment="送货方式 self_pick-山峡自提 one_ticket-一票制 customer_pick-客户自提")
  262. settlement_method = Column(String(50), nullable=True, comment="结算方式")
  263. # 运输信息
  264. has_freight = Column(SmallInteger, nullable=False, default=0, comment="是否有运输费用 0-否 1-是")
  265. pickup_address = Column(String(500), nullable=True, comment="取货地址")
  266. pickup_lng = Column(DECIMAL(10, 6), nullable=True, comment="取货经度")
  267. pickup_lat = Column(DECIMAL(10, 6), nullable=True, comment="取货纬度")
  268. pickup_time = Column(DateTime, nullable=True, comment="取货时间")
  269. pickup_contact = Column(String(200), nullable=True, comment="取货联系方式")
  270. pickup_notes = Column(String(500), nullable=True, comment="取货注意事项")
  271. destination_address = Column(String(500), nullable=True, comment="目的地地址")
  272. destination_lng = Column(DECIMAL(10, 6), nullable=True, comment="送货经度")
  273. destination_lat = Column(DECIMAL(10, 6), nullable=True, comment="送货纬度")
  274. delivery_time = Column(DateTime, nullable=True, comment="送达时间")
  275. delivery_contact = Column(String(200), nullable=True, comment="送货联系方式")
  276. destination_notes = Column(String(500), nullable=True, comment="目的地注意事项")
  277. transport_id = Column(String(64), nullable=True, comment="运输ID")
  278. transport_no = Column(String(32), nullable=True, comment="运输编号")
  279. vehicle_id = Column(String(64), nullable=True, comment="车辆ID")
  280. license_plate = Column(String(20), nullable=True, comment="车牌号")
  281. trailer_no = Column(String(20), nullable=True, comment="挂车号(安排运输时快照)")
  282. driver_id = Column(String(64), nullable=True, comment="司机ID")
  283. driver_name = Column(String(100), nullable=True, comment="司机姓名")
  284. personnel_summary = Column(String(500), nullable=True, comment="关联人员摘要(安排运输时快照)")
  285. resource_snapshot = Column(Text, nullable=True, comment="车辆/人员/证件整包快照 JSON")
  286. # 金额汇总
  287. total_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="计划总金额")
  288. freight_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="运费合计")
  289. freight_remark = Column(String(512), nullable=True, comment="运费备注")
  290. # 通知信息
  291. notify_message = Column(Text, nullable=True, comment="通知信息(标准模板)")
  292. slip_template_content = Column(Text, nullable=True, comment="入库单打印模板内容(富文本HTML)")
  293. delivery_slip_template_content = Column(Text, nullable=True, comment="送(提)货单打印模板内容(富文本HTML)")
  294. subpack_slip_template_content = Column(Text, nullable=True, comment="分装单打印模板内容(富文本HTML)")
  295. subpack_slip_no = Column(String(32), nullable=True, comment="分装单号 NO:SXFZYYYYMMDD-序号")
  296. # 跟进人
  297. follow_user_id = Column(String(64), nullable=True, comment="跟进人ID")
  298. follow_user_name = Column(String(100), nullable=True, comment="跟进人姓名")
  299. # 危化品证书齐备(人工确认)
  300. hazard_cert_ready = Column(SmallInteger, nullable=False, default=0, comment="危化品证书是否已人工确认齐备 0-否 1-是")
  301. hazard_cert_ready_by = Column(String(64), nullable=True, comment="危化品证书确认人")
  302. hazard_cert_ready_time = Column(DateTime, nullable=True, comment="危化品证书确认时间")
  303. erp_entered = Column(SmallInteger, nullable=False, default=0, comment="是否已录入ERP 0-否 1-是")
  304. # 公共字段
  305. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  306. order_num = Column(Integer, nullable=True, comment="排序号")
  307. remark = Column(String(512), nullable=True, comment="备注")
  308. create_by = Column(String(64), nullable=True, comment="创建人id")
  309. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  310. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  311. update_by = Column(String(64), nullable=True, comment="更新人id")
  312. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  313. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  314. class PlPlanContract(Base):
  315. """运输计划-合同关联(分侧多选) pl_plan_contract"""
  316. __tablename__ = "pl_plan_contract"
  317. id = Column(String(64), primary_key=True, comment="主键ID")
  318. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  319. side = Column(String(20), nullable=False, comment="supplier-供方 demander-需方 load-装货 delivery-送货")
  320. stop_id = Column(String(64), nullable=True, comment="停靠段ID(装货段或送货段)")
  321. contract_id = Column(String(64), nullable=False, comment="CRM合同ID")
  322. contract_no = Column(String(50), nullable=True, comment="合同编号快照")
  323. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  324. order_num = Column(Integer, nullable=True, comment="排序号")
  325. remark = Column(String(512), nullable=True, comment="备注")
  326. create_by = Column(String(64), nullable=True, comment="创建人id")
  327. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  328. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  329. update_by = Column(String(64), nullable=True, comment="更新人id")
  330. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  331. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  332. class PlPlanProduct(Base):
  333. """计划产品明细表 pl_plan_product"""
  334. __tablename__ = "pl_plan_product"
  335. id = Column(String(64), primary_key=True, comment="主键ID")
  336. plan_id = Column(String(64), nullable=False, comment="计划ID")
  337. # 产品信息
  338. product_id = Column(String(64), nullable=False, comment="产品ID")
  339. product_no = Column(String(50), nullable=False, comment="产品编号")
  340. product_name = Column(String(200), nullable=False, comment="产品名称")
  341. brand_mode = Column(String(20), nullable=True, comment="required/any")
  342. brand_id = Column(String(64), nullable=True, comment="指定品牌ID")
  343. brand_name = Column(String(100), nullable=True, comment="品牌名快照")
  344. model = Column(String(100), nullable=True, comment="规格型号")
  345. unit = Column(String(20), nullable=False, default="吨", comment="单位")
  346. category_name = Column(String(200), nullable=True, comment="产品分类")
  347. package_spec = Column(String(200), nullable=True, comment="包装规格")
  348. delivery_method = Column(String(50), nullable=True, comment="送货方式")
  349. quantity = Column(DECIMAL(15, 3), nullable=True, comment="合同数量")
  350. actual_qty = Column(DECIMAL(15, 3), nullable=True, comment="实际数量")
  351. tax_price = Column(DECIMAL(15, 4), nullable=True, comment="含税单价")
  352. tax_amount = Column(DECIMAL(15, 2), nullable=True, comment="税费")
  353. tax_subtotal = Column(DECIMAL(15, 2), nullable=True, comment="含税总价")
  354. # 产品属性(冗余自产品主数据)
  355. is_explosive = Column(SmallInteger, nullable=False, default=0, comment="是否易制爆 0-否 1-是")
  356. is_toxic = Column(SmallInteger, nullable=False, default=0, comment="是否易制毒 0-否 1-是")
  357. # 危化品证书(按 is_toxic / is_explosive 决定所需种类)
  358. purchase_cert_url = Column(String(2000), nullable=True, comment="购买证URL,逗号分隔")
  359. transport_cert_url = Column(String(2000), nullable=True, comment="运输证URL,逗号分隔")
  360. legal_use_cert_url = Column(String(2000), nullable=True, comment="合法使用证明URL,逗号分隔")
  361. # 入库信息
  362. inbound_estimate_qty = Column(DECIMAL(15, 3), nullable=True, comment="入库预估数")
  363. inbound_qty = Column(DECIMAL(15, 3), nullable=True, comment="入库数")
  364. inbound_price = Column(DECIMAL(15, 4), nullable=True, comment="入库价")
  365. inbound_amount = Column(DECIMAL(15, 2), nullable=True, comment="入库金额")
  366. # 出库信息
  367. outbound_estimate_qty = Column(DECIMAL(15, 3), nullable=True, comment="出库预估数")
  368. outbound_qty = Column(DECIMAL(15, 3), nullable=True, comment="出库数")
  369. outbound_price = Column(DECIMAL(15, 4), nullable=True, comment="出库单价")
  370. outbound_amount = Column(DECIMAL(15, 2), nullable=True, comment="出库金额")
  371. # 公共字段
  372. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  373. order_num = Column(Integer, nullable=True, comment="排序号")
  374. remark = Column(String(512), nullable=True, comment="备注")
  375. create_by = Column(String(64), nullable=True, comment="创建人id")
  376. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  377. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  378. update_by = Column(String(64), nullable=True, comment="更新人id")
  379. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  380. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  381. class PlPlanProductBrandQty(Base):
  382. """计划产品归档品牌数量 pl_plan_product_brand_qty
  383. stop_product_id 为空:计划产品级汇总;非空:装货/送货段产品行上的填写值。
  384. """
  385. __tablename__ = "pl_plan_product_brand_qty"
  386. id = Column(String(64), primary_key=True, comment="主键ID")
  387. plan_id = Column(String(64), nullable=False, comment="计划ID")
  388. plan_product_id = Column(String(64), nullable=False, comment="计划产品明细ID")
  389. stop_type = Column(String(20), nullable=True, comment="load/delivery,空=计划级汇总")
  390. stop_product_id = Column(String(64), nullable=True, comment="段产品行ID,空=计划级汇总")
  391. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,空串=无品牌键")
  392. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  393. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌归档实际数量")
  394. unit_price = Column(DECIMAL(15, 4), nullable=True, comment="本品牌归档单价")
  395. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  396. order_num = Column(Integer, nullable=True, comment="排序号")
  397. remark = Column(String(512), nullable=True, comment="备注")
  398. create_by = Column(String(64), nullable=True, comment="创建人id")
  399. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  400. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  401. update_by = Column(String(64), nullable=True, comment="更新人id")
  402. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  403. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  404. class PlPlanChange(Base):
  405. """计划变更记录表 pl_plan_change"""
  406. __tablename__ = "pl_plan_change"
  407. id = Column(String(64), primary_key=True, comment="主键ID")
  408. plan_id = Column(String(64), nullable=False, comment="计划ID")
  409. change_type = Column(String(30), nullable=False, comment="变更类型")
  410. change_content = Column(Text, nullable=True, comment="变更内容")
  411. change_user_id = Column(String(64), nullable=True, comment="变更人ID")
  412. change_user_name = Column(String(100), nullable=True, comment="变更人姓名")
  413. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  414. order_num = Column(Integer, nullable=True, comment="排序号")
  415. remark = Column(String(512), nullable=True, comment="备注")
  416. create_by = Column(String(64), nullable=True, comment="创建人id")
  417. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  418. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  419. update_by = Column(String(64), nullable=True, comment="更新人id")
  420. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  421. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  422. class PlPlanLoad(Base):
  423. """运输计划-装货段 pl_plan_load(plan 1:1)"""
  424. __tablename__ = "pl_plan_load"
  425. id = Column(String(64), primary_key=True, comment="主键ID")
  426. plan_id = Column(String(64), nullable=False, comment="计划ID")
  427. customer_id = Column(String(64), nullable=True, comment="装货客户ID")
  428. customer_name = Column(String(200), nullable=True, comment="装货客户名称")
  429. address = Column(String(500), nullable=True, comment="装货地址")
  430. lng = Column(DECIMAL(10, 6), nullable=True, comment="经度")
  431. lat = Column(DECIMAL(10, 6), nullable=True, comment="纬度")
  432. load_time = Column(DateTime, nullable=True, comment="装货时间")
  433. contact = Column(String(200), nullable=True, comment="联系方式")
  434. notes = Column(String(500), nullable=True, comment="注意事项")
  435. generate_dibang = Column(SmallInteger, nullable=False, default=0, comment="是否生成地磅单 0-否 1-是")
  436. dibang_direction = Column(String(20), nullable=True, comment="地磅方向 outbound-出库 inbound-入库 none-无")
  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 PlPlanLoadProduct(Base):
  447. """运输计划-装货段产品明细 pl_plan_load_product"""
  448. __tablename__ = "pl_plan_load_product"
  449. id = Column(String(64), primary_key=True, comment="主键ID")
  450. load_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. product_id = Column(String(64), nullable=False, comment="产品ID")
  454. product_no = Column(String(50), nullable=False, comment="产品编号")
  455. product_name = Column(String(200), nullable=False, comment="产品名称")
  456. model = Column(String(100), nullable=True, comment="规格型号")
  457. unit = Column(String(20), nullable=False, default="吨", comment="单位")
  458. package_spec = Column(String(200), nullable=True, comment="包装规格")
  459. delivery_method = Column(String(50), nullable=True, comment="送货方式")
  460. plan_qty = Column(DECIMAL(15, 3), nullable=True, comment="本段计划数量")
  461. inbound_qty = Column(DECIMAL(15, 3), nullable=True, comment="入库数量(归档)")
  462. inbound_price = Column(DECIMAL(15, 4), nullable=True, comment="入库单价(归档)")
  463. inbound_amount = Column(DECIMAL(15, 2), nullable=True, comment="入库金额(归档)")
  464. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  465. order_num = Column(Integer, nullable=True, comment="排序号")
  466. remark = Column(String(512), nullable=True, comment="备注")
  467. create_by = Column(String(64), nullable=True, comment="创建人id")
  468. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  469. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  470. update_by = Column(String(64), nullable=True, comment="更新人id")
  471. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  472. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  473. class PlPlanDelivery(Base):
  474. """运输计划-送货段 pl_plan_delivery(plan 1:N)"""
  475. __tablename__ = "pl_plan_delivery"
  476. id = Column(String(64), primary_key=True, comment="主键ID")
  477. plan_id = Column(String(64), nullable=False, comment="计划ID")
  478. seq = Column(Integer, nullable=False, default=1, comment="顺序号(打印、链接展示)")
  479. customer_id = Column(String(64), nullable=True, comment="送货客户ID")
  480. customer_name = Column(String(200), nullable=True, comment="送货客户名称")
  481. address = Column(String(500), nullable=True, comment="送货地址")
  482. lng = Column(DECIMAL(10, 6), nullable=True, comment="经度")
  483. lat = Column(DECIMAL(10, 6), nullable=True, comment="纬度")
  484. delivery_time = Column(DateTime, nullable=True, comment="送货时间")
  485. contact = Column(String(200), nullable=True, comment="联系方式")
  486. notes = Column(String(500), nullable=True, comment="注意事项")
  487. generate_dibang = Column(SmallInteger, nullable=False, default=0, comment="是否生成地磅单 0-否 1-是")
  488. dibang_direction = Column(String(20), nullable=True, comment="地磅方向 outbound-出库 inbound-入库 none-无")
  489. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  490. order_num = Column(Integer, nullable=True, comment="排序号")
  491. remark = Column(String(512), nullable=True, comment="备注")
  492. create_by = Column(String(64), nullable=True, comment="创建人id")
  493. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  494. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  495. update_by = Column(String(64), nullable=True, comment="更新人id")
  496. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  497. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  498. class PlPlanDeliveryProduct(Base):
  499. """运输计划-送货段产品明细 pl_plan_delivery_product"""
  500. __tablename__ = "pl_plan_delivery_product"
  501. id = Column(String(64), primary_key=True, comment="主键ID")
  502. delivery_id = Column(String(64), nullable=False, comment="送货段ID")
  503. plan_id = Column(String(64), nullable=False, comment="计划ID")
  504. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  505. product_id = Column(String(64), nullable=False, comment="产品ID")
  506. product_no = Column(String(50), nullable=False, comment="产品编号")
  507. product_name = Column(String(200), nullable=False, comment="产品名称")
  508. model = Column(String(100), nullable=True, comment="规格型号")
  509. unit = Column(String(20), nullable=False, default="吨", comment="单位")
  510. package_spec = Column(String(200), nullable=True, comment="包装规格")
  511. delivery_method = Column(String(50), nullable=True, comment="送货方式")
  512. plan_qty = Column(DECIMAL(15, 3), nullable=True, comment="本段计划数量")
  513. outbound_qty = Column(DECIMAL(15, 3), nullable=True, comment="出库数量(归档)")
  514. outbound_price = Column(DECIMAL(15, 4), nullable=True, comment="出库单价(归档)")
  515. outbound_amount = Column(DECIMAL(15, 2), nullable=True, comment="出库金额(归档)")
  516. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  517. order_num = Column(Integer, nullable=True, comment="排序号")
  518. remark = Column(String(512), nullable=True, comment="备注")
  519. create_by = Column(String(64), nullable=True, comment="创建人id")
  520. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  521. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  522. update_by = Column(String(64), nullable=True, comment="更新人id")
  523. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  524. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  525. # =============================================================================
  526. # 3. 运输管理:运输表、审批记录
  527. # =============================================================================
  528. class PlTransport(Base):
  529. """运输表 pl_transport"""
  530. __tablename__ = "pl_transport"
  531. id = Column(String(64), primary_key=True, comment="主键ID")
  532. transport_no = Column(String(32), nullable=False, unique=True, comment="运输编号 SXYS######")
  533. # 车辆与司机
  534. vehicle_id = Column(String(64), nullable=True, comment="车辆ID")
  535. license_plate = Column(String(20), nullable=True, comment="车牌号")
  536. trailer_no = Column(String(20), nullable=True, comment="挂车号(安排运输时快照)")
  537. driver_id = Column(String(64), nullable=True, comment="司机ID")
  538. driver_name = Column(String(100), nullable=True, comment="司机姓名")
  539. driver_phone = Column(String(32), nullable=True, comment="司机电话")
  540. resource_snapshot = Column(Text, nullable=True, comment="车辆/人员/证件整包快照 JSON")
  541. # 承运商
  542. carrier_id = Column(String(64), nullable=True, comment="承运商ID")
  543. carrier_name = Column(String(200), nullable=True, comment="承运商名称")
  544. # 运输信息
  545. transport_medium = Column(String(100), nullable=True, comment="运输介质")
  546. start_point = Column(String(200), nullable=True, comment="运输起点")
  547. end_point = Column(String(200), nullable=True, comment="运输终点")
  548. distance_km = Column(DECIMAL(10, 2), nullable=True, comment="运输公里数")
  549. unit = Column(String(20), nullable=True, comment="计量单位 吨/趟")
  550. transport_qty = Column(DECIMAL(15, 3), nullable=True, comment="运输量(按重量计费基数)")
  551. # 运费
  552. freight_price = Column(DECIMAL(15, 4), nullable=True, comment="运输单价")
  553. freight_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="运输费用")
  554. freight_type = Column(String(20), nullable=False, default="by_weight", comment="运费计算方式 by_weight-按重量 by_trip-按趟次")
  555. has_invoice = Column(SmallInteger, nullable=False, default=0, comment="是否开票 0-否 1-是")
  556. # 二维码
  557. qr_code = Column(String(500), nullable=True, comment="二维码内容")
  558. qr_expire_date = Column(Date, nullable=True, comment="二维码有效期")
  559. driver_access_token = Column(String(64), nullable=True, comment="司机免登录访问令牌")
  560. site_access_token = Column(String(64), nullable=True, comment="现场免登录访问令牌")
  561. # 运输状态
  562. transport_status = Column(String(20), nullable=False, default="draft", comment="运输状态 draft-草稿 pending-待执行 executing-执行中 completed-已完成 cancelled-已取消")
  563. approval_status = Column(String(20), nullable=False, default="none", comment="审批状态 none-无需 pending-审批中 approved-已通过 rejected-已拒绝")
  564. # 司机回传信息
  565. feedback_time = Column(DateTime, nullable=True, comment="回传时间")
  566. feedback_qty = Column(DECIMAL(15, 3), nullable=True, comment="回传数量")
  567. feedback_images = Column(Text, nullable=True, comment="回传图片URLs(JSON数组)")
  568. feedback_remark = Column(String(500), nullable=True, comment="回传备注")
  569. # 公共字段
  570. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  571. order_num = Column(Integer, nullable=True, comment="排序号")
  572. remark = Column(String(512), nullable=True, comment="备注")
  573. create_by = Column(String(64), nullable=True, comment="创建人id")
  574. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  575. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  576. update_by = Column(String(64), nullable=True, comment="更新人id")
  577. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  578. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  579. class PlTransportProductFeedback(Base):
  580. """运输单按产品回传 pl_transport_product_feedback"""
  581. __tablename__ = "pl_transport_product_feedback"
  582. id = Column(String(64), primary_key=True, comment="主键ID")
  583. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  584. plan_id = Column(String(64), nullable=False, comment="计划ID")
  585. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  586. actual_qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="该产品回传总量")
  587. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  588. order_num = Column(Integer, nullable=True, comment="排序号")
  589. remark = Column(String(512), nullable=True, comment="备注")
  590. create_by = Column(String(64), nullable=True, comment="创建人id")
  591. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  592. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  593. update_by = Column(String(64), nullable=True, comment="更新人id")
  594. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  595. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  596. class PlTransportProductBrandQty(Base):
  597. """运输单产品回传品牌数量 pl_transport_product_brand_qty"""
  598. __tablename__ = "pl_transport_product_brand_qty"
  599. id = Column(String(64), primary_key=True, comment="主键ID")
  600. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  601. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  602. feedback_id = Column(String(64), nullable=True, comment="产品回传行ID")
  603. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID")
  604. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  605. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌数量")
  606. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  607. order_num = Column(Integer, nullable=True, comment="排序号")
  608. remark = Column(String(512), nullable=True, comment="备注")
  609. create_by = Column(String(64), nullable=True, comment="创建人id")
  610. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  611. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  612. update_by = Column(String(64), nullable=True, comment="更新人id")
  613. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  614. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  615. class PlTransportDbLink(Base):
  616. """运输-地磅出入库关联 pl_transport_db_link"""
  617. __tablename__ = "pl_transport_db_link"
  618. id = Column(String(64), primary_key=True, comment="主键ID")
  619. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  620. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  621. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  622. stop_type = Column(String(20), nullable=True, comment="停靠段类型 load-装货 delivery-送货")
  623. stop_id = Column(String(64), nullable=True, comment="停靠段ID")
  624. db_purchase_plan_id = Column(String(64), nullable=False, comment="地磅计划ID")
  625. db_inventory_id = Column(String(64), nullable=False, comment="出入库单ID")
  626. contributed_qty = Column(DECIMAL(15, 3), nullable=True, comment="本次联动贡献量(吨)")
  627. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  628. order_num = Column(Integer, nullable=True, comment="排序号")
  629. remark = Column(String(512), nullable=True, comment="备注")
  630. create_by = Column(String(64), nullable=True, comment="创建人id")
  631. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  632. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  633. update_by = Column(String(64), nullable=True, comment="更新人id")
  634. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  635. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  636. class PlPlanTransport(Base):
  637. """计划-运输关联表 pl_plan_transport"""
  638. __tablename__ = "pl_plan_transport"
  639. id = Column(String(64), primary_key=True, comment="主键ID")
  640. plan_id = Column(String(64), nullable=False, comment="计划ID")
  641. transport_id = Column(String(64), nullable=False, comment="运输ID")
  642. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  643. order_num = Column(Integer, nullable=True, comment="排序号")
  644. remark = Column(String(512), nullable=True, comment="备注")
  645. create_by = Column(String(64), nullable=True, comment="创建人id")
  646. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  647. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  648. update_by = Column(String(64), nullable=True, comment="更新人id")
  649. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  650. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  651. class PlTransportDriverStopFeedback(Base):
  652. """运输单-司机按段附件回传 pl_transport_driver_stop_feedback"""
  653. __tablename__ = "pl_transport_driver_stop_feedback"
  654. id = Column(String(64), primary_key=True, comment="主键ID")
  655. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  656. plan_id = Column(String(64), nullable=False, comment="计划ID")
  657. stop_type = Column(String(20), nullable=False, comment="停靠段类型 load-装货 delivery-送货")
  658. stop_id = Column(String(64), nullable=False, comment="停靠段ID")
  659. attachment_urls = Column(Text, nullable=True, comment="附件URLs(JSON数组)")
  660. product_feedbacks = Column(
  661. Text,
  662. nullable=True,
  663. comment="段产品回传 JSON:[{stopProductId,actualQty,brandQtys}]",
  664. )
  665. remark = Column(String(500), nullable=True, comment="备注")
  666. feedback_time = Column(DateTime, nullable=True, comment="回传时间")
  667. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  668. order_num = Column(Integer, nullable=True, comment="排序号")
  669. create_by = Column(String(64), nullable=True, comment="创建人id")
  670. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  671. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  672. update_by = Column(String(64), nullable=True, comment="更新人id")
  673. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  674. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  675. class PlTransportSiteStopFeedback(Base):
  676. """运输单-现场按段回传 pl_transport_site_stop_feedback"""
  677. __tablename__ = "pl_transport_site_stop_feedback"
  678. id = Column(String(64), primary_key=True, comment="主键ID")
  679. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  680. plan_id = Column(String(64), nullable=False, comment="计划ID")
  681. stop_type = Column(String(20), nullable=False, comment="停靠段类型 load-装货 delivery-送货")
  682. stop_id = Column(String(64), nullable=False, comment="停靠段ID")
  683. business_type = Column(String(20), nullable=False, comment="业务类型:入库/出库")
  684. quantity = Column(DECIMAL(15, 3), nullable=True, comment="现场回传数量")
  685. attachment_urls = Column(Text, nullable=True, comment="附件URLs(JSON数组)")
  686. product_feedbacks = Column(
  687. Text,
  688. nullable=True,
  689. comment="段产品回传 JSON:[{stopProductId,actualQty,brandQtys}]",
  690. )
  691. remark = Column(String(500), nullable=True, comment="备注")
  692. feedback_time = Column(DateTime, nullable=True, comment="回传时间")
  693. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  694. order_num = Column(Integer, nullable=True, comment="排序号")
  695. create_by = Column(String(64), nullable=True, comment="创建人id")
  696. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  697. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  698. update_by = Column(String(64), nullable=True, comment="更新人id")
  699. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  700. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  701. class PlTransportSiteLink(Base):
  702. """运输计划现场链接 pl_transport_site_link(与地磅出入库单解耦)"""
  703. __tablename__ = "pl_transport_site_link"
  704. id = Column(String(64), primary_key=True, comment="主键ID")
  705. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  706. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  707. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  708. site_access_token = Column(String(64), nullable=False, comment="现场人员免登录访问令牌")
  709. business_type = Column(String(20), nullable=False, comment="业务类型:入库/出库")
  710. partner_company = Column(String(200), nullable=True, comment="往来单位")
  711. product_id = Column(String(64), nullable=True, comment="CRM产品ID")
  712. product = Column(String(200), nullable=True, comment="产品名称快照")
  713. specification = Column(String(200), nullable=True, comment="规格快照")
  714. quantity = Column(DECIMAL(15, 3), nullable=True, comment="数量(吨)")
  715. vehicle_no = Column(String(32), nullable=True, comment="车牌号")
  716. plan_no = Column(String(64), nullable=True, comment="运输计划号")
  717. plan_date = Column(Date, nullable=True, comment="计划日期")
  718. site_feedback_remark = Column(String(500), nullable=True, comment="现场回执备注")
  719. site_feedback_images = Column(Text, nullable=True, comment="现场回执附件URLs(JSON数组)")
  720. site_feedback_time = Column(DateTime, nullable=True, comment="现场回执保存时间")
  721. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  722. order_num = Column(Integer, nullable=True, comment="排序号")
  723. remark = Column(String(512), nullable=True, comment="备注")
  724. create_by = Column(String(64), nullable=True, comment="创建人id")
  725. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  726. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  727. update_by = Column(String(64), nullable=True, comment="更新人id")
  728. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  729. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  730. class PlInboundOrder(Base):
  731. """运输计划-入库单 pl_inbound_order"""
  732. __tablename__ = "pl_inbound_order"
  733. id = Column(String(64), primary_key=True, comment="主键ID")
  734. order_no = Column(String(32), nullable=False, comment="入库单号")
  735. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  736. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  737. status = Column(String(20), nullable=False, default="in_progress", comment="in_progress/completed/voided")
  738. partner_company = Column(String(200), nullable=True, comment="往来单位快照")
  739. vehicle_no = Column(String(32), nullable=True, comment="车牌快照")
  740. plan_no = Column(String(64), nullable=True, comment="计划号快照")
  741. plan_date = Column(Date, nullable=True, comment="计划日期快照")
  742. site_access_token = Column(String(64), nullable=False, comment="现场免登录令牌")
  743. site_feedback_remark = Column(String(500), nullable=True, comment="现场备注")
  744. site_feedback_images = Column(Text, nullable=True, comment="现场附件URLs(JSON数组)")
  745. site_feedback_time = Column(DateTime, nullable=True, comment="最近现场提交时间")
  746. site_first_submitted_at = Column(DateTime, nullable=True, comment="首次现场提交时间")
  747. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  748. order_num = Column(Integer, nullable=True, comment="排序号")
  749. remark = Column(String(512), nullable=True, comment="备注")
  750. create_by = Column(String(64), nullable=True, comment="创建人id")
  751. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  752. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  753. update_by = Column(String(64), nullable=True, comment="更新人id")
  754. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  755. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  756. class PlInboundOrderItem(Base):
  757. """运输计划-入库单明细 pl_inbound_order_item"""
  758. __tablename__ = "pl_inbound_order_item"
  759. id = Column(String(64), primary_key=True, comment="主键ID")
  760. order_id = Column(String(64), nullable=False, comment="入库单ID")
  761. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  762. product_id = Column(String(64), nullable=True, comment="CRM产品ID")
  763. product_name = Column(String(200), nullable=True, comment="产品名称快照")
  764. specification = Column(String(200), nullable=True, comment="规格快照")
  765. unit = Column(String(32), nullable=True, comment="单位")
  766. plan_qty = Column(DECIMAL(15, 3), nullable=True, comment="计划数量")
  767. actual_qty = Column(DECIMAL(15, 3), nullable=True, comment="实际数量")
  768. qty_source = Column(String(20), nullable=True, default="plan", comment="plan/dibang/manual")
  769. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  770. order_num = Column(Integer, nullable=True, comment="排序号")
  771. remark = Column(String(512), nullable=True, comment="备注")
  772. create_by = Column(String(64), nullable=True, comment="创建人id")
  773. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  774. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  775. update_by = Column(String(64), nullable=True, comment="更新人id")
  776. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  777. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  778. class PlInboundOrderItemBrandQty(Base):
  779. """入库明细品牌数量 pl_inbound_order_item_brand_qty"""
  780. __tablename__ = "pl_inbound_order_item_brand_qty"
  781. id = Column(String(64), primary_key=True, comment="主键ID")
  782. order_id = Column(String(64), nullable=False, comment="入库单ID")
  783. order_item_id = Column(String(64), nullable=False, comment="入库明细ID")
  784. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  785. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID")
  786. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  787. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌数量")
  788. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  789. order_num = Column(Integer, nullable=True, comment="排序号")
  790. remark = Column(String(512), nullable=True, comment="备注")
  791. create_by = Column(String(64), nullable=True, comment="创建人id")
  792. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  793. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  794. update_by = Column(String(64), nullable=True, comment="更新人id")
  795. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  796. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  797. class PlOutboundOrder(Base):
  798. """运输计划-出库单 pl_outbound_order"""
  799. __tablename__ = "pl_outbound_order"
  800. id = Column(String(64), primary_key=True, comment="主键ID")
  801. order_no = Column(String(32), nullable=False, comment="出库单号")
  802. plan_id = Column(String(64), nullable=False, comment="运输计划ID")
  803. transport_id = Column(String(64), nullable=False, comment="运输单ID")
  804. status = Column(String(20), nullable=False, default="in_progress", comment="in_progress/completed/voided")
  805. partner_company = Column(String(200), nullable=True, comment="往来单位快照")
  806. vehicle_no = Column(String(32), nullable=True, comment="车牌快照")
  807. plan_no = Column(String(64), nullable=True, comment="计划号快照")
  808. plan_date = Column(Date, nullable=True, comment="计划日期快照")
  809. site_access_token = Column(String(64), nullable=False, comment="现场免登录令牌")
  810. site_feedback_remark = Column(String(500), nullable=True, comment="现场备注")
  811. site_feedback_images = Column(Text, nullable=True, comment="现场附件URLs(JSON数组)")
  812. site_feedback_time = Column(DateTime, nullable=True, comment="最近现场提交时间")
  813. site_first_submitted_at = Column(DateTime, nullable=True, comment="首次现场提交时间")
  814. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  815. order_num = Column(Integer, nullable=True, comment="排序号")
  816. remark = Column(String(512), nullable=True, comment="备注")
  817. create_by = Column(String(64), nullable=True, comment="创建人id")
  818. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  819. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  820. update_by = Column(String(64), nullable=True, comment="更新人id")
  821. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  822. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  823. class PlOutboundOrderItem(Base):
  824. """运输计划-出库单明细 pl_outbound_order_item"""
  825. __tablename__ = "pl_outbound_order_item"
  826. id = Column(String(64), primary_key=True, comment="主键ID")
  827. order_id = Column(String(64), nullable=False, comment="出库单ID")
  828. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  829. product_id = Column(String(64), nullable=True, comment="CRM产品ID")
  830. product_name = Column(String(200), nullable=True, comment="产品名称快照")
  831. specification = Column(String(200), nullable=True, comment="规格快照")
  832. unit = Column(String(32), nullable=True, comment="单位")
  833. plan_qty = Column(DECIMAL(15, 3), nullable=True, comment="计划数量")
  834. actual_qty = Column(DECIMAL(15, 3), nullable=True, comment="实际数量")
  835. qty_source = Column(String(20), nullable=True, default="plan", comment="plan/dibang/manual")
  836. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  837. order_num = Column(Integer, nullable=True, comment="排序号")
  838. remark = Column(String(512), nullable=True, comment="备注")
  839. create_by = Column(String(64), nullable=True, comment="创建人id")
  840. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  841. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  842. update_by = Column(String(64), nullable=True, comment="更新人id")
  843. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  844. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  845. class PlOutboundOrderItemBrandQty(Base):
  846. """出库明细品牌数量 pl_outbound_order_item_brand_qty"""
  847. __tablename__ = "pl_outbound_order_item_brand_qty"
  848. id = Column(String(64), primary_key=True, comment="主键ID")
  849. order_id = Column(String(64), nullable=False, comment="出库单ID")
  850. order_item_id = Column(String(64), nullable=False, comment="出库明细ID")
  851. plan_product_id = Column(String(64), nullable=False, comment="计划产品行ID")
  852. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID")
  853. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  854. qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="本品牌数量")
  855. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  856. order_num = Column(Integer, nullable=True, comment="排序号")
  857. remark = Column(String(512), nullable=True, comment="备注")
  858. create_by = Column(String(64), nullable=True, comment="创建人id")
  859. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  860. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  861. update_by = Column(String(64), nullable=True, comment="更新人id")
  862. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  863. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  864. class PlTransportApproval(Base):
  865. """运输审批记录表 pl_transport_approval"""
  866. __tablename__ = "pl_transport_approval"
  867. id = Column(String(64), primary_key=True, comment="主键ID")
  868. transport_id = Column(String(64), nullable=False, comment="运输ID")
  869. approver_id = Column(String(64), nullable=False, comment="审批人ID")
  870. approver_name = Column(String(100), nullable=False, comment="审批人姓名")
  871. approval_order = Column(Integer, nullable=False, comment="审批顺序")
  872. status = Column(String(20), nullable=False, default="pending", comment="审批状态 pending-待审批 approved-已通过 rejected-已拒绝")
  873. comment = Column(String(500), nullable=True, comment="审批意见")
  874. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  875. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  876. order_num = Column(Integer, nullable=True, comment="排序号")
  877. remark = Column(String(512), nullable=True, comment="备注")
  878. create_by = Column(String(64), nullable=True, comment="创建人id")
  879. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  880. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  881. update_by = Column(String(64), nullable=True, comment="更新人id")
  882. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  883. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  884. # =============================================================================
  885. # 4. 运费结算
  886. # =============================================================================
  887. class PlFreightSettlement(Base):
  888. """运费结算表 pl_freight_settlement"""
  889. __tablename__ = "pl_freight_settlement"
  890. id = Column(String(64), primary_key=True, comment="主键ID")
  891. settlement_no = Column(String(32), nullable=False, unique=True, comment="结算单编号")
  892. # 结算金额
  893. total_freight = Column(DECIMAL(15, 2), nullable=False, default=0, comment="运费合计")
  894. invoice_amount = Column(DECIMAL(15, 2), nullable=True, comment="发票金额")
  895. # 发票信息
  896. invoice_no = Column(String(50), nullable=True, comment="发票号")
  897. invoice_date = Column(Date, nullable=True, comment="开票日期")
  898. invoice_attachment_urls = Column(Text, nullable=True, comment="发票附件URLs,逗号分隔")
  899. # 结算状态
  900. settlement_status = Column(String(20), nullable=False, default="pending", comment="结算状态 pending-待提交 submitted-已提交 approved-审核通过 confirmed-已确认")
  901. # 公共字段
  902. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  903. order_num = Column(Integer, nullable=True, comment="排序号")
  904. remark = Column(String(512), nullable=True, comment="备注")
  905. create_by = Column(String(64), nullable=True, comment="创建人id")
  906. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  907. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  908. update_by = Column(String(64), nullable=True, comment="更新人id")
  909. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  910. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  911. class PlFreightSettlementApproval(Base):
  912. """运费结算审批 pl_freight_settlement_approval"""
  913. __tablename__ = "pl_freight_settlement_approval"
  914. id = Column(String(64), primary_key=True, comment="主键ID")
  915. settlement_id = Column(String(64), nullable=False, comment="结算单ID")
  916. step = Column(Integer, nullable=False, default=1, comment="步骤序号")
  917. step_name = Column(String(50), nullable=True, comment="步骤名称")
  918. approver_id = Column(String(64), nullable=False, comment="审批人ID")
  919. approver_name = Column(String(64), nullable=True, comment="审批人姓名")
  920. approval_type = Column(String(20), nullable=False, default="sequential", comment="审批类型")
  921. approval_result = Column(String(20), nullable=False, default="pending", comment="审批结果")
  922. approval_opinion = Column(String(500), nullable=True, comment="审批意见")
  923. approval_time = Column(DateTime, nullable=True, comment="审批时间")
  924. is_current = Column(SmallInteger, nullable=False, default=0, comment="是否当前节点")
  925. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  926. order_num = Column(Integer, nullable=True, comment="排序号")
  927. remark = Column(String(512), nullable=True, comment="备注")
  928. create_by = Column(String(64), nullable=True, comment="创建人id")
  929. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  930. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  931. update_by = Column(String(64), nullable=True, comment="更新人id")
  932. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  933. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  934. class PlFreightSettlementTransport(Base):
  935. """结算单-运输关联表 pl_freight_settlement_transport"""
  936. __tablename__ = "pl_freight_settlement_transport"
  937. id = Column(String(64), primary_key=True, comment="主键ID")
  938. settlement_id = Column(String(64), nullable=False, comment="结算单ID")
  939. transport_id = Column(String(64), nullable=False, comment="运输ID")
  940. freight_amount = Column(DECIMAL(15, 2), nullable=False, comment="运费金额")
  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 PlRemittanceVoucher(Base):
  951. """汇款凭证表 pl_remittance_voucher"""
  952. __tablename__ = "pl_remittance_voucher"
  953. id = Column(String(64), primary_key=True, comment="主键ID")
  954. settlement_id = Column(String(64), nullable=False, comment="结算单ID")
  955. voucher_no = Column(String(32), nullable=True, comment="凭证编号")
  956. remittance_date = Column(Date, nullable=True, comment="汇款日期")
  957. remittance_amount = Column(DECIMAL(15, 2), nullable=True, comment="汇款金额")
  958. voucher_urls = Column(Text, nullable=True, comment="凭证文件URLs(JSON数组)")
  959. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  960. order_num = Column(Integer, nullable=True, comment="排序号")
  961. remark = Column(String(512), nullable=True, comment="备注")
  962. create_by = Column(String(64), nullable=True, comment="创建人id")
  963. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  964. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  965. update_by = Column(String(64), nullable=True, comment="更新人id")
  966. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  967. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  968. # =============================================================================
  969. # 5. 库存管理
  970. # =============================================================================
  971. class PlInventory(Base):
  972. """库存表 pl_inventory"""
  973. __tablename__ = "pl_inventory"
  974. id = Column(String(64), primary_key=True, comment="主键ID")
  975. product_id = Column(String(64), nullable=False, comment="产品ID")
  976. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,无品牌为空串")
  977. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  978. product_no = Column(String(50), nullable=False, comment="产品编号")
  979. product_name = Column(String(200), nullable=False, comment="产品名称")
  980. model = Column(String(100), nullable=True, comment="规格型号")
  981. unit = Column(String(20), nullable=False, default="吨", comment="单位")
  982. # 库存数量与金额
  983. stock_qty = Column(DECIMAL(15, 3), nullable=False, default=0, comment="库存数量")
  984. stock_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="库存金额")
  985. # 预警阈值
  986. low_stock_warning = Column(DECIMAL(15, 3), nullable=True, comment="最低库存预警值")
  987. high_stock_warning = Column(DECIMAL(15, 3), nullable=True, comment="最高库存预警值")
  988. # 公共字段
  989. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  990. order_num = Column(Integer, nullable=True, comment="排序号")
  991. remark = Column(String(512), nullable=True, comment="备注")
  992. create_by = Column(String(64), nullable=True, comment="创建人id")
  993. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  994. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  995. update_by = Column(String(64), nullable=True, comment="更新人id")
  996. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  997. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  998. class PlInventoryTransaction(Base):
  999. """库存流水表 pl_inventory_transaction"""
  1000. __tablename__ = "pl_inventory_transaction"
  1001. id = Column(String(64), primary_key=True, comment="主键ID")
  1002. product_id = Column(String(64), nullable=False, comment="产品ID")
  1003. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,无品牌为空串")
  1004. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  1005. product_name = Column(String(200), nullable=False, comment="产品名称")
  1006. transaction_type = Column(String(20), nullable=False, comment="事务类型 inbound-入库 outbound-出库")
  1007. plan_id = Column(String(64), nullable=True, comment="计划ID")
  1008. plan_no = Column(String(32), nullable=True, comment="计划编号")
  1009. # 数量与价格
  1010. qty = Column(DECIMAL(15, 3), nullable=False, comment="变动数量(正数入库/负数出库)")
  1011. unit_price = Column(DECIMAL(15, 4), nullable=False, comment="单价")
  1012. amount = Column(DECIMAL(15, 2), nullable=False, comment="金额")
  1013. stock_after = Column(DECIMAL(15, 3), nullable=False, comment="变动后库存")
  1014. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1015. order_num = Column(Integer, nullable=True, comment="排序号")
  1016. remark = Column(String(512), nullable=True, comment="备注")
  1017. create_by = Column(String(64), nullable=True, comment="创建人id")
  1018. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1019. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1020. update_by = Column(String(64), nullable=True, comment="更新人id")
  1021. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1022. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1023. class PlInventoryWarning(Base):
  1024. """库存预警表 pl_inventory_warning"""
  1025. __tablename__ = "pl_inventory_warning"
  1026. id = Column(String(64), primary_key=True, comment="主键ID")
  1027. product_id = Column(String(64), nullable=False, comment="产品ID")
  1028. brand_id = Column(String(64), nullable=False, default="", comment="品牌ID,无品牌为空串")
  1029. brand_name = Column(String(100), nullable=True, comment="品牌名称")
  1030. product_name = Column(String(200), nullable=False, comment="产品名称")
  1031. warning_type = Column(String(20), nullable=False, comment="预警类型 low-低于最低 high-高于最高")
  1032. current_qty = Column(DECIMAL(15, 3), nullable=False, comment="当前库存")
  1033. threshold_value = Column(DECIMAL(15, 3), nullable=False, comment="阈值")
  1034. status = Column(String(20), nullable=False, default="pending", comment="状态 pending-待处理 resolved-已处理")
  1035. resolve_time = Column(DateTime, nullable=True, comment="处理时间")
  1036. resolve_remark = Column(String(500), nullable=True, comment="处理备注")
  1037. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1038. order_num = Column(Integer, nullable=True, comment="排序号")
  1039. remark = Column(String(512), nullable=True, comment="备注")
  1040. create_by = Column(String(64), nullable=True, comment="创建人id")
  1041. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1042. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1043. update_by = Column(String(64), nullable=True, comment="更新人id")
  1044. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1045. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1046. class PlDocumentReminder(Base):
  1047. """证件到期提醒表 pl_document_reminder"""
  1048. __tablename__ = "pl_document_reminder"
  1049. id = Column(String(64), primary_key=True, comment="主键ID")
  1050. cert_id = Column(String(64), nullable=True, comment="证书ID")
  1051. owner_type = Column(String(20), nullable=True, comment="归属类型 vehicle/personnel")
  1052. owner_id = Column(String(64), nullable=True, comment="归属主体ID")
  1053. owner_label = Column(String(200), nullable=True, comment="归属展示名(车牌/姓名)")
  1054. driver_id = Column(String(64), nullable=True, comment="司机/人员ID(兼容)")
  1055. driver_name = Column(String(100), nullable=True, comment="司机/人员姓名(兼容)")
  1056. document_type = Column(String(100), nullable=False, comment="证件类型/证书名称")
  1057. document_no = Column(String(50), nullable=True, comment="证件号")
  1058. expire_date = Column(Date, nullable=False, comment="到期日期")
  1059. days_remaining = Column(Integer, nullable=False, comment="剩余天数")
  1060. status = Column(String(20), nullable=False, default="pending", comment="状态 pending-待处理 resolved-已处理")
  1061. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1062. order_num = Column(Integer, nullable=True, comment="排序号")
  1063. remark = Column(String(512), nullable=True, comment="备注")
  1064. create_by = Column(String(64), nullable=True, comment="创建人id")
  1065. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1066. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1067. update_by = Column(String(64), nullable=True, comment="更新人id")
  1068. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1069. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1070. class PlVehicleRechargeApply(Base):
  1071. """车辆ETC/加油充值申请 pl_vehicle_recharge_apply"""
  1072. __tablename__ = "pl_vehicle_recharge_apply"
  1073. id = Column(String(64), primary_key=True, comment="主键ID")
  1074. apply_no = Column(String(32), nullable=False, unique=True, comment="申请单号")
  1075. license_plate = Column(String(20), nullable=False, comment="车牌号")
  1076. recharge_type = Column(String(20), nullable=False, comment="充值类型 etc/fuel")
  1077. apply_date = Column(Date, nullable=False, comment="申请日期")
  1078. odometer_km = Column(DECIMAL(10, 1), nullable=True, comment="期初公里数")
  1079. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1080. applicant_id = Column(String(64), nullable=False, comment="申请人ID")
  1081. status = Column(String(20), nullable=False, default="pending", comment="申请状态")
  1082. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1083. order_num = Column(Integer, nullable=True, comment="排序号")
  1084. remark = Column(String(512), nullable=True, comment="备注")
  1085. create_by = Column(String(64), nullable=True, comment="创建人id")
  1086. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1087. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1088. update_by = Column(String(64), nullable=True, comment="更新人id")
  1089. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1090. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1091. class PlVehicleMaintenanceApply(Base):
  1092. """车辆维保申请 pl_vehicle_maintenance_apply"""
  1093. __tablename__ = "pl_vehicle_maintenance_apply"
  1094. id = Column(String(64), primary_key=True, comment="主键ID")
  1095. apply_no = Column(String(32), nullable=False, unique=True, comment="申请单号")
  1096. license_plate = Column(String(20), nullable=False, comment="车牌号")
  1097. applicant_id = Column(String(64), nullable=False, comment="申请人ID")
  1098. apply_date = Column(Date, nullable=False, comment="申请时间")
  1099. maintenance_type = Column(String(64), nullable=False, comment="维保类型")
  1100. start_date = Column(Date, nullable=False, comment="维保开始时间")
  1101. expected_pickup_date = Column(Date, nullable=True, comment="预计取车时间")
  1102. maintenance_content = Column(String(1000), nullable=True, comment="维保内容")
  1103. shop_address = Column(String(500), nullable=True, comment="维保店铺地址")
  1104. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1105. status = Column(String(20), nullable=False, default="pending", comment="申请状态")
  1106. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1107. order_num = Column(Integer, nullable=True, comment="排序号")
  1108. remark = Column(String(512), nullable=True, comment="备注")
  1109. create_by = Column(String(64), nullable=True, comment="创建人id")
  1110. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1111. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1112. update_by = Column(String(64), nullable=True, comment="更新人id")
  1113. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1114. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1115. class PlVehicleMaintenanceProcess(Base):
  1116. """车辆维保处理登记 pl_vehicle_maintenance_process"""
  1117. __tablename__ = "pl_vehicle_maintenance_process"
  1118. id = Column(String(64), primary_key=True, comment="主键ID")
  1119. process_no = Column(String(32), nullable=False, unique=True, comment="处理单号")
  1120. apply_id = Column(String(64), nullable=True, unique=True, comment="关联申请单ID")
  1121. license_plate = Column(String(20), nullable=True, comment="车牌号冗余")
  1122. amount = Column(DECIMAL(10, 2), nullable=True, comment="金额")
  1123. handler_id = Column(String(64), nullable=False, comment="处理人ID")
  1124. process_date = Column(Date, nullable=False, comment="处理时间")
  1125. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1126. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1127. order_num = Column(Integer, nullable=True, comment="排序号")
  1128. remark = Column(String(512), nullable=True, comment="备注")
  1129. create_by = Column(String(64), nullable=True, comment="创建人id")
  1130. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1131. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1132. update_by = Column(String(64), nullable=True, comment="更新人id")
  1133. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1134. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1135. class PlVehicleUreaApply(Base):
  1136. """车辆尿素申请 pl_vehicle_urea_apply"""
  1137. __tablename__ = "pl_vehicle_urea_apply"
  1138. id = Column(String(64), primary_key=True, comment="主键ID")
  1139. apply_no = Column(String(32), nullable=False, unique=True, comment="申请单号")
  1140. license_plate = Column(String(20), nullable=False, comment="车牌号")
  1141. applicant_id = Column(String(64), nullable=False, comment="申请人ID")
  1142. apply_date = Column(Date, nullable=False, comment="申请时间")
  1143. warehouse_in_date = Column(Date, nullable=False, comment="入库时间")
  1144. unit = Column(String(32), nullable=False, comment="单位")
  1145. quantity = Column(DECIMAL(10, 2), nullable=False, comment="入库数")
  1146. apply_amount = Column(DECIMAL(10, 2), nullable=False, comment="申请金额")
  1147. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1148. status = Column(String(20), nullable=False, default="pending", comment="申请状态")
  1149. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1150. order_num = Column(Integer, nullable=True, comment="排序号")
  1151. remark = Column(String(512), nullable=True, comment="备注")
  1152. create_by = Column(String(64), nullable=True, comment="创建人id")
  1153. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1154. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1155. update_by = Column(String(64), nullable=True, comment="更新人id")
  1156. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1157. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1158. class PlVehicleUreaDisburse(Base):
  1159. """车辆尿素发放登记 pl_vehicle_urea_disburse"""
  1160. __tablename__ = "pl_vehicle_urea_disburse"
  1161. id = Column(String(64), primary_key=True, comment="主键ID")
  1162. disburse_no = Column(String(32), nullable=False, unique=True, comment="发放单号")
  1163. apply_id = Column(String(64), nullable=True, unique=True, comment="关联申请单ID")
  1164. license_plate = Column(String(20), nullable=True, comment="车牌号冗余")
  1165. amount = Column(DECIMAL(10, 2), nullable=False, comment="发放金额")
  1166. handler_id = Column(String(64), nullable=False, comment="处理人ID")
  1167. disburse_date = Column(Date, nullable=False, comment="发放时间")
  1168. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1169. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1170. order_num = Column(Integer, nullable=True, comment="排序号")
  1171. remark = Column(String(512), nullable=True, comment="备注")
  1172. create_by = Column(String(64), nullable=True, comment="创建人id")
  1173. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1174. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1175. update_by = Column(String(64), nullable=True, comment="更新人id")
  1176. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1177. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1178. class PlOcrUsageMonth(Base):
  1179. """阿里云 OCR 月度调用计数 pl_ocr_usage_month(按自然月全局统计)"""
  1180. __tablename__ = "pl_ocr_usage_month"
  1181. id = Column(String(64), primary_key=True, comment="主键ID")
  1182. usage_month = Column(String(7), nullable=False, unique=True, comment="自然月 YYYY-MM")
  1183. used_count = Column(Integer, nullable=False, default=0, comment="当月已调用次数")
  1184. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1185. order_num = Column(Integer, nullable=True, comment="排序号")
  1186. remark = Column(String(512), nullable=True, comment="备注")
  1187. create_by = Column(String(64), nullable=True, comment="创建人id")
  1188. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1189. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1190. update_by = Column(String(64), nullable=True, comment="更新人id")
  1191. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1192. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")
  1193. class PlVehicleRechargeRecord(Base):
  1194. """车辆ETC/加油充值发放登记 pl_vehicle_recharge_record"""
  1195. __tablename__ = "pl_vehicle_recharge_record"
  1196. id = Column(String(64), primary_key=True, comment="主键ID")
  1197. recharge_order_no = Column(String(32), nullable=False, unique=True, comment="充值订单号")
  1198. recharge_date = Column(Date, nullable=False, comment="充值日期")
  1199. recharge_type = Column(String(20), nullable=False, comment="充值类型")
  1200. card_no = Column(String(64), nullable=True, comment="卡号")
  1201. gas_station = Column(String(200), nullable=True, comment="加油站/渠道")
  1202. amount = Column(DECIMAL(10, 2), nullable=False, comment="充值金额")
  1203. attachment_urls = Column(String(2000), nullable=True, comment="附件URL")
  1204. apply_id = Column(String(64), nullable=True, unique=True, comment="关联申请单ID")
  1205. license_plate = Column(String(20), nullable=True, comment="车牌号冗余")
  1206. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  1207. order_num = Column(Integer, nullable=True, comment="排序号")
  1208. remark = Column(String(512), nullable=True, comment="备注")
  1209. create_by = Column(String(64), nullable=True, comment="创建人id")
  1210. create_dept_id = Column(String(64), nullable=False, default="", comment="创建人部门ID")
  1211. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  1212. update_by = Column(String(64), nullable=True, comment="更新人id")
  1213. update_time = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  1214. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标记:0-正常 1-已删除")