pl_models.py 76 KB

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