init: 博特维采购订单系统 v1.0 源码
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
# -*- 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)
|
||||
Reference in New Issue
Block a user