From 6f1f887ce87fa96a583711238998482a9783c1ef Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Mon, 2 Sep 2024 17:04:44 +0800 Subject: [PATCH] add position log + team log tables --- .../tsms/modules/data/entity/PositionLog.java | 46 +++++++++++++++++++ .../data/entity/PositionLogRepository.java | 11 +++++ .../tsms/modules/data/entity/TeamLog.java | 46 +++++++++++++++++++ .../data/entity/TeamLogRepository.java | 11 +++++ .../data/entity/projections/GradeLogInfo.kt | 1 - .../entity/projections/PositionLogInfo.kt | 21 +++++++++ .../data/entity/projections/TeamLogInfo.kt | 41 +++++++++++++++++ .../data/service/PositionLogService.kt | 20 ++++++++ .../modules/data/service/TeamLogService.kt | 19 ++++++++ .../modules/data/web/PositionLogController.kt | 22 +++++++++ .../modules/data/web/TeamLogController.kt | 21 +++++++++ .../02_add_pos_log_and_team_log.sql | 38 +++++++++++++++ 12 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/PositionLog.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/PositionLogRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/TeamLog.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/TeamLogRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/projections/PositionLogInfo.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/projections/TeamLogInfo.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/service/PositionLogService.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/service/TeamLogService.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/PositionLogController.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/TeamLogController.kt create mode 100644 src/main/resources/db/changelog/changes/20240902_01_derek/02_add_pos_log_and_team_log.sql diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/PositionLog.java b/src/main/java/com/ffii/tsms/modules/data/entity/PositionLog.java new file mode 100644 index 0000000..6e37a4b --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/PositionLog.java @@ -0,0 +1,46 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.entity.BaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDate; + +@Entity +@Table(name = "position_log") +public class PositionLog extends BaseEntity { + + @NotNull + @OneToOne + @JoinColumn(name = "staffId") + private Staff staff; + + @NotNull + @OneToOne + @JoinColumn(name = "positionId") + private Position position; + + @NotNull + @Column(name = "from", length = 30) + private LocalDate from; + + @NotNull + @Column(name = "to", length = 30) + private LocalDate to; + + public Staff getStaff() { + return staff; + } + + public void setStaff(Staff staff) { + this.staff = staff; + } + + public Position getPosition() { return position; } + + public void setPosition(Position position) { this.position = position; } + + public LocalDate getFrom() { return from; } + + public void setFrom(LocalDate from) { this.from = from; } +} diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/PositionLogRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/PositionLogRepository.java new file mode 100644 index 0000000..969c632 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/PositionLogRepository.java @@ -0,0 +1,11 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; +import com.ffii.tsms.modules.data.entity.projections.GradeLogInfo; +import com.ffii.tsms.modules.data.entity.projections.PositionLogInfo; + +import java.util.List; + +public interface PositionLogRepository extends AbstractRepository { + List findPositionLogInfoByStaffIdAndDeletedFalse(Long staffId); +} diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/TeamLog.java b/src/main/java/com/ffii/tsms/modules/data/entity/TeamLog.java new file mode 100644 index 0000000..a35ba9c --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/TeamLog.java @@ -0,0 +1,46 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.entity.BaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDate; + +@Entity +@Table(name = "team_log") +public class TeamLog extends BaseEntity { + + @NotNull + @OneToOne + @JoinColumn(name = "staffId") + private Staff staff; + + @NotNull + @OneToOne + @JoinColumn(name = "teamId") + private Team team; + + @NotNull + @Column(name = "from", length = 30) + private LocalDate from; + + @NotNull + @Column(name = "to", length = 30) + private LocalDate to; + + public Staff getStaff() { + return staff; + } + + public void setStaff(Staff staff) { + this.staff = staff; + } + + public Team getTeam() { return team; } + + public void setTeam(Team team) { this.team = team; } + + public LocalDate getFrom() { return from; } + + public void setFrom(LocalDate from) { this.from = from; } +} diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/TeamLogRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/TeamLogRepository.java new file mode 100644 index 0000000..0405b05 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/TeamLogRepository.java @@ -0,0 +1,11 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; +import com.ffii.tsms.modules.data.entity.projections.PositionLogInfo; +import com.ffii.tsms.modules.data.entity.projections.TeamLogInfo; + +import java.util.List; + +public interface TeamLogRepository extends AbstractRepository { + List findTeamLogInfoByStaffIdAndDeletedFalse(Long staffId); +} diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/projections/GradeLogInfo.kt b/src/main/java/com/ffii/tsms/modules/data/entity/projections/GradeLogInfo.kt index 7c46256..abdd5d2 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/projections/GradeLogInfo.kt +++ b/src/main/java/com/ffii/tsms/modules/data/entity/projections/GradeLogInfo.kt @@ -1,7 +1,6 @@ package com.ffii.tsms.modules.data.entity.projections import com.ffii.tsms.modules.data.entity.Grade -import com.ffii.tsms.modules.data.entity.Position import org.springframework.beans.factory.annotation.Value import java.time.LocalDate diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/projections/PositionLogInfo.kt b/src/main/java/com/ffii/tsms/modules/data/entity/projections/PositionLogInfo.kt new file mode 100644 index 0000000..701be09 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/projections/PositionLogInfo.kt @@ -0,0 +1,21 @@ +package com.ffii.tsms.modules.data.entity.projections +import com.ffii.tsms.modules.data.entity.Position +import org.springframework.beans.factory.annotation.Value +import java.time.LocalDate + +interface PositionLogInfo { + val id: Long + + @get:Value("#{target.staff.id}") + val staffId: Long + + @get:Value("#{target.staff.name}") + val staffName: String + + @get:Value("#{target.staff.staffId}") + val staffCode: String + + val position: Position + val from: LocalDate + val to: LocalDate? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/projections/TeamLogInfo.kt b/src/main/java/com/ffii/tsms/modules/data/entity/projections/TeamLogInfo.kt new file mode 100644 index 0000000..dd35ae5 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/projections/TeamLogInfo.kt @@ -0,0 +1,41 @@ +package com.ffii.tsms.modules.data.entity.projections + +import com.ffii.tsms.modules.data.entity.Grade +import com.ffii.tsms.modules.data.entity.Team +import org.springframework.beans.factory.annotation.Value +import java.time.LocalDate + +interface TeamInfo { + val id: Long + + @get:Value("#{target.description}") + val description: String + + @get:Value("#{target.name}") + val name: String + + @get:Value("#{target.code}") + val code: String + + @get:Value("#{target.staff?.id}") + val teamLead: Long? +} + +interface TeamLogInfo { + val id: Long + + @get:Value("#{target.staff.id}") + val staffId: Long + + @get:Value("#{target.staff.name}") + val staffName: String + + @get:Value("#{target.staff.staffId}") + val staffCode: String + + @get:Value("#{target.team}") + val team: TeamInfo + + val from: LocalDate + val to: LocalDate? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/PositionLogService.kt b/src/main/java/com/ffii/tsms/modules/data/service/PositionLogService.kt new file mode 100644 index 0000000..849f14d --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/service/PositionLogService.kt @@ -0,0 +1,20 @@ +package com.ffii.tsms.modules.data.service + +import com.ffii.core.support.AbstractBaseEntityService +import com.ffii.core.support.JdbcDao +import com.ffii.tsms.modules.data.entity.PositionLog +import com.ffii.tsms.modules.data.entity.PositionLogRepository +import com.ffii.tsms.modules.data.entity.projections.GradeLogInfo +import com.ffii.tsms.modules.data.entity.projections.PositionLogInfo +import org.springframework.stereotype.Service + + +@Service +open class PositionLogService ( + private val positionLogRepository: PositionLogRepository, + private val jdbcDao: JdbcDao, +) : AbstractBaseEntityService(jdbcDao, positionLogRepository) { + open fun allPositionLog(staffId: Long): List { + return positionLogRepository.findPositionLogInfoByStaffIdAndDeletedFalse(staffId) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/TeamLogService.kt b/src/main/java/com/ffii/tsms/modules/data/service/TeamLogService.kt new file mode 100644 index 0000000..bec29dd --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/service/TeamLogService.kt @@ -0,0 +1,19 @@ +package com.ffii.tsms.modules.data.service + +import com.ffii.core.support.AbstractBaseEntityService +import com.ffii.core.support.JdbcDao +import com.ffii.tsms.modules.data.entity.TeamLog +import com.ffii.tsms.modules.data.entity.TeamLogRepository +import com.ffii.tsms.modules.data.entity.projections.PositionLogInfo +import com.ffii.tsms.modules.data.entity.projections.TeamLogInfo +import org.springframework.stereotype.Service + +@Service +open class TeamLogService ( + private val teamLogRepository: TeamLogRepository, + private val jdbcDao: JdbcDao, +) : AbstractBaseEntityService(jdbcDao, teamLogRepository) { + open fun allTeamLog(staffId: Long): List { + return teamLogRepository.findTeamLogInfoByStaffIdAndDeletedFalse(staffId) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/PositionLogController.kt b/src/main/java/com/ffii/tsms/modules/data/web/PositionLogController.kt new file mode 100644 index 0000000..bcc2589 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/PositionLogController.kt @@ -0,0 +1,22 @@ +package com.ffii.tsms.modules.data.web + +import com.ffii.tsms.modules.data.entity.PositionLogRepository +import com.ffii.tsms.modules.data.entity.projections.GradeLogInfo +import com.ffii.tsms.modules.data.entity.projections.PositionLogInfo +import com.ffii.tsms.modules.data.service.PositionLogService +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/positionLog") +class PositionLogController( + private val positionLogService: PositionLogService, + private val positionLogRepository: PositionLogRepository, +) { + @GetMapping("/{staffId}") + fun allPositionLog(@PathVariable staffId: Long): List { + return positionLogService.allPositionLog(staffId) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/TeamLogController.kt b/src/main/java/com/ffii/tsms/modules/data/web/TeamLogController.kt new file mode 100644 index 0000000..cd079e3 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/TeamLogController.kt @@ -0,0 +1,21 @@ +package com.ffii.tsms.modules.data.web + +import com.ffii.tsms.modules.data.entity.TeamLogRepository +import com.ffii.tsms.modules.data.entity.projections.TeamLogInfo +import com.ffii.tsms.modules.data.service.TeamLogService +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/teamLog") +class TeamLogController( + private val teamLogService: TeamLogService, + private val teamLogRepository: TeamLogRepository, +) { + @GetMapping("/{staffId}") + fun allTeamLog(@PathVariable staffId: Long): List { + return teamLogService.allTeamLog(staffId) + } +} \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20240902_01_derek/02_add_pos_log_and_team_log.sql b/src/main/resources/db/changelog/changes/20240902_01_derek/02_add_pos_log_and_team_log.sql new file mode 100644 index 0000000..871a719 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240902_01_derek/02_add_pos_log_and_team_log.sql @@ -0,0 +1,38 @@ +-- liquibase formatted sql +-- changeset derek:create grade log table + +CREATE TABLE position_log ( + id INT NOT NULL AUTO_INCREMENT, + version INT NOT NULL DEFAULT '0', + created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + createdBy VARCHAR(30) NULL, + modified DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + modifiedBy VARCHAR(30) NULL, + deleted TINYINT(1) NOT NULL DEFAULT '0', + staffId INT NOT NULL, + positionId INT NOT NULL, + `from` DATE NOT NULL, + `to` DATE NULL, + CONSTRAINT pk_position_log PRIMARY KEY (id) +); + +ALTER TABLE position_log ADD CONSTRAINT FK_POSITION_LOG_ON_STAFFID FOREIGN KEY (staffId) REFERENCES staff (id); +ALTER TABLE position_log ADD CONSTRAINT FK_POSITION_LOG_ON_POSITIONID FOREIGN KEY (positionId) REFERENCES `position` (id); + +CREATE TABLE team_log ( + id INT NOT NULL AUTO_INCREMENT, + version INT NOT NULL DEFAULT '0', + created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + createdBy VARCHAR(30) NULL, + modified DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + modifiedBy VARCHAR(30) NULL, + deleted TINYINT(1) NOT NULL DEFAULT '0', + staffId INT NOT NULL, + teamId INT NOT NULL, + `from` DATE NOT NULL, + `to` DATE NULL, + CONSTRAINT pk_position_log PRIMARY KEY (id) +); + +ALTER TABLE team_log ADD CONSTRAINT FK_TEAM_LOG_ON_STAFFID FOREIGN KEY (staffId) REFERENCES staff (id); +ALTER TABLE team_log ADD CONSTRAINT FK_TEAM_LOG_ON_TEAMID FOREIGN KEY (teamId) REFERENCES `team` (id); \ No newline at end of file