CompanyService.java 8.2 KB
package com.aigeo.company.service;

import com.aigeo.common.enums.CompanyStatus;
import com.aigeo.common.enums.PlanType;
import com.aigeo.common.exception.BusinessException;
import com.aigeo.common.result.ResultCode;
import com.aigeo.company.entity.Company;
import com.aigeo.company.repository.CompanyRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 公司服务层
 *
 * @author AIGEO Team
 * @since 1.0.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CompanyService {

    private final CompanyRepository companyRepository;

    /**
     * 分页查询公司列表
     */
    public Page<Company> getCompanyPage(Pageable pageable) {
        return companyRepository.findAll(pageable);
    }

    /**
     * 根据ID查询公司
     */
    public Company getCompanyById(Integer id) {
        return companyRepository.findById(id)
                .orElseThrow(() -> new BusinessException(ResultCode.COMPANY_NOT_FOUND));
    }

    /**
     * 根据子域名查询公司
     */
    public Optional<Company> getCompanyBySubdomain(String subdomain) {
        return companyRepository.findBySubdomain(subdomain);
    }

    /**
     * 根据状态查询公司列表
     */
    public List<Company> getCompaniesByStatus(CompanyStatus status) {
        return companyRepository.findByStatus(status);
    }

    /**
     * 创建公司
     */
    @Transactional
    public Company createCompany(Company company) {
        // 验证公司名称唯一性
        if (companyRepository.existsByName(company.getName())) {
            throw new BusinessException(ResultCode.DATA_DUPLICATE, "公司名称已存在");
        }

        // 验证子域名唯一性
        if (company.getSubdomain() != null && companyRepository.existsBySubdomain(company.getSubdomain())) {
            throw new BusinessException(ResultCode.DATA_DUPLICATE, "子域名已存在");
        }

        // 设置默认值
        if (company.getPlanType() == null) {
            company.setPlanType(PlanType.FREE);
        }
        if (company.getStatus() == null) {
            company.setStatus(CompanyStatus.TRIAL);
        }

        Company savedCompany = companyRepository.save(company);
        log.info("创建公司成功: {}", savedCompany.getName());
        return savedCompany;
    }

    /**
     * 更新公司信息
     */
    @Transactional
    public Company updateCompany(Integer id, Company companyUpdate) {
        Company existingCompany = getCompanyById(id);

        // 验证公司名称唯一性(排除自己)
        if (!existingCompany.getName().equals(companyUpdate.getName()) &&
            companyRepository.existsByName(companyUpdate.getName())) {
            throw new BusinessException(ResultCode.DATA_DUPLICATE, "公司名称已存在");
        }

        // 更新字段
        existingCompany.setName(companyUpdate.getName());
        existingCompany.setSubdomain(companyUpdate.getSubdomain());
        existingCompany.setPlanType(companyUpdate.getPlanType());
        existingCompany.setMaxUsers(companyUpdate.getMaxUsers());
        existingCompany.setMaxArticlesPerMonth(companyUpdate.getMaxArticlesPerMonth());
        existingCompany.setDefaultSettings(companyUpdate.getDefaultSettings());

        Company savedCompany = companyRepository.save(existingCompany);
        log.info("更新公司信息成功: {}", savedCompany.getName());
        return savedCompany;
    }

    /**
     * 更新公司状态
     */
    @Transactional
    public Company updateCompanyStatus(Integer id, CompanyStatus status) {
        Company company = getCompanyById(id);
        company.setStatus(status);

        Company savedCompany = companyRepository.save(company);
        log.info("更新公司状态成功: {} -> {}", savedCompany.getName(), status);
        return savedCompany;
    }

    /**
     * 升级公司套餐
     */
    @Transactional
    public Company upgradePlan(Integer id, PlanType planType, Integer maxUsers, Integer maxArticles) {
        Company company = getCompanyById(id);

        company.setPlanType(planType);
        company.setMaxUsers(maxUsers);
        company.setMaxArticlesPerMonth(maxArticles);
        company.setStatus(CompanyStatus.ACTIVE);

        Company savedCompany = companyRepository.save(company);
        log.info("升级公司套餐成功: {} -> {}", savedCompany.getName(), planType);
        return savedCompany;
    }

    /**
     * 延长试用期
     */
    @Transactional
    public Company extendTrial(Integer id, LocalDate newExpiryDate) {
        Company company = getCompanyById(id);

        if (company.getStatus() != CompanyStatus.TRIAL) {
            throw new BusinessException(ResultCode.BUSINESS_ERROR, "只有试用状态的公司才能延长试用期");
        }

        company.setTrialExpiryDate(newExpiryDate);

        Company savedCompany = companyRepository.save(company);
        log.info("延长试用期成功: {} -> {}", savedCompany.getName(), newExpiryDate);
        return savedCompany;
    }

    /**
     * 删除公司(软删除)
     */
    @Transactional
    public void deleteCompany(Integer id) {
        Company company = getCompanyById(id);
        company.setStatus(CompanyStatus.SUSPENDED);
        companyRepository.save(company);
        log.info("删除公司成功: {}", company.getName());
    }

    /**
     * 查找试用期即将过期的公司
     */
    public List<Company> findTrialExpiringSoon(int days) {
        LocalDate expiredDate = LocalDate.now().plusDays(days);
        return companyRepository.findByStatusAndTrialExpiryDateBefore(CompanyStatus.TRIAL, expiredDate);
    }

    /**
     * 获取活跃公司数量
     */
    public long getActiveCompanyCount() {
        return companyRepository.countByStatus(CompanyStatus.ACTIVE);
    }

    /**
     * 检查子域名是否可用
     */
    public boolean isSubdomainAvailable(String subdomain) {
        return !companyRepository.existsBySubdomain(subdomain);
    }

    /**
     * 搜索公司
     */
    public Page<Company> searchCompanies(String name, String status, String planType, Pageable pageable) {
        return companyRepository.searchCompanies(name, status, planType, pageable);
    }

    /**
     * 获取所有公司
     */
    public List<Company> getAllCompanies() {
        return companyRepository.findAll();
    }

    /**
     * 获取活跃公司列表
     */
    public List<Company> getActiveCompanies() {
        return companyRepository.findByStatus(CompanyStatus.ACTIVE);
    }

    /**
     * 检查子域名是否存在
     */
    public boolean existsBySubdomain(String subdomain) {
        return companyRepository.existsBySubdomain(subdomain);
    }

    /**
     * 保存公司
     */
    @Transactional
    public Company saveCompany(@Valid Company company) {
        return companyRepository.save(company);
    }

    /**
     * 批量更新状态
     */
    @Transactional
    public int batchUpdateStatus(@NotNull List<Integer> ids, @NotNull String status) {
        return companyRepository.updateStatusByIds(ids, status);
    }

    /**
     * 检查公司是否存在
     */
    public boolean existsById(@NotNull Integer id) {
        return companyRepository.existsById(id);
    }

    /**
     * 检查公司是否有关联用户
     */
    public boolean hasAssociatedUsers(@NotNull Integer id) {
        // 这里需要根据实际业务逻辑实现
        // 比如检查用户表中是否有属于该公司的用户
        return false; // 示例实现,需要根据实际需求修改
    }

    /**
     * 根据关键词搜索公司
     */
    public List<Company> searchByKeyword(@NotNull String keyword, int limit) {
        if (!StringUtils.hasText(keyword)) {
            return List.of();
        }
        return companyRepository.findByNameContainingOrSubdomainContainingIgnoreCase(keyword, keyword);
    }
}