pl_models.py 75 KB

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