← Назад к вопросам
Как генерируется заявка по отчету в текущем проекте
1.3 Junior🔥 91 комментариев
#Soft Skills и карьера
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Генерация заявок по отчету
Процесс создания заявки на основе отчета обычно включает несколько этапов и может быть реализован разными способами в зависимости от архитектуры приложения.
1. Основной процесс
В типичной системе:
- Анализ отчета — парсирование данных отчета (PDF, Excel, JSON)
- Валидация — проверка корректности и полноты данных
- Трансформация — преобразование данных в формат заявки
- Сохранение — запись в БД с установкой начального статуса
- Уведомление — отправка сигнала о новой заявке
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);
}
}
}
Этот подход обеспечивает масштабируемость и надежность при работе с отчетами.