Статья удалена

Этот материал был удалён по просьбе автора.

import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.context.annotation.Scope
import org.springframework.stereotype.Component
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

// Enum для типов отчетов
enum class ReportType {
SALARY, EMPLOYEE
}

// Enum для форматов файлов
enum class FileFormat {
PDF, DOCX
}

// Интерфейс отчетов
interface Report {
fun saveToFile(path: String, creator: FileCreator)
}

// Отчёт о зарплате
@Component
@Scope("prototype")
class SalaryReport(private val rawData: String) : Report {
override fun saveToFile(path: String, creator: FileCreator) {
creator.create("Salary header. $rawData", path)
}
}

// Отчёт о сотрудниках
@Component
@Scope("prototype")
class EmployeeReport(private val rawData: String) : Report {
override fun saveToFile(path: String, creator: FileCreator) {
creator.create("Employee header. $rawData", path)
}
}

// Интерфейс создателей файлов
interface FileCreator {
fun create(rawData: String, path: String)
}

// Создатель PDF-файлов
@Component
class PdfFileCreator : FileCreator {
private val logger: Logger = LoggerFactory.getLogger(PdfFileCreator::class.java)

override fun create(rawData: String, path: String) {
logger.info("Сохранение файла $path.pdf. Данные: $rawData")
}
}

// Создатель DOCX-файлов
@Component
class DocxFileCreator : FileCreator {
private val logger: Logger = LoggerFactory.getLogger(DocxFileCreator::class.java)

override fun create(rawData: String, path: String) {
logger.info("Сохранение файла $path.docx. Данные: $rawData")
}
}

// Фабрика отчетов
@Component
class ReportFactory {
fun createReport(type: ReportType, rawData: String): Report {
return when (type) {
ReportType.SALARY -> SalaryReport(rawData)
ReportType.EMPLOYEE -> EmployeeReport(rawData)
}
}
}

// Фабрика создателей файлов
@Component
class FileCreatorFactory(
private val pdfCreator: PdfFileCreator,
private val docxCreator: DocxFileCreator
) {
fun getCreator(format: FileFormat): FileCreator {
return when (format) {
FileFormat.PDF -> pdfCreator
FileFormat.DOCX -> docxCreator
}
}
}

// Сервис для генерации отчетов
@Component
class ReportService(
private val reportFactory: ReportFactory,
private val fileCreatorFactory: FileCreatorFactory
) {
private val logger: Logger = LoggerFactory.getLogger(ReportService::class.java)

fun generateReport(reportType: ReportType, fileFormat: FileFormat, rawData: String, path: String) {
val report = reportFactory.createReport(reportType, rawData)
val creator = fileCreatorFactory.getCreator(fileFormat)

logger.info("Генерация отчета типа $reportType в формате $fileFormat")
report.saveToFile(path, creator)
}
}

// Контроллер
@RestController
class ReportController(private val reportService: ReportService) {

@GetMapping("/create-report")
fun createReport(
@RequestParam reportType: ReportType,
@RequestParam fileFormat: FileFormat,
@RequestParam rawData: String,
@RequestParam path: String
) {
reportService.generateReport(reportType, fileFormat, rawData, path)
}
}

Комментарий недоступен