# -*- coding: utf-8 -*- """数据模型:用户、供应商、物料、订单、明细、审核记录。""" from datetime import datetime from sqlalchemy import (Boolean, Column, DateTime, Float, ForeignKey, Integer, String, Text, create_engine) from sqlalchemy.orm import declarative_base, relationship, sessionmaker Base = declarative_base() COMPANY_NAME = u"苏州博特维智能科技有限公司" DEFAULT_DELIVERY_PLACE = (u"苏州市工业园区星汉街5号腾飞新苏工业坊B幢5楼05-06单元 " u"胡乃琛 13913172516") # 需方(我方)默认信息:新建单据时自动预置到联系人 / 电话 / 税号 / 税点 DEFAULT_OUR_CONTACT = u"胡乃琛" DEFAULT_OUR_PHONE = u"13913172516" DEFAULT_OUR_TAX_NO = u"91320507MA1WW8D15D" DEFAULT_TAX_RATE = u"13%" DOC_TYPES = { "purchase": u"采购单", "outsourcing": u"委外生产订单", } STATUS_TEXT = { "draft": u"草稿", "pending_review": u"待主管审核", "pending_approval": u"待经理批准", "approved": u"已批准", "rejected": u"已驳回", } ROLE_TEXT = { "admin": u"系统管理员", "maker": u"制单员", "reviewer": u"主管审核", "approver": u"经理批准", } class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) username = Column(String(50), unique=True, nullable=False) password_hash = Column(String(200), nullable=False) name = Column(String(50), nullable=False) role = Column(String(20), nullable=False, default="maker") active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.now) class Supplier(Base): __tablename__ = "suppliers" id = Column(Integer, primary_key=True) code = Column(String(50)) name = Column(String(200), nullable=False) contact = Column(String(50)) phone = Column(String(50)) tax_no = Column(String(80)) bank_name = Column(String(120)) bank_account = Column(String(80)) payment_terms = Column(String(120)) active = Column(Boolean, default=True) class Material(Base): __tablename__ = "materials" id = Column(Integer, primary_key=True) code = Column(String(80), nullable=False) spec = Column(String(300)) unit = Column(String(20)) price = Column(Float, default=0) active = Column(Boolean, default=True) class Order(Base): __tablename__ = "orders" id = Column(Integer, primary_key=True) order_no = Column(String(50), nullable=False) doc_type = Column(String(20), nullable=False, default="purchase") supplier_name = Column(String(200)) supplier_contact = Column(String(50)) supplier_phone = Column(String(50)) supplier_tax_no = Column(String(80)) supplier_bank_name = Column(String(120)) supplier_bank_account = Column(String(80)) payment_terms = Column(String(120)) our_company = Column(String(200), default=COMPANY_NAME) our_contact = Column(String(50), default=DEFAULT_OUR_CONTACT) our_phone = Column(String(50), default=DEFAULT_OUR_PHONE) our_tax_no = Column(String(80), default=DEFAULT_OUR_TAX_NO) tax_rate = Column(String(30), default=DEFAULT_TAX_RATE) order_date = Column(String(20)) delivery_place = Column(String(300), default=DEFAULT_DELIVERY_PLACE) note = Column(Text) total_amount = Column(Float, default=0) status = Column(String(20), default="draft") created_by = Column(Integer, ForeignKey("users.id")) created_by_name = Column(String(50)) created_at = Column(DateTime, default=datetime.now) submitted_at = Column(DateTime) reviewed_by = Column(String(50)) reviewed_at = Column(DateTime) approved_by = Column(String(50)) approved_at = Column(DateTime) reject_reason = Column(Text) items = relationship("OrderItem", backref="order", cascade="all, delete-orphan", order_by="OrderItem.seq") logs = relationship("ApprovalLog", backref="order", cascade="all, delete-orphan", order_by="ApprovalLog.id") @property def status_text(self): return STATUS_TEXT.get(self.status, self.status) @property def doc_type_text(self): return DOC_TYPES.get(self.doc_type, self.doc_type) class OrderItem(Base): __tablename__ = "order_items" id = Column(Integer, primary_key=True) order_id = Column(Integer, ForeignKey("orders.id")) seq = Column(Integer, default=1) material_code = Column(String(80)) material_spec = Column(String(300)) unit = Column(String(20)) qty = Column(Float, default=0) price = Column(Float, default=0) amount = Column(Float, default=0) delivery_date = Column(String(30)) remark = Column(String(200)) class ApprovalLog(Base): __tablename__ = "approval_logs" id = Column(Integer, primary_key=True) order_id = Column(Integer, ForeignKey("orders.id")) action = Column(String(50)) user_name = Column(String(50)) comment = Column(Text) created_at = Column(DateTime, default=datetime.now) def init_db(db_path): engine = create_engine("sqlite:///" + db_path, echo=False) Base.metadata.create_all(engine) return engine, sessionmaker(bind=engine)