Company.java 2.7 KB
package com.aigeo.company.entity;
import org.hibernate.annotations.JdbcTypeCode;
import java.sql.Types;
import com.aigeo.common.enums.CompanyStatus;
import com.aigeo.common.enums.PlanType;
import com.aigeo.common.result.Result;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import jakarta.persistence.*;
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.util.Optional;

/**
 * 公司实体类 - 多租户架构的核心实体
 *
 * @author AIGEO Team
 * @since 1.0.0
 */
@Data
@Entity
@Table(name = "ai_companies", indexes = {
    @Index(name = "uk_companies_subdomain", columnList = "subdomain", unique = true)
})
@EntityListeners(AuditingEntityListener.class)
public class Company {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;

    @Column(name = "name", nullable = false, length = 255)
    private String name;

    @Column(name = "subdomain", unique = true, length = 100)
    private String subdomain;

    @Enumerated(EnumType.STRING)
    @Column(name = "plan_type", length = 20)
    private PlanType planType = PlanType.FREE;

    @Column(name = "max_users")
    private Integer maxUsers = 5;

    @Column(name = "max_articles_per_month")
    private Integer maxArticlesPerMonth = 100;

    @Enumerated(EnumType.STRING)
    @Column(name = "status", length = 20)
    private CompanyStatus status = CompanyStatus.TRIAL;

    @Column(name = "trial_expiry_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate trialExpiryDate;

    @Lob
    @Column(name = "default_settings", columnDefinition = "JSON")
    private String defaultSettings;

    @CreationTimestamp
    @Column(name = "created_at", updatable = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    @UpdateTimestamp
    @Column(name = "updated_at")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;

    @PrePersist
    protected void onCreate() {
        if (planType == null) planType = PlanType.FREE;
        if (status == null) status = CompanyStatus.TRIAL;
        if (maxUsers == null) maxUsers = 5;
        if (maxArticlesPerMonth == null) maxArticlesPerMonth = 100;
    }

    public Optional<Result<Object>> map(Object querySuccess) {
    // TODO: 添加具体的业务逻辑实现
    return Optional.empty();
}

}