diff --git a/src/main/java/ru/ulstu/deadline/model/Deadline.java b/src/main/java/ru/ulstu/deadline/model/Deadline.java new file mode 100644 index 0000000..1a73e59 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/model/Deadline.java @@ -0,0 +1,41 @@ +package ru.ulstu.deadline.model; + +import ru.ulstu.core.model.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.util.Date; + +@Entity +public class Deadline extends BaseEntity { + + private String description; + + @Temporal(value = TemporalType.TIMESTAMP) + private Date date; + + public Deadline() { + } + + public Deadline(Date deadlineDate, String description) { + this.date = deadlineDate; + this.description = description; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } +} diff --git a/src/main/java/ru/ulstu/deadline/model/DeadlineDto.java b/src/main/java/ru/ulstu/deadline/model/DeadlineDto.java new file mode 100644 index 0000000..fbfb598 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/model/DeadlineDto.java @@ -0,0 +1,41 @@ +package ru.ulstu.deadline.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Date; + +public class DeadlineDto { + private final Integer id; + + private final String description; + + private final Date date; + + @JsonCreator + public DeadlineDto(@JsonProperty("id") Integer id, + @JsonProperty("description") String description, + @JsonProperty("date") Date date) { + this.id = id; + this.description = description; + this.date = date; + } + + public DeadlineDto(Deadline deadline) { + this.id = deadline.getId(); + this.description = deadline.getDescription(); + this.date = deadline.getDate(); + } + + public Integer getId() { + return id; + } + + public String getDescription() { + return description; + } + + public Date getDate() { + return date; + } +} diff --git a/src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java b/src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java new file mode 100644 index 0000000..f26c572 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java @@ -0,0 +1,9 @@ +package ru.ulstu.deadline.repository; + + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.ulstu.deadline.model.Deadline; + +public interface DeadlineRepository extends JpaRepository { + +} diff --git a/src/main/java/ru/ulstu/deadline/service/DeadlineService.java b/src/main/java/ru/ulstu/deadline/service/DeadlineService.java new file mode 100644 index 0000000..c371d87 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/service/DeadlineService.java @@ -0,0 +1,45 @@ +package ru.ulstu.deadline.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.ulstu.deadline.model.Deadline; +import ru.ulstu.deadline.model.DeadlineDto; +import ru.ulstu.deadline.repository.DeadlineRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class DeadlineService { + private final DeadlineRepository deadlineRepository; + + public DeadlineService(DeadlineRepository deadlineRepository) { + this.deadlineRepository = deadlineRepository; + } + + public List saveOrCreate(List deadlines) { + return deadlines.stream().map(deadlineDto -> { + return deadlineDto.getId() != null ? update(deadlineDto) : create(deadlineDto); + }).collect(Collectors.toList()); + } + + @Transactional + public Deadline update(DeadlineDto deadlineDto) { + Deadline deadline = deadlineRepository.findOne(deadlineDto.getId()); + deadlineRepository.save(copyFromDto(deadline, deadlineDto)); + return deadline; + } + + @Transactional + public Deadline create(DeadlineDto deadlineDto) { + Deadline newDeadline = copyFromDto(new Deadline(), deadlineDto); + newDeadline = deadlineRepository.save(newDeadline); + return newDeadline; + } + + private Deadline copyFromDto(Deadline deadline, DeadlineDto deadlineDto) { + deadline.setDate(deadlineDto.getDate()); + deadline.setDescription(deadlineDto.getDescription()); + return deadline; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/Grant.java b/src/main/java/ru/ulstu/grant/model/Grant.java new file mode 100644 index 0000000..092317b --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/Grant.java @@ -0,0 +1,106 @@ +package ru.ulstu.grant.model; + +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.core.model.UserContainer; +import ru.ulstu.deadline.model.Deadline; +import ru.ulstu.file.model.FileData; +import ru.ulstu.project.model.Project; +import ru.ulstu.user.model.User; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Entity +public class Grant extends BaseEntity { + public enum GrantStatus { + APPLICATION("Заявка"), + ON_COMPETITION("Отправлен на конкурс"), + SUCCESSFUL_PASSAGE("Успешное прохождение"), + IN_WORK("В работе"), + COMPLETED("Завершен"), + FAILED("Провалены сроки"); + + private String name; + + GrantStatus(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + @NotBlank + private String title; + + @Enumerated(value = EnumType.STRING) + private GrantStatus status = GrantStatus.APPLICATION; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "grant_id") + private List deadlines = new ArrayList<>(); + + //Описание гранта + @NotNull + private String comment; + + //Заявка на грант + @ManyToOne + @JoinColumn(name = "file_id") + private FileData application; + + @ManyToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "project_id") + private Project project; + + public GrantStatus getStatus() { + return status; + } + + public void setStatus(GrantStatus status) { + this.status = status; + } + + public List getDeadlines() { + return deadlines; + } + + public void setDeadlines(List deadlines) { + this.deadlines = deadlines; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public FileData getApplication() { + return application; + } + + public void setApplication(FileData application) { this.application = application; } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { this.title = title; } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/GrantDto.java b/src/main/java/ru/ulstu/grant/model/GrantDto.java new file mode 100644 index 0000000..922df89 --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/GrantDto.java @@ -0,0 +1,76 @@ +package ru.ulstu.grant.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.hibernate.validator.constraints.NotEmpty; +import ru.ulstu.deadline.model.DeadlineDto; +import ru.ulstu.project.model.ProjectDto; + +import java.util.List; + +import static ru.ulstu.core.util.StreamApiUtils.convert; + +public class GrantDto { + private final Integer id; + @NotEmpty + private final String title; + private final Grant.GrantStatus status; + private final List deadlines; + private final String comment; + private final String applicationFileName; + private final ProjectDto project; + + @JsonCreator + public GrantDto(@JsonProperty("id") Integer id, + @JsonProperty("title") String title, + @JsonProperty("status") Grant.GrantStatus status, + @JsonProperty("deadlines") List deadlines, + @JsonProperty("comment") String comment, + @JsonProperty("project") ProjectDto project) { + this.id = id; + this.title = title; + this.status = status; + this.deadlines = deadlines; + this.comment = comment; + this.applicationFileName = null; + this.project = project; + } + + public GrantDto(Grant grant) { + this.id = grant.getId(); + this.title = grant.getTitle(); + this.status = grant.getStatus(); + this.deadlines = convert(grant.getDeadlines(), DeadlineDto::new); + this.comment = grant.getComment(); + this.project = grant.getProject() == null ? null : new ProjectDto(grant.getProject()); + this.applicationFileName = grant.getApplication() == null ? null : grant.getApplication().getName(); + } + + public Integer getId() { + return id; + } + + public String getTitle() { + return title; + } + + public Grant.GrantStatus getStatus() { + return status; + } + + public List getDeadlines() { + return deadlines; + } + + public String getComment() { + return comment; + } + + public ProjectDto getProject() { + return project; + } + + public String getApplicationFileName() { + return applicationFileName; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/GrantStatusDto.java b/src/main/java/ru/ulstu/grant/model/GrantStatusDto.java new file mode 100644 index 0000000..dae40e2 --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/GrantStatusDto.java @@ -0,0 +1,19 @@ +package ru.ulstu.grant.model; + +public class GrantStatusDto { + private final String id; + private final String name; + + public GrantStatusDto(Grant.GrantStatus status) { + this.id = status.name(); + this.name = status.getName(); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/ulstu/paper/model/Paper.java b/src/main/java/ru/ulstu/paper/model/Paper.java index c2a7f31..96befe7 100644 --- a/src/main/java/ru/ulstu/paper/model/Paper.java +++ b/src/main/java/ru/ulstu/paper/model/Paper.java @@ -3,9 +3,11 @@ package ru.ulstu.paper.model; import org.hibernate.validator.constraints.NotBlank; import ru.ulstu.core.model.BaseEntity; import ru.ulstu.core.model.UserContainer; +import ru.ulstu.deadline.model.Deadline; import ru.ulstu.file.model.FileData; import ru.ulstu.user.model.User; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -14,10 +16,14 @@ import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; @Entity @@ -53,9 +59,9 @@ public class Paper extends BaseEntity implements UserContainer { @Column(name = "update_date") private Date updateDate = new Date(); - @Column(name = "deadline_date") - @NotNull - private Date deadlineDate; + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "paper_id") + private List deadlines = new ArrayList<>(); private String comment; @@ -92,12 +98,12 @@ public class Paper extends BaseEntity implements UserContainer { this.updateDate = updateDate; } - public Date getDeadlineDate() { - return deadlineDate; + public List getDeadlines() { + return deadlines; } - public void setDeadlineDate(Date deadlineDate) { - this.deadlineDate = deadlineDate; + public void setDeadlines(List deadlines) { + this.deadlines = deadlines; } public String getComment() { @@ -144,4 +150,12 @@ public class Paper extends BaseEntity implements UserContainer { public Set getUsers() { return getAuthors(); } + + public Optional getNextDeadline() { + return deadlines + .stream() + .sorted(Comparator.comparing(Deadline::getDate)) + .filter(d -> d.getDate().after(new Date())) + .findFirst(); + } } diff --git a/src/main/java/ru/ulstu/paper/model/PaperDto.java b/src/main/java/ru/ulstu/paper/model/PaperDto.java index d9a1229..208fe4d 100644 --- a/src/main/java/ru/ulstu/paper/model/PaperDto.java +++ b/src/main/java/ru/ulstu/paper/model/PaperDto.java @@ -3,10 +3,12 @@ package ru.ulstu.paper.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.hibernate.validator.constraints.NotEmpty; +import ru.ulstu.deadline.model.DeadlineDto; import ru.ulstu.user.model.UserDto; import javax.validation.constraints.NotNull; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -19,8 +21,7 @@ public class PaperDto { private final Paper.PaperStatus status; private final Date createDate; private final Date updateDate; - @NotNull - private final Date deadlineDate; + private final List deadlines; private final String comment; private final Boolean locked; private final String tmpFileName; @@ -35,7 +36,7 @@ public class PaperDto { @JsonProperty("status") Paper.PaperStatus status, @JsonProperty("createDate") Date createDate, @JsonProperty("updateDate") Date updateDate, - @JsonProperty("deadlineDate") Date deadlineDate, + @JsonProperty("deadlines") List deadlines, @JsonProperty("comment") String comment, @JsonProperty("locked") Boolean locked, @JsonProperty("tmpFileName") String tmpFileName, @@ -45,7 +46,7 @@ public class PaperDto { this.status = status; this.createDate = createDate; this.updateDate = updateDate; - this.deadlineDate = deadlineDate; + this.deadlines = deadlines; this.comment = comment; this.locked = locked; this.tmpFileName = tmpFileName; @@ -61,7 +62,7 @@ public class PaperDto { this.status = paper.getStatus(); this.createDate = paper.getCreateDate(); this.updateDate = paper.getUpdateDate(); - this.deadlineDate = paper.getDeadlineDate(); + this.deadlines = convert(paper.getDeadlines(), DeadlineDto::new); this.comment = paper.getComment(); this.locked = paper.getLocked(); this.tmpFileName = null; @@ -91,8 +92,8 @@ public class PaperDto { return updateDate; } - public Date getDeadlineDate() { - return deadlineDate; + public List getDeadlines() { + return deadlines; } public String getComment() { diff --git a/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java b/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java index 99e0c86..697958b 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java @@ -29,16 +29,16 @@ public class PaperNotificationService { } private boolean needToSendDeadlineNotification(Paper paper, Date compareDate, boolean isDeadlineBeforeWeek) { - return (paper.getDeadlineDate() != null) - && (compareDate.after(paper.getDeadlineDate()) && isDeadlineBeforeWeek - || compareDate.before(paper.getDeadlineDate()) && !isDeadlineBeforeWeek) - && paper.getDeadlineDate().after(new Date()); + return (paper.getNextDeadline().isPresent()) + && (compareDate.after(paper.getNextDeadline().get().getDate()) && isDeadlineBeforeWeek + || compareDate.before(paper.getNextDeadline().get().getDate()) && !isDeadlineBeforeWeek) + && paper.getNextDeadline().get().getDate().after(new Date()); } private void sendMessageDeadline(Paper paper) { paper.getAuthors().forEach(user -> { mailService.sendEmail(user.getEmail(), "Приближается срок сдачи статьи", - "Срок сдачи статьи " + paper.getTitle() + " " + paper.getDeadlineDate().toString()); + "Срок сдачи статьи " + paper.getTitle() + " " + paper.getNextDeadline().get().getDate().toString()); }); } diff --git a/src/main/java/ru/ulstu/paper/service/PaperService.java b/src/main/java/ru/ulstu/paper/service/PaperService.java index 83b975b..30388b3 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperService.java @@ -2,6 +2,8 @@ package ru.ulstu.paper.service; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import ru.ulstu.deadline.model.Deadline; +import ru.ulstu.deadline.service.DeadlineService; import ru.ulstu.file.service.FileService; import ru.ulstu.paper.model.Paper; import ru.ulstu.paper.model.PaperDto; @@ -27,17 +29,19 @@ public class PaperService { private final PaperNotificationService paperNotificationService; private final PaperRepository paperRepository; private final UserService userService; + private final DeadlineService deadlineService; private final FileService fileService; - public PaperService(PaperRepository paperRepository, FileService fileService, PaperNotificationService paperNotificationService, - UserService userService) { + UserService userService, + DeadlineService deadlineService) { this.paperRepository = paperRepository; this.fileService = fileService; this.paperNotificationService = paperNotificationService; this.userService = userService; + this.deadlineService = deadlineService; } public List findAll() { @@ -71,7 +75,7 @@ public class PaperService { paper.setStatus(paperDto.getStatus() == null ? DRAFT : paperDto.getStatus()); paper.setTitle(paperDto.getTitle()); paper.setUpdateDate(new Date()); - paper.setDeadlineDate(paperDto.getDeadlineDate()); + paper.setDeadlines(deadlineService.saveOrCreate(paperDto.getDeadlines())); if (paperDto.getTmpFileName() != null) { paper.setFileData(fileService.createFileFromTmp(paperDto.getTmpFileName())); } @@ -115,7 +119,7 @@ public class PaperService { Paper paper = new Paper(); paper.setTitle(title); paper.getAuthors().add(user); - paper.setDeadlineDate(deadlineDate); + paper.getDeadlines().add(new Deadline(deadlineDate, "первый дедлайн")); paper.setCreateDate(new Date()); paper.setUpdateDate(new Date()); paper.setStatus(DRAFT); @@ -137,11 +141,11 @@ public class PaperService { public void closeFailedPapers() { List papers = paperRepository.findAll() .stream() - .filter(paper -> paper.getDeadlineDate() != null + .filter(paper -> paper.getNextDeadline().isPresent() && (paper.getStatus() == ON_PREPARATION || paper.getStatus() == DRAFT || paper.getStatus() == ATTENTION) - && paper.getDeadlineDate().before(new Date())) + && paper.getNextDeadline().get().getDate().before(new Date())) .collect(Collectors.toList()); papers.forEach(paper -> { Paper.PaperStatus oldStatus = paper.getStatus(); diff --git a/src/main/java/ru/ulstu/project/model/Project.java b/src/main/java/ru/ulstu/project/model/Project.java new file mode 100644 index 0000000..06722a1 --- /dev/null +++ b/src/main/java/ru/ulstu/project/model/Project.java @@ -0,0 +1,39 @@ +package ru.ulstu.project.model; + +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.deadline.model.Deadline; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class Project extends BaseEntity { + + @NotBlank + private String title; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "project_id") + private List deadlines = new ArrayList<>(); + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getDeadlines() { + return deadlines; + } + + public void setDeadlines(List deadlines) { + this.deadlines = deadlines; + } +} diff --git a/src/main/java/ru/ulstu/project/model/ProjectDto.java b/src/main/java/ru/ulstu/project/model/ProjectDto.java new file mode 100644 index 0000000..69e9b1b --- /dev/null +++ b/src/main/java/ru/ulstu/project/model/ProjectDto.java @@ -0,0 +1,42 @@ +package ru.ulstu.project.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.hibernate.validator.constraints.NotEmpty; +import ru.ulstu.deadline.model.DeadlineDto; + +import java.util.List; + +import static ru.ulstu.core.util.StreamApiUtils.convert; + +public class ProjectDto { + private final Integer id; + + @NotEmpty + private final String title; + + private final List deadlines; + + @JsonCreator + public ProjectDto(@JsonProperty("id") Integer id, + @JsonProperty("title") String title, + @JsonProperty("deadlines") List deadlines) { + this.id = id; + this.title = title; + this.deadlines = deadlines; + } + + public ProjectDto(Project project) { + this.id = project.getId(); + this.title = project.getTitle(); + this.deadlines = convert(project.getDeadlines(), DeadlineDto::new); + } + + public Integer getId() { + return id; + } + + public String getTitle() { + return title; + } +} diff --git a/src/main/resources/db/changelog-20181208_000000-schema.xml b/src/main/resources/db/changelog-20181208_000000-schema.xml new file mode 100644 index 0000000..1943b26 --- /dev/null +++ b/src/main/resources/db/changelog-20181208_000000-schema.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog-master.xml b/src/main/resources/db/changelog-master.xml index d0199a1..6c7147b 100644 --- a/src/main/resources/db/changelog-master.xml +++ b/src/main/resources/db/changelog-master.xml @@ -16,4 +16,5 @@ + \ No newline at end of file diff --git a/src/main/resources/mail_templates/paperCreateNotification.html b/src/main/resources/mail_templates/paperCreateNotification.html index afbbe20..2758143 100644 --- a/src/main/resources/mail_templates/paperCreateNotification.html +++ b/src/main/resources/mail_templates/paperCreateNotification.html @@ -13,7 +13,7 @@ Вам нужно поработать над статьей "Title".

- Срок исполнения: . + Срок исполнения: .

Regards, diff --git a/src/main/resources/mail_templates/paperDeadlineNotification.html b/src/main/resources/mail_templates/paperDeadlineNotification.html index ee63f3b..a239421 100644 --- a/src/main/resources/mail_templates/paperDeadlineNotification.html +++ b/src/main/resources/mail_templates/paperDeadlineNotification.html @@ -13,7 +13,7 @@ Приближается срок сдачи статьи "Title".

- Срок исполнения: . + Срок исполнения: .

Regards,