← Назад к вопросам

Как генерируется заявка по отчету в текущем проекте

1.3 Junior🔥 91 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Генерация заявок по отчету

Процесс создания заявки на основе отчета обычно включает несколько этапов и может быть реализован разными способами в зависимости от архитектуры приложения.

1. Основной процесс

В типичной системе:

  1. Анализ отчета — парсирование данных отчета (PDF, Excel, JSON)
  2. Валидация — проверка корректности и полноты данных
  3. Трансформация — преобразование данных в формат заявки
  4. Сохранение — запись в БД с установкой начального статуса
  5. Уведомление — отправка сигнала о новой заявке

2. Пример реализации

@Service
public class RequestGenerationService {
    
    private final RequestRepository requestRepository;
    private final ReportParser reportParser;
    private final RequestValidator requestValidator;
    private final NotificationService notificationService;
    
    @Transactional
    public RequestResponse generateRequestFromReport(ReportFile reportFile) {
        // 1. Парсирование отчета
        ReportData reportData = reportParser.parse(reportFile);
        
        // 2. Валидация
        ValidationResult validation = requestValidator.validate(reportData);
        if (!validation.isValid()) {
            throw new InvalidReportException(validation.getErrors());
        }
        
        // 3. Трансформация в заявку
        Request request = new Request();
        request.setTitle(reportData.getTitle());
        request.setDescription(reportData.getDescription());
        request.setAmount(reportData.getAmount());
        request.setStatus(RequestStatus.CREATED);
        request.setCreatedAt(LocalDateTime.now(ZoneId.of("UTC")));
        request.setSource(RequestSource.REPORT);
        
        // 4. Сохранение
        Request savedRequest = requestRepository.save(request);
        
        // 5. Уведомление
        notificationService.notifyNewRequest(savedRequest);
        
        return mapToResponse(savedRequest);
    }
}

3. Слои архитектуры

Domain — бизнес-логика:

public class Request {
    private UUID id;
    private String title;
    private String description;
    private BigDecimal amount;
    private RequestStatus status;
    private RequestSource source;
    private LocalDateTime createdAt;
    
    // Методы бизнес-логики
    public void markAsProcessed() {
        this.status = RequestStatus.PROCESSED;
    }
}

public enum RequestSource {
    REPORT, API, MANUAL
}

Application — use case:

public interface GenerateRequestFromReportUseCase {
    RequestResponse execute(ReportFile reportFile);
}

Infrastructure — работа с БД:

@Repository
public interface RequestRepository extends JpaRepository<Request, UUID> {
    List<Request> findBySource(RequestSource source);
}

4. Обработка ошибок

@Service
public class RequestGenerationService {
    
    @Transactional
    public RequestResponse generateRequestFromReport(ReportFile reportFile) {
        try {
            // процесс генерации
        } catch (FileNotFoundException e) {
            throw new ReportProcessingException("Отчет не найден", e);
        } catch (IOException e) {
            throw new ReportProcessingException("Ошибка чтения отчета", e);
        } catch (ValidationException e) {
            // Пробрасываем дальше — обработаем на уровне контроллера
            throw e;
        }
    }
}

@RestController
@RequestMapping("/api/v1/requests")
public class RequestController {
    
    @PostMapping("/from-report")
    public ResponseEntity<?> generateFromReport(
        @RequestParam MultipartFile report) {
        try {
            RequestResponse response = requestGenerationService
                .generateRequestFromReport(new ReportFile(report));
            return ResponseEntity.status(HttpStatus.CREATED).body(response);
        } catch (ValidationException e) {
            return ResponseEntity.badRequest()
                .body(new ErrorResponse("Некорректный отчет: " + e.getMessage()));
        } catch (ReportProcessingException e) {
            return ResponseEntity.internalServerError()
                .body(new ErrorResponse("Ошибка обработки: " + e.getMessage()));
        }
    }
}

5. Асинхронная генерация

Для больших отчетов лучше использовать асинхронную обработку:

@Service
public class AsyncRequestGenerationService {
    
    @Async
    public CompletableFuture<RequestResponse> generateAsync(ReportFile report) {
        try {
            RequestResponse response = generateRequestFromReport(report);
            return CompletableFuture.completedFuture(response);
        } catch (Exception e) {
            return CompletableFuture.failedFuture(e);
        }
    }
}

Этот подход обеспечивает масштабируемость и надежность при работе с отчетами.

Как генерируется заявка по отчету в текущем проекте | PrepBro