from flask_login import UserMixin from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin from datetime import datetime db = SQLAlchemy() # ⚠️ 不传 app class SystemConfig(db.Model): id = db.Column(db.Integer, primary_key=True) site_name = db.Column(db.String(100), default='合同管理系统') site_icon = db.Column(db.String(100)) mail_server = db.Column(db.String(100)) mail_port = db.Column(db.Integer, default=587) mail_username = db.Column(db.String(100)) mail_password = db.Column(db.String(100)) mail_use_tls = db.Column(db.Boolean, default=True) scheduler_frequency = db.Column(db.String(20), default='daily') # daily, weekly, monthly scheduler_weekdays = db.Column(db.JSON, default=[]) # 0-6 (周一至周日) scheduler_month_day = db.Column(db.Integer, default=1) # 1-31 scheduler_hour = db.Column(db.Integer, default=9) # 0-23 scheduler_minute = db.Column(db.Integer, default=0) # 0-59 class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) password = db.Column(db.String(100), nullable=False) name = db.Column(db.String(50)) department = db.Column(db.String(50)) email = db.Column(db.String(100)) is_admin = db.Column(db.Boolean, default=False) can_create = db.Column(db.Boolean, default=False) can_view = db.Column(db.Boolean, default=True) can_edit = db.Column(db.Boolean, default=False) can_delete = db.Column(db.Boolean, default=False) class Department(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True) class CompanyEntity(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), unique=True) class ContractType(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True) prefix = db.Column(db.String(20), nullable=True) # 例如 CG, XS code = db.Column(db.String(10)) # 新增字段 class Contract(db.Model): id = db.Column(db.Integer, primary_key=True) contract_number = db.Column(db.String(50), unique=True, nullable=False) name = db.Column(db.String(100), nullable=False) type_id = db.Column(db.Integer, db.ForeignKey('contract_type.id')) type = db.relationship('ContractType', backref='contracts') company_entity_id = db.Column(db.Integer, db.ForeignKey('company_entity.id')) company_entity = db.relationship('CompanyEntity', backref='contracts') signer_id = db.Column(db.Integer, db.ForeignKey('user.id')) signer = db.relationship('User', foreign_keys=[signer_id]) start_date = db.Column(db.Date, nullable=False) end_date = db.Column(db.Date, nullable=False) remind_before = db.Column(db.Integer) notes = db.Column(db.Text) creator_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) creator = db.relationship('User', foreign_keys=[creator_id]) created_at = db.Column(db.DateTime, default=datetime.utcnow) is_active = db.Column(db.Boolean, default=True) original_contract_id = db.Column(db.Integer, db.ForeignKey('contract.id')) original_contract = db.relationship('Contract', remote_side=[id], backref='renewed_contracts') # 新增字段 signing_method = db.Column(db.String(50)) # 签约方式 collected_date = db.Column(db.Date) # 合同收回时间 storage_box = db.Column(db.String(100)) # 存储盒名称 class Counterparty(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'), nullable=False) contract = db.relationship('Contract', backref='counterparties') class ContractAttachment(db.Model): id = db.Column(db.Integer, primary_key=True) contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'), nullable=False) contract = db.relationship('Contract', backref='attachments') filename = db.Column(db.String(100), nullable=False) filepath = db.Column(db.String(200), nullable=False) uploaded_at = db.Column(db.DateTime, default=datetime.utcnow) class ContractVersion(db.Model): id = db.Column(db.Integer, primary_key=True) contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'), nullable=False) contract = db.relationship('Contract', backref='versions') version = db.Column(db.Integer, nullable=False) data = db.Column(db.Text) modified_by = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) modifier = db.relationship('User') modified_at = db.Column(db.DateTime, default=datetime.utcnow)