@@ -7,9 +7,11 @@ import org.springframework.data.repository.query.Param; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | |||||
public interface StaffRepository extends AbstractRepository<Staff, Long> { | public interface StaffRepository extends AbstractRepository<Staff, Long> { | ||||
List<StaffSearchInfo> findStaffSearchInfoByAndDeletedFalse(); | List<StaffSearchInfo> findStaffSearchInfoByAndDeletedFalse(); | ||||
List<StaffSearchInfo> findAllStaffSearchInfoByIdIn(List<Long> ids); | List<StaffSearchInfo> findAllStaffSearchInfoByIdIn(List<Long> ids); | ||||
Optional<Staff> findByStaffId(@Param("staffId") String staffId); | |||||
} | } |
@@ -1,6 +1,10 @@ | |||||
package com.ffii.tsms.modules.data.entity; | package com.ffii.tsms.modules.data.entity; | ||||
import com.ffii.core.support.AbstractRepository; | import com.ffii.core.support.AbstractRepository; | ||||
import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo; | |||||
import java.util.List; | |||||
public interface TeamRepository extends AbstractRepository<Team, Long> { | public interface TeamRepository extends AbstractRepository<Team, Long> { | ||||
List<Team> findByDeletedFalse(); | |||||
} | } |
@@ -4,13 +4,16 @@ import com.ffii.core.support.AbstractBaseEntityService | |||||
import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
import com.ffii.tsms.modules.data.entity.* | import com.ffii.tsms.modules.data.entity.* | ||||
import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | ||||
//import com.ffii.tsms.modules.data.web.models.NewCustomerResponse | |||||
import com.ffii.tsms.modules.data.web.models.NewStaffRequest | import com.ffii.tsms.modules.data.web.models.NewStaffRequest | ||||
import com.ffii.tsms.modules.data.web.models.NewStaffResponse | |||||
import com.ffii.tsms.modules.user.entity.User | import com.ffii.tsms.modules.user.entity.User | ||||
import com.ffii.tsms.modules.user.entity.UserRepository | import com.ffii.tsms.modules.user.entity.UserRepository | ||||
import org.springframework.beans.BeanUtils | import org.springframework.beans.BeanUtils | ||||
import org.springframework.security.crypto.password.PasswordEncoder | import org.springframework.security.crypto.password.PasswordEncoder | ||||
import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||
import java.util.* | |||||
@Service | @Service | ||||
@@ -63,13 +66,17 @@ open class StaffsService( | |||||
// return jdbcDao.queryForList(sql.toString(), args) | // return jdbcDao.queryForList(sql.toString(), args) | ||||
// } | // } | ||||
open fun findByStaffId(id: String): Optional<Staff> { | |||||
return staffRepository.findByStaffId(id); | |||||
} | |||||
@Transactional(rollbackFor = [Exception::class]) | @Transactional(rollbackFor = [Exception::class]) | ||||
open fun saveStaff(req: NewStaffRequest): Staff { | open fun saveStaff(req: NewStaffRequest): Staff { | ||||
val user = userRepository.saveAndFlush( | val user = userRepository.saveAndFlush( | ||||
User().apply { | User().apply { | ||||
username = req.name | |||||
password = passwordEncoder.encode("mms1234") | |||||
name = req.name | |||||
username = req.name | |||||
password = passwordEncoder.encode("mms1234") | |||||
name = req.name | |||||
} | } | ||||
) | ) | ||||
val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | ||||
@@ -113,7 +120,6 @@ open class StaffsService( | |||||
logger.info(staff.id) | logger.info(staff.id) | ||||
return staff | return staff | ||||
} | } | ||||
@Transactional(rollbackFor = [Exception::class]) | @Transactional(rollbackFor = [Exception::class]) | ||||
open fun updateStaff(req: NewStaffRequest, staff: Staff): Staff { | open fun updateStaff(req: NewStaffRequest, staff: Staff): Staff { | ||||
val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | ||||
@@ -152,7 +158,7 @@ open class StaffsService( | |||||
salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.id!!) | salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.id!!) | ||||
return staffRepository.save(staff) | return staffRepository.save(staff) | ||||
} | |||||
} | |||||
@Transactional(rollbackFor = [Exception::class]) | @Transactional(rollbackFor = [Exception::class]) | ||||
open fun saveOrUpdate(req: NewStaffRequest): Staff { | open fun saveOrUpdate(req: NewStaffRequest): Staff { | ||||
@@ -164,4 +170,14 @@ open class StaffsService( | |||||
} | } | ||||
return staff; | return staff; | ||||
} | } | ||||
open fun combo(args: Map<String, Any>): List<Map<String, Any>> { | |||||
val sql = StringBuilder("select" | |||||
+ " s.id as id," | |||||
+ " s.name as label" | |||||
+ " from staff s" | |||||
+ " where s.deleted = false " | |||||
) | |||||
return jdbcDao.queryForList(sql.toString(), args) | |||||
} | |||||
} | } |
@@ -2,16 +2,50 @@ package com.ffii.tsms.modules.data.service | |||||
import com.ffii.core.support.AbstractBaseEntityService | import com.ffii.core.support.AbstractBaseEntityService | ||||
import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
import com.ffii.tsms.modules.data.entity.Staff | |||||
import com.ffii.tsms.modules.data.entity.StaffRepository | |||||
import com.ffii.tsms.modules.data.entity.Team | import com.ffii.tsms.modules.data.entity.Team | ||||
import com.ffii.tsms.modules.data.entity.TeamRepository | import com.ffii.tsms.modules.data.entity.TeamRepository | ||||
import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||||
import com.ffii.tsms.modules.data.web.models.NewTeamRequest | |||||
import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
import org.springframework.transaction.annotation.Transactional | |||||
@Service | @Service | ||||
open class TeamService( | open class TeamService( | ||||
private val teamRepository: TeamRepository, | private val teamRepository: TeamRepository, | ||||
private val staffRepository: StaffRepository, | |||||
private val jdbcDao: JdbcDao, | private val jdbcDao: JdbcDao, | ||||
) : AbstractBaseEntityService<Team, Long, TeamRepository>(jdbcDao, teamRepository) { | ) : AbstractBaseEntityService<Team, Long, TeamRepository>(jdbcDao, teamRepository) { | ||||
open fun allTeam(): List<Team> { | |||||
return teamRepository.findByDeletedFalse(); | |||||
} | |||||
@Transactional(rollbackFor = [Exception::class]) | |||||
open fun saveTeam(req: NewTeamRequest): Team { | |||||
val ids = req.addStaffIds | |||||
val teamLead = staffRepository.findById(ids[0]).orElseThrow() | |||||
val teamName = "Team " + teamLead.name | |||||
val initials = teamLead.name.split(" ").map { it.first() } | |||||
val teamCode = initials.joinToString("") | |||||
val team = Team().apply { | |||||
name = teamName | |||||
code = teamCode | |||||
} | |||||
teamRepository.saveAndFlush(team) | |||||
for (id in ids) { | |||||
val staff = staffRepository.findById(id).orElseThrow() | |||||
staff.apply { | |||||
this.team = team | |||||
} | |||||
staffRepository.save(staff) | |||||
} | |||||
return team | |||||
} | |||||
open fun combo(args: Map<String, Any>): List<Map<String, Any>> { | open fun combo(args: Map<String, Any>): List<Map<String, Any>> { | ||||
val sql = StringBuilder("select" | val sql = StringBuilder("select" | ||||
+ " t.id as id," | + " t.id as id," | ||||
@@ -1,13 +1,18 @@ | |||||
package com.ffii.tsms.modules.data.web | package com.ffii.tsms.modules.data.web | ||||
import com.ffii.core.exception.NotFoundException | import com.ffii.core.exception.NotFoundException | ||||
import com.ffii.core.response.RecordsRes | |||||
import com.ffii.core.utils.CriteriaArgsBuilder | |||||
import com.ffii.core.utils.Params | import com.ffii.core.utils.Params | ||||
import com.ffii.tsms.modules.data.entity.Staff | import com.ffii.tsms.modules.data.entity.Staff | ||||
import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | ||||
import com.ffii.tsms.modules.data.service.StaffsService | import com.ffii.tsms.modules.data.service.StaffsService | ||||
import com.ffii.tsms.modules.data.web.models.NewStaffRequest | import com.ffii.tsms.modules.data.web.models.NewStaffRequest | ||||
import com.ffii.tsms.modules.data.web.models.NewStaffResponse | |||||
import jakarta.servlet.http.HttpServletRequest | |||||
import jakarta.validation.Valid | import jakarta.validation.Valid | ||||
import org.springframework.http.HttpStatus | import org.springframework.http.HttpStatus | ||||
import org.springframework.web.bind.ServletRequestBindingException | |||||
import org.springframework.web.bind.annotation.* | import org.springframework.web.bind.annotation.* | ||||
@@ -38,6 +43,18 @@ class StaffsController(private val staffsService: StaffsService) { | |||||
fun delete(@PathVariable id: Long?) { | fun delete(@PathVariable id: Long?) { | ||||
staffsService.markDelete(id) | staffsService.markDelete(id) | ||||
} | } | ||||
@GetMapping("/combo") | |||||
@Throws(ServletRequestBindingException::class) | |||||
fun combo(request: HttpServletRequest?): RecordsRes<Map<String, Any>> { | |||||
println(request) | |||||
return RecordsRes<Map<String, Any>>( | |||||
staffsService.combo( | |||||
CriteriaArgsBuilder.withRequest(request) | |||||
.build() | |||||
) | |||||
) | |||||
} | |||||
@PostMapping("/save") | @PostMapping("/save") | ||||
fun saveStaff(@Valid @RequestBody newStaff: NewStaffRequest): Staff { | fun saveStaff(@Valid @RequestBody newStaff: NewStaffRequest): Staff { | ||||
return staffsService.saveOrUpdate(newStaff) | return staffsService.saveOrUpdate(newStaff) | ||||
@@ -2,18 +2,32 @@ package com.ffii.tsms.modules.data.web | |||||
import com.ffii.core.response.RecordsRes | import com.ffii.core.response.RecordsRes | ||||
import com.ffii.core.utils.CriteriaArgsBuilder | import com.ffii.core.utils.CriteriaArgsBuilder | ||||
import com.ffii.tsms.modules.data.entity.Staff | |||||
import com.ffii.tsms.modules.data.entity.Team | |||||
import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||||
import com.ffii.tsms.modules.data.service.TeamService | import com.ffii.tsms.modules.data.service.TeamService | ||||
import com.ffii.tsms.modules.data.web.models.NewStaffRequest | |||||
import com.ffii.tsms.modules.data.web.models.NewTeamRequest | |||||
import jakarta.servlet.http.HttpServletRequest | import jakarta.servlet.http.HttpServletRequest | ||||
import jakarta.validation.Valid | |||||
import org.springframework.web.bind.ServletRequestBindingException | import org.springframework.web.bind.ServletRequestBindingException | ||||
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.* | |||||
@RestController | @RestController | ||||
@RequestMapping("/team") | @RequestMapping("/team") | ||||
class TeamController(private val teamService: TeamService) { | class TeamController(private val teamService: TeamService) { | ||||
@GetMapping | |||||
fun allStaff(): List<Team> { | |||||
return teamService.allTeam() | |||||
} | |||||
@PostMapping("/save") | |||||
fun saveStaff(@Valid @RequestBody newTeam: NewTeamRequest): Team { | |||||
return teamService.saveTeam(newTeam) | |||||
} | |||||
@GetMapping("/combo") | @GetMapping("/combo") | ||||
@Throws(ServletRequestBindingException::class) | @Throws(ServletRequestBindingException::class) | ||||
fun combo(request: HttpServletRequest?): RecordsRes<Map<String, Any>> { | fun combo(request: HttpServletRequest?): RecordsRes<Map<String, Any>> { | ||||
@@ -0,0 +1,10 @@ | |||||
package com.ffii.tsms.modules.data.web.models | |||||
import jakarta.validation.constraints.NotBlank | |||||
import jakarta.validation.constraints.NotNull | |||||
import java.time.LocalDate | |||||
data class NewTeamRequest ( | |||||
@field:NotNull(message = "ids cannot be empty") | |||||
val addStaffIds: List<Long> | |||||
) |