@ -4,19 +4,29 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Sort ;
import org.springframework.data.domain.Sort ;
import org.springframework.stereotype.Service ;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Transactional ;
import org.springframework.transaction.annotation.Transactional ;
import ru.ulstu.core.util.DateUtils ;
import ru.ulstu.deadline.model.Deadline ;
import ru.ulstu.deadline.service.DeadlineService ;
import ru.ulstu.deadline.service.DeadlineService ;
import ru.ulstu.students.model.Scheduler ;
import ru.ulstu.students.model.Task ;
import ru.ulstu.students.model.Task ;
import ru.ulstu.students.model.TaskDto ;
import ru.ulstu.students.model.TaskDto ;
import ru.ulstu.students.model.TaskFilterDto ;
import ru.ulstu.students.model.TaskFilterDto ;
import ru.ulstu.students.repository.SchedulerRepository ;
import ru.ulstu.students.repository.TaskRepository ;
import ru.ulstu.students.repository.TaskRepository ;
import ru.ulstu.tags.model.Tag ;
import ru.ulstu.tags.model.Tag ;
import ru.ulstu.tags.service.TagService ;
import ru.ulstu.tags.service.TagService ;
import ru.ulstu.timeline.service.EventService ;
import ru.ulstu.timeline.service.EventService ;
import java.io.IOException ;
import java.io.IOException ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Arrays ;
import java.util.Calendar ;
import java.util.Date ;
import java.util.Date ;
import java.util.List ;
import java.util.List ;
import java.util.Map ;
import java.util.Set ;
import java.util.TreeMap ;
import java.util.stream.Collectors ;
import static org.springframework.util.ObjectUtils.isEmpty ;
import static org.springframework.util.ObjectUtils.isEmpty ;
import static ru.ulstu.core.util.StreamApiUtils.convert ;
import static ru.ulstu.core.util.StreamApiUtils.convert ;
@ -28,16 +38,19 @@ public class TaskService {
private final static int MAX_DISPLAY_SIZE = 40 ;
private final static int MAX_DISPLAY_SIZE = 40 ;
private final TaskRepository taskRepository ;
private final TaskRepository taskRepository ;
private final SchedulerRepository schedulerRepository ;
private final DeadlineService deadlineService ;
private final DeadlineService deadlineService ;
private final TagService tagService ;
private final TagService tagService ;
private final EventService eventService ;
private final EventService eventService ;
public TaskService ( TaskRepository taskRepository ,
public TaskService ( TaskRepository taskRepository ,
DeadlineService deadlineService , TagService tagService , EventService eventService ) {
DeadlineService deadlineService , TagService tagService , SchedulerRepository schedulerRepository , EventService eventService ) {
this . taskRepository = taskRepository ;
this . taskRepository = taskRepository ;
this . deadlineService = deadlineService ;
this . deadlineService = deadlineService ;
this . tagService = tagService ;
this . tagService = tagService ;
this . eventService = eventService ;
this . eventService = eventService ;
this . schedulerRepository = schedulerRepository ;
}
}
public List < Task > findAll ( ) {
public List < Task > findAll ( ) {
@ -97,6 +110,11 @@ public class TaskService {
@Transactional
@Transactional
public void delete ( Integer taskId ) throws IOException {
public void delete ( Integer taskId ) throws IOException {
if ( taskRepository . exists ( taskId ) ) {
if ( taskRepository . exists ( taskId ) ) {
Task scheduleTask = taskRepository . findOne ( taskId ) ;
Scheduler sch = schedulerRepository . findOneByTask ( scheduleTask ) ;
if ( sch ! = null ) {
schedulerRepository . delete ( sch . getId ( ) ) ;
}
taskRepository . delete ( taskId ) ;
taskRepository . delete ( taskId ) ;
}
}
@ -110,6 +128,110 @@ public class TaskService {
}
}
}
}
public void copyMainPart ( Task newTask , Task task ) {
newTask . setTitle ( task . getTitle ( ) ) ;
newTask . setTags ( tagService . saveOrCreate ( task . getTags ( ) ) ) ;
newTask . setCreateDate ( new Date ( ) ) ;
newTask . setStatus ( Task . TaskStatus . LOADED_FROM_KIAS ) ;
}
public Task copyTaskWithNewDates ( Task task ) {
Task newTask = new Task ( ) ;
copyMainPart ( newTask , task ) ;
Calendar cal1 = DateUtils . getCalendar ( newTask . getCreateDate ( ) ) ;
Calendar cal2 = DateUtils . getCalendar ( task . getCreateDate ( ) ) ;
Integer interval = cal1 . get ( Calendar . DAY_OF_YEAR ) - cal2 . get ( Calendar . DAY_OF_YEAR ) ;
newTask . setDeadlines ( newDatesDeadlines ( task . getDeadlines ( ) , interval ) ) ;
return newTask ;
}
private List < Deadline > newDatesDeadlines ( List < Deadline > deadlines , Integer interval ) {
return deadlines
. stream ( )
. map ( deadline - > {
Deadline newDeadline = new Deadline ( ) ;
Date newDate = DateUtils . addDays ( deadline . getDate ( ) , interval ) ;
newDeadline . setDescription ( deadline . getDescription ( ) ) ;
newDeadline . setDate ( newDate ) ;
return deadlineService . create ( newDeadline ) ;
} ) . collect ( Collectors . toList ( ) ) ;
}
public Task copyTaskWithNewYear ( Task task ) {
Task newTask = new Task ( ) ;
copyMainPart ( newTask , task ) ;
newTask . setDeadlines ( newYearDeadlines ( task . getDeadlines ( ) ) ) ;
return newTask ;
}
private List < Deadline > newYearDeadlines ( List < Deadline > deadlines ) {
return deadlines
. stream ( )
. map ( deadline - > {
Deadline newDeadline = new Deadline ( ) ;
newDeadline . setDescription ( deadline . getDescription ( ) ) ;
newDeadline . setDate ( DateUtils . addYears ( deadline . getDate ( ) , 1 ) ) ;
return deadlineService . create ( newDeadline ) ;
} ) . collect ( Collectors . toList ( ) ) ;
}
private boolean equalsDate ( Task task ) {
Calendar taskDate = DateUtils . getCalendar ( task . getCreateDate ( ) ) ;
Calendar nowDate = DateUtils . getCalendar ( new Date ( ) ) ;
return ( taskDate . get ( Calendar . DAY_OF_MONTH ) = = nowDate . get ( Calendar . DAY_OF_MONTH ) & &
taskDate . get ( Calendar . MONTH ) + 1 = = nowDate . get ( Calendar . MONTH ) + 1 & &
taskDate . get ( Calendar . YEAR ) + 1 = = nowDate . get ( Calendar . YEAR ) ) ;
}
@Transactional
public void generateYearTasks ( ) {
Set < Tag > tags = checkRepeatingTags ( false ) ;
List < Task > tasks = new ArrayList < > ( ) ;
tags . forEach ( tag - > {
Task singleTask = findTasksByTag ( tag ) . get ( 0 ) ;
if ( equalsDate ( singleTask ) ) {
if ( ! tasks . contains ( singleTask ) ) {
tasks . add ( singleTask ) ;
}
}
} ) ;
if ( tasks ! = null ) {
tasks . forEach ( task - > {
Task newTask = copyTaskWithNewYear ( task ) ;
taskRepository . save ( newTask ) ;
} ) ;
}
}
@Transactional
public Set < Tag > checkRepeatingTags ( Boolean createPeriodTask ) { //param: false = year task; true = period task
Map < Tag , Long > tagsCount = new TreeMap < > ( ) ;
List < Tag > tags = tagService . getTags ( ) ;
List < Task > tasks = taskRepository . findAllYear ( DateUtils . clearTime ( DateUtils . addYears ( new Date ( ) , - 1 ) ) ) ;
tags . forEach ( tag - >
tagsCount . put ( tag , tasks
. stream ( )
. filter ( task - > task . getTags ( ) . contains ( tag ) )
. count ( ) ) ) ;
if ( ! createPeriodTask ) {
return tagsCount
. entrySet ( )
. stream ( )
. filter ( tagLongEntry - > tagLongEntry . getValue ( ) = = 1 )
. collect ( Collectors . toMap ( Map . Entry : : getKey , Map . Entry : : getValue ) )
. keySet ( ) ;
} else {
return tagsCount
. entrySet ( )
. stream ( )
. filter ( tagLongEntry - > tagLongEntry . getValue ( ) > = 2 )
. collect ( Collectors . toMap ( Map . Entry : : getKey , Map . Entry : : getValue ) )
. keySet ( ) ;
}
}
public List < Task . TaskStatus > getTaskStatuses ( ) {
public List < Task . TaskStatus > getTaskStatuses ( ) {
return Arrays . asList ( Task . TaskStatus . values ( ) ) ;
return Arrays . asList ( Task . TaskStatus . values ( ) ) ;
}
}
@ -118,4 +240,13 @@ public class TaskService {
return tagService . getTags ( ) ;
return tagService . getTags ( ) ;
}
}
public List < Task > findTasksByTag ( Tag tag ) {
return taskRepository . findByTag ( tag ) ;
}
@Transactional
public void createPeriodTask ( Scheduler scheduler ) {
Task newTask = copyTaskWithNewDates ( scheduler . getTask ( ) ) ;
taskRepository . save ( newTask ) ;
}
}
}