models.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from flask_login import UserMixin
  2. from flask_sqlalchemy import SQLAlchemy
  3. from flask_login import UserMixin
  4. from datetime import datetime
  5. db = SQLAlchemy() # ⚠️ 不传 app
  6. class SystemConfig(db.Model):
  7. id = db.Column(db.Integer, primary_key=True)
  8. site_name = db.Column(db.String(100), default='合同管理系统')
  9. site_icon = db.Column(db.String(100))
  10. mail_server = db.Column(db.String(100))
  11. mail_port = db.Column(db.Integer, default=587)
  12. mail_username = db.Column(db.String(100))
  13. mail_password = db.Column(db.String(100))
  14. mail_use_tls = db.Column(db.Boolean, default=True)
  15. scheduler_frequency = db.Column(db.String(20), default='daily') # daily, weekly, monthly
  16. scheduler_weekdays = db.Column(db.JSON, default=[]) # 0-6 (周一至周日)
  17. scheduler_month_day = db.Column(db.Integer, default=1) # 1-31
  18. scheduler_hour = db.Column(db.Integer, default=9) # 0-23
  19. scheduler_minute = db.Column(db.Integer, default=0) # 0-59
  20. class User(db.Model, UserMixin):
  21. id = db.Column(db.Integer, primary_key=True)
  22. username = db.Column(db.String(50), unique=True, nullable=False)
  23. password = db.Column(db.String(100), nullable=False)
  24. name = db.Column(db.String(50))
  25. department = db.Column(db.String(50))
  26. email = db.Column(db.String(100))
  27. is_admin = db.Column(db.Boolean, default=False)
  28. can_create = db.Column(db.Boolean, default=False)
  29. can_view = db.Column(db.Boolean, default=True)
  30. can_edit = db.Column(db.Boolean, default=False)
  31. can_delete = db.Column(db.Boolean, default=False)
  32. class Department(db.Model):
  33. id = db.Column(db.Integer, primary_key=True)
  34. name = db.Column(db.String(50), unique=True)
  35. class CompanyEntity(db.Model):
  36. id = db.Column(db.Integer, primary_key=True)
  37. name = db.Column(db.String(100), unique=True)
  38. class ContractType(db.Model):
  39. id = db.Column(db.Integer, primary_key=True)
  40. name = db.Column(db.String(50), unique=True)
  41. prefix = db.Column(db.String(20), nullable=True) # 例如 CG, XS
  42. code = db.Column(db.String(10)) # 新增字段
  43. class Contract(db.Model):
  44. id = db.Column(db.Integer, primary_key=True)
  45. contract_number = db.Column(db.String(50), unique=True, nullable=False)
  46. name = db.Column(db.String(100), nullable=False)
  47. type_id = db.Column(db.Integer, db.ForeignKey('contract_type.id'))
  48. type = db.relationship('ContractType', backref='contracts')
  49. company_entity_id = db.Column(db.Integer, db.ForeignKey('company_entity.id'))
  50. company_entity = db.relationship('CompanyEntity', backref='contracts')
  51. signer_id = db.Column(db.Integer, db.ForeignKey('user.id'))
  52. signer = db.relationship('User', foreign_keys=[signer_id])
  53. start_date = db.Column(db.Date, nullable=False)
  54. end_date = db.Column(db.Date, nullable=False)
  55. remind_before = db.Column(db.Integer)
  56. notes = db.Column(db.Text)
  57. creator_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
  58. creator = db.relationship('User', foreign_keys=[creator_id])
  59. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  60. is_active = db.Column(db.Boolean, default=True)
  61. original_contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'))
  62. original_contract = db.relationship('Contract', remote_side=[id], backref='renewed_contracts')
  63. # 新增字段
  64. signing_method = db.Column(db.String(50)) # 签约方式
  65. collected_date = db.Column(db.Date) # 合同收回时间
  66. storage_box = db.Column(db.String(100)) # 存储盒名称
  67. class Counterparty(db.Model):
  68. id = db.Column(db.Integer, primary_key=True)
  69. name = db.Column(db.String(100), nullable=False)
  70. contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'), nullable=False)
  71. contract = db.relationship('Contract', backref='counterparties')
  72. class ContractAttachment(db.Model):
  73. id = db.Column(db.Integer, primary_key=True)
  74. contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'), nullable=False)
  75. contract = db.relationship('Contract', backref='attachments')
  76. filename = db.Column(db.String(100), nullable=False)
  77. filepath = db.Column(db.String(200), nullable=False)
  78. uploaded_at = db.Column(db.DateTime, default=datetime.utcnow)
  79. class ContractVersion(db.Model):
  80. id = db.Column(db.Integer, primary_key=True)
  81. contract_id = db.Column(db.Integer, db.ForeignKey('contract.id'), nullable=False)
  82. contract = db.relationship('Contract', backref='versions')
  83. version = db.Column(db.Integer, nullable=False)
  84. data = db.Column(db.Text)
  85. modified_by = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
  86. modifier = db.relationship('User')
  87. modified_at = db.Column(db.DateTime, default=datetime.utcnow)