130 lines
5.0 KiB
Python
130 lines
5.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
合同管理数据模型
|
|
"""
|
|
from sqlalchemy import Column, String, Text, Integer, DateTime, Boolean, JSON
|
|
|
|
from app.base_model import BaseModel
|
|
|
|
|
|
class ContractTemplate(BaseModel):
|
|
"""合同模板"""
|
|
__tablename__ = "contract_template"
|
|
|
|
name = Column(String(100), nullable=False, comment="模板名称")
|
|
code = Column(String(100), unique=True, nullable=False, comment="模板编码")
|
|
category = Column(String(50), default="", comment="分类")
|
|
description = Column(Text, default="", comment="描述")
|
|
status = Column(String(20), default="draft", index=True, comment="状态: draft/published/disabled")
|
|
version = Column(Integer, default=1, comment="版本号")
|
|
|
|
# 模板配置(JSON格式存储页面设置、元素、变量等)
|
|
template_config = Column(JSON, default=dict, comment="模板配置")
|
|
|
|
# 缩略图
|
|
thumbnail = Column(Text, default="", comment="缩略图(base64)")
|
|
|
|
|
|
class ContractInstance(BaseModel):
|
|
"""合同实例(基于模板创建的合同)"""
|
|
__tablename__ = "contract_instance"
|
|
|
|
# 关联模板(逻辑外键)
|
|
template_id = Column(String(21), nullable=False, index=True, comment="合同模板ID")
|
|
|
|
# 合同信息
|
|
contract_no = Column(String(50), unique=True, nullable=False, comment="合同编号")
|
|
title = Column(String(200), nullable=False, comment="合同标题")
|
|
status = Column(String(20), default="draft", index=True, comment="状态: draft/pending/signing/completed/expired/canceled")
|
|
|
|
# 创建人(逻辑外键)
|
|
creator_id = Column(String(21), nullable=False, index=True, comment="创建人ID")
|
|
|
|
# 合同配置(继承自模板,可修改)
|
|
contract_config = Column(JSON, default=dict, comment="合同配置")
|
|
|
|
# 变量数据
|
|
variable_data = Column(JSON, default=dict, comment="变量数据")
|
|
|
|
# 签署数据
|
|
signature_data = Column(JSON, default=dict, comment="签署数据")
|
|
|
|
# 时间记录
|
|
created_at = Column(DateTime, nullable=True, comment="创建时间")
|
|
completed_at = Column(DateTime, nullable=True, comment="完成时间")
|
|
expired_at = Column(DateTime, nullable=True, comment="过期时间")
|
|
|
|
# PDF 文件
|
|
pdf_file = Column(Text, default="", comment="PDF文件路径")
|
|
|
|
|
|
class ContractSignature(BaseModel):
|
|
"""合同签署记录"""
|
|
__tablename__ = "contract_signature"
|
|
|
|
# 关联合同(逻辑外键)
|
|
contract_id = Column(String(21), nullable=False, index=True, comment="合同实例ID")
|
|
|
|
# 签署区信息
|
|
element_id = Column(String(50), nullable=False, comment="元素ID")
|
|
party_type = Column(String(20), default="party_a", comment="签署方类型: party_a/party_b/party_c/witness")
|
|
party_label = Column(String(50), default="", comment="签署方标签")
|
|
sign_type = Column(String(20), default="signature", comment="签署类型: signature/seal")
|
|
|
|
# 签署人(逻辑外键)
|
|
signer_id = Column(String(21), nullable=True, comment="签署人ID")
|
|
signer_name = Column(String(50), default="", comment="签署人姓名")
|
|
|
|
# 签署数据
|
|
signature_image = Column(Text, default="", comment="签名/印章图片(base64)")
|
|
status = Column(String(20), default="pending", comment="状态: pending/signed/rejected")
|
|
signed_at = Column(DateTime, nullable=True, comment="签署时间")
|
|
|
|
# IP 和设备信息
|
|
sign_ip = Column(String(50), default="", comment="签署IP")
|
|
sign_device = Column(String(200), default="", comment="签署设备")
|
|
|
|
|
|
class ContractSignToken(BaseModel):
|
|
"""合同签署令牌(用于手机扫码签署)"""
|
|
__tablename__ = "contract_sign_token"
|
|
|
|
# 关联合同(逻辑外键)
|
|
contract_id = Column(String(21), nullable=False, index=True, comment="合同实例ID")
|
|
|
|
# 令牌
|
|
token = Column(String(64), unique=True, nullable=False, comment="签署令牌")
|
|
|
|
# 签署方信息
|
|
party_type = Column(String(20), default="party_a", comment="签署方类型")
|
|
signer_name = Column(String(50), default="", comment="签署人姓名")
|
|
|
|
# 有效期
|
|
expired_at = Column(DateTime, nullable=False, comment="过期时间")
|
|
|
|
# 是否已使用
|
|
is_used = Column(Boolean, default=False, comment="是否已使用")
|
|
used_at = Column(DateTime, nullable=True, comment="使用时间")
|
|
|
|
|
|
class ContractLog(BaseModel):
|
|
"""合同操作日志"""
|
|
__tablename__ = "contract_log"
|
|
|
|
# 关联合同(逻辑外键)
|
|
contract_id = Column(String(21), nullable=False, index=True, comment="合同实例ID")
|
|
|
|
# 操作信息
|
|
action = Column(String(20), nullable=False, comment="操作类型: create/update/submit/sign/reject/cancel/complete/export/view")
|
|
|
|
# 操作人(逻辑外键)
|
|
operator_id = Column(String(21), nullable=False, comment="操作人ID")
|
|
|
|
# 操作详情
|
|
comment = Column(Text, default="", comment="备注")
|
|
extra_data = Column(JSON, default=dict, comment="额外数据")
|
|
|
|
# IP 信息
|
|
ip_address = Column(String(50), default="", comment="IP地址")
|