| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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)
|