package services import ( "errors" "git.beifan.cn/trace-system/backend-go/database" "git.beifan.cn/trace-system/backend-go/models" ) // CompaniesService 企业管理服务 type CompaniesService struct{} // FindAll 获取所有企业列表 func (s *CompaniesService) FindAll(page int, limit int, search string) ([]models.Company, int, int, error) { var companies []models.Company var total int64 offset := (page - 1) * limit db := database.DB // 搜索条件 if search != "" { db = db.Where("company_name LIKE ?", "%"+search+"%") } // 获取总数 db.Count(&total) // 分页查询 result := db.Order("created_at DESC").Offset(offset).Limit(limit).Find(&companies) if result.Error != nil { return nil, 0, 0, errors.New("查询企业列表失败") } totalPages := (int(total) + limit - 1) / limit return companies, int(total), totalPages, nil } // Create 创建企业 func (s *CompaniesService) Create(companyName string) (*models.Company, error) { // 检查企业是否已存在 var existingCompany models.Company result := database.DB.Where("company_name = ?", companyName).First(&existingCompany) if result.Error == nil { return nil, errors.New("企业名称已存在") } company := models.Company{ CompanyName: companyName, IsActive: true, } result = database.DB.Create(&company) if result.Error != nil { return nil, errors.New("创建企业失败") } return &company, nil } // Update 更新企业信息 func (s *CompaniesService) Update(companyName string, newCompanyName string, isActive bool) (*models.Company, error) { var company models.Company result := database.DB.Where("company_name = ?", companyName).First(&company) if result.Error != nil { return nil, errors.New("企业不存在") } // 如果企业名称已变更,检查新名称是否已存在 if newCompanyName != companyName { var existingCompany models.Company checkResult := database.DB.Where("company_name = ?", newCompanyName).First(&existingCompany) if checkResult.Error == nil { return nil, errors.New("企业名称已存在") } company.CompanyName = newCompanyName } company.IsActive = isActive result = database.DB.Save(&company) if result.Error != nil { return nil, errors.New("更新企业信息失败") } return &company, nil } // Delete 删除企业 func (s *CompaniesService) Delete(companyName string) error { var company models.Company result := database.DB.Where("company_name = ?", companyName).First(&company) if result.Error != nil { return errors.New("企业不存在") } // 检查企业是否有关联的序列号 var serialCount int64 database.DB.Model(&models.Serial{}).Where("company_name = ?", companyName).Count(&serialCount) if serialCount > 0 { return errors.New("企业下还有序列号,无法删除") } result = database.DB.Delete(&company) if result.Error != nil { return errors.New("删除企业失败") } return nil } // GetStatsOverview 获取企业统计概览 func (s *CompaniesService) GetStatsOverview() (*models.CompanyStatsOverviewDTO, error) { stats := &models.CompanyStatsOverviewDTO{} if err := database.DB.Model(&models.Company{}).Count(&stats.TotalCompanies).Error; err != nil { return nil, errors.New("统计企业总数失败") } if err := database.DB.Model(&models.Company{}).Where("is_active = ?", true).Count(&stats.ActiveCompanies).Error; err != nil { return nil, errors.New("统计启用企业数量失败") } stats.InactiveCompanies = stats.TotalCompanies - stats.ActiveCompanies if err := database.DB.Model(&models.Serial{}).Count(&stats.TotalSerials).Error; err != nil { return nil, errors.New("统计企业赋码总数失败") } if err := database.DB.Model(&models.Serial{}).Where("is_active = ?", true).Count(&stats.ActiveSerials).Error; err != nil { return nil, errors.New("统计有效企业赋码数量失败") } stats.RevokedSerials = stats.TotalSerials - stats.ActiveSerials if err := database.DB.Model(&models.EmployeeSerial{}).Count(&stats.TotalEmployeeSerials).Error; err != nil { return nil, errors.New("统计员工赋码总数失败") } if err := database.DB.Model(&models.EmployeeSerial{}).Where("is_active = ?", true).Count(&stats.ActiveEmployeeSerials).Error; err != nil { return nil, errors.New("统计有效员工赋码数量失败") } stats.RevokedEmployeeSerials = stats.TotalEmployeeSerials - stats.ActiveEmployeeSerials return stats, nil }