build error fix

# Conflicts:
#	src/main/java/com/kamco/cd/kamcoback/label/service/LabelAllocateService.java
This commit is contained in:
DanielLee
2026-01-05 13:41:32 +09:00
committed by gayoun.park
parent 142685f4c4
commit 053d337314

View File

@@ -9,9 +9,7 @@ import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelerDetail;
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.TargetUser; import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.TargetUser;
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.UserList; import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.UserList;
import com.kamco.cd.kamcoback.label.dto.WorkerStatsDto.WorkerListResponse; import com.kamco.cd.kamcoback.label.dto.WorkerStatsDto.WorkerListResponse;
import com.kamco.cd.kamcoback.label.dto.WorkerStatsDto.WorkerStatistics;
import com.kamco.cd.kamcoback.postgres.core.LabelAllocateCoreService; import com.kamco.cd.kamcoback.postgres.core.LabelAllocateCoreService;
import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -23,9 +21,6 @@ import org.springframework.transaction.annotation.Transactional;
@Transactional @Transactional
public class LabelAllocateService { public class LabelAllocateService {
private static final int STAGNATION_THRESHOLD = 10; // 정체 판단 기준 (3일 평균 처리량)
private static final int BATCH_SIZE = 100; // 배정 배치 크기
private final LabelAllocateCoreService labelAllocateCoreService; private final LabelAllocateCoreService labelAllocateCoreService;
public LabelAllocateService(LabelAllocateCoreService labelAllocateCoreService) { public LabelAllocateService(LabelAllocateCoreService labelAllocateCoreService) {
@@ -35,22 +30,22 @@ public class LabelAllocateService {
/** /**
* 도엽 기준 asc sorting 해서 할당 수만큼 배정하는 로직 * 도엽 기준 asc sorting 해서 할당 수만큼 배정하는 로직
* *
* @param stage 회차 * @param stage 회차
* @param targetUsers 라벨러 목록 * @param targetUsers 라벨러 목록
* @param targetInspectors 검수자 목록 * @param targetInspectors 검수자 목록
*/ */
@Transactional @Transactional
public ApiResponseDto.ResponseObj allocateAsc( public ApiResponseDto.ResponseObj allocateAsc(
Integer stage, Integer stage,
List<TargetUser> targetUsers, List<TargetUser> targetUsers,
List<String> targetInspectors, List<String> targetInspectors,
Integer compareYyyy, Integer compareYyyy,
Integer targetYyyy) { Integer targetYyyy) {
Long lastId = null; Long lastId = null;
// geom 잔여건수 조회 // geom 잔여건수 조회
Long chargeCnt = Long chargeCnt =
labelAllocateCoreService.findLabelUnAssignedCnt(stage, compareYyyy, targetYyyy); labelAllocateCoreService.findLabelUnAssignedCnt(stage, compareYyyy, targetYyyy);
if (chargeCnt <= 0) { if (chargeCnt <= 0) {
return new ApiResponseDto.ResponseObj(ApiResponseCode.DUPLICATE_DATA, "이미 배정완료된 회차 입니다."); return new ApiResponseDto.ResponseObj(ApiResponseCode.DUPLICATE_DATA, "이미 배정완료된 회차 입니다.");
} }
@@ -58,15 +53,15 @@ public class LabelAllocateService {
Long totalDemand = targetUsers.stream().mapToLong(TargetUser::getDemand).sum(); Long totalDemand = targetUsers.stream().mapToLong(TargetUser::getDemand).sum();
if (!Objects.equals(chargeCnt, totalDemand)) { if (!Objects.equals(chargeCnt, totalDemand)) {
return new ApiResponseDto.ResponseObj( return new ApiResponseDto.ResponseObj(
ApiResponseCode.BAD_REQUEST, "총 잔여건수와 요청 값의 합계가 맞지 않습니다."); ApiResponseCode.BAD_REQUEST, "총 잔여건수와 요청 값의 합계가 맞지 않습니다.");
} }
List<AllocateInfoDto> allIds = List<AllocateInfoDto> allIds =
labelAllocateCoreService.fetchNextIds(lastId, chargeCnt, compareYyyy, targetYyyy, stage); labelAllocateCoreService.fetchNextIds(lastId, chargeCnt, compareYyyy, targetYyyy, stage);
// MapSheetAnalInferenceEntity analUid 가져오기 // MapSheetAnalInferenceEntity analUid 가져오기
Long analUid = Long analUid =
labelAllocateCoreService.findMapSheetAnalInferenceUid(compareYyyy, targetYyyy, stage); labelAllocateCoreService.findMapSheetAnalInferenceUid(compareYyyy, targetYyyy, stage);
int index = 0; int index = 0;
for (TargetUser target : targetUsers) { for (TargetUser target : targetUsers) {
@@ -112,16 +107,17 @@ public class LabelAllocateService {
/** /**
* 작업자 통계 조회 * 작업자 통계 조회
* *
* @param analUid 분석 ID * @param analUid 분석 ID
* @param workerType 작업자 유형 (LABELER/INSPECTOR) * @param workerType 작업자 유형 (LABELER/INSPECTOR)
* @param search 검색어 (이름 또는 사번) * @param search 검색어 (이름 또는 사번)
* @param sortType 정렬 조건 * @param sortType 정렬 조건
* @param page 페이지 번호 (0부터 시작)
* @param size 페이지 크기
* @return 작업자 목록 및 통계 * @return 작업자 목록 및 통계
*/ */
public WorkerListResponse getWorkerStatistics( public WorkerListResponse getWorkerStatistics(
Long analUid, String workerType, String search, String sortType, Integer page, Integer size) { Long analUid,
String workerType,
String search,
String sortType) {
// 프로젝트 정보 조회 (analUid가 있을 때만) // 프로젝트 정보 조회 (analUid가 있을 때만)
var projectInfo = labelAllocateCoreService.findProjectInfo(analUid); var projectInfo = labelAllocateCoreService.findProjectInfo(analUid);
@@ -129,44 +125,10 @@ public class LabelAllocateService {
// 작업 진행 현황 조회 // 작업 진행 현황 조회
var progressInfo = labelAllocateCoreService.findWorkProgressInfo(analUid); var progressInfo = labelAllocateCoreService.findWorkProgressInfo(analUid);
// 작업자 통계 조회
List<WorkerStatistics> workers =
labelAllocateCoreService.findWorkerStatistics(analUid, workerType, search, sortType);
// 각 작업자별 3일치 처리량 조회
LocalDate today = LocalDate.now();
for (WorkerStatistics worker : workers) {
Long day1Count =
labelAllocateCoreService.findDailyProcessedCount(
worker.getWorkerId(), workerType, today.minusDays(1), analUid);
Long day2Count =
labelAllocateCoreService.findDailyProcessedCount(
worker.getWorkerId(), workerType, today.minusDays(2), analUid);
Long day3Count =
labelAllocateCoreService.findDailyProcessedCount(
worker.getWorkerId(), workerType, today.minusDays(3), analUid);
long average = (day1Count + day2Count + day3Count) / 3;
}
// 페이징 처리
long totalElements = workers.size();
int totalPages = (int) Math.ceil((double) totalElements / size);
int fromIndex = page * size;
int toIndex = Math.min(fromIndex + size, workers.size());
List<WorkerStatistics> pagedWorkers =
(fromIndex < workers.size()) ? workers.subList(fromIndex, toIndex) : List.of();
return WorkerListResponse.builder() return WorkerListResponse.builder()
.projectInfo(projectInfo) .projectInfo(projectInfo)
.progressInfo(progressInfo) .progressInfo(progressInfo)
.workers(pagedWorkers) .build();
.currentPage(page)
.pageSize(size)
.totalElements(totalElements)
.totalPages(totalPages)
.build();
} }
public InferenceDetail findInferenceDetail(String uuid) { public InferenceDetail findInferenceDetail(String uuid) {
@@ -174,11 +136,12 @@ public class LabelAllocateService {
} }
public ApiResponseDto.ResponseObj allocateMove( public ApiResponseDto.ResponseObj allocateMove(
Integer stage, String autoType,
List<TargetUser> targetUsers, Integer stage,
Integer compareYyyy, List<TargetUser> targetUsers,
Integer targetYyyy, Integer compareYyyy,
String userId) { Integer targetYyyy,
String userId) {
Long lastId = null; Long lastId = null;
Long chargeCnt = targetUsers.stream().mapToLong(TargetUser::getDemand).sum(); Long chargeCnt = targetUsers.stream().mapToLong(TargetUser::getDemand).sum();
@@ -188,8 +151,8 @@ public class LabelAllocateService {
} }
List<Long> allIds = List<Long> allIds =
labelAllocateCoreService.fetchNextMoveIds( labelAllocateCoreService.fetchNextMoveIds(
lastId, chargeCnt, compareYyyy, targetYyyy, stage, userId); lastId, chargeCnt, compareYyyy, targetYyyy, stage, userId);
int index = 0; int index = 0;
for (TargetUser target : targetUsers) { for (TargetUser target : targetUsers) {
int end = index + target.getDemand(); int end = index + target.getDemand();