From 0ae9a55c91694032e2d86e8fd30846960b0b8543 Mon Sep 17 00:00:00 2001 From: Moon Date: Mon, 5 Jan 2026 17:51:23 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=9E=91=EC=97=85=ED=98=84=ED=99=A9?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../label/LabelWorkerApiController.java | 5 ++ .../cd/kamcoback/label/dto/LabelWorkDto.java | 12 +++-- .../label/service/LabelWorkService.java | 4 ++ .../postgres/core/LabelWorkCoreService.java | 4 ++ .../label/LabelWorkRepositoryCustom.java | 2 + .../label/LabelWorkRepositoryImpl.java | 48 +++++++++++++++++++ 6 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/label/LabelWorkerApiController.java b/src/main/java/com/kamco/cd/kamcoback/label/LabelWorkerApiController.java index 4a1fc508..5cccb20f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/LabelWorkerApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/LabelWorkerApiController.java @@ -131,9 +131,14 @@ public class LabelWorkerApiController { @Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20") int size) { + // 대상추출(최근) + UUID lstUuid = labelWorkService.findLastLabelWorkState(); + String uuid = lstUuid.toString(); + LabelWorkDto.WorkerStateSearchReq searchReq = new WorkerStateSearchReq(); searchReq.setUserRole(userRole); searchReq.setSearchVal(searchVal); + searchReq.setUuid(uuid); searchReq.setPage(page); searchReq.setSize(size); return ApiResponseDto.ok(labelWorkService.findlabelWorkStateList(searchReq)); diff --git a/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java b/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java index cdd0f1c0..f4afbf7f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java @@ -158,13 +158,13 @@ public class LabelWorkDto { @Schema(description = "Skip개수") private Long skipCnt; - @Schema(description = "Skip개수") + @Schema(description = "3일전처리개수") private Long day3AgoDoneCnt; - @Schema(description = "Skip개수") + @Schema(description = "2일전처리개수") private Long day2AgoDoneCnt; - @Schema(description = "Skip개수") + @Schema(description = "1일전처리개수") private Long day1AgoDoneCnt; public Long getremindCnt() { @@ -172,10 +172,12 @@ public class LabelWorkDto { } public double getDoneRate() { - if (this.doneCnt == null || this.assignedCnt == 0) { + Long dayDoneCnt = this.day3AgoDoneCnt + this.day2AgoDoneCnt + this.day1AgoDoneCnt; + + if (dayDoneCnt == null || dayDoneCnt == 0) { return 0.0; } - return (double) this.doneCnt / this.assignedCnt * 100.0; + return (double) dayDoneCnt / 3; } public String getUserRoleName() { diff --git a/src/main/java/com/kamco/cd/kamcoback/label/service/LabelWorkService.java b/src/main/java/com/kamco/cd/kamcoback/label/service/LabelWorkService.java index f6405984..4640d3e1 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/service/LabelWorkService.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/service/LabelWorkService.java @@ -55,4 +55,8 @@ public class LabelWorkService { return labelWorkCoreService.findlabelWorkStateList(searchReq); } + + public UUID findLastLabelWorkState() { + return labelWorkCoreService.findLastLabelWorkState(); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelWorkCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelWorkCoreService.java index 4b236c13..00df1cee 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelWorkCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelWorkCoreService.java @@ -57,4 +57,8 @@ public class LabelWorkCoreService { public LabelWorkMngDetail findLabelWorkMngDetail(UUID uuid) { return labelWorkRepository.findLabelWorkMngDetail(uuid); } + + public UUID findLastLabelWorkState() { + return labelWorkRepository.findLastLabelWorkState(); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryCustom.java index baf773e7..3f9dbe1a 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryCustom.java @@ -18,4 +18,6 @@ public interface LabelWorkRepositoryCustom { LabelWorkMngDetail findLabelWorkMngDetail(UUID uuid); Page findlabelWorkStateList(LabelWorkDto.WorkerStateSearchReq searchReq); + + UUID findLastLabelWorkState(); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java index 5fa407e1..910aa3d6 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java @@ -212,6 +212,8 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport BooleanBuilder whereBuilder = new BooleanBuilder(); BooleanBuilder whereSubBuilder = new BooleanBuilder(); + UUID uuid = UUID.fromString(searchReq.getUuid()); + LocalDate threeDaysAgo = LocalDate.now().minusDays(3); String s3 = threeDaysAgo.format(DateTimeFormatter.ofPattern("YYYY-MM-DD")); @@ -300,6 +302,12 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport .sum() .as("day1AgoDoneCnt"))) .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalInferenceEntity) + .on( + mapSheetAnalInferenceEntity + .uuid + .eq(uuid) + .and(labelingAssignmentEntity.analUid.eq(mapSheetAnalInferenceEntity.id))) .innerJoin(memberEntity) .on(whereSubBuilder) .where(whereBuilder) @@ -312,6 +320,12 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport queryFactory .select(labelingAssignmentEntity.workerUid.countDistinct()) .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalInferenceEntity) + .on( + mapSheetAnalInferenceEntity + .uuid + .eq(uuid) + .and(labelingAssignmentEntity.analUid.eq(mapSheetAnalInferenceEntity.id))) .innerJoin(memberEntity) .on(whereSubBuilder) .where(whereBuilder) @@ -321,6 +335,40 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport return new PageImpl<>(foundContent, pageable, countQuery); } + @Override + public UUID findLastLabelWorkState() { + + BooleanBuilder whereBuilder = new BooleanBuilder(); + + 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(); + + 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; + } + /** * 작업배정 상세조회 * From 2cda32e96f4fb78dbd2534cfeb245ce998bf4d14 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Mon, 5 Jan 2026 17:53:06 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EB=9D=BC=EB=B2=A8=ED=95=A0=EB=8B=B9=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../label/LabelAllocateRepositoryImpl.java | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java index 05b09d26..418f791b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java @@ -34,6 +34,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; +import java.sql.PreparedStatement; import java.time.LocalDate; import java.time.LocalTime; import java.time.ZoneId; @@ -43,6 +44,7 @@ import java.util.Objects; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.hibernate.Session; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -106,27 +108,41 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto .execute(); // 라벨러 할당 테이블에 insert - String sql = - """ + Session session = em.unwrap(Session.class); + + session.doWork( + connection -> { + String sql = + """ insert into tb_labeling_assignment (assignment_uid, inference_geom_uid, worker_uid, work_state, assign_group_id, anal_uid) values (?, ?, ?, ?, ?, ?) """; - for (AllocateInfoDto info : ids) { - em.createNativeQuery(sql) - .setParameter(1, UUID.randomUUID()) - .setParameter(2, info.getGeoUid()) - .setParameter(3, userId) - .setParameter(4, LabelState.ASSIGNED.getId()) - .setParameter(5, info.getMapSheetNum()) - .setParameter(6, analEntity.getId()) - .executeUpdate(); - } + try (PreparedStatement ps = connection.prepareStatement(sql)) { + int batchSize = 0; - em.flush(); - em.clear(); + for (AllocateInfoDto info : ids) { + ps.setObject(1, UUID.randomUUID()); + ps.setLong(2, info.getGeoUid()); + ps.setString(3, userId); + ps.setString(4, LabelState.ASSIGNED.getId()); + ps.setString(5, String.valueOf(info.getMapSheetNum())); + ps.setLong(6, analEntity.getId()); + + ps.addBatch(); + batchSize++; + + if (batchSize % 1000 == 0) { + ps.executeBatch(); + ps.clearBatch(); + } + } + + ps.executeBatch(); + } + }); } @Override