Был один лайнкондинг.
Задача 1. Провести review.
/*
* Сервис тарификации вознаграждений сотрудникам за дополнительную работу.
*
* Каждый сотрудник может выполнять что-либо помимо основной работы: проводить лекции, выступать на конференциях и т.д.
* Такие действия оплачиваются согласно тарифам, с учетом заслуг сотрудника (личного бонусного коэффициента).
* Оплата проходит через внешний сервис, вызываемый по REST.
*/
@Service
public class RewardBillingService {
@Autowired
private RewardRepository rewardRepository;
@Autowired
private TariffRepository tariffRepository;
@Autowired
private RewardRestClient rewardRestClient;
@Transactional
public void handleRewards(List<Employee> employees) {
for (Employee employee : employees) {
List<Reward> rewards = rewardRepository.findByEmployeeId(employee.getId());
for (Reward reward : rewards) {
if (List.of("speech", "lesson", "help").contains(reward.getType())) {
Tariff tariff = tariffRepository.findByTypeAndDate(reward.getType(), new Date()).get();
double amount = (1 + employee.getBonusCoefficient()) * tariff.getAmount();
rewardRestClient.payReward(employee.getId(), amount);
System.out.println("Отправлен платёж");
reward.setStatus("paid");
rewardRepository.save(reward);
}
}
}
}
}
- Задача 2. Написать SQL-запросы.
-- Выбери профили, у которых больше 10 постов
-- Выбери все посты, опубликованные пользователями, у которых количество подписчиков больше 500
CREATE TABLE profile (
id BIGSERIAL PRIMARY KEY,
nickname VARCHAR,
registered_at TIMESTAMP
);
CREATE TABLE post (
id BIGSERIAL PRIMARY KEY,
owner_id BIGINT REFERENCES profile (id),
body TEXT,
inserted_at TIMESTAMP,
likes_count INT -- кол-во лайков
);
CREATE TABLE subscription_count (
profile_id BIGINT REFERENCES profile (id) UNIQUE,
followers_count INT, -- кол-во подписчиков
following_count INT -- кол-во подписок
);
- Задача 3. Что выведет программа?
String a = "123";
String b = "123";
String c = new String("123");
System.out.println(a == b)
System.out.println(a == c);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
- Задача 4. Провести review.
@Service
public class ConfirmDocService {
@Autowired
ConfirmDocMapper confirmDocMapper;
@Autowired
ConfirmDocRepository confirmDocRepository;
@Autowired
ConfirmDocStateMachineService confirmDocStateMachineService;
@Autowired
StateMachineFactory<DocStatusState, DocStatusEvent> confirmDocStateMachineFactory;
@Transactional
public ConfirmDocDto createConfirmDoc(ConfirmDocDto confirm DocDto) {
ConfirmDoc confirmDoc = confirmDocMapper.toEntity(confirmDocDto);
StateMachine <DocStatusState, DocStatusEvent> sm = confirmDocStateMachineFactory.getStateMachine();
sm.getExtendedState().getVariables().put("CONFIRM_DOC_TO_BE_SAVED", confirmDoc);
sm.start();
confirmDoc.setDocStatusId(sm.getState().getId());
ConfirmDoc savedConfirmDoc = saveOrUpdate(confirmDoc);
return confirmDocMapper.toDto(savedConfirmDoc);
}
@Transactional
public ConfirmDoc saveOrUpdate(ConfirmDoc confirmDoc) {
if (confirmDocRepository.findAll().stream().filter(it -> it.id == confirmDoc.Id).count() == 1) {
ConfirmDoc confirmDocFromDb = confirmDocRepository.findById(confirmDoc.Id);
ConfirmDoc updConfirmDoc = confirmDocMapper.update(confirmDocFromDb, confirmDoc);
return confirmDocRepository.save(confirmDoc);
} else {
return confirmDocRepository.save(confirmDoc);
}
}
}
- Задача 5. Какие проблемы в коде видишь? Можно ли как-то поправить?
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Increment {
private static int counter1 = 0;
private static int counter2 = 0;
public static void main(String[] args) throws InterruptedException {
int tasksCount = 100_000;
CountDownLatch latch = new CountDownLatch(tasksCount);
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < tasksCount; i++) {
executor.submit(() -> {
counter1++;
counter2++;
latch.countDown();
});
}
latch.await();
executor.shutdown();
System.out.println(counter1);
System.out.println(counter2);
System.exit(0);
}
}