कोड वाचा आणि चुका हायलाइट करा /** * खरेदी केलेल्या तिकीटासह ग्राहक विशिष्ट जागा अतिरिक्त शुल्क घेऊन निवडू शकतो. * जागांची मूलभूत किंमत टैरिफ्सद्वारे निर्धारित केली जाते (बाह्य सेवा). * विशिष्ट टैरिफ्ससाठी (PREMIUM, ULTRA) पेमेंट करताना सवलत आवश्यक आहे. * बुकिंग करताना, ग्राहकाला पेमेंटसाठी इनव्हॉइस दिला जातो. पेमेंट व्यवस्थापन बाह्य सेवेने केले जाते. */ @Service public class SeatBookingService { @Autowired private SeatBookingRepository seatBookingRepository; @Autowired private TicketRepository ticketRepository; @Autowired private TariffClient tariffClient; @Autowired private CustomerClient customerClient; @Autowired private PaymentClient paymentClient; /** * बुकिंग. * @param seatCode जागेचा कोड (उदा. 19A) * @param ticketId तिकीट ID */ @Transactional public void bookSeat(String seatCode, UUID ticketId) { var ticket = ticketRepository.findById(ticketId); // बुक करतो var seatBooking = new SeatBooking(seatCode, ticket.get().getFlightId(), ticketId, BookingStatus.BOOKED); seatBookingRepository.save(seatBooking); // निवडलेल्या विमानातील जागेसाठी मूलभूत किंमत शोधतो var basePrice = tariffClient.getBasePrice(ticket.get().getPlaneModel(), seatCode); // ग्राहकाची माहिती शोधतो Long userId = (Long) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); var userData = customerClient.getCustomer(userId); System.out.println("आढळलेला वापरकर्ता " + userData.getFio() + " कागदाचा क्रमांक " + userData.getDocument()); var price = basePrice; if (userData.getTariff() == "PREMIUM") { // 50% सवलत price = basePrice * 0.5d; } if (userData.getTariff() == "ULTRA") { // 20% सवलत price = basePrice * 0.8d; } var invoice = new Invoice(price, ticketId, userId); // इनव्हॉइस पाठवतो paymentClient.sendInvoice(invoice); System.out.println("इनव्हॉइस पाठवला"); } @Data @Table("seat_booking") public class SeatBooking { @Column private String seatCode; @Column private UUID flightId; @Column private UUID ticketId; @Column private BookingStatus status; } public enum BookingStatus { BOOKED, PAID; }
sobes.tech AI
პასუხი AI-სგან
В представленном коде есть несколько ошибок и потенциальных проблем:
-
Неправильное сравнение строк: В Java строки нельзя сравнивать через
==, нужно использовать метод.equals(). В коде:if (userData.getTariff() == "PREMIUM") { //... }нужно заменить на:
if ("PREMIUM".equals(userData.getTariff())) { //... }Аналогично для "ULTRA".
-
Отсутствие проверки наличия билета:
ticketRepository.findById(ticketId)возвращает Optional, но сразу вызываетсяticket.get()без проверки, что билет существует. Это может привести кNoSuchElementException. Нужно проверить наличие:var ticketOpt = ticketRepository.findById(ticketId); if (ticketOpt.isEmpty()) { throw new IllegalArgumentException("Ticket not found"); } var ticket = ticketOpt.get(); -
Получение userId из SecurityContext: Приведение
getPrincipal()кLongможет быть неверным, так как обычно там хранится объект UserDetails или другой тип. Нужно привести к правильному типу или получить ID другим способом. -
Отсутствие обработки ошибок внешних сервисов: Вызовы
tariffClient.getBasePrice(),customerClient.getCustomer(),paymentClient.sendInvoice()могут выбрасывать исключения или возвращать null, что не обрабатывается. -
Отсутствие логирования: Использование
System.out.printlnне рекомендуется в продакшене, лучше использовать логгер. -
Отсутствие проверки доступности места: Нет проверки, что место с
seatCodeсвободно для бронирования. -
Отсутствие обновления статуса после оплаты: В коде нет логики изменения статуса бронирования с BOOKED на PAID.
Пример исправления сравнения строк:
if ("PREMIUM".equals(userData.getTariff())) {
price = basePrice * 0.5d;
}
if ("ULTRA".equals(userData.getTariff())) {
price = basePrice * 0.8d;
}