Merge branch 'feat/dev_251201' of https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice into feat/dev_251201

This commit is contained in:
Moon
2025-12-16 09:20:09 +09:00
46 changed files with 462 additions and 11267 deletions

View File

@@ -2,12 +2,12 @@ package com.kamco.cd.kamcoback.postgres.core;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.Basic;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.SearchReq;
import com.kamco.cd.kamcoback.common.service.BaseCoreService;
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.code.dto.CommonCodeDto.SearchReq;
import jakarta.persistence.EntityNotFoundException;
import java.util.List;
import java.util.Optional;

View File

@@ -52,10 +52,7 @@ public class MapSheetMngCoreService {
.findMapSheetMngHstInfo(hstUid)
.orElseThrow(EntityNotFoundException::new));
// TODO: local TEST 시 각자 경로 수정하기
// TODO: application.yml 에 active profile : local 로 임시 변경하여 테스트
String localPath = "";
// String localPath = "C:\\Users\\gypark\\Desktop\\file";
String rootDir = ORIGINAL_IMAGES_PATH + "/" + entity.get().getMngYyyy();
if (activeEnv.equals("local")) {
rootDir = localPath + rootDir;
@@ -68,6 +65,59 @@ public class MapSheetMngCoreService {
count += 1;
}
// 파일 크기 계산 및 저장
try (Stream<Path> paths = Files.walk(Paths.get(rootDir))) {
List<Path> matched =
paths
.filter(Files::isRegularFile)
.filter(
p -> {
String name = p.getFileName().toString();
return name.equals(filename + ".tif") || name.equals(filename + ".tfw");
})
.collect(Collectors.toList());
long tifSize =
matched.stream()
.filter(p -> p.getFileName().toString().endsWith(".tif"))
.mapToLong(
p -> {
try {
return Files.size(p);
} catch (IOException e) {
return 0L;
}
})
.sum();
long tfwSize =
matched.stream()
.filter(p -> p.getFileName().toString().endsWith(".tfw"))
.mapToLong(
p -> {
try {
return Files.size(p);
} catch (IOException e) {
return 0L;
}
})
.sum();
entity.get().setTifSizeBytes(tifSize);
entity.get().setTfwSizeBytes(tfwSize);
entity.get().setTotalSizeBytes(tifSize + tfwSize);
// 엔터티 저장 -> 커스텀 업데이트로 변경
mapSheetMngRepository.updateHstFileSizes(
entity.get().getHstUid(), tifSize, tfwSize, tifSize + tfwSize);
} catch (IOException e) {
// 크기 계산 실패 시 0으로 저장
entity.get().setTifSizeBytes(0L);
entity.get().setTfwSizeBytes(0L);
entity.get().setTotalSizeBytes(0L);
mapSheetMngRepository.updateHstFileSizes(entity.get().getHstUid(), 0L, 0L, 0L);
}
/*
MapSheetMngDto.DataState dataState =
flag ? MapSheetMngDto.DataState.SUCCESS : MapSheetMngDto.DataState.FAIL;

View File

@@ -2,7 +2,10 @@ package com.kamco.cd.kamcoback.postgres.core;
import com.kamco.cd.kamcoback.common.utils.FIleChecker;
import com.kamco.cd.kamcoback.mapsheet.dto.ImageryDto;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity;
import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngFileCheckerRepository;
import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngRepository;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
@@ -13,6 +16,7 @@ import org.springframework.stereotype.Service;
public class MapSheetMngFileCheckerCoreService {
private final MapSheetMngFileCheckerRepository mapSheetMngFileCheckerRepository;
private final MapSheetMngRepository mapSheetMngRepository;
private static final String ORIGINAL_IMAGES_PATH = "/app/original-images";
@@ -50,4 +54,8 @@ public class MapSheetMngFileCheckerCoreService {
return new ImageryDto.SyncReturn(flag, syncCnt, tfwErrCnt, tifErrCnt);
}
public Optional<MapSheetMngHstEntity> findHstByUid(Long hstUid) {
return mapSheetMngRepository.findMapSheetMngHstInfo(hstUid);
}
}

View File

@@ -45,16 +45,16 @@ public class MembersCoreService {
// salt 생성, 사번이 salt
String salt = BCryptSaltGenerator.generateSaltWithEmployeeNo(addReq.getEmployeeNo().trim());
// 패스워드 암호화, 초기 패스워드 고정
String hashedPassword = BCrypt.hashpw(addReq.getTempPassword(), salt);
String hashedPassword = BCrypt.hashpw(addReq.getPassword(), salt);
MemberEntity memberEntity = new MemberEntity();
memberEntity.setUserId(addReq.getEmployeeNo());
memberEntity.setUserRole(addReq.getUserRole());
memberEntity.setTempPassword(addReq.getTempPassword().trim()); // 임시 패스워드는 암호화 하지 않음
memberEntity.setPassword(hashedPassword);
memberEntity.setName(addReq.getName());
memberEntity.setEmployeeNo(addReq.getEmployeeNo());
memberEntity.setRgstrUidl(userUtil.getId());
memberEntity.setStatus(StatusType.PENDING.getId());
return membersRepository.save(memberEntity).getId();
}
@@ -73,37 +73,26 @@ public class MembersCoreService {
memberEntity.setName(updateReq.getName());
}
// 임시 패스워드는 암호화 하지 않음
if (StringUtils.isNotBlank(updateReq.getTempPassword())) {
/**
* 임시 패스워드가 기존과 다르면 패스워드 변경으로 처리함 상태 PENDING 으로 변경하여 사용자가 로그인할때 패스워드 변경하게함 패스워드 리셋이므로 로그인
* 실패카운트 초기화처리함
*/
if (!memberEntity.getTempPassword().equals(updateReq.getTempPassword().trim())) {
// 패스워드 유효성 검사
if (!CommonStringUtils.isValidPassword(updateReq.getTempPassword())) {
throw new CustomApiException("WRONG_PASSWORD", HttpStatus.BAD_REQUEST);
}
if (StringUtils.isNotBlank(updateReq.getStatus())) {
memberEntity.changeStatus(updateReq.getStatus());
}
memberEntity.setStatus(StatusType.PENDING.getId());
memberEntity.setLoginFailCount(0);
if (StringUtils.isNotBlank(updateReq.getPassword())) {
// 패스워드 유효성 검사
if (!CommonStringUtils.isValidPassword(updateReq.getPassword())) {
throw new CustomApiException("WRONG_PASSWORD", HttpStatus.BAD_REQUEST);
}
memberEntity.setTempPassword(updateReq.getTempPassword().trim());
String password =
CommonStringUtils.hashPassword(updateReq.getPassword(), memberEntity.getEmployeeNo());
memberEntity.setStatus(StatusType.PENDING.getId());
memberEntity.setLoginFailCount(0);
memberEntity.setPassword(password);
memberEntity.setPwdResetYn("Y");
}
memberEntity.setUpdtrUid(userUtil.getId());
membersRepository.save(memberEntity);
}
/**
* 미사용 처리
*
* @param uuid
*/
public void deleteMember(UUID uuid) {
MemberEntity memberEntity =
membersRepository.findByUUID(uuid).orElseThrow(MemberNotFoundException::new);
memberEntity.setStatus(StatusType.INACTIVE.getId());
membersRepository.save(memberEntity);
}
@@ -116,20 +105,19 @@ public class MembersCoreService {
MemberEntity memberEntity =
membersRepository.findByEmployeeNo(id).orElseThrow(() -> new MemberNotFoundException());
// 임시 패스워드 확인
if (!memberEntity.getTempPassword().equals(initReq.getTempPassword())) {
// 기존 패스워드 확인
if (!BCrypt.checkpw(initReq.getOldPassword(), memberEntity.getPassword())) {
throw new CustomApiException(AuthErrorCode.LOGIN_PASSWORD_MISMATCH);
}
String salt =
BCryptSaltGenerator.generateSaltWithEmployeeNo(memberEntity.getEmployeeNo().trim());
// 패스워드 암호화
String hashedPassword = BCrypt.hashpw(initReq.getPassword(), salt);
String password =
CommonStringUtils.hashPassword(initReq.getNewPassword(), memberEntity.getEmployeeNo());
memberEntity.setPassword(hashedPassword);
memberEntity.setStatus("ACTIVE");
memberEntity.setPassword(password);
memberEntity.setStatus(StatusType.ACTIVE.getId());
memberEntity.setUpdatedDttm(ZonedDateTime.now());
memberEntity.setUpdtrUid(memberEntity.getId());
memberEntity.setPwdResetYn("N");
membersRepository.save(memberEntity);
}
@@ -159,21 +147,6 @@ public class MembersCoreService {
return memberEntity.getStatus();
}
/**
* 임시 패스워드 비교
*
* @param request
* @return
*/
public boolean isTempPasswordValid(SignInRequest request) {
MemberEntity memberEntity =
membersRepository
.findByUserId(request.getUsername())
.orElseThrow(MemberNotFoundException::new);
return memberEntity.getTempPassword().equals(request.getPassword().trim());
}
/**
* 최초 로그인 저장 마지막 로그인 저장
*
@@ -190,4 +163,14 @@ public class MembersCoreService {
memberEntity.setLoginFailCount(0);
membersRepository.save(memberEntity);
}
/**
* 사번 중복체크
*
* @param employeeNo
* @return
*/
public boolean existsByEmployeeNo(String employeeNo) {
return membersRepository.existsByEmployeeNo(employeeNo);
}
}

View File

@@ -15,8 +15,14 @@ import lombok.NoArgsConstructor;
@Table(name = "tb_audit_log")
public class AuditLogEntity extends CommonCreateEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "audit_log_uid")
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "tb_audit_log_audit_log_uid_seq_gen")
@SequenceGenerator(
name = "tb_audit_log_audit_log_uid_seq_gen",
sequenceName = "tb_audit_log_audit_log_uid_seq",
allocationSize = 1)
@Column(name = "audit_log_uid", nullable = false)
private Long id;
@Column(name = "user_uid")

View File

@@ -16,8 +16,14 @@ import lombok.NoArgsConstructor;
@Table(name = "tb_error_log")
public class ErrorLogEntity extends CommonCreateEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "error_log_uid")
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "tb_error_log_error_log_uid_seq_gen")
@SequenceGenerator(
name = "tb_error_log_error_log_uid_seq_gen",
sequenceName = "tb_error_log_error_log_uid_seq",
allocationSize = 1)
@Column(name = "error_log_uid", nullable = false)
private Long id;
@Column(name = "request_id")

View File

@@ -50,10 +50,4 @@ public class MapSheetMngFileEntity {
@Column(name = "file_size")
private Long fileSize;
@Size(max = 20)
@Column(name = "file_state", length = 20)
private String fileState;
}

View File

@@ -78,4 +78,13 @@ public class MapSheetMngHstEntity extends CommonDateEntity {
@Column(name = "sync_check_end_dttm")
private ZonedDateTime syncCheckEndDttm;
@Column(name = "tif_size_bytes")
private Long tifSizeBytes;
@Column(name = "tfw_size_bytes")
private Long tfwSizeBytes;
@Column(name = "total_size_bytes")
private Long totalSizeBytes;
}

View File

@@ -1,53 +0,0 @@
package com.kamco.cd.kamcoback.postgres.entity;
import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.ZonedDateTime;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
@Getter
@Setter
@Entity
@Table(name = "tb_member_archived")
public class MemberArchivedEntity {
@EmbeddedId private MemberArchivedEntityId id;
@Size(max = 50)
@Column(name = "employee_no", length = 50)
private String employeeNo;
@Size(max = 100)
@NotNull
@Column(name = "name", nullable = false, length = 100)
private String name;
@Size(max = 255)
@NotNull
@Column(name = "password", nullable = false)
private String password;
@Size(max = 100)
@NotNull
@Column(name = "email", nullable = false, length = 100)
private String email;
@Size(max = 20)
@Column(name = "status", length = 20)
private String status;
@NotNull
@Column(name = "created_dttm", nullable = false)
private ZonedDateTime createdDttm;
@NotNull
@ColumnDefault("now()")
@Column(name = "archived_dttm", nullable = false)
private ZonedDateTime archivedDttm;
}

View File

@@ -1,44 +0,0 @@
package com.kamco.cd.kamcoback.postgres.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.Hibernate;
@Getter
@Setter
@Embeddable
public class MemberArchivedEntityId implements Serializable {
private static final long serialVersionUID = -7102800377481389036L;
@NotNull
@Column(name = "user_id", nullable = false)
private Long userId;
@NotNull
@Column(name = "uuid", nullable = false)
private UUID uuid;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) {
return false;
}
MemberArchivedEntityId entity = (MemberArchivedEntityId) o;
return Objects.equals(this.userId, entity.userId) && Objects.equals(this.uuid, entity.uuid);
}
@Override
public int hashCode() {
return Objects.hash(userId, uuid);
}
}

View File

@@ -9,11 +9,14 @@ import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.sql.Types;
import java.time.ZonedDateTime;
import java.util.Objects;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.JdbcTypeCode;
@Getter
@Setter
@@ -51,18 +54,12 @@ public class MemberEntity {
@Column(name = "name", nullable = false, length = 100)
private String name;
@Size(max = 255)
@NotNull
@Column(name = "temp_password", nullable = false)
private String tempPassword;
@Size(max = 255)
@NotNull
@Column(name = "password", nullable = false)
private String password;
@Size(max = 20)
@ColumnDefault("'INACTIVE'")
@Column(name = "status", length = 20)
private String status = StatusType.PENDING.getId();
@@ -90,4 +87,20 @@ public class MemberEntity {
@Column(name = "updtr_uid")
private Long updtrUid;
@Column(name = "status_chg_dttm")
private ZonedDateTime statusChgDttm;
@JdbcTypeCode(Types.CHAR)
@Column(name = "pwd_reset_yn", columnDefinition = "CHAR(1)")
private String pwdResetYn;
public void changeStatus(String newStatus) {
// 같은 값 보내도 무시
if (Objects.equals(this.status, newStatus)) {
return;
}
this.status = newStatus;
this.statusChgDttm = ZonedDateTime.now();
}
}

View File

@@ -24,4 +24,6 @@ public interface MapSheetMngRepositoryCustom {
Page<MapSheetMngDto.ErrorDataDto> findMapSheetErrorList(
MapSheetMngDto.@Valid ErrorSearchReq searchReq);
void updateHstFileSizes(Long hstUid, long tifSizeBytes, long tfwSizeBytes, long totalSizeBytes);
}

View File

@@ -266,6 +266,19 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
.fetchOne());
}
@Override
public void updateHstFileSizes(
Long hstUid, long tifSizeBytes, long tfwSizeBytes, long totalSizeBytes) {
String sql =
"UPDATE tb_map_sheet_mng_hst SET tif_size_bytes = :tif, tfw_size_bytes = :tfw, total_size_bytes = :tot WHERE hst_uid = :uid";
Query query = (Query) em.createNativeQuery(sql);
query.setParameter("tif", tifSizeBytes);
query.setParameter("tfw", tfwSizeBytes);
query.setParameter("tot", totalSizeBytes);
query.setParameter("uid", hstUid);
query.executeUpdate();
}
private NumberExpression<Integer> rowNum() {
return Expressions.numberTemplate(
Integer.class, "row_number() over(order by {0} desc)", mapSheetMngHstEntity.createdDate);

View File

@@ -1,7 +0,0 @@
package com.kamco.cd.kamcoback.postgres.repository.members;
import com.kamco.cd.kamcoback.postgres.entity.MemberArchivedEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MembersArchivedRepository
extends JpaRepository<MemberArchivedEntity, Long>, MembersArchivedRepositoryCustom {}

View File

@@ -1,3 +0,0 @@
package com.kamco.cd.kamcoback.postgres.repository.members;
public interface MembersArchivedRepositoryCustom {}

View File

@@ -1,6 +0,0 @@
package com.kamco.cd.kamcoback.postgres.repository.members;
import org.springframework.stereotype.Repository;
@Repository
public class MembersArchivedRepositoryImpl implements MembersArchivedRepositoryCustom {}

View File

@@ -120,14 +120,12 @@ public class MembersRepositoryImpl implements MembersRepositoryCustom {
memberEntity.uuid,
memberEntity.userRole,
memberEntity.name,
memberEntity.userId,
memberEntity.employeeNo,
memberEntity.tempPassword,
memberEntity.status,
memberEntity.createdDttm,
memberEntity.updatedDttm,
memberEntity.firstLoginDttm,
memberEntity.lastLoginDttm))
memberEntity.lastLoginDttm,
memberEntity.statusChgDttm))
.from(memberEntity)
.where(builder)
.offset(pageable.getOffset())