Java · 45 строк
Раз в 10 минут приходит пачка принятых возвратов: позиции из разных заказов, бывает по 3–4 позиции одного заказа. Сервис возвращает деньги через платёжный шлюз в пуле на 8 потоков и считает сумму возвратов по продавцу за день.
Если пачка упала, её обрабатывают повторно целиком. Отметьте строки с ошибками.
В работе: Возвраты денег покупателям: ошибка здесь — либо деньги не вернулись, либо вернулись дважды.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах Wildberries: возвраты товаров и денег. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
@Servicepublic class RefundService {private final OrderRepository orders;private final PaymentGateway gateway;private final ExecutorService pool = Executors.newFixedThreadPool(8);private final Map<Long, BigDecimal> refundedToday = new ConcurrentHashMap<>();public RefundService(OrderRepository orders, PaymentGateway gateway) {this.orders = orders;this.gateway = gateway;}public List<RefundResult> processReturns(List<ReturnItem> items) {List<Future<RefundResult>> futures = new ArrayList<>();for (ReturnItem item : items) {futures.add(pool.submit(() -> refund(item)));}List<RefundResult> results = new ArrayList<>();for (Future<RefundResult> f : futures) {try {results.add(f.get());} catch (Exception e) {results.add(RefundResult.failed());}}return results;}private RefundResult refund(ReturnItem item) {Order order = orders.findById(item.getOrderId());BigDecimal amount = order.getItemPrice(item.getSku()).multiply(BigDecimal.valueOf(item.getQuantity()));if (order.getRefunded().add(amount).compareTo(order.getTotal()) > 0) {return RefundResult.rejected("Сумма возврата больше суммы заказа");}if (amount.equals(BigDecimal.ZERO)) {return RefundResult.rejected("Нулевая сумма");}gateway.refund(order.getPaymentId(), amount);order.setRefunded(order.getRefunded().add(amount));orders.save(order);refundedToday.merge(order.getSellerId(), amount, BigDecimal::add);return RefundResult.ok(amount);}}