Merge remote-tracking branch 'origin/feat/dev_251201' into feat/dev_251201

# Conflicts:
#	src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngFileEntity.java
This commit is contained in:
Moon
2025-12-12 19:14:29 +09:00
29 changed files with 504 additions and 210 deletions

View File

@@ -7,7 +7,7 @@ import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ApiResponseCode;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ResponseObj;
import com.kamco.cd.kamcoback.postgres.entity.CommonCodeEntity;
import com.kamco.cd.kamcoback.postgres.repository.code.CommonCodeRepository;
import com.kamco.cd.kamcoback.zoo.dto.AnimalDto.SearchReq;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.SearchReq;
import jakarta.persistence.EntityNotFoundException;
import java.util.List;
import java.util.Optional;

View File

@@ -2,6 +2,9 @@ package com.kamco.cd.kamcoback.postgres.core;
import com.kamco.cd.kamcoback.auth.BCryptSaltGenerator;
import com.kamco.cd.kamcoback.common.enums.StatusType;
import com.kamco.cd.kamcoback.common.enums.error.AuthErrorCode;
import com.kamco.cd.kamcoback.common.exception.CustomApiException;
import com.kamco.cd.kamcoback.common.utils.CommonStringUtils;
import com.kamco.cd.kamcoback.common.utils.UserUtil;
import com.kamco.cd.kamcoback.members.dto.MembersDto;
import com.kamco.cd.kamcoback.members.dto.MembersDto.AddReq;
@@ -18,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.mindrot.jbcrypt.BCrypt;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@Service
@@ -34,8 +38,8 @@ public class MembersCoreService {
* @return
*/
public Long saveMembers(AddReq addReq) {
if (membersRepository.existsByUserId(addReq.getUserId())) {
throw new DuplicateMemberException(Field.USER_ID, addReq.getUserId());
if (membersRepository.existsByEmployeeNo(addReq.getEmployeeNo())) {
throw new DuplicateMemberException(Field.EMPLOYEE_NO, addReq.getEmployeeNo());
}
// salt 생성, 사번이 salt
@@ -44,7 +48,7 @@ public class MembersCoreService {
String hashedPassword = BCrypt.hashpw(addReq.getTempPassword(), salt);
MemberEntity memberEntity = new MemberEntity();
memberEntity.setUserId(addReq.getUserId());
memberEntity.setUserId(addReq.getEmployeeNo());
memberEntity.setUserRole(addReq.getUserRole());
memberEntity.setTempPassword(addReq.getTempPassword().trim()); // 임시 패스워드는 암호화 하지 않음
memberEntity.setPassword(hashedPassword);
@@ -71,41 +75,35 @@ public class MembersCoreService {
// 임시 패스워드는 암호화 하지 않음
if (StringUtils.isNotBlank(updateReq.getTempPassword())) {
// 임시 패스워드가 기존과 다르면 패스워드 변경으로 처리함
// 상태 INACTIVE로 변경하여 사용자가 로그인할때 패스워드 변경하게함
// 패스워드 리셋이므로 로그인 실패카운트 초기화처리함
/**
* 임시 패스워드가 기존과 다르면 패스워드 변경으로 처리함 상태 PENDING 으로 변경하여 사용자가 로그인할때 패스워드 변경하게함 패스워드 리셋이므로 로그인
* 실패카운트 초기화처리함
*/
if (!memberEntity.getTempPassword().equals(updateReq.getTempPassword().trim())) {
memberEntity.setStatus(StatusType.INACTIVE.getId());
// 패스워드 유효성 검사
if (!CommonStringUtils.isValidPassword(updateReq.getTempPassword())) {
throw new CustomApiException("WRONG_PASSWORD", HttpStatus.BAD_REQUEST);
}
memberEntity.setStatus(StatusType.PENDING.getId());
memberEntity.setLoginFailCount(0);
}
memberEntity.setTempPassword(updateReq.getTempPassword().trim());
}
if (StringUtils.isNotBlank(updateReq.getEmployeeNo())) {
memberEntity.setEmployeeNo(updateReq.getEmployeeNo());
}
if (StringUtils.isNotBlank(updateReq.getStatus())) {
memberEntity.setStatus(updateReq.getStatus());
}
memberEntity.setUpdtrUid(userUtil.getId());
membersRepository.save(memberEntity);
}
/**
* 관리자 계정 삭제 처리
* 미사용 처리
*
* @param uuid
*/
public void deleteAccount(UUID uuid) {
public void deleteMember(UUID uuid) {
MemberEntity memberEntity =
membersRepository.findByUUID(uuid).orElseThrow(() -> new MemberNotFoundException());
memberEntity.setStatus(StatusType.DELETED.getId());
memberEntity.setUpdatedDttm(ZonedDateTime.now());
memberEntity.setUpdtrUid(userUtil.getId());
membersRepository.findByUUID(uuid).orElseThrow(MemberNotFoundException::new);
memberEntity.setStatus(StatusType.INACTIVE.getId());
membersRepository.save(memberEntity);
}
@@ -116,7 +114,12 @@ public class MembersCoreService {
*/
public void resetPassword(String id, MembersDto.InitReq initReq) {
MemberEntity memberEntity =
membersRepository.findByUserId(id).orElseThrow(() -> new MemberNotFoundException());
membersRepository.findByEmployeeNo(id).orElseThrow(() -> new MemberNotFoundException());
// 임시 패스워드 확인
if (!memberEntity.getTempPassword().equals(initReq.getTempPassword())) {
throw new CustomApiException(AuthErrorCode.LOGIN_PASSWORD_MISMATCH);
}
String salt =
BCryptSaltGenerator.generateSaltWithEmployeeNo(memberEntity.getEmployeeNo().trim());

View File

@@ -64,7 +64,7 @@ public class MemberEntity {
@Size(max = 20)
@ColumnDefault("'INACTIVE'")
@Column(name = "status", length = 20)
private String status = StatusType.INACTIVE.getId();
private String status = StatusType.PENDING.getId();
@NotNull
@ColumnDefault("now()")

View File

@@ -0,0 +1,6 @@
package com.kamco.cd.kamcoback.postgres.repository.mapsheet;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngFileEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MapSheetMngFileRepository extends JpaRepository<MapSheetMngFileEntity, Long> {}

View File

@@ -170,48 +170,53 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
@Override
public void deleteByMngYyyyMngAll(int mngYyyy) {
long deletedFileCount = queryFactory
.delete(mapSheetMngFileEntity)
.where(mapSheetMngFileEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedFileCount =
queryFactory
.delete(mapSheetMngFileEntity)
.where(mapSheetMngFileEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedHisCount = queryFactory
.delete(mapSheetMngHstEntity)
.where(mapSheetMngHstEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedHisCount =
queryFactory
.delete(mapSheetMngHstEntity)
.where(mapSheetMngHstEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedMngCount = queryFactory
.delete(mapSheetMngEntity)
.where(mapSheetMngEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedMngCount =
queryFactory
.delete(mapSheetMngEntity)
.where(mapSheetMngEntity.mngYyyy.eq(mngYyyy))
.execute();
}
@Override
public void deleteByMngYyyyMng(int mngYyyy) {
long deletedMngCount = queryFactory
.delete(mapSheetMngEntity)
.where(mapSheetMngEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedMngCount =
queryFactory
.delete(mapSheetMngEntity)
.where(mapSheetMngEntity.mngYyyy.eq(mngYyyy))
.execute();
}
@Override
public void deleteByMngYyyyMngHst(int mngYyyy) {
long deletedHisCount = queryFactory
.delete(mapSheetMngHstEntity)
.where(mapSheetMngHstEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedHisCount =
queryFactory
.delete(mapSheetMngHstEntity)
.where(mapSheetMngHstEntity.mngYyyy.eq(mngYyyy))
.execute();
}
@Override
public void deleteByMngYyyyMngFile(int mngYyyy) {
long deletedFileCount = queryFactory
.delete(mapSheetMngFileEntity)
.where(mapSheetMngFileEntity.mngYyyy.eq(mngYyyy))
.execute();
long deletedFileCount =
queryFactory
.delete(mapSheetMngFileEntity)
.where(mapSheetMngFileEntity.mngYyyy.eq(mngYyyy))
.execute();
}
@Override

View File

@@ -11,6 +11,10 @@ public interface MembersRepositoryCustom {
boolean existsByUserId(String userId);
boolean existsByEmployeeNo(String employeeNo);
Optional<MemberEntity> findByEmployeeNo(String employeeNo);
Optional<MemberEntity> findByUserId(String userId);
Optional<MemberEntity> findByUUID(UUID uuid);

View File

@@ -40,6 +40,22 @@ public class MembersRepositoryImpl implements MembersRepositoryCustom {
!= null;
}
/**
* 사용자 사번 조회
*
* @param employeeNo
* @return
*/
@Override
public boolean existsByEmployeeNo(String employeeNo) {
return queryFactory
.selectOne()
.from(memberEntity)
.where(memberEntity.employeeNo.eq(employeeNo))
.fetchFirst()
!= null;
}
/**
* 사용자 조회 user id
*
@@ -52,6 +68,21 @@ public class MembersRepositoryImpl implements MembersRepositoryCustom {
queryFactory.selectFrom(memberEntity).where(memberEntity.userId.eq(userId)).fetchOne());
}
/**
* 사용자 조회 employeed no
*
* @param employeeNo
* @return
*/
@Override
public Optional<MemberEntity> findByEmployeeNo(String employeeNo) {
return Optional.ofNullable(
queryFactory
.selectFrom(memberEntity)
.where(memberEntity.employeeNo.eq(employeeNo))
.fetchOne());
}
/**
* 회원정보 목록 조회
*