ng-tracker/src/main/java/ru/ulstu/students/service/SchedulerService.java
Anton Romanov 36c4e52e37 Merge branch 'dev' into move-to-jdk11
# Conflicts:
#	src/main/java/ru/ulstu/conference/service/ConferenceService.java
#	src/main/java/ru/ulstu/grant/model/Grant.java
#	src/main/java/ru/ulstu/grant/service/GrantService.java
#	src/main/java/ru/ulstu/paper/model/Paper.java
#	src/main/java/ru/ulstu/paper/service/PaperService.java
#	src/main/java/ru/ulstu/project/model/Project.java
#	src/main/java/ru/ulstu/project/model/ProjectDto.java
#	src/main/java/ru/ulstu/students/model/Task.java
#	src/main/java/ru/ulstu/students/service/TaskService.java
#	src/main/java/ru/ulstu/timeline/model/Event.java
#	src/main/java/ru/ulstu/timeline/model/EventDto.java
#	src/main/java/ru/ulstu/timeline/service/EventService.java
#	src/main/java/ru/ulstu/user/service/UserService.java
#	src/main/resources/application.properties
#	src/main/resources/db/changelog-master.xml
#	src/main/resources/public/css/conference.css
#	src/main/resources/public/js/conference.js
#	src/main/resources/public/js/tasks.js
#	src/main/resources/templates/conferences/conference.html
#	src/main/resources/templates/grants/grant.html
#	src/main/resources/templates/papers/paper.html
2019-06-21 04:22:06 +04:00

117 lines
3.5 KiB
Java

package ru.ulstu.students.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.ulstu.students.model.Scheduler;
import ru.ulstu.students.model.Task;
import ru.ulstu.students.repository.SchedulerRepository;
import ru.ulstu.tags.model.Tag;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Service
public class SchedulerService {
private final TaskService taskService;
private final SchedulerRepository schedulerRepository;
public SchedulerService(TaskService taskService, SchedulerRepository schedulerRepository) {
this.taskService = taskService;
this.schedulerRepository = schedulerRepository;
}
private void save(Tag tag) {
List<Task> taskList = taskService.findTasksByTag(tag);
create(taskList.get(0));
}
@Transactional
private Scheduler create(Task task) {
Scheduler scheduler = new Scheduler(task, task.getDeadlines().get(task.getDeadlines().size() - 1).getDate());
return schedulerRepository.save(scheduler);
}
@Transactional
private void delete(Integer schedulerId) {
if (schedulerRepository.existsById(schedulerId)) {
schedulerRepository.deleteById(schedulerId);
}
}
public void checkPlanToday() {
List<Scheduler> schedulerList = schedulerRepository.findAll();
if (!schedulerList.isEmpty()) {
doTodayPlanIfNeed(schedulerList);
schedulerList = schedulerRepository.findAll();
}
checkNewPlan(schedulerList);
}
private void checkNewPlan(List<Scheduler> schedulerList) {
Set<Tag> tags = taskService.checkRepeatingTags(true);
Set<Tag> newTags = null;
if (!schedulerList.isEmpty()) {
newTags = checkNewTags(tags, schedulerList);
} else {
if (!tags.isEmpty()) {
newTags = tags;
}
}
if (newTags != null) {
newTags.forEach(tag -> {
if (!hasNewTag(tag, schedulerList)) {
save(tag);
Task task = taskService.findTasksByTag(tag).get(0);
schedulerList.add(new Scheduler(task, task.getDeadlines().get(task.getDeadlines().size() - 1).getDate()));
}
});
}
}
private boolean hasNewTag(Tag tag, List<Scheduler> schedulerList) {
return schedulerList
.stream()
.anyMatch(scheduler -> scheduler.getTask().getTags().contains(tag));
}
private Set<Tag> checkNewTags(Set<Tag> tags, List<Scheduler> schedulerList) {
Set<Tag> newTags = tags
.stream()
.filter(tag -> schedulerList
.stream()
.anyMatch(scheduler ->
!scheduler.getTask().getTags().contains(tag)))
.collect(Collectors.toSet());
if (!newTags.isEmpty()) {
return newTags;
}
return null;
}
private void doTodayPlanIfNeed(List<Scheduler> schedulerList) {
List<Scheduler> plan = schedulerList
.stream()
.filter(scheduler -> scheduler.getDate().before(new Date()))
.collect(Collectors.toList());
doToday(plan);
}
private void doToday(List<Scheduler> plan) {
plan.forEach(scheduler -> {
taskService.createPeriodTask(scheduler);
delete(scheduler.getId());
});
}
}