From e6db78a01f4e7e3f3675f87f18242475a4fa857e Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Wed, 27 Mar 2024 15:26:43 +0800 Subject: [PATCH] add staff list api --- .../entity/SalaryEffectiveRepository.java | 7 ++ .../modules/data/service/StaffsService.kt | 77 ++++++++++++++++++- .../tsms/modules/data/web/StaffsController.kt | 28 +++++++ .../data/web/models/NewStaffRequest.kt | 53 +++++++++++++ 4 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java new file mode 100644 index 0000000..fc3a291 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; + +public interface SalaryEffectiveRepository extends AbstractRepository { + +} diff --git a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt index 9736e98..f28710f 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt @@ -2,12 +2,87 @@ package com.ffii.tsms.modules.data.service import com.ffii.tsms.modules.data.entity.Staff import com.ffii.tsms.modules.data.entity.StaffRepository +import com.ffii.tsms.modules.user.entity.UserRepository +import com.ffii.tsms.modules.data.entity.PositionRepository +import com.ffii.tsms.modules.data.entity.CompanyRepository +import com.ffii.tsms.modules.data.entity.GradeRepository +import com.ffii.tsms.modules.data.entity.TeamRepository +import com.ffii.tsms.modules.data.entity.SkillRepository +import com.ffii.tsms.modules.data.entity.SalaryEffectiveRepository +import com.ffii.tsms.modules.data.entity.DepartmentRepository +import com.ffii.tsms.modules.project.web.models.NewStaffRequest +// import com.ffii.tsms.modules.data.web.models.NewStaffRequest import org.springframework.stereotype.Service +import com.ffii.core.support.JdbcDao; +import com.ffii.core.support.AbstractBaseEntityService; @Service -class StaffsService(private val staffRepository: StaffRepository) { +public final class StaffsService( + private val staffRepository: StaffRepository, + private val userRepository: UserRepository, + private val positionRepository: PositionRepository, + private val companyRepository: CompanyRepository, + private val gradeRepository: GradeRepository, + private val teamRepository: TeamRepository, + private val skillRepository: SkillRepository, + private val salaryEffectiveRepository: SalaryEffectiveRepository, + private val departmentRepository: DepartmentRepository, + private val jdbcDao: JdbcDao, +) { + fun getTeamLeads(): List { // TODO: Replace with actual logic and make a projection instead of returning all fields return staffRepository.findAll() } + + fun fetchStaffList(args: Map): List> { + val sql = StringBuilder("select" + + " s.*," + + " date_format(s.created, '%Y-%m-%d') as created," + + " date_format(s.departDate, '%Y-%m-%d') as departDate," + + " date_format(s.joinDate, '%Y-%m-%d') as joinDate" + + " from staff s" + + " where s.deleted = false" + ) + return jdbcDao.queryForList(sql.toString(), args) + } + + fun saveStaff(req: NewStaffRequest): Staff { + val user = userRepository.findById(req.userId).orElseThrow() + val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() + val joinPosition = positionRepository.findById(req.joinPositionId).orElseThrow() + val company = companyRepository.findById(req.companyId).orElseThrow() + val grade = gradeRepository.findById(req.gradeId).orElseThrow() + val team = teamRepository.findById(req.teamId).orElseThrow() + val skill = skillRepository.findById(req.skillSetId).orElseThrow() + val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() + val department = departmentRepository.findById(req.departmentId).orElseThrow() + + // // TODO: Add tasks, milestones, allocated + val staff = Staff().apply { + joinDate = req.joinDate + name = req.name + staffId = req.staffId + phone1 = req.phone1 + phone2 = req.phone2 + email = req.email + emergContactName = req.emergContactName + emergContactPhone = req.emergContactPhone + employType = req.employType + departDate = req.departDate + departReason = req.departReason + remark = req.remark + this.user = user + this.currentPosition = currentPosition + this.joinPosition = joinPosition + this.company = company + this.grade = grade + this.team = team + this.skill = skill + this.salaryEffective = salaryEffective + this.department = department + } + + return staffRepository.save(staff) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/StaffsController.kt b/src/main/java/com/ffii/tsms/modules/data/web/StaffsController.kt index ea5d4f1..8c764f9 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/StaffsController.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/StaffsController.kt @@ -5,6 +5,16 @@ import com.ffii.tsms.modules.data.service.StaffsService import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import com.ffii.tsms.modules.project.web.models.NewStaffRequest +// import com.ffii.tsms.modules.data.web.models.NewStaffRequest +import jakarta.validation.Valid +import org.springframework.web.bind.annotation.* +import jakarta.servlet.http.HttpServletRequest; +import com.ffii.core.utils.CriteriaArgsBuilder; +import com.ffii.core.response.IdRes; +import com.ffii.core.response.RecordsRes; @RestController @RequestMapping("/staffs") @@ -13,4 +23,22 @@ class StaffsController(private val staffsService: StaffsService) { fun teamLeads(): List { return staffsService.getTeamLeads() } + + @GetMapping("/list") + fun list(): List { + return staffsService.getTeamLeads() + } + + @PostMapping("/new") + fun saveStaff(@Valid @RequestBody newStaff: NewStaffRequest): Staff { + return staffsService.saveStaff(newStaff) + } + + @GetMapping("/newlist") + fun list(request: HttpServletRequest): RecordsRes> { + return RecordsRes(staffsService.fetchStaffList( + CriteriaArgsBuilder.withRequest(request) + .build() + )) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt new file mode 100644 index 0000000..8281e3e --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt @@ -0,0 +1,53 @@ +package com.ffii.tsms.modules.project.web.models + +import jakarta.validation.constraints.NotBlank +import java.time.LocalDate + +data class NewStaffRequest( + @field:NotBlank(message = "Staff userId cannot be empty") + val userId: Long, + + val joinDate: LocalDate, + + @field:NotBlank(message = "Staff name cannot be empty") + val name: String, + + @field:NotBlank(message = "Staff staffId cannot be empty") + val staffId: String, + + val currentPositionId: Long, + + val joinPositionId: Long, + + @field:NotBlank(message = "Staff companyId cannot be empty") + val companyId: Long, + + val gradeId: Long, + + val teamId: Long, + + val skillSetId: Long, + + @field:NotBlank(message = "Staff salaryEffId cannot be empty") + val salaryEffId: Long, + + val departmentId: Long, + + val phone1: String, + + val phone2: String, + + val email: String, + + val emergContactName: String, + + val emergContactPhone: String, + + val employType: String, + + val departDate: LocalDate, + + val departReason: String, + + val remark: String, +) \ No newline at end of file