Files

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地址")