155 lines
5.1 KiB
Python
155 lines
5.1 KiB
Python
# -*- 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)
|