Merge pull request 'feat/dev_251201' (#149) from feat/dev_251201 into develop

Reviewed-on: https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice/pulls/149
This commit is contained in:
2026-01-05 17:37:29 +09:00
4 changed files with 57 additions and 10 deletions

View File

@@ -60,6 +60,10 @@ public class LabelAllocateCoreService {
return labelAllocateRepository.findLatestProjectInfo(); return labelAllocateRepository.findLatestProjectInfo();
} }
public UUID findLastLabelWorkState() {
return labelAllocateRepository.findLastLabelWorkState();
}
public List<WorkerStatistics> findWorkerStatistics( public List<WorkerStatistics> findWorkerStatistics(
Long analUid, String workerType, String search, String sortType) { Long analUid, String workerType, String search, String sortType) {
return labelAllocateRepository.findWorkerStatistics(analUid, workerType, search, sortType); return labelAllocateRepository.findWorkerStatistics(analUid, workerType, search, sortType);

View File

@@ -3,9 +3,12 @@ package com.kamco.cd.kamcoback.postgres.entity;
import com.kamco.cd.kamcoback.postgres.CommonDateEntity; import com.kamco.cd.kamcoback.postgres.CommonDateEntity;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue; import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType; import jakarta.persistence.GenerationType;
import jakarta.persistence.Id; import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
@@ -66,11 +69,10 @@ public class MapSheetMngHstEntity extends CommonDateEntity {
private Integer mngYyyy; // 년도 private Integer mngYyyy; // 년도
// JPA 연관관계: MapInkx5k 참조 (PK 기반) 소속도엽번호 1:5k // JPA 연관관계: MapInkx5k 참조 (PK 기반) 소속도엽번호 1:5k
/*
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "map_sheet_code", referencedColumnName = "fid") @JoinColumn(name = "map_sheet_code", referencedColumnName = "fid")
private MapInkx5kEntity mapInkx5kByCode; private MapInkx5kEntity mapInkx5kByCode;
*/
// TODO 1:5k 관련 정보 추후 제거 필요 // TODO 1:5k 관련 정보 추후 제거 필요
@Column(name = "map_sheet_num") @Column(name = "map_sheet_num")
private String mapSheetNum; // 도엽번호 private String mapSheetNum; // 도엽번호

View File

@@ -36,6 +36,9 @@ public interface LabelAllocateRepositoryCustom {
// 최신 프로젝트 정보 조회 (analUid 없이) // 최신 프로젝트 정보 조회 (analUid 없이)
ProjectInfo findLatestProjectInfo(); ProjectInfo findLatestProjectInfo();
// 최신 작업 상태의 UUID 조회
UUID findLastLabelWorkState();
// 작업자 통계 조회 // 작업자 통계 조회
List<WorkerStatistics> findWorkerStatistics( List<WorkerStatistics> findWorkerStatistics(
Long analUid, String workerType, String search, String sortType); Long analUid, String workerType, String search, String sortType);

View File

@@ -21,6 +21,7 @@ import com.kamco.cd.kamcoback.label.dto.WorkerStatsDto.WorkerStatistics;
import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity; import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalInferenceEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalInferenceEntity;
import com.kamco.cd.kamcoback.postgres.entity.QMemberEntity; import com.kamco.cd.kamcoback.postgres.entity.QMemberEntity;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Expression; import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.BooleanExpression;
@@ -690,7 +691,14 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
@Override @Override
public ProjectInfo findLatestProjectInfo() { public ProjectInfo findLatestProjectInfo() {
// 최신 target_yyyy를 기준으로 프로젝트 정보 조회 // 최근 집계용 UUID 조회 - 작업이 할당된 최신 프로젝트 우선
UUID uuid = findLastLabelWorkState();
if (uuid == null) {
return null;
}
// UUID로 프로젝트 정보 조회
var result = var result =
queryFactory queryFactory
.select( .select(
@@ -701,11 +709,7 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
mapSheetAnalInferenceEntity.createdDttm, mapSheetAnalInferenceEntity.createdDttm,
mapSheetAnalInferenceEntity.uuid) mapSheetAnalInferenceEntity.uuid)
.from(mapSheetAnalInferenceEntity) .from(mapSheetAnalInferenceEntity)
.orderBy( .where(mapSheetAnalInferenceEntity.uuid.eq(uuid))
mapSheetAnalInferenceEntity.targetYyyy.desc(),
mapSheetAnalInferenceEntity.compareYyyy.desc(),
mapSheetAnalInferenceEntity.createdDttm.desc())
.limit(1)
.fetchOne(); .fetchOne();
if (result == null) { if (result == null) {
@@ -717,7 +721,6 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
Integer stage = result.get(mapSheetAnalInferenceEntity.stage); Integer stage = result.get(mapSheetAnalInferenceEntity.stage);
ZonedDateTime gukyuinApplyDttm = result.get(mapSheetAnalInferenceEntity.gukyuinApplyDttm); ZonedDateTime gukyuinApplyDttm = result.get(mapSheetAnalInferenceEntity.gukyuinApplyDttm);
ZonedDateTime createdDttm = result.get(mapSheetAnalInferenceEntity.createdDttm); ZonedDateTime createdDttm = result.get(mapSheetAnalInferenceEntity.createdDttm);
UUID uuid = result.get(mapSheetAnalInferenceEntity.uuid);
// 변화탐지년도 생성 // 변화탐지년도 생성
String detectionYear = String detectionYear =
@@ -731,10 +734,45 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
.stage(round) .stage(round)
.gukyuinApplyDttm(gukyuinApplyDttm) .gukyuinApplyDttm(gukyuinApplyDttm)
.startDttm(createdDttm) .startDttm(createdDttm)
.uuid(uuid != null ? uuid.toString() : null) .uuid(uuid.toString())
.build(); .build();
} }
@Override
public UUID findLastLabelWorkState() {
BooleanBuilder whereBuilder = new BooleanBuilder();
// 1. 작업이 할당된 프로젝트 중 최신 UUID 조회
UUID uuid =
queryFactory
.select(mapSheetAnalInferenceEntity.uuid)
.from(mapSheetAnalInferenceEntity)
.innerJoin(labelingAssignmentEntity)
.on(mapSheetAnalInferenceEntity.id.eq(labelingAssignmentEntity.analUid))
.where(whereBuilder)
.orderBy(
mapSheetAnalInferenceEntity.compareYyyy.desc(),
mapSheetAnalInferenceEntity.targetYyyy.desc(),
mapSheetAnalInferenceEntity.stage.desc())
.fetchFirst();
// 2. 작업이 할당된 프로젝트가 없으면 전체 프로젝트 중 최신 UUID 조회
if (uuid == null) {
uuid =
queryFactory
.select(mapSheetAnalInferenceEntity.uuid)
.from(mapSheetAnalInferenceEntity)
.where(whereBuilder)
.orderBy(
mapSheetAnalInferenceEntity.compareYyyy.desc(),
mapSheetAnalInferenceEntity.targetYyyy.desc(),
mapSheetAnalInferenceEntity.stage.desc())
.fetchFirst();
}
return uuid;
}
@Override @Override
public Page<LabelingStatDto> findLabelerDailyStat( public Page<LabelingStatDto> findLabelerDailyStat(
LabelAllocateDto.searchReq searchReq, String uuid, String userId) { LabelAllocateDto.searchReq searchReq, String uuid, String userId) {