refactor: 模型继承规范统一执行 (MODEL-INHERITANCE-STANDARD)

修改内容:
- 13个模型从Base改为BaseModel继承
- Project/ProjectMember/BOMHeader/BOMItem统一
- Document/DocumentVersion/User统一
- SystemConfig/ConfigAuditLog统一
- Workflow/WorkflowNode/WorkflowInstance/WorkflowHistory统一
- BOMItemSubstitute统一

新增DDL:
- migrations/002_add_deleted_at.sql
- 所有表新增deleted_at/lock_version/created_by/updated_by字段
- 创建deleted_at索引优化查询

验收: 200 passed (增加1个)
This commit is contained in:
admin
2026-04-04 09:10:46 +08:00
committed by market
parent 944cb5adc2
commit dbc7987d8b
8 changed files with 139 additions and 21 deletions

View File

@@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship, backref
from datetime import datetime
import enum
from app.core.database import Base
from app.models.base import BaseModel
class BOMStatus(str, enum.Enum):
@@ -36,7 +36,7 @@ class AIAnalysisStatus(str, enum.Enum):
FAILED = "failed" # 失败
class BOMHeader(Base):
class BOMHeader(BaseModel):
"""BOM头表"""
__tablename__ = "bom_headers"
@@ -85,7 +85,7 @@ class BOMHeader(Base):
return f"<BOMHeader(bom_number='{self.bom_number}', version='{self.version}')>"
class BOMItem(Base):
class BOMItem(BaseModel):
"""BOM明细表"""
__tablename__ = "bom_items"

View File

@@ -7,7 +7,7 @@ from sqlalchemy import Column, Integer, String, Boolean, DateTime, Enum, Text, I
from datetime import datetime
import enum
from app.core.database import Base
from app.models.base import BaseModel
class ConfigCategory(str, enum.Enum):
@@ -33,7 +33,7 @@ class ConfigDataType(str, enum.Enum):
ENUM = "enum"
class SystemConfig(Base):
class SystemConfig(BaseModel):
"""System configuration model"""
__tablename__ = "system_configs"
@@ -109,7 +109,7 @@ class SystemConfig(Base):
self.value = str(value)
class ConfigAuditLog(Base):
class ConfigAuditLog(BaseModel):
"""Configuration change audit log"""
__tablename__ = "config_audit_logs"

View File

@@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from app.core.database import Base
from app.models.base import BaseModel
class DocumentStatus(str, enum.Enum):
@@ -29,7 +29,7 @@ class DocumentType(str, enum.Enum):
OTHER = "other" # 其他
class Document(Base):
class Document(BaseModel):
"""文档模型"""
__tablename__ = "documents"
@@ -82,7 +82,7 @@ class Document(Base):
return f"<Document(doc_number='{self.doc_number}', name='{self.doc_name}')>"
class DocumentVersion(Base):
class DocumentVersion(BaseModel):
"""文档版本历史"""
__tablename__ = "document_versions"

View File

@@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from app.core.database import Base
from app.models.base import BaseModel
class ProjectStatus(str, enum.Enum):
@@ -39,7 +39,7 @@ class ProjectType(str, enum.Enum):
COMPLIANCE = "compliance"
class Project(Base):
class Project(BaseModel):
"""Project model for PLM"""
__tablename__ = "projects"
@@ -113,7 +113,7 @@ class Project(Base):
return 0.0
class ProjectMember(Base):
class ProjectMember(BaseModel):
"""Project member association"""
__tablename__ = "project_members"

View File

@@ -7,10 +7,10 @@ from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, Foreign
from sqlalchemy.orm import relationship
from datetime import datetime
from app.core.database import Base
from app.models.base import BaseModel
class BOMItemSubstitute(Base):
class BOMItemSubstitute(BaseModel):
"""BOM明细替代物料表"""
__tablename__ = "bom_item_substitutes"

View File

@@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from app.core.database import Base
from app.models.base import BaseModel
class UserRole(str, enum.Enum):
@@ -28,7 +28,7 @@ class UserStatus(str, enum.Enum):
PENDING = "pending"
class User(Base):
class User(BaseModel):
"""User account model"""
__tablename__ = "users"

View File

@@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from app.core.database import Base
from app.models.base import BaseModel
class WorkflowStatus(str, enum.Enum):
@@ -38,7 +38,7 @@ class InstanceStatus(str, enum.Enum):
CANCELLED = "cancelled" # 已取消
class Workflow(Base):
class Workflow(BaseModel):
"""工作流定义"""
__tablename__ = "workflows"
@@ -83,7 +83,7 @@ class Workflow(Base):
return f"<Workflow(workflow_number='{self.workflow_number}', name='{self.workflow_name}')>"
class WorkflowNode(Base):
class WorkflowNode(BaseModel):
"""工作流节点"""
__tablename__ = "workflow_nodes"
@@ -112,7 +112,7 @@ class WorkflowNode(Base):
)
class WorkflowInstance(Base):
class WorkflowInstance(BaseModel):
"""工作流实例"""
__tablename__ = "workflow_instances"
@@ -148,7 +148,7 @@ class WorkflowInstance(Base):
)
class WorkflowHistory(Base):
class WorkflowHistory(BaseModel):
"""工作流历史记录"""
__tablename__ = "workflow_history"

View File

@@ -0,0 +1,118 @@
-- ============================================================================
-- PLM System - Add deleted_at for Soft Delete Support
-- Version: 1.0.1
-- Created: 2026-04-04
-- Description: Add deleted_at column to all tables for BaseModel inheritance
-- ============================================================================
-- 1. Users Table
ALTER TABLE users ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE users ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE users ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE users ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 2. Products Table (already has BaseModel fields from original)
-- No changes needed
-- 3. Projects Table
ALTER TABLE projects ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE projects ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE projects ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE projects ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 4. Project Members Table
ALTER TABLE project_members ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE project_members ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE project_members ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE project_members ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 5. BOM Headers Table
ALTER TABLE bom_headers ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE bom_headers ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE bom_headers ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE bom_headers ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 6. BOM Items Table
ALTER TABLE bom_items ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE bom_items ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE bom_items ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE bom_items ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 7. BOM Item Substitutes Table
ALTER TABLE bom_item_substitutes ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE bom_item_substitutes ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE bom_item_substitutes ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE bom_item_substitutes ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 8. Documents Table
ALTER TABLE documents ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE documents ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE documents ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE documents ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 9. Document Versions Table
ALTER TABLE document_versions ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE document_versions ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE document_versions ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE document_versions ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 10. System Config Table
ALTER TABLE system_config ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE system_config ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE system_config ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE system_config ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 11. Config Audit Log Table
ALTER TABLE config_audit_log ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE system_config ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE config_audit_log ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE config_audit_log ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE config_audit_log ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 12. Workflows Table
ALTER TABLE workflows ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE workflows ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE workflows ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE workflows ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 13. Workflow Nodes Table
ALTER TABLE workflow_nodes ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE workflow_nodes ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE workflow_nodes ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE workflow_nodes ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 14. Workflow Instances Table
ALTER TABLE workflow_instances ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE workflow_instances ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE workflow_instances ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE workflow_instances ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- 15. Workflow History Table
ALTER TABLE workflow_history ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL;
ALTER TABLE workflow_history ADD COLUMN IF NOT EXISTS lock_version INTEGER NOT NULL DEFAULT 0;
ALTER TABLE workflow_history ADD COLUMN IF NOT EXISTS created_by INTEGER NULL;
ALTER TABLE workflow_history ADD COLUMN IF NOT EXISTS updated_by INTEGER NULL;
-- ============================================================================
-- Create indexes for deleted_at (performance optimization)
-- ============================================================================
CREATE INDEX IF NOT EXISTS idx_users_deleted_at ON users(deleted_at);
CREATE INDEX IF NOT EXISTS idx_projects_deleted_at ON projects(deleted_at);
CREATE INDEX IF NOT EXISTS idx_bom_headers_deleted_at ON bom_headers(deleted_at);
CREATE INDEX IF NOT EXISTS idx_bom_items_deleted_at ON bom_items(deleted_at);
CREATE INDEX IF NOT EXISTS idx_documents_deleted_at ON documents(deleted_at);
CREATE INDEX IF NOT EXISTS idx_workflows_deleted_at ON workflows(deleted_at);
-- ============================================================================
-- Comments for documentation
-- ============================================================================
COMMENT ON COLUMN users.deleted_at IS '软删除时间戳NULL表示未删除';
COMMENT ON COLUMN projects.deleted_at IS '软删除时间戳NULL表示未删除';
COMMENT ON COLUMN bom_headers.deleted_at IS '软删除时间戳NULL表示未删除';
COMMENT ON COLUMN bom_items.deleted_at IS '软删除时间戳NULL表示未删除';
COMMENT ON COLUMN documents.deleted_at IS '软删除时间戳NULL表示未删除';
COMMENT ON COLUMN workflows.deleted_at IS '软删除时间戳NULL表示未删除';
-- ============================================================================
-- End of Migration
-- ============================================================================