UploadedFile.java 4.3 KB
// ai/entity/UploadedFile.java
package com.aigeo.ai.entity;
import org.hibernate.annotations.JdbcTypeCode;
import java.sql.Types;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import com.aigeo.common.enums.FileType;
import com.aigeo.common.enums.FileStatus;

import java.time.LocalDateTime;


/**
 * 上传文件实体类,对应数据库表 ai_uploaded_files
 * 
 * 管理系统中上传的文件信息,包括文件元数据、存储路径、
 * 文件类型、大小、校验和等信息,支持多租户和版本控制
 * 
 * @author AIGEO Team
 * @since 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ai_uploaded_files", indexes = {
    @Index(name = "idx_uploaded_files_company", columnList = "company_id"),
    @Index(name = "idx_uploaded_files_user", columnList = "user_id"),
    @Index(name = "idx_uploaded_files_type", columnList = "file_type"),
    @Index(name = "idx_uploaded_files_status", columnList = "status"),
    @Index(name = "idx_uploaded_files_created", columnList = "created_at")
})
public class UploadedFile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * 公司ID,多租户标识
     */
    @NotNull(message = "公司ID不能为空")
    @Column(name = "company_id", nullable = false)
    private Integer companyId;

    /**
     * 用户ID,文件上传者
     */
    @NotNull(message = "用户ID不能为空")
    @Column(name = "user_id", nullable = false)
    private Integer userId;

    /**
     * 原始文件名
     */
    @NotBlank(message = "文件名不能为空")
    @Column(name = "file_name", nullable = false, length = 255)
    private String fileName;

    /**
     * 文件存储路径
     */
    @NotBlank(message = "文件路径不能为空")
    @Column(name = "file_path", nullable = false, length = 500)
    private String filePath;

    /**
     * 文件类型枚举
     */
    @NotNull(message = "文件类型不能为空")
    @Enumerated(EnumType.STRING)
    @Column(name = "file_type", nullable = false, length = 50)
    private FileType fileType;

    /**
     * 文件大小,单位字节
     */
    @Column(name = "file_size")
    private Long fileSize;

    /**
     * MIME类型
     */
    @Column(name = "mime_type", length = 100)
    private String mimeType;

    /**
     * 文件校验和,用于文件完整性验证
     */
    @Column(length = 128)
    private String checksum;

    /**
     * 文件版本号,支持文件版本管理
     */
    @Builder.Default
    private Integer version = 1;

    /**
     * 文件状态
     */
    @Enumerated(EnumType.STRING)
    @Column(length = 20)
    @Builder.Default
    private FileStatus status = FileStatus.UPLOADED;

    /**
     * 创建时间
     */
    @Column(name = "created_at", nullable = false, updatable = false)
    
    private LocalDateTime createdAt;

    /**
     * 创建时间自动设置
     */
    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
    }

    /**
     * 获取文件大小的可读格式
     * @return 格式化的文件大小字符串
     */
    public String getFormattedFileSize() {
        if (fileSize == null) return "未知";
        if (fileSize < 1024) return fileSize + " B";
        if (fileSize < 1024 * 1024) return String.format("%.1f KB", fileSize / 1024.0);
        if (fileSize < 1024 * 1024 * 1024) return String.format("%.1f MB", fileSize / (1024.0 * 1024.0));
        return String.format("%.1f GB", fileSize / (1024.0 * 1024.0 * 1024.0));
    }

    /**
     * 检查文件是否为图片类型
     * @return 是否为图片
     */
    public boolean isImage() {
        return fileType == FileType.IMAGE || 
               (mimeType != null && mimeType.startsWith("image/"));
    }

    /**
     * 检查文件是否为文档类型
     * @return 是否为文档
     */
    public boolean isDocument() {
        return fileType == FileType.DOCUMENT || 
               (mimeType != null && (mimeType.contains("pdf") || 
                                   mimeType.contains("word") || 
                                   mimeType.contains("text")));
    }
}