from datetime import datetime from sqlalchemy import Column, String, Integer, BigInteger, DateTime, Boolean, ForeignKey, JSON from sqlalchemy.orm import relationship from config.database import Base class TestPermission(Base): """ 测试权限配置表 - 谁可以测什么 """ __tablename__ = 'test_permission' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='权限ID') user_id = Column(BigInteger, nullable=False, comment='用户ID') # 可选限制条件 eut_type_id = Column(BigInteger, nullable=True, comment='产品类型限制(可选)') test_category_id = Column(BigInteger, nullable=True, comment='测试类别限制(可选)') # 权限类型 permission_type = Column(String(20), default='TESTER', comment='权限类型: TESTER=测试人') # 领取限制 can_claim = Column(Boolean, default=True, comment='是否可领取工单') max_concurrent = Column(Integer, default=5, comment='最大并行工单数') # 优先级权重(用于排序) priority_weight = Column(Integer, default=1, comment='优先级权重') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') update_by = Column(String(64), default='', comment='更新者') update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间') del_flag = Column(String(1), default='0', comment='删除标志') __table_args__ = {'comment': '测试权限配置表'} class TestCategoryDetail(Base): """ 测试类别详细配置表 - 仅叶子节点(测试项目)需要 """ __tablename__ = 'test_category_detail' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='详情ID') category_id = Column(BigInteger, nullable=False, comment='关联测试类别ID') # 测试条件参数模板(JSON格式) # 示例: [{"field": "temperature", "label": "温度", "unit": "°C", "type": "number", "required": true}] condition_fields = Column(JSON, nullable=True, comment='测试条件字段定义') # 测试结果字段定义(JSON格式) # 示例: [{"field": "voltage", "label": "电压", "type": "number", "unit": "V"}] result_fields = Column(JSON, nullable=True, comment='测试结果字段定义') # 原始数据配置 allow_raw_data = Column(Boolean, default=True, comment='是否允许提交原始数据') raw_data_fields = Column(JSON, nullable=True, comment='原始数据字段定义') # 测试步骤模板 step_template = Column(JSON, nullable=True, comment='测试步骤模板') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') update_by = Column(String(64), default='', comment='更新者') update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间') del_flag = Column(String(1), default='0', comment='删除标志') __table_args__ = {'comment': '测试类别详细配置表'} class ReportPermission(Base): """ 报告权限配置表 - 谁可以编写/审核报告 """ __tablename__ = 'report_permission' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='权限ID') user_id = Column(BigInteger, nullable=False, comment='用户ID') # 权限类型: WRITER=编写人, REVIEWER_1=一审, REVIEWER_2=二审, REVIEWER_3=三审 permission_type = Column(String(20), nullable=False, comment='权限类型') # 适用测试类别(可选) test_category_id = Column(BigInteger, nullable=True, comment='测试类别限制') # 领取限制 can_claim = Column(Boolean, default=True, comment='是否可领取') max_concurrent = Column(Integer, default=3, comment='最大并行报告数') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') update_by = Column(String(64), default='', comment='更新者') update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间') del_flag = Column(String(1), default='0', comment='删除标志') __table_args__ = {'comment': '报告权限配置表'} class TestReport(Base): """ 测试报告表 """ __tablename__ = 'test_report' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='报告ID') report_no = Column(String(50), unique=True, nullable=False, comment='报告编号') # 报告类型: CATEGORY=按大类, ITEM=按子项 report_type = Column(String(20), nullable=False, comment='报告类型') # 关联 category_id = Column(BigInteger, nullable=False, comment='测试大类ID') item_id = Column(BigInteger, nullable=True, comment='测试子项ID') # 优先级 priority = Column(Integer, default=1, comment='优先级') # 编写人(可领取) writer_id = Column(BigInteger, nullable=True, comment='编写人ID') claimed_by_writer_at = Column(DateTime, nullable=True, comment='编写人领取时间') # 一审 reviewer_1_id = Column(BigInteger, nullable=True, comment='一审人ID') review_1_status = Column(String(20), nullable=True, comment='一审状态') review_1_at = Column(DateTime, nullable=True, comment='一审时间') review_1_comment = Column(String(500), nullable=True, comment='一审意见') # 二审 reviewer_2_id = Column(BigInteger, nullable=True, comment='二审人ID') review_2_status = Column(String(20), nullable=True, comment='二审状态') review_2_at = Column(DateTime, nullable=True, comment='二审时间') review_2_comment = Column(String(500), nullable=True, comment='二审意见') # 三审 reviewer_3_id = Column(BigInteger, nullable=True, comment='三审人ID') review_3_status = Column(String(20), nullable=True, comment='三审状态') review_3_at = Column(DateTime, nullable=True, comment='三审时间') review_3_comment = Column(String(500), nullable=True, comment='三审意见') # 报告状态 status = Column(String(20), default='PENDING_WRITE', comment='报告状态') # 当前版本 current_version_id = Column(BigInteger, nullable=True, comment='当前版本ID') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') update_by = Column(String(64), default='', comment='更新者') update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间') del_flag = Column(String(1), default='0', comment='删除标志') __table_args__ = {'comment': '测试报告表'} class ReportWorkOrderRelation(Base): """ 报告工单关联表 """ __tablename__ = 'report_work_order_relation' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='关联ID') report_id = Column(BigInteger, nullable=False, comment='报告ID') work_order_id = Column(BigInteger, nullable=False, comment='工单ID') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') __table_args__ = {'comment': '报告工单关联表'} class TestReportVersion(Base): """ 报告版本表 - 留痕 """ __tablename__ = 'test_report_version' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='版本ID') report_id = Column(BigInteger, nullable=False, comment='关联报告ID') version_no = Column(Integer, nullable=False, comment='版本号') # 报告内容 content = Column(JSON, nullable=False, comment='报告内容') # 提交信息 submitted_by = Column(BigInteger, nullable=False, comment='提交人ID') submitted_at = Column(DateTime, nullable=False, comment='提交时间') submit_comment = Column(String(500), nullable=True, comment='提交说明') # 审核结果 review_result = Column(String(20), nullable=True, comment='审核结果') reviewed_by = Column(BigInteger, nullable=True, comment='审核人ID') reviewed_at = Column(DateTime, nullable=True, comment='审核时间') review_comment = Column(String(1000), nullable=True, comment='审核意见') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') __table_args__ = {'comment': '报告版本表'} class WorkOrderRetestRecord(Base): """ 工单重测记录表 - 留痕 """ __tablename__ = 'work_order_retest_record' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='记录ID') work_order_id = Column(BigInteger, nullable=False, comment='关联工单ID') # 触发来源 trigger_source = Column(String(20), nullable=False, comment='触发来源') triggered_by = Column(BigInteger, nullable=False, comment='触发人ID') triggered_at = Column(DateTime, nullable=False, comment='触发时间') # 重测原因 reason = Column(String(500), nullable=False, comment='重测原因') report_id = Column(BigInteger, nullable=True, comment='关联报告ID') review_comment = Column(String(500), nullable=True, comment='审核意见') # 重测前状态快照 previous_status = Column(Integer, nullable=False, comment='重测前状态') previous_result = Column(JSON, nullable=True, comment='重测前结果快照') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') update_by = Column(String(64), default='', comment='更新者') update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间') del_flag = Column(String(1), default='0', comment='删除标志') __table_args__ = {'comment': '工单重测记录表'} class ReportReviewRecord(Base): """ 报告审核记录表 - 留痕 """ __tablename__ = 'report_review_record' id = Column(BigInteger, primary_key=True, autoincrement=True, comment='记录ID') report_id = Column(BigInteger, nullable=False, comment='关联报告ID') version_id = Column(BigInteger, nullable=False, comment='关联版本ID') # 审核信息 review_level = Column(Integer, nullable=False, comment='审核级别') reviewer_id = Column(BigInteger, nullable=False, comment='审核人ID') reviewed_at = Column(DateTime, nullable=False, comment='审核时间') # 审核结果 action = Column(String(20), nullable=False, comment='审核动作') comment = Column(String(1000), nullable=True, comment='审核意见') # 报告内容快照 report_content_snapshot = Column(JSON, nullable=True, comment='报告内容快照') retest_work_order_ids = Column(JSON, nullable=True, comment='指定重测工单ID列表') # 若依标准字段 create_by = Column(String(64), default='', comment='创建者') create_time = Column(DateTime, default=datetime.now, comment='创建时间') __table_args__ = {'comment': '报告审核记录表'}