FileStatus.java 3.2 KB
package com.aigeo.common.enums;

import lombok.Getter;

/**
 * 文件状态枚举
 * 对应数据库字段:ai_uploaded_files.status
 * 
 * 文件处理状态流程:
 * - UPLOADED: 文件已上传,等待处理
 * - PROCESSING: 文件正在处理中(扫描、转换等)
 * - PROCESSED: 文件处理完成,可以正常使用
 * - FAILED: 文件处理失败,需要重新上传或处理
 * - DELETED: 文件已被标记为删除状态
 * 
 * @author AIGEO Team
 * @since 1.0.0
 */
@Getter
public enum FileStatus {
    
    /**
     * 已上传 - 文件刚上传完成,等待系统处理
     */
    UPLOADED("uploaded", "已上传"),
    
    /**
     * 处理中 - 正在进行病毒扫描、格式转换等处理
     */
    PROCESSING("processing", "处理中"),
    
    /**
     * 已处理 - 文件处理完成,可以正常使用
     */
    PROCESSED("processed", "已处理"),
    
    /**
     * 处理失败 - 文件处理过程中出现错误
     */
    FAILED("failed", "处理失败"),
    
    /**
     * 已删除 - 文件已被标记为删除状态
     */
    DELETED("deleted", "已删除");

    /**
     * 数据库存储值
     */
    private final String code;
    
    /**
     * 显示名称
     */
    private final String displayName;

    FileStatus(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }
    
    /**
     * 根据代码获取枚举
     * @param code 状态代码
     * @return 对应的文件状态枚举
     * @throws IllegalArgumentException 当代码不存在时抛出
     */
    public static FileStatus fromCode(String code) {
        for (FileStatus status : values()) {
            if (status.code.equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("未知的文件状态代码: " + code);
    }
    
    /**
     * 检查是否为终态(不会再发生状态变更)
     * @return 是否为终态
     */
    public boolean isFinalState() {
        return this == PROCESSED || this == FAILED || this == DELETED;
    }
    
    /**
     * 检查是否可以使用
     * @return 文件是否可以正常使用
     */
    public boolean isUsable() {
        return this == PROCESSED;
    }
    
    /**
     * 检查是否需要重新处理
     * @return 是否需要重新处理
     */
    public boolean needsReprocessing() {
        return this == FAILED;
    }
    
    /**
     * 检查是否正在处理中
     * @return 是否正在处理
     */
    public boolean isInProgress() {
        return this == PROCESSING;
    }
    
    /**
     * 获取下一个可能的状态
     * @return 可能的下一状态数组
     */
    public FileStatus[] getPossibleNextStates() {
        switch (this) {
            case UPLOADED:
                return new FileStatus[]{PROCESSING, FAILED};
            case PROCESSING:
                return new FileStatus[]{PROCESSED, FAILED};
            case PROCESSED:
                return new FileStatus[]{DELETED};
            case FAILED:
                return new FileStatus[]{PROCESSING, DELETED};
            case DELETED:
                return new FileStatus[]{};
            default:
                return new FileStatus[]{};
        }
    }
}